Gdb 内存地址是否包含隐式十六进制数字?
64位计算机上小于12个十六进制数字的内存地址的值是多少 例如,当我在一个简单的汇编程序上运行gdb并运行Gdb 内存地址是否包含隐式十六进制数字?,gdb,memory-address,Gdb,Memory Address,64位计算机上小于12个十六进制数字的内存地址的值是多少 例如,当我在一个简单的汇编程序上运行gdb并运行(gdb)info frame时,我得到: Stack level 0, frame at 0x7fffffffd970: rip = 0x40052f in main (file.s:11); saved rip = 0x7ffff7a2d830 source language asm. Arglist at 0x7fffffffd960, args: Locals at 0x7
(gdb)info frame
时,我得到:
Stack level 0, frame at 0x7fffffffd970:
rip = 0x40052f in main (file.s:11); saved rip = 0x7ffff7a2d830
source language asm.
Arglist at 0x7fffffffd960, args:
Locals at 0x7fffffffd960, Previous frame's sp is 0x7fffffffd970
Saved registers:
rbp at 0x7fffffffd960, rip at 0x7fffffffd968
0x7fffffffd968: 0xf7a2d830
main(file.s:11)中第二行的第一部分rip=0x40052f
我相信在调用info frame
时说明了指令指针的值。但为什么它的内存地址不是12个十六进制数字
此外,如果我键入(gdb)x 0x7fffffd968
(我希望是0x7ffff7a2d830
),我会得到:
这是否意味着任何少于12个十六进制数字的内存地址都包含一个隐式的
7ff…
?否。在x86或x86_64上,内存地址只是一个数字,但通常使用十六进制显示。和大多数数字符号系统一样,一个较短的数字只意味着一个更小的值,或者如果你愿意,在它前面有隐式的零
因此,就像十进制字符串“12”比“12654321”小得多一样,地址0x40052f
比地址0x7ffff7a2d830
小得多。这两个地址几乎肯定位于不同的虚拟内存映射中。(在Linux上,您可以通过cat/proc/{pid}/maps
查看虚拟内存映射)
当您使用gdbx
命令时,您没有看到预期的值,因为gdb猜测了您的地址指向的数据类型。第一次在gdb会话中使用x
时,它默认为每个元素显示4个字节(32位),就像地址指向uint32\t
数组一样。因为x86_64上的地址是8字节(64位),所以需要x/g
告诉gdb元素大小是8字节