c - 如何在 C 中显示堆栈的内容?

标签 c linux operating-system gdb stack

我参加了一些介绍堆栈使用的在线类(class),它们很不错,但比较理论化。因此,我一直试图通过显示一些简单的 C 程序的堆栈来理解它。我找到了几种方法并尝试使用 gdb(回溯...)。

但是,我只能在出现错误时显示堆栈信息。我想知道即使程序正确运行,是否有办法只显示堆栈?

最佳答案

理论上,你不能确定有栈。

例如,编译器可以 inline每个函数调用。或者它可以做一些完整的程序 static analysis并发现不需要堆栈。或者编译器做了 optimize一些调用为 tail calls .

更实际的是,某些函数内部的局部变量可以全部放入寄存器(在优化时)。

实际上,您可以在调试器(如 gdb)中运行您的程序,然后停止程序(例如,在您的程序中使用 Ctrl C gdb session ),然后运行gdbexamine the stackbacktrace(或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/

相关文章:

c - 如何在c中定期初始化变量

C编程: Check if the IP address is added on any given NIC

linux - 如果 2GB RAM 可以使用虚拟内存完成工作,则需要 8GB RAM

linux - 内核和 shell 之间的通信

linux - 我的 Fortran 代码的输出被杀死了,有什么建议吗?

c - 如何处理c中的结构?

c - 函数指针类型转换

c - 用于从 H/W 寄存器读取的位字段

regex - BASH 正则表达式检查在 Linux 上不匹配

blackberry - 随着 BBX 的出现,为旧操作系统编写黑莓应用程序是否值得?