在没有优化的程序上使用gdb进行调试,但当前上下文中仍然没有局部变量的符号

时间:2012-09-26 06:17:47

标签: c++ debugging gcc gdb

我现在一直有这个问题,但似乎总是推迟问这个问题因为看起来我做错了什么......但是现在我觉得不然......采取这个代码:

#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问题,谢谢大家......

2 个答案:

答案 0 :(得分:83)

release notes for 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

进行编译

答案 1 :(得分: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)