Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

第 4 章 コードの表示とコードへの移動

プログラムが停止するたびに dbx が表示するソースコードは、その停止位置に対応するコードです。また、プログラムが停止するたびに、dbx現在の関数の値をプロ グラムが停止した関数の値に再設定します。プログラムの停止後、その停止場所以外の関数やファイルを一時的に表示することができます。

この章では、デバッグセッション中に dbx がどのようにコードを参照し、関数やシンボルを検索するかを説明します。また、コマンドを使用して、プログラムの停止位置とは別の場所のコードを一時的に表示したり、識別子、型、クラスの宣言を調べたりする方法も説明します。

この章は、次の各節から構成されています。

コードへの移動

プログラムを実行していないときはいつでも、プログラム内の関数やファイルに移動できます。プログラムに含まれるすべての関数またはファイルを表示できます。現在のスコープは プログラムの停止位置に設定されます (「プログラムスコープ」を参照してください)。この機能は、stop at ブレークポイントを設定し、停止したときにソース行を決定する際に便利です。

ファイルの内容を表示する

dbx がプログラムの一部として認識していれば、どのようなファイルでもその内容を表示できます (モジュールまたはファイルが -g オプションでコンパイルされていない場合でも可能です)。ファイルの内容を表示するためには、次のように入力します。


(dbx) file filename

file コマンドを引数を指定しないで使用すると、現在表示中のファイル名が表示されます。


(dbx) file

dbx は、行番号を指定しないと、最初の行からファイルを表示します。


(dbx) file filename ; list line_number

ソースコードの行でブレークポイントを設定する詳細については、「ソースコードの特定の行に stop ブレークポイントを設定する」を参照してください。

関数を表示する

func コマンドを使用すると、関数を表示できます。コマンド func に続けて、関数名を入力します。次に例を示します。


(dbx) func adjust_speed

func コマンドを引数なしで使用すると、現在表示中の関数が表示されます。

詳細については、func コマンド」を参照してください。

あいまいな関数名をリストから選択する (C++)

C++ の場合、あいまいな名前または多重定義されている関数名を指定してメンバー関数を表示しようとすると、多重定義されているというメッセージが表示され、指定された名前を持つ関数のリストが示されます。表示したい関数の番号を入力します。関数が属している特定クラスを知っている場合は、クラス名と関数名を入力できます。次に例を示します。


(dbx) func block::block

複数存在する場合の選択

同じスコープレベルから複数のシンボルにアクセスできる場合、dbx は、あいまいさについて報告するメッセージを出力します。


(dbx) func main
(dbx) which C::foo
More than one identifier ’foo’.
Select one of the following:
 0) Cancel
 1) ”a.out”t.cc”C::foo(int)
 2) ”a.out”t.cc”C::foo()
>1
”a.out”t.cc”C::foo(int)

which コマンドのコンテキストでシンボル名のリストから特定のシンボルを選んでも、dbx またはプログラムの状態には影響しません。どのシンボルを選んでも名前が表示されるだけです。

ソースリストの出力

list コマンドは、ファイルまたは関数のソースリストを出力するために使用します。ファイルを検索したあと、list コマンドは、上から number 行を出力します。関数を検索したあと、list コマンドはその行を出力します。

list コマンドの詳細については、list コマンド」を参照してください。

呼び出しスタックの操作によってコードを表示する

プロセスが存在するときにコードを表示する方法としては、さらに「呼び出しスタックを操作する」方法があります。この方法では、スタック操作コマンドを使用して現在スタック上にある関数を表示します。その結果、現時点でアクティブなすべてのルーチンが表示されます。スタックを操作すると、現在の関数とファイルは、スタック関数を表示するたびに変更されます。停止位置は、スタックの「底」にあるものと考えられます。したがって、そこから離れるには up コマンドを使用します。つまり、main 関数または begin 関数に向かって移動します。現在のフレーム方向へ移動するには、down コマンドを使用します。

呼び出しスタックの移動についての詳細は、「スタックを移動してホームに戻る」を参照してください。

プログラム位置のタイプ

