在linux C语言开发中,内存泄漏是很多人都会遇到的问题,linux下有很多内存检测的工具,比如valigard可以在跑覆盖率的同时检测到内存泄漏。不过这个工具好像对性能影响较大。
后来gcc 直接引入了自己的检测工具,asan,对应内核有kasan 最近也是用上了这个工具,还是挺强大的。具体内容和编译方法可以参考官网:
http://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
我的编译器版本信息如下:
看下asan的相关库:
写个最简单的demo测试
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char *testa = malloc(sizeof(char)*1024); return 0; }
编译
gcc test.c -fno-omit-frame-pointer -fsanitize-recover=address -lasan
执行,看输出:
注意这一行:
#1 0x5579e602f722 in main (/home/share/test/asan/a.out+0x722)
在遇到比较大的模块的情况下,可以反汇编看一下。
objdump -S a.out > 1.txt
我们直接就是a.out反汇编,直接就从头+0x722看看在什么位置
722就在main函数的malloc这里,返回看代码,确实如此。方法就是这样,有函数也是如此即可。
#include <stdio.h> #include <stdlib.h> void test_func(void) { char *test = malloc(sizeof(int)); printf("%s:%d\n", __func__, __LINE__); } int main(int argc, char *argv[]) { // char *testa = malloc(sizeof(char)*1024); test_func(); return 0; }
代码改成函数调用看一下。
直接定位到test_func,反汇编看看
76b同样在malloc这一行。方法很好用。查起来也比较迅速。可以借鉴。不过也有时候有可能碰壁需要找其他办法,大家自己探索吧。