株式会社NTTデータ 飯山 教史 第 3 回 IIYAMA, Takashi SOS.DLLを利用した .NETアプリケーションの解析 .NETアプリケーショ ンの解析 Visual Basic ✔ Visual C# Visual C++ SQL Server Oracle Access ASP.NET ✔ Other: WinDbg(Debugging Tools for Windows) SOS.DLL イル解析でも、故障部位を特定するだ けならこれまでと同様、例外を発生し たスレッドを特定してそのスタックを 前回はWinDbg(Microsoft Debug ダンプするだけである。同じことをす ging Tools for Windows)を利用したア るのになぜ SOS.DLLが必要なのだろう プリケーションの解析について説明し か? た。.NETアプリケーションで発生した それは、.NET FrameworkではCLR 例外個所を解析するときにもWinDbg がアセンブリを「AppDomain」と呼ば を利用するが、.NETアプリケーション れる単位で 管理しているためである。 の場合は.NET Frameworkがアプリケ AppDomainとプロセスの関係を示すと ーションを管理しているため、これま 図1のようになる。 でと同じコマンドで解析しても同様の WinDbgは、Windowsのプロセスベ 結果は得られない。.NETアプリケーシ ースで管理されているメモリ情報をダ ョンを解析するには「SOS.DLL」と呼 ンプする機能のみを提供している。そ ばれるWinDbg拡張モジュールが必要 のため、AppDomainの情報をダンプす になる。 るためにはAppDomain専用のダンプ機 そこで今回は、SOS.DLLを利用する 能が別途必要になる。たとえば、.NET ための環境作りと、SOS.DLLで.NET から新しく導入されたガベージコレク アプリケーションのクラッシュを解析 ションの状態をダンプする機能などは する方法について説明する。 当然既存のWinDbgでは提供されてい ないし、スタックやオブジェクトの格 なぜSOS.DLLが 必要なのか? .NETアプリケーションのダンプファ 178 Windows Developer Magazine 納方法も従来とは異なるためWinDbg だけではダンプはできない。 この問題を解決するため、Microsoft は「SOS.DLL」を開発した。SOS.DLL SOS.DLLを利用した.NETアプリケーションの解析 図1:AppDomainとプロセスの関係 既存アプリケーション を実行するだけで、SOS.DLLを利用す .NETアプリケーション る準備が整う。もちろん「.load sos」を Default AppDomain アプリケーション OS/ハードウェア アセンブリ A.exe ArrayやEnum などDomain共 通の型を提供 ユーザー独自の ロードできる している。 Mscorlib.dll System Domain(singleton) 文字リテラル 利用できるので、私はWinDbgを起動 するときにはいつもこのバッチを利用 Shared Domain(singleton) (--.dll)モジュールを AppDomainはCLR上での プログラム管理単位である。 .NETでは、EXE(アセンブ リ)はAppDomainとして 管理される。 実行しなければ 通常のWinDbgとして ローダー ヒープ インターフェイス IDテーブル suser.dmpにスタック情報を記録 する設定 続いてやらなければならないのは、 OS/ハードウェア ダンプファイルにスタック情報を記録 する設定である。驚いたことに、デフ はAppDamainの構造をダンプする高度 sSOS.DLLをロードする方法 な機能を持ち、.NETアプリケーション そこで、はじめにWinDbgからSOS. の障害を解析するときには不可欠のツ DLLを利用するための環境を構築する [注1] ールである 。 SOS.DLLを 利用するための準備 ォルトではuser.dmpに.NETアプリケ ーションのスタック情報は記録されな いのである。 方法について説明する。SOS.DLL は user.dmpにスタック情報を記録する .NE T Frameworkの一部としてインス ためには、machine.configとレジスト トールされているので、新たに入手す リに対して以下のような設定を行なう る必要はない。 必要がある。 まず、DOSプロンプトを開き、<Vis 設定1:machine.config SOS.DLLは確かに便利なツールであ ual Studio .NETのインストールディレ るが、ひとつ弱点がある。それはWin クトリ>¥Common7¥ Toolsディレクト <SystemRoot>¥Microsoft.NET¥Fra Dbgから利用するためには特殊な方法 リ配下の「vsvars32.bat」を実行して必 mework¥v1.1.4322¥CONFIGディレク で起動しなければならないにも関わら 要なディレクトリパスを設定する。 トリ配下にある「machine.config」を ず、その起動方法についての情報が書 続いて、バッチを実行したDOSプロ 開き、system.windows.formsセクショ かれているドキュメントが少ない、と ンプトからWinDbg を起動してCom ンのjitDebuggingの値を「true」にす mandウィンドウから、 る(デフォルトはfalse) 。 [注2] 言うことである 。ネットで調べた限 りでも、WinDbgをダウンロードし、シ ンボルサーバーを構築した後、どのよ .load sos うにすればSOS.DLLのコマンドを利用 できるようになるのかがわからないと を実行する。これで、WinDbgでSOS いうエンジニアが多いようだ。 .DLLを利用できるようになる。 この一連の作業を毎回行なうのは面 注1)SOSは「Son of Strike」の略で、Strikeとい う他社製のモジュールのダンプ機能をラップして いる。 注2)John RobbinsのBUGSLAYER(MSDN Mag azine June 2003)にSOS.DLLの起動方法が書か れている。以下のURLを参照。 http://msdn.microsoft.com/msdnmag/issues/03/ 06/Bugslayer/default.aspx <configration> ・ ・ <system.windows.forms jitDebugging="true" /> 設定2:レジストリ 倒なので、私はWinDbgの起動までの レジストリエディタを起動し、HKEY_ 作業を行なうバッチファイルを作り、デ LOCAL_MACHINE¥SOFTWARE¥Mic スクトップにそのバッチファイルのショ rosoft¥.NETFrameworkキーのDbgJIT ートカットを用意している。これで、あ DebugLaunchSettingの値を「0」にす とは起動した WinDbgで「.load sos」 る。 2005 July 179
© Copyright 2024 Paperzz