假设我有这段代码:
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
,则不显示。为什么呢?
答案 0 :(得分:2)
很抱歉,你对此感到有点困惑。考虑:
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内置了一些仪器工具 - 但从未使用它们,但也许值得探索它们提供的内容。