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


90

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

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

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

回答:


27

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


24
無効な命令を実行する別の原因は、プログラム領域にないアドレスにジャンプすることです。
Paul Nathan

奇妙なことに、私がclangでコンパイルしたときにこれを取得しましたが、gccで問題なく動作しました
Post Self

22

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

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


私にとっては、intを返すはずの関数から値を返していませんでした。したがって、この回答に多少関連しています。どうやってコンパイルできたのかわかりません。
クリスワッツ

11

void以外の戻り値の型を持つすべての関数に、 returnステートメントください。

一部のコンパイラーはデフォルトの戻り値を自動的に提供しますが、戻り値なしで関数を終了しようとすると、ランタイムにSIGILLまたはSIGTRAPを送信するコンパイラーもあります。


あなたが私がSIGILL(QT + Android)の背後にある理由を探しにどのくらいの長さを探したかわからない(あなたの返信に触発された)関数で欠けているreturnステートメントを見つけただけです。ありがとうございました。
Vega4
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.