2016-11-12 57 views
0

我使用MPI 我的程序終止並顯示Assertion (unsigned long)(size) >= (unsigned long)(nb) failed terminated by signal 6C++程序終止而不執行捕捉塊

我添加到我的主要try和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並運行它在我的代碼終止而不打印短語在趕上,它是試圖趕上應該強制我的程序執行什麼是在捕獲

+0

我的黑貓正在打盹,水晶球正在維修 - 「呼叫功能」是幹什麼用的? –

+3

Signal!=異常。信號比例外要低得多。你需要用信號處理程序來捕捉它們。如果中止信號被提出,你的程序太糟糕了,所以賠率相當不錯。不要處理它並繼續。處理它,並藉此機會打印可用於實際解決問題的診斷。 – user4581301

回答

2

某處,在您的call functions,可能有一個使用assert()。如果斷言失敗,則結果是通過調用abort()退出程序,該程序(與您的實現即編譯器/庫)生成SIGABRT(值6)信號。

事情是,abort()不需要 - 並且通常不會 - 拋出一個C++異常(因爲它是從一種對C++異常一無所知的語言C繼承而來)。同樣,提出SIGABRT信號(您的實現在abort()中使用的方式)以與C++異常無關的方式退出程序。

catch(...)子句將捕捉的唯一事情是C++異常。它不是一個全面的(不是雙關語)攔截任何導致程序終止的事件。

您可以通過使用signal()函數來建立合適的信號處理程序,從而攔截SIGABRT信號。在實踐中,找出造成call function致電abort()的原因可能更有成效。換句話說,確保它聲稱的條件是有效的。爲了解決這個問題,你需要閱讀被調用函數的文檔。