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

标签 c linux gdb

我的总体目标是从事后核心文件中找出特定进程消耗大量内存的原因。有没有我能以某种方式得到的摘要?显然 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-s
maintenance print statistics

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

我总能检测代码,但这并不容易。通过指针访问所有分配的数据就像大海捞针一样。

你有什么想法吗?

最佳答案

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

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

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

很抱歉,我无法为您提供一个明显而简单的答案,而这个答案只会为您立即解决问题——如果没有像 valgrind 这样的工具,这是一项非常艰巨的工作。

关于c - 使用 gdb 进行事后内存泄漏搜索(和分析),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525564/

相关文章:

linux - 如何打印包含句子的列而不丢失 awk printf 中第一个单词之后的所有内容?

gdb - 是否有可能让 gdb 在特定文件中运行任何东西时首先中断?

c - 大多数程序都可以运行,但我的数组没有按应有的方式打印

c - malloc C 之后写入数组时出现问题

linux - Qt - 如何检测 Resume 从 Standby 到成员(member)状态

c - 在 GDB 中打印字符数组到文件

linux - Ubuntu 18中的服务崩溃问题

c - 如何阅读这个变量声明?

c - STM32L-发现 EXTI 中断失败

objective-c - 将 CFStringRef 转换为 C 对应物?