为什么 gdb 中的 "info register ebp" 不显示十进制数?
Why is "info register ebp" in gdb not displaying a decimal number?
我正在用 gdb 调试一个非常简单的代码:
mov ebp,eax ; Save # of bytes read from file for later
这是我的输出:
Breakpoint 2, Read () at hexdump1.asm:44
(gdb) info register eax
eax 0xd 13
(gdb) step
Read () at hexdump1.asm:45
(gdb) info register ebp
ebp 0xd 0xd
为什么 gdb 显示 eax 为 0xd 13 而 ebp 为 0xd 0xd?
你的问题是为什么(gdb) info register eax
用十六进制数和十进制数显示EAX的内容,而(gdb) info register ebx
只用十六进制数表示EBP,对吗?
不仅EBP如此,ESP、EFLAGS和EIP也是如此。我想,那没有什么特别的意义。 gdb 只是试图以一种有用的方式显示它。例如,对于 EFLAGS,您希望查看标志的状态而不是十进制数(在下面的示例中设置了 IF)。在 EBP 和 ESP 的情况下,我们谈论的寄存器通常用于指向 stack/memory 中的地址。因此通常,您不想知道十进制值。好吧,在这种情况下,两次显示十六进制是没有用的。
这里是一个例子,用info registers
命令显示所有寄存器的内容(i r
是简写形式,我刚发现:P)。
(gdb) i r
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0xbffff234 0xbffff234
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x804822d 0x804822d
eflags 0x202 [ IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
更多信息:https://sourceware.org/gdb/onlinedocs/gdb/Registers.html
info registers
命令以 raw 格式(十六进制)和 natural 格式打印寄存器。自然格式基于寄存器的 type,在 gdb 源代码的 xml 文件中声明。例如,i386/32bit-core.xml
包含:
<reg name="eax" bitsize="32" type="int32"/>
<reg name="ecx" bitsize="32" type="int32"/>
<reg name="edx" bitsize="32" type="int32"/>
<reg name="ebx" bitsize="32" type="int32"/>
<reg name="esp" bitsize="32" type="data_ptr"/>
<reg name="ebp" bitsize="32" type="data_ptr"/>
<reg name="esi" bitsize="32" type="int32"/>
<reg name="edi" bitsize="32" type="int32"/>
<reg name="eip" bitsize="32" type="code_ptr"/>
<reg name="eflags" bitsize="32" type="i386_eflags"/>
<reg name="cs" bitsize="32" type="int32"/>
<reg name="ss" bitsize="32" type="int32"/>
<reg name="ds" bitsize="32" type="int32"/>
<reg name="es" bitsize="32" type="int32"/>
<reg name="fs" bitsize="32" type="int32"/>
<reg name="gs" bitsize="32" type="int32"/>
在 gdb 中,您可以查看寄存器的类型:
(gdb) whatis $eax
type = int32_t
(gdb) whatis $ebp
type = void *
我正在用 gdb 调试一个非常简单的代码:
mov ebp,eax ; Save # of bytes read from file for later
这是我的输出:
Breakpoint 2, Read () at hexdump1.asm:44
(gdb) info register eax
eax 0xd 13
(gdb) step
Read () at hexdump1.asm:45
(gdb) info register ebp
ebp 0xd 0xd
为什么 gdb 显示 eax 为 0xd 13 而 ebp 为 0xd 0xd?
你的问题是为什么(gdb) info register eax
用十六进制数和十进制数显示EAX的内容,而(gdb) info register ebx
只用十六进制数表示EBP,对吗?
不仅EBP如此,ESP、EFLAGS和EIP也是如此。我想,那没有什么特别的意义。 gdb 只是试图以一种有用的方式显示它。例如,对于 EFLAGS,您希望查看标志的状态而不是十进制数(在下面的示例中设置了 IF)。在 EBP 和 ESP 的情况下,我们谈论的寄存器通常用于指向 stack/memory 中的地址。因此通常,您不想知道十进制值。好吧,在这种情况下,两次显示十六进制是没有用的。
这里是一个例子,用info registers
命令显示所有寄存器的内容(i r
是简写形式,我刚发现:P)。
(gdb) i r eax 0x0 0 ecx 0x0 0 edx 0x0 0 ebx 0x0 0 esp 0xbffff234 0xbffff234 ebp 0x0 0x0 esi 0x0 0 edi 0x0 0 eip 0x804822d 0x804822d eflags 0x202 [ IF ] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x0 0
更多信息:https://sourceware.org/gdb/onlinedocs/gdb/Registers.html
info registers
命令以 raw 格式(十六进制)和 natural 格式打印寄存器。自然格式基于寄存器的 type,在 gdb 源代码的 xml 文件中声明。例如,i386/32bit-core.xml
包含:
<reg name="eax" bitsize="32" type="int32"/>
<reg name="ecx" bitsize="32" type="int32"/>
<reg name="edx" bitsize="32" type="int32"/>
<reg name="ebx" bitsize="32" type="int32"/>
<reg name="esp" bitsize="32" type="data_ptr"/>
<reg name="ebp" bitsize="32" type="data_ptr"/>
<reg name="esi" bitsize="32" type="int32"/>
<reg name="edi" bitsize="32" type="int32"/>
<reg name="eip" bitsize="32" type="code_ptr"/>
<reg name="eflags" bitsize="32" type="i386_eflags"/>
<reg name="cs" bitsize="32" type="int32"/>
<reg name="ss" bitsize="32" type="int32"/>
<reg name="ds" bitsize="32" type="int32"/>
<reg name="es" bitsize="32" type="int32"/>
<reg name="fs" bitsize="32" type="int32"/>
<reg name="gs" bitsize="32" type="int32"/>
在 gdb 中,您可以查看寄存器的类型:
(gdb) whatis $eax
type = int32_t
(gdb) whatis $ebp
type = void *