我首先寻找现有的答案,并发现Val差尔是每个人最喜欢的在linux上进行内存泄漏调试的工具。不幸的是,瓦兰似乎不适合我的目的。我会尽力解释原因。
制约因素:
我需要的是相当于Microsoft的UMDH:为每个堆分配打开堆栈跟踪,然后在特定的时间点转储按堆栈分组并按分配计数降序排序的所有分配。我们的应用程序是在Windows和Linux平台上发布的,所以我知道在UMDH下Windows上的性能仍然可以接受。
以下是我考虑过的工具/方法
我错过什么了吗?是否有任何轻量级的LD_PRELOAD选项或现有的工具?
发布于 2013-09-21 21:53:21
令人惊讶的是,我无法在开放源码域中找到类似微软的UMDH的任何东西,也无法立即下载。(我也看过Google堆泄漏检查器,但它更像瓦兰,而不是UMDH)。因此,我最终使用malloc仪器项目作为参考点编写了该工具:
https://github.com/glagolig/heapwatch
该工具有很多限制,但对我的目的来说,它工作得很好。
发布于 2013-08-27 02:03:06
GNU libc已内置malloc调试:
节点/分配-Debugging.html
使用LD_PRELOAD从您自己的.so调用mtrace():
#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挂钩来转储整个堆栈(如果您认为这会有所帮助,请调用回溯() )。
如果您将二进制程序的调试信息保存在某个位置(例如,二进制文件中包含了一些调试信息,或者您使用了objcopy --only-keep-debug my-leaky-program my-leaky-program.debug),那么行号和/或函数名将是可以获得的。
此外,您也可以尝试Boehm的GC,它也用作检漏器:
Boehm/gc/leak.html
发布于 2014-12-03 10:38:45
我想广告我刚刚宣布的重轨实用程序,这应该正是你在那里寻找的时候。您可以在这里找到更多信息:http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux
与您的堆观察工具相比,性能应该要好得多,因为我使用libunwind和稍后的libbacktrace跟踪来延迟带有矮小调试信息的反跟踪注释。
我很想得到更多的反馈,所以试试吧!
https://stackoverflow.com/questions/18455698
复制相似问题