应用程序设置:我的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块)
网上的类似问题在"关闭任何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 最知名的方法,我们隐藏了符号的可见性,只有我们想要公开的类才被暴露(也许这是相关的???)
root导致此问题的后续步骤应该是什么?
这类问题通常是GIGO - gdb只是按照编译器指示它采取行动的方式行事.因此,它通常是编译器错误而不是gdb错误.我已经看到即使使用-O0编译也会发生这种情况.想到的例子是,当发出对变量析构函数的调用时,某些版本的g ++会发出变量声明的位置.这导致在其他直线代码中的这种奇怪的跳跃行为.