424

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

4

6 回答 6

565
set print elements 0

从 GDB 手册

set print elements number-of-elements
设置一个数组 GDB 将打印多少元素的限制。如果 GDB 正在打印一个大数组,它会在打印完set print elements命令设置的元素数量后停止打印。此限制也适用于字符串的显示。当 GDB 启动时,此限制设置为 200。元素数量设置为零意味着打印是无限的
于 2008-10-24T12:37:42.037 回答
112

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

于 2008-10-31T10:42:56.483 回答
50

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

(gdb) printf "%s\n", string
于 2015-12-03T20:47:14.080 回答
42

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

(gdb) x/300sb stmt.c_str()
0x9cd948:“选择文章.r”...
0x9cd958:“来自文章的 owid”...
..
于 2011-10-06T16:15:39.330 回答
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}

如果您想通过它们的值进行调试,这可能很有用

于 2012-01-18T11:05:52.507 回答
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++ lib,因为它访问 std::string 的成员,但很容易调整。
  • 第二个只能用于正在运行的程序,因为它调用 strlen。
于 2016-06-23T07:08:33.443 回答