如何在gdb中打印长string的完整值?

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

set print elements 0 

从GDB手册 :

set print elements number-of-elements

设置GDB数组元素的打印限制。 如果GDB正在打印一个大的数组,它会在已经打印了由set print elements命令set print elements的元素数量之后停止打印。 这个限制也适用于string的显示。 当GDB启动时,此限制设置为200. 元素数设置为零意味着打印是无限的

只要你的程序处于健全的状态,你也可以call (void)puts(your_string)把它打印到标准输出。 实际上,同样的原则适用于debugging器可用的所有function。

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

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

printf命令将打印完整的string:

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

只是为了完成它:

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

您必须给出一个长度,但可能会更改该string的表示forms:

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

如果你想debugging它们的值,这可能是有用的

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