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

32 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;
}
Run Code Online (Sandbox Code Playgroud)

用命令编译:

g++ -std=c++11 -Wall main.cpp -o main -O0 -ggdb3
Run Code Online (Sandbox Code Playgroud)

我正在使用最新的gcc主干版本,我的主干是在9月23日左右拍摄的...还要注意我没有编译优化!

无论如何,我开始调试,像这样:

gdb --quiet --args ./main string
Run Code Online (Sandbox Code Playgroud)

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

b 12
Run Code Online (Sandbox Code Playgroud)

然后我运行程序

run
Run Code Online (Sandbox Code Playgroud)

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

print str
Run Code Online (Sandbox Code Playgroud)

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

No symbol "str" in current context.
Run Code Online (Sandbox Code Playgroud)

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

info locals
Run Code Online (Sandbox Code Playgroud)

我得到的只是

std::__ioinit = {static _S_refcount = 2, static _S_synced_with_stdio = true}
Run Code Online (Sandbox Code Playgroud)

所以我很想知道,我是有错,还是编译器或调试器有问题......这对我来说很长时间以来一直很麻烦...所以感谢你甚至读这个问题.. .:)

编辑:现在已经很清楚我的gcc构建有问题,我想知道是否有人遇到过错误报告或任何其他似乎有类似问题的案例......我会还尝试检查最近的gdb版本,以确保我当前的调试器(ubuntu附带)确实没有问题...这有意义吗?

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

Jon*_*ely 85

正如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


Cra*_*sta 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)
Run Code Online (Sandbox Code Playgroud)

  • @Jonathan Wakely为这个问题提供了正确的答案(使用gcc> = 4.8,您需要使用GDB> = 7.5或使用'-g -gdwarf-2'进行编译). (2认同)