GDBは、 ユーザ・プログラムのソース・コードの一部を表示することができます。 これは、 プログラムの中に記録されているデバッグ情報によって、 そのプログラムをビルドするのに使用されたソース・ファイルを GDBが知ることができるからです。 ユーザ・プログラムが停止すると、 GDBは自発的にプログラムが停止した行を表示します。 同様に、 ユーザがあるスタック・フレーム (フレームの選択参照) を選択すると、 そのフレームにおいて実行が停止している行をGDBは表示します。 明示的にコマンドを使用することで、 ソース・ファイルの他の部分を表示することも可能です。
GNU Emacsインターフェイス経由でGDBを使用しているユーザは、 Emacsの提供する機能を使ってソース・ファイルを参照する方を好むかもしれません。 これについては、 GNU Emacsの中でのGDBの使い方 を参照してください。。
ソース・ファイル内の行を表示するには、
list
コマンド
(省略形はl
)
を使用します。
デフォルトでは、
10行が表示されます。
ソース・ファイルのどの部分を表示するかを指定する方法がいくつかあります。
最もよく使われるlist
コマンドの形式を以下に示します。
list linenum
list function
list
list
コマンドによって表示されたのであれば、
その最後の行の次の行以降が表示されます。
しかし、
既に表示された最後の行が、
スタック・フレーム
(スタックの検査参照)
の表示の一部として1行だけ表示されたのであれば、
その行の前後の行が表示されます。
list -
list
コマンドを上記の形式のいずれかによって実行すると、
GDBはデフォルトでは10行のソース行を表示します。
これはset listsize
コマンドによって変更することができます。
set listsize count
list
コマンドで表示される行数をcountに設定します
(list
コマンドの引数で他の値が明示的に指定された場合は、
この設定は効力を持ちません)。
show listsize
list
コマンドが表示する行数を表示します。
list
コマンドを実行後、
RETキーによってlist
コマンドを実行した場合、
引数は破棄されます。
したがって、
これは単にlist
と入力して実行したのと同じことになります。
同じ行が繰り返し表示されるよりも、
この方が役に立つでしょう。
ただし、
引数`-'は例外となります。
この引数は繰り返し実行の際にも維持されるので、
繰り返し実行することで、
ソース・ファイルの内容がさかのぼって表示されていきます。
一般的には、
list
コマンドは、
ユーザによって0個、
1個、
または2個の行指定(linespec)が与えられることを期待しています。
ここで行指定とは、
ソース行を指定するものです。
いくつかの記述方法がありますが、
いずれも結果的には何らかのソース行を指定するものです。
list
コマンドの引数として使用できるものの完全な説明を以下に示します。
list linespec
list first,last
list ,last
list first,
list +
list -
list
以下に、 ソースの特定の1行を指定する方法を示します。 これは、 いずれも行指定です。
number
list
コマンドの引数に2つの行指定がある場合、
2つめの行指定は、
最初の行指定と同一のソース・ファイルを指定します。
+offset
list
コマンドにおいて、
これが2つめの行指定として使用される場合、
最初の行指定からoffsetで指定される行数だけ下の行を指定します。
-offset
filename:number
function
filename:function
*address
カレントなソース・ファイル内において正規表現による検索を行うためのコマンドが2つあります。
forward-search regexp
search regexp
list
コマンドによって表示された行の1つ下の行から、
1行ずつ正規表現regexpによる検索を行います。
正規表現にマッチするものが見つかると、
その行を表示します。
`search regexp'という同義のコマンドを使うこともできます。
コマンド名は、
省略してfo
とすることができます。
reverse-search regexp
list
コマンドによって表示された行の1つ上の行から、
1行ずつ逆方向に向かって正規表現regexpによる検索を行います。
正規表現にマッチするものが見つかると、
その行を表示します。
コマンド名は、
省略してrev
とすることができます。
実行形式プログラムは、 それがコンパイルされたソース・ファイルの名前だけを記録して、 ソース・ファイルの存在するディレクトリ名を記録しないことがあります。 また、 ディレクトリ名が記録された場合でも、 コンパイル時とデバッグ時との間に、 そのディレクトリが移動してしまっている可能性があります。 GDBは、 ソース・ファイルを検索すべきディレクトリの一覧を持っています。 これは、 ソース・パスと呼ばれます。 GDBは、 ソース・ファイルが必要なときにはいつでも、 それが見つかるまで、 このリストの中のすべてのディレクトリを、 リストの中に記述されている順に探します。 実行ファイルのサーチ・パスは、 この目的では使用されないことに気をつけてください。 またカレントな作業ディレクトリも、 それがたまたまソース・パスの中にある場合を除けば、 この目的で使用されることはありません。
GDBがソース・パスの中でソース・ファイルを見つけることができない場合、 プログラムがディレクトリ名を記録してあれば、 そのディレクトリも検索されます。 ソース・パスにディレクトリの指定がなく、 コンパイルされたディレクトリの名前も記録されていない場合、 GDBは最後の手段としてカレント・ディレクトリを探します。
ソース・パスを空にした場合、 または、 再調整した場合、 ソース・ファイルを見つけた場所や個々の行のファイル内の位置のような、 GDBが内部でキャッシュしている情報は消去されます。
GDBを起動した時点では、
ソース・パスには`cdir'と`cwd'だけが指定されています。
`cdir'のほうが前に指定されています。
他のディレクトリをソース・パスに追加するには、
directory
コマンドを使用してください。
directory dirname ...
dir dirname ...
directory
show directories
ソース・パスの中に、 不要となってしまったディレクトリが混在していると、 GDBが誤ったバージョンのソースを見つけてしまい、 混乱をもたらすことがあります。 以下の手順によって、 正常な状態にすることができます。
directory
コマンドを引数なしで実行します。
directory
コマンドに適切な引数を指定して実行します。
すべてのディレクトリを、
1回のコマンド実行で追加することができます。
info line
コマンドを使用してソース行をプログラム・アドレスに
(あるいは、
プログラム・アドレスをソース行に)
対応付けすることができます。
また、
disassemble
コマンドを使用して、
あるアドレス範囲をマシン命令として表示することもできます。
GNU Emacsモードで実行されている場合、
info line
コマンドは指定された行を示す矢印を表示します。
また、
info line
コマンドは、
アドレスを16進形式だけではなくシンボリック形式でも表示します。
info line linespec
list
コマンド
(ソース行の表示参照)
が理解できる任意の形式によってソース行を指定することができます。
例えば、
info line
コマンドによって、
関数m4_changequote
の最初の行に対応するオブジェクト・コードの位置を知ることができます。
(gdb) info line m4_changequote 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'を実行するだけで十分となります
(メモリの調査参照)。
また、
このアドレスはコンビニエンス変数$_
の値として保存されます
(コンビニエンス変数参照)。
disassemble
以下の例は、 あるアドレス範囲の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 disassembly-flavor instruction-set
disassemble
コマンドまたはx/i
コマンドによってプログラムの逆アセンブルを行う際に使用する
命令セットを選択します。
現在のところ、
このコマンドは、
Intel x86ファミリに対してのみ定義されています。
instruction-setは、
intel
とatt
のいずれかにセットすることができます。
デフォルトはatt
です。
これは、
x86ベースのターゲット用のUNIXアセンブラがデフォルトで使用している
AT&T仕様のスタイルです。