GDBは、 ユーザ・プログラムのソース・コードの一部を表示することができます。 これは、 プログラムの中に記録されているデバッグ情報によって、 そのプログラムをビルドするのにどのソース・ファイルが使用されたかをGDBが知ることができるからです。 ユーザ・プログラムが停止すると、 GDBは自発的にプログラムが停止した行を表示することができます。 同様に、 ユーザがあるスタック・フレーム (フレームの選択を参照) を選択すると、 そのフレームにおいて実行が停止している行をGDBは表示します。 明示的にコマンドを使用することで、 ソース・ファイルの他の部分を表示することも可能です。 GDBをGNU Emacsインターフェイス経由で使用しているユーザは、 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
以下に、 単一のソース行を指定する方法を示します。 これは、 いずれも行仕様です。
number
list
コマンドの引数に2つの行仕様がある場合、
この行仕様は最初の行仕様のソース・ファイルと同一のものを指定します。
+offset
list
コマンドにおいて、
これが第2の行仕様として使用される場合、
第1の行仕様から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の起動時には、
ソース・パスにはディレクトリの指定がありません。
ディレクトリをソース・パスに追加するには、
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_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'を実行するだけで十分となります
(メモリの調査を参照)。
また、
このアドレスはコンビニエンス変数$_
の値として保存されます
(コンビニエンス変数を参照)。
disassemble
disassemble
コマンドを使用して、
info line
コマンドを説明した際に示した例で表示されたオブジェクト・コードの範囲を検査することができます
(ここでは、
SPARCのマシン命令が示されています)。
(gdb) disas 0x63e4 0x6404 Dump of assembler code from 0x63e4 to 0x6404: 0x63e4 <builtin_init+5340>: ble 0x63f8 <builtin_init+5360> 0x63e8 <builtin_init+5344>: sethi %hi(0x4c00), %o0 0x63ec <builtin_init+5348>: ld [%i1+4], %o0 0x63f0 <builtin_init+5352>: b 0x63fc <builtin_init+5364> 0x63f4 <builtin_init+5356>: ld [%o0+4], %o0 0x63f8 <builtin_init+5360>: or %o0, 0x1a4, %o0 0x63fc <builtin_init+5364>: call 0x9288 <path_search> 0x6400 <builtin_init+5368>: nop End of assembler dump.
set assembly-language instruction-set
disassemble
コマンド、
もしくは、
x/i
コマンドによってプログラムの逆アセンブルを行う際に使う命令セットを選択します。
これは、
複数のネイティブ命令セットを持つアーキテクチャにおいて役に立ちます。
現在のところ、
これはIntel x86ファミリに対してのみ定義されています。
instruction-setはi386
もしくはi8086
に設定することができます。
デフォルトはi386
です。