Я работаю над проектом по расширению возможностей нашей производственной отладки. Наша цель состоит в том, чтобы надежно создавать minidump для любого необработанного исключения, независимо от того, управляется ли исключение или неуправляемо, и происходит ли это в управляемом или неуправляемом потоке.
Мы используем отличную библиотеку ClrDump для этого в настоящее время, но она не совсем обеспечивает точные функции, которые нам нужны, и я бы как понять механизмы фильтрации исключений, поэтому я решил попробовать это для себя.
Я начал с этой статьи блога, чтобы самостоятельно установить обработчик SEH: http://blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx. Этот метод работает для консольных приложений, но когда я пытаюсь сделать то же самое из приложения WinForms, мой фильтр не вызывается для любого разнообразия неуправляемых исключений.
Что может сделать ClrDump, что я не делаю? ClrDump производит дампы во всех случаях, поэтому его фильтр исключения еще должен быть вызван...
Примечание. Я знаю возможности ADPlus, и мы также рассмотрели использование разделов реестра AeDebug... Это также возможности, но также имеют свои компромиссы.
Спасибо, 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_);
}
};
}