GDB以无序的方式跳转到错误的行
GDB jumps to wrong lines in out of order fashion
应用程序设置:我有使用以下第三方库的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版(吉尼斯)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
编译,现在它的工作方式很有魅力。
请确保没有任何其他文件定义编译标志。
- 重载方法的方式会在使用临时调用时生成编译器错误
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 当我使用 osgDB::readNodeFile 时,如何跳过错误的 osgb 文件?
- 我试图创建临时对象的方式有错误吗
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 我如何在一个 if 语句中声明所有数字我尝试通过其他方式声明所有数字,如果一个接一个,但似乎代码有逻辑错误
- 我是否以错误的方式声明了getpriorityvalues函数
- 数组数据以错误的方式遍历 Python/Matlab
- 使用分而治之的最大总和子数组,为什么要以不同的方式使用 for 循环,答案是错误的?
- 这是通过初始化 constexpr 变量来标记编译错误的合理跳转
- 在Powershell中以编程方式转储路径时,重复字符被跳过
- 运行时间错误:程序跳过提示,以获取第二名和第三个名称
- GDB以无序的方式跳转到错误的行
- Valgrid 错误 - 条件跳转或移动取决于未初始化的值
- 使用枚举的错误方式
- 捕捉文本文件行中的错误,跳过和报告
- Xercesc - NAMESPACE_ERR:试图以与名称空间相关的错误方式创建或更改对象
- 错误:跳转到标签"FOO"交叉初始化"条形"
- 图像处理-以最快的方式跳到文件中的位置(C/C++)
- 错误:跳转到案例标签并交叉初始化