2012-04-18 11 views
14

私はC#を初めて使用しています。私は小さなデスクトップフォームベースのアプリケーションを書いており、私はこの機能をアプリに必要としています。C#でプログラムクラッシュのスタックトレースを収集する方法

任意の時点でアプリケーションがクラッシュした場合、アプリはスタックトレースを収集し、私にそれを送り返すために最後の機会があるはずです...

私は、この上の指示を与えてください。

私のアプリのメインエントリポイントをカバーするtry catchが必要ですか? C#アプリケーションでこのようなことを処理する最良の方法は何ですか?

はProgram.csのにこれを追加し、すべての未処理の例外をキャッチするには、

+2

プログラムの "phone home"の機能を慎重に設計する必要があります。ユーザーに警告し、受信したくないデータ(パスワード、名前、子情報が含まれている可能性がある場合は特に注意してください)を考慮してください。これも確認してください - [Windowsエラー報告:はじめに](http://msdn.microsoft.com/en-us/windows/hardware/gg487440)、少なくともプライバシーに関するリンク。 –

答えて

22

をありがとう:

[STAThread] 
    static void Main() 
    { 
    AppDomain currentDomain = default(AppDomain); 
    currentDomain = AppDomain.CurrentDomain; 
    // Handler for unhandled exceptions. 
    currentDomain.UnhandledException += GlobalUnhandledExceptionHandler; 
    // Handler for exceptions in threads behind forms. 
    System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler; 
    ... 
    } 

private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = (Exception)e.ExceptionObject; 
    ILog log = LogManager.GetLogger(typeof(Program)); 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 

private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = e.Exception; 
    ILog log = LogManager.GetLogger(typeof(Program)); //Log4NET 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 

スタックあなたを包む場合は、exception.StackTrace

+2

答えに感謝します。私はあなたの答えをLynn Crumbling'sと比較しています。このアプローチのメリットは何ですか? – Ahmed

+4

@ user1185422 Aseemのアプローチはグローバルな解決策であり、起動時エラー、.NET内部例外、非同期操作エラーなどをキャッチします.Lynnのアプローチはローカルなものであり、 'MainEntryPoint'から呼び出されるメソッドの内部で発生する例外のみを捕捉します* *同期**。 Lynnのアプローチをクラッシュレポートソリューションとして推奨しません。なぜなら、クラス全体のエラーを逃すことができるからです。 –

+2

try catchブロックはうまくいっていますが、try-catch内でコードの各行をラップするのは面倒な作業です。また、サードパーティのライブラリが原因で例外が発生する可能性もあります。 try-catchブロックのアプローチを進めることができます。これが絶対必要です。 –

1

により取得することができますトレースtry-catch内のコード、およびExceptionが発生すると、Exceptionでスタックトレースを確認できます。はい、try-catchを追加して、メインエントリポイントをラップします。私があなただったら

try 
{ 
    MainEntryPoint(); 
} 
catch (Exception exc) 
{ 
    System.Diagnostics.Debug.Print(exc.Message); // get at entire error message w/ stacktrace 
    System.Diagnostics.Debug.Print(exc.StackTrace); // or just the stacktrace 
} 
+0

私はUnhandledExceptionを購読すれば、このアプローチを使用するとどのような利点があるのか​​知りたいです。 –

+2

はい、私はこの方法でもその方法を使用する理由を見つけることを試みています。それはおそらく、アプリケーション内の他の非UIスレッドの例外をキャッチしていますか?あなたのソリューションが他のスレッドの例外をキャッチするかどうかはわかりません。 – Ahmed

3
+0

提供されたサンプルを使用して30分を費やしました..サンプル設定アプリでさえもかなりクラッシュしました..考えは素晴らしいと思います.. – Ahmed

3

ている暗号の難読化ツールを見てみましょう、そのような自由でオープンソースNBugフレームワークとして、オールインワンのソリューションを検討しますAutomatic Exception Reporting機能です。

自動例外レポート機能を使用すると、ソフトウェアで発生した未処理の例外を簡単に検出でき、ユーザーはボタンを1回クリックするだけでこれらの例外を簡単にレポートできます。

例外レポートには、完全なスタックトレース情報、すべてのメソッド引数、ローカル変数、システム情報、例外の時刻、ビルド番号、オプションの開発者定義のカスタムデータなどのすべての関連情報が含まれます。ログファイル、スクリーンショットなど

免責事項:私はLogicNPソフトウェア、Crypto Obfuscatorの開発者のために働いています。

+1

他の同様の商業Red-GateのSmartAssemblyなどのツール、http://www.red-gate.com/products/dotnet-development/smartassembly/ :) –

関連する問題