方案1
因为malloc是weak symbol,用户可以直接定义一个自己的版本覆盖glibc的
采用__libc_malloc和__libc_free这两个别名调用原先的版本
用__builtin_return_address得到调用mallloc的地址(注意这个函数只有参数为0时可以保证不seg fault)
在每次malloc时以分配的地址为名生成一个文件
free时再删除
用
addr2line -f -e memleak -a 0x4006f7
得到具体的行号(编译时需要加-g)
方案2
使用宏定义替换
这个我以前也玩过,就不细说了
https://github.com/jsc723/memCheck/blob/master/memCheck.c
这个方法有个缺点就是每次开关检测时都要重新编译整个项目,所以不适合太大的项目(几十万行的那种)
方案3
使用malloc_hook
多线程表现不佳,已经被标注为过时
我的方案
https://github.com/itaych/MEM_debug
原理基于方案1
https://stackoverflow.com/questions/17803456/an-alternative-for-the-deprecated-malloc-hook-functionality-of-glibc
预先编译成动态库后,在运行时只要link一下就能自动加载泄漏检测组件(意味着不需要重新编译代码),还可以检测多次free,写入超出边界等错误
参考
- 零声教育c/c++ linux 3.2.5
- https://github.com/itaych/MEM_debug
- https://stackoverflow.com/questions/17803456/an-alternative-for-the-deprecated-malloc-hook-functionality-of-glibc