dbx は、3 つのグローバル位置を使用して検査しているプログラムの部分を追跡します。

プログラムスコープ

スコープとは、変数または関数の可視性について定義されたプログラムのサブセットです。あるシンボルの名前が特定の実行地点において可視となる場合、そのシンボルは「スコープ範囲内にある」ことになります。C 言語では、関数はグローバルまたはファイル固有のスコープを保持します。変数は、グローバル、ファイル固有、関数、またはブロックのスコープを保持します。

現在のスコープを反映する変数

次の変数は現在のスレッドまたは LWP の現在のプログラムカウンタを常に反映し、表示スコープを変更するコマンドには影響されません。

$scope

現在のプログラムカウンタのスコープ

$lineno

現在の行番号

$func

現在の関数

$class

$func が所属するクラス

$file

現在のソースファイル

$loadobj

現在のロードオブジェクト

表示スコープ

プログラムのさまざまな要素を dbx を使用して検査する場合、 表示スコープを変更します。dbx は、式の評価中にあいまいなシンボルを解析するなどの目的で表示スコープを使用します。たとえば、次のコマンドを入力すると、dbx は表示スコープを使用して印刷する i を判断します。


(dbx) print i

各スレッドまたは LWP は独自の表示スコープを持っています。スレッド間を切り替えるときに、各スレッドはそれぞれの表示スコープを記憶します。

表示スコープのコンポーネント

表示スコープのいくつかのコンポーネントは、次の事前定義済み ksh 変数内で可視になります。

$vscope

現在の表示スコープ

$vloadobj

現在の表示ロードオブジェクト

$vfile

現在の表示ソースファイル

$vlineno

現在の表示行番号

$vclass

$vfunc が属するクラス

$vfunc

現在の表示関数

現在の表示スコープのすべてのコンポーネントは、相互互換性があります。たとえば、関数を含まないファイルを表示する場合、現在の表示ソースファイルが新しいファイル名に更新され、現在の表示関数が NULL に更新されます。

表示スコープの変更

次のコマンドは表示スコープを変更するもっとも一般的な方法です。

debug コマンドおよび attach コマンドは最初の表示スコープを設定します。

ブレークポイントに達すると、dbx によって表示スコープが現在の位置に設定されます。stack_find_source 環境変数 (dbx 環境変数の設定」参照) が ON に設定されている場合、dbx はソースコードを持っているスタックフレームを検索してアクティブにします。

up コマンド (up コマンド」参照)、down コマンド (down コマンド」参照)、frame number コマンド (frame コマンド」参照)、または pop コマンド (pop コマンド」参照) を使用して現在のスタックフレームを変更すると、新しいスタックフレームからのプログラムカウンタに従って dbx によって表示スコープが設定されます。

list コマンド (list コマンド」を参照) によって使用される行番号位置は、list function または list file コマンドを使用した場合にのみ表示スコープを変更します。表示スコープが設定されると、list コマンド用の行番号位置が表示スコープの最初の行番号に設定されます。続けて list コマンドを使用すると、list コマンド用の現在の行番号位置が更新されますが、現在のファイル内で行をリストしているかぎり表示スコープは変更されません。たとえば、次のように入力すると、dbx によって my_func のソースの開始位置がリストされ、表示スコープが my_func に変更されます。


(dbx) list my_func

次のように入力すると、dbx によって現在のソースファイル内の行 127 がリストされ、表示スコープは変更されません。


(dbx) list 127

file コマンドまたは func コマンドを使用して現在のファイルまたは現在の関数を変更すると、表示スコープも更新されます。

スコープ決定演算子を使用してシンボルを特定する

func または file を使用する場合、「スコープ決定演算子」を使用して、ターゲットとして指定する関数の名前を特定することができます。

