【问题标题】:Why is this address changing in gdb?为什么这个地址在 gdb 中会发生变化?
【发布时间】:2014-05-20 01:47:27
【问题描述】:

我正在使用 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 打印地址处的内容之后。

【问题讨论】:

    标签: c++ unix gdb


    【解决方案1】:

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

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

    它还说:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2021-09-06
      • 2016-01-06
      相关资源
      最近更新 更多