Почему моя служба дает сбой при DebugBreak() в Vista?

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

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


person vividos    schedule 23.01.2009    source источник


Ответы (2)


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

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

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

person deemok    schedule 23.01.2009

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

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

Можно ли изменить настройку, чтобы она продолжала работать?

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

В качестве альтернативы перед вызовом DebugBreak проверьте какой-либо флаг времени выполнения.

person ChrisW    schedule 23.01.2009
comment
Конечно, оба ответа верны. Спасибо за помощь, я не знал, что DebugBreak() вызывает исключение. - person vividos; 23.01.2009