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

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

【问题讨论】:

标签: gdb stack


【解决方案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!请阅读tourHow do I write a good answer? 例如添加指向什么是进程地址空间 的链接,并详细说明它如何帮助解决这个问题可能会有所帮助。
猜你喜欢
  • 2011-04-30
  • 2015-11-07
  • 2012-04-06
  • 2011-04-21
  • 2011-12-12
  • 1970-01-01
  • 2015-07-19
相关资源
最近更新 更多