2016-11-12 4 views
0

내가 MPI 내 프로그램이 종료 및 디스플레이 Assertion (unsigned long)(size) >= (unsigned long)(nb) failed terminated by signal 6C++ 프로그램은 catch 블록

나는 다음과 같은

int main(int argc, char *argv[]) 
{ 
    MPI_Init(&argc, &argv); 
    int rankid; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rankid); 

    try 
    { 
     call functions 
    } 
    catch(...) 
    { 
     cout<<"error from "<<rankid<<endl; 
     throw; 
     } 
    return 0; 
} 

로 내 주요 시도 및 캐치에 추가

를 사용하여 병렬 코드를 실행 해요을 실행하지 않고 종료 내가

mpirun -np 2 ./a.out 

내 코드를 mpicxx example.C를 사용하여 실행 내 코드를 컴파일하고있어 문구를 인쇄하지 않고 종료 잡기에서 잡기에있는 프로그램을 실행하도록 프로그램을 강제 실행하려고 시도하고 catch하는 것이 맞습니까?

+0

검은 고양이는 낮잠을 자고 수정 구슬이 수리를 위해 있습니다. '전화 기능'은 무엇을합니까? –

+3

신호! = 예외. 신호는 예외보다 훨씬 낮습니다. 당신은 신호 처리기로 그들을 잡아야합니다. 확률이 높아지면 중단 신호가 발생해도 프로그램이 너무 깨져서 생존 할 수 있습니다. 그것을 취급하지 말라. 이를 처리하고 실제로 문제를 해결하는 데 사용할 수있는 진단을 인쇄 할 기회를 얻으십시오. – user4581301

답변

2

어딘가에 call functionsassert()이 사용되었을 수 있습니다. 어설 션이 실패하면 abort()을 호출하여 프로그램을 종료합니다 (구현시 컴파일러/라이브러리에서 SIGABRT (값 6) 신호를 생성 함).

사실, abort()은 C++ 예외를 throw하지 않아도되며 일반적으로 C++ 예외를 throw하지 않습니다 (C++ 예외에 대해 아무것도 모르는 언어 인 C에서 상속 되었기 때문에). 마찬가지로 SIGABRT 신호 (구현시 abort())가 발생하면 C++ 예외와 아무런 관련이없는 방식으로 프로그램이 종료됩니다.

catch(...) 절이 catch하는 유일한 것은 C++ 예외입니다. 프로그램 종료를 유발하는 이벤트를 가로 채기위한 포괄적 인 것이 아닙니다.

signal() 함수를 사용하여 적절한 신호 처리기를 설정하면 SIGABRT 신호를 가로 챌 수 있습니다. 실제로 call functionabort()으로 전화하는 원인을 찾아내는 것이 더 효과적 일 수 있습니다. 즉, 주장하는 조건이 유효한지 확인하십시오. 이를 수행하는 방법을 배우려면 호출되는 함수에 대한 설명서를 읽어야합니다.