2013-05-22 62 views
6

我創建了一個宏,如何檢測在C++中是否附有調試器?

#define DEBUG_BREAK(a) if (a) __asm int 3; 

但問題是,如果沒有附加的調試,程序會運行不正確。

所以我需要知道是否有一個調試器附加。如果有調試器,應用程序應該調用int 3。否則,它不應該。

我怎麼能這樣做?

+0

http://stackoverflow.com/questions/4818628/c-figure-out-if-the-debugger-is-的poosible重複附 – ZoomIn

回答

4

您可以使用CheckRemoteDebuggerPresentIsDebuggerPresent - 不,CheckRemoteDebuggerPresent並不一定意味着調試器在不同的機器上運行,只是存在這樣可以處理斷點等(使用遠程當系統調試過程調試器,目標系統上也有一個小的進程,它是從哪裏來的)。

編輯:在這一點上,我會明確暗示某種形式的功能,而不是一個宏。

+0

你打我:) :) –

+1

如果我使用函數,調試器會中斷函數,這不是我想要的。 – Jichao

+0

爲什麼?該函數唯一能做的就是返回調用站點...... – Useless

6

對於你想要做的事情,如果你使用正確的暴露kernel32.dll函數DebugBreak會更好。基本上沿而不是做的__asm int 3例程的

#define DEBUG_BREAK(a) if(a) if (IsDebuggerPresent()) DebugBreak() 

線或,使用VC-供給固有__debugbreak,即:與編譯時

#define DEBUG_BREAK(a) if(a) if (IsDebuggerPresent()) __debugbreak() 

後者有差別(相對於int 3/clr指出in the documentation。當然內在並不總是存在,所以取決於你的VS/VC版本(你沒有說明)。

在這兩種情況下,您至少需要windows.h包括IsDebuggerPresent()


但是,這就是你有一個調試和發佈構建和有條件構建的確切原因。請記住,儘管您努力將代碼中的斷點仔細放置,但優化器仍可能會在調試器中篡改結果。原因很簡單,源代碼中的某些行將不再被表示,或者以確定性的方式發生改變。因此,對兩者使用一種配置並沒有多大意義。所以,我說的是沿着線使用的東西:

#ifdef _DEBUG 
# define DEBUG_BREAK(a) if(a) __debugbreak() 
#else 
# define DEBUG_BREAK(a) do {} while(0) 
#endif 
相關問題