78

Cuando una aplicación se bloquea en Windows y un depurador como Visual Studio está instalado el siguiente cuadro de diálogo modal aparece:¿Cómo desactivo el diálogo 'Depurar/Cerrar aplicación' en Windows Vista?

[Título: Microsoft Windows]

X ha dejado de funcionar

Un problema causado el programa para detener funciona correctamente. Windows cerrará el programa y le notificará si hay disponible una solución .

[depuración] [Cerrar aplicación]

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

Mi caso es que me gustaría ejecutar varias pruebas automáticas, 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 en Creo que he localizado la solución para desactivar esto en Windows XP, que se nuking esta llave del registro:

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

Sin embargo, eso no funcionó en Windows Vista.

+0

Nuking la tecla AeDebug \ depurador no tuvo ningún efecto para mí en Windows XP, ya sea en la consola e aplicaciones compiladas con bibliotecas de depuración o sin errores. – rptb1

Respuesta

52

Para forzar Informe de errores de Windows (WER) para tomar un volcado de bloqueo y cierre la aplicación, en lugar de preguntar depurar el programa, puede configurar estas entradas del 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 

Después de esto se establece, cuando se bloquean tus aplicaciones, deberías ver * .hdmp y *.mdmp archivos en:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\ 
+3

DefaultConsent = 1 parece ser el predeterminado. ¿Qué hay de DontShowUI? – Zitrax

+0

La documentación de ForceQueue es vaga, no entiendo exactamente lo que significa. – Zitrax

+0

Configuración de los tres valores que me funcionaron: ForceQueue, DefaultConsent y DontShowUI. Ese último fue necesario. Pero no veo ninguno de los archivos * .hdmp o * .mdmp que mencionaste. Pero el registro de eventos tiene los errores como siempre. Pero al menos ahora mi servicio no está colgado. –

4

Durante la prueba se puede ejecutar con un 'debugger' like ADPlus attached que se puede configurar de muchas maneras útiles para recopilar datos (minivolcados) sobre los errores y aún así evitar los problemas de diálogo modales que estado arriba.

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

32

No estoy seguro de si esto se refiere a exactamente el mismo cuadro de diálogo, pero aquí es un enfoque alternativo de Raymond Chen:

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX); 
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX); 
+0

Sí, al llamar a SetErrorMode como que impide el diálogo de WER mencionado por el OP. –

+0

¡Buena solución limpia! ¡Gracias! – kizzx2

+2

El problema que tengo con SetErrorMode y el indicador SEM_NOGPFAULTERRORBOX es que no crea un archivo de volcado y crea una entrada en el registro de eventos de Windows. Tu programa simplemente desaparecerá sin dejar rastro cuando se cuelgue. Por esta razón, creo que la solución de registro es mejor. – Derek

41

Ver 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 silenciosamente. Entonces se puede establecer

HKLM DWORD o HKCU \ Software \ Microsoft \ Windows \ Informe de errores de Windows \ discapacitados = "1"

para que deje de hablar con EM.

3

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

Ir a Panel de control vaya a Herramientas administrativas Ir a los Mira hacia abajo la lista para la máquina de Administrador de depuración de clic derecho sobre él y haga clic en Propiedades bajo la pestaña General, busque Puesta en Marcha Tipo Haga clic en Desactivar . Haga clic en Aplicar y Aceptar.

No he visto el mensaje del depurador desde entonces, y mi computadora funciona perfectamente.

26

tuve que desactivar esto para el trabajo de automatización de liberación en Windows de 64 bits para Firefox e hice lo siguiente:

  • gpedit.msc
  • configuración del equipo -> Plantillas administrativas
  • componentes de Windows - > errores de Windows
  • Set "Prevenir pantalla de la interfaz de usuario para errores críticos" a Activado

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

4

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

Utilicé autohotkey portable y creé una macro que, una vez por minuto, verifica si el cuadro emergente existe, 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 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 
} 

edición: Una bandera rápida. Cuando otras cosas pasan, 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 e intentar hacer otro trabajo en una máquina al mismo tiempo.

11

En mi contexto, solo quiero suprimir la ventana emergente para las pruebas de mi unidad y no para todo el sistema. Descubrí que se necesita una combinación de funciones para suprimir estos errores, como capturar excepciones no controladas, suprimir verificaciones de tiempo de ejecución (como la validez del puntero de la pila) y los indicadores del 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; 
} 
6

En aplicación de 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); 
} 
Cuestiones relacionadas