2009-09-15 41 views
3

我在前一段時間找到了關於此功能的信息,但主題是Hidden Features of Visual Studio (2005-2008)?的重複,再也找不到了。停止執行我的程序並轉到調試器而沒有設置斷點(Visual Studio/GCC和C++)

我想用這樣的:

#ifdef DEBUG 
#define break_here(condition) if (condition) ... // don't remember, what must be here 
#else 
#define break_here(condition) if (condition) return H_FAIL; 
#endif 
//... 
hresult = do_something(...); 
break_here(hresult != H_OK); 
//... 
var = do_other_thing(...); 
break_here(var > MAX_VAR); 

它必須表現得像上的錯誤斷點。這就像斷言,但沒有對話,更輕量。

我不能在這裏使用正常斷點,因爲我的模塊是幾個項目的一部分,可以在幾個VS解決方案中編輯。這導致在一個解決方案中設置的斷點在源代碼中的某處移動,而在其他解決方案中編輯代碼時。

回答

9

看看DebugBreak

導致當前進程發生斷點例外。這允許調用線程發信號通知調試器處理異常。

例如:

var = do_other_thing(...); 
if (var > MAX_VAR) 
     DebugBreak(); 
+0

謝謝!我發現它幾秒前:)這很奇怪:我搜索了大約一個小時 - 沒有發現。並且在詢問問題後,在一分鐘內找到正確答案:) – zxcat 2009-09-15 17:30:11

2

也許這對應該有所幫助:How to add a conditional breakpoint in Visual C++

+0

奇怪,但您的鏈接也包含正確的答案。我沒有打開那個話題,因爲它的標題聽起來像其他的東西 - 真正的條件斷點,而不是我需要的。 – zxcat 2009-09-15 17:32:16

2

我忘了,我需要ARM建立也和他們中的一個在MS Visual Studio中:)

未編譯

此外,我最好不要鏈接模塊的庫版本中的其他代碼。爲DebugBreak()包含「winbase.h」的需要是它的一個「壞事」,最好是有一些固有的。但是,這是有點「壞事」,因爲不會有斷點在最終版本:)

隨着crashmstr的答案的幫助下,我發現的DebugBreak()的替代品。現在我使用以下結構:

#ifdef _DEBUG 

    #ifdef _MSC_VER 
     #ifdef _X86_ 
     #define myDebugBreak { __asm { int 3 } } 
     #else 
     #define myDebugBreak { __debugbreak(); } // need <intrin.h> 
     #endif 
    #else 
     #define myDebugBreak { asm { trap } } // GCC/XCode ARM11 variant 
    #endif 

#else 

     #define myDebugBreak 

#endif 

#define break_here(condition) if (condition) { myDebugBreak; return H_FAIL; } 
相關問題