2

アプリケーションで segfault をデバッグしようとしましたが、何が問題なのかわかりません。完全なコードを投稿するには複雑すぎるため、問題をより単純なバージョンに分解しようとしましたが、私の基本的な例が問題なく機能することを確認するためだけに.

ただし、アプリケーションを実行しようとしてまだ立ち往生しているため、次のエラーに関する情報をいただければ幸いです。非常に役立ちます。

Program received signal SIGSEGV, Segmentation fault.
0x00007fffdd921f38 in main_arena () from /lib/libc.so.6

getType()これは、次の行に沿って呼び出そうとすると発生します。

std::map<long, QVAbstractElement *> mElements;

<...>//skipping some stuff

LineElement * insert_el = new LineElement();
mElements[0] = insert_el;

<...>//skipping a lot more stuff

AbstractElement * el = mElements.at(0);

if (!el)
{
    printf("ERROR");
    return (1);
}

int t = el->getType();

この場合、ポインターelが有効であることはわかっていますが、実際のオブジェクトは、LineElementから派生したでAbstractElementあり、基本クラス ( ) にのみ実装されてgetType()いる関数です。gdb でデバッグすると、次のポインタ アドレスが得られます。virtualAbstractElement

(gdb) x el
0x11cf600:  0xdd921f48
(gdb) p el
$1 = (class AbstractElement *) 0x11cf600

今、その関数 () を gdb から呼び出そうとするとgetType、次のようになります。

(gdb) x el->getType()
warning: can't find linker symbol for virtual table for `AbstractElement' value
warning: can't find linker symbol for virtual table for `AbstractElement' value

基本的に、ポインタ チェックが機能し、このオブジェクトを作成したときと比較してアドレスが同じであっても、このオブジェクトの関数を呼び出すことはできないと思います。

最初の質問: これは、異なるスレッドからの呼び出しと関係がありますか? UI に Qt を使用していますが、Qt が独自のスレッドを作成しているかどうか 100% 確信が持てませんか?

2 番目の質問: これは実際には問題がコードのどこかにある可能性があり、結果として関数テーブルが台無しになっていることを意味するのでしょうか?

4

0 に答える 0