web-dev-qa-db-ja.com

シグナル「SIGILL」の原因は何ですか?

NDKとGCCを使用して、いくつかのC++コードをAndroidに移植しています。コードは基本的に実行されます。ある時点で、Eclipseでデバッグするとき、呼び出し

Dabbler::Android::Factory* pFactory = new Dabbler::Android::Factory;

このエラーの原因:

Thread [1] (Suspended: Signal 'SIGILL' received. Description: Illegal instruction.) 
    1 <symbol is not available> 0x812feb44

どういう意味ですか?コンパイラは何らかの理由で不正なコードを生成しましたか?コンストラクターにブレークポイントがあり(何も実行されません)、ヒットしません。私はすでに完全な再構築を行っています。

この問題を引き起こすために何が間違っているのでしょうか?

83
Dabbler

今は動作します。 Android/NDK/GCC/Eclipseで苦労している他の人のために、私はそれをどのように解決したかです:

  1. 満月の真夜中に死んだ猫を埋める
  2. Androidデバイスエミュレータを再起動します

両方の手順が本当に必要かどうか、まだ必要でない場合はどちらが冗長であるかを検証していません。

674
Dabbler

CPUが理解できない命令を実行しようとしたことを意味します。これは、私が推測する破損が原因である可能性があります。または、間違ったアーキテクチャ用にコンパイルされている可能性があります(この場合、O/Sは実行可能ファイルの実行を拒否すると考えていただろう)。根本的な問題が何であるか完全にはわかりません。

24
trojanfoe

特にメモリが破損している場合は、初期化されていない関数ポインタである可能性があります(無効なオブジェクトへの不正なC++ vtableポインタがそれを与える可能性があります)。

BTW gdbウォッチポイントとトレースポイント、および valgrind は、このような問題をデバッグするのに役立つ場合があります(利用可能な場合)。または、いくつかの address sanitizer

21

Gccからclangにコードを移行し、一部の関数の最後のステートメントでSIGILLまたはSIGTRAPを取得し始める場合、関数がvoid以外の戻り値の型で宣言されている場合は、その関数にreturnステートメントがあることを確認してください.

1
Max Klint