gla*_*lig 17 c c++ linux valgrind
我首先查找了现有的答案,并看到Valgrind是每个人最喜欢的linux上内存泄漏调试工具.不幸的是,Valgrind似乎并不适用于我的目的.我会尽力解释原因.
约束:
我需要的是相当于Microsoft的UMDH:打开每个堆分配的堆栈跟踪,然后在某个时间点转储按堆栈分组的所有分配,并按分配计数按降序排序.我们的应用程序在Windows和Linux平台上提供,因此我知道在UMDH下的Windows上的性能仍然可以容忍.
以下是我考虑的工具/方法
我错过了什么吗?是否有任何轻量级Valgrind选项或现有的LD_PRELOAD工具?
Dan*_*lKO 14
GNU libc内置了malloc调试:
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();
}
Run Code Online (Sandbox Code Playgroud)
编译它:
gcc -shared -fPIC dbg.c -o dbg.so
Run Code Online (Sandbox Code Playgroud)
运行它:
export MALLOC_TRACE=out.txt
LD_PRELOAD=./dbg.so ./my-leaky-program
Run Code Online (Sandbox Code Playgroud)
稍后检查输出文件:
mtrace ./my-leaky-program out.txt
Run Code Online (Sandbox Code Playgroud)
你会得到类似的东西:
Memory not freed:
-----------------
Address Size Caller
0x0000000001bda460 0x96 at /tmp/test/src/test.c:7
Run Code Online (Sandbox Code Playgroud)
当然,您可以随意编写自己的malloc挂钩来转储整个堆栈(如果您认为这会有所帮助,则调用backtrace()).
如果您在某处保留了二进制文件的调试信息,则可以获得行号和/或函数名称(例如,二进制文件内置了一些调试信息,或者您执行了调试信息objcopy --only-keep-debug my-leaky-program my-leaky-program.debug
).
此外,您可以尝试Boehm的GC,它也可用作检漏仪:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html
我想宣传我刚刚宣布的 heaptrack 实用程序,这应该正是您当时正在寻找的。您可以在此处找到更多信息:http : //milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux
与您的 heapwatch 工具相比,性能应该要好得多,因为我使用 libunwind 和后来的 libbacktrace 来延迟带有 DWARF 调试信息的回溯注释。
我很想得到更多关于它的反馈,所以试试吧!
令人惊讶的是,我无法在开源域中找到类似 Microsoft UMDH 的任何内容,也无法立即下载。(我还查看了Google Heap Leak Checker,但它更像是 Valgrind,而不是 UMDH)。因此,我最终使用malloc 仪器项目作为参考点自己编写了该工具:
https://github.com/glagolig/heapwatch
该工具有很多限制,但它对于我的目的来说效果很好。
归档时间: |
|
查看次数: |
24789 次 |
最近记录: |