2013-04-17 61 views
1

我在寫一個應用程序,通過拋出異常從錯誤中恢復。嵌入GDB斷點

但是,在調試時,我希望我的調試器在拋出異常之前停止在我的錯誤點。無論如何添加一些代碼會導致GDB用一段代碼中斷執行。

我對ARM和x86體系結構感興趣,有些東西可以跨平臺使用。

編輯:我正在尋找一些斷點指令或一個包裝一個宏。

+0

你在問:「有沒有什麼方法可以預測GDB會拋出一個異常,並在CPU執行另一條指令之前在中斷處抽出」。我認爲你知道答案雖然;) – mah

+0

你是否在每次達到特定代碼時添加了「如果我到達這裏,休息」的東西? –

+0

@Mats,這就是我要求的 – doron

回答

4

您可以在代碼中添加「斷點指令」。如果沒有附加調試器,我知道的大多數操作系統都會忽略斷點。

這是編譯器和處理器依賴你使用這個指令是什麼,但在大多數編譯器有一個「內在」或「內置」的功能,如DebugBreak();爲MS編譯器和__builtin_trap(); GCC和相關的。

編輯:__builtin_trap();是一個壞主意,因爲它會阻止代碼進一步運行。相反,使用內聯彙編:

inline void DebugBreak() 
{ 
#if defined(X86) 
    __asm__ __volatile__("int 3"); 
#elif defined(ARM) 
    __asm__ __volatile__("bkpt"); 
#else 
    #error DebugBreak not defined for this architecture or no architecture defined. 
#endif 
} 

應該用於x86 &手臂工作 - 你可能想爲架構選擇宏「更好」的名字 - 我沒有做太多的工作有不同的架構,所以我的天堂」記住確切的名字是什麼。

+0

這或多或少是我在找的。唯一的問題是__builtin_trap傾向於殺死執行。 – doron

+0

對不起,去了另一個答案,這似乎是「窮人」爲這些目的。編輯即將發生... –

+0

使用鏗鏘聲,我得到了錯誤「錯誤:指令的無效操作數」在「int 3」上。 更改爲「int3」固定此。 – sheltond