在处理基于内存触发的核心转储时,我们常常会陷入一个难题:如何仅通过核心转储来确定内存泄露的位置。如果在生成核心转储的同时,能够获取泄漏内存的调用堆栈,将会非常十分有帮助。
最新的 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
)。
最新评论
可以共存,但虚拟机维护起来更麻烦了呀。
关掉之后重启下系统再试试呢
不能共存吗?
我是家庭版,看着关掉了,但是破解程序一运行还是弹窗,搞不了