应用程序设置: 我的C ++ 11应用程序正在使用以下第三方库:
应用程序代码依赖于几个内部共享对象,所有这些对象都由我的团队开发(对这些共享对象执行经典链接时间,不使用dlopen
等。)
我正在使用GCC 4.6.2,使用GDB 7.4 和 7.6时出现问题。
操作系统 - Red Hat Linux 7.0版(Guinness)x86-64
问题
在共享对象代码中执行断点并发出gdb next
命令时,有时GDB会向后跳转到某些行,没有任何合理的原因(特别是在抛出异常之后,对于那些异常有合适的catch块)
网络上的类似问题可以通过“关闭任何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导致此问题的后续步骤应该是什么?
答案 0 :(得分:7)
这类问题通常是GIGO - gdb只是按照编译器指示它采取行动的方式行事。因此,它通常是编译器错误而不是gdb错误。我发现即使使用-O0编译也会发生这种情况。想到的例子是,某些版本的g ++在发出对变量析构函数的调用时会发出变量声明的位置。这会在其他直线代码中导致这种奇怪的跳跃行为。
答案 1 :(得分:0)
我有一个产生错误输出的代码,当我尝试用gdb调试它时,这些行是随意跳转的。最后我认为这不是gdb问题,而是g ++中的一个错误:当使用-O3时,构造函数的最后一行被跳过了。如果我在该行之后放置一个printf行,代码就可以了!将CFLAGS从-O3更改为-O0后,代码输出正确。我正在使用c ++ 11和gcc-5.4.0
答案 2 :(得分:0)
当我在STM32L4R9I评估板上遇到类似问题时,我从使用-Os
进行编译更改为-O0
,现在它像一种魅力一样工作。
请确保没有其他定义编译标志的文件。