Estoy trabajando en un proyecto para mejorar nuestras capacidades de depuración de producción. Nuestro objetivo es producir de manera confiable un minivolcado en cualquier excepción no controlada, ya sea que la excepción se administre o no, y si se produce en un subproceso administrado o no administrado.¿Cómo funciona SetUnhandledExceptionFilter en aplicaciones .NET WinForms?
Utilizamos la excelente biblioteca ClrDump para esto actualmente, pero no proporciona exactamente las características exactas que necesitamos, y me gustaría entender los mecanismos detrás del filtrado de excepciones, así que me propuse probar esto por mí mismo.
Comencé siguiendo este artículo del blog para instalar un manejador SEH mismo: http://blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx. Esta técnica funciona para aplicaciones de consola, pero cuando intento lo mismo desde una aplicación de WinForms, mi filtro no recibe ninguna variedad de excepciones no administradas.
¿Qué puede hacer ClrDump que no estoy haciendo? ClrDump produce volcados en todos los casos, por lo que su filtro de excepción todavía se debe llamar ...
Nota: Conozco las capacidades de ADPlus, y también hemos considerado utilizar las claves de registro de AeDebug ... Estas son también posibilidades , pero también tienen sus compensaciones.
Gracias, de Dave
// Code adapted from <http://blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx>
LONG WINAPI MyExceptionFilter(__in struct _EXCEPTION_POINTERS *ExceptionInfo)
{
printf("Native exception filter: %X\n",ExceptionInfo->ExceptionRecord->ExceptionCode);
Beep(1000,1000);
Sleep(500);
Beep(1000,1000);
if(oldFilter_ == NULL)
{
return EXCEPTION_CONTINUE_SEARCH;
}
LONG ret = oldFilter_(ExceptionInfo);
printf("Other handler returned %d\n",ret);
return ret;
}
#pragma managed
namespace SEHInstaller
{
public ref class SEHInstall
{
public:
static void InstallHandler()
{
oldFilter_ = SetUnhandledExceptionFilter(MyExceptionFilter);
printf("Installed handler old=%x\n",oldFilter_);
}
};
}