2016-04-01 15 views
2

私のアプリでは、ウィジェットポインタ内のフィールドにアクセスしようとした後にSIGSEGVフォルトが発生します。そのウィジェットはサードパーティのライブラリから来ています。私は信号が投げられるところを正確に知っています。私が知りたいのは、その特定の瞬間に、障害のあるウィジェットの「this」ポインタが削除されているかどうか、そしていつ発生したかです。GDB:特定のオブジェクトのデストラクタを呼び出すときのブレークポイント

私のオブジェクトが存在することが分かっている場所にブレークポイントを設定し、ここで私の質問が生まれた場所は、gdbです: "この特定の" this "ポインタのデストラクタ"と呼ばれています。どうすればgdbにそのことを伝えることができますか?

このような場合、シグナルがスローされる前にオブジェクトが削除されているか、そのオブジェクトがどこで、なぜ削除されたのかを知ることができます(状況を修正するため)。

答えて

4

どうすればgdbに通知できますか?

条件付きブレークポイントを使用します。例:

cat -n t.cc 
    1 struct Foo { 
    2 ~Foo() {} 
    3 }; 
    4 
    5 Foo *af1, *af2; 
    6 int main() 
    7 { 
    8 Foo f1; 
    9 af1 = &f1; 
    10 { 
    11  Foo f2; 
    12  af2 = &f2; 
    13 } 
    14 } 

g++ -g t.cc && gdb -q ./a.out 

(gdb) b 12 
Breakpoint 1 at 0x400500: file t.cc, line 12. 
(gdb) r 
Starting program: /tmp/a.out 

Breakpoint 1, main() at t.cc:12 
12  af2 = &f2; 
(gdb) p &f2 
$1 = (Foo *) 0x7fffffffdc9f 
(gdb) p &f1 
$2 = (Foo *) 0x7fffffffdc9e 
(gdb) b 'Foo::~Foo()' if this == 0x7fffffffdc9f 
Breakpoint 2 at 0x400532: file t.cc, line 2. 
(gdb) c 
Continuing. 

Breakpoint 2, Foo::~Foo (this=0x7fffffffdc9f, __in_chrg=<optimized out>) at t.cc:2 
2  ~Foo() {} 
(gdb) bt 
#0 Foo::~Foo (this=0x7fffffffdc9f, __in_chrg=<optimized out>) at t.cc:2 
#1 0x0000000000400517 in main() at t.cc:12 
(gdb) c 
Continuing. 
[Inferior 1 (process 121877) exited normally] 

出来上がり:f1だったときにブレークポイントがf2が破壊した時にヒットしたがいませんでした。

+0

特定のブレークポイントごとに名前を設定する方法はありますか?私は3つの異なるオブジェクトに対してブレークポイントを設定しており、デストラクタが呼び出されると、 "this"パラメータはわかりません。 –

+1

@ Peregring-lk私はブレークポイント名を与える方法を知らないけど、 'output'のようなものを含めて'コマンド 'を使ってブレークポイントがヒットしたときに実行するコマンドのリストを追加することができます。 \ n ""と呼ばれています。 –

関連する問題