GNU libc 有内置的 malloc 调试:
http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html
使用LD_PRELOAD调用mtrace()
来自你自己的.so:
#include <mcheck.h>
static void prepare(void) __attribute__((constructor));
static void prepare(void)
{
mtrace();
}
编译它:
gcc -shared -fPIC dbg.c -o dbg.so
运行它:
export MALLOC_TRACE=out.txt
LD_PRELOAD=./dbg.so ./my-leaky-program
稍后检查输出文件:
mtrace ./my-leaky-program out.txt
你会得到类似的东西:
Memory not freed:
-----------------
Address Size Caller
0x0000000001bda460 0x96 at /tmp/test/src/test.c:7
当然,您可以随意编写自己的 malloc 钩子来转储整个堆栈(调用回溯() http://www.gnu.org/software/libc/manual/html_node/Backtraces.html如果您认为这会有所帮助)。
如果您将二进制文件的调试信息保存在某处(例如,二进制文件内置了一些调试信息,或者您做了objcopy --only-keep-debug my-leaky-program my-leaky-program.debug
).
另外,您可以尝试 Boehm 的 GC,它也可以用作泄漏检测器:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html