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デバッガ
.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でこのコードを実行すると、
アクティブdumpファイル
windbgでdumpファイルを開いて-pe:問題の所在が表示されます.
異常はこのように重要であるため、オペレーティングシステムは対応するデバッグ機能を提供し、デバッガを使用して異常を検出することができます.例外が発生すると、オペレーティングシステムは、ユーザー・ステータス・プログラムの例外処理関数を呼び出す前に、現在のユーザー・ステータス・プログラムにデバッガ・ロードがあるかどうかを確認します.もしあれば、オペレーティングシステムはまず異常情報をデバッガに送信し、デバッガに異常を観察する最初の機会を与えるのでfirst chance exceptionとも呼ばれ、デバッガが処理された後、オペレーティングシステムはユーザーステータスプログラムに処理させます.
ユーザステータスプログラムがこの異常を処理したら、デバッガは何もありません.そうでなければ、unhandled exceptionがクラッシュする前に、オペレーティングシステムはデバッガに異常を2回目に観察する機会を与えるので、second chance exceptionとも呼ばれます.
『Windowsユーザー状態プログラムの効率的な誤り訂正』
次のコードを分析します.DummyObjectは多くのメモリを消費し、メモリオーバーフローを引き起こすことがわかります.
windbgコマンド:!dumpheap–stat統計スタックメモリ
スレッドHangが住む一般的な原因
-スレッドプールまたは作業スレッドは、時間のかかる作業に集中したり、他のスレッドにロックされたりします.
コア問題、hangに格納されているスレッドを見つける
!threads
~*e!clrstack
!synblk
CPU高
-トラフィック量が増加していない場合、スレッドによる長時間の処理
コアの問題、CPUを占有するスレッドを探し当てます
!runaway
~*e!clrstack
スレッドのデッドロックが発生した場合:
2つのロックA,B,
1つのスレッドがロックAを取得し、ロックBを申請しました.
もう一つのスレッドはロックBを取得し、ロックAを申請した.
コアの問題:ロックされたスレッドが見つかりました
!threads
!syncblk
~*e!clrstack
•2つの命令は、ほとんどの問題を解決します.
•!dumpheap –stat
•~*e!clrstack
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デバッガ
.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でdumpファイルを開いて-pe:問題の所在が表示されます.
異常はこのように重要であるため、オペレーティングシステムは対応するデバッグ機能を提供し、デバッガを使用して異常を検出することができます.例外が発生すると、オペレーティングシステムは、ユーザー・ステータス・プログラムの例外処理関数を呼び出す前に、現在のユーザー・ステータス・プログラムにデバッガ・ロードがあるかどうかを確認します.もしあれば、オペレーティングシステムはまず異常情報をデバッガに送信し、デバッガに異常を観察する最初の機会を与えるので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統計スタックメモリ
スレッド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;
}
}
CPU高
-トラフィック量が増加していない場合、スレッドによる長時間の処理
コアの問題、CPUを占有するスレッドを探し当てます
!runaway
~*e!clrstack
スレッドのデッドロックが発生した場合:
2つのロックA,B,
1つのスレッドがロックAを取得し、ロックBを申請しました.
もう一つのスレッドはロックBを取得し、ロックAを申請した.
コアの問題:ロックされたスレッドが見つかりました
!threads
!syncblk
~*e!clrstack
•2つの命令は、ほとんどの問題を解決します.
•!dumpheap –stat
•~*e!clrstack