我面临一个如此神秘的问题,我甚至不知道如何制定这个问题......我甚至无法发布任何代码。
我自己开发了一个大项目,从头开始。这几乎是发布时间,但我无法摆脱一些恼人的错误。我的程序不时写一个输出文件,在此期间我得到:
值得注意的是,即使使用相同的输入,这些错误也很少出现并且永远不会被复制。 Memcheck显示没有内存冲突,即使在之前发现错误的运行中也是如此。 Cppcheck也没有抱怨。我强烈地使用STL和pthreads,但没有后者,也会发生错误。
我尝试了最新的g ++和icpc。我正在使用某个版本的Ubuntu,但我不相信这就是原因。
我很感谢你们,如何解决这些问题。 提前谢谢。
答案 0 :(得分:2)
启用coredumps(ulimit -c或setrlimit()),获取核心并启动gdb'ing。或者,如果可以的话,进行一次总是在gdb下运行的设置,这样当错误最终发生时,您可以获得一些信息。
答案 1 :(得分:2)
症状暗示内存损坏。
如果我不得不猜测,我会说某些东西正在破坏你写出的std::string
对象的内部状态。字符串对象是否存在于堆栈中?您是否已将堆栈粉碎作为可能的原因(valgrind
无法检测到)?
我还建议在调试器下运行您的可执行文件,以这样的方式设置它会在问题发生时触发断点。这将允许您在此时检查流程的状态,这可能有助于弄清楚发生了什么。
答案 2 :(得分:1)
gdb
和valgrind
是用于调试此类错误的非常有用的工具。 valgrind
对于识别内存访问问题和内存泄漏特别有用。
答案 3 :(得分:1)
我在gcc中遇到了奇怪的优化错误(就像++i
在极少数情况下汇编到i++
一样)。您可以尝试声明一些关键变量volatile
,但如果valgrind
找不到任何内容,则可能性很低。当然,这就像在黑暗中拍摄......
如果您至少可以在程序内部检测到某些错误,例如检测无意义的输出,则可以调用空的“gotNonsense()”函数,您可以break
进入{ {1}}。
答案 4 :(得分:1)
如果无法确定代码在程序中的确切位置崩溃,找到该位置的一种方法是使用调试输出。调试输出是调试无法再现的错误的好方法,因为您将在下次发生时获得有关该错误的更多信息,而无需主动重现它。我建议使用一些日志库,例如,boost提供一个。
答案 5 :(得分:1)
您正在密切使用STL,因此您可以尝试在debug mode中使用libstdc ++运行程序。它将对迭代器,容器和算法进行额外检查。要使用libstdc ++调试模式,请使用编译器标志-D_GLIBCXX_DEBUG
编译应用程序