如何使用GDB调试器查看__asm__内容?

Str*_*rry 1 c debugging assembly

我试图了解这段代码中发生了什么,特别是在内部__asm__.如何逐步完成汇编代码,这样我就可以打印每个变量而不是什么?

具体来说,我试图通过这个来弄清楚它的8()含义是什么,并看看它是如何知道它在索引2处进入数组的.

 /* a[2] = 99 in assembly */
  __asm__("\n\
     movl $_a, %eax\n\
     movl $99, 8(%eax)\n\
");
Run Code Online (Sandbox Code Playgroud)

nat*_*ose 5

stepi命令一次遍历程序集一条指令.还有一个nexti用于逐步调用函数的函数.这些命令不符合'只有命令的唯一前缀的类型就足够了'适用于大多数命令的规则 - 部分原因是它们nextstep命令完全是这些命令的前缀,部分原因是这些命令不常用,而且他们通常被知道他们真正想要使用它们的人使用.

info registers 显示很多寄存器内容.

您还需要使用该disassemble命令查看反汇编.

有关所有这些命令的更多信息可用于该help命令,例如:

(gdb) help info registers
Run Code Online (Sandbox Code Playgroud)

告诉您info registers显示整数寄存器及其内容,但它也告诉您如果提供寄存器名称,它将限制输出到该寄存器的值:

(gdb) info registers rax
rax            0x0  0
Run Code Online (Sandbox Code Playgroud)

(rax是x86_64版本eax)第一列是寄存器名称,第二列是十六进制值,第三列是整数值.

help这个disassemble命令也很有用.

请记住,gdb有许多命令的选项卡完成,这不仅可以用于简单的命令,但很多时候它会为您提供不好的建议 - 但它有时会有所帮助.

在内联汇编中包含一个标签,可以让您在开头轻松创建一个断点.