为什么在gdb中使用print命令打印C++ std::strings时会返回\035?

7

假设我有以下代码:

std::string str = "random";

function(str);

void function (std::string str)
{
  std::cout << str << std::endl;
}

如果我在gdb中逐步执行此代码,然后进入函数并执行“ p str ”,它会打印出类似于这样的东西“\ 362 \ 241”,但cout将正确的字符串“random”打印到屏幕上。 是否有人见过这种情况?如果有,我该怎么办?我是否在使用gdb中的打印命令时犯了错误,还是编译器对字符串的解释方式有问题?

“\035” 不是被解释为索引到 ASCII 表中的八进制三元组吗? - evandrix
我也沿这个思路考虑过,但我不太清楚为什么,如何以及这是否与问题有关。 - Grammin
如何使用superset:https://dev59.com/questions/5Wgu5IYBdhLWcg3wEzDP - Ciro Santilli OurBigBook.com
5个回答

10

很可能由于某种原因,GDB缺少STL的调试信息。使用Employed Russian的示例和g++(GCC)4.3.4 20090804(发布1版)和GNU gdb 6.8.0.20080328-cvs(cygwin-special),我得到以下输出:

(gdb) p str
$1 = {static npos = <optimized out>,
  _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<
No data fields>}, <No data fields>}, _M_p = 0x28cce8 "$▒▒"}}

这是std::string中原始数据字段的一个解释。要获取实际的字符串数据,我必须重新解释_M_p字段作为一个指针:

(gdb) p *(char**)str._M_dataplus._M_p
$2 = 0xd4a224 "random"

6

gdb可能只是显示了字符串类内部的字节串解释。尝试使用以下方法进行验证/解决:

$ print str.c_str()

您能提供一个gdb命令,让我可以查看这个字符串吗?哪种方式是最好的呢? - Grammin

2
您的GCC或GDB版本有问题,或者您试图在错误的位置打印字符串。以下是正确的输出结果(使用g++(Ubuntu 4.4.3-4ubuntu5)4.4.3GNU gdb(GDB)7.2.50.20110127-cvs并启用STL漂亮的打印机):
#include <string>
#include <iostream>

void function (std::string str)
{
  std::cout << str << std::endl;
}

int main()
{
  std::string str = "random";
  function(str);
}

$ g++ -g t.cc && gdb -q ./a.out
Reading symbols from /usr/local/tmp/a.out...done.
(gdb) b function
Breakpoint 1 at 0x400b30: file t.cc, line 6.
(gdb) run

Breakpoint 1, function (str="random") at t.cc:6
6     std::cout << str << std::endl;
(gdb) p str
$1 = "random"
(gdb) q

附注:您可能应该将字符串作为常量引用传递给函数。


你的GCC或GDB版本有问题。哈哈,苹果最新的Xcode(2012年的4.5.2版)。 - jww

0

你编译二进制文件时加入了调试信息吗?例如:g++ -g test.cpp

我的显示的信息是正确的:

(gdb) p s
$2 = {static npos = <optimized out>, 
  _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x804b014 "Hello world"}}

0

遇到了同样的问题,解决方法是包含 iostream 库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接