2017-05-27 42 views
2

我們正在爲我們的Visual Studio解決方案設置Appveyor,該解決方案生成一個C++庫。我們的一些測試[愚蠢]模糊C++對象,以確保它們不會做出意想不到的事情。在調試版本下,它會導致觸發一個斷言(並且在發佈版本中它只是拋出)。如何安裝DebugBreak處理程序?

我們使用自定義斷言來避免正在調試的程序崩潰的Posix行爲。如下所示。看來Appveyor或者如果斷言火災操作系統殺死程序和調試器不附:

enter image description here

我們要安裝一個DebugBreak處理程序,如果調試不存在。這應該確認其操作系統正在進行殺戮。理想情況下,處理程序將從Windows XP開始工作,VS2002及更高版本(這些是我們支持的Windows組合)。

我們如何在Windows平臺上安裝DebugBreak處理程序?


# define MYLIB_ASSERT(exp) {          \ 
    if (!(exp)) {             \ 
     std::ostringstream oss;          \ 
     oss << "Assertion failed: " << (char*)(__FILE__) << "("  \ 
      << (int)(__LINE__) << "): " << (char*)(__FUNCTION__) \ 
      << std::endl;           \ 
     std::cerr << oss.str();          \ 
     __debugbreak();            \ 
    }                \ 
} 

我們真的不能告訴誰負責的,因爲該行爲不是在MSDN在DebugBreak and __debugbreakC/C++ Assertions記錄。

+0

'DebugBreak處理程序' - 存在一般異常處理程序,您必須安裝它。沒有特殊的'DebugBreak處理程序' – RbMm

回答

2

有幾種不同的方法來處理這個問題。

從一個啓動可能調用DebugBreak()的一個過程中,你可以使用WaitForDebugEvent(或WaitForDebugEventEx)和ContinueDebugEvent處理從孩子調試事件。也就是說,父級充當調試器,而子級充當調試對象,類似於Visual Studio(在其他許多調試器中)的工作方式。

您還可以使用DebugActiveProcess附加到正在運行的進程。附加後,大多數調試類似於調試子進程的父進程。

如果您不能(或不想)執行其中任何一項,則可以安裝驗屍調試器。您可以通過在註冊表中指定調試器來執行此操作,如on MSDN所述。 Windows有一個「Windows錯誤報告」(WER),它調用指定的驗屍調試器。

+0

謝謝傑裏。它需要幾天的時間來嘗試並完全測試它。我將把John Robbin的調試書中的灰塵甩掉...... – jww

+0

我認爲* [父調試器通常可以分開](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679301 (v = vs.85).aspx)通過調用DebugActiveProcessStop。但我不確定可能存在什麼警告。 –

+0

調試器可以分離。這是100% – RbMm

相關問題