我想在GDB中打印c -字符串的完整长度。默认情况下是缩写,如何强制GDB打印整个字符串?
set print elements 0
摘自GDB手册:
设置打印元素数量
对GDB将打印的数组元素数量设置限制。如果GDB正在打印一个大数组,它将在打印完set print elements命令设置的元素数量后停止打印。这个限制也适用于字符串的显示。当GDB启动时,这个限制被设置为200。将number-of-elements设置为0意味着打印是无限的。
还有第三个选项: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元素…并不总是最好的方法。如果有一个不同的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时用于正在运行的程序。
推荐文章
- 确保您的项目构建设置正在生成一个dSYM文件。对于所有配置,DEBUG_INFORMATION_FORMAT都应该设置为dwarf-with-dsym
- 如何获得GDB中所有线程的回溯?
- 如何在Python中按字母顺序排序字符串中的字母
- 为什么标准迭代器范围是[begin, end]而不是[begin, end]?
- c++双地址操作符?(& &)
- python: SyntaxError: EOL扫描字符串文字
- PHP子字符串提取。获取第一个'/'之前的字符串或整个字符串
- errno线程安全吗?
- 如何在C程序中获取当前目录?
- 函数标题中的箭头操作符(->)
- 如何在c++中初始化一个向量
- 返回类型为'?:'(三元条件运算符)
- 当分配vector时,它们使用的是堆上的内存还是堆栈上的内存?
- 双引号vs单引号
- 互斥实例/教程?