【发布时间】:2010-09-18 23:59:41
【问题描述】:
我想在 GDB 中打印 C 字符串的全长。默认情况下它是缩写的,我如何强制 GDB 打印整个字符串?
【问题讨论】:
标签: c++ c string debugging gdb
我想在 GDB 中打印 C 字符串的全长。默认情况下它是缩写的,我如何强制 GDB 打印整个字符串?
【问题讨论】:
标签: c++ c string debugging gdb
set print elements 0
set print elementsnumber-of-elements
设置一个数组 GDB 将打印多少元素的限制。如果 GDB 正在打印一个大数组,它会在打印完 set print elements 命令设置的元素数量后停止打印。此限制也适用于字符串的显示。当 GDB 启动时,此限制设置为 200。将 number-of-elements 设置为零意味着打印不受限制。
【讨论】:
只要您的程序处于正常状态,您也可以call (void)puts(your_string) 将其打印到标准输出。实际上,同样的原则适用于调试器可用的所有功能。
【讨论】:
printf 命令将打印完整的字符串:
(gdb) printf "%s\n", string
【讨论】:
set print elements nnn 的限制,除非您执行set print elements 0,否则不会打印完整的字符串。
还有第三个选项:x 命令,它允许您为特定命令设置不同的限制,而不是更改全局设置。要打印字符串的前 300 个字符,您可以使用 x/300s your_string。输出可能有点难以阅读。例如打印 SQL 查询结果:
【讨论】:
x!
只是为了完成它:
(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}
如果您想通过它们的值进行调试,这可能很有用
【讨论】:
使用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
注意事项:
【讨论】: