2011-08-12 30 views
1

我有一個並行(MPI)c/C++程序,它在某些條件下會不時導致錯誤。一旦發生錯誤,將打印一條消息並退出程序;我想設置一個斷點來查看堆棧和關於導致錯誤的更多細節。我正在使用TotalView來調試東西,我希望它停在我的錯誤例程中的一個斷點處。我希望它總是自動設置這個斷點。有沒有辦法做到這一點?Totalview:有沒有硬編碼斷點的方法?

我正在調查使用signal.h和提高,但目前尚不清楚TotalView如何響應。

看着這個問題,How do you stop in TotalView after an MPI Error?,似乎C++異常處理,即throw(),會自動導致TotalView停止。在C中做這件事的正確方法是什麼?

回答

4

在TotalView軟件,文件>信號菜單選項打開此窗口:

TotalView Signals Window

這是控制響應信號調用默認的行爲。 SIGTRAP和SIGSTOP是保留的,看來TotalView對待它們的方式不同。那就是raise(SIGSTOP)在TotalView中沒有像預期的那樣停止。

這個程序:

#include <signal.h> 

main(int argc, char* argv[]) 
{ 
    raise(SIGTRAP); 
} 

產生這樣的響應:

意外的陷阱不是由斷點引起的!

並且程序狀態被列爲「已退出或從未創建」。當SIGTRAP替換爲SIGSTOP時,會發生相同的結果,但沒有「意外...」消息。

如上圖所示,默認情況下,SIGINT,SIGTSTP,SIGTTIN和SIGTTOU會導致TotalView停止,就像有一個斷點一樣。

以類似的方式由鳴叫鴨(Totalview: is there a way to hardcode a break point?),這些加薪()調用提供的答案可以的,如果你試圖調試可以任意做:

#ifdef DEBUG 
raise(SIGTSTP) 
#endif 

這只是許多方法來一個可能會得到硬編碼斷點的預期效果。

+0

好,趕緊找出答案吧 –

4

我不知道totalview是什麼,所以這可能不適用。

在Windows中:DebugBreak();
在x86彙編:__asm int 3;
在Linux中:raise(SIGTRAP);

對於窗口中的一個,我有一個方便的宏我用:
#define DEBUGME() do{if (IsDebuggerPresent()) DebugBreak();}while(0)
導致繼續執行,如果有沒有附加調試器。

+0

這是一個好主意,可能會起作用,但我在* nix系統上運行此代碼。 TotalView是一個調試器。 – Yann

+0

不妨試試x86程序集。這就是我所能找到的Linux。 –

+0

程序集幾乎可以工作,我懷疑TotalView保留這個「int 3」程序集語句以供其內部使用。當我在我想要的中斷點處包含__asm __(「int3」)時,編譯並運行代碼,我沒有得到期望的效果。這些進程仍被標記爲正在運行,儘管顯然代碼已經停止在中斷點。狀態欄列出程序在__dl__debug__state處,但源代碼未顯示。如果我'停止'該程序,那麼我會得到期望的效果,並且在我的中斷點處看到源代碼。 – Yann

相關問題