14

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 の仮想関数です。他のクラスのメンバー変数には、仮想関数 File_ToText を持つクラス OC_Catalog_c のオブジェクトがあります。そのオブジェクトを使用して、仮想関数 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();
}
4

1 に答える 1

14

皆さん、ご協力ありがとうございます。最終的に、このエラーの原因となっている問題を突き止めました。
さらにデバッグして命令をトレースすると、プログラムが ud2a 命令で失敗していることがわかりました。
「警告: '...' を介して非 POD タイプ 'struct sqlrw_request_cb' のオブジェクトを渡すことはできません。呼び出しは実行時に中止されます」という 1 つの警告を無視していました。
これらの警告を解決すると、SIGILL に関連する問題が解決しました。
このリンクの詳細説明: SIGILL を引き起こす ud2a 命令

于 2013-08-25T19:23:04.180 に答える