web-dev-qa-db-ja.com

プログラムがシグナルSIGILLを受け取った、違法な命令

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();
}
12
Chaks

皆さん、助けてくれてありがとう。このエラーの原因となっている問題をようやく見つけました。
さらにデバッグして命令をトレースすると、ud2a命令でプログラムが失敗することがわかりました。
「警告:POD以外のタイプの構造体 'struct sqlrw_request_cb'から '...'を渡せません。呼び出しは実行時に中止されます」という警告は無視していました。
これらの警告を解決すると、SIGILLに関連する私の問題が修正されました。
このリンクの詳細説明: d2a命令によりSIGILLが発生

12
Chaks