C语言 如何在gdb中打印一个长字符串的完整值?

ua4mk5z4  于 9个月前  发布在  其他
关注(0)|答案(6)|浏览(218)

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

tzdcorbm

tzdcorbm1#

set print elements 0

GDB手册:
set print elementsnumber-of-elements设置GDB打印数组元素的数量限制。如果GDB正在打印一个大数组,它会在打印完set print elements命令设置的元素数后停止打印。此限制也适用于字符串的显示。当GDB启动时,这个限制被设置为200。number-of-elements设置为零表示打印不受限制

wmvff8tz

wmvff8tz2#

只要你的程序处于正常状态,你也可以使用call (void)puts(your_string)将它打印到标准输出。实际上,相同的原则适用于调试器可用的所有函数。

nxowjjhe

nxowjjhe3#

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

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

tkclm6bt4#

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

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

mfuanj7w5#

只是为了完成它:

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

如果您想通过它们的值进行调试,

ax6ht2ek

ax6ht2ek6#

使用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。

相关问题