2009-04-09 2 views
13

Я использую Hudson как сервер непрерывной интеграции для тестирования кода C/C++. К сожалению, у меня есть ошибка где-то, что приводит к повреждению памяти, поэтому на некоторых машинах Windows я иногда получаю диалоговое окно «Ошибка приложения», объясняющее, что инструкция ссылается на память, которую невозможно прочитать. Это диалоговое окно появляется и в основном висит в тестовом прогоне, так как требует ручного вмешательства.Можно ли отключить диалоговое окно «Ошибка приложения»?

Есть ли способ предотвратить появление этого диалогового окна, чтобы тестовый прогон просто завершился неудачей и сообщается как таковой в Хадсоне?

Возможно ли автоматическое создание minidump вместо отображения диалога?

+0

Похожее: https://stackoverflow.com/questions/2284138/disable-debug-prompt-on-application-crash и https://stackoverflow.com/questions/3561545/how-to-terminate-a-program -when-it-crashes-which-should-just-fail-a-unit-test – Vadzim

ответ

11
  1. использования «отчетов Отключить ошибка», как и г-н Мягко предлагает. См. Также this PC World article.
  2. Если у вас есть MS Visual Studio на вашей машине сборки, она уловит ошибки приложений и откроет диалоговое окно. Чтобы отключить эти диалоги (а также функцию отладки Just-In-Time Visual Studio), запустите команду drwtsn32.exe -i, чтобы установить Dr. Watson в качестве системного отладчика по умолчанию. Д-р Уотсон будет генерировать основной дамп и молча выйти. (См этой статье базы знаний Microsoft:. http://support.microsoft.com/kb/q121434/)
+1

Спасибо! Восстановление конфигурации д-ра Уотсона и установка его не на подсказку были именно тем, что я искал! – mch

+1

Статья PC World кажется пустой. Следовательно, первая альтернатива не дает никакого полезного ответа. – skyking

-2

Используйте инструкцию try/catch, чтобы поймать исключение и обработать его так, как вы хотите.

+1

Try/catch не может поймать недопустимый доступ к памяти, насколько мне известно. – mch

+1

__try/__except can, однако. – ChrisV

1

Отключить отчет об ошибках с помощью:

  • редактирования реестра - добавить ваше приложение в HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PCHealth \ ERRORREPORTING \ ExclusionList ИЛИ
  • Щелкните правой кнопкой мыши на Мой компьютер, перейдите к Advanced Tab, и выберите «отключить сообщения об ошибках» вариант, ИЛИ
  • Вы можете перейти к консоли служб в административных инструментов, найти ошибки Reporting Service, перейдите в свойства и отключить его
1

Вы можете использовать различные функции _CrtSetReport контролировать способ выполнения C/C++ реагирует на различные ошибки (_CrtSetReportHook, _CrtSetReportMode, _CrtSetReportFile, _CrtSetReportHook2)

7

Вы также можете сделать что-то вроде этого programaticaly с помощью SetErrorMode. См. Статью this для более подробной информации.

Простой пример того, как использовать его, чтобы сделать следующее:

SetErrorMode(GetErrorMode() | SEM_NOGPFAULTERRORBOX); 

Вышеприведенные «ОШ» текущий режим с нашим желаемым дополнением.

+1

В аналогичном ключе я думаю, что очень важно называть «_set_abort_behavior (0, _WRITE_ABORT_MSG)», «в будущем ваше приложение будет терпеть неудачу, потому что кто-то называет« abort() »(поведение по умолчанию для непонятого исключения C++ в сборках отладки IIRC) , – pauldoo

2

В дополнение к тому, что сказал rkb, если вы используете Windows XP 64bit, существует два набора значений. Те, которые находятся в обычном месте регистрации, и те, которые находятся под номером Wow6432Node, находятся в HKLM. Чтобы обновить оба варианта, запустите drwtsn32.exe -i как с %SYSTEMROOT%\system32, так и с %SYSTEMROOT%\SysWOW64.

Смежные вопросы