X86 gdb中的小端点
大-000000000000110 00000000000000000001 LIT-00000001 00000000 00000110 00000000 所以我期望0xcfb01420+2是0x6,但事实并非如此。我错过什么了吗X86 gdb中的小端点,x86,gdb,endianness,X86,Gdb,Endianness,大-000000000000110 00000000000000000001 LIT-00000001 00000000 00000110 00000000 所以我期望0xcfb01420+2是0x6,但事实并非如此。我错过什么了吗 0x0 0x6 0x0 0x1 我的假设是,小端格式的0x601的字节序列应该与我上面表示的方式相匹配。因此,第二个字节应该是全零。我想我已经把所有的半字节都放对了。相对于您实际检查的内容,您的初始十六进制值都缺少数
0x0 0x6 0x0 0x1
我的假设是,小端格式的0x601的字节序列应该与我上面表示的方式相匹配。因此,第二个字节应该是全零。我想我已经把所有的半字节都放对了。相对于您实际检查的内容,您的初始十六进制值都缺少数字
00000001
是0x01
——它是8个二进制数字,因此是一个完整字节
因此0x601
=0x0601
=00000110 00000001
您可以在gdb中通过以下方式看到这一点:
(gdb) p &tx_q_sem->mlock.u.mtxa_owner
$41 = (volatile __uintptr_t *) 0xcfb01420
(gdb) p/x tx_q_sem->mlock.u.mtxa_owner
$34 = 0x601
(gdb) p (char)*(char*)(0xcfb01420+0)
$36 = 0x1
(gdb) p (char)*(char*)(0xcfb01420+1)
$37 = 0x6
(gdb) p (char)*(char*)(0xcfb01420+2)
$38 = 0x0
(gdb) p (char)*(char*)(0xcfb01420+3)
$39 = 0x0
相对于您实际检查的内容,您的初始十六进制值都缺少数字
00000001
是0x01
——它是8个二进制数字,因此是一个完整字节
因此0x601
=0x0601
=00000110 00000001
您可以在gdb中通过以下方式看到这一点:
(gdb) p &tx_q_sem->mlock.u.mtxa_owner
$41 = (volatile __uintptr_t *) 0xcfb01420
(gdb) p/x tx_q_sem->mlock.u.mtxa_owner
$34 = 0x601
(gdb) p (char)*(char*)(0xcfb01420+0)
$36 = 0x1
(gdb) p (char)*(char*)(0xcfb01420+1)
$37 = 0x6
(gdb) p (char)*(char*)(0xcfb01420+2)
$38 = 0x0
(gdb) p (char)*(char*)(0xcfb01420+3)
$39 = 0x0
使用
x/4xb 0xcfb01420
检查内存中的4个字节,分别显示每个字节。比打印它们容易得多。虽然你也可以做p/x(char[4])tx_q_sem->mlock.u.mtxa_owner
,但我想。谢谢你的评论,不过我想我并没有像我想的那样清楚地表达我的问题。即使使用您的方法,也不会发生任何变化。我的问题是GDB中没有正确显示little endian。对于x86小端字节格式,0x6应该位于第三个字节。(gdb)x/4xb0xcfb01420给我0xcfb01420:0x01 0x06 0x00 0x00。还是我的转换本身是错误的?记住一个字节是两个十六进制数字(半字节)宽。Tom的答案是正确的,当分别打印每个字节时,gdb忽略了前导零,这让您感到困惑。0x601
中6
的位置值为2^8:它是6*(1U这些都是错误的。谢谢,前提本身是错误的。你们两个都是对的,我弄糊涂了,并在不同的半字节中处理前导零。使用x/4xb 0xcfb01420
检查内存中的4个字节,分别显示每个字节。这比打印它们容易得多。尽管您也可以执行p/x(char[4])tx_q_sem->mlock.u.mtxa_owner
,我想。谢谢你的评论,但是我想我没有像我想的那样清楚地表达我的问题。即使你的方法也没有改变。我的问题是GDB中的小尾端没有正确显示。对于x86小尾端格式,0x6应该在第三个字节。(GDB)x/4xb 0xcfb01420给我0xcfb01420:0x01 0x06 0x00 0x00。或者是我的转换本身是错误的?记住一个字节是两个十六进制数字(半字节)宽。Tom的答案是正确的,您会被gdb在单独打印每个字节时忽略前导零弄糊涂。0x601
中6
的位置值是2^8:它是6*(1U这些都是错误的。谢谢,前提本身是错误的。你们都是对的,我弄糊涂了,把前导零放在另一个半字节中处理。