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


376

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

Answers:


504
set print elements 0

从GDB手册

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

4
如今,您可能还需要“设置打印重复次数为0”,否则GDB将省略字符串/数组的重复元素。
约翰·林德格伦

这也适用于数组类型
Trevor Boyd Smith,

1
您可能还需要“设置max-value-size无限”。
AMS

100

只要您的程序处于正常状态,您还可以call (void)puts(your_string)将其打印到stdout。实际上,相同的原理适用于调试器可用的所有功能。


2
这个答案甚至比“设置打印元素0”更好(就我的目的而言),因为它尊重换行符/回车符,而不是转义它们。
mhenry1384 2010年

6
好的解决方案,但是在尝试分析核心转储文件时
不起作用

辉煌的建议duskwuff,我希望我读了之前我复制和粘贴文本到一个printf调用来获取转义输出..:d
nevelis

4
注意:此选项仅在调试实时程序时有效。调试核心文件时,不能使用GDB的“调用”命令。
所罗门慢

1
还要求gdb保持理智,这似乎越来越不是这种情况了(我的Mac OS X机器上出现“在当前上下文中没有符号“ puts”。”)
Michael

39

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

(gdb)x / 300sb stmt.c_str()
0x9cd948:“选择article.r” ...
0x9cd958:“ owic FROM articl” ...
..

3
我想知道“ x / 300sb”是什么意思。借助该备忘单(pdf),我将“ x / 300sb cstr”翻译为“在地址cstr处扩展了300个字节的内存,解释为以NULL结尾的字符串(S)”。如果您的字符串长度为100,那么您将看到很多垃圾,因为无论是否有意义,所有300字节都会被打印出来。但是+1还是给我介绍了x
罗布W

39

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

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

2
抱歉,但事实并非如此
UmNyobe

11
这似乎符合set print elements nnn限制,除非您这样做,否则不会打印完整的字符串set print elements 0
马克·拉卡塔

3
当我尝试这样做时,我只会得到:“值不能转换为整数。”
菲利普·路德维希

2
对于std :: string,您需要使用string.c_str()以避免出现“无法将值转换为整数”错误
Paul Childs,

21

只是为了完成它:

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

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


1

使用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。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.