【问题标题】:gdb printing array/strings with a certain offsetgdb 打印具有一定偏移量的数组/字符串
【发布时间】:2020-09-18 05:25:39
【问题描述】:

我定义了以下内容:

strings:    .asciz  "Once\n", "upon\n", "a\n", "time\n", "...\n", ""

我可以看到标签存储在以下内存地址600109

>>> info va strings
Non-debugging symbols:
0x0000000000600109  strings

我可以这样打印:

>>> x/s 0x0000000000600109
0x600109:   "Once\n"
>>> x/s 0x0000000000600109+6
0x60010f:   "upon\n"
# etc...

或者引用变量获取第一个字符串:

>>> x/s &strings
0x600109:   "Once\n"

如何在gdb 中进行适当的偏移以对内存地址进行加法——例如,能够通过x/s &strings+6 获得"upon\n" 的值?

执行以下操作的正确方法是什么?

>>> x/s &strings+6
# Cannot perform pointer math on incomplete type "<data variable, no debug info>", try casting to a known type, or void *.

【问题讨论】:

    标签: c assembly gdb


    【解决方案1】:

    您需要将其转换为 (void *) 才能对内存地址进行加法/减法:

    >>> x/s     6 + (void *) &strings
    0x60010f:   "upon\n"
    

    【讨论】:

    • void* 上的算术未定义。虽然它恰好在这里工作,但在这里没有理由这样做:只需使用 char* 代替。
    • @EmployedRussian 我明白了。想发布答案,然后我会接受。此外,就类型而言,gdb 或多或少是c?或者有什么不同吗?我通常只对与打印相关的所有内容执行 (void *),但从您上面显示的内容来看,这似乎不正确
    • 不需要单独回答:你可以编辑这个。 GDB 尝试使用当前文件的语言来评估表达式。 void* 上的算术是 GCC 扩展。我只是说这里不需要非标准的操作。
    猜你喜欢
    • 2017-11-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多