clr.dllでcrashdumpを引き起こしたC#コードをどのように見ますか?
-
28-09-2020 - |
質問
私の開発マシンで細かく動くが、他の2つのテストマシンでクラッシュするWindowsフォームアプリケーション(.NET 4)を持っています。私はそれがVS2010で作成したミニダンプをロードすることができます。
「混合したデバッグ」の選択は、明らかに無限のものにつながります(私は約20分後にDevenvを殺した)Visual StudioによってCPUの乱用。
ネイティブのみを「デバッグする」ときには、(テストマシンと同じフォルダにソースをミラー化したとしても)ソースが見つかりません。それは単に言う:
0x793F5B8Cの未処理例外 yourwinapp .exe.hdmp:0xc0000409:0xc0000409。
そして私を表示します
コールスタックの場所:CLR.DLL!793F5B8C()
アプリケーションがクラッシュする原因となっているものを見つけますか?「通知Microsoft」ダイアログが表示されている間、完全なcrashdumpを取りますか、そしてそれは役に立ちますか?
解決
MiniDumpデバッグは、VS2010では大幅に向上したと考えられました。まだ私自身の証拠をたくさん見ていません。私の言葉をそれに連れて行かないでください。ただし、ネイティブ専用管理コールスタックを表示するつもりはありません。
これをソースに取り付けます。 AppDomain.currentDomain.UnHandleDexceptionのイベントハンドラを書き込み、それをmain()メソッドに登録します。 e.exceptionObject.toString()の値を表示させてメッセージボックスに表示させます。それはあなたに例外の管理されたスタックトレースを取得します。そのメッセージボックスが表示されている間、ミニダンプをスナップさせることもでき、クラッシュの場所に近づくべきです。
あなたが取得している特定の例外は、絶対にネイティブのC / C ++コードを指すことです。スタックを破損しているバッファオーバーフロー。あなたのアプリが使用するネイティブコードのための.pdbファイルがあることを確認してください。 Microsoftシンボルサーバーを設定して、MiniDumpから良いネイティブスタックトレースを取得します。
編集:未処理のexceptionを受けないという事実は、CRTのスタック整合性チェックを確実に指しています。これはをを上げるように設計されていましたが、すぐにプログラムを終了しました。必要な動作スタックが危険にさらされているため、コードは安全に巻き戻すことができると想定できません。クラッシュの場所を考えると、このチェックは実際にCLRコードで行われる可能性があります。これが以前のCLRバージョンでは行われていないことを知っていますが、.NET 4.0
に含まれているCLRバージョンでは異なる場合があります。これは管理されたスタックトレースを取得することが非常に難しくなるでしょう。 CLRスタックフレームから識別子名を取得できるように、シンボルサーバーを設定する限り、管理されていないスタックトレースからリバースエンジニアリングできます。あなたがそれを解釈するのを助けたいならば、あなたの質問のトレースをあなたの質問に投稿してください。 CLRコードのバグがありそうもないBTWでは、Microsoftサポートを呼び出すことを検討することをお勧めします。しかし彼らは一貫したREPOを必要とするでしょう。 REPROがやってくるのが難しい場合、それらはそのすべての重要なスタックトレースとすることができます。シンボルサーバーを設定して、管理されていないスタックトレースを取得します。簡単なVS2010:ツール+オプション、デバッグ、記号、「Microsoftシンボルサーバー」をチェックします。