当我在我的C ++代码上使用我的调试器(在我的特定情况下,它是QT Creator以及启发了这个的GDB)时,有时甚至在调用make clean
后跟make
调试器之后似乎吓坏了。
有时它似乎与另一段代码的行号对齐,并会跳转。有时这是一条线,有时这完全是关闭的,它会不规律地跳转。
其他时候,它会因为踩到我没有要求它进入的事情而感到恐惧,就像踩过函数调用一样,它可能会进入字符串初始化例程,这是它的一部分。
当我遇到seg故障时,有时它能够告诉我它在哪里完美发生,有时它甚至无法显示哪些函数称为代码的问号,从哪里开始,我所看到的只是汇编,即使是重复运行完全相同的代码。
我似乎无法弄清楚导致这些失败的原因,有时我的调试器表现得非常好。
这些调试器背后的理论原因是什么,以及我可以采取哪些具体步骤来阻止它们?
答案 0 :(得分:11)
有三个非常常见的原因
您正在调试优化代码。这很少有效 - 优化的代码可以重新排序/内联/预先计算/等。到目前为止,没有任何机会将其映射回源代码。
您无法以任何理由调试与当前源代码匹配的二进制文件。
你已经在某处调用了未定义的行为 - 如果你的代码做了什么,它已经搞乱了调试器需要保持其理智的脚手架。当你得到一个段错误并且你无法得到一个理智的堆栈跟踪时,通常会发生这种情况,你已经覆盖/搞乱了调试器需要完成其工作的信息(例如堆栈指针)。
可能还有数百个 - 我个人遇到的问题是:调试多线程代码;取决于gcc / gdb版本和各种其他东西 - 调试器错误很少。
答案 1 :(得分:2)
一个可能的原因是调试器和其他程序一样错误!
但是调试器没有显示正确的源位置的最常见原因是编译器以某种方式优化了代码,因此源代码和可执行代码之间没有简单的对应关系。混淆调试器的常见优化是内联,而C ++非常容易使用它。
例如,您的字符串初始化例程可能已内联到函数调用中,因此就调试器而言,只有一个函数恰好以某些字符串初始化代码开头。
如果您正在追踪算法错误(与产生未定义行为的编码错误或并发错误相反),将优化级别降低将帮助您跟踪错误,因为调试器将具有更简单的视图代码。
答案 2 :(得分:0)
我和你一样有同样的问题,但我还是无法解决。但我找到了一个问题解决方案,即安装虚拟机并在其中安装Unix系统。并在Linux系统中调试它。也许它会起作用。
我发现原因,你应该在每次更改代码时重建项目,否则Qt只会运行旧版本的代码。