我想在GDB中打印c -字符串的完整长度。默认情况下是缩写,如何强制GDB打印整个字符串?
当前回答
printf命令将打印完整的字符串:
(gdb) printf "%s\n", string
其他回答
使用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时用于正在运行的程序。
set print elements 0
摘自GDB手册:
设置打印元素数量
对GDB将打印的数组元素数量设置限制。如果GDB正在打印一个大数组,它将在打印完set print elements命令设置的元素数量后停止打印。这个限制也适用于字符串的显示。当GDB启动时,这个限制被设置为200。将number-of-elements设置为0意味着打印是无限的。
只要你的程序处于正常状态,你也可以调用(void)puts(your_string)将它打印到stdout。实际上,同样的原则适用于调试器可用的所有函数。
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}
如果您想通过它们的值进行调试,这可能很有用
推荐文章
- 什么是“参数依赖查找”(又名ADL,或“Koenig查找”)?
- 公共朋友交换成员函数
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- 如何在Go中使用c++
- 如何删除表中特定列的第一个字符?
- 自定义c++分配器的引人注目的例子?
- RAII和c++中的智能指针
- 如何构建和使用谷歌TensorFlow c++ api
- 我应该如何从字符串中删除所有的前导空格?- - - - - -斯威夫特
- C“int”的大小是2字节还是4字节?
- 将整数转换为字符串,以逗号表示千
- 将JavaScript字符串中的多个空格替换为单个空格
- 多维数组如何在内存中格式化?
- printf()和puts()在C语言中的区别是什么?
- 断言是邪恶的吗?