相关疑难解决方法(0)

在没有优化的程序上使用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)

我得到的只是 …

c++ debugging gcc gdb

32
推荐指数
2
解决办法
2万
查看次数

编译器的“-O0”选项和“-Og”选项有什么区别?

当我想要调试 C 或 C++ 程序时,我被教导如何使用-O0关闭优化,并将-ggdb符号插入到可执行文件中,这些符号针对使用gdb我使用的 GNU 调试器进行了优化(或者,您可以-glldb使用LLVM/clang 的lldb调试器,或者只是-g用于一般调试符号,但这不会像-ggdb表面上那么好......)。然而,我最近偶然发现有人说使用-Og(而不是-O0),这让我措手不及。果然,它在man gcc!:

-Og优化调试体验。 -Og启用不干扰调试的优化。它应该是标准编辑-编译-调试周期的优化级别选择,提供合理的优化级别,同时保持快速编译和良好的调试体验。

那么,有什么区别呢?这是-O0来自的描述man gcc

-O0减少编译时间并使调试产生预期结果。这是默认设置。

man gcc不过,明确表示-Og“应该是标准编辑-编译-调试周期选择的优化级别”。

这听起来像是-O0真正的“没有优化”,而-Og“进行了一些优化,但只是那些不干扰调试的优化”。它是否正确?那么,我应该使用哪个,为什么?

有关的:

  1. 相关,但不重复!(仔细阅读,它根本不重复):-O0 、-O1 和 -g 之间有什么区别
  2. 我对--copt=与 Bazel 一起使用的调试设置的回答:gdb:当前上下文中没有符号“i”

c c++ debugging gdb compiler-optimization

10
推荐指数
1
解决办法
5379
查看次数

标签 统计

c++ ×2

debugging ×2

gdb ×2

c ×1

compiler-optimization ×1

gcc ×1