您当前所在位置:首页linux使用 ProcDump for Linux 跟踪内存?

使用 ProcDump for Linux 跟踪内存?

更新:2024-04-24 09:50:39编辑:jiang归类:linux人气:12

在处理基于内存触发的核心转储时,我们常常会陷入一个难题:如何仅通过核心转储来确定内存泄露的位置。如果在生成核心转储的同时,能够获取泄漏内存的调用堆栈,将会非常十分有帮助。

最新的 ProcDump 3.0 for Linux 版本能够快速生成核心转储和泄漏跟踪,轻松识别内存泄漏,实现精准诊断。

使用 ProcDump for Linux 跟踪内存

ProcDump 3.0 for Linux 现在具备了内存泄漏跟踪功能,启用了对 malloc API 的跟踪,将来还会进一步扩展这一功能,以跟踪其他内存/资源分配函数。

为了实现内存分配的跟踪功能,ProcDump 新增了一个-restrack开关。启用该开关后,ProcDump 将追踪内存分配,并在每次生成核心转储的同时生成泄漏跟踪报告。

举个例子:假设想要追踪一个名为testprog的测试应用程序的内存分配情况,并且在内存超过 3MB 时同时生成核心转储和泄漏跟踪报告:2.png

在这里,我们可以看到资源跟踪已经启用(稍后会介绍采样率),而 ProcDump 正在等待目标进程的内存超过 3MB。一旦达到阈值,ProcDump 将输出以下信息:1.png

可以看到,除了核心转储之外,还有一个包含可能泄漏分配的.restrack文件:2.png

生成的泄漏跟踪文件(与核心转储文件同名,扩展名为.restrack)包含一个或多个被视为泄漏的分配。上面的第一个分配显示已经发生了0x5c个大小为0x2710的分配,总计为0xe09c0字节。它还显示导致泄漏分配的调用堆栈。这些信息精确定位了应用程序中泄漏发生的地方,使诊断变得更加容易。

关于误判

上述示例中,第二个分配也显示为泄漏(包含std::vector框架),但实际上并不是真正的泄漏,而是该应用程序正在使用缓存。为了避免误判,ProcDump 支持-fx开关,该开关会忽略具有指定框架的调用堆栈。例如:

ProcDump 将忽略所有调用堆栈中包含指定字符串值的分配(支持通配符)。在与之前相同的场景中,运行上述命令,现在只有一个泄漏的分配:3.png

排除那些不是真正泄漏的分配,可以极大地减少干扰,使你更有效地集中精力。

采样率

一般而言,使用 ProcDump 进行资源跟踪时的开销非常小。但在某些情况下(例如重负载的生产工作负载),资源跟踪所带来的开销可能会影响到工作负载。为了缓解这种影响,ProcDump 还支持-sr开关(采样率),该开关接受采样率数字(默认为1)。

目前,采样算法会简单地每隔 X 个分配采样一次,并仅报告这些分配。例如,在上述相同的场景下,要想每隔 10 个分配进行采样,可以运行以下命令:

通过减小采样率,我们有效地减少了资源跟踪对分配的监测次数,从而降低了开销。可以看到,由于每隔 10 个分配进行一次采样,分配计数已经大幅减少( 0x8对比0x51)。

我告诉你msdn版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

linux
在Linux中如何安装PHP的memcache扩展? 如何在 Linux 中安装 Development Tools 开发工具?

游客 回复需填写必要信息