我想在GDB中打印C字符串的完整长度。默认情况下,它会被缩写,如何强制GDB打印整个字符串?
set print elements 0
set print elements
number-of-elements
设置GDB打印数组元素的数量限制。如果GDB正在打印一个大数组,在执行set print elements
命令设置的元素数量之后,它将停止打印。这个限制也适用于字符串的显示。当GDB启动时,这个限制被设置为200。将number-of-elements设置为零意味着打印没有限制。
call (void)puts(your_string)
将其打印到stdout。实际上,所有可用于调试器的函数都适用于同样的原则。puts()
的程序时,也无法工作;当 puts()
使用 UART 且目标的 UART 需要运行 CPU 时,也会出现问题。 - 12431234123412341234123printf
命令会打印完整的字符串:
(gdb) printf "%s\n", string
还有第三种选项:x 命令,它允许你为特定的命令设置不同的限制,而不是更改全局设置。要打印字符串的前300个字符,可以使用 x/300s your_string
命令。输出可能会有点难以阅读。例如,打印 SQL 查询结果如下:
(gdb) x/300sb stmt.c_str() 0x9cd948: "SELECT article.r"... 0x9cd958: "owid FROM articl"... ..
只是为了完整性:
(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
注意事项: