SOS.DLLを利用した .NETアプリケーションの解析

株式会社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