系统极客一直在努力
专注操作系统及软件使用技能

如何使用 ProcDump for Linux,轻松跟踪内存泄漏

sysinternals

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

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

使用 ProcDump for Linux 跟踪内存

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

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

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

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

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

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

关于误判

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

sudo ./procdump -m 3 -restrack -fx "*std::_Vector_base<void*, std::allocator<void*> >::_M_allocate*" -w testapp

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

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

采样率

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

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

sudo ./procdump -m 3 -restrack -sr 10 -fx "*std::_Vector_base<void*, std::allocator<void*> >::_M_allocate*" -w testapp

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

赞(0) 赞赏

评论 抢沙发

微信赞赏