如何使用gdb获取存储在寄存器中的值? “p/x $ ebx”因“没有寄存器”而失败。
问题描述:
假设下面是汇编代码
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.
这个错误是什么意思?我如何获取存储在寄存器中的当前内容?
答
p/x $ ebx适合我。 (或者说,p/x $ rbx,因为我在64位操作系统中进行测试,但我认为p/x $ ebx可以在32位上运行)。应用程序必须正在运行。如果我在应用程序尚未启动或已经退出时尝试执行p/x $ rbx,则确实会得到“无寄存器”。你确定断点被击中了吗?
+0
的确你是对的。我一直想念着这样一个事实,即当断点被设置时,我从来没有去过它。由于我错过了另一件事,程序在此之前退出。再次谢谢你 – JAM 2010-10-08 00:10:36
答
只是做
info register
它会给你的寄存器和当前值。
我不相信有一种方法可以打印/获取ebx,eax,ecx等的值。但是,您可以打印帧指针,程序计数器,进程状态和堆栈指针寄存器的值使用
p $fp
p $pc
p $ps
p $sp
http://stackoverflow.com/questions/5429137/how-to-print-register-values-in-gdb – 2015-07-28 09:36:11