GDB为什么更改给定地址中的内容?

时间:2019-08-14 14:53:00

标签: gdb

我正在运行一个非常简单的程序,其变量名为vars,它是一个整数数组,该数组的基数为0x555555558080

我有

vars[0] = 0x00004444;
vars[1] = 0x12345678;

然后运行gdb,我得到了:

(gdb) x/2xw 0x555555558080
0x555555558080 <vars>:  0x00004444      0x12345678

(gdb) x/4xh 0x555555558080
0x555555558080 <vars>:  0x4444  0x0000  0x5678  0x1234

(gdb) x/8xb 0x555555558080
0x555555558080 <vars>:  0x44    0x44    0x00    0x00    0x78    0x56    0x34    0x12

实际上对我来说没有意义。第一个输出告诉我,在地址0x555555558080处,我拥有的第一个字节是0x00,其他两个输出给我0x44作为第一个字节。如果我真的读了给定地址上的值,那真的会有什么? 0x44还是0x00

我首先想到的是小端的东西,所以在地址0x555555558084 (vars + 4)转换之前我会得到0x78563412,但是输出与此不一致,第一个给了我实际值0x12345678,第二个0x5678 0x1234,我希望是0x1234 0x5678,第三个输出是little-endian版本。

我希望它是:

(gdb) x/2xw 0x555555558080
0x555555558080 <vars>:  0x00004444      0x12345678

(gdb) x/4xh 0x555555558080
0x555555558080 <vars>:  0x0000  0x4444  0x1234  0x5678

(gdb) x/8xb 0x555555558080
0x555555558080 <vars>:  0x00    0x00    0x44    0x44    0x12    0x34    0x56    0x78

1 个答案:

答案 0 :(得分:1)

  

我首先想到的是小端的东西

一点点东西。

实际存储的字节为:0x44 0x44 0x00 0x00 0x78 0x56 0x34 0x12。剩下的就是你解释它们的方式。

如果将它们解释为两个32位int,则会得到0x00004444 0x12345678。 如果将它们解释为四个16位整数,则会得到0x4444 0x0000 0x5678 0x1234

这里的所有内容都与低端计算机匹配。

  

我希望它是:
  (gdb) x/4xh 0x555555558080 0x555555558080 <vars>: 0x0000 0x4444 0x1234 0x5678

好吧,您的期望是错误的。当您查看前两个字节时,它们是0x44 0x44,因此您不能指望从中得到0x0000