不可重现的运行时错误 - 一般方法?

时间:2011-03-01 11:03:03

标签: c++ debugging ubuntu runtime-error

我面临一个如此神秘的问题,我甚至不知道如何制定这个问题......我甚至无法发布任何代码。

我自己开发了一个大项目,从头开始。这几乎是发布时间,但我无法摆脱一些恼人的错误。我的程序不时写一个输出文件,在此期间我得到:

  • std :: string out_of_range错误
  • std :: string length_error
  • 输出上有很多废话

值得注意的是,即使使用相同的输入,这些错误也很少出现并且永远不会被复制。 Memcheck显示没有内存冲突,即使在之前发现错误的运行中也是如此。 Cppcheck也没有抱怨。我强烈地使用STL和pthreads,但没有后者,也会发生错误。

我尝试了最新的g ++和icpc。我正在使用某个版本的Ubuntu,但我不相信这就是原因。

我很感谢你们,如何解决这些问题。 提前谢谢。

6 个答案:

答案 0 :(得分:2)

启用coredumps(ulimit -c或setrlimit()),获取核心并启动gdb'ing。或者,如果可以的话,进行一次总是在gdb下运行的设置,这样当错误最终发生时,您可以获得一些信息。

答案 1 :(得分:2)

症状暗示内存损坏。

如果我不得不猜测,我会说某些东西正在破坏你写出的std::string对象的内部状态。字符串对象是否存在于堆栈中?您是否已将堆​​栈粉碎作为可能的原因(valgrind无法检测到)?

我还建议在调试器下运行您的可执行文件,以这样的方式设置它会在问题发生时触发断点。这将允许您在此时检查流程的状态,这可能有助于弄清楚发生了什么。

答案 2 :(得分:1)

gdbvalgrind是用于调试此类错误的非常有用的工具。 valgrind对于识别内存访问问题和内存泄漏特别有用。

答案 3 :(得分:1)

我在gcc中遇到了奇怪的优化错误(就像++i在极少数情况下汇编到i++一样)。您可以尝试声明一些关键变量volatile,但如果valgrind找不到任何内容,则可能性很低。当然,这就像在黑暗中拍摄......

如果您至少可以在程序内部检测到某些错误,例如检测无意义的输出,则可以调用空的“gotNonsense()”函数,您可以break进入{ {1}}。

答案 4 :(得分:1)

如果无法确定代码在程序中的确切位置崩溃,找到该位置的一种方法是使用调试输出。调试输出是调试无法再现的错误的好方法,因为您将在下次发生时获得有关该错误的更多信息,而无需主动重现它。我建议使用一些日志库,例如,boost提供一个。

答案 5 :(得分:1)

您正在密切使用STL,因此您可以尝试在debug mode中使用libstdc ++运行程序。它将对迭代器,容器和算法进行额外检查。要使用libstdc ++调试模式,请使用编译器标志-D_GLIBCXX_DEBUG

编译应用程序