我有一个讨厌Heisenbug的应用程序。一般来说,它是一个并行的Fortran程序,它产生一个具有MPI-2 MPI_Comm_Spawn
功能的并行C ++程序,并且在某些时候看起来缓冲区在某处溢出,因为奇怪的变量最终会变得更奇怪(即移位)在第二次或第三次使用时,值或变为未初始化(例如,我在DO
循环中的计数器在代码的一部分中的迭代之间失去它的值,而这些代码与耦合中的数据完全无关。)
Valgrind什么都没报告。电围栏什么都没报告。 mtrace()
没有显示任何内容。 GNU和英特尔编译器套件都显示相同的问题,但都无法捕获原因或位置。优化和调试显示不同的问题。 mpich和OpenMPI都表现出同样的问题。 gdb,idb和Intel Inspector都没有抓到任何东西。添加打印语句会使崩溃更改位置,但仍然会发生。
每个单元测试和验证测试都独立地传递给每个程序。它们之间的相互作用似乎是问题所在。但是我没有使用任何工具可以给我任何迹象表明原因或地点。
我完全失去了。当你知道的每一个工具和技巧都失败时,你会怎么做?还有其他任何我可能错过的工具吗?我准备把它全部重新开始并重新开始,希望我第二次不犯任何错误。
答案 0 :(得分:1)
你唯一能做的就是从最小的工作集开始并添加直到它破裂 - 或者有时,如果你真的很幸运,通过稍微不同的路径获得最终所需的结果
或者你可以转而喝酒