dbx では、シンボルを特定するためのスコープ決定演算子として、逆引用符演算子 (`)、C++ 逆引用符演算子 (::)、およびブロックローカル演算子 (: lineno) を使用することができます。これらの演算子は別々に、あるいは同時に使用します。

停止位置以外の部分のコードを表示するためにファイルや関数の名前を特定するだけでなく、スコープ外の変数や式の出力や表示を行なったり、型やクラスの宣言を表示したり (whatis コマンドを使用) する場合にも、シンボルを特定することが必要です。シンボルの特定規則はすべての場合で同じです。この節で示す規則は、あらゆる種類のシンボル名の特定に適用されます。

逆引用符演算子

逆引用符演算子 (`) は、大域スコープの変数あるいは関数を検索するために使用できます。


(dbx) print `item

プログラムでは、同じ関数名を 2 つの異なるファイル (またはコンパイルモジュール) で使用できます。この場合、dbx に対して関数名を特定して、表示する関数を認識させる必要があります。ファイル名に関連して関数名を特定するには、汎用逆引用符 (`) スコープ決定演算子を使用してください。


(dbx) func`file_name`function_name

コロンを重ねたスコープ決定演算子 (C++)

次のような名前を持つ C++ のメンバー関数、トップレベル関数、またはグローバルスコープを伴う変数を特定するときは、コロンを 2 つ重ねた演算子 (::) を使用します。

多重定義された関数名を特定することができます。多重定義された関数名を特定しないと、dbx は多重定義表示リストを自動的に表示して、表示する関数を選択するよう要求します。関数のクラス名がわかっている場合は、それを二重コロンのスコープ決定演算子とともに使用して、名前を特定できます。


(dbx) func class::function_name (args)

たとえば、hand がクラス名で draw が関数名の場合は、次のようになります。


(dbx) func hand::draw

ブロックローカル演算子

ブロックローカル演算子 (:line_number) を使用すると、ネストされたブロック内にある変数を参照することができます。これを行う必要があるのはパラメータまたはメンバー名を隠蔽している局所変数がある場合、またはそれぞれが個別の局所変数を持っている複数のブロックがある場合です。line_number は、対象となる変数に対するブロック内のコードの最初の行番号です。dbx が局所変数をブロックローカル演算子で特定した場合、dbx は最初のコードブロックの行番号を使用しますが、dbx の式ではスコープ内の任意の行番号を使用することができます。

次の例では、ブロックローカル演算子 (:230) が逆引用符演算子と組み合わされています。


(dbx) stop in `animate.o`change_glyph:230`item

次の例は、関数内で複数存在する変数名が、ブロックローカル演算子によって特定され、dbx がその変数の内容を評価している様子を示しています。


(dbx) list 1,$
    1   #include <stddef.h>
    2
    3   int main(int argc, char** argv) {
    4
    5   int i=1;
    6
    7       {
    8            int i=2;
    9            {
   10                   int j=4;
   11                   int i=3;
   12                   printf("hello");
   13            }
   14            printf("world\n");
   15       }
   16       printf("hi\n");
   17   }
   18
(dbx) whereis i
variable: `a.out`t.c`main`i
variable: `a.out`t.c`main:8`i
variable: `a.out`t.`main:10`i
(dbx) stop at 12 ; run
...
(dbx) print i
i = 3
(dbx) which i
`a.out`t.c`main:10`i
(dbx) print `main:7`i
`a.out`t.c`main`i = 1
(dbx) print `main:8`i
`a.out`t.c`main:8`i = 2
(dbx) print `main:10`i
`a.out`t.c`main:10`i = 3
(dbx) print `main:14`i
`a.out`t.c`main:8`i = 2
(dbx) print `main:15`i
`a.out`t.c`main`i = 1

リンカー名

dbx は、(C++ のようにさまざまな名前が混在するため) リンカー名ごとにシンボルを探すよう特別な構文を使用します。シンボル名の接頭辞として # 記号を付け、Korn シェルで $ 記号の前にエスケープ文字 \ を使用します。たとえば、次のようにします。


(dbx) stop in #.mul
(dbx) whatis #\$FEcopyPc
(dbx) print `foo.c`#staticvar

シンボルを検索する

同じ名前が多くの場所で使用されたり、プログラム内の異なる種類の構成要素を参照したりすることがあります。dbx コマンド whereis は、特定の名前を持つすべてのシンボルの完全修飾名 (すなわち位置) のリストを表示します。一方、dbx コマンド which は、特定の名前を式に指定したときに、実際に使用されるシンボルを示します (which コマンド」を参照)。

シンボルの出現を出力する

指定シンボルの出現すべてのリストを出力するには、whereis symbol を使用します。ここで、symbol は任意のユーザー定義識別子にすることができます。次に例を示します。


(dbx) whereis table
forward: `Blocks`block_draw.cc`table
function: `Blocks`block.cc`table::table(char*, int, int, const point&)
class: `Blocks`block.cc`table
class: `Blocks`main.cc`table
variable:       `libc.so.1`hsearch.c`table

この出力には、プログラムが symbol を定義する読み込み可能オブジェクトの名前が、各オブジェクトの構成要素の種類 (クラス、関数、または変数) とともに示されます。

dbx シンボルテーブルの情報は必要に応じて読み取られるため、whereis コマンドは、すでに読み込まれているシンボルの出現についてしか出力しません。デバッグセッションが長くなると、出現のリストは大きくなります (「オブジェクトファイルおよび実行可能ファイル内のデバッグ情報」参照)。

詳細については、whereis コマンド」を参照してください。

実際に使用されるシンボルを決定する

which コマンドにより、特定の名前を (完全に修飾しないで) 式に指定したときにどのシンボルが使用されるかを前もって調べることができます。次に例を示します。


(dbx) func
wedge::wedge(char*, int, int, const point&, load_bearing_block*)
(dbx) which draw
`block_draw.cc`wedge::draw(unsigned long)

which コマンドに指定したシンボル名が局所的スコープにない場合、スコープ決定パスで検索が行われます。決定パスで最初に見つかった名前の完全修飾名が示されます。

決定パスに含まれる任意の場所で、同じスコープの該当する symbol が複数見つかった場合、あいまいであることを示すメッセージが表示されます。


(dbx) which fid
More than one identifier `fid’.
Select one of the following:
 0) Cancel
 1) `example`file1.c`fid
 2) `example`file2.c`fid

dbx は、あいまいなシンボル名をリストで示し、多重定義であることを表示します。which コマンドのコンテキストでシンボル名のリストから特定のシンボルを選んでも、dbx またはプログラムの状態には影響しません。どのシンボルを選んでも名前が表示されるだけです。

which コマンドは、ある symbol (この例の場合は block) をコマンド (たとえば、print コマンド) のターゲットにした場合に何が起こるかを前もって示すものです。あいまいな名前を指定して、多重定義が表示された場合は、該当する複数の名前のうちのどれを使用するかがまだ特定されていません。dbx は該当する名前を列挙し、ユーザーがそのうちの 1 つを選択するまで待機します。dbx は該当する名前を列挙し、ユーザーがそのうちの 1 つを選択するまで待機します。which コマンドの詳細については、which コマンド」を参照してください。

スコープ決定検索パス

    式を含むデバッグコマンドを発行すると、式内のシンボルが次の順序で調べられます。dbx はシンボルをコンパイラが現在の表示スコープにあるとして決定します。

  1. 現在の表示スコープを使用する現在の関数のスコープ内 (「表示スコープ」参照)。プログラムが、入れ子になったブロックで停止した場合、そのブロック内で検索したあと、その関数によって宣言されている外側のすべてのブロックのスコープ内で検索します。

  2. C++ の場合のみ: 現在の関数クラスのクラスメンバーとその基底クラス。

  3. C++ の場合のみ: 現在のネームスペース。

  4. 現在の関数のパラメータ。

  5. すぐ外側にあるモジュールで、一般に、現在の関数が含まれているファイル。

  6. この共有ライブラリまたは実行可能ファイル専用に作成されたシンボル。これらのシンボルはリンカースコープを使用して作成できます。

  7. メインプログラム用で、その次に共有ライブラリ用のグローバルシンボル。

  8. 前述のすべてで該当するシンボルが見つからなかった場合、別のファイル内の専用すなわちファイル静的な変数または関数と見なされます。dbxenv による scope_look_aside の設定値によっては、コンパイル単位ごとにファイル静的シンボルを検索することもできます。

dbx はこの検索パスで最初に見つけたシンボルを使用します。変数が見つからなかった場合はエラーを報告します。

スコープ検索規則の緩和

静的シンボルおよび C++ メンバー関数のスコープ検索規則を緩和するには、dbx 環境変数 scope_look_aside を on に設定します。

dbxenv scope_look_aside on

または、「二重逆引用符」接頭辞を使用します。

stop in ``func4            func4 may be static and not in scope

dbx 環境変数 scope_look_aside が on に設定されている場合、dbx は次を検索します。

which コマンドは、dbx がどのシンボルを検索するかを前もって示すものです。あいまいな名前を指定して、多重定義が表示された場合は、該当する複数の名前のうちのどれを使用するかがまだ特定されていません。 dbx は該当する名前を列挙し、ユーザーがそのうちの 1 つを選択するまで待機します。

詳細については、func コマンド」を参照してください。

変数、メンバー、型、クラスを調べる

whatis コマンドは、識別子、構造体、型、C++ のクラス、式の型の宣言または定義を出力します。検査できる識別子には、変数、関数、フィールド、配列、列挙定数が含まれます。

詳細については、whatis コマンド」を参照してください。

変数、メンバー、関数の定義を調べる

識別子の宣言を出力するには、次のように入力します。


(dbx) whatis identifier

識別名は、必要に応じてファイルおよび関数情報によって修飾します。

C++ プログラムについては whatis identifier 関数テンプレート例示をリストします。テンプレート定義は、whatis -t identifier を付けて表示されます。「型およびクラスの定義を調べる」を参照してください。

Java プログラムについては、whatis identifier は、クラスの宣言、現在のクラスのメソッド、現在のフレームの局所変数、または現在のクラスのフィールドをリストします。

メンバー関数を出力するには、次のように入力します。


(dbx) whatis block::draw
void block::draw(unsigned long pw);
(dbx) whatis table::draw
void table::draw(unsigned long pw);
(dbx) whatis block::pos
class point *block::pos();
(dbx) whatis table::pos
class point *block::pos();
:

データメンバーを出力するには、次のように入力します。


(dbx) whatis block::movable
int movable;

変数を指定すると、whatis コマンドによってその変数の型が示されます。


(dbx) whatis the_table
class table *the_table;
.

フィールドを指定すると、whatis コマンドによってそのフィールドの型が示されます。


(dbx) whatis the_table->draw
void table::draw(unsigned long pw);

メンバー関数で停止したときは、this ポインタを調べることができます。


(dbx) stop in brick::draw
(dbx) cont
(dbx) where 1
brick::draw(this = 0x48870, pw = 374752), line 124 in
     "block_draw.cc"
(dbx) whatis this
class brick *this;

型およびクラスの定義を調べる

whatis コマンドの -t オプションは、型の定義を表示します。C++ については、whatis -t で表示されるリストは、テンプレート定義およびクラステンプレート例示を含みます。

型または C++ のクラスの宣言を出力するには次のようにします。


(dbx) whatis -t type_or_class_name

whatis コマンドには、継承されたメンバーを表示するための -r (再帰) オプションが用意されています。このオプションを指定すると、指定したクラスの宣言とともに、そのクラスが基となるクラスから継承したメンバーが表示されます。


(dbx) whatis -t -r  class_name

whatis -r による出力は、クラス階層と各クラスのサイズによって長くなることがあります。出力の先頭には、階層のもっとも上にあるクラスから継承されたメンバーのリストが示されます。メンバーのリストは、コメント行によって親クラスごとに分けられます。

ここに、2 つの例を示します。table クラスは、load_bearing_block クラスの子クラスの 1 つです。また、このクラスは、block の子クラスです。

-r を指定しないと、whatis により、table クラスで宣言されているメンバーが示されます。


(dbx) whatis -t class table
class table : public load_bearing_block {
public:
    table::table(char *name, int w, int h, const class point &pos);
    virtual char *table::type();
    virtual void table::draw(unsigned long pw);
};

次に、子クラスが継承するメンバーを表示するために whatis -r がその子クラスで使用された場合の結果を示します。


(dbx) whatis -t -r class table
class table : public load_bearing_block {
public:
  /* from base class table::load_bearing_block::block */
  block::block();
  block::block(char *name, int w, int h, const class point &pos, class load_bearing_block *blk);
    virtual char *block::type();
    char *block::name();
    int block::is_movable();
//  deleted several members from example protected:
    char *nm;
    int movable;
    int width;
    int height;
    class point  position;
    class load_bearing_block *supported_by;
    Panel_item panel_item;
    /* from base class table::load_bearing_block */
public:
    load_bearing_block::load_bearing_block();
    load_bearing_block::load_bearing_block(char *name, int w, int h,
        const class point &pos, class load_bearing_block *blk);
    virtual int load_bearing_block::is_load_bearing();
    virtual class list *load_bearing_block::supported_blocks();
    void load_bearing_block::add_supported_block(class block &b);
    void load_bearing_block::remove_supported_block(class block &b);
    virtual void load_bearing_block::print_supported_blocks();
    virtual void load_bearing_block::clear_top();
    virtual void load_bearing_block::put_on(class block &object);
    class point load_bearing_block::get_space(class block &object);
    class point load_bearing_block::find_space(class block &object);
    class point load_bearing_block::make_space(class block &object);
protected:
    class list *support_for;
    /* from class table */
public:
    table::table(char *name, int w, int h, const class point &pos);
    virtual char *table::type();
    virtual void table::draw(unsigned long pw);
};

オブジェクトファイルおよび実行可能ファイル内のデバッグ情報

ソースファイルを -g オプションを使用してコンパイルして、プログラムをよりデバッグしやすくすることができます。-g オプションを使用すると、コンパイラがデバッグ情報 (スタブまたは DWARF 形式) をプログラム用のコードおよびデータとともにオブジェクトファイルに記録します。

dbx は、必要なときに要求に応じて各オブジェクトファイル (モジュール) のデバッグ情報を解析して読み込みます。module コマンドを使用することによって dbx に特定のモジュール、またはすべてのモジュールのデバッグ情報を読み込むように要求することができます。「ソースファイルおよびオブジェクトファイルの検索」も参照してください。

オブジェクトファイルの読み込み

オブジェクト (.o) ファイルがリンクされると、リンカーは任意で要約情報のみを結果ロードオブジェクトに保存することができます。この要約情報は実行時に dbx で使用して、実行可能ファイルからではなくオブジェクトファイル自体から残りのデバッグ情報を読み込むことができます。作成された実行可能ファイルの容量は小さいですが、dbx を実行するときにオブジェクトファイルが必要になります。

この要件は、オブジェクトファイルを -xs オプションを使用してコンパイルし、オブジェクトファイルのすべてのデバッグ情報をリンク時に実行可能ファイルに入れることによって変更することができます。

アーカイブライブラリ (.a ファイル) をオブジェクトファイルとともに作成して、そのアーカイブライブラリをプログラムで使用した場合、dbx は必要に応じてアーカイブライブラリからオブジェクトファイルを抽出します。ここではオリジナルのオブジェクトファイルは必要ありません。

ただし、すべてのデバッグ情報を実行可能ファイルに入れると、追加のディスク容量が必要になります。デバッグ情報は実行時にプロセスイメージに読み込まれないため、プログラムが遅くなることはありません。

スタブ型式を使用した際のデフォルト動作では、コンパイラは要約情報のみを実行可能ファイルに入力します。

DWARF 形式では、オブジェクトファイルの読み込みをサポートしていません。


注 –

DWARF 形式は、同じ情報をスタブ形式で記録するよりも大幅にサイズが小さくなります。ただし、すべての情報が実行可能ファイルにコピーされるため、DWARF 情報はスタブ情報よりもサイズが大きく見えてしまいます。


モジュールについてのデバッグ情報

module コマンドおよびそのオプションは、デバッグセッション中、プログラムモジュールを追跡するのに役立ちます。module コマンドを使用して、1 つまたはすべてのモジュールについてのデバッグ情報を読み込みます。通常 dbx は、必要に応じて、自動的にゆっくりとモジュールについてのデバッグ情報を読み込みます。

1 つのモジュール name についてのデバッグ情報を読み込むには、次のように入力します。


(dbx) module [-f] [-q] name

すべてのモジュールについてのデバッグ情報を読み込むには、次のように入力します。


(dbx) module [-f] [-q] -a

ここで

-a

すべてのモジュールを指定します。

-f

ファイルが実行可能より新しい場合でも、デバッグ情報を強制的に読み込みます。

-q

静止モードを指定します。

-v

言語、ファイル名などを出力する冗長モードを指定します。これはデフォルト値です。

現在のモジュール名を出力するには、次のように入力します。


(dbx) module

モジュールのリスト

modules コマンドは、モジュール名をリストすることにより、モジュールを追跡することができます。

すでに dbx に読み取られたデバッグ情報を含むモジュールの名前をリスト表示するには、次のように入力します。


(dbx) modules [-v] -read

すべてのプログラムモジュール名 (デバッグ情報付き、またはなし) をリスト表示するには、次のように入力します。


(dbx) modules [-v]

デバッグ情報付きのすべてのプログラムモジュール名をリスト表示するには、次のように入力します。


(dbx) modules [-v] -debug

ここで

-v

言語、ファイル名などを出力する冗長モードを指定します。

ソースファイルおよびオブジェクトファイルの検索

dbx には、プログラムに関連するソースコードファイルの位置を認識させる必要があります。ソースファイルのデフォルトディレクトリは、最後のコンパイル時にそれらが存在したディレクトリです。ソースファイルを移動したか、またはそれらを新しい位置にコピーした場合は、プログラムを再リンクするか、新しい位置に変更してからデバッグを行うか、または pathmap コマンドを使用します。

Sun Studio 11 以前のリリースの dbx で使用されていたスタブフォーマットでは、dbx のデバッグ情報は、オブジェクトファイルを使用してその他のデバッグ情報を読み込むことがあります。ソースファイルは、dbx がソースコードを表示するときに使用されます。

ソースファイルへのパスを含むシンボリック情報は、実行ファイルに含まれています。dbx でソース行を表示する必要がある場合は、必要な分だけシンボリック情報を読み込んでソースファイルの位置を特定し、そこから行を読み取り、表示します。

シンボリック情報には、ソースファイルへのフルパス名が含まれますが、dbx コマンドを入力した場合は、通常はファイルのベース名のみ使用されます。次に例を示します。


stop at test.cc:34

dbx は、シンボリック情報内で、一致するファイルを検索します。

ソースファイルが削除されている場合は、dbx はこれらのファイルからのソース行を表示できませんが、スタックトレースを表示したり、変数値を出力したりできるほか、現在のソース行を把握することもできます。

プログラムをコンパイルしてリンクしたためにソースファイルを移動した場合、その新しい位置を検索パスに追加できます。pathmap コマンドは、ファイルシステムの現在のディレクトリと実行可能イメージ内の名前とのマッピングを作成します。このマッピングは、ソースパスとオブジェクトファイルパスに適用されます。

ディレクトリ from から ディレクトto への新しいマッピングを確立するには、次のように入力します。


(dbx) pathmap [-c] from to

-c を使用すると、このマッピングは、現在の作業ディレクトリにも適用されます。

pathmap コマンドは、ホストによってベースパスの異なる、自動マウントされた明示的な NFS マウントファイルシステムを扱う場合でも便利です。-c は、現在の作業ディレクトリが自動マウントされたファイルシステム上で不正確なオートマウンタが原因で起こる問題を解決する場合に使用してください。

/tmp_mnt/ のマッピングはデフォルトで存在します。

詳細については、pathmap コマンド」を参照してください。