【问题标题】:What is the correct way to examine the stack in gdb?检查 gdb 中的堆栈的正确方法是什么?
【发布时间】:2017-06-11 01:54:43
【问题描述】:

由于堆栈向较小的地址增长,因此使用 gdb 检查它对我来说很费劲。到目前为止我使用

x/64xw 0xffffd0e8-64*4

如果我想查看位于 0xffffd0e8(在堆栈上)的值以及在堆栈上跟随它的值(在这种情况下,在 32 位机器上是以下 64 个字)。

有没有更简单的方法?

另外,有没有什么办法可以自动给栈上的内容贴上相应的变量名?还是每行只显示一个单词,而不是四个?

【问题讨论】:

  • 考虑改用x/64xw $esp
  • 我知道。但有时我想检查当前帧,它不在堆栈顶部。
  • 定义一个辅助函数。
  • @MichaelPalm 运行frame 命令(或updown)后,gdb 将获取给定帧的$esp$ebp 寄存器变量的正确值. eval "x/%dxw $esp", ($ebp-$esp+4)/4 之类的东西会打印出当前帧中的局部变量区域。

标签: debugging assembly gdb reverse-engineering


【解决方案1】:

如果您没有调试信息可以帮助您,除了了解 ABI 并手动阅读它之外,别无他法,在 GDB 的帮助下,就像您正在做的那样,它已经可以做一套很好的仅基于 ABI 的事情(如回溯,但不命名调用者)。

如果您有二进制文件的调试信息,您可以使用info locals 列出所选堆栈帧的局部变量,并使用framebtinfo frameinfo frame <address> 在堆栈中导航、updownetc

您不能真正“注释”内存,但您可以创建convenience variables 以动态创建 GDB 变量。

关于如何方便地读取大型内存数组,我发现简单地使用print 和转换地址非常有用。例如:print (char(*)[]) 0xdeadbeef。并且还使用artifical arrays 打印大区域。 GDB 将聚合连续的相同值,从而非常清晰和易于读取同构内存区域(堆栈并非真正的情况)。

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 1970-01-01
    • 2021-07-14
    • 2012-04-05
    • 2017-01-16
    • 2014-05-25
    • 2016-09-03
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多