【问题标题】:gdb print won't print out something readable from my char arraygdb print 不会打印出我的 char 数组中可读的内容
【发布时间】:2011-02-06 14:53:13
【问题描述】:

我有一个char buffer[100],我正在尝试使用 gdb 在运行时的各个阶段从中读取内容。

我使用p buffer 我得到了

"/*\000\000\000\000\000\000????X?o\000\025\202\004\b", '\0' <repeats 12 times>, ".N=?", '\0' <repeats 24 times>, "`\203\004\b\000\000\000\000L\227\004\bX????\202\004\b?\017\204\000\f?\203\000\210???i\205\004\b??r"

如何让p 将其转换为可读格式???

【问题讨论】:

  • 确保缓冲区中有可打印(可读)的数据? GDB 打印当前存在的内容 - 而不是您希望出现的内容。目前,strcmp(buffer, "/*") == 0.
  • 嗯,所以我在这方面绝对是新手,作为旁注,为什么 strcmp(buffer, "/*") == 0 很重要?显然,这个缓冲区中的内容不仅仅是“/*”,所以对我来说 strcmp 将返回 0 似乎很明显......
  • 它是“\000”,它代表“null”,它标志着 C 字符串的结尾。因此,您的缓冲区(被视为保存 C 字符串)实际上包含字符串“/*”(这就是 Jonathan Leffler 用他的strcmp 等式得到的 - 请注意,当字符串相同时,strcmp 返回 0)。
  • 哦,对了。出于某种原因,我认为它会返回 1。没关系....谢谢你们!

标签: c gdb printing


【解决方案1】:

x/s buffer 应该将数组的内容显示为以空字符结尾的字符串(这是我假设您想要的)。

【讨论】:

  • 是的,这比我的方式好 - 少打字:)
【解决方案2】:

如果您想在终止 null 之后摆脱垃圾(因此您只会看到此字符串的 "/*"),您可以使用:

p (char*)buffer

目前gdb 正在将您的变量打印为数组,因此它显示了所有 100 个字符;将其转换为 char* 使其打印为 C 字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多