首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux上的轻量级内存泄漏调试

linux上的轻量级内存泄漏调试
EN

Stack Overflow用户
提问于 2013-08-27 01:52:25
回答 8查看 31K关注 0票数 22

我首先寻找现有的答案,并发现Val差尔是每个人最喜欢的在linux上进行内存泄漏调试的工具。不幸的是,瓦兰似乎不适合我的目的。我会尽力解释原因。

制约因素:

  • 泄漏只在客户的环境中发生。由于某些法律限制,我们必须使用现有的二进制文件。不能重建。
  • 在正常的环境中,我们的应用程序消耗了大约10%的CPU。比如说,我们可以容忍CPU使用量增加10倍。默认的memcheck设置使我们的应用程序在很长一段时间内没有响应,这会使我们的应用程序更糟糕。

我需要的是相当于Microsoft的UMDH:为每个堆分配打开堆栈跟踪,然后在特定的时间点转储按堆栈分组并按分配计数降序排序的所有分配。我们的应用程序是在Windows和Linux平台上发布的,所以我知道在UMDH下Windows上的性能仍然可以接受。

以下是我考虑过的工具/方法

  • 瓦伦的-memcheck和-massif工具做得比需要的多(比如扫描整个进程内存中的每个分配指针),它们太慢了,而且它们仍然没有完成我所做的事情。 需要(转储按计数排序的调用堆栈),因此我必须编写一些解析输出的脚本。
  • dmalloc库(dmalloc.com)需要新的二进制文件。
  • LeakTracer (http://www.andreasen.org/LeakTracer/)只适用于C++ new/delete (我也需要malloc/free ),不具有逐层分组和排序功能。
  • 使用.so机制(预紧机构)实现我自己的工具库,根据我的Linux编码技巧,这至少需要一周的时间,而且感觉就像发明自行车一样。

我错过什么了吗?是否有任何轻量级的LD_PRELOAD选项或现有的工具?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-09-21 21:53:21

令人惊讶的是,我无法在开放源码域中找到类似微软的UMDH的任何东西,也无法立即下载。(我也看过Google堆泄漏检查器,但它更像瓦兰,而不是UMDH)。因此,我最终使用malloc仪器项目作为参考点编写了该工具:

https://github.com/glagolig/heapwatch

该工具有很多限制,但对我的目的来说,它工作得很好。

票数 1
EN

Stack Overflow用户

发布于 2013-08-27 02:03:06

GNU libc已内置malloc调试:

节点/分配-Debugging.html

使用LD_PRELOAD从您自己的.so调用mtrace()

代码语言:javascript
复制
#include <mcheck.h>
static void prepare(void) __attribute__((constructor));
static void prepare(void)
{
    mtrace();
}

编译它时:

代码语言:javascript
复制
gcc -shared -fPIC dbg.c -o dbg.so

运行它时:

代码语言:javascript
复制
export MALLOC_TRACE=out.txt
LD_PRELOAD=./dbg.so ./my-leaky-program

稍后检查输出文件:

代码语言:javascript
复制
mtrace ./my-leaky-program out.txt

你会得到这样的东西:

代码语言:javascript
复制
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

票数 17
EN

Stack Overflow用户

发布于 2014-12-03 10:38:45

我想广告我刚刚宣布的重轨实用程序,这应该正是你在那里寻找的时候。您可以在这里找到更多信息:http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux

与您的堆观察工具相比,性能应该要好得多,因为我使用libunwind和稍后的libbacktrace跟踪来延迟带有矮小调试信息的反跟踪注释。

我很想得到更多的反馈,所以试试吧!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18455698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档