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

标签 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 否则不是。为什么?

最佳答案

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

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

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

我完全理解您为什么要这样做 - 我也在寻找同样的东西。虽然我发现内存布局快照本身并不是很有用,但我发现观察内存如何随着时间的推移分配非常有趣,并且对于调试性能问题很有用。

我记得 XCode 内置了一些检测工具 - 虽然从未使用过它们,但也许值得探索它们提供的功能。

关于c - 清晰可视化 C 程序的内存布局的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5752605/

相关文章:

c - 为什么#define 不需要分号?

iphone - 我可以返回分配的对象并在函数外释放它吗?

c++ - c++ 数组和内存错误

Xcode:我应该在复制期间去除调试符号吗?

c# - 打开小型转储 : No native symbols in symbol file

linux - 当另一个库具有相同的符号时,gdb 不显示来自共享库的符号

c - 递归函数,调用后命令

c - emacs 正则表达式替换 C 函数调用

c - while循环导致程序出现许多问题

c++ - 为什么当内存足够时 malloc() 会失败?