假设我有这个代码:
int main() {
int var1;
char *ptr = malloc(5 * sizeof(char));
//...........
do_something();
//...........
return 0;
}
我们知道,实际的内存布局会被分成几个段,如:.text
、.bss
、.data
、 .heap
、.stack
。
我知道如何使用 objdump
、readelf
等。但是,我想更好地了解内存堆栈,在那里我可以看到以下内容:
.heap ptr
.stack do_something()
.text main()
.bss var1
重点是:objdump
、readelf
等的输出中缺少实际的变量名
我正在用-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/