我已经采取了一些在线课程介绍使用堆栈,他们是好的,而是理论。 因此,我一直试图通过显示一些简单的C程序的堆栈来理解它。 我已经find了几种做法,并尝试使用gdb(backtrace …)。
但是,我只能在发生错误时显示堆栈信息。 我想知道是否有办法显示堆栈,即使程序正确运行?
虚拟内存中的两个进程
操作系统崩溃的常见原因
重新安装Windows XP没有CD,但与CD键
进程优先级与线程优先级
理论上,你不能确定是否有任何堆栈。
例如,编译器可以内联每个函数调用。 或者它可以做一些整体程序静态分析,并发现不需要堆栈。 或者编译器确实将一些调用优化为尾调用 。
更实际的是,一些函数中的局部变量可以全部进入寄存器(当优化时)。
实际上,你可以在一个调试器(如gdb )中运行你的程序并停止程序(例如在你的gdb会话中使用Ctrl C ),然后运行gdb的backtrace (或bt )命令,并检查调试过程的堆栈 。
(下面的信息是先进的;如果你是一个新手,不要感到困惑;在编译的时候,从你的程序里面,或者从你的调试器,要非常小心。
如果你想在Linux上的一个程序(使用GNU libc) 编程访问调用栈,你可以使用backtrace函数 (它们不是标准的,可能无法工作,特别是强优化)。 甚至伊恩·泰勒libbacktrace (然后更好地用-g编译所有的代码,因为libbacktrace使用DWARF格式的调试信息)。
在评论中你补充道:
我正在寻找一种方法来显示堆栈中的详细信息,如参数,变量,SP等的值。
这是不可能的(在运行时,从程序内部)。 变量和参数只有编译器已知(并在运行时被遗忘)。 在机器代码中,只有内存位置和寄存器( 也许堆栈帧,可能会因为-fomit-stack-pointer编译选项而丢失)。 另外,你经常会用一些优化来编译你的C代码,然后很可能有些变量不在堆栈上(但只在寄存器中)。
请注意,C没有反省 , 反思 ,没有明确的延续 ,也不是一个同心的语言。
我想知道是否有办法显示堆栈,即使程序正确运行?
是的:您可以在程序执行的任意点检查堆栈:只要在感兴趣的指令上设置一个断点,或者单步执行整个程序。
例如:
(gdb) break main (gdb) run ... program stops after main prolog (gdb) where # examine stack (gdb) stepi # execute one instruction (gdb) where (gdb) stepi ... repeat until you reach syscall SYS_exit,or until you are too bored to continue
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。