3

アプリケーションの 1 つについて、/var/log/messages に以下のメッセージがいくつか表示されます。

Sep 18 03:24:23 <machine_name> kernel: application_name[14682] trap invalid opcode rip:f6c6e3ce rsp:ffc366bc error:0
...
Sep 18 03:19:35 <machine_name> kernel: application_name[4434] general protection rip:f6cd43a2 rsp:ffdfab0c error:7b2

これらの出力が何を意味するのか、問題の原因となっている機能/コードをどのように追跡できるのかわかりません。さらに、「無効なオペコードをトラップする」および「一般的な保護」とはどういう意味ですか?

4

2 に答える 2

2

ハードウェアが新しいオペコード/命令セット (SSE 4/5) をサポートしていないか、適切な製造元からのものではない (AMD と Intel の両方にのみ機能する特定のオペコードがある) など、「無効な」オペコードを引き起こす別の可能性があります。または、特定の操作を実行する権限がないだけです (ただし、これはおそらく別のものとして表示されます)。

上記から、RIP を「レジスタ (?) 命令ポインタ」、RSP を「レジスタ スタック ポインタ」とすることができます。この場合、デバッガを使用して、指定したアドレス (RIP) に実行ハードウェア ブレークポイントを設定し、トレースすることができます。それを呼んでいるものを戻してください(LinuxまたはUnixを使用しているように見えるので、これはかなりあいまいです)。Windows を使用している場合は、カスタム例外フィルターを使用してEXCEPTION_ILLEGAL_INSTRUCTIONイベントをキャプチャし、もう少し情報を取得してみてください。

于 2010-09-21T09:08:23.013 に答える
2

通常、これは、プログラムの命令ポインターがデータまたはガベージを指していることを意味します。これは一般的に、浮遊ポインタなどへの書き込みが原因です。

シナリオの 1 つは、メンバー関数のアドレスを意味のないものに置き換えて、コードがクラスの仮想テーブルに (漂遊ポインターを介して) 書き込みを行うことです。次にクラスの仮想関数の 1 つを呼び出すと、プログラムはガベージをアドレスとして解釈し、そのアドレスにジャンプします。このアドレスにあるデータがプロセッサにとって有効なマシン コード命令ではない場合、このエラーが表示されます。

于 2010-09-21T08:40:41.420 に答える