如何使用 GDB 检查堆栈帧?

Posted

技术标签:

【中文标题】如何使用 GDB 检查堆栈帧?【英文标题】:How can I examine the stack frame with GDB? 【发布时间】:2011-02-15 18:52:22 【问题描述】:

现在我一直在使用 GDB 反汇编二进制文件并检查不同的寄存器等等。是否有一个简单的命令来检查堆栈上的所有内容?这可以仅限于函数中的所有内容吗?

【问题讨论】:

这应该对你有所帮助:cs.nyu.edu/courses/spring07/V22.0474-001/misc/gdb-refcard.pdf。您可以随时使用“frame”命令在帧之间跳转。 【参考方案1】:

对于当前栈帧:

信息框架列出有关框架的一般信息(事物在内存中的起始位置等) info args 列出函数的参数 info locals 列出存储在框架中的局部变量

【讨论】:

如果我有一个变量也叫框架怎么办? @Jeoker info frame 总是会告诉你有关框架的信息。如果您想了解有关变量的信息,则必须使用其他子命令,例如 info locals <name>,或完全像 print 的其他命令【参考方案2】:

bt(或backtrace)会给你一个调用堆栈。

frame <args> 将在调用堆栈上选择一个帧进行检查

info frame <args> 将为您提供有关堆栈中特定帧的信息。当不带参数调用时,它将显示当前选定的帧

info locals 可以为您提供有关堆栈上任何局部变量的信息。

【讨论】:

frame 也选择一个框架。 info frame <addr> 用于检查框架而不选择它【参考方案3】:

您可以通过x/10x $sp

查看堆栈的内容

这将打印堆栈的前 10 个元素。

【讨论】:

这是什么版本的 GDB?我无法让 gdb 使用寄存器作为 GDB 7.7-0ubuntu3.1 上的命令参数 这个答案告诉你如何实际查看堆栈帧上的字节,我很难找到如何去做。谢谢! 但这将打印$sp 指向的元素和之后的9个元素,即(如果堆栈向下增长,例如在x86中)9个元素程序实际上还没有使用。对吗? @cYrus $sp 指向栈顶,即较低的地址。您可能会想到 $bp 存储堆栈的底部地址。【参考方案4】: 试试bt full,你会得到所有帧和局部变量 输入frame x,进入x

顺便说一下,您应该了解进程地址空间及其组成: linux virtual address space,这将帮助您了解框架的使用方式。

【讨论】:

您好,欢迎来到 SO!请阅读tour 和How do I write a good answer? 例如添加指向什么是进程地址空间 的链接,并详细说明它如何帮助解决这个问题可能会有所帮助。

以上是关于如何使用 GDB 检查堆栈帧?的主要内容,如果未能解决你的问题,请参考以下文章

为什么在使用GDB检查时,某些局部变量未在相应的堆栈帧中列出?

如何告诉gdb'优化输出值'的值或使其推断出值?

是否可以使用 GDB 查看未命名的框架/函数参数?

如何使用 gdb 探索堆栈/堆?

使用 gdb 检查调用者帧

GDB核心转储具有损坏的堆栈,显示“堆栈帧无法访问地址0x12处的内存”