2009-01-23 4 views
2

Я пишу службу Win32 на C++. У меня есть собственный макрос Assert, который вызывает DebugBreak() (между прочим). Когда я запускаю свою службу под Vista, служба выходит из строя при достижении вызова DebugBreak() (код операции ассемблера int 3), отображая диалог сбоя vista. Код ошибки - 80000003 (фиксированная точка останова).Почему моя служба врезалась в DebugBreak() на Vista?

Обычно я ожидаю, что мой сервис будет работать по вызову DebugBreak(), не выполняя никаких действий, если отладчик не подключен. Почему он падает? Есть ли возможная настройка для изменения, чтобы она продолжала работать?

ответ

5

Это сбой, потому что это точка останова исключение. Чтобы быть в безопасности, вам необходимо либо проверить, установлен ли отладчик:

if (:: IsDebuggerPresent()) :: DebugBreak();

или использовать try/except и return 1 (exceptionexecutehandler с пустым обработчиком) для исключения вашей точки останова из фильтра.

2

Обычно я ожидаю, что мой сервис будет работать по вызову DebugBreak(), не выполняя никаких действий, если отладчик не подключен. Почему он падает?

MSDN Help for the DebugBreak function говорит: «Если процесс не отлажен, функция использует логику поиска стандартного обработчика исключений. В большинстве случаев это приводит к тому, вызывающий процессу прекратить из-за необработанной точку останова исключения.»

Возможно ли изменение параметров, чтобы оно продолжало работать?

Вы можете попробовать добавить обработчик структурированных исключений.

В качестве альтернативы, перед вызовом DebugBreak установите флажок во время выполнения.

+0

Конечно, оба ответа верны. Спасибо за помощь, я не знал, что DebugBreak() вызывает исключение. – vividos