为什么gdb中的print命令为C ++ std :: strings返回 035?

说我有代码:
std::string str = "random";

function(str);

void function (std::string str)
{
  std::cout << str << std::endl;
}
如果我在gdb中单步执行此代码,然后进入该函数并执行
p str
,它将打印出类似这样的内容
362241
但cout将在屏幕上打印正确的字符串
random
。有没有人见过这个,如果是这样我该怎么办?我在gdb中使用错误的print命令还是与编译器如何解释字符串有关?     
已邀请:
您有GCC或GDB的损坏版本,或者您尝试在错误的位置打印字符串。这是它应该是什么样子(使用
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
GNU 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
附:您应该将字符串作为const引用传递给函数。     
无论出于何种原因,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"
    
gdb可能只是向您展示字符串类'内部的字节串解释。试试这个以验证/解决:
$ print str.c_str()
    
你是否用调试信息编译了二进制文件?喜欢
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"}}
    
有同样的问题,解决了包括
iostream
库。     

要回复问题请先登录注册