GDB以无序的方式跳转到错误的行

GDB jumps to wrong lines in out of order fashion

本文关键字:错误 方式跳 无序 GDB      更新时间:2023-10-16

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

  • 提升1.51.0
  • cppnetlib 0.9.4
  • jsoncpp 0.5.0

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

我使用的是GCC 4.6.2,使用GDB 7.47.6时会出现此问题。

操作系统-Red Hat Linux 7.0版(吉尼斯)x86-64

问题当在共享对象代码中点击断点并发出gdbnext命令时,有时gdb会向后跳到某些行,而没有任何合理的原因(尤其是在抛出异常之后,对于这些异常,会有合适的捕获块)

类似的问题在网络上得到了类似的回答(关闭任何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最著名的方法,我们有隐藏的符号可见性,只有我们想公开的类才被公开(也许这与有关??)

从根本上解决这个问题的下一步应该是什么?

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

我有一个代码产生了错误的输出,当我试图用gdb调试它时,行任意跳跃。最后,我发现这不是gdb问题,而是g++中的一个错误:当使用-O3时,构造函数的最后一行被跳过了。如果我在那一行后面放一行printf,代码就会正常工作!将CFLAGS从-O3更改为-O0后,代码给出了正确的输出。我使用的是带有gcc-5.4.0 的c++11

当我在STM32L4R9I评估板上遇到类似问题时,我从使用-Os编译改为使用-O0编译,现在它的工作方式很有魅力。

请确保没有任何其他文件定义编译标志。