ユーザ・プログラムの中のデータを調べる通常の方法は、
print
コマンド
(省略形はp
)、
またはそれと同義のコマンドである
inspect
コマンドを使用することです。
これは、
ユーザ・プログラムが記述された言語
(異なる言語の使い方参照)
による式を評価し、
その値を出力するものです。
print expr
print /f expr
print
print /f
データを調べるためのより低レベルの方法は、
x
コマンドを使うことです。
これは、
指定されたアドレスのメモリ上のデータを、
指定された形式で表示するものです。
メモリの調査
を参照してください。
型に関する情報に関心があるとき、
また、
構造体やクラスのフィールドがどのように宣言されているかという点に関心があるときは、
print
コマンドではなくptype exp
コマンドを使用してください。
シンボル・テーブルの検査
を参照してください。
print
コマンド、
および、
ほかの多くのGDBコマンドは、
式を受け取って、
その値を評価します。
ユーザの使用しているプログラミング言語によって定義されている定数、
変数、
演算子は、
いずれもGDBにおける式の中で有効です。
これには、
条件式、
関数呼び出し、
キャスト、
文字列定数が含まれます。
しかし、
プリプロセッサの#define
コマンドによって定義されるシンボルは、
残念ながら含まれません。
GDBは、
ユーザの入力する式において配列定数をサポートします。
その構文は{element, element...}です。
例えば、
コマンドprint {1, 2, 3}
を使用して、
ターゲット・プログラム内でmalloc()
によって獲得されたメモリ内に配列を作成することができます。
C言語は大変広汎に使用されているので、 このマニュアルの中で示される例の中のほとんどの式はC言語で記述されています。 他の言語での式の使い方に関する情報については、 異なる言語の使い方 を参照してください。
この節では、 プログラミング言語によらずGDBの式で使用できる演算子を説明します。
キャストは、 C言語のみならず、 すべての言語でサポートされています。 これは、 メモリ内のあるアドレスにある構造体を調べるのに、 数値をポインタにキャストするのが大変便利であるからです。
プログラミング言語によらず共通に使用可能な演算子に加えて、 GDBは以下の演算子をサポートしています。
@
::
{type} addr
最も一般的に使用される式は、 ユーザ・プログラム内部の変数名です。
式の中の変数は、 選択されたスタック・フレーム (フレームの選択参照) 内において解釈されます。 これは、 以下の2つのいずれかとなります。
あるいは
つまり、
以下の例において、
ユーザ・プログラムが関数foo
を実行中は、
変数a
を調べたり使用したりすることができますが、
変数b
を使用したり調べたりすることができるのは、
b
が宣言されているブロックの内部をユーザ・プログラムが実行中である場合に限られます。
foo (a) int a; { bar (a); { int b = test (); bar (b); } }
ただし、 これには1つ例外があります。 特定の1ソース・ファイルをスコープとする変数や関数は、 たとえ現在の実行箇所がそのファイルの中ではなくても、 参照することができます。 しかし、 このような変数または関数が (異なるソース・ファイル中に) 同じ名前で複数個存在するということがありえます。 このような場合、 その名前を参照すると予期できない結果をもたらします。 2つのコロンを並べる記法によって、 特定の関数またはファイルの中の静的変数を指定することができます。
file::variable function::variable
ここでfileまたはfunctionは、
静的変数variableのコンテキスト名です。
ファイル名の場合は、
引用符を使用することによって、
GDBがファイル名を確実に1つの単語として解釈するようにさせることができます。
例えば、
ファイル`f2.c'の中で定義されたグローバル変数x
の値を表示するには、
(gdb) p 'f2.c'::x
このような`::'の用途が、 これと非常によく似ているC++における`::'の用途と衝突することは非常に稀です。 GDBは、 式の内部においてC++のスコープ解決演算子の使用もサポートしています。
注意:ときどき、 新しいスコープに入った直後やスコープから出る直前に、 関数内部の特定の箇所から見ると、 ローカル変数の値が正しくないように見えることがあります。
マシン命令単位でステップ実行を行っているときに、 このような問題を経験することがあるかもしれません。 これは、 ほとんどのマシンでは、 (ローカル変数定義を含む) スタック・フレームのセットアップに複数の命令が必要となるからです。 マシン命令単位でステップ実行を行う場合、 スタック・フレームが完全に構築されるまでの間は、 変数の値が正しくないように見えることがあります。 スコープから出るときには、 スタック・フレームを破棄するのに、 通常複数のマシン命令が必要とされます。 それらの命令群の中をステップ実行し始めた後には、 ローカル変数の定義は既に存在しなくなっているかもしれません。
このようなことは、 コンパイラが重要な最適化を実施する場合にも、 発生する可能性があります。 常に正確な値が見えることを確実にするためには、 コンパイルの際に、 すべての最適化を行わないようにします。
コンパイラの最適化の結果として起こりえる別の可能性として、 使用されない変数が存在しなくなることや、 変数が (メモリ・アドレスにではなく) レジスタに割り当てられることがあります。 コンパイラの使用するデバッグ情報形式がこのような状況に対してどのようなサポートを提供しているかに応じて、 場合によっては、 そのようなローカル変数の値をGDBが表示できないということがありえます。 この場合、 GDBは次のようなメッセージを表示します。
No symbol "foo" in current context.
このような問題を解決するには、 最適化をせずに再コンパイルするか、 あるいは、 コンパイラがいくつかのデバッグ情報形式をサポートしているのであれば、 異なるデバッグ情報形式を使用します。 例えば、 GNU C/C++コンパイラであるGCCは通常、 `-gstabs'オプションをサポートしています。 `-gstabs'オプションは、 COFFなどよりも優れた形式でデバッグ情報を生成します。 また、 別の効率的なデバッグ情報形式であるDWARF-2 (`-gdwarf-2') を使用することもできます。 詳細については、 Using GNU CCの`Options for Debugging Your Program or GNU CC' を参照してください。
メモリ内に連続的に配置されている同一型のオブジェクトを表示することが役に立つことがよくあります。 配列の一部や動的にサイズの決定される配列にアクセスするのに、 そこへのポインタしかプログラム内部に存在しないような場合です。
これは、 2項演算子`@'を使用して、 連続したメモリ範囲を人工配列として参照することで可能です。 `@'の左側のオペランドは、 参照したい配列の最初の要素で、 かつ、 1個のオブジェクトでなければなりません。 また、 右側のオペランドは、 その配列の中の参照したい部分の長さでなければなりません。 結果は、 その要素がすべて左側の引数と同型である配列の値です。 第1の要素は左側の引数そのものです。 第2の要素は、 第1の要素を保持するメモリ域の直後のメモリ上から取られます。 これ以降の要素も同様です。 以下に例を示します。 プログラムが以下のようになっているとしましょう。
int *array = (int *) malloc (len * sizeof (int));
以下を実行することで、
array
の内容を表示することができます。
p *array@len
`@'の左側のオペランドは、 メモリ上に実在するものでなければなりません。 このような方法で`@'によって作成された配列の値は、 配列の添字付けの見地からは他の配列と同様に振る舞い、 式の中で使用された場合は強制的にポインタとして扱われます。 人工配列は、 一度表示された後、 値履歴 (値履歴参照) を通して式の中に現れることがよくあります。
人工配列を作成するもう1つの方法は、 キャストを使用することです。 これによって、 ある値を配列として解釈し直します。 この値は、 メモリ上に実在するものでなくてもかまいません。
(gdb) p/x (short[2])0x12345678 $1 = {0x1234, 0x5678}
ユーザの便宜を考慮して、 (例えば、 `(type[])value'のように) 配列の長さが省略された場合 その値を満たすサイズを (`sizeof(value)/sizeof(type)'のように) GDBが計算します。
(gdb) p/x (short[])0x12345678 $2 = {0x1234, 0x5678}
ときには、
人工配列の機構では十分でないことがあります。
かなり複雑なデータ構造では、
関心のある要素が連続的に並んでいないことがあります。
例えば、
配列の中のポインタの値に関心がある場合です。
このような状況において役に立つ回避策の1つに、
関心のある値のうち最初のものを表示する式の中のカウンタとしてコンビニエンス変数
(コンビニエンス変数参照)
を使用し、
RETキーによってその式を繰り返し実行することです。
例えば、
構造体へのポインタの配列dtab
があり、
個々の構造体のフィールドfv
の値に関心があるとしましょう。
以下に、
この場合の例を示します。
set $i = 0 p dtab[$i++]->fv RET RET ...
デフォルトでは、 GDBはデータの型にしたがって値を表示します。 ときには、 これが望ましくない場合もあります。 例えば、 数値を16進で表示したい場合やポインタを10進で表示したい場合があるでしょう。 あるいは、 メモリ内のある特定のアドレスのデータを文字列や命令として表示させたい場合もあるでしょう。 このようなことをするためには、 値を表示するときに出力フォーマットを指定します。
出力フォーマットの最も単純な使用方法は、
既に評価済みの値の表示方法を指定することです。
これは、
print
コマンドの最初の引数をスラッシュとフォーマット文字で開始することで行います。
サポートされているフォーマット文字は、
以下のとおりです。
x
d
u
o
t
a
(gdb) p/a 0x54320 $3 = 0x54320 <_initialize_vx+396>
c
f
例えば、 プログラム・カウンタの値を16進数で表示する (レジスタ参照) には、 以下を実行してください。
p/x $pc
スラッシュの前にはスペースが必要ではないことに注意してください。 これは、 GDBのコマンド名にはスラッシュを含めることができないからです。
値履歴の最後の値を異なる形式で再表示するには、
print
コマンドに対して式を指定せずにフォーマットだけを指定して実行します。
例えば、
`p/x'を実行すると最後の値を16進で再表示します。
コマンドx
(examineのx)
を使用することで、
ユーザ・プログラム内のデータ型にかかわらず、
メモリ上の値をいくつかの形式で調べることができます。
x/nfu addr
x addr
x
x
コマンドを使用してください。
n、 f、 uはいずれも、 どれだけのメモリをどのようにフォーマットして表示するかを指定するための、 必須ではないパラメータです。 addrは、 メモリの表示を開始するアドレスを指定する式です。 nfuの部分にデフォルトを使用するのであれば、 スラッシュ`/'は必要ありません。 いくつかのコマンドによって、 addrに対して便利なデフォルト値を指定することができます。
print
コマンドによって使用されるフォーマット、
`s'(NULL文字で終了する文字列)、
`i'(マシン命令)
のいずれかを指定します。
初期状態では、
デフォルトは`x'
(16進)
です。
デフォルトは、
x
コマンドまたはprint
コマンドを実行するたびに変更されます。
b
h
w
g
x
コマンド実行時に単位の大きさを指定するたびに、
その大きさが、
次にx
コマンドを実行する際のデフォルトになります
(フォーマット`s'および
`i'については、
単位の大きさは無視されます。
これらについては通常、
単位の大きさを指定しません)。
info breakpoints
(デフォルトは、
最後に表示されたブレイクポイントのアドレスに設定されます)、
info line
(デフォルトは、
行の先頭アドレスに設定されます)、
および、
print
コマンド
(メモリ内の値を表示するのに使用した場合)
です。
例えば、
`x/3uh 0x54320'は、
先頭アドレス0x54320
から始めて、
メモリ上の3個のハーフ・ワード
(h
)
の値を、
符号なし10進整数値
(`u')
としてフォーマットして表示するよう求める要求です。
また、
`x/4xw $sp'は、
スタック・ポインタ
(`$sp'については、
レジスタ参照)
の上位4ワード
(`w')
のメモリの内容を16進
(`x')
で表示します。
単位の大きさを示す文字と出力フォーマットを指定する文字とは異なるので、 単位の大きさとフォーマットのどちらが前にくるべきかを記憶しておく必要はありません。 どちらを先に記述しても動作します。 `4xw'という出力指定と`4wx'という出力指定とは、 全く同一の意味を持ちます (ただし、 繰り返し回数nは最初に指定しなければなりません。 `wx4'ではうまく動きません)。
単位の大きさuは、
フォーマット`s'および`i'については無視されますが、
繰り返し回数nを使用したいことがあるかもしれません。
例えば、
`3i'はオペランドも含めて3つのマシン命令を表示したいということを指定しています。
disassemble
コマンドは、
マシン命令を調べる別の方法を提供してくれます。
ソースとマシン・コードを参照してください。
x
コマンドへの引数のデフォルトはすべて、
x
コマンドを使用してメモリ上を連続的に参照するために最少の情報だけを指定すればよいように設計されています。
例えば、
`x/3i addr'によって3個のマシン命令を調べた後、
`x/7'とするだけで、
続く7個のマシン命令を調べることができます。
RETキーによってx
コマンドを繰り返し実行する場合は、
前回の繰り返し回数nが再度使用されます。
その他の引数も、
後続のx
コマンド使用時のデフォルトになります。
x
コマンドによって表示されるアドレスや内容は、
値履歴に保存されません。
これらの数がしばしば膨大になり、
邪魔になるからです。
その代わりにGDBは、
これらの値をコンビニエンス変数$_
および$__
の値として、
後続の式の内部で使用できるようにします。
x
コマンドを実行後、
最後に調べられたアドレスは、
コンビニエンス変数$_
の値として式の中で使用することができます。
また、
GDBによって調べられたそのアドレスの内容は、
コンビニエンス変数$__
の値として使用可能です。
x
コマンドに繰り返し回数が指定されている場合、
保存されるのは、
最後に表示されたメモリ単位のアドレスとその内容です。
これは、
最後の出力行にいくつかのメモリ単位が表示されている場合は、
最後に表示されたアドレス値と一致しません。
ある1つの式の値を (それがどのように変化するかを見るために) 頻繁に表示したい場合は、 その式を自動表示リストに加えて、 ユーザ・プログラムが停止するたびに、 GDBがその値を表示するようにするとよいでしょう。 リストに加えられた個々の式には、 それを識別するための番号が割り当てられます。 ある式をリストから削除する際に、 その番号を指定します。 自動表示は、 例えば以下のように表示されます。
2: foo = 38 3: bar[5] = (struct hack *) 0x3804
ここでは、
項目番号、
式、
および、
その式の現在の値が表示されます。
x
コマンドやprint
コマンドによって手作業で表示を要求する場合と同様、
好みの出力フォーマットを指定することができます。
実は、
display
コマンドは、
ユーザのフォーマットの指定の詳細度によって、
print
コマンドとx
コマンドのいずれを使用するかを決定しています。
単位の大きさが指定された場合や、
x
コマンドでしかサポートされていない2つのフォーマット
(`i'と`s')
のいずれかが指定された場合には、
x
コマンドが使用されます。
それ以外の場合は、
print
コマンドが使用されます。
display expr
display
コマンドは繰り返し実行されません。
display/fmt expr
display/fmt addr
例えば、 `display/i $pc'は、 ユーザ・プログラムが停止するたびに、 次に実行されるマシン命令を見るのに便利です (`$pc'は、 プログラム・カウンタを指すのに一般に使用される名前です。 レジスタ参照)。
undisplay dnums...
delete display dnums...
undisplay
コマンドを実行後にRETキーを押しても、
コマンドは再実行されません
(仮に再実行されてしまうとすると、
`No display number ...'というエラーになるだけです)。
disable display dnums...
enable display dnums...
display
info display
表示される式がローカル変数への参照を含む場合、
そのローカル変数がセットアップされているコンテキストの範囲外では、
その式は無意味です。
このような式は、
その中の変数の1つでも定義されないコンテキストが実行開始されると表示不可になります。
例えば、
引数last_char
を取る関数の内部でdisplay last_char
コマンドを実行すると、
その関数の内部でユーザ・プログラムが実行を停止し続ける間は、
GDBはこの引数を表示します。
ほかの箇所
(last_char
という変数が存在しない箇所)
で停止したときには、
自動的に表示不可となります。
次にユーザ・プログラムがlast_char
が意味を持つ箇所で停止したときには、
再びその式の表示を可能にすることができます。
GDBは、 配列、 構造体、 シンボルをどのように表示するかを制御するための方法を提供しています。
これらの設定は、どのプログラミング言語で記述されたプログラムのデバッグにも便利です。
set print address
set print address on
on
です。
例として、
set print address on
のときのスタック・フレームの表示結果を示します。
(gdb) f #0 set_quotes (lq=0x34c78 "<<", rq=0x34c88 ">>") at input.c:530 530 if (lquote != def_lquote)
set print address off
set print address off
のときに前の例と同一のスタック・フレームを表示すると、
以下のようになります。
(gdb) set print addr off (gdb) f #0 set_quotes (lq="<<", rq=">>") at input.c:530 530 if (lquote != def_lquote)`set print address off'を使用することで、 GDBのインターフェイスからマシンに依存する表示をすべて取り除くことができます。 例えば、
print address off
を指定してあれば、
ポインタ引数の有無にかかわらず、
すべてのマシン上において同一のバックトレース情報を得るはずです。
show print address
GDBがシンボリックなアドレスを表示する際には通常、
そのアドレスの前にある最も近い位置のシンボルと、
そのシンボルからのオフセットを表示します。
そのシンボルによってアドレスが一意に決まらない場合
(例えば、
単一のソース・ファイルを有効範囲とする名前である場合)
には、
確認の必要があるかもしれません。
1つの方法は、
例えば`info line *0x4537'のように、
info line
コマンドを実行することです。
または、
シンボリックなアドレスを表示するときに、
一緒にソース・ファイルや行番号を表示するようGDBを設定する方法もあります。
set print symbol-filename on
set print symbol-filename off
show print symbol-filename
シンボルのソース・ファイル名と行番号を表示するのが役に立つもう1つの状況として、 コードを逆アセンブルする場合があります。 GDBが、 個々の命令に対応する行番号とソース・ファイルを表示してくれます。
また、 アドレスをシンボリック形式で表示させるのは、 そのアドレスと、 そのアドレスより前にあるシンボルのうちそのアドレスに最も近い位置にあるものとが、 距離的に適度に接近している場合に限定させたいこともあるもでしょう。
set print max-symbolic-offset max-offset
show print max-symbolic-offset
あるポインタがどこを指しているか定かではない場合には、
`set print symbol-filename on'を試みてください。
こうすれば、
`p/a pointer'を使用して、
そのポインタが指している変数の名前とソース・ファイル上の位置が分かります。
これは、
アドレスをシンボリック形式で解釈します。
例えば以下の例では、
ある変数ptt
がファイル`hi2.c'内で定義された別の変数t
を指していることを、
GDBが教えてくれています。
(gdb) set print symbol-filename on (gdb) p/a ptt $4 = 0xe008 <t in hi2.c>
注意:ローカル変数を指すポインタについては、 たとえ適切な
set print
オプションが有効になっていても、 `p/a'はそのポインタによって参照される変数のシンボル名やファイル名を表示しません。
異なる種類のオブジェクトについては、 他の設定によって表示方法が制御されます。
set print array
set print array on
set print array off
show print array
set print elements number-of-elements
set print elements
コマンドで設定された数に達すると、
そこで表示が停止されます。
この上限は、
文字列の表示にも適用されます。
GDBの起動時に、
この上限は200にセットされます。
number-of-elementsに0をセットすると、
要素は無制限に表示されます。
show print elements
set print null-stop
set print pretty on
$1 = { next = 0x0, flags = { sweet = 1, sour = 1 }, meat = 0x54 "Pork" }
set print pretty off
$1 = {next = 0x0, flags = {sweet = 1, sour = 1}, \ meat = 0x54 "Pork"}これがデフォルトの形式です。
show print pretty
set print sevenbit-strings on
\
nnnという表記法で表示します。
この設定は、英語
(ASCII)
環境において、
文字の最上位ビットをマーカや「メタ」ビットとして使用する場合に最適です。
set print sevenbit-strings off
show print sevenbit-strings
set print union on
set print union off
show print union
typedef enum {Tree, Bug} Species; typedef enum {Big_tree, Acorn, Seedling} Tree_forms; typedef enum {Caterpillar, Cocoon, Butterfly} Bug_forms; struct thing { Species it; union { Tree_forms tree; Bug_forms bug; } form; }; struct thing foo = {Tree, {Acorn}};
set print union on
が有効な場合、
`p foo'は以下のような表示を行います。
$1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}また、
set print union off
が有効な場合、
`p foo'は以下のような表示を行います。
$1 = {it = Tree, form = {...}}
以下の設定は、 C++プログラムをデバッグしているときに関係があります。
set print demangle
set print demangle on
show print demangle
set print asm-demangle
set print asm-demangle on
show print asm-demangle
set demangle-style style
auto
gnu
g++
)エンコーディング・アルゴリズムに基づいてデコードします。
これがデフォルトです。
hp
aCC
)エンコーディング・アルゴリズムに基づいてデコードします。
lucid
lcc
)エンコーディング・アルゴリズムに基づいてデコードします。
arm
cfront
によって生成された実行モジュールをデバッグするのに十分ではありません。
これを可能にするためには、
GDBをさらに拡張する必要があります。
show demangle-style
set print object
set print object on
set print object off
show print object
set print static-members
set print static-members on
set print static-members off
show print static-members
set print vtbl
set print vtbl on
vtbl
コマンドは、
HP ANSI C++コンパイラ(aCC
)
によってコンパイルされたプログラムに対しては、
機能しません。)
set print vtbl off
show print vtbl
print
コマンドにより表示された値は、
GDBの
値履歴に保存されます。
これによりユーザは、
これらの値をほかの式の中で参照することができます。
値は、
シンボル・テーブルが
(例えば、
file
コマンドやsymbol-file
コマンドにより)
再読み込みされるか破棄されるまで維持されます。
シンボル・テーブルが変更されると、
値履歴が破棄されるのは、
その中の値が、
シンボル・テーブル内で定義されている型を参照しているかもしれないからです。
表示される値は履歴番号を与えられ、
この番号によって参照することができます。
この番号は1から始まる連続した整数です。
print
コマンドは、
値に割り当てられた履歴番号を、
値の前に`$num = 'という形で表示します。
ここで、
numがその履歴番号です。
値履歴の中の任意の値を参照するには、
`$'に続けて履歴番号を指定します。
print
コマンドが出力に付加するラベルは、
ユーザにこのことを知らせるためのものです。
$
単体では、
履歴内の最も新しい値を参照し、
$$
はその1つ前の値を参照します。
$$n
は、
最新のものから数えてn番目の値を参照します。
$$2
は$$
の1つ前の値を参照し、
$$1
は$$
と同一、
$$0
は$
と同一です。
例えば、 ユーザがたった今、 構造体へのポインタを表示し、 今度はその構造体の内容を見たいと考えているとしましょう。 この場合は、
p *$
を実行すれば十分です。
また、
連結された構造体があり、
そのメンバのnext
が次の構造体を指すポインタであるとすると、
次の構造体の内容を表示するには、
p *$.next
とします。 このように連結された構造体を次々に表示するには、 このコマンドを繰り返し実行すればよく、 それはRETキーによって可能です。
この履歴は、
式ではなく、
値を記録するという点に注意してください。
x
の値が4のときに、
以下のコマンドを実行すると、
print
コマンドによって値履歴に記録される値は、
x
の値が変化したにもかかわらず4のままです。
print x set x=5
show values
show values
が履歴を変更しないという点にあります。
show values n
show values +
show values n
を繰り返し実行するのにRETキーを押すことは、
`show values +'を実行するのと全く同じ結果をもたらします。
GDBのコンビニエンス変数は、 GDBの中である値を保持しておいて、 それを後に参照するという目的で使用することができます。 これらの変数は、 GDB内部においてのみ存在するものです。 それらはユーザ・プログラムの中に存在するものではなく、 コンビニエンス変数を設定してもユーザ・プログラムの実行には直接影響を与えません。 したがって、 ユーザはこれを自由に使用することができます。
コンビニエンス変数名は、 先頭が`$'で始まります。 `$'で始まる名前は、 あらかじめ定義されたマシン固有のレジスタ名 (レジスタ参照) と一致しない限り、 コンビニエンス変数の名前として使用することができます (これに対して、 値履歴の参照名では`$'に続けて番号を記述します。 値履歴 を参照してください)。
ユーザ・プログラムの中で変数に値を設定するのと同じように、
代入式を使用してコンビニエンス変数に値を保存することができます。
例えば、
object_ptr
が指すオブジェクトが保持する値を$foo
に保存するには、
以下のようにします。
set $foo = *object_ptr
コンビニエンス変数は、
最初に使用されたときに生成されますが、
新しい値を割り当てるまで、
その値は空
(void
)
です。
値は、
いつでも代入することによって変更可能です。
コンビニエンス変数には決まった型はありません。 コンビニエンス変数には、 既に異なる型のデータが割り当てられている場合でも、 構造体や配列を含めた任意の型のデータを割り当てることができます。 コンビニエンス変数は、 式として使用される場合には、 その時点における値の型を持ちます。
show convenience
show conv
です。
コンビニエンス変数の1つの使い方に、 インクリメントされるカウンタや先へ進んでいくポインタとしての使い方があります。 例えば、 構造体配列の中の連続する要素のあるフィールドの値を表示したい場合、 以下のコマンドをRETキーで繰り返し実行します。
set $i = 0 print bar[$i++]->contents
GDBによって、 いくつかのコンビニエンス変数が自動的に作成され、 役に立ちそうな値が設定されます。
$_
$_
変数には、
x
コマンドによって最後に調べられたアドレスが自動的に設定されます
(メモリの調査参照)。
x
コマンドによって調べられるデフォルトのアドレスを提供する他のコマンドも、
$_
にそのアドレスを設定します。
このようなコマンドには、
info line
やinfo breakpoint
があります。
$_
の型は、
x
コマンドによって設定された場合は$__
の型へのポインタであり、
それ以外の場合はvoid *
です。
$__
$__
変数には、
x
コマンドによって最後に調べられたアドレス位置にある値が自動的に設定されます。
型は、
データが表示されたフォーマットに適合するように選択されます。
$_exitcode
$_exitcode
変数には、
デバッグされているプログラムが終了した際の終了コードが自動的に設定されます。
HP-UXシステムでは、 ドル記号で始まる関数名や変数名を指定すると、 GDBは、 コンビニエンス変数を探す前に、 まずユーザ名やシステム名を探します。
マシン・レジスタの内容は、
先頭が`$'で始まる名前を持つ変数として、
式の中で参照することができます。
レジスタの名前は、
マシンによって異なります。
info registers
コマンドを使用することで、
そのマシンで使用されているレジスタの名前を知ることができます。
info registers
info all-registers
info registers regname ...
GDBは、
そのマシン・アーキテクチャが持つレジスタの正規のニーモニックと衝突しない限り、
ほとんどのマシン上
(の式の中)
において利用可能な、
4つの「標準的」なレジスタ名を持っています。
レジスタ名$pc
と$sp
は、
プログラム・カウンタ・レジスタとスタック・ポインタを指すために使われます。
$fp
は、
カレントなスタック・フレームへのポインタを保持するレジスタを指すために使われます。
$ps
は、
プロセッサの状態を保持するレジスタを指すために使われます。
例えば、
プログラム・カウンタの値を16進数で表示するには、
以下のように実行します。
p/x $pc
また、 次に実行される命令を表示するには、 以下のように実行します。
x/i $pc
さらに、 スタック・ポインタに4を加える (3) には、 以下のように実行します。
set $sp += 4
可能な場合にはいつでも、
これら4つの標準的なレジスタ名が使用可能です。
ユーザのマシンが異なる正規のニーモニックを使用している場合でも、
名前の衝突さえ起こらなければ、
使用可能です。
info registers
コマンドにより、
正規名を見ることができます。
例えば、
SPARC上で
info registers
コマンドを実行すると、
プロセッサ・ステータス・レジスタは$psr
と表示されますが、
このレジスタを$ps
として参照することもできます。
また、
x86ベースのマシン上では、
$ps
はEFLAGSレジスタの別名となっています。
レジスタがこの方法で調べられるとき、 GDBは普通のレジスタの内容を常に整数値とみなします。 マシンによっては、 浮動小数点値以外を保持できないレジスタを持つものがあります。 このようなレジスタは、 浮動小数点値を持つものとみなされます。 普通のレジスタの内容を浮動小数点値として参照する方法はありません (`print/f $regname'により、 浮動小数点値として値を表示することはできます)。
レジスタには、
rawとvirtualの2つの異なるデータ形式を取るものがあります。
これは、
オペレーティング・システムによってレジスタの内容が保存されるときのデータ形式が、
ユーザ・プログラムが通常認識しているものと同じではないことを意味しています。
例えば、
68881浮動小数点コプロセッサのレジスタの値は常にextended
(raw)形式で保存されていますが、
C言語によるプログラムは通常double
(virtual)形式を想定しています。
このような場合、
GDBは通常
(ユーザ・プログラムにとって意味のある形式である)
virtual形式だけを扱いますが、
info registers
コマンドはデータを両方の形式で表示してくれます。
通常、 レジスタの値は、 選択されたスタック・フレーム (フレームの選択参照) と関係を持つ相対的な値です。 これは、 ユーザにレジスタの値として見えるものは、 選択されたフレームから呼び出されているすべてのスタック・フレームが終了し、 退避されたレジスタの値が復元されたときに、 そのレジスタが持つであろう値です。 ハードウェア・レジスタの本当の値を知りたければ、 最下位のフレームを (`frame 0'で) 選択しなければなりません。
しかし、 GDBは、 コンパイラが生成したコードから、 どこにレジスタが保存されているかを推論する必要があります。 退避されていないレジスタがある場合や、 GDBが退避されたレジスタを見つけることができない場合は、 どのスタック・フレームを選択していても結果は同じです。
構成によっては、 GDBは浮動小数ハードウェアの状態について、 より詳しい情報を提供することができます。
info float