我正在用c ++开发一个计算几何应用程序。这使用线程和openmp并行运行。所以,我得到一些几何值(如节点,边等)并产生一个输出。这几乎总是完美的。但是,有1%的情况我得到了这个混乱的结果。应用程序没有崩溃,但我得到了非常糟糕的结果,例如我的输出具有随机内存值。但即使我两次运行相同的数据,第二次运行正常。我使用了valgrind和helgrind但他们没有检测到任何相关的错误。所以,我开始没有想法如何追踪它。是否有任何其他工具可以比helgrind更好地检测可能的线程错误?或者有没有关于如何复制这样的问题以及如何记录导致该错误的确切状态的想法?
答案 0 :(得分:0)
免责声明:我没有使用下面的方法使用OpenMP,但基于我刚看到的内容似乎是可能的。
我有一个类似的错误需要在GDB中重现。 This post帮助我无限期地运行应用程序,直到出现分段错误。
我们可以通过添加一个在输出值不符合预期时命中的条件断点来调整此答案来回答您的问题。
set pagination off
break exit
commands
run
end
break file.cpp:123 if some_condition_holds
现在,如果您使用GDB运行上述内容,它将无限期地运行,直到出现错误结果(some_condition_holds
为真)。然后我们可以使用inferior commands:
info inferiors
inferior inferior_num