我想在GDB中打印C字符串的全长 . 默认情况下,它是缩写,如何强制GDB打印整个字符串?
set print elements 0
From the GDB manual:
设置打印元素的元素数
设置GDB阵列打印元素数量的限制 . 如果GDB正在打印一个大型数组,它会在打印set print elements命令设置的元素数后停止打印 . 此限制也适用于字符串的显示 . 当GDB启动时,此限制设置为200.将元素数设置为零意味着打印无限制 .
只要你的程序处于一个理智的状态,你也可以 call (void)puts(your_string) 将它打印到stdout . 实际上,同样的原则适用于调试器可用的所有函数 .
call (void)puts(your_string)
还有第三个选项:x命令,它允许您为特定命令设置不同的限制,而不是更改全局设置 . 要打印字符串的前300个字符,您可以使用 x/300s your_string . 输出可能有点难以阅读 . 例如,打印SQL查询会导致:
x/300s your_string
(gdb) x/300sb stmt.c_str() 0x9cd948: "SELECT article.r"... 0x9cd958: "owid FROM articl"... ..
printf 命令将打印完整的字符串:
printf
(gdb) printf "%s\n", string
只是为了完成它:
(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 ... 会很有用 .
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 .
6 回答
From the GDB manual:
只要你的程序处于一个理智的状态,你也可以
call (void)puts(your_string)
将它打印到stdout . 实际上,同样的原则适用于调试器可用的所有函数 .还有第三个选项:x命令,它允许您为特定命令设置不同的限制,而不是更改全局设置 . 要打印字符串的前300个字符,您可以使用
x/300s your_string
. 输出可能有点难以阅读 . 例如,打印SQL查询会导致:printf
命令将打印完整的字符串:只是为了完成它:
您必须提供长度,但可能会更改该字符串的表示形式:
如果要按值调试,这可能很有用
使用
set elements ...
并不总是最好的方法 . 如果有一个独特的set string-elements ...
会很有用 .所以,我在.gdbinit中使用这些函数:
注意事项:
第一个是c lib依赖,因为它访问std :: string的成员,但很容易调整 .
第二个只能用于正在运行的程序,因为它调用strlen .