私は本番デバッグ機能を強化するプロジェクトに取り組んでいます。私たちの目標は、例外が管理されているか管理されていないか、および管理されているスレッドと管理されていないスレッドのどちらで発生するかを問わず、未処理の例外に対して確実にミニダンプを生成することです。
現在、これには優れた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_);
}
};
}