为什么我的调试器有时会发生故障并做一些不符合我的代码的事情?

Nan*_*ket 4 c++ debugging

当我在我的C++代码上使用我的调试器(在我的特定情况下,它是QT Creator以及GDB启发了这一点)时,有时即使在调用make clean之后make调试器似乎也吓坏了.

有时它似乎与另一段代码的行号对齐,并会跳转.有时这是一条线,有时这完全是关闭的,它会不规律地跳转.

其他时候,它会因为踩到我没有要求它进入的事情而变得惊慌失措,就像踩过函数调用一样,它可能会进入作为其一部分的字符串初始化例程.

当我遇到seg故障时,有时它能够告诉我它在哪里完美发生,有时它甚至不能显示哪些函数称为代码的问号,从哪里开始,我所看到的就是汇编,即使在运行时也是如此重复相同的代码.

我似乎无法找出导致这些失败的模式,有时我的调试器表现得非常好.

这些调试器背后的理论原因是什么,以及我可以采取哪些具体步骤来防止它们?

nos*_*nos 11

有三个非常常见的原因

  • 您正在调试优化代码.这很少有效 - 优化的代码可以重新排序/内联/预先计算/等.到目前为止,没有任何机会将其映射回源代码.

  • 无论出于何种原因,您都没有调试与当前源代码匹配的二进制文件.

  • 你已经在某处调用了未定义的行为 - 如果你的代码做了什么,它已经搞乱了调试器需要保持其理智的脚手架.当你得到一个段错误并且你无法获得理智的堆栈跟踪时,通常会发生这种情况,你已经覆盖/搞乱了调试器需要完成其工作的信息(例如堆栈指针).

可能还有数百个 - 我个人遇到的问题是:调试多线程代码; 取决于gcc/gdb版本和各种其他东西 - 调试器错误很少.