(十一)GDBdebug调试技术——malloc()和free()发生故障
原创
©著作权归作者所有:来自51CTO博客作者喜欢打篮球的普通人的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 1.错误使用内存相关库函数引起的bug
- 2.利用MALLOC_CHECK_进行调试
1.错误使用内存相关库函数引起的bug
- C语言常见的内存相关库函数的bug:内存的双重释放,访问分配空间之外内等等。这些bug的在gdb的具体表现是:在malloc(),free()之后发生SIGSEGV错误
- 使用malloc(),free()导致的SIGSEGV的最危险的情况是:程序不会受到内存破坏依然会继续运行,产生的影响是:
(1)在完全没有关系的地方产生SIGSEGV
(2)使用被破坏的数据进行计算,产生错误的结果 - malloc(),free()产生SIGSEGV时,在怀疑库函数的bug之前,最好先检查是否进行了双重释放
- eg如下:
membug表示:可执行文件
$ gdb -c core ./membug
Core was generated by './membug'
Program terminated with signal 11, Segmentation fault.
#0 0x0000003b4867217c in _int_free () from /Lib64/libc.so.6
(gdb)bt
#0 0x0000003b4867217c in _int_free () from /lib64/libc.so.6
#1 0x0000003b48675f2c in free () from /lib64/libc.so.6
#2 0x0000000000400534 in do_free () at membug.c30
#3 0x0000000000400588 in main (argc=<value optimized out>, argv=<value optimized out>
)at membug.c:39
上述程序实际上是使用free()函数的问题,而不是库函数free()的问题
2.利用MALLOC_CHECK_进行调试
- 设置环境变量MALLOC_CHECK_,就可以发现内存操作的相关bug
- 该方法并不适用所有的情况,用MALLOC_CHECK_没有检测出问题,并不说明应用程序没有bug
- eg:下面的eg检查了double free,即:双重释放
membug为可执行文件
$env MALLOC_CHECK_=1 ./membug
**glibc detected ** ./membug:double free or corruption (top): 0x00000000020b2010***
======backtrace======
...
======Memory map=====
...