【发布时间】:2017-11-30 10:52:40
【问题描述】:
我正在尝试减少程序的内存使用量,我刚刚手动找到的一个示例是一个将分配 150 个元素的数组,但实际上只使用了前 3 个元素。
我想知道 GDB 是否有一种方法可以分析哪些内存区域已分配但在程序执行期间从未实际读取,以帮助我找到其他类似情况。该程序是用 C 语言编写的,因此也欢迎使用 GCC 标志。
【问题讨论】:
我正在尝试减少程序的内存使用量,我刚刚手动找到的一个示例是一个将分配 150 个元素的数组,但实际上只使用了前 3 个元素。
我想知道 GDB 是否有一种方法可以分析哪些内存区域已分配但在程序执行期间从未实际读取,以帮助我找到其他类似情况。该程序是用 C 语言编写的,因此也欢迎使用 GCC 标志。
【问题讨论】:
如果您想发现实际未使用的内存,您将需要硬件调试器的支持,该调试器至少捕获对内存的写访问。
GDB 没有内置硬件支持,因此它无法发现它。但是您可以尝试检测更改的内存。为此,您可以在 (program/functions/sn-p/whatever) 执行之前使用模式分配内存,并检查数据模式的修改位置。这可以用于例如用于检测最大使用堆栈大小。测试您的程序后,您可以检查已填充的内存区域,当您看到第一个不匹配时,您就有了很好的猜测。
警告!此方法不会检测所有内存修改。该程序可以编写您用来标记为“未使用内存”的数据模式。所以选择一个好的模式会有所帮助。使用“全零”模式是弱的,因为在程序中用零填充内存是可能的。但是 0xdeadbeaf 的序列可能更明智。
【讨论】: