我正在做一个项目来增强我们的生产调试能力。我们的目标是在任何未处理的异常上可靠地生成一个小型转储,无论该异常是托管的还是非托管的,以及它是否发生在托管或非托管线程上。
我们目前为此使用了出色的ClrDump库,但它并不能完全提供我们需要的确切功能,我想了解异常过滤背后的机制,所以我开始亲自尝试一下。
我开始按照这篇博客文章自己安装 SEH 处理程序:http: //blogs.microsoft.co.il/blogs/sasha/archive/2007/12.aspx。这种技术适用于控制台应用程序,但是当我从 WinForms 应用程序尝试相同的事情时,我的过滤器不会针对任何种类的非托管异常调用。
ClrDump 可以做什么我没有做的事情?ClrDump 在所有情况下都会产生转储,因此仍必须调用其异常过滤器...
注意:我知道 ADPlus 的功能,我们也考虑过使用 AeDebug 注册表项......这些也是可能的,但也有它们的权衡。
谢谢,戴夫
// 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_);
}
};
}