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

Мы настраиваем Appveyor для нашего решения Visual Studio, которое создает библиотеку C ++. Некоторые из наших тестов [dumb] нечеткие объекты C ++, чтобы убедиться, что они не делают ничего неожиданного. При отладочных сборках это вызывает срабатывание 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 в DebugBreak и __debugbreak или же Утверждения C / C ++.

2

Решение

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

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

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

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

2

Другие решения

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

вам нужно установить обычный обработчик исключений Windows, используя __try / __except или AddVectoredExceptionHandler или SetUnhandledExceptionFilter

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

1

По вопросам рекламы [email protected]