我的总体目标是从事后核心文件中找出特定进程消耗大量内存的原因。有没有我能以某种方式得到的摘要?显然 valgrind 是不可能的,因为我无法实时访问该过程。
首先获得类似于/proc/"pid"/maps 的输出,会有所帮助,但是
maintenance info sections
(如此处所述:GDB: Listing all mapped memory regions for a crashed process)在 gdb 中没有显示堆内存消耗。
info proc map
是一个选项,因为我可以使用完全相同的代码访问机器,但据我所知,它是不正确的。我的进程使用了 700MB-s,但是看到的 map 只占了大约 10MB。而且我没有看到在
中可见的 .so-smaintenance print statistics
你知道其他可能有用的命令吗?
我总能检测代码,但这并不容易。通过指针访问所有分配的数据就像大海捞针一样。
你有什么想法吗?
最佳答案
在 gdb 中进行这种事后调试与其说是一门科学,不如说是一门艺术。
在我看来,它最重要的工具是能够编写在 gdb 内部运行的脚本。说明书会给你解释的。我发现它如此有用的原因是它可以让你做一些事情,比如遍历数据结构和打印出关于它们的信息。
您在这里的另一种可能性是检测您的 malloc 版本——编写一个新的 malloc 函数来保存有关正在分配的内容的统计信息,以便您可以查看这些事后分析。当然,您可以调用原始 malloc 来完成实际的内存分配工作。
很抱歉,我无法为您提供一个明显而简单的答案,而这个答案只会为您立即解决问题——如果没有像 valgrind 这样的工具,这是一项非常艰巨的工作。
关于c - 使用 gdb 进行事后内存泄漏搜索(和分析),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525564/