Мы настраиваем 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 ++.
Есть несколько отличных способов справиться с этим.
Из процесса, который запускает тот, который может вызвать DebugBreak()
, ты можешь использовать WaitForDebugEvent
(или же WaitForDebugEventEx
) а также ContinueDebugEvent
обрабатывать отладочные события от ребенка. Т.е. родительский элемент действует как отладчик, а дочерний — как отладчик, подобно тому, как работает отладчик Visual Studio (среди многих других).
Вы также можете присоединиться к запущенному процессу, используя DebugActiveProcess
. После того, как вы подключились, большая часть отладки похожа на родительскую отладку своего дочернего процесса.
Если вы не можете (или не хотите) делать что-либо из этого, вы можете установить посмертный отладчик. Это можно сделать, указав отладчик в реестре, как описано на MSDN. В Windows есть «Отчет об ошибках Windows» (WER), который вызывает указанный посмертный отладчик.
Мы хотим установить обработчик DebugBreak, если отладчик отсутствует.
вам нужно установить обычный обработчик исключений Windows, используя __try / __except или AddVectoredExceptionHandler
или SetUnhandledExceptionFilter
когда int 3
инструкция выполняется в вашем приложении (вызывая __debugbreak
или же DebugBreak
) — а отладчик отсутствует или не обрабатывает это — ваш обработчик исключений будет вызываться с кодом исключения STATUS_BREAKPOINT
,