SIGABRT の後にダンプされたコアを分析すると、以下に示すように、(ライブラリ コードに入る前に) 実行されたコードの最後の行がポインターNULL
への割り当てであることが gdbchar
によって示されます。
gdb:
(gdb) bt full
#0 0x006337a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
No symbol table info available.
#1 0x00674815 in raise () from /lib/tls/libc.so.6
No symbol table info available.
#2 0x00676279 in abort () from /lib/tls/libc.so.6
No symbol table info available.
#3 0x006a8cca in __libc_message () from /lib/tls/libc.so.6
No symbol table info available.
#4 0x006af55f in _int_free () from /lib/tls/libc.so.6
No symbol table info available.
#5 0x006af93a in free () from /lib/tls/libc.so.6
No symbol table info available.
#6 0x00d0b14e in __builtin_delete () from /usr/lib/libstdc++-libc6.1-1.so.2
No symbol table info available.
#7 0x0808181c in MyObject::~MyObject (this=0x84f4db0, __in_chrg=3) at ./MyObject.cpp:16
this = (MyObject *) 0x84f4db0
MyObject.cpp:16 リスト:
12: ...
13: MyObject::~MyObject() {
14: if (this->string != NULL) {
15: delete this->string;
16: this->string = NULL;
17: }
18: }
19: ...
まず、なぜ 16 行目でそのコール スタックが発生するのかわかりません。行 15 の実行の結果である演算子を使用した結果である場合は、より意味がありdelete
ます (「行 16」が、そのオブジェクトに割り当てられたメモリを解放するためにデストラクタのコードの後に実行されるコードを表している場合を除きます。ここで推測するだけです)。
それ以外に、誰でもそのコアを正しくデバッグする方法を指摘できますか?