web-dev-qa-db-ja.com

メンバー関数のC ++ GDBブレークポイント

C++プログラムでGDBを使用する際に問題があります。クラスメンバー関数にブレークポイントを設定したいのですが、その方法の構文がわかりません。私のプログラムは現在機能しており、GDBの使い方を習得しようとしています。私の問題は、オンラインで見つけたすべての情報が本当にmain()ファイルだけを扱っており、他の関数やクラスは扱っていないことです。それらがクラスに関係している場合は、void returnステートメントを持つ関数のみを使用しています。

二分探索木クラスがあります。プログラムの関数にブレークポイントを設定したい。これが私のヘッダーファイルのセクションです。

class BST
{
    BST()
    ...
    private:
    int add((BST * root, BST *src);
}

私は学校のコマンドラインLinuxサーバーにtelnet接続しています。プログラムでGDBをg ++ -g * .cppで正常に実行できます(正常に機能している他のファイルがあります)。ファイルはa.outとして保存されます。私はGDBを実行しています

gdb ./a.out

そして私はGDBに入ります。 void表示関数のブレークポイントは、

b BST::disp_block()

しかし、私が試した追加機能でどうやってそれを行うのですか

b BST::int add(BST*, BST *)
b int BST::add(BST*, BST *)
b BST::add(BST*, BST *)

と私は引数名で試してみました

b BST::int add(BST * root, BST * src)
b int BST::add(BST * root, BST * src)
b BST::add(BST * root, BST * src)

エラーが出続けます

Function "____" not defined.
Make break point pending on future shared library load? (y or [n])

このようなメンバー関数にブレークポイントを設定するにはどうすればよいですか?ウォッチポイントも同じ形式であると想定していますが、説明できない場合もあります。

16
user3543461

Dark Falconが言ったように、オーバーロードがなければbreak BST::addは動作するはずです。

次のように入力することもできます。

(gdb) break 'BST::add(<TAB>

(一重引用符に注意してください)。これにより、GDBにタブ補完を実行するように指示し、次のように行を終了します。

(gdb) break 'BST::add(BST*, BST*)

また、終了点' 'を追加してEnterキーを押し、ブレークポイントを追加できます。

Void表示関数のブレークポイントを取得できます

関数の戻り値の型はシグネチャの一部ではなく、nothingが発生していることに関係しています。

20

クラスに名前空間が定義されている場合は、名前空間を指定する必要がある場合があります。標準の名前空間std以外の場合。正しいバイナリを実行している場合、ファイル名はオプションです。シンボルが実行可能ファイルに存在するかどうかを確認できます。 「nm -C」コマンド。ここで、-CはC++の名前のマングリングを処理します。

例で要約すると、名前空間が「mySpace」で、クラスが「X」で、メンバーが「Y」の場合、ブレークポイントは次のようになります。「(gdb)b mySpace :: X :: Y 」

4
Atul Soni