GDB检查命令与地址的混淆
GDB examine command confusion with address
我知道这可能是一个显而易见的问题,但我决定学习一点低级编程。我从c和gdb开始。
第一个问题:
`(gdb) x/10xb $rip
0x4005a5 <main+4>: 0xb9 0x04 0x00 0x00 0x00 0xba 0x03 0x00
0x4005ad <main+12>: 0x00 0x00
(gdb) x/10xh $rip
0x4005a5 <main+4>: 0x04b9 0x0000 0xba00 0x0003 0x0000 0x02be 0x0000 0xbf00
0x4005b5 <main+20>: 0x0001 0x0000
(gdb) x/10xw $rip
0x4005a5 <main+4>: 0x000004b9 0x0003ba00 0x02be0000 0xbf000000
0x4005b5 <main+20>: 0x00000001 0xffff9fe8 0x0000b8ff 0xc35d0000
`
问题:为什么当我使用单位大小b时,下一个地址是0x4005ad,而当我使用h或w时,下个地址是0x4005b5?
第二个问题:
`(gdb) x/4xw $rip + 0
0x4005a5 <main+4>: 0x000004b9 0x0003ba00 0x02be0000 0xbf000000
(gdb) x/4xw $rip + 1
0x4005a6 <main+5>: 0x00000004 0x000003ba 0x0002be00 0x01bf0000
(gdb) x/4xw $rip + 2
0x4005a7 <main+6>: 0xBA000000 0x00000003 0x000002be 0x0001bf00
(gdb) x/4xw $rip + 3
0x4005a8 <main+7>: 0x03BA0000 0xbe000000 0x00000002 0x000001bf
(gdb) x/4xw $rip + 4
0x4005a9 <main+8>: 0x0003BA00 0x02be0000 0xbf000000 0x00000001
(gdb) x/4xw $rip + 5
0x4005aa <main+9>: 0x000003BA 0x0002be00 0x01bf0000 0xe8000000
(gdb) x/4xw $rip + 6
0x4005ab <main+10>: 0x00000003 0x000002be 0x0001bf00 0x9fe80000
(gdb) x/4xw $rip + 7
0x4005ac <main+11>: 0xBE000000 0x00000002 0x000001bf 0xff9fe800
(gdb) x/4xw $rip + 8
0x4005ad <main+12>: 0x02BE0000 0xbf000000 0x00000001 0xffff9fe8`
问题:为什么重复相同的值(大写字母)例如:在第一列中,但向右移动,比如从$rip+2到$rip+5,BA先在开始,然后在中间,最后在结尾?
当您要求任何低级调试器显示从给定地址启动的内存中的值时,它将从连续的位置获得一定数量的字节并显示它们。(每个地址指的是存储器中的一个特定字节)
在你的第一个问题中,你要求它显示十个字节,它将每个字节显示为两位数的十六进制值,每行八个字节,地址从0x4005a5到(0x4005a55+8)或0x4005ad
然后,您要求显示十个半字,每行八个半字。由于每个半字是两个字节,地址从0x4005a5变为(0x4005b5+16)或0x4005b5
你的第二个问题稍微复杂一点。请记住,当您要求它显示从某个位置开始的内存内容时,它只会获取从该位置开始的四个单词。当你选择一个更高的地址时,你得到的大多是相同的内存值,只是偏移了一个。
那么,为什么文字中的价值观似乎朝着错误的方向转变呢?这与这样一个事实有关,即您正在请求单词,而x86 CPU以某种非直观的顺序获取单词,从最低有效字节到最高有效字节。
这应该有助于:https://en.wikipedia.org/wiki/Endianness
相关文章:
- 如何检查是否可以在C 中使用某个内存地址
- 如何检查STD :: Next(x)指向C 中的有效地址
- 我可以检查共享内存中是否存在地址
- 检查子对象的地址是否在包含对象的边界内是否合法
- GDB检查命令与地址的混淆
- C++检查有效的 IP 地址或 IP
- 为什么使用 std::mutex 的函数会对 pthread_key_create 的地址进行空检查?
- 如何检查两个地址是否相同
- 如何检查指针指向的地址是否0x0?
- Boost检查是否通过UDP收到的IP地址是本地的
- x86-64上检查指针范围是否跨越N字节对齐地址的最快方法
- 如何在Qt中检查网络地址是否为本地地址
- 我们可以检查一个指针以确保它是一个有效的地址吗
- 在 Linux 环境程序中访问地址之前,如何检查地址的有效性?
- 将多个指针分配给同一对象并检查地址后,只有一个指针指向正确的指针
- C++REST SDK如何检查http地址是否无效
- C++:检查地址是否被引用
- 检查相等的字符串文字是否存储在同一地址
- 检查是否有“私网IP地址”被使用
- 删除指针和检查地址