2017-02-28 18 views
0

プログラムで(C#)クラッシュダンプを生成する必要があります。私が知っている唯一の方法は、イベントUnhandledExceptionを購読することです。しかし、私のハンドラーはヒットしません。 コードは次のとおりです。プログラムでクラッシュダンプをキャプチャする必要があります

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    Application.ThreadException += Application_ThreadException; 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
} 

アプリケーションはWinFormベースです。私は、ユーザーに何も行動しないで、完全なメモリダンプを生成する必要があります。使用されるAPIはDbghelpのものですが、ミニダンプだけを生成します。したがって、フル・メモリ・ダンプを生成できる使用する他のAPIについても知っておくと便利です。

答えて

0

最初にフォームを表示し、イベントハンドラを登録してからMain()メソッドを終了します。コードの最後の3行には例外はありません。次のようにコードの並べ替え:

[STAThread] 
static void Main() 
{ 
    // Prepare for exception handling 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    Application.ThreadException += Application_ThreadException; 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

    // Now do the work where exceptions can happen 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

stack overflow、ヒープの破損または.NET実行エンジンの破損が発生した場合、プログラムは何も意味をなさない状態になります。プログラム内で動作する例外ハンドラは、常にこの影響を受けます。プログラムの外側からクラッシュダンプをキャプチャする方法については、How to take a good crash dump for .NETを参照してください。

+0

.NETのstackoverflow例外はどうですか?このコードを使用して処理できますか? – Sandeep

+0

問題は、実稼働環境に配備されている既存のアプリケーション内に統合されなければならないコードを書く必要があることです。したがって、例外のためにこのアプリケーションがクラッシュすると、コードはダンプをキャプチャする必要があります。あなたが共有したリンクは、別々に実行する必要のある外部ツールを使用して話します。これは、顧客によるアプリケーションの使用中に発生したクラッシュのダンプが必要であり、クラッシュが頻繁にまたはそれ以降に発生しない可能性があるため、望ましくありません。 – Sandeep

+0

WER LocalDumpsは、実行する必要のあるツールではなく、単なるレジストリキーです。これはOSに統合されています。そして、私が言ったように、アプリケーション内でその問題を解決することはできません。私たちのアプリケーションの1つでは、未処理の例外ハンドラを完全に削除しました。なぜなら、確実に動作しなかったからです。 –

0

私はexaclyあなたの質問(私はそれを理解する)に答えるこの資源を見つけました。 its by an MS employee named Alex、と思います。

それがWindows API呼び出しを使用しています。

[DllImportAttribute("dbghelp.dll")] 
[return: MarshalAsAttribute(UnmanagedType.Bool)] 
private static extern bool MiniDumpWriteDump(
    [In] IntPtr hProcess, 
    uint ProcessId, 
    SafeFileHandle hFile, 
    DumpType DumpType, 
    [In] IntPtr ExceptionParam, 
    [In] IntPtr UserStreamParam, 
    [In] IntPtr CallbackParam); 

著者のサンプルコード、thisアドレスは、私は、現時点ではそれにアクセスすることはできません、私はそれはあなたを助け願っています。

関連する問題