Как установить обработчик 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), который вызывает указанный посмертный отладчик.

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

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

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

Другие вопросы по тегам