为什么这个地址在gdb中发生了变化?

时间:2014-05-20 01:47:27

标签: c++ unix gdb

我正在使用gdb调试一个非常简单的汇编程序(SPARC),并且遇到了一个奇怪的问题。我试图使用gdb将argv中的参数打印到我程序的主函数中。出于某种原因,$ i1中的地址(main的第二个参数)有时会更改为指向-1。这是我的gdb会话的复制粘贴:

(gdb) p/x $i1
$1 = 0xffbff084
(gdb) x/x 0xffbff084
0xffbff084:     0xffbff1e4
(gdb) x/s 0xffbff1e4
0xffbff1e4:     "..."
(gdb) x/x 0xffbff088
0xffbff088:     0xff
(gdb) x/x 0xffbff084
0xffbff084:     0xff

我用过" ..."而不是打印的实际路径。

我正确打印了第一个参数,但是gdb没有获取第二个参数的地址,而是说下一个值是-1。我回去再次检查第一个字符串的地址,gdb说它也是-1,即使我刚刚发现它是别的东西!

这不是一个多线程程序,因此我不知道可能会更改地址的内容:/

编辑:仅在使用x / s打印地址内容后才会出现。

1 个答案:

答案 0 :(得分:5)

gdb' x'命令接受斜杠后的打印格式和大小作为选项。在manual中它说:

  

每次使用x指定单位大小时,下次使用x时该大小将成为默认单位。

它还说:

  

对于's'格式,单位大小默认为'b',除非明确给出。

所以发生的事情是,在给出命令x/s之后,后续的x命令被解释为字节长度。因此,它只打印您要检查的内存的第一个字节,恰好是0xff。

尝试使用x/xw而不是x/x打印地址。