【问题标题】:Tools to visualize 'the stack' in assembly在汇编中可视化“堆栈”的工具
【发布时间】:2020-12-02 19:59:54
【问题描述】:

有没有什么方法可以以一种简单的、最好是可视的方式查看压入堆栈的值?目前我正在使用gdb 进行调试,但想知道是否有任何其他程序(或者甚至可能是另一种模式的 gdb)在我逐步执行每条指令时查看堆栈的样子,例如在这个程序:

.globl main
main:
    push %rbp
    mov %rsp, %rbp
    movb $8, -1(%rbp)
    movw $30, -4(%rbp)
    mov -1(%rbp), %rax
    add -4(%rbp), %rax

我知道在 gdb 中有 x/8xw $rbp 或其变体,但我想在单步执行代码时将其视为动画或持续可视化。有没有办法做到这一点?

【问题讨论】:

    标签: assembly gdb x86-64 callstack


    【解决方案1】:

    每次 GDB 停止时都有display 打印一些东西,例如

    display /x (long [8])*(long*)$rsp
    

    在每一步之后得到这样的输出。 (这个来自_start,所以RSP指向argc(0x1),然后是argv[0](指针),然后是argv[1](NULL),然后是envp[0]等)

    {0x1, 0x7fffffffea02, 0x0, 0x7fffffffea0e, 0x7fffffffea1e, 0x7fffffffea6c, 0x7fffffffea7e, 0x7fffffffea92}
    

    GDB 转换表达式通过将 $rsp(堆栈指针)解引用为单个 long,然后将其转换为 long 的数组来工作。这当然在 C 中实际上不起作用,但 GDB 表达式只使用类似 C 的语法,它们不是正确的 C。可能有更简单的方法来编写它,但这是我通过反复试验得出的。

    这将按照内存地址的递增顺序显示 qwords,从 RSP 指向的一个开始,因此它会在 callpush 之后发生变化,例如。如果您想在下方看到 RSP,进入红色区域,请使用不同的基础,例如 ($rsp-16) 或其他内容。


    如果您想查看 RBP 下方的函数堆栈帧视图,该视图不会随 push/pop 移动,您可能需要像 ($rbp - 16) 之类的基础。

    当然,您的x/8xw $rbp 命令不会向您显示您的指令存储到的任何内存,因为您正在存储以下 RBP = RSP。 (这实际上在 x86-64 System V ABI 中保证安全,它有一个红色区域。在许多其他调用约定中,可以由信号处理程序或由评估 print foo(1) 的调试器异步执行,其中 foo 是程序中的一个函数。)

    【讨论】:

      猜你喜欢
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2011-02-13
      • 2017-08-01
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多