[NT]Windows NT デバッグ シンボルの確認方法

概要

カーネル デバッグ (I386KD.EXE | WINDBG.EXE) を起動した後で、Windows NT デバッグ シンボルを確認する必要があります。デバッグはプロンプトをロードして表示しますが、シンボルが不適切だと、その後のデバッギング コマンドは、適切な機能と変数を参照しないため、散発的な結果が導かれません。下記のリストは、シンボルの正確性をチェックするための 2、3 個の赤いフラッグと何組かの方法です。

詳細

この資料はカーネル デバッグが MEMORY.DMP ファイルを実行していて MEMORY.DMP ファイルをロードしている、またはリモート マシンに接続されていると仮定しています。表示されたコマンドは、完全に文書化されていませんが、出力からの影響だけは表示されています。

資料の内容

  • カーネル デバッグをロードする
  • !drivers を使用して作成時間をチェックする
  • 作成時間をチェックするために LINK.EXE を使用する
  • ファンクションを逆アセンブルする
  • サービス パックのシンボル

カーネル デバッグをロードする

カーネル デバッグの通常のロードは、以下のプロンプトのうち 1 つを表示します。
     kd>      Uniprocessor System
0: kd> Multiprocessor System
下記で表示されたプロンプトは、NTOSKRNL.EXE のシンボル ファイルが不正であることを示しています。適切なマルチプロセッサまたはユニプロセッサのカーネルや HAL が、3 つのシンボルにコピーされていることを確認してください。

例:

Symbol search path is: C:\symbols
kd: crash dump initialized [c:\dump\memory.dmp]
cound not determine the current processor, using zero
Kernel Version 1057 Free loaded @ 0x80100000
Bugcheck 0000001e : c0000005 80151d5b 00000000 00000001
*** Contents Deleted ***
16kd>
カーネル デバッグが MEMORY.DMP ファイルをロードするとき、最初の数行にプロセッサ コートとカーネル バージョンが表示されます。プロセッサ コートが適切なカーネルと HAL に対応していることを確認してください。シンボルがロードされる、または延期されると、ドライブ シンボル情報が表示されます。

ロードのサンプル:

Symbol search path is: C:\symbols
kd: crash dump initialized [c:\dump\memory.dmp]
Kernel Version 1057 Free loaded @ 0x80100000
Bugcheck 0000001e : c0000005 80151d5b 00000000 00000001
re-loading all kernel symbols
KD: unloading symbols for "ntoskrnl.exe"
KD: deferring symbol load for "ntoskrnl.exe" at 80100000
KD: Loaded (2248) fpo entries for image (ntoskrnl.exe)
KD: "ntoskrnl.exe" loaded 4074 symbols (80100000-801bbb80)
KD: loaded symbols for "ntoskrnl.exe"
KD: deferring symbol load for "atapi.sys" at fc810000
KD: deferring symbol load for "diskdump.sys" at fc800000
KD: deferring symbol load for "hal.dll" at 80400000
KD: deferring symbol load for "atapi.sys" at 80010000
KD: deferring symbol load for "SCSIPORT.SYS" at 80013000
KD: deferring symbol load for "Atdisk.sys" at 80001000
KD: deferring symbol load for "Scsidisk.sys" at 8001b000
KD: deferring symbol load for "Fastfat.sys" at 80372000
Unable to read image header for Floppy.SYS at fc820000 - status c0000001
*** Contents Deleted ***
KD: deferring symbol load for "srv.sys" at fc9e0000
KD: deferring symbol load for "ntdll.dll" at 77f80000
finished re-loading all kernel symbols
NT!_PspUnhandledExceptionInSystemThread+0x18:
80131ff8 b801000000 mov eax,0x1
kd>
カーネル デバッグが "Unable to read image header for Floppy.SYS at fc820000 - status c0000001." ( fc820000 - status c0000001 で Floppy.SYS の画像ヘッダを読み込めません。) となりました。現在、特定のドライブ ヘッダがメモリ内にないため、このメッセージが表示されています。

!drivers を使用して作成時間をチェックする

!drivers コマンドを使用して、メモリ内に現在ロードされているドライブを一覧にします。ドライブの日付と時間、ロードされるかどうかのメモを作成してください。(コード サイズとデータ サイズの列は、この資料の幅に合わせて変えられています。)

kd> !drivers
Base Code Size Data Size Driver Name Creation Time
80100000 ntoskrnl.exe Fri May 26 18:18:36 1995
80400000 hal.dll Thu May 11 13:54:18 1995
80010000 atapi.sys Tue May 23 21:01:41 1995
80013000 SCSIPORT.SYS Fri May 05 23:11:06 1995
80001000 Atdisk.sys Fri May 05 23:10:40 1995
8001b000 Scsidisk.sys Fri May 05 23:11:01 1995
80372000 Fastfat.sys Mon May 22 23:57:13 1995
fc820000 Floppy.SYS Header Paged Out
fc830000 Scsicdrm.SYS Wed May 10 21:57:03 1995
fc840000 Fs_Rec.SYS Header Paged Out
fc850000 Null.SYS Header Paged Out
fc860000 Beep.SYS Header Paged Out
fc870000 i8042prt.SYS Fri May 05 23:10:42 1995
fc880000 Mouclass.SYS Fri May 05 23:10:45 1995
fc890000 Kbdclass.SYS Fri May 05 23:10:44 1995
fc8b0000 VIDEOPRT.SYS Fri May 05 23:10:05 1995
fc8a0000 s3.SYS Fri May 19 21:18:06 1995
fc8c0000 vga.sys Fri May 05 23:10:10 1995
fc8d0000 Msfs.SYS Fri May 05 23:11:57 1995
fc8e0000 Npfs.SYS Fri May 05 23:11:40 1995
fc900000 NDIS.SYS Mon May 22 20:23:18 1995
fc8f0000 el59x.sys Fri Feb 10 16:18:09 1995
fc940000 TDI.SYS Fri May 05 23:13:09 1995
fc920000 nbf.sys Mon May 08 15:00:47 1995
fc950000 netbios.sys Fri May 05 23:13:19 1995
fc960000 Parport.SYS Header Paged Out
fc970000 Parallel.SYS Header Paged Out
fc980000 Serial.SYS Fri May 05 23:11:20 1995
fc990000 afd.sys Header Paged Out
fc9a0000 rdr.sys Wed May 17 17:18:16 1995
fc9e0000 srv.sys Wed May 24 21:56:59 1995
TOTAL: 1ab460 (1709 kb) 3b7c0 ( 237 kb) ( 0 kb 0 kb)
kd>
ファイルがコンパイルされた日付のファイルの作成時間に気を付けてください。ファイル マネージャを使用して WINNT\SYSTEM32\DRIVERS サブディレクトリを表示した時、その日付は、実際のファイル上の Date\Time Stamp には公開されていません。


Microsoft Developers Network (MSDN) を購読している、または Windows NT DDK (デバイス ドライブ キット) を持っている場合、DBG ファイルがドライブのコンパイル時に作成されたファイルと同じファイルであることを確認するために、LINK.EXE ユーティリティを使用できます。下記の例の "time date stamp" は、上記の netbios.sys の "作成時間" と同じになります。
  1. LINK -dump -headers \symbols\sys\netbios.dbg

Microsoft (R) COFF Binary File Dumper Version 3.00.5270
Copyright (C) Microsoft Corp 1992-1995. All rights reserved.

Dump of file netbios.dbg
4944 signature
0 flags
14C machine (i386)
306 characteristics
2FAAE94F time date stamp Fri May 05 23:13:19 1995
8D0B checksum of image
10000 base of image
70A0 size of image
** Contents Deleted **
!drivers コマンドは、ダンプ内の重要なテーブルが破壊されたというのではなく、以下のようなラインを作成するものです。ダンプをさらに分析することは不可能な場合があります。
Unable to read DosHeader at 0583002a - status 00000000

Unable to read DosHeader at 0587002a - status 00000000

Unable to read DosHeader at 0588002a - status 00000000

Unable to read DosHeader at 058a002a - status 00000000

Unable to read DosHeader at 058c002a - status 00000000

逆アセンブル

シンボル ファイルによって、カーネル デバッグは、機能と名前による包括的な変数に参照事項をつけられます。スポットは、それらの機能が適切に見えるかを確認するために、逆アセンブル機能の組み合わせをチェックします。多くの機能は、最適なコンパイルであり、下記の例に合わせる必要はありません。最適なコンパイル機能は、機能名のかっこ内の FPO によって識別できます。


通常、機能は "push ebp" または "mov eax, fs[000000000]" で始まります。マシン語の基本的な知識と経験があれば、以下を認識できます。
  1. ロード モジュールを一覧にします。

    x *!
  2. ntoskrnl.exe など、特定のモジュールのシンボルを一覧にします。

    x nt!*
  3. 最適なコンパイルではないファンクションを逆アセンブルするために選択する

u NT!_NtUnlockFile

正しいシンボルの例


kd> u NT!_NtUnlockFile
u NT!_NtUnlockFile
NT!_NtUnlockFile:
80156bd8 64a100000000 mov eax,fs:[00000000]
80156bde 55 push ebp
80156bdf 8bec mov ebp,esp
80156be1 6aff push 0xff
80156be3 68200d1080 push 0x80100d20
80156be8 68304f1380 push 0x80134f30
80156bed 50 push eax
80156bee 64892500000000 mov fs:[00000000],esp
kd>
逆アセンブルは上記のテキストに似ています。しかし、逆アセンブルは変更しだいです。逆アセンブルが適切であれば、そのモジュールのシンボルは適切にロードされたと仮定できます。


以下の逆アセンブルは "jnz NT!_NTUnlockFile+0x22." で始まるものです。明らかに、機能は jump 命令コードでは始まっていません。もう一度シンボル ツリーを確認してください。

正しくないシンボルの例


kd> u NT!_NTUnlockFile
u NT!_NTUnlockFile
NT!_NtUnlockFile:
801574a4 7520 jnz NT!_NtUnlockFile+0x22 (801574c6)
801574a6 6a00 push 0x0
801574a8 8d45dc lea eax,[ebp-0x24]
801574ab 50 push eax
801574ac 53 push ebx
801574ad ff356c361480 push dword ptr [NT!_CcNoDelay+0x4 (8014366c)]
801574b3 6a01 push 0x1
801574b5 ff7508 push dword ptr [ebp+0x8]

サービス パック シンボル

シンボルを特定のインストールに合わせることが困難な場合があります。ある時点では、Windows NT インストール用 CD-ROM からのファイルのコピーに必要なサービスや、サービス パックを使って更新したファイルにコピーされたサービスを追加できます。Windows NT インストール用 CD-ROM からファイルをコピーするシステムの設定を変更した後は、必ずサービス パックとサード パーティ製のサポート ディスクを再適用してください。シンボルはインストール時と同じ順序で適用される必要があります。

追加情報

カーネル デバッグの方法に関する一連の資料は、debugref と入力して検索を行ってください。

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID
148660 (最終更新日 1997-12-05) をもとに作成したものです。


プロパティ

文書番号:148660 - 最終更新日: 2004/01/28 - リビジョン: 1

フィードバック