前: Source Path, 上: Source


7.4 ソースとマシン・コード

info lineコマンドを使用してソース行をプログラム・アドレスに (あるいは、 プログラム・アドレスをソース行に) 対応付けすることができます。 また、 disassembleコマンドを使用して、 あるアドレス範囲をマシン命令として表示することもできます。 gnu Emacsモードで実行されている場合、 現在のinfo lineコマンドは、 指定された行を示す矢印を表示します。 また、 info lineコマンドは、 アドレスを16進形式だけではなくシンボリック形式でも表示します。

info line linespec
ソース行linespecに対応するコンパイル済みコードの開始アドレス、 終了アドレスを表示します。 listコマンド (see Printing source lines) が理解できる任意の形式によってソース行を指定することができます。

例えば、 info lineコマンドによって、 関数m4_changequoteの最初の行に対応するオブジェクト・コードの位置を知ることができます。

     (gdb) info line m4_changecom
     Line 895 of "builtin.c" starts at pc 0x634c and ends at 0x6350.

また、 (linespecの形式として*addrを使用することで) ある特定のアドレスがどのソース行に含まれているのかを問い合わせることができます。

     (gdb) info line *0x63ff
     Line 926 of "builtin.c" starts at pc 0x63e4 and ends at 0x6404.

info lineの実行後、 xコマンドのデフォルト・アドレスは、 その行の先頭アドレスに変更されます。 これにより、 マシン・コードの調査を開始するには`x/i'を実行するだけで十分となります (see Examining memory)。 また、 このアドレスはコンビニエンス変数$_の値として保存されます (see Convenience variables)。

disassemble
この特殊コマンドは、 あるメモリ範囲をマシン命令としてダンプ出力します。 デフォルトのメモリ範囲は、 選択されたフレームにおいてプログラム・カウンタが指している箇所を含む関数です。 このコマンドに引数を1つ渡すと、 それはプログラム・カウンタ値を指定することになります。 GDBは、 その値が指す箇所を含んでいる関数をダンプ出力します。 2つの引数を渡すと、 ダンプ出力するアドレス範囲 (1つめのアドレスは含まれますが、 2つめのアドレスは含まれません) を指定することになります。

以下の例は、 あるアドレス範囲のHP PA-RISC 2.0コードを逆アセンブルした結果を示しています。

     (gdb) disas 0x32c4 0x32e4
     Dump of assembler code from 0x32c4 to 0x32e4:
     0x32c4 <main+204>:      addil 0,dp
     0x32c8 <main+208>:      ldw 0x22c(sr0,r1),r26
     0x32cc <main+212>:      ldil 0x3000,r31
     0x32d0 <main+216>:      ble 0x3f8(sr4,r31)
     0x32d4 <main+220>:      ldo 0(r31),rp
     0x32d8 <main+224>:      addil -0x800,dp
     0x32dc <main+228>:      ldo 0x588(r1),r26
     0x32e0 <main+232>:      ldil 0x3000,r31
     End of assembler dump.

アーキテクチャによっては、 一般に使用される命令ニーモニックを複数持つものや、 異なる構文を持つものがあります。

set assembly-language instruction-set
disassembleコマンドまたはx/iコマンドによってプログラムの逆アセンブルを行う際に使用する 命令セットを選択します。

現在のところ、 このコマンドは、 Intel x86ファミリに対してのみ定義されています。 instruction-setは、 i386i8086のいずれかにセットすることができます。 デフォルトはi386です。