使用gdb进行事后内存泄漏搜索(和分析)

tot*_*phu 6 c linux gdb

我的目标是从死后核心文件中弄清楚为什么特定进程消耗大量内存.有什么总结我可以得到某种方式?显而易见的是valgrind是不可能的,因为我无法实时访问流程.

首先得到类似于/ proc /"pid"/ maps的输出会有所帮助,但是

maintenance info sections
Run Code Online (Sandbox Code Playgroud)

(如下所述:GDB:列出崩溃进程的所有映射内存区域)在gdb中没有显示堆内存消耗.

info proc map
Run Code Online (Sandbox Code Playgroud)

是一个选项,因为我可以使用完全相同的代码访问机器,但据我所知,它是不正确的.我的进程使用700MB-s,但看到的地图只占大约10 MB.而且我没有看到.so-s在那里可见

maintenance print statistics
Run Code Online (Sandbox Code Playgroud)

你知道其他可能有用的命令吗?

我可以随时检测代码,但这并不容易.通过指针到达所有分配的数据就像大海捞针一样.

你有什么想法?

Per*_*rry 2

gdb 中的这种事后调试与其说是一门科学,不如说是一门艺术。

在我看来,最重要的工具是编写在 gdb 内部运行的脚本的能力。说明书会给你解释的。我发现它如此有用的原因是它可以让您执行诸如遍历数据结构和打印有关它们的信息之类的事情。

这里您的另一种可能性是检测您的 malloc 版本 - 编写一个新的 malloc 函数来保存有关正在分配的内容的统计信息,以便您可以查看这些事后分析。当然,您可以调用原始的 malloc 来完成实际的内存分配工作。

很抱歉,我无法给您一个明显而简单的答案,该答案将简单地为您提供立即修复 - 如果没有像 valgrind 这样的工具,这是一项非常艰巨的工作。