如何使用gdb获取存储在寄存器中的值?"p/x $ ebx"失败并显示"No registers".

Jam*_*sev 3 gdb

假设以下是asm代码

 8048deb:       e8 41 05 00 00          call   8049331 <explode_bomb>
 8048df0:       03 73 f4                add    -0xc(%ebx),%esi
 8048df3:       83 c3 04                add    $0x4,%ebx
 8048df6:       8d 45 f8                lea    -0x8(%ebp),%eax
 8048df9:       39 c3                   cmp    %eax,%ebx
 8048dfb:       75 e7                   jne    8048de4 <phase_2+0x22>
Run Code Online (Sandbox Code Playgroud)

我在最后一行设置了一个断点,此时,我期待%eax和%ebx都存储了一些内容.

在gdb中,我这样做

p/x $ebx
Run Code Online (Sandbox Code Playgroud)

得到:

No registers.
Run Code Online (Sandbox Code Playgroud)

这个错误是什么意思?如何获取存储在寄存器中的当前内容?

Eug*_*ith 7

p/x $ ebx对我来说效果很好.(或者更确切地说,p/x $ rbx,因为我在64位操作系统中进行测试,但我认为p/x $ ebx可以在32位中运行.)应用程序必须正在运行.如果我在应用程序尚未启动或已经退出时尝试执行p/x $ rbx,我会得到"无寄存器".你确定断点被击中了吗?


Kiz*_*aru 6

做就是了

 info register
Run Code Online (Sandbox Code Playgroud)

它将为您提供寄存器及其当前值.

我不相信有一种方法可以打印/获取ebx,eax,ecx等的值.但是,您可以使用帧指针,程序计数器,进程状态和堆栈指针寄存器的值来打印

p $fp
p $pc
p $ps
p $sp
Run Code Online (Sandbox Code Playgroud)