Windowsデバッグツール、adplusとntsd.exe

 
Windowsのとあるプロセスに対してデバックをすることになったのでメモしました。
プロセスをデバックするのに必要となったツールがntsd.exeというコマンド。
ntsd.exeとはなんだろうか?
他のキーワードとして、adplusといったキーワードもある。
デバックの仕方ももちろんのこと、調べてみることにした。

ntsdとは?ntsd.exeとは?

Windows Server 2003 より前バージョンのWindowsには、標準でntsd.exeというWindowsデバックツールが存在する。
Windows Server 2008 には標準では存在しないコマンドであることがわかった。

Windows の Symbolic Debugger(シンボリックデバッカー)と言われている。
Linuxでいうところのgdbコマンドになります

Windows Server 2008 上でntsdを実行するために必要なもの、WDK

WDKの入手・インストール
(2010/03時点で、WDK 7.1.0)

WDKとは、Windows Driver Kit の略である。
WDK には、ソフトウェア開発者がドライバーやカーネル ソフトウェアを作成するために使用するヘッダー、ライブラリ、ビルド ツール、ビルド環境、コード サンプル、ドキュメント、その他のツールが含まれています。

WDK(Windows Driver Kit)内の、[Debugging Tools for Windows]コンポーネントにntsd.exeが含まれている。
インストールされるフォルダは標準で
C:\WinDDK
ntsd.exe が配置されているフォルダは
C:\WinDDK\7600.16385.1\Debuggers
でした。

Windows Driver Kit (WDK)のDebugging Tools for Windows インストール手順

ダウンロードしたISOを展開します。
[KitSetup.exe] を実行します
[Debugging Tools for Windows] を選択し、[OK]を押します
インストールパスを確定し、[OK]を押します。
[Finish]ボタンで完了です。

インストールされ、コマンドが配置されているフォルダに
C:\WinDDK\7600.16385.1\Debuggers
Path(パス)は通っていません。

Windows上での、ユーザープロセスダンプの採取手順 (ntds.exe)

サンプルとして、sample.exe のプロセスダンプの採取手順とします。
sample.exeは既に実行中で、
ntsd.exe の実行まえにコマンドプロンプトのプロンプトを、ntsd.exeが配置されているパスへ移動します。
> cd "C:\WinDDK\7600.16385.1\Debuggers"

[1] Windows の Symbolic Debugger (ntsd.exe) を、以下の例のとおりにコマンドプロンプトより実行していただき、sample.exe にアタッチします。

実行例:
> ntsd -g -x -loga C:\ntsd-sample.log -pn sample.exe

[2] sample.exe が停止・ハングするような現象を再現させます。

[3] 「セカンドチャンス (*)」で停止しましたら、以下の例のように.dump コマンドを入力し、プロセスダンプを出力します。

出力例と実行例
-----
出力例:

 (17d0.2d4): Access violation - code c0000005 (first chance)
  (17d0.2d4): Access violation - code c0000005 (!!! second chance !!!)  <== セカンドチャンス (*)
  eax=03f100e8 ebx=00000030 ecx=0000000c edx=00000030 esi=00000000 edi=03f100e8
  eip=019437ed esp=00e8c748 ebp=00e8c7f0 iopl=0         nv up ei pl nz na po nc
  cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
  beclass!Copy+12d:
  019437ed f3a5            rep  movsd ds:00000000=???????? es:03f100e8=00000000
  0:018>
-----
実行例:

  0:018> .dump /f c:\sample.dmp
  Creating c:\sample.dmp - user full dump
-----

[4] ダンプ出力が完了しましたら、.detach コマンドを入力し、ntsd を終了します。

「C:\」に出力・保存されている「C:\sample.dmp」と「C:\ntsd-sample.log」がユーザープロセスの解析用デバックログ(シンボリックデバックログ、ユーザープロセスメモリダンプファイル)になります。


Windows シンボリックデバッガは他にもある。

シンボリックデバッガには NTSD (ntsd.exe) と CDB (cdb.exe) の 2 種類あります。
コマンドプロンプトから起動したとき、新しいウィンドウで起動するのが NTSD でコマンドプロンプト内で実行するのが CDB です。
この二つはそれくらいの違いしかありません。

デバッグの基本

