9

私は.NET2.0プラットフォームを対象としたC#で記述されたEVEMonと呼ばれるオープンソース製品に取り組んでいます。解決できなかった奇妙な.NETクラッシュに苦しんでいるユーザーが1人います。

イベントタイプ:エラー
イベントソース:.NETRuntime2.0エラーレポート
イベントカテゴリ:なし
イベントID:5000
日付:2009年4月29日
時間:10:58:10 PM
ユーザー:N / A
コンピューター:これを削除しました
説明:
EventType clr20r3、P1 evemon.exe、P2 1.2.7.1301、P3 49ea37c8、P4
system.windows.forms、P5 2.0.0.0、P6 4889dee7、P7 6cd3、P8 18、P9
system.argumentexception、P10NIL。

データ:
//上記の説明の16進表現

アプリケーション自体がエラーを表示せずにクラッシュします(UIの処理にエラーがあるにもかかわらず)。上記のメッセージはWindowsイベントログからコピーされました。エンドユーザーは.NETを再インストールし、最新バージョンに更新しました。.PDBファイルは、デバッグとテストを支援するためにプログラムのすべてのリリースバージョンで配布されます。問題のユーザーは、正しいバージョンのEVEMon用のPDBファイルを完全に補完します。

このタイプのクラッシュを分析および診断するための特定の、試行錯誤された手法はありますか?もしそうなら、デバッグを支援するためにどのようなツールとテクノロジーが利用可能ですか?

特別な感謝

Steffen Opelに特に感謝し、彼の答えは、私が尋ねていた質問に直接答えることはできませんでしたが、グローバルエラー処理に重要なコンポーネントがないという私のコードベースのより大きな問題に対処したことを強調したいと思います。

4

8 に答える 8

18

これが、クラッシュしたエンドユーザーの問題に取り組む方法です。

  1. http://www.microsoft.com/whdc/devtools/debugging/default.mspxでWindows用のデバッグツールをダウンロードしてインストールします。

  2. ツールがインストールされたら(デフォルトではC:\ Program Files \に移動します)、コマンドラインウィンドウを起動します。

  3. adplusを含むディレクトリに移動します(例:「C:\ ProgramFiles \ Debugging Tools for Windows(x86)」)。

  4. 次のコマンドを実行します。これにより、アプリケーションが起動し、adplusが添付されます。

adplus -crash -o C:\debug\ -FullOnFirst -sc C:\path\to\your\app.exe

クラッシュダンプが作成された後

アプリケーションがクラッシュしたら、WinDbgを起動し、C:\debugに作成された.dmpファイルをロードします。([ファイル]-> [クラッシュダンプを開く])

これらのコマンドを実行してスタックトレースを確認し、問題を見つけてください。

デバッグ用にSOSをロードするには

  • .NET4.0より前
.loadby sos mscorwks
  • .NET 4.0
.loadby sos clr

スタックトレースを表示するには

!clrstack

より便利なスタックトレースを表示するには

!clrstack –p

オブジェクトの内部を突くには..おそらく例外の原因を確認してください

!do <address>

たとえば、これは、IO例外でランダムに障害が発生したアプリケーションの結果です。WinDbgは、参照されていたパスが正しくないことを指摘しました。

0:009> !do 017f2b7c    
Name: System.String    
MethodTable: 790fd8c4    
EEClass: 790fd824    
Size: 124(0x7c) bytes    
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)    
String: \\server\path\not_here.txt
Fields:    
      MT    Field   Offset                 Type VT     Attr    Value Name    
79102290  4000096        4         System.Int32  1 instance       54 m_arrayLength    
79102290  4000097        8         System.Int32  1 instance       53 m_stringLength    
790ff328  4000098        c          System.Char  1 instance       5c m_firstChar    
790fd8c4  4000099       10        System.String  0   shared   static Empty    
    >> Domain:Value  00161df8:790d884c <<    
7912dd40  400009a       14        System.Char[]  0   shared   static WhitespaceChars    
    >> Domain:Value  00161df8:014113e8 <<
于 2009-07-04T08:00:20.503 に答える
5

ソースコード(トランク)を覗いてみると、Windowsフォームアプリケーションに関して、未処理の例外処理が不完全であるように思われることがわかります。

非UIスレッド例外とUIスレッド例外の両方を処理する必要があります。

  • AppDomain.CurrentDomain.UnhandledException前者の場合、すでに配置されているを介してCLRの未処理の例外ハンドラーを実装する必要があります。

  • 後者の場合、Windowsフォームの未処理の例外ハンドラーをを介して実装する必要がありますがApplication.ThreadException、これは欠落しているようです。これは確かにあなたが目撃している問題を正確に生み出す可能性があります。実装例については、Application.ThreadExceptionイベントのMSDNドキュメントを参照してください。

現在、を介して未処理のWindowsフォーム例外のキャッチを明示的に抑制していることに注意してくださいApplication.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException)。これを変更しUnhandledExceptionMode.CatchExceptionて、のハンドラーへのルーティングを有効にする必要があります。これApplication.ThreadExceptionは、すでにJehofによって正しく提案されています。

于 2009-07-04T13:55:48.897 に答える
3

ユーザーはどのOS(Windows XP、Windows Vistaなど)を使用していますか?

Windows Vistaで「問題の報告と解決策」機能を無効にしようとした場合([コントロールパネル]->[問題の報告と解決策]->[設定の変更]->[詳細設定]->[プログラムの電源を切る、問題の報告])

または設定してみてください

  Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );

これにより、常に例外がThreadExceptionハンドラーにルーティングされます。

于 2009-07-01T08:54:08.730 に答える
2

一言で言えば、アプリケーションには未処理の例外があります。

(リモートアクセスなどを介して)マシンにアクセスできる場合は、VisualStudioExpressをインストールしてアプリケーションを起動してみてください。VisualStudioの新しいインスタンスを使用してアプリケーションをデバッグする機会を提供するダイアログが表示されます。

また、Windowsフォームが正しく初期化されない原因がある可能性もあります。フォントの問題がこれを引き起こす可能性があることを示唆するフォーラムの投稿を見てきました。ユーザーがアプリケーションに必要なフォントに加えて、MS SansSerif、Arial、Tahoma、Timesなどの通常のデフォルトをインストールしていることを確認してください。

そしてそれに失敗すると...PC上で鶏肉を犠牲にしてみてください。毎回チャームになります!

于 2009-06-30T15:16:01.943 に答える
2

スレッドコードの例外で問題が発生しました。新しいスレッドを生成し、スレッドメソッドで例外を処理するのを忘れた場合、アプリケーションは単に「停止」します。エラーメッセージも何も表示されず、イベントログのエントリのみが表示されます。それでもUnhandledExceptionHandlerトリガーされません。

たぶんこのようなことが原因ですか?

于 2009-07-01T07:51:48.137 に答える
1

...あなたがその苦しんでいるユーザーに連絡することができるならば、ここにあります

アイデア:実行前の段階をログに記録する

へのショートカットを作成する代わりに、へのショートカットを作成しますprogram.exeprogram.bat

echo "Pre-start" > stage.txt
start program.exe

Program.csしたがって、の最初の行は

File.WriteAllLines("stage.txt", "Program execution started.");

AppDomain.UnhandledException最初の行のハンドラーでは

File.WriteAllLines("stage.txt", "Unhandled exception has been caught.");

また、ハンドラーがメモリやリソースを割り当てないようにしてください。プログラムの開始時にそれらを事前に割り当ててください。ハンドラーは、ログへの書き込みのみをトリガーします。

コメントコメント

stage.txt(ユーザーから送信された)には「事前開始」が含まれている可能性が非常に高くなります。これは、プログラムが開始される前であっても、サードパーティの.dllで例外がスローされた場合に発生します。

その場合、簡単なチェッカープログラムが必要になります。このプログラムは、実行するアセンブリを参照しませんprogram.exeが、参照しAssembly.Load(...)ます。

PS

stage.txtプログラムファイルではなく、%APPDATA%の下のどこかに配置する必要があります。

私はServer2003で興味深い事例を見つけ、別の素晴らしい議論をしました。

于 2009-07-02T20:09:35.423 に答える
0

.pdbその特定のリリースのファイルをユーザーに送信し(の横に配置.exe)、クラッシュを再現させることで、より詳細なスタックトレースを取得する必要があります。

于 2009-05-02T10:05:17.467 に答える
0

コードで処理する必要がAppDomain.UnhandledExceptionあります。

同様の質問がありました。関連するものも参照してください。

于 2009-07-02T14:20:00.803 に答える