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

San*_*ngh 10 c memory debug-symbols

假设我有这个代码:

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

我们知道,实际的内存布局将分为领域,如:.text,.bss,.data,.heap,.stack.

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

.heap       ptr  
.stack      do_something()  
.text       main()  
.bss        var1  
Run Code Online (Sandbox Code Playgroud)

主要的一点是:实际变量名是从输出丢失objdump,readelf等等.

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

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

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

bx2*_*bx2 5

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

看看这篇论文:可视化动态内存分配(在 C 程序中)

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

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

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