Почему происходит сбой моего сервиса в DebugBreak () в Vista? - PullRequest
3 голосов
/ 23 января 2009

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

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

Ответы [ 2 ]

6 голосов
/ 23 января 2009

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

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

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

2 голосов
/ 23 января 2009

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

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

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

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

Либо проверьте флаг выполнения перед вызовом DebugBreak.

...