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

455
我想在GDB中打印C字符串的完整长度。默认情况下,它会被缩写,如何强制GDB打印整个字符串?
6个回答

609
set print elements 0

来自GDB手册

set print elements number-of-elements
设置GDB打印数组元素的数量限制。如果GDB正在打印一个大数组,在执行set print elements命令设置的元素数量之后,它将停止打印。这个限制也适用于字符串的显示。当GDB启动时,这个限制被设置为200。将number-of-elements设置为零意味着打印没有限制。

9
现在你可能需要使用"set print repeats 0"命令,否则GDB会省略重复的字符串/数组元素。 - John Lindgren
这同样适用于数组类型。 - Trevor Boyd Smith
1
您可能还需要执行“设置最大值大小为无限制”。 - Aaron Swan

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

3
这个答案比“set print elements 0”更好(对于我的需要),因为它尊重换行符和回车符,而不是转义它们。 - mhenry1384
8
好的解决方案,但在尝试分析核心转储文件时无法工作。 - Elalfer
4
注意:此选项仅在您调试实时程序时有效。如果您正在调试核心文件,不能使用GDB的“call”命令。 - Solomon Slow
1
还需要gdb变得正常,但这似乎越来越不可能(在我的Mac OS X机器上出现"No symbol "puts" in current context.")。 - Michael
我只需在Xcode的输出窗口中编写"puts(your_string)"即可。 - Regis St-Gelais
当你调试一个没有 puts() 的程序时,也无法工作;当 puts() 使用 UART 且目标的 UART 需要运行 CPU 时,也会出现问题。 - 12431234123412341234123

58

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

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

2
抱歉,但这不是真的。 - UmNyobe
13
这似乎遵守了“set print elements nnn”的限制,除非你使用“set print elements 0”,否则不会打印完整的字符串。 - Mark Lakata
3
我尝试时只得到了这个错误信息:"值无法转换为整数。" - Philipp Ludwig
9
为了避免“值无法转换为整数”错误,对于std::string,您需要使用string.c_str()。 - Paul Childs
如果您正在调试核心转储,则无法正常工作。 - Owl

43

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

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..

4
我在想" x/300sb "是什么意思。通过这个cheat sheet (pdf)的帮助,我将“x/300sb cstr”翻译为“检查地址cstr处300个字节的内存,被解释为一个以NULL结尾的字符串(S)。” 如果你的字符串长度是100,那么你会看到很多垃圾信息,因为所有300个字节都会被打印出来,无论它们是否有意义。但还是要为介绍'x'给我加1分! - Rob W

22

只是为了完整性:

(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}

如果您希望通过变量的值进行调试,这可能会很有用


2

使用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++库,因为它访问std::string的成员,但很容易进行调整。
  • 第二个只能在运行中的程序上使用,因为它调用strlen。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接