openmp分段错误-奇怪的行为 我在C++和OpenMP上都是新的。我的程序中有一部分在奇怪的情况下(至少对我来说是奇怪的)导致分段错误

openmp分段错误-奇怪的行为 我在C++和OpenMP上都是新的。我的程序中有一部分在奇怪的情况下(至少对我来说是奇怪的)导致分段错误,c++,openmp,C++,Openmp,在使用g++编译器时不会出现这种情况,但在使用英特尔编译器时会出现这种情况,不过串行数据中没有错误 在不同系统(大学hpc、英特尔编译器)上编译时,它也不会出错,但在我的电脑上会出错 当存在三个特定的cout语句时,它也不会SEGFULT,但是如果其中任何一个被注释掉,则会发生SEGFULT。(这就是我觉得奇怪的地方) 我对使用英特尔调试器(idb)是新手,但我还不知道如何正确使用它。但我确实从中获得了这些信息: Program received signal SIGSEGV VLMsolver

在使用g++编译器时不会出现这种情况,但在使用英特尔编译器时会出现这种情况,不过串行数据中没有错误

在不同系统(大学hpc、英特尔编译器)上编译时,它也不会出错,但在我的电脑上会出错

当存在三个特定的cout语句时,它也不会SEGFULT,但是如果其中任何一个被注释掉,则会发生SEGFULT。(这就是我觉得奇怪的地方)

我对使用英特尔调试器(idb)是新手,但我还不知道如何正确使用它。但我确实从中获得了这些信息:

Program received signal SIGSEGV
VLMsolver::iterateWake (this=<no value>) at /home/name/prog/src/vlmsolver.cpp:996
996     moveWakePoints();
程序接收信号SIGSEGV
VLMsolver::iterateWake(this=)位于/home/name/prog/src/VLMsolver.cpp:996
996个移动唤醒点();
因此,我将在下面展示moveWakePoints方法,并指出关键线路:

void VLMsolver::moveWakePoints() {

inFreeWakeStage =true;
int iw = 0;
std::vector<double> wV(3);
std::vector<double> bV(3);
for (int cl=0;cl<3;++cl) {
    wV[cl]=0;
    bV[cl]=0;
}

cout<<"thanks for helping"<<endl;

for (int b = 0;b < sNumberOfBlades;++b) {
    cout<<"b: "<<b<<endl;
    #pragma omp parallel for firstprivate(iw,b,bV,wV)
    for (int i = 0;i< iteration;++i) {
        iw = iteration -i - 1;
        for (int j = 0;j<numNodesY;++j) {
            cout<<"b: "<<b<<"a: "<<"a: "<<endl;
            double xp = wakes[b].x[iw*numNodesY+j];
            double yp = wakes[b].y[iw*numNodesY+j];
            double zp = wakes[b].z[iw*numNodesY+j];
            if ( (sFreeWake ==true && sFreezeAfter == 0) || ( sFreeWake==true && iw<((sFreezeAfter*2*M_PI)/(sTimeStep*sRotationRate)) && sRotationRate != 0  ) || ( sFreeWake==true && sRotationRate == 0 && iw<((sFreezeAfter*sChord)/(sTimeStep*sFreeStream)))) {
                if (iteration>1) { 
                    getWakeVelocity(xp, yp, zp, wV);
                }
                getBladeVelocity(xp, yp, zp, bV);
            } else {
                for (int cl=0;cl<3;++cl) {
                    wV[cl]=0;
                    bV[cl]=0;
                }
            }
            if (sRotationRate != 0) {
                double theta;
                theta = M_PI/2;
                double radius = sqrt(pow(yp,2) + pow(zp,2));
                wakes[b].yTemp[(iw+1)*numNodesY+j] = cos(theta - sTimeStep*sRotationRate)*radius;
                wakes[b].zTemp[(iw+1)*numNodesY+j] = sin(theta - sTimeStep*sRotationRate)*radius;
                wakes[b].xTemp[(iw+1)*numNodesY+j] = xp + sFreeStream*sTimeStep;
            } else { 
                std::vector<double> fS(3);
                getFreeStreamVelocity(xp, yp, zp, fS);
                wakes[b].xTemp[(iw+1)*numNodesY+j] = xp + fS[0] * sTimeStep;
                wakes[b].yTemp[(iw+1)*numNodesY+j] = yp + fS[1] * sTimeStep;
                wakes[b].zTemp[(iw+1)*numNodesY+j] = zp + fS[2] * sTimeStep;
            }
            wakes[b].xTemp[(iw+1)*numNodesY+j] = wakes[b].xTemp[(iw+1)*numNodesY+j] + (wV[0]+bV[0])*sTimeStep;
            wakes[b].yTemp[(iw+1)*numNodesY+j] = wakes[b].yTemp[(iw+1)*numNodesY+j] + (wV[1]+bV[1])*sTimeStep;
            wakes[b].zTemp[(iw+1)*numNodesY+j] = wakes[b].zTemp[(iw+1)*numNodesY+j] + (wV[2]+bV[2])*sTimeStep;

        }  // along the numnodesy
    }  // along the iterations i
    if (sBladeSymmetry) {
        break;
    }
}
void VLMsolver::moveWakePoints(){
INFOREEWAKEStage=真;
int-iw=0;
std::载体wV(3);
std::载体bV(3);
对于(int cl=0;cl
  • 尝试增加堆栈大小,

  • 试试瓦尔格林

  • 尝试调试器


如前一个答案中所述,您可以尝试使用Valgrind检测内存损坏的位置。只需使用“-g-O0”编译二进制文件,然后运行:

valgrind --tool=memcheck --leak-check=full <binary> <arguments>
valgrind--tool=memcheck--leak check=full


希望我能帮上忙:-)

谢谢,我还想知道cout如何能阻止故障
cout<<"b: "<<b<<endl; 
valgrind --tool=memcheck --leak-check=full <binary> <arguments>