文章目录

  • ​​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=====
...