清晰可视化C程序的内存布局的工具

时间:2011-04-22 05:42:56

标签: c memory debug-symbols

假设我有这段代码:

int main() {
    int var1;  
    char *ptr = malloc(5 * sizeof(char));  
    //...........  
    do_something();  
    //...........    
    return 0;  
}

我们知道实际的内存布局会分为以下几个部分:.text.bss.data.heap.stack

我知道如何使用objdumpreadelf等等。但是,我希望更好地了解内存堆栈,我可以看到以下内容:

.heap       ptr  
.stack      do_something()  
.text       main()  
.bss        var1  

要点是:objdumpreadelf等输出中缺少实际的变量名称。

我正在使用-g编译此代码,从而保留符号表。

那么,为什么我无法看到包含本地/全局变量名的内存布局?

objdump -x显示变量的名称,如果类型为static,则不显示。为什么呢?

2 个答案:

答案 0 :(得分:2)

很抱歉,你对此感到有点困惑。考虑:

  • 所有功能都在.text部分
  • 堆栈上的所有非静态局部变量:它们可能是指针,并且您打算为它们分配从malloc返回的值不会将它们放在堆上,它只是尝试创建一个指向对象在堆上。没有看二进制文件的静态工具(例如objdump,readelf)可以知道malloc是返回内存还是失败。
  • 您的全局和static变量可能最终会出现在初始化或未初始化的数据段中 - 这取决于初始位模式是否完全为0,以及编译器是否可以在编译时说服自己。

此外,如果你理解了上述内容,那么你不需要任何东西来根据变量为变量绘制一个小图表,你只需要知道你正在使用什么类型的内存。

答案 1 :(得分:1)

跟踪内存分配的方法很少,但它们都不是内置方法,所有这些方法都需要一些额外的工作。为了可视化内存,您必须使用代码检测和/或事件记录,即内存分配和释放事件,然后重放所有事件并从中生成图形。

看看这篇论文:Visualizing Dynamic Memory Allocations (in C programs)

GCSpy(用于堆可视化)可在此处获取:https://www.cs.kent.ac.uk/projects/gc/gcspy/。虽然最初用于JVM,但您可以使用例如{{1}}来可视化C程序的堆。

我完全理解你为什么要这样做 - 我一直在寻找同样的东西。虽然我发现内存布局快照本身并不是非常有用,但我发现观察内存的分配方式对于调试性能问题非常有意义和有用。

我记得XCode内置了一些仪器工具 - 但从未使用它们,但也许值得探索它们提供的内容。