Отключить приглашение отладки при сбое приложения - PullRequest
8 голосов
/ 17 февраля 2010

Вопрос: Мне нужно отключить приглашение отладочной системы консольного приложения.

Справочная информация: У нас есть приложение, которое синхронизирует информацию с третьей стороной, которая аварийно завершает работу из-за проблем со связью с третьей стороной в определенное время дня.У нас нет доступа к исходному коду, чтобы правильно перехватить ошибку, поэтому мне просто нужно, чтобы приложение завершилось ошибкой и повторило попытку.У меня есть другое приложение, которое контролирует наш инструмент синхронизации, чтобы убедиться, что он работает.

при сбое синхронизирующих приложений появляется запрос на отладку, который требует взаимодействия с пользователем.Поскольку это остается на экране, приложение никогда не перестает работать.В результате «проверка работоспособности» никогда не знает о сбое.

Я сделал это около 2 лет назад, но на всю жизнь я не могу вспомнить статью или нужный путь в реестре.

Спасибо, Брайан

ОС: Windows 2003 Server Тип приложения: .NET 3.5 Консольное приложение


FIX: найдено: John Knoeller

Удалить следующие ключи

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug \ Debugger HKEY_LOCAL_MACHINE \ SOFTWARE \.NETFramework \ DbgManagedDebugger

Ответы [ 3 ]

9 голосов
/ 17 февраля 2010

Возможно это?

Как: включить / отключить отладку по времени

Ключи реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger 
6 голосов
/ 09 августа 2014

Удаление целых ключей кажется слишком «молотковым» подходом.

Сначала , можно использовать функции Windows API SetErrorMode и / или SetThreadErrorMode. Их также можно вызывать из приложения .NET.

Связанные подписи для PInvoke:

    public enum ErrorMode : uint
    {
        SEM_DEFAULT                 = 0x0000,
        SEM_FAILCRITICALERRORS      = 0x0001,
        SEM_NOGPFAULTERRORBOX       = 0x0002,
        SEM_NOALIGNMENTFAULTEXCEPT  = 0x0004,
        SEM_NOOPENFILEERRORBOX      = 0x8000
    }

    [DllImport("Kernel32.dll")]
    public static extern ErrorMode SetErrorMode(ErrorMode mode);  //available since XP

    [DllImport("Kernel32.dll")]
    public static extern ErrorMode GetErrorMode();  //available since Vista

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool SetThreadErrorMode(ErrorMode newMode, out ErrorMode oldMode);    //available since Windows 7

    [DllImport("Kernel32.dll")]
    public static extern ErrorMode GetThreadErrorMode();    //available since Windows 7


Во-вторых, , существует более специфичное решение на основе реестра, начиная с Vista:
Исключая только это приложение из отлаженного. Смотрите это:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb204634(v=vs.85).aspx

Copy-Paste:

Исключение приложения из автоматической отладки

Следующая процедура описывает, как исключить приложение из автоматической отладки после того, как значение Auto для клавиши AeDebug установлено в 1.

-> Чтобы исключить приложение из автоматической отладки перейти к следующему разделу реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Добавьте значение REG_DWORD к подразделу AutoExclusionList, где имя - это имя исполняемого файла, а значение - 1.
По умолчанию диспетчер окон рабочего стола (Dwm.exe) исключен из автоматической отладки, поскольку в противном случае может возникнуть системная тупик, если Dwm.exe перестает отвечать (пользователь не может видеть интерфейс, отображаемый отладчиком из-за Dwm. exe не отвечает, и Dwm.exe не может завершить работу, поскольку он удерживается отладчиком).
Windows Server 2003 и Windows XP: Подраздел AutoExclusionList недоступен; таким образом, вы не можете исключить ни одно приложение, включая Dwm.exe, из автоматической отладки.

Записи реестра AeDebug по умолчанию можно представить следующим образом:
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion AeDebug Auto = 1 AutoExclusionList DWM.exe = 1

2 голосов
/ 09 мая 2011

Решение Джона в виде файла .reg (нам нужно было развернуть это на кластер серверов сборки):

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
"Debugger"=-

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"DbgManagedDebugger"=-
...