Как установить обработчик DebugBreak?



Мы настраиваем Appveyor для нашего решения Visual Studio, которое создает библиотеку C++. Некоторые из наших тестов [dumb] fuzz c++ объектов, чтобы убедиться, что они не делают что-то неожиданное. При отладочных сборках он вызывает срабатывание assert (а в релизных сборках он просто выбрасывает).



Мы используем пользовательский assert, чтобы избежать поведения Posix при сбое отлаживаемой программы. Это показано ниже. Кажется, что Appveyor или операционная система убивает программу, если assert срабатывает, а отладчик нет прилагается:



Введите описание изображения здесь



Мы хотим установить обработчик DebugBreak, Если отладчик отсутствует. Это должно подтвердить, что его ОС делает убийство. В идеале обработчик будет работать с Windows XP и выше, а также с VS2002 и выше (это те комбинации Windows, которые мы поддерживаем).



Как установить обработчик DebugBreak на платформах Windows?





#  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 at DebugBreak и _ _ debugbreak или утверждения C/C++ .

647   2  

2 ответов:

Есть несколько различных способов справиться с этим.

Из процесса, который запускает тот, который может вызвать DebugBreak(), вы можете использовать WaitForDebugEvent (или WaitForDebugEventEx) и ContinueDebugEvent для обработки отладочных событий от дочернего устройства. То есть, родитель действует как отладчик, а ребенок-как отладчик, подобно тому, как работает отладчик Visual Studio (среди многих других).

Вы также можете подключиться к запущенному процессу с помощью DebugActiveProcess. После присоединения большая часть отладки похожа на родительскую отладка дочернего процесса.

Если вы не можете (или не хотите) сделать ни то, ни другое, вы можете установить посмертный отладчик. Это можно сделать, указав отладчик в реестре, как описано на MSDN. Windows имеет" отчет об ошибках Windows " (WER), который вызывает указанный посмертный отладчик.

Мы хотим установить обработчик DebugBreak, если отладчик отсутствует.

Вам нужно установить обычный обработчик исключений windows, используя __попробуйте / _ _ за исключением или мимо AddVectoredExceptionHandler или мимо SetUnhandledExceptionFilter

Когда int 3 инструкция выполняется в вашем приложении (путем вызова __debugbreak или DebugBreak) - и отладчик не присутствует или не обрабатывает это - ваш обработчик исключений будет вызван с кодом исключения STATUS_BREAKPOINT.

Comments

    Ничего не найдено.