【问题标题】:How do I print the full value of a long string in gdb?如何在 gdb 中打印长字符串的完整值?
【发布时间】:2010-09-18 23:59:41
【问题描述】:

我想在 GDB 中打印 C 字符串的全长。默认情况下它是缩写的,我如何强制 GDB 打印整个字符串?

【问题讨论】:

    标签: c++ c string debugging gdb


    【解决方案1】:
    set print elements 0
    

    From the GDB manual

    set print elements number-of-elements
    设置一个数组 GDB 将打印多少元素的限制。如果 GDB 正在打印一个大数组,它会在打印完 set print elements 命令设置的元素数量后停止打印。此限制也适用于字符串的显示。当 GDB 启动时,此限制设置为 200。number-of-elements 设置为零意味着打印不受限制

    【讨论】:

    • 现在你可能还需要“设置打印重复 0”,否则 GDB 将省略字符串/数组的重复元素。
    • 这也适用于数组类型
    • 您可能还需要“设置 max-value-size 无限制”。
    【解决方案2】:

    只要您的程序处于正常状态,您也可以call (void)puts(your_string) 将其打印到标准输出。实际上,同样的原则适用于调试器可用的所有功能。

    【讨论】:

    • 这个答案甚至比“设置打印元素 0”(出于我的目的)更好,因为它尊重换行符/回车符而不是转义它们。
    • 很好的解决方案,但在尝试分析核心转储文件时不起作用
    • 注意:此选项仅在您正在调试实时程序时有效。调试核心文件时不能使用 GDB 的“调用”命令。
    • 还要求 gdb 保持理智,但似乎越来越不是这种情况(我在我的 Mac OS X 机器上得到“在当前上下文中没有符号“放置”。”)
    • 我只是在xcode的输出窗口中写了“puts(your_string)”
    【解决方案3】:

    printf 命令将打印完整的字符串:

    (gdb) printf "%s\n", string
    

    【讨论】:

    • 对不起,这不是真的
    • 这似乎尊重set print elements nnn 的限制,除非您执行set print elements 0,否则不会打印完整的字符串。
    • 当我尝试这个时,我只得到:“值不能转换为整数。”
    • 对于 std::string 你需要 string.c_str() 以避免“值不能转换为整数”错误
    【解决方案4】:

    还有第三个选项:x 命令,它允许您为特定命令设置不同的限制,而不是更改全局设置。要打印字符串的前 300 个字符,您可以使用 x/300s your_string。输出可能有点难以阅读。例如打印 SQL 查询结果:

    (gdb) x/300sb stmt.c_str() 0x9cd948:“选择文章.r”... 0x9cd958:“来自文章的 owid”... ..

    【讨论】:

    • 我想知道“x/300sb”是什么意思。在cheat sheet (pdf) 的帮助下,我将“x/300sb cstr”翻译为“在地址 cstr 处检查 300 个单位(字节)的内存,解释为以 NULL 结尾的字符串 (S)。”。如果您的字符串长度为 100,那么您将看到很多垃圾,因为所有 300 个字节都被打印出来,无论它们是否有意义。 +1 不过是为了把我介绍给x
    【解决方案5】:

    只是为了完成它:

    (gdb) p (char[10]) *($ebx)
    $87 =   "asdfasdfe\n"
    

    您必须给出一个长度,但可以更改该字符串的表示:

    (gdb) p/x (char[10]) *($ebx)
    $90 =   {0x61,
      0x73,
      0x64,
      0x66,
      0x61,
      0x73,
      0x64,
      0x66,
      0x65,
      0xa}
    

    如果您想通过它们的值进行调试,这可能很有用

    【讨论】:

      【解决方案6】:

      使用set elements ... 并不总是最好的方法。如果有一个独特的set string-elements ...,那将很有用。

      所以,我在我的 .gdbinit 中使用了这些函数:

      define pstr
        ptype $arg0._M_dataplus._M_p
        printf "[%d] = %s\n", $arg0._M_string_length, $arg0._M_dataplus._M_p
      end
      
      define pcstr
        ptype $arg0
        printf "[%d] = %s\n", strlen($arg0), $arg0
      end
      

      注意事项:

      • 第一个依赖于 c++ lib,因为它访问 std::string 的成员,但很容易调整。
      • 第二个只能用于正在运行的程序,因为它调用 strlen。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-24
        • 2021-10-12
        • 1970-01-01
        • 2018-06-13
        • 2011-02-18
        • 2012-11-28
        • 2017-01-01
        相关资源
        最近更新 更多