我有一个讨厌的Heisenbug和一个应用程序。一般而言,它是一个并行的 Fortran 程序,它生成一个具有 MPI-2MPI_Comm_Spawn
功能的并行 C++ 程序,并且在某些时候它看起来像某个缓冲区溢出,因为奇怪的变量最终会得到更奇怪的(即移位的)值或变得未初始化第 2 次或第 3 次使用它(例如,DO
循环中的计数器在与耦合数据完全无关的部分代码的迭代之间丢失了它的值)。
Valgrind 什么也没报告。电子围栏没有任何报告。mtrace()
什么都不显示。GNU 和 Intel 编译器套件都显示出相同的问题,但都无法找出原因或位置。优化和调试显示不同的问题。mpich 和 OpenMPI 都显示出相同的问题。gdb、idb 和 Intel Inspector 什么也抓不到。添加打印语句会使崩溃更改位置,但它仍然会发生。
每个单元测试和验证测试都独立通过每个程序。他们之间的互动似乎是问题所在。但是我用过的任何工具都不能告诉我为什么或在哪里。
我完全不知所措。当您知道的每个工具和技巧都失败时,您会怎么做?还有其他我可能错过的工具吗?我即将彻底摧毁一切并重新开始,希望我不会再犯任何错误。