[英]How to run Boost Test and produce Minidumps?
我們的項目使用 Boost.Test 進行單元測試。 我們也希望在測試用例期間發生意外異常時獲得小型轉儲,因此我們已經開始集成 Google Breakpad 來編寫小型轉儲。
看起來 Boost.Test 正在攔截用戶測試中所有拋出的異常——我假設是因為 Boost 測試用例用 try/catch 包裝每個函數,如果拋出意外異常,單元測試就會失敗。 這可以防止 Breakpad 異常處理程序觸發和寫入小型轉儲。
是否有可能讓 Boost.Test 不僅捕獲單元測試中的意外異常並使其失敗? 而是讓異常未被處理(或重新拋出),以便可以觸發 Breakpad 或其他異常處理程序來編寫小型轉儲?
Boost.Test 旨在捕獲測試用例中的所有異常,以便繼續執行其他測試用例。 我認為您無法關閉此行為,但您可以隨時查閱源代碼。
為了實現您的目標,我會自己包裝測試用例的主體並捕獲異常並在拋出意外異常時寫出中斷板小型轉儲。 您可以通過將 catch/dump 處理程序編寫為接受作為您的測試用例主體的函子並在 lambda 中使用測試用例主體調用您的處理程序的函數來對此進行泛化:
void handler(std::function<void()> test_case)
{
try {
test_case();
} catch (...) {
write_minidump();
}
}
BOOST_AUTO_TEST_CASE(doit)
{
handler([] {
// do testing here
});
}
如果您使用固定裝置,它會更復雜,但同樣的想法也適用。
我嘗試了幾種不同的方法,但以下解決方案提供了最佳結果。 定義一個宏來包裝 BOOST_AUTO_TEST_CASE 宏,並用 SEH __try/__except 包圍調用代碼並將異常數據傳送到 Breakpad。
#define CUSTOM_AUTO_TEST_CASE( test_name ) \
void test_name##_custom_wrapper(); \
\
BOOST_AUTO_TEST_CASE( test_name ) \
{ \
__try \
{ \
test_name##_custom_wrapper(); \
} \
__except(pHandler->WriteMinidumpForException(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) {} \
} \
\
void test_name##_custom_wrapper() \
其中 pHandler 是 Breakpad ExceptionHandler 指針。
缺點是您必須用包裝宏替換每次出現的 BOOST_AUTO_TEST_CAST。 但它確實有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.