c++ - GDB 以无序的方式跳到错误的行

标签 c++ c++11 gdb g++ redhat

应用设置: 我有使用以下第 3 方库的 C++11 应用程序:

  • 提升 1.51.0
  • cppnetlib 0.9.4
  • jsoncpp 0.5.0

应用程序代码依赖于几个内部共享对象,它们都是由我的团队开发的(针对这些共享对象执行经典的链接时间,没有使用dlopen等)

我使用的是 GCC 4.6.2,在使用 GDB 7.4 7.6 时出现问题。

操作系统 - Red Hat Linux 7.0 (Guinness) x86-64

问题 在共享对象代码中遇到断点并发出 gdb next 命令时,有时 GDB 会在没有任何合理原因的情况下向后跳转到某些行(特别是在抛出异常之后,对于那些异常有合适的 catch block )

网络上的类似问题在“关闭所有 GCC 优化”之类的内容中得到了回答,但我的 GCC CL 显然没有使用任何优化并要求提供调试信息,请注意 -O0 & -g 开关:

COLLECT_GCC_OPTIONS= '-D' '_DEBUG' '-O0' '-g' '-Wall' '-fmessage-length=0' '-v' '-fPIC' '-D' 'BOOST_ALL_DYN_LINK' '-D' 'BOOST_PARAMETER_MAX_ARITY=15' '-D' '_GLIBCXX_USE_NANOSLEEP' '-Wno-deprecated' '-std=c++0x' '-fvisibility=hidden' '-c' '-MMD' '-MP' '-MF' 'Debug_x64/AgentRegisterer.d' '-MT' 'Debug_x64/AgentRegisterer.d' '-MT' 'Debug_x64/AgentRegisterer.o' '-o' 'Debug_x64/AgentRegisterer.o' '-shared-libgcc' '-mtune=generic' '-march=x86-64'

另请注意,根据 Linux DSO best known methods ,我们隐藏了符号的可见性,只有我们想公开的类被公开(也许这是相关的???)

导致此问题的 root 后续步骤应该是什么?

最佳答案

这类问题通常是 GIGO —— gdb 只是按照编译器指示的方式运行。因此,它通常是编译器错误而不是 gdb 错误。即使使用 -O0 编译,我也看到过这种情况。我想到的例子是,某些版本的 g++ 在发出对变量的析构函数的调用时会发出变量声明的位置。这会导致直线代码出现这种奇怪的跳跃行为。

关于c++ - GDB 以无序的方式跳到错误的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52484102/

相关文章:

ruby - 如何在 gdb 中为乘客进程获取 rb_backtrace() 的输出

linux - 我如何自动继续 gdb 中的断点

c++ - 如何制作 Block builder\拖放布局程序?

c++ - 使用函数地址的模板类的唯一数字 ID

C++ 继承问题

c++ - 使用 std::mutex 释放和获取

c++ - Eigen c++ 将 double 转换为 long int?

c++ - C++ 中 std::resize(n) 和 std::shrink_to_fit 的区别?

c++ - 指针是指向单个项目还是指向数组?

c++ - GDB - 访问复数的实部和虚部