假设以下是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)
这个错误是什么意思?如何获取存储在寄存器中的当前内容?
p/x $ ebx对我来说效果很好.(或者更确切地说,p/x $ rbx,因为我在64位操作系统中进行测试,但我认为p/x $ ebx可以在32位中运行.)应用程序必须正在运行.如果我在应用程序尚未启动或已经退出时尝试执行p/x $ rbx,我会得到"无寄存器".你确定断点被击中了吗?
做就是了
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)