デバッグされるプログラムのことを一般的にデバッギ (debuggee) あるいはターゲットアプリケーション (target application) といいます。
デバッグするプログラムをデバッガ (debugger) といいます。
ターゲットアプリケーションにデバッガを接続することを、デバッガをアタッチ (attach) するといいます。
ターゲットアプリケーションからデバッガを切断することを、デバッガをデアタッチ (detach) するといいます。
プロセスの使用しているユーザーメモリ情報を取得することをメモリダンプといいます。

では、adplusとは?adplus機能?

ADPlus は、コンソール ベースの Microsoft Visual Basic スクリプトです。
このスクリプトは Microsoft CDB デバッガを自動化し、1 つ以上のプロセスからのデバッグ出力を含むメモリ ダンプとログ ファイルを生成します。
これらのデバッグ情報 (メモリ ダンプおよびデバッグ情報を含むテキスト ファイル) は、ADPlus が実行されるたびに、ローカル ファイル システムまたはリモート ネットワーク共有上の、一意の名前を持つ新しいフォルダ (C:\Temp\Crash_Mode__Date_01-22-2001__Time_09-41-08AM など) に作成されます。
また、ADPlus によって作成される各ファイルには、古いファイルが新しいファイルで上書きされることのないように、一意の名前 (PID-1708__Inetinfo.exe__Date_01-22-2001__Time_09-41-08AM.log など) が付けられます。


つまり、cdb(ntdsも同等)を使用し自動でメモリダンプとログファイルを作成してくれるツールとなります。
「Windows上での、ユーザープロセスダンプの採取手順 (ntds.exe)」と同等を自動で行ってくれるツールと言うことですね。
(Windowsでデバッグを行うツールの総称・機能をadplusツール・adplus機能と言っている場合もあります)

Windowsで使用されるデバッガ

Windows では、カーネル モードまたはユーザー モードの例外をデバッグするために利用できる、いくつかのデバッガが提供されています。
Windows で使われる主なデバッガには、KD (i386KD、MIPSKD、AlphaKD)、NTSD、および WinDbg の 3 つがあります。

KD

KD はカーネル デバッガです。
これは別のデバッグ マシンで動作し、テスト マシン上のカーネルおよびカーネル モード ドライバの問題を発見するために使われます。

NTSD

NTSD は、テスト マシン上のユーザー モード プロセスをデバッグするための "ソフトウェア デバッガ" です。
NTSD は、%WINDIR%\SYMBOLS ディレクトリにあるシンボルを使用します。
(Windows シンボル パッケージは WDK には含まれていません。Windows シンボル パッケージのダウンロード)
通常、ユーザー モードの問題をデバッグするには、DLL ファイルと EXE ファイルのシンボルが必要です。
NTSD (および WinDbg) の便利な機能の 1 つに、実行中のプロセスにアタッチできるという点があります。
TLIST または PVIEWER を使用して既存のプロセスのプロセス ID を取得した後、"NTSD -p <pid>" を実行することにより、そのプロセスをデバッグできます。

WinDbg

WinDbg は Windows ベースのデバッガで、カーネルまたはユーザー モードのいずれのデバッグにも利用できます。
これはテキスト ベースのデバッガに比べてサイズが大きく、多少低速ですが、いくつかの機能が追加されており、ソースレベルのデバッグやクラッシュ ダンプ ファイルの読み込みが可能です。


Windows Server 2008 ではタスクマネージャを使用しユーザー モード プロセス ダンプを取得する方法がある

Microsoft Windows Server 2008 では、Windows エラー報告 (WER) の機能によりミニ ダンプ、ヒープ ダンプのみの取得が可能となります。

なお、作成されるダンプ ファイルのおおよそのサイズは、パフォーマンス モニタを使用して確認することができます。
パフォーマンス オブジェクト として [Process]、カウンタとして [Virtual Bytes] を選択し、インスタンスとしてユーザー モード プロセス ダンプの採取対象のプロセス名を指定します。
表示される数値は、おおよそのサイズになります。
  1. タスク バー上の空いている場所を右クリックして [タスク マネージャ] をクリックするか、CTRL + SHIFT + ESC キーを押下して [タスク マネージャ] を起動します。
  2. [プロセス] タブをクリックします。
  3. ダンプを取得するプロセス名を右クリックし、[ダンプ ファイルの作成] をクリックします。 
    管理者パスワード、または確認を求められる場合、[続行] をクリックします。
  4. 環境変数 TMP または TEMP で示されるディレクトリにダンプ ファイルが作成されます。 通常は以下のディレクトリに作成されます。
    C:\Users\ユーザー名\AppData\Local\Temp


サブページ リスト

更新日:2010/03/30
Comments