linux - 在 gdb 中分配内存

标签 linux memory-management gdb

为什么当我逐步执行 gdb 中的程序时,内存消耗会不可预测地跳跃?调试器?我正在尝试使用 gdb 来找出为什么程序使用的内存比它应该使用的多得多,而且它不合作。

我在监视进程内存使用情况的同时逐步查看源代码,但我找不到分配内存的行,原因有两个:

  1. 报告的内存使用量仅以 64 MB 为增量(通常但不总是准确)增加。我怀疑我看到了一些我不知道的内存管理器的影响,它一次保留 64 MB 并屏蔽多个较小的分配。
  2. 跳转没有发生在代码中一致的位置。它不仅在不同的 gdb 运行期间出现在不同的行上;它有时也会发生在不合逻辑的地方,例如 (c++) 函数的右括号。 gdb 本身是否可能影响内存分配?

对于更有效的工具有什么想法/建议可以帮助我深入了解真正负责这些内存分配的代码行吗?

这是一些相关的系统信息:我在 Windows 下的虚拟 CentOS Linux 机器上运行 x86_64-redhat-linux-gnu 版本 7.2-64.el6-5.2。该程序是通过复杂的构建脚本在远程服务器上构建的,因此准确追踪在任何时候使用了哪些选项本身就是一件苦差事。我正在使用 top 监控内存使用情况实用程序(“virt”或虚拟内存列)并通过读取实时监控文件 /proc/<pid>/status ,他们同意。由于此程序使用大量第三方库,因此可能会覆盖一个或多个 malloc()我不知道的某个地方涉及的函数——找到它们是这项任务的一部分。

最佳答案

gdb 留给它自己的设备使用,不会影响程序的内存使用,尽管由于其他原因在 gdb 下运行可能与独立运行不同。

但是,这也取决于您使用 gdb 的方式。如果您只是设置简单的断点、单步执行和打印内容,那么就可以了。但有时,为了计算一个表达式,gdb 会在下层分配内存。例如,如果您有一个像 strcmp(arg, "string") == 0 这样的断点条件,那么 gdb 将为该字符串常量分配内存。还有其他类似的情况。

关于linux - 在 gdb 中分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738652/

相关文章:

c - source_file.c 是否必须出现在我们试图为 source_file.c 的可执行文件执行 gdb 的目录中?

php - 如何减小 PDF 文件大小

objective-c - 保留/释放返回对象

c - 访问 PCIe 设备的内部寄存器

c - gdb 保留的地址范围?

emacs - Emacs 中的 gdb : how to enable the readline features?

linux - 使用 sed 命令的 Jenkinsfile ssh 问题

java - 即使编码后仍输出垃圾字符

linux - wifidog认证服务器请求http ://serverdomain/install/3 got an error

c++ - 在 C++ 中有效使用堆栈与堆内存分配