アセンブリ モードでのデバッグ
アプリケーションの C または C++ ソース ファイルがある場合、ソース モードでデバッグするとデバッガーをより強力に使用できます。
ただし、ソース デバッグを実行できないことはよくあります。 アプリケーションのソース ファイルがないことがあります。 他のユーザーのコードをデバッグしている場合があります。 完全な .pdb シンボルを使用して実行可能ファイルをビルドしていない可能性があります。 また、アプリケーションでソース デバッグを実行できる場合でも、アプリケーションが呼び出す Microsoft Windows ルーチンや、アプリケーションの読み込みに使用される Microsoft Windows ルーチンのトレースが必要な場合があります。
このような状況では、アセンブリ モードでデバッグする必要があります。 さらに、アセンブリ モードには、ソース デバッグには存在しない有用な機能が多数あります。 デバッガーは、メモリ位置の内容を自動的に表示し、アクセスされたときに登録し、プログラム カウンターのアドレスを表示します。 この表示により、アセンブリ デバッグは、ソース デバッグと共に使用できる貴重なツールになります。
逆アセンブリ コード
デバッガーは、主に実行可能なバイナリ コードを分析します。 デバッガーはこのコードを未加工の形式で表示する代わりに、コードを逆アセンブルします。 つまり、デバッガーはコードをマシン言語からアセンブリ言語に変換します。
結果のコード (逆アセンブリ コードと呼ばれます) は、いくつかの方法で表示できます。
u (逆アセンブル) コマンドは、マシン言語の指定されたセクションを逆アセンブルして表示します。
uf (関数の逆アセンブル) コマンドは、関数を逆アセンブルして表示します。
up (物理メモリからの逆アセンブル) コマンドは、物理メモリに保存されたマシン言語の指定されたセクションを逆アセンブルして表示します。
ur (リアル モード BIOS の逆アセンブル) コマンドは、指定された 16 ビット リアルモード コードを逆アセンブルして表示します。
ux (x86 BIOS の逆アセンブル) コマンドは、指定されたアドレスにある x86 ベースの BIOS コードの命令セットを逆アセンブルして表示します。
(WinDbg のみ) [逆アセンブリ] ウィンドウには、マシン言語の指定されたセクションが逆アセンブルされて表示されます。 このウィンドウは、[ウィンドウ] メニューで [逆アセンブリを自動的に開く] コマンドを選択すると自動的にアクティブになります。 このウィンドウは、[表示] メニューで [逆アセンブリ] を選択するか、Alt + 7 キーを押すか、[逆アセンブル (alt + 7)] ボタンを押しても開くことができます。
逆アセンブリの結果は、アドレス オフセット、バイナリ コード、アセンブリ言語ニーモニック、およびアセンブリ言語の詳細の 4 つの列で表示されます。 以下の例にこの表示を示します。
0040116b 45 inc ebp
0040116c fc cld
0040116d 8945b0 mov eax,[ebp-0x1c]
現在のプログラム カウンターを表す行の右側に、アクセスされているメモリ位置またはレジスタの値が表示されます。 この行に分岐命令が含まれている場合、表記 [br=1] または [br=0] が表示されます。 この表記は、それぞれ分岐が取得されている、または取得されていないことを示します。
.asm (逆アセンブリ オプションの変更) コマンドを使用すると、逆アセンブルされた命令の表示方法を変更できます。
WinDbg の [逆アセンブリ] ウィンドウでは、現在のプログラム カウンターを表す行が強調表示されます。 ブレークポイントが設定されている行も強調表示されます。
以下のコマンドを使用して、アセンブリ コードを操作することもできます。
# (逆アセンブリ パターンの検索) コマンドは、メモリの領域で特定のパターンを検索します。 このコマンドは、逆アセンブリ表示の 4 つの列を検索することと同じです。
a (アセンブル) コマンドは、アセンブリ命令を受け取り、それらをバイナリ マシン コードに変換できます。
アセンブリ モードとソース モード
デバッガーには、アセンブリ モードとソース モードという 2 つの異なる動作モードがあります。
アプリケーションをシングル ステップ実行しているとき、1 つのステップのサイズは、モードに応じて 1 行のアセンブリ コードまたは 1 行のソース コードです。
いくつかのコマンドでは、モードに応じて異なるデータ表示が作成されます。
WinDbg では、アセンブリ モードでアプリケーションを実行またはステップ実行すると、[逆アセンブリ] ウィンドウが自動的にフォアグラウンドに移動します。 ソース モードでは、[ソース] ウィンドウがフォアグラウンドに移動します。
モードを設定するには、以下のいずれかの操作を行います。
l+, l- (ソース オプションの設定) コマンドを使用してモードを制御します。 l-t コマンドは、アセンブリ モードをアクティブにします。
(WinDbg のみ) [デバッグ] メニューの [ソース モード] コマンドをクリアして、デバッガーをアセンブリ モードにします。ツール バーの [ソース モード オフ] ボタンを選択することもできます。
WinDbg では、アセンブリ モードのとき、ASM がステータス バーに表示されます。
WinDbg の [逆アセンブリ] ウィンドウのショートカット メニューには、現在のソース行から命令を強調表示する コマンドが含まれています。 このコマンドは、現在のソース行に対応するすべての命令を強調表示します。 多くの場合、1 つのソース行が複数のアセンブリ命令に対応します。 コードが最適化されている場合、これらのアセンブリ命令が連続していないことがあります。 現在のソース行から命令を強調表示する コマンドを使用すると、現在のソース行からアセンブルされたすべての命令を見つけることができます。
アセンブリ言語のソース ファイル
アプリケーションがアセンブリ言語で記述されている場合、デバッガーによって生成される逆アセンブリが元のコードと正確に一致しない可能性があります。 特に、操作なしとコメントは存在しません。
元の .asm ファイルを参照してコードをデバッグする場合は、ソース モードのデバッグを使用する必要があります。 アセンブリ ファイルは、C または C++ ソース ファイルのように読み込むことができます。 この種のデバッグの詳細については、「ソース モードでのデバッグ」を参照してください。