如何使用 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 列出存储在框架中的局部变量【讨论】:
如果我有一个变量也叫框架怎么办? @Jeokerinfo 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 检查堆栈帧?的主要内容,如果未能解决你的问题,请参考以下文章