我参加了一些介绍堆栈使用的在线类(class),它们很不错,但比较理论化。因此,我一直试图通过显示一些简单的 C 程序的堆栈来理解它。我找到了几种方法并尝试使用 gdb(回溯...)。
但是,我只能在出现错误时显示堆栈信息。我想知道即使程序正确运行,是否有办法只显示堆栈?
最佳答案
理论上,你不能确定有栈。
例如,编译器可以 inline每个函数调用。或者它可以做一些完整的程序 static analysis并发现不需要堆栈。或者编译器做了 optimize一些调用为 tail calls .
更实际的是,某些函数内部的局部变量可以全部放入寄存器(在优化时)。
实际上,您可以在调试器(如 gdb
)中运行您的程序,然后停止程序(例如,在您的程序中使用 Ctrl C gdb
session ),然后运行gdb
和examine the stack 的backtrace
(或bt
)命令调试过程。
(下面的信息是高级的;如果您是新手,请不要感到困惑;并且要非常小心在编译时、程序内部或调试器中可以做什么)
如果你想访问call stack 以编程方式在 Linux 上的程序中(使用 GNU libc)你可以使用 backtrace functions (它们不是标准的,并且可能不起作用,特别是在进行强大的优化时)。甚至 Ian Taylor libbacktrace (然后最好使用 -g
编译所有代码,因为 libbacktrace
使用 DWARF 格式的调试信息)。
在您添加的评论中:
I am looking for a way of showing the detail information in the stack such as the value of parameters, variables, SP and so on.
这通常是不可能的(在运行时,从你的程序内部)。变量和参数只为编译器所知(并在运行时被遗忘)。在机器代码中,您只有内存位置和寄存器(以及可能堆栈帧,它们可能会随着 -fomit-stack-pointer
compile option ....)丢失。此外,您经常会使用一些 optimizations 来编译 C 代码。 , 然后很可能有些变量不在堆栈上(但只在寄存器中)。
注意 C 没有 introspection , 或 reflection , 没有明确的 continuations , 而不是 homoiconic语言。
关于c - 如何在 C 中显示堆栈的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42312987/