我想在GDB中打印C字符串的全长。默认情况下它是缩写的,我如何强制GDB打印整个字符串?
答案 0 :(得分:469)
set print elements 0
set print elements
的number-of-elements
的
设置GDB数组元素的打印限制。如果GDB正在打印一个大型数组,它会在打印出set print elements
命令设置的元素数后停止打印。此限制也适用于字符串的显示。当GDB启动时,此限制设置为200. 将 number-of-elements 设置为零意味着打印无限制。
答案 1 :(得分:95)
只要您的程序处于理智状态,您也可以call (void)puts(your_string)
将其打印到stdout。实际上,同样的原则适用于调试器可用的所有函数。
答案 2 :(得分:33)
还有第三个选项:x命令,它允许您为特定命令设置不同的限制,而不是更改全局设置。要打印字符串的前300个字符,您可以使用x/300s your_string
。输出可能有点难以阅读。例如,打印SQL查询会导致:
(gdb) x/300sb stmt.c_str() 0x9cd948: "SELECT article.r"... 0x9cd958: "owid FROM articl"... ..
答案 3 :(得分:30)
printf
命令将打印完整的字符串:
(gdb) printf "%s\n", string
答案 4 :(得分:17)
完成它:
(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}
如果您想按值调试
,这可能很有用答案 5 :(得分: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
注意事项: