¿Cómo desactivo el cuadro de diálogo 'Depurar / Cerrar aplicación' en Windows Vista?

86

Cuando una aplicación falla en Windows y se instala un depurador como Visual Studio, aparece el siguiente cuadro de diálogo modal:

[Título: Microsoft Windows]

X ha dejado de funcionar

Un problema causó que el programa no funcionara correctamente. Windows cerrará el programa y le notificará si hay una solución disponible.

[Depurar] [Cerrar aplicación]

¿Hay alguna forma de desactivar este cuadro de diálogo? Es decir, ¿el programa simplemente se bloquea y se quema silenciosamente?

Mi escenario es que me gustaría ejecutar varias pruebas automatizadas, algunas de las cuales fallarán debido a errores en la aplicación bajo prueba. No quiero que estos diálogos detengan la ejecución de la automatización.

Buscando, creo que encontré la solución para deshabilitar esto en Windows XP, que está destruyendo esta clave de registro:

HKLM \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug \ Debugger

Sin embargo, eso no funcionó en Windows Vista.

Chris Smith
fuente
Nuking la clave AeDebug \ Debugger no tuvo ningún efecto para mí en Windows XP, ya sea en aplicaciones de consola compiladas con bibliotecas de depuración o sin depuración.
rptb1

Respuestas:

56

Para forzar al Informe de errores de Windows (WER) a realizar un volcado por caída y cerrar la aplicación, en lugar de pedirle que depure el programa, puede configurar estas entradas de registro:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]
"ForceQueue"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\Consent]
"DefaultConsent"=dword:00000001

Una vez configurado, cuando sus aplicaciones se bloqueen, debería ver los archivos * .hdmp y * .mdmp en:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\
NicJ
fuente
3
DefaultConsent = 1 parece ser el predeterminado. ¿Qué pasa con DontShowUI?
Zitrax
La documentación de ForceQueue es vaga, no entiendo exactamente lo que significa.
Zitrax
2
@NicJ, agregue DontShowUI = 1 a su respuesta, es el esencial
Youda008
1
También se puede configurar en HKEY_CURRENT_USER, creo
PJTraill
2
La edición del registro de Windows es el camino al infierno de TI, mejor considere la respuesta de armenzg
lowtech
45

Mira aquí:

http://msdn.microsoft.com/en-us/library/bb513638.aspx

regedit

DWORD HKLM o HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ DontShowUI = "1"

hará que WER informe en silencio. Entonces puedes configurar

DWORD HKLM o HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Disabled = "1"

para evitar que hable con MS.


fuente
Me funcionó para solucionar un problema de VSTS Build Agent en el que intentaba ejecutar pruebas de Selenium. ¡Gracias!
Stu1986C
36

No estoy seguro de si esto se refiere exactamente al mismo diálogo, pero aquí hay un enfoque alternativo de Raymond Chen :

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
Luke Quinane
fuente
Sí, llamar a SetErrorMode así evita el cuadro de diálogo WER mencionado por el OP.
Roman Starkov
2
El problema que tengo con SetErrorMode y la bandera SEM_NOGPFAULTERRORBOX es que no crea un archivo de volcado y hace una entrada en el Registro de eventos de Windows. Su programa simplemente desaparecerá sin dejar rastro cuando se bloquee. Por esta razón, creo que la solución de registro es mejor.
Derek
Esto también funciona para marcos obsoletos (desde WinXP).
Wolf
1
Estuvo de acuerdo en que esto no es bueno para enviar. Sin embargo, es realmente útil para desbloquear tareas de automatización inestables.
kayleeFrye_onDeck
31

Tuve que deshabilitar esto para el trabajo de automatización de versiones en Windows de 64 bits para Firefox e hice lo siguiente:

  • gpedit.msc
  • Configuración de la computadora -> Plantillas administrativas
  • Componentes de Windows -> Informe de errores de Windows
  • Establezca "Evitar la visualización de la interfaz de usuario para errores críticos" en Habilitado

Es similar a lo que se logró para los informes de experiencia del cliente en: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

armenzg
fuente
13

