2017-10-04 3 views
2

우리 프로젝트는 단위 테스트를 위해 Boost.Test를 사용합니다. 테스트 케이스 중에 예기치 않은 예외가 발생했을 때 미니 덤프를 얻으려고합니다. 그래서 우리는 미니 패드를 작성하기 위해 Google Breakpad를 통합하기 시작했습니다.부스트 테스트를 실행하고 미니 덤프를 생성하는 방법은 무엇입니까?

Boost.Test는 사용자 테스트에서 예외를 모두 가로 채고있는 것처럼 보입니다. Boost 테스트 케이스가 try/catch를 사용하여 각 함수를 래핑하고 예상치 못한 예외가 throw되면 유닛 테스트가 실패하기 때문에 나는 추측합니다. 이렇게하면 Breakpad 예외 핸들러가 미니 덤프를 시작하고 기록하지 못하게됩니다.

Boost.Test를 사용하면 단위 테스트에서 예상치 못한 예외를 catch하고 실패하지 않을 수 있습니까? 대신 브레이크 패드 또는 다른 예외 처리기가 미니 덤프를 작성하도록 트리거 될 수 있도록 예외 처리가 처리되지 않도록 설정하십시오 (또는 다시 시작하십시오)?

답변

1

몇 가지 다른 접근법을 시도했지만 다음과 같은 해결책이 가장 좋습니다. 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의 모든 발생을 래퍼 매크로로 교체해야한다는 것입니다. 그러나 그것은 속임수입니다.

1

Boost.Test는 다른 테스트 케이스를 계속 실행하기 위해 테스트 케이스에서 모든 예외를 catch하도록 설계되었습니다. 이 동작을 끌 수 있다고 생각하지 않지만 항상 소스 코드를 참조하십시오.

당신이 무엇을했는지 달성하기 위해, 테스트 케이스 본문을 직접 포장하고 예외를 잡아 예기치 않은 예외가 발생했을 때 브레이크 패드 미니 덤프를 작성하도록했습니다.

void handler(std::function<void()> test_case) 
{ 
    try { 
    test_case(); 
    } catch (...) { 
    write_minidump(); 
    } 
} 

BOOST_AUTO_TEST_CASE(doit) 
{ 
    handler([] { 
    // do testing here 
    }); 
} 

그것은 경우 더 복잡 할 것이다 : 당신은 당신의 테스트 케이스 본체와 람다에서 테스트 케이스 본체와 핸들러를 호출하는 펑터를 받아들이는 함수로 캐치/덤프 핸들러를 작성하여이를 genericize 수 있습니다 당신은 조명기를 사용하고 있지만 같은 아이디어가 적용됩니다.

+0

나는이 제안을 좋아하지만, 미니 덤프가 catch 블록에 기록 될 때까지 미니 덤프에 저장되는 호출 스택은 스택 맨 위에 '처리기'만 표시합니다. 그러나 '처리되지 않은 예외 필터'가 트리거되고 덤프가 작성되면 문제가되는 호출 스택이 보존됩니다. – mbradber

+0

브레이크 패드는 예외 처리기를 어떻게 설정합니까? – legalize

+0

https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/windows_client_integration.md 여기에있는 문서를 기반으로 ExceptionHandler를 만들었습니다. 이 Breakpad는 처리되지 않은 예외 필터 콜백을 설정하고 처리되지 않은 예외는 미니 덤프를 멋지게 만듭니다. 그러나 게시 된 것과 비슷한 catch 블록에서 'WriteMinidump'API를 명시 적으로 사용하고 있습니다. – mbradber

관련 문제