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
どういう意味ですか?コンパイラは何らかの理由で不正なコードを生成しましたか?コンストラクターにブレークポイントがあり(何も実行されません)、ヒットしません。私はすでに完全な再構築を行っています。
この問題を引き起こすために何が間違っているのでしょうか?
今は動作します。 Android/NDK/GCC/Eclipseで苦労している他の人のために、私はそれをどのように解決したかです:
両方の手順が本当に必要かどうか、まだ必要でない場合はどちらが冗長であるかを検証していません。
CPUが理解できない命令を実行しようとしたことを意味します。これは、私が推測する破損が原因である可能性があります。または、間違ったアーキテクチャ用にコンパイルされている可能性があります(この場合、O/Sは実行可能ファイルの実行を拒否すると考えていただろう)。根本的な問題が何であるか完全にはわかりません。
特にメモリが破損している場合は、初期化されていない関数ポインタである可能性があります(無効なオブジェクトへの不正なC++ vtableポインタがそれを与える可能性があります)。
BTW gdb
ウォッチポイントとトレースポイント、および valgrind は、このような問題をデバッグするのに役立つ場合があります(利用可能な場合)。または、いくつかの address sanitizer 。
Gccからclangにコードを移行し、一部の関数の最後のステートメントでSIGILLまたはSIGTRAPを取得し始める場合、関数がvoid以外の戻り値の型で宣言されている場合は、その関数にreturn
ステートメントがあることを確認してください.