[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]  


データの検査

ユーザ・プログラムの中のデータを調べる通常の方法は、 printコマンド (省略形はp) もしくはそれと同義のコマンドである inspectコマンドを使用することです。 これは、 ユーザ・プログラムの記述された言語 (異なる言語の使用を参照) による式を評価し、 その値を出力するものです。

print exp
print /f exp
expは (ソース言語による) 式です。 デフォルトでは、 expの値はそのデータ型にとって適切な形式で表示されます。 `/f'を指定することで、 他の形式を選択することも可能です。 `/f'fは形式を指定する文字です。 出力フォーマットを参照。
print
print /f
expを省略すると、 GDBは値ヒストリ値ヒストリを参照) の最後の値を再表示します。 これは、 同じ値を異なる形式で調べるのに便利です。

データを調べるためのより低レベルの方法はxコマンドを使うことです。 これは、 指定されたアドレスのメモリ上のデータを指定された形式で表示するものです。 メモリの調査を参照してください。 型に関する情報や構造体 、クラス のフィールドがどのように宣言されているかという点に関心があるのであれば、 printコマンドではなくptype expコマンドを使用してください。 シンボル・テーブルの検査を参照してください。

printおよびほかの多くのGDBコマンドは式を受け取り、 その値を評価します。 ユーザの使用しているプログラミング言語によって定義されている定数、 変数、 演算子はいずれもGDBにおける式の中で有効です。 これには、 条件式、 関数呼び出し、 キャスト、 文字列定数が含まれます。 しかし、 プリプロセッサの#defineコマンドによって定義されるシンボルは、 残念ながら含まれません。 現在のGDBは、 ユーザの入力する式において、 配列定数をサポートします。 その構文は、 {element, element...}です。 例えば、 コマンドprint {1, 2, 3}を使用して、 ターゲット・プログラム内でmalloc()によって獲得されたメモリ内に配列を作成することができます。 C言語は大変広汎に使用されているので、 このマニュアルの中で示される例の中の式はC言語で記述されています。 他の言語での式の使い方に関する情報については、 異なる言語の使用を参照してください。 この節では、 プログラミング言語によらずGDBの式で使用できる演算子を説明します。 キャストは、 C言語のみならず、 すべての言語でサポートされています。 これは、 メモリ内のあるアドレスにある構造体を調べるのに、 数値をポインタにキャストするのが大変便利であるからです。 プログラミング言語によらず共通に使用可能な演算子に加えて、 GDBは以下の演算子をサポートしています。

@
`@'は、 メモリの一部を配列として処理するための2項演算子です。 詳細については、 人工配列を参照してください。
::
`::'によって、 それを定義する関数もしくはファイルを特定して変数を指定することができます。 プログラム変数を参照してください。
{type} addr
addrで示されるメモリ上のアドレスに格納されている、 typeで示される型のオブジェクトを参照します。 addrには、 評価結果が整数値もしくはポインタになるような任意の式を指定することができます (ただし、 2項演算子の前後には、 キャストを使う場合と同様の括弧が必要です)。 これは、 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
値を整数値とみなし、 それを16進で表示します。
d
値を符号付き10進の整数値として表示します。
u
値を符号なし10進の整数値として表示します。
o
値を8進の整数値として表示します。
t
値を2進の整数値として表示します。 `t'はtwoを省略したものです。 (2)
a
値を16進で、 絶対アドレス、 および、 そのアドレスより前にあるシンボルのうち最も近い位置にあるものからのオフセット・アドレスとして表示します。 このフォーマットを使用することで、 未知のアドレスがどこに (どの関数の中に) あるのかを知ることができます。
(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コマンドを使用してください。

nfuはいずれも、 どれだけのメモリをどのようにフォーマットして表示するかを指定するオプションのパラメータです。 addrは、 メモリの表示を開始するアドレスを指定する式です。 nfuにデフォルトを使用するのであれば、 スラッシュ`/'は必要ありません。 いくつかのコマンドによって、 addrに対して便利なデフォルト値を指定することができます。

n、繰り返し回数を指定します。
繰り返し回数は10進の整数値です。 デフォルトは1です。 これによって、 (単位uの) メモリをどれだけ表示するかを指定します。
f、表示フォーマットを指定します。
表示フォーマットには、 printコマンドによって使用されるフォーマット、 `s'(NULL文字で終了する文字列)、 `i'(マシン命令) のいずれかを指定します。 最初のデフォルトは`x' (16進) です。 デフォルトは、 ユーザがxコマンドもしくはprintコマンドを実行するたびに変更されます。
u、メモリ・サイズの単位を指定します。
単位の大きさは以下のいずれかになります。
b
バイト
h
ハーフ・ワード(2バイト)
w
ワード(4バイト)---これが最初のデフォルトになります。
g
ジャイアント・ワード(8バイト)
xコマンド実行時に単位の大きさを指定するたびに、 その大きさが次にxコマンドを実行する際のデフォルトになります (フォーマット`s'および `i'については、 単位の大きさは無視されます。 これらについては、 通常、 単位の大きさを記述しません)。
addr、表示を開始するアドレスを指定します。
addrは、 GDBにメモリの表示を開始してもらいたいアドレスです。 この式は、 必ずしもポインタ値を持つ必要はありません (ポインタ値を持つことも可能です)。 これは常に、 メモリ内のある1バイトを指す整数値のアドレスとして解釈されます。 式に関する詳細については、 を参照してください。 addrのデフォルトは通常、 最後に調べられたアドレスの次のアドレスになります。 しかし、 ほかのコマンドによってもデフォルトのアドレスが設定されます。 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
ユーザ・プログラムが停止するたびに表示される式のリストに、 式expを追加します。 を参照してください。 コマンドの実行後にRETキーを押しても、 displayコマンドは繰り返し実行されません。
display/fmt exp
fmtに大きさや繰り返し回数は指定せずに出力フォーマットのみを指定し、 式expを自動表示リストに追加します。 出力時のフォーマットは、 指定されたfmtになるよう調整されます。 出力フォーマットを参照してください。
display/fmt addr
fmt`i'`s'、 単位の大きさ、 単位の数を指定し、 ユーザ・プログラムが停止するたびに調べるメモリ・アドレスとして式addrを追加します。 ここで「調べる」というのは、 実際には`x/fmt addr'を実行することを意味します。 メモリの調査を参照してください。

例えば、 `display/i $pc'は、 ユーザ・プログラムが停止するたびに次に実行されるマシン命令を見るのに便利です (`$pc'はプログラム・カウンタを指すのに一般に使用される名前です。 レジスタを参照)。

undisplay dnums...
delete display dnums...
表示すべき式のリストから項目番号dnumsに対応する要素を削除します。 undisplayコマンドを実行後RETキーを押しても、 コマンドは再実行されません (仮に、 再実行されてしまうとすると、 `No display number ...'というエラーになるだけです)。
disable display dnums...
項目番号dnumsの表示を不可にします。 表示不可にされた表示項目は自動的には表示されませんが、 削除されたわけではありません。 後に、 表示可にすることができます。
enable display dnums...
項目番号dnumsの表示を可能にします。 これにより、 再度表示不可にされるまで、 式の自動表示が再度有効になります。
display
リスト上の式のカレントな値を表示します。 これは、 ユーザ・プログラムが停止したときに実行されるのと同一の処理です。
info display
自動的に表示されるよう設定された式のリストを表示します。 個々の式の項目番号は表示されますが、 値は表示されません。 このリストには、 表示不可になっている式も含まれ、 そのことがわかるようにマーク付けされています。 また、 このリストには、 その時点ではアクセスできない自動変数を参照しているためにその時点では表示することのできない式も含まれます。

表示される式がローカル変数への参照を含む場合、 そのローカル変数がセットアップされているコンテキストの範囲外では、 その式は無意味です。 このような式は、 その中の変数の1つが定義されないコンテキストが実行開始されると表示不可になります。 例えば、 引数last_charを取る関数の内部でdisplay last_charコマンドを実行すると、 GDBはその関数の内部でユーザ・プログラムが実行を停止し続ける間は、 この引数を表示します。 ほかの箇所 (last_charという変数が存在しない箇所) で停止したときには、 自動的に表示不可となります。 次にユーザ・プログラムがlast_charが意味を持つ箇所で停止したときには、 再びその式の表示を可能にすることができます。

表示設定

GDBは、 配列、 構造体、 シンボルをどのように表示するかを制御するための方法を提供しています。 これらの設定は、どのプログラミング言語で記述されたプログラムのデバッグにも便利です。

set print address
set print address on
これによりGDBは、 メモリ・アドレスの内容を表示する場合でも、 スタック・トレース、 構造体の値、 ポインタの値、 ブレイクポイントなどなどの位置を示すアドレスを表示します。 デフォルトは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
シンボリックな形式のアドレスの表示において、 そのシンボルのソース・ファイル名と行番号を表示するようGDBに通知します。
set print symbol-filename off
シンボルのソース・ファイル名と行番号を表示しません。これがデフォルトです。
show print symbol-filename
シンボリックな形式でのアドレス表示において、 GDBがそのシンボルのソース・ファイル名と行番号とを表示するか否かを示します。

シンボルのソース・ファイル名と行番号を表示するのが役に立つもう1つの状況として、 コードを逆アセンブルする場合があります。 GDBが、 個々の命令に対応する行番号とソース・ファイルを表示してくれます。 また、アドレスがそれより前にある最も近いシンボルに適度に近い場合のみ、 そのアドレスをシンボリック形式で表示させたいという場合もあるでしょう。

set print max-symbolic-offset max-offset
アドレスと、 それより前にある最も近いシンボルの間のオフセットがmax-offset未満のときのみ、 そのアドレスをシンボリックな形式で表示するようGDBに通知します。 デフォルトは0で、 これはGDBに対して、 アドレスより前にシンボルがある場合には、 常にそのアドレスをシンボリックな形式で表示するよう通知します。
show print max-symbolic-offset
GDBがシンボリックなアドレスを表示する最大のオフセット値を問い合わせます。

ポインタがあるが、 それがどこを指しているか定かではない場合には、 `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
配列をきれいに表示します。 このフォーマットは読むのには便利ですが、 より多くのスペースを取ります。 デフォルトは`off'です。
set print array off
配列を詰め込み形式で表示します。
show print array
配列の表示を詰め込み形式で行うか、きれいに行うかを示します。
set print elements number-of-elements
GDBによって表示される配列の要素の数に上限を設定します。 GDBが大きな配列を表示している際に、 set print elementsコマンドで設定された数の要素を表示すると、 そこで表示を停止します。 この上限は、 文字列の表示にも適用されます。 number-of-elementsを0に設定すると、 無制限に表示されます。
show print elements
GDBが表示する大きな配列の要素数を示します。 0の場合、 表示される要素数に制限はありません。
set print null-stop
最初にNULLが検出された時点で、 GDBに文字配列の表示を停止させます。 これは、 大きな配列が実際には短い文字列しか含んでいないときに役に立ちます。
set print pretty on
構造体を表示する際、 インデントされた形式で1行に1メンバずつGDBに表示させます。 以下に例を示します。
$1 = {
  next = 0x0,
  flags = {
    sweet = 1,
    sour = 1
  },
  meat = 0x54 "Pork"
}
set print pretty off
構造体を詰め込み形式でGDBに表示させます。
$1 = {next = 0x0, flags = {sweet = 1, sour = 1}, \
meat = 0x54 "Pork"}
これがデフォルトの形式です。
show print pretty
GDBが構造体を表示するのに、 どちらの形式を使用しているかを示します。
set print sevenbit-strings on
7ビット文字のみを使用して表示します。 このオプションがセットされていると、 GDBは (文字列内または単一文字内の) 8ビット文字を\nnnという表記法で表示します。 この設定は、英語 (ASCII) 環境において、 文字の最上位ビットをマーカや「メタ」ビットとして使用する場合に最適です。
set print sevenbit-strings off
8ビット文字を表示します。 これにより文字セットの使用が国際的になります。 これがデフォルトです。
show print sevenbit-strings
GDBが7ビット文字のみを表示するか否かを示します。
set print union on
GDBに対して、 構造体に含まれる共用体を表示するよう通知します。 これが、 デフォルトの設定です。
set print union off
GDBに対して、 構造体に含まれる共用体を表示しないよう通知します。
show print union
GDBに対して、 構造体に含まれる共用体を表示するか否かを問い合わせます。 例えば、 以下のように宣言されている場合、
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
C++のシンボル名を、 型セーフなリンクのためにアセンブラ、 リンカに渡されるエンコードされた (mangled) 形式ではなく、 ソースに記述された形式で表示します。 デフォルトは`on'です。
show print demangle
C++のシンボル名がエンコードされた (mangled) 形式、 ソース (demangled) 形式のいずれの形式で表示されるかを示します。
set print asm-demangle
set print asm-demangle on
C++のシンボル名を、 命令の逆アセンブル時のようにアセンブラ・コードで表示しているときにも、 エンコードされた (mangled) 形式ではなく、 ソース形式で表示します。 デフォルトは`off'です。
show print asm-demangle
アセンブラ・コード内のC++シンボル名をエンコードされた (mangled) 形式、 ソース (demangled) 形式のいずれの形式で表示するかを示します。
set demangle-style style
C++シンボル名を表現するために異なるコンパイラによって使用されるいくつかのエンコーディング方式の中から1つを選択します。 現在styleとして選択可能であるのは、以下のとおりです。
auto
GDBがユーザ・プログラムを解析してデコーディング方式を決定することを許します。
gnu
GNU C++(g++)エンコーディング・アルゴリズムに基づいてデコードします。 これが、 デフォルトです。
lucid
Lucid C++(lcc)エンコーディング・アルゴリズムに基づいてデコードします。
arm
C++ Annotated Reference Manualに記述されているアルゴリズムを使用してデコードします。 注意: この設定だけでは、 cfrontによって生成された実行モジュールをデバッグするのに十分ではありません。 これを行うためには、 GDBをさらに拡張する必要があります。
foo
フォーマットの一覧を表示します。
show demangle-style
C++シンボルをデコードするのにその時点において使用されているエンコーディング方式を示します。
set print object
set print object on
オブジェクトへのポインタを表示する際に仮想関数テーブルを使用して、 宣言された型ではなく、 オブジェクトの実際の (派生された) 型を表示します。
set print object off
仮想関数テーブルは参照せず、 オブジェクトの宣言された型のみを表示します。 これがデフォルトの設定です。
show print object
オブジェクトの実際の型と宣言された型のどちらが表示されるかを示します。
set print static-members
set print static-members on
C++のオブジェクトを表示する際、 静的メンバを表示します。 デフォルトは`on'です。
set print static-members off
C++のオブジェクトを表示する際、 静的メンバを表示しません。
show print static-members
C++の静的メンバが表示されるか否かを示します。
set print vtbl
set print vtbl on
C++の仮想関数テーブルをきれいに表示します。 デフォルトは`off'です。
set print vtbl off
C++の仮想関数テーブルをきれいに表示しません。
show print vtbl
C++の仮想関数テーブルをきれいに表示するか否かを示します。

値ヒストリ

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
値ヒストリ内の最新の10個の値を、 項目番号付きで表示します。 これは、 `p $$9'を10回実行するようなものですが、 show valuesはヒストリを変更しないという点が異なります。
show values n
値ヒストリ内の項目番号nを中心に、 その前後の10個の値を表示します。
show values +
値ヒストリ内の最後に表示された値の直後の10個の値を表示します。 値が存在しない場合には、 何も表示されません。

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 lineinfo breakpointがあります。 $_の型は、 xコマンドによって設定された場合は$__の型へのポインタであり、 それ以外の場合はvoid *です。
$__
$__変数はxコマンドによって最後に調べられたアドレスにある値に自動設定されます。 その型は、 データが表示されたフォーマットに合うように選択されます。
$_exitcode
$_exitcode変数はデバッグされているプログラムが終了した際の終了コードに自動的に設定されます。

レジスタ

マシン・レジスタの内容は、 `$'で始まる名前の変数として、 式の中で参照することができます。 レジスタの名前は、 マシンによって異なります。 info registersコマンドを使用することで、 そのマシンで使用されているレジスタの名前を知ることができます。

info registers
(選択されたスタック・フレームにおける) 浮動小数点レジスタを除くすべてのレジスタの名前と値を表示します。
info all-registers
浮動小数点レジスタも含めてすべてのレジスタの名前と値を表示します。
info registers regname ...
指定されたレジスタの相対化された値を表示します。 以下に詳しく述べるように、 レジスタの値は通常選択されたスタック・フレーム内における相対的な値です。 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
AMD 29000ファミリ・プロセッサでは、 レジスタは「レジスタ・スタック」と呼ばれるところに退避されます。 GDBには、 このスタックの大きさを知ることはできません。 通常 GDBは、 スタックは十分に大きいと想定します。 このために、 GDBが実際には存在しないメモリ位置を参照してしまうことがありえます。 必要であれば、 set rstack_high_addressコマンドによってレジスタ・スタックの最終アドレスを指定することによって、 この問題を回避することができます。 引数はアドレスでなければなりません。 これは、 `0x'を先頭に記述することで16進数で指定することができます。
show rstack_high_address
AMD 29000ファミリ・プロセッサでのレジスタ・スタックのカレントな上限を表示します。

浮動小数ハードウェア

設定によっては、 GDBは浮動小数ハードウェアの状態についてより詳しい情報を提供することができます。

info float
浮動小数ユニットに関するハードウェア依存の情報を表示します。 浮動小数チップの種類によって、 表示内容やレイアウトは変ります。 現在、 `info float'はARMマシンとx86マシンにおいてサポートされています。


[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]