ユーザ・プログラムの中のデータを調べる通常の方法は、
print
コマンド
(省略形はp
)
もしくはそれと同義のコマンドである
inspect
コマンドを使用することです。
これは、
ユーザ・プログラムの記述された言語
(異なる言語の使用を参照)
による式を評価し、
その値を出力するものです。
print exp
print /f exp
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つ例外があります。 スコープが単一のソース・ファイルであるような変数や関数は、 たとえ現在の実行箇所がそのファイルの中ではなくても、 参照することができます。 しかし、 このような変数もしくは関数が (異なるソース・ファイル中に) 同じ名前で複数個存在するということがありえます。 このような場合、 その名前を参照すると予期できない結果をもたらします。 2つのコロンを並べる記法によって、 特定の関数もしくはファイルの中の静的変数を指定することができます。
file::variable function::variable
ここでfileもしくはfunctionは、
静的変数variableのコンテキスト名です。
ファイル名の場合は、
引用符を使用することによってGDBがファイル名を確実に1つの単語として解釈するようにします。
例えば、
ファイル`f2.c'の中で定義されたグローバル変数x
の値を表示するには、
(gdb) p 'f2.c'::x
のようにします。 この`::'の使用が、 これと非常によく似たC++における`::'の使用と衝突することは非常に稀です。 GDBは、 式の内部においてC++のスコープ解釈演算子の使用もサポートしています。
注意: 時々、 新しいスコープに入った直後やスコープから出る直前に、 関数内部のある箇所においてローカル変数が正しくない値を持つかのように見えることがあります。 マシン命令単位でステップ実行を行っているときに、 このような問題を経験することがあるかもしれません。
これは、 ほとんどのマシンでは、 (ローカル変数定義を含む) スタック・フレームのセットアップに複数の命令が必要となるからです。 マシン命令単位でステップ実行を行う場合、 スタック・フレームが完全に構築されるまで、 変数は正しくない値を持っているかのように見えることがあります。 スコープから出るときには、 スタック・フレームを破棄するのに、 通常複数のマシン命令が必要とされます。 それらの命令群をステップ実行後には、 ローカル変数の定義は既に存在しないかもしれません。
メモリ内に連続的に配置されている同一型のオブジェクトを表示することが役に立つことがよくあります。 配列の一部や動的にサイズの決定される配列で、 プログラム内部にそこへのポインタしか存在しないような場合です。 これは、 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'によってマシン命令を調べた後、
`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 exp
display
コマンドは繰り返し実行されません。
display/fmt exp
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'を使用してそのポインタが指している変数の名前とソース・ファイル上の位置がわかります。
これは、
アドレスをシンボリック形式で解釈します。
例えば、
以下の例においてGDBは、
ある変数ptt
がファイル`hi2.c'内で定義された別の変数t
を指していることを示しています。
(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
コマンドで設定された数の要素を表示すると、
そこで表示を停止します。
この上限は、
文字列の表示にも適用されます。
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++
)エンコーディング・アルゴリズムに基づいてデコードします。
これが、
デフォルトです。
lucid
lcc
)エンコーディング・アルゴリズムに基づいてデコードします。
arm
cfront
によって生成された実行モジュールをデバッグするのに十分ではありません。
これを行うためには、
GDBをさらに拡張する必要があります。
foo
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
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内部においてのみ存在するものです。
それらはユーザ・プログラムの中に存在するものではなく、
コンビニエンス変数を設定してもユーザ・プログラムの実行には直接影響を与えません。
したがって、
ユーザはこれを自由に使用することができます。
コンビニエンス変数名は、
先頭が`$'で始まります。
`$'で始まる名前は、
それがあらかじめ定義されたマシン固有のレジスタ名
(レジスタを参照)
と重複しない限り、
コンビニエンス変数の名前として使用することができます
(これに対して、
値ヒストリの参照名では`$'に続けて番号を記述します。
値ヒストリを参照してください)。
ユーザ・プログラムで変数に値を設定するのと同じように、
代入式を使用してコンビニエンス変数に値を保存することができます。
例えば、
以下のようにして、
object_ptr
が指すオブジェクトが保持する値を$foo
に保存します。
set $foo = *object_ptr
コンビニエンス変数は、
最初に使用されたときに生成されますが、
新しい値を割り当てるまで、
その値は空
(void
)
です。
値はいつでも代入することによって変更可能です。
コンビニエンス変数には決まった型はありません。
コンビニエンス変数には、
既に異なる型のデータが割り当てられている場合でも、
構造体や配列を含めた任意の型のデータを割り当てることができます。
コンビニエンス変数は、
式として使用される場合には、
その時点における値の型を持ちます。
show convenience
show con
です。
コンビニエンス変数の1つの使い方に、 インクリメントされるカウンタや先へ進んでいくポインタとしての使い方があります。 例えば、 構造体配列の連続する要素のあるフィールドの値を表示したい場合、
set $i = 0 print bar[$i++]->contents
このコマンドをRETキーで繰り返し実行します。 いくつかのコンビニエンス変数がGDBによって自動的に作成され、 役に立ちそうな値が設定されます。
$_
$_
変数は
x
コマンドによって最後に調べられたアドレスに自動設定されます
(メモリの調査を参照)。
x
コマンドによって調べられるデフォルトのアドレスを提供する他のコマンドも$_
をそのアドレスに設定します。
このようなコマンドには、
info line
やinfo breakpoint
があります。
$_
の型は、
x
コマンドによって設定された場合は$__
の型へのポインタであり、
それ以外の場合はvoid *
です。
$__
$__
変数はx
コマンドによって最後に調べられたアドレスにある値に自動設定されます。
その型は、
データが表示されたフォーマットに合うように選択されます。
$_exitcode
$_exitcode
変数はデバッグされているプログラムが終了した際の終了コードに自動的に設定されます。
マシン・レジスタの内容は、
`$'で始まる名前の変数として、
式の中で参照することができます。
レジスタの名前は、
マシンによって異なります。
info registers
コマンドを使用することで、
そのマシンで使用されているレジスタの名前を知ることができます。
info registers
info all-registers
info registers regname ...
GDBは、
マシンのアーキテクチャにおけるレジスタの正規のニーモニックと衝突しない限り、
ほとんどのマシン上
(の式の中)
で利用可能な4つの「標準的」なレジスタ名を持っています。
レジスタ名$pc
と$sp
は、
プログラム・カウンタ・レジスタとスタック・ポインタを指すために使われます。
$fp
は、
カレントなスタック・フレームへのポインタを保持するレジスタを指すために使われます。
$ps
は、
プロセッサの状態を保持するレジスタを指すために使われます。
例えば、
プログラム・カウンタの値を16進数で表示するには、
以下のように実行します。
p/x $pc
あるいは、 次に実行される命令を表示するには、 以下のように実行します。
x/i $pc
また、スタック・ポインタ (3) に4を加えるには、 以下のように実行します。
set $sp += 4
可能な場合にはいつでも、
これら4つの標準的なレジスタ名が使用可能です。
ユーザのマシンが異なる正規なニーモニックを使用している場合でも、
衝突さえ起らなければ、
使用可能です。
info registers
コマンドにより、
正規名を見ることができます。
例えば、
SPARC上で
info registers
コマンドを実行すると、
プロセッサ・ステータス・レジスタは$psr
と表示されますが、
このレジスタを$ps
として参照することもできます。
レジスタがこの方法で調べられるとき、
GDBは普通のレジスタの内容を常に整数値とみなします。
マシンによっては、
浮動小数点値以外を保持できないレジスタを持つものがあります。
このようなレジスタは、
浮動小数点値を持つものとみなされます。
普通のレジスタの内容を浮動小数点値として参照する方法はありません
(`print/f $regname'により浮動小数点値として値を
表示することはできます)。
レジスタには、
rawとvirtualの2つの異なるデータ形式を取るものがあります。
これは、
オペレーティング・システムによってレジスタの内容が保存されるときのデータ形式が、
ユーザ・プログラムが通常認識しているものと同じではないことを意味しています。
例えば、
68881浮動小数点コプロセッサのレジスタの値は常にextended
(raw)形式で保存されていますが、
C言語によるプログラムは通常double
(virtual)形式を想定しています。
このような場合、
GDBは通常
(ユーザ・プログラムにとって意味のある形式である)
virtual形式のみを扱いますが、
info registers
コマンドはデータを両方の形式で表示してくれます。
通常、
レジスタの値は、
選択されたスタック・フレーム
(フレームの選択を参照)
における相対値です。
これは、
ユーザにレジスタの値として見えるものは、
選択されたフレームから呼び出されているすべてのスタック・フレームが終了し、
退避されたレジスタの値が復元されたときに、
そのレジスタが持つであろう値です。
ハードウェア・レジスタの本当の値を知りたければ、
最も内側のフレームを
(`frame 0'で)
選択しなければなりません。
しかし、
GDBはコンパイラが生成したコードからどこにレジスタが保存されているかを推論する必要があります。
退避されていないレジスタがある場合や、
GDBが退避されたレジスタを見つけることができない場合は、
どのスタック・フレームを選択していても結果は同じです。
set rstack_high_address address
set rstack_high_address
コマンドによってレジスタ・スタックの最終アドレスを指定することによって、
この問題を回避することができます。
引数はアドレスでなければなりません。
これは、
`0x'を先頭に記述することで16進数で指定することができます。
show rstack_high_address
設定によっては、 GDBは浮動小数ハードウェアの状態についてより詳しい情報を提供することができます。
info float