我創建了一個宏,如何檢測在C++中是否附有調試器?
#define DEBUG_BREAK(a) if (a) __asm int 3;
但問題是,如果沒有附加的調試,程序會運行不正確。
所以我需要知道是否有一個調試器附加。如果有調試器,應用程序應該調用int 3
。否則,它不應該。
我怎麼能這樣做?
我創建了一個宏,如何檢測在C++中是否附有調試器?
#define DEBUG_BREAK(a) if (a) __asm int 3;
但問題是,如果沒有附加的調試,程序會運行不正確。
所以我需要知道是否有一個調試器附加。如果有調試器,應用程序應該調用int 3
。否則,它不應該。
我怎麼能這樣做?
您可以使用CheckRemoteDebuggerPresent
或IsDebuggerPresent
- 不,CheckRemoteDebuggerPresent
並不一定意味着調試器在不同的機器上運行,只是存在這樣可以處理斷點等(使用遠程當系統調試過程調試器,目標系統上也有一個小的進程,它是從哪裏來的)。
編輯:在這一點上,我會明確暗示某種形式的功能,而不是一個宏。
對於你想要做的事情,如果你使用正確的暴露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
http://stackoverflow.com/questions/4818628/c-figure-out-if-the-debugger-is-的poosible重複附 – ZoomIn