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


データの検査

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

print expr
print /f expr
exprは (ソース言語による) 式です。 デフォルトでは、 exprの値は、 exprのデータ型にとって適切な形式で表示されます。 `/f'を指定することで、 他の形式を選択することも可能です。 `/f'fは形式を指定する文字です。 出力フォーマット を参照してください。
print
print /f
exprを省略すると、 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つ例外があります。 特定の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
値を整数値とみなし、 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'によって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
ユーザ・プログラムが停止するたびに表示される式のリストに、 式exprを追加します。 を参照してください。 コマンドの実行後にRETキーを押しても、 displayコマンドは繰り返し実行されません。
display/fmt expr
fmtの部分に、 大きさや繰り返し回数は指定せず、 出力フォーマットだけを指定した場合は、 式exprを自動表示リストに追加して、 出力時のフォーマットが常に、 指定されたフォーマット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'を使用して、 そのポインタが指している変数の名前とソース・ファイル上の位置が分かります。 これは、 アドレスをシンボリック形式で解釈します。 例えば以下の例では、 ある変数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
配列をきれいに表示します。 このフォーマットは読むのには便利ですが、 より多くのスペースを取ります。 デフォルトはoffです。
set print array off
配列を詰め込み形式で表示します。
show print array
配列の表示方法として、 詰め込み形式ときれいな形式のどちらが選択されているかを示します。
set print elements number-of-elements
GDBによって表示される配列の要素の数に上限を設定します。 GDBが大きな配列を表示している際に、 表示された要素の数がset print elementsコマンドで設定された数に達すると、 そこで表示が停止されます。 この上限は、 文字列の表示にも適用されます。 GDBの起動時に、 この上限は200にセットされます。 number-of-elementsに0をセットすると、 要素は無制限に表示されます。
show print elements
大きな配列を表示する際にGDBが表示する要素数を示します。 0の場合、 表示される要素数に制限はありません。
set print null-stop
最初にNULLが検出された時点で、 GDBに文字配列の表示を停止させます。 これは、 大きな配列が実際には短い文字列しか含んでいないときに役に立ちます。 デフォルトはoffです。
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++のシンボル名を、 型セーフ(type-safe)なリンクのためにアセンブラ、 リンカに渡されるエンコードされた (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++)エンコーディング・アルゴリズムに基づいてデコードします。 これがデフォルトです。
hp
HP ANSI C++(aCC)エンコーディング・アルゴリズムに基づいてデコードします。
lucid
Lucid C++(lcc)エンコーディング・アルゴリズムに基づいてデコードします。
arm
C++ Annotated Reference Manualに記述されているアルゴリズムを使用してデコードします。 注意:この設定だけでは、 cfrontによって生成された実行モジュールをデバッグするのに十分ではありません。 これを可能にするためには、 GDBをさらに拡張する必要があります。
styleを指定しないと、 指定可能なフォーマットの一覧が表示されます。
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です。 (vtblコマンドは、 HP ANSI C++コンパイラ(aCC) によってコンパイルされたプログラムに対しては、 機能しません。)
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の中である値を保持しておいて、 それを後に参照するという目的で使用することができます。 これらの変数は、 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 lineinfo breakpointがあります。 $_の型は、 xコマンドによって設定された場合は$__の型へのポインタであり、 それ以外の場合はvoid *です。
$__
$__変数には、 xコマンドによって最後に調べられたアドレス位置にある値が自動的に設定されます。 型は、 データが表示されたフォーマットに適合するように選択されます。
$_exitcode
$_exitcode変数には、 デバッグされているプログラムが終了した際の終了コードが自動的に設定されます。

HP-UXシステムでは、 ドル記号で始まる関数名や変数名を指定すると、 GDBは、 コンビニエンス変数を探す前に、 まずユーザ名やシステム名を探します。

レジスタ

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

info registers
(選択されたスタック・フレームにおける) 浮動小数点レジスタを除くすべてのレジスタの名前と値を表示します。
info all-registers
浮動小数点レジスタも含めてすべてのレジスタの名前と値を表示します。
info registers regname ...
指定されたレジスタregname相対化された値(relativized value)を表示します。 以下に詳しく述べるように、 レジスタの値は、 通常は、 選択されたスタック・フレームと関係を持つ相対的な値です。 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
浮動小数ユニットに関するハードウェア依存の情報を表示します。 浮動小数チップの種類によって、 表示内容やレイアウトは変わります。 現在、 `info float'はARMマシンとx86マシンにおいてサポートされています。


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