En mi contexto, solo quiero suprimir la ventana emergente para mis pruebas unitarias y no para todo el sistema. Descubrí que se necesita una combinación de funciones para suprimir estos errores, como detectar excepciones no controladas, suprimir las comprobaciones de tiempo de ejecución (como la validez del puntero de la pila) y los indicadores de modo de error. Esto es lo que he usado con cierto éxito:

#include <windows.h>
#include <rtcapi.h>
int exception_handler(LPEXCEPTION_POINTERS p)
{
    printf("Exception detected during the unit tests!\n");
    exit(1);
}
int runtime_check_handler(int errorType, const char *filename, int linenumber, const char *moduleName, const char *format, ...)
{
    printf("Error type %d at %s line %d in %s", errorType, filename, linenumber, moduleName);
    exit(1);
}

int main()
{
    DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
    SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&exception_handler); 
    _RTC_SetErrorFunc(&runtime_check_handler);

    // Run your tests here

    return 0;
}
Gearoid Murphy
fuente
8

En la aplicación WPF

[DllImport("kernel32.dll", SetLastError = true)]
static extern int SetErrorMode(int wMode);

[DllImport("kernel32.dll")]
static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lpTopLevelExceptionFilter);
public delegate bool FilterDelegate(Exception ex);

public static void DisableChashReport()
{
 FilterDelegate fd = delegate(Exception ex)
 {
  return true;
 };
 SetUnhandledExceptionFilter(fd);
 SetErrorMode(SetErrorMode(0) | 0x0002 );
}
Francesco Germinara
fuente
No parece que haya nada específico de WPF allí, y parece que también funciona bien en mi aplicación de consola (.NET 4.6.2 en Windows 10)
mookid8000
4

Durante la prueba, puede ejecutar con un 'depurador' como ADPlus adjunto, que se puede configurar de muchas formas útiles para recopilar datos (minivolcados) sobre errores y, sin embargo, evitar los problemas de diálogo modal que indicó anteriormente.

Si desea obtener información útil cuando su aplicación falla en producción, puede configurar los informes de errores de Microsoft para obtener algo similar a los datos de ADPlus.

Steve Steiner
fuente
4

Esta no es una respuesta directa a la pregunta, ya que es una solución alternativa y la pregunta es sobre cómo deshabilitar esa función, pero en mi caso, soy un usuario en un servidor con permisos limitados y no puedo deshabilitar la función usando uno de las otras respuestas. Entonces, necesitaba una solución. Es probable que esto funcione para al menos algunos otros que terminan con esta pregunta.

Solía autohotkey portátil y ha creado una macro que una vez por minuto comprueba si existe el cuadro emergente, y si lo hace, hace clic en el botón para cerrar el programa. En mi caso, eso es suficiente y deja la función activada para otros usuarios. Requiere que inicie el script cuando ejecuto el programa en riesgo, pero funciona para mis necesidades.

El guión es el siguiente:

sleep_duration = 60000 ; how often to check, in milliseconds.
                       ; 60000 is a full minute

Loop
{
    IfWinExist, ahk_class #32770 ; use autohotkey's window spy to confirm that
                ; ahk_class #32770 is it for you. This seemed to be consistent
                ; across all errors like this on Windows Server 2008
    {
        ControlClick, Button2, ahk_class #32770 ; sends the click.
                ; Button2 is the control name and then the following
                ; is that window name again
    }
    Sleep, sleep_duration ; wait for the time set above
}

editar: Una bandera rápida. Cuando hay otras cosas, esto parece intentar activar los controles en la ventana de primer plano; se supone que debe enviarlo al programa en segundo plano. Si encuentro una solución, editaré esta respuesta para reflejarla, pero por ahora, tenga cuidado al usar esto y tratar de hacer otro trabajo en una máquina al mismo tiempo.

Mella
fuente
3

Después de probar todo lo demás en Internet para deshacerme del depurador justo a tiempo, encontré una forma simple que realmente funcionó y espero que ayude a alguien más.

Vaya al Panel de control Vaya a Herramientas administrativas Vaya a Servicios Busque en la lista Administrador de depuración de máquinas Haga clic con el botón derecho del ratón en él y haga clic en Propiedades. Haga clic en Aplicar y Aceptar.

No he visto el mensaje del depurador desde entonces y mi computadora está funcionando perfectamente.

Vicki Mollenauer
fuente