Windbgを使用してデバッグします.Netアプリケーション

5735 ワード

1. 解决ラインNETアプリケーションでは、次のような問題が発生しています.
  • クラッシュ
  • CPU高さ
  • プログラム異常
  • プログラムHang死
  • 2.WinDbgのインストール:
    http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx
    3.WinDbgの構成:
    WinDbgの実行->メニュー->File->Symbol File Path->次の方法で設定します.NT_SYMBOL_PATH変数:ポップアップボックスに「C:MyCodesSymbols;SRV*C:MyLocalSymbols*http://msdl.microsoft.com/download/symbols」(このように設定すると、WinDbgはまずローカルフォルダC:MyCodesSymbolsからSymbolを検索し、見つからない場合はMSのSymbol ServerからSymbolsを自動的にダウンロードする).もう1つの方法は、このSymbolからアドレスをダウンロードすることです.http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspxを選択して、適切なOSに必要な完全なSymbolインストールパッケージをダウンロードし、インストールします.
    4.WinDbgのadplusを使用してdumpファイルを取得します.
    Dumpファイルはプロセスのメモリミラーです.プログラムの実行状態をデバッガでdumpファイルに保存できます.
    WinDbgインストールディレクトリでadplusを見つけることができます.exe、彼をコマンドラインにドラッグして、コマンドで
    adplus.exe -hang -pn test.exe-o c:dumps//現在のdumpファイルをキャプチャ
    adplus.exe -crash -pn test.exe-o c:dumps//アプリケーションをリスニングし、crash時にdumpファイルを取得
    コマンド-pn:アプリケーション名、-p:アプリケーションpid、-odumpファイル出力パス
    5.WinDbgによるdumpファイルのロードデバッガ
    WinDbg->メニュー->File->Open Cresh dumpを実行してdumpファイルを開き、ロードします.Netデバッガ
    使用Windbg调试.Net应用程序_第1张图片
    .loadby sos mscorwks  .Net 3.5バージョンおよび以下
    .loadby sos clr  .Net 4.0
    サーバーの場合.Netバージョンがネイティブと一致しないサーババージョンが必要なmscordacwks.dllファイル
    設定します.sympath = mscordacwks_x86_x86_2.0.50727.3607.dl
    6.WinDbgの基本コマンド
    help sos命令ヘルプ
    !threadsはすべてのスレッドを表示
    !dumpheapは、管理スタックの情報を表示します.
    !clrstack表示呼び出しスタック
    !dumpobjはオブジェクトの内容を表示します
    !dumparray表示配列
    !syncblk同期ブロックの表示
    !runawayスレッドcpu時間の表示
    !gcrootトラッキングオブジェクトメモリリファレンス
    !pe印刷異常
    7.WinDbgの使用
    Formでこのコードを実行すると、
    public Form1(){
    			InitializeComponent();
    			AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    		}
    	private void UnhandledExceptionProc(object obj){
    			try {
    				throw new Exception("1st chance");
    			} catch (Exception) {
    				MessageBox.Show("after 1st");
    			}
    			int d = 0;
    			int n = 1 / d;
    }

    アクティブdumpファイル
    使用Windbg调试.Net应用程序_第2张图片 windbgでdumpファイルを開いて-pe:問題の所在が表示されます.
    使用Windbg调试.Net应用程序_第3张图片
    異常はこのように重要であるため、オペレーティングシステムは対応するデバッグ機能を提供し、デバッガを使用して異常を検出することができます.例外が発生すると、オペレーティングシステムは、ユーザー・ステータス・プログラムの例外処理関数を呼び出す前に、現在のユーザー・ステータス・プログラムにデバッガ・ロードがあるかどうかを確認します.もしあれば、オペレーティングシステムはまず異常情報をデバッガに送信し、デバッガに異常を観察する最初の機会を与えるのでfirst chance exceptionとも呼ばれ、デバッガが処理された後、オペレーティングシステムはユーザーステータスプログラムに処理させます.
    ユーザステータスプログラムがこの異常を処理したら、デバッガは何もありません.そうでなければ、unhandled exceptionがクラッシュする前に、オペレーティングシステムはデバッガに異常を2回目に観察する機会を与えるので、second chance exceptionとも呼ばれます.
    『Windowsユーザー状態プログラムの効率的な誤り訂正』
    次のコードを分析します.DummyObjectは多くのメモリを消費し、メモリオーバーフローを引き起こすことがわかります.
    	private void MemeryLeakProc(object obj)
    		{
    			while (true) {
    				for (int i = 0; i < 100 * 1024; i++) {
    					DummyObject o = new DummyObject();
    					list.Add(o);
    				}
    				Thread.Sleep(1000);
    			}
    		}

    windbgコマンド:!dumpheap–stat統計スタックメモリ
    使用Windbg调试.Net应用程序_第4张图片
    スレッドHangが住む一般的な原因
    -スレッドプールまたは作業スレッドは、時間のかかる作業に集中したり、他のスレッドにロックされたりします.
    コア問題、hangに格納されているスレッドを見つける
    !threads
    ~*e!clrstack
    !synblk
    lock (syncRoot) {
    				int tp;
    				int io;
    				//ThreadPool.GetMaxThreads(out tp, out io);
    				for (int i = 0; i < 100; i++) {
    					Thread hangThread = new Thread(HangProc);
    					hangThread.Start();
    				}
    				MessageBox.Show("Press to release lock");
    			}
      private void HangProc(object obj)
      {
       lock (syncRoot) {
        n = 0;
       }
      }
    

    使用Windbg调试.Net应用程序_第5张图片
    使用Windbg调试.Net应用程序_第6张图片
    CPU高
    -トラフィック量が増加していない場合、スレッドによる長時間の処理
    コアの問題、CPUを占有するスレッドを探し当てます
    !runaway
    ~*e!clrstack
     
    スレッドのデッドロックが発生した場合:
    2つのロックA,B,
    1つのスレッドがロックAを取得し、ロックBを申請しました.
    もう一つのスレッドはロックBを取得し、ロックAを申請した.
    コアの問題:ロックされたスレッドが見つかりました
    !threads
    !syncblk
    ~*e!clrstack
     
    •2つの命令は、ほとんどの問題を解決します.
    •!dumpheap –stat
    •~*e!clrstack