c++ - GDB 检查命令与地址的混淆

标签 c++ c debugging gdb

我知道这可能是一个显而易见的问题,但我决定学习一些低级编程。我从 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

你的第二个问题有点复杂。请记住,当您要求它显示从某个位置开始的内存内容时,它只会获取从该位置开始的四个单词。当您选择一个更高的地址时,您基本上会获得相同的内存值,只是移动了一位。

那么为什么文字中的值(value)观似乎朝着错误的方向转变呢?这与您请求单词而 x86 CPU 以某种不直观的顺序(从最低有效字节到最高有效字节)获取单词这一事实有关。

这应该有帮助: https://en.wikipedia.org/wiki/Endianness

关于c++ - GDB 检查命令与地址的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42239411/

相关文章:

c - C 中的数学函数

javascript - Node.js 行被跳过然后被处理

c - 在 C 语言中使用 Hangman 游戏函数时出现问题

c - WriteFile 到标准输出失败

java - 使用 IntelliJ 调试 GIT

node.js - 调试永远无法解决 promise /异步等待

c++ - 将 Array 类转换为模板

c++ - 如何在 C/C++ 中生成表的所有组合的数组列表

c++ - 如何在 QString/QDebug 中使用 Unicode 字符?

c++ - Tensorflow load graph c++ 示例中包含哪些 header ?