dbx コマンドによるデバッグ

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

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

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


(dbx ) 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();
Notice that table::pos is inherited from block:
(dbx) whatis table::pos
class point *block::pos();

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


(dbx) whatis block::movable
int movable;

変数を指定すると、その変数の型が示されます。


(dbx) whatis the_table
class table *the_table;

フィールドを指定すると、そのフィールドの型が示されます。


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

メンバー関数で停止したときは、this ポインタを調べることができます。この例の場合、whatis からの出力は、コンパイラがレジスタに this 変数を自動的に割り当てたことを示しています。


(dbx) stop in brick::draw
(dbx) cont
// expose the blocks window (if exposed, hide then expose) to force program to hit the breakpoint.
(dbx) where 1
brick::draw(this = 0x48870, pw = 374752)、line 124 in
     “block_draw.cc”
(dbx) whatis this
class brick *this;

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

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


(dbx) whatis -t type_or_class_name 

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


(dbx)  whatis -t -r class_name

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

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

-r を指定しないと、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:
  /* 基底 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();
//  exampleprotected から削除されたいくつかのメンバー:
    char *nm;
    int movable;
    int width;
    int height;
    class point  position;
    class load_bearing_block *supported_by;
    Panel_item panel_item;
    /* 基底 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;
    /* 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);
};