当前位置:  开发笔记 > 编程语言 > 正文

如何在gdb中打印长字符串的完整值?

如何解决《如何在gdb中打印长字符串的完整值?》经验,为你挑选了5个好方法。

我想在GDB中打印C字符串的全长.默认情况下它是缩写,如何强制GDB打印整个字符串?



1> John Carter..:
set print elements 0

从GDB手册:

set print elements number-of-elements
设置GDB数组元素的打印限制.如果GDB正在打印一个大型数组,它会在打印出该set print elements命令设置的元素数后停止打印.此限制也适用于字符串的显示.当GDB启动时,此限制设置为200. 元素数设置为零意味着打印无限制.



设置为零意味着打印无限制
现在您可能还需要"设置打印重复0",否则GDB将省略字符串/数组的重复元素.

2> duskwuff..:

只要您的程序处于理智状态,您也可以call (void)puts(your_string)将其打印到stdout.实际上,同样的原则适用于调试器可用的所有函数.


很好的解决方案,但在尝试分析核心转储文件时不起作用
注意:此选项仅在您调试实时程序时有效.在调试核心文件时,不能使用GDB的"call"命令.
这个答案甚至比“设置打印元素0”更好(就我的目的而言),因为它尊重换行符/回车符,而不是转义它们。

3> Wichert Akke..:

还有第三个选项:x命令,它允许您为特定命令设置不同的限制,而不是更改全局设置.要打印您可以使用的字符串的前300个字符x/300s your_string.输出可能有点难以阅读.例如,打印SQL查询会导致:

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..


我想知道"x/300sb"是什么意思.在[备忘单(pdf)](http://refcards.com/docs/peschr/gdb/gdb-refcard-a4.pdf)的帮助下,我将"x/300sb cstr"翻译为"eXamine 300"地址cstr处的内存单位(字节),解释为以NULL结尾的字符串(S)." 如果你的字符串长度为100,那么你会看到很多垃圾,因为所有300个字节都被打印出来,无论它们是否有意义.不过为了把我介绍给`x`而+1!

4> 小智..:

printf命令将打印完整的字符串:

(gdb) printf "%s\n", string


这似乎尊重`set print elements nnn`限制,除非你设置'print elements 0`,否则不会打印完整的字符串.
当我尝试这样做时,我只会得到:“值不能转换为整数。”

5> abstraktor..:

只是为了完成它:

(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}

如果要按值调试,这可能很有用

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有