ファイルの内容を正確に16進数表示でダンプ出力させて調査するには、Windows OS付属のdebugコマンドが利用できる。ただしMS-DOS時代のデバッガなので制約が多い。ダンプ出力には[d]コマンドを繰り返し実行する。
対象OS:Windows 2000/Windows XP/Windows Server 2003
システムのトラブル・シューティングや各種設定の確認作業などにおいて、ファイルの内容を正確に確認したいことがある。例えば、アプリケーションが出力したデータ・ファイルの内容が一部化けていたり、欠落していて正しく読めない、バイナリ・データが含まれている、サイズが期待したものとはわずかに異なる、何かおかしな文字コードや制御コードが入っているようだなど、といった場合、その内容を正確に調査するには、ファイルの内容を16進数でダンプ(出力)できるとありがたい。
しかしWindows OSには、ファイルの内容を表示するツールとしてはテキスト・エディタ(メモ帳)ぐらいしか用意されていない。メモ帳でバイナリ・ファイルを開いた場合、不明なデータ(文字コード)の部分は文字化けして表示されるし、1byteごとに16進数で表示してくれるわけでもないので、内容を正確に把握するのは困難である。
だが非常に機能は限られるものの、「debug」コマンドを使えば、その内容を16進数でダンプ出力させることは可能である。本TIPSでは、debugコマンドでファイルの内容を16進出力させる方法について、簡単に解説する。
debugは、いわゆるデバッガと呼ばれるソフトウェアであり、主にマシン語レベルでのデバッグ作業に利用されるツールである。これはMS-DOSの時代から使われているコマンドであるが、Windows OS時代になってからはほとんど使われなくなっている(今でもWindows OSに同梱されているが)。だがファイルの内容を16進ダンプ出力させるといった用途なら、これでも役に立つ。ただし非常に設計の古いプログラムであり、かなり機能制約があるので注意していただきたい。主な制約は次の通りである。
debugで(バイナリ)ファイルの内容を確認するためには、まずコマンド・プロンプトを開き、debugコマンドの引数として対象となるファイル名を与える。ただし、すでに述べたように、debugは8.3形式の短いファイル名しか解釈できないので、まず「dir /x」コマンドで短いファイル名を表示させ、それを引数として渡す必要がある。
C:\>dir ed* /x ……「/x」オプションで8.3形式のファイル名を確認する
ドライブ C のボリューム ラベルは NTFSSYSTEM です
ボリューム シリアル番号は 1C30-CE21 です
C:\ のディレクトリ
2006/07/24 14:29 8,192 EDB-20~1.CHK edb-20060724.chk
↑8.3形式 ↑長い形式
1 個のファイル 8,192 バイト
0 個のディレクトリ 6,899,363,840 バイトの空き領域
C:\>debug EDB-20~1.CHK
ここでは「edb-20060724.chk」というファイルの内容を確認しようとしているが、これは長い形式のファイル名なので、「dir /x」コマンドで8.3形式のファイル名を表示させている。
ファイル名が「EDB-20~1.CHK」であると確認できたので、これを引数としてdebugコマンドを起動する。
debugが起動すると、次のようなウィンドウが表示される。コマンド・プロンプトのウィンドウ・サイズが急に小さくなって80文字×25行になってしまうが、これは、debugが16bitコードのプログラムだからである。
ファイルが正しくオープンできるとこのようなウィンドウが表示されるが、ファイル名指定が間違ったり、オープンできない場合は「ファイルが見つかりません.」と表示されるので、[q]と[Enter]キーを押してdebugを終了し、もう1度やり直していただきたい。
16進数でダンプさせるためのコマンドは[d]である。[d]キーと[Enter]キーを押すと、128bytes分(1行16bytes×8行分)表示され、また入力待ちになる。
[d]コマンドには、ダンプする範囲を指定することもできるが(「d100 1000」などとする)、引数なしで[d]だけを繰り返し入力していれば、自動的に順次ダンプ出力される。
行き過ぎてしまった場合は、[d100]などとすれば、また0100のオフセット位置からダンプ出力させることができるが、面倒なら1度debugを終了してから、もう1度やり直してもよいだろう。
ダンプ結果は上の画面の通り、16bytesずつ区切られながら表示される。右側には(ASCIIコードによる)文字も表示されているので、文字データの内容を確認することも可能である。デフォルトでは、1bytes系のASCIIコードになっているが、[kk]コマンドを実行すると、以後は漢字コード(Shift-JISコード)で表示される。
内容の確認が終わったら、[q]と[Enter]キーを押せば、debugは終了する(qはquitの略)。また[?]コマンドでヘルプが表示されるし、[r]コマンドを使えば、読み込んだファイルの長さを16進数で確認することができる(この結果はdebugへの読み込み直後のみ有効。レジスタの内容を操作すると変更される)。
-r ……これは実はレジスタの内容を表示させるコマンド
AX=0000 BX=0000 CX=2000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2D97 ES=2D97 SS=2D97 CS=2D97 IP=0100 NV UP EI PL NZ NA PO NC
2D97:0100 3F AAS
-q ……終了コマンド。よく分からなくなったら[q]と[Enter]を押せばよい
C:\>
ファイルの長さは「BX=〜〜 CX=〜〜」と表示される(BXが上位16bit、CXが下位16bit)。この例では、「BX=0000 CX=2000」となっているので、「00002000(16進数)」=「8192(10進数)」ということが分かる。ファイルの先頭はオフセット「0100(16進数)」の位置から始まるので(0でないのは、OS側の事情による)、このファイル全体は「0100〜20FF(16進数)」の範囲に表示されることになる。この範囲よりも先をダンプすることもできるが、その内容に意味はない。
■関連記事(Windows Server Insider)
■更新履歴
【2006/07/29】ファイルの長さはCXだけでなく、BX:CXの32bitで保持されているという情報を加筆・修正しました。
【2006/07/29】初版公開。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.