Pregunta

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 dejara de funcionar correctamente.Windows cerrará el programa y le notificará si hay una solución disponible.

[Depurar][Cerrar aplicación]

¿Hay alguna manera de desactivar este cuadro de diálogo?Es decir, ¿el programa simplemente falla 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 cuadros de diálogo 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.

¿Fue útil?

Solución

Para forzar a Windows Informe de errores (WER) para tomar un volcado de bloqueo y cierre la aplicación, en lugar de preguntar que para 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 el accidente aplicaciones, debería ver los archivos * * .hdmp y .mdmp en:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\

Otros consejos

Vea aquí:

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

regedit

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

hará que informe WER en silencio. Entonces se puede establecer

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

para que deje de hablar con EM.

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);

he tenido 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 -> Informe de errores de Windows
  • Ajuste "Prevenir pantalla de la interfaz de usuario para errores críticos" a Activado

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

En mi contexto, lo único que quieren suprimir el emergente para mis pruebas de unidad y no para todo el sistema. He descubierto que se necesita una combinación de funciones con el fin de suprimir estos errores, tales como la captura de excepciones no controladas, la supresión de los controles en tiempo de ejecución (por ejemplo, la validez del puntero de 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;
}

En 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 );
}

Hay que aplicar un filtro de excepción no controlada, que simplemente se cierra la aplicación, a continuación, establecer que la función de filtro con SetUnhandledExceptionFilter () .

Si está utilizando el CRT seguro, también tiene que proporcionar su propio controlador de parámetro no válido y establecer esto con _ set_invalid_parameter_handler ().

Este blog tiene alguna información también: http://blog.kalmbachnet.de/?postid=75

Durante la prueba se puede ejecutar con un 'depurador' como ADPlus adjunto que se puede configurar de muchas maneras útiles para recopilar datos (minivolcados) sobre errores y aún así evitar los problemas de diálogo modales que Estado anteriormente.

Si desea obtener alguna información útil cuando su aplicación se bloquea en la producción puede configurar Microsoft informes para conseguir algo similar a los datos ADPlus error.

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

solía autohotkey portátil y creó una macro que una vez por minuto verifica si el cuadro emergente existe y, si existe, 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 suceden otras cosas, esto parece intentar activar los controles en la ventana de primer plano; se supone que debe enviarlos 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 realizar otros trabajos en una máquina al mismo tiempo.

Después de probar todo lo demás en el Internet para deshacerse de justo a tiempo depurador, he encontrado una manera simple que efectivamente trabajadas y espero ayudar a alguien más.

Ir a Panel de control Vaya a Herramientas administrativas Ir a Servicios Mira hacia abajo la lista para la máquina de Administrador de depuración Haga clic derecho sobre él y haga clic en Propiedades En la pestaña General, busque tipo de inicio Haga clic en Desactivar. Haga clic en Aplicar y Aceptar.

No he visto el mensaje depurador desde entonces, y la computadora está funcionando perfectamente.

En lugar de cambiar los valores en el registro se puede desactivar completamente el informe de errores en Windows Server 2008 R2, Windows Server 2012 y Windows 8 con: serverWerOptin /disable

https://technet.microsoft. com / es-es / library / hh875648 (v = ws.11) .aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top