代码之家  ›  专栏  ›  技术社区  ›  John Carter

如何在gdb中打印长字符串的完整值?

  •  338
  • John Carter  · 技术社区  · 16 年前

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

    6 回复  |  直到 6 年前
        1
  •  457
  •   John Carter    13 年前
    set print elements 0
    

    From the GDB manual :

    set print elements number-of-elements
    设置一个数组gdb将打印多少元素的限制。如果gdb正在打印一个大数组,它将在打印由 set print elements 命令。此限制也适用于字符串的显示。当gdb启动时,此限制设置为200。 设置 元素数量 归零意味着打印不受限制 .
        2
  •  94
  •   gone    16 年前

    只要你的程序处于正常状态,你也可以 call (void)puts(your_string) 打印到stdout。实际上,同样的原理也适用于调试器可用的所有函数。

        3
  •  33
  •   Wichert Akkerman    13 年前

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

    (gdb) x/300sb stmt.c_str()
    0x9cd948:    "SELECT article.r"...
    0x9cd958:    "owid FROM articl"...
    ..
    
        4
  •  29
  •   Azeem Rob Hyndman    6 年前

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

    (gdb) printf "%s\n", string
    
        5
  •  16
  •   abstraktor    13 年前

    只是为了完成它:

    (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
  •  1
  •   mrtimdog    8 年前

    使用 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
    

    Caveats:

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