33

我一直有这个问题,但似乎总是推迟问这个问题,因为我好像做错了什么......但现在我觉得不是......拿了这个代码:

#include <string>
#include <iostream>
#include <algorithm>
int main(int argc, char** argv)
{
  if(argc < 2)
  {
    std::cout << "usage: " << argv[0] << " <string>" << std::endl;
    return 1;
  }
  std::string str = argv[1];
  std::reverse(str.begin(), str.end());
  std::cout << str << std::endl;
  return 0;
}

使用命令编译:

g++ -std=c++11 -Wall main.cpp -o main -O0 -ggdb3

我正在使用最新的主干版本的 gcc,我的主干是在 9 月 23 日左右拍摄的……另外请注意,我没有进行优化编译!

现在无论如何,我开始调试,如下所示:

gdb --quiet --args ./main string

我在第 12 行设置了一个断点(反向算法)

b 12

然后我运行程序

run

然后我尝试打印出字符串,看看它是什么

print str

我亲爱的朋友们,这对我来说似乎很奇怪:之前的命令的输出是:

No symbol "str" in current context.

快速检查局部变量也不显示字符串

info locals

我得到的只是

std::__ioinit = {static _S_refcount = 2, static _S_synced_with_stdio = true}

所以我想知道,是我有错,还是编译器或调试器有错……这对我来说很长一段时间以来一直是一个非常痛苦的问题……所以感谢您阅读这个问题.. . :)

编辑:现在很明显我的 gcc 构建有问题,我想知道是否有人遇到过错误报告或任何其他似乎存在类似问题的情况......我会还可以尝试检查最近构建的 gdb,以确保我当前的调试器(ubuntu 附带)绝对没有问题......这有意义吗?

EDIT2:所以在编译gdb v7.5之后,我得到了相对相同的结果,除了根本没有本地人......我想这意味着这是一个gcc问题,谢谢大家......

4

2 回答 2

87

GCC 4.8(即当前主干)的发行说明中所述:

DWARF4 现在是生成 DWARF 调试信息时的默认值。当在使用 DWARF 调试信息的平台上使用 -g 时,GCC 现在将默认为 -gdwarf-4 -fno-debug-types-section。GDB 7.5、Valgrind 3.8.0 和 elfutils 0.154 调试信息消费者默认支持 DWARF4。在 GCC 4.8 之前,使用的默认版本是 DWARF2。要使 GCC 4.8 生成较旧的 DWARF 版本,请使用 -g 和 -gdwarf-2 或 -gdwarf-3。Darwin 和 VxWorks 的默认值仍然是 -gdwarf-2 -gstrict-dwarf。

所以你需要使用 GDB 7.5 或编译-g -gdwarf-2

于 2013-02-24T11:02:49.660 回答
5

不,即使使用 --quiet 它也对我有用。可能你的设置有问题。

~/tmp $ g++ -Wall tmp.cpp -o tmp -O0 -ggdb3
~/tmp $ gdb --quiet --args ./tmp string
Reading symbols from /xxxxxxxx/tmp...done.
(gdb) b 12
Breakpoint 1 at 0x400c95: file tmp.cpp, line 12.
(gdb) run
Starting program: /xxxxxxxx/tmp string
Breakpoint 1, main (argc=2, argv=0x7fffffffdc58) at tmp.cpp:12
12        std::reverse(str.begin(), str.end());
(gdb) print str
$1 = "string"
(gdb) info locals
str = "string"
(gdb)
于 2012-09-26T06:29:53.637 回答