Sto lavorando a un progetto per migliorare le nostre capacità di debug della produzione. Il nostro obiettivo è quello di produrre in modo affidabile un minidump su qualsiasi eccezione non gestita, sia che l'eccezione sia gestita o non gestita, sia che si verifichi su un thread gestito o non gestito.Come funziona SetUnhandledExceptionFilter nelle applicazioni .NET WinForms?
Attualmente utilizziamo l'eccellente libreria ClrDump per questo, ma non fornisce esattamente le funzionalità esatte di cui abbiamo bisogno e mi piacerebbe capire i meccanismi alla base del filtro delle eccezioni, quindi ho deciso di provarlo da solo.
Ho iniziato seguendo questo articolo del blog per installare personalmente un gestore SEH: http://blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx. Questa tecnica funziona per le applicazioni console, ma quando provo la stessa cosa da un'applicazione WinForms, il mio filtro non viene chiamato per nessuna varietà di eccezioni non gestite.
Cosa può fare ClrDump che non sto facendo? ClrDump produce dump in tutti i casi, quindi il suo filtro di eccezioni deve ancora essere chiamato ...
Nota: sono a conoscenza delle funzionalità di ADPlus e abbiamo anche considerato l'utilizzo delle chiavi di registro AeDebug ... Queste sono anche le possibilità , ma hanno anche i loro compromessi.
Grazie, 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_);
}
};
}