次: , 前: Auto Display, 上: Data


8.7 表示設定

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コマンドで設定された数に達すると、 そこで表示が停止されます。 この上限は、 文字列の表示にも適用されます。 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++のシンボル名を、 型セーフ(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'です。
set print vtbl off
C++の仮想関数テーブルをきれいな形式で表示しません。


show print vtbl
C++の仮想関数テーブルをきれいな形式で表示するか否かを示します。