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

How do I print the full value of a long string in gdb?

本文关键字:字符串 打印 gdb      更新时间:2023-10-16

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

set print elements 0

从GDB手册:

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

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

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

(gdb) printf "%sn", string

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

(gdb) x/300sb stmt.c_str()0x9cd948:"选择文章.r"...0x9cd958:"来自艺术的奥维德".....

只是为了完成它:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfen"

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

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

如果要按其值进行调试,这可能很有用

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

因此,我在我的.gdbinit中使用这些函数:

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

警告:

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