Linux x86_64マシンを使用してプログラムをビルドしています。共有ライブラリを実行可能ファイルにリンクしました。私のプロジェクトでは、関数内でvector<string>
を宣言した関数を呼び出しています。その関数が呼び出されると、私のプログラムが強制終了します。以下のGDBを介してデバッグすると、出力が得られます。
Program received signal SIGILL, Illegal instruction.
0x00002aaaac4d2be7 in OC_Catalog_c::File_ToText (this=0x611aa0) at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:87
87 : _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)
(gdb) bt
0 0x00002aaaac4d2be7 in OC_Catalog_c::File_ToText (this=0x611aa0) at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:87
これは私の共有ライブラリのコンパイルの問題ですか?頭を十分に叩いた。助けてください。
-チャク
クエリの詳細情報の追加:はい、File_ToTextを呼び出している関数は、OC_Catalog_cクラスの仮想関数です。他のクラスのメンバー変数には、OC_Catalog_cクラスのオブジェクトがあり、これにも仮想関数File_ToTextがあります。そのオブジェクトを使用して、仮想関数File_ToTextからOC_Catlog_cのFile_ToText関数を呼び出しています。コードスニペットを表示します。
class Oc_Catalog_c
{
virtual vector<string> File_ToText (void) const;
}
class B
{
const OC_Catalog_c* m_pCatalog;
virtual vector<string> File_ToText (void) const;
}
vector<string> B::File_ToText( void ) const
{
vector<string> a_SubData;
a_SubData = m_pCatalog->File_ToText();
}
皆さん、助けてくれてありがとう。このエラーの原因となっている問題をようやく見つけました。
さらにデバッグして命令をトレースすると、ud2a命令でプログラムが失敗することがわかりました。
「警告:POD以外のタイプの構造体 'struct sqlrw_request_cb'から '...'を渡せません。呼び出しは実行時に中止されます」という警告は無視していました。
これらの警告を解決すると、SIGILLに関連する私の問題が修正されました。
このリンクの詳細説明: d2a命令によりSIGILLが発生