2010-10-07 74 views
2

假设下面是汇编代码

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> 

我在最后一行设置一个断点,这个时候,我期待存储在他们俩%EAX和EBX%拥有的东西。

在gdb中,我做

p/x $ebx 

,并得到:

No registers. 

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

+0

http://stackoverflow.com/questions/5429137/how-to-print-register-values-in-gdb – 2015-07-28 09:36:11

回答

6

p/x $ ebx适合我。 (或者说,p/x $ rbx,因为我在64位操作系统中进行测试,但我认为p/x $ ebx可以在32位上运行)。应用程序必须正在运行。如果我在应用程序尚未启动或已经退出时尝试执行p/x $ rbx,则确实会得到“无寄存器”。你确定断点被击中了吗?

+0

的确你是对的。我一直想念着这样一个事实,即当断点被设置时,我从来没有去过它。由于我错过了另一件事,程序在此之前退出。再次谢谢你 – JAM 2010-10-08 00:10:36

6

只是做

info register 

它会给你的寄存器和当前值。

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

p $fp 
p $pc 
p $ps 
p $sp