GDB - 我能在内存中找到大数据元素吗?

3

我有一个程序,其中有相当数量的静态定义变量。如果我在GDB中启动它,并在main函数上设置断点,然后运行pmap命令,我会看到已经分配了大约100MB的数据:

08838000 107576K rw---    [ anon ]

我已经找到了很多有巨大静态定义数组的函数(例如200,000个整数),并在发现它们后将它们消除掉。

有没有办法找出堆/数据段上最大的项目是什么?无论是通过GDB还是通过其他手段?


3
通过 objdump 和 nm 输出可以获取符号(对象)的大小。我认为需要调试信息。 - fork0
1
太棒了!你能把它写成一个答案吗 :) nm --size-sort 正好符合我所需的功能(在一些测试代码中发现了一个大小为20 MB的250万个整数数组,这在大多数系统上都不会被使用!) - asc99c
这听起来像是一段代码缺乏关注。 - fork0
是的,我以为我在寻找应用程序特定部分的东西,但事实证明,大多数最大的罪魁祸首都是我负责的核心代码的一部分!这至少让我更容易修复。 - asc99c
1个回答

5
您可以使用像 nm(1) 这样的对象代码检查工具来查找信息:
nm --size-sort <object-file.o>

此外,如果有足够的调试信息,objdump可以为完全链接的程序提供额外的见解。
这些工具通常是针对特定平台的,因此在进行交叉编译时必须小心使用正确的程序(例如使用`x86_64-linux-gnu-gcc-nm`而不是仅使用`nm`)。

C++的名称混淆可以通过c++filt在更易读(或不太易读,如果您有一个模板对应多个)的形式下进行后处理。 - fork0
@Shahbaz:没错。有时候它不起作用(我也找不出原因),但还是应该尝试一下。 - fork0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接