2

Linux で JNI 呼び出しを含む Java アプリケーションを実行しているときに、クラッシュのように見える以下のようなトレースがいくつかあることに気付きました。

しかし、アプリケーションは続行され、成功します。

「Java ランタイム環境によって致命的なエラーが検出されました: 純粋仮想メソッドが呼び出されました」

上記のトレースの意味は何ですか? 何がこの失敗を引き起こしたのでしょうか?私はコアダンプを取得しません。コアダンプを取得しても、失敗スタックは毎回異なります。これらの呼び出しでは何も問題はありません。

何か提案してください。

4

2 に答える 2

0

純粋仮想関数がない場合、または純粋に抽象的であると確信している場合、そのエラーは通常、削除されたオブジェクトでメソッドを呼び出そうとするなどのヒープの問題を示しています。JNIを使​​用すると、GCの問題が疑われます。潜在的な問題を追跡するために、メモリ デバッガーでコードを実行してみてください。

于 2012-05-03T07:05:42.383 に答える
0

私の経験から: 新しい Java を起動する前に、以前の Java を強制終了したことを確認してください。そして、プロセスが停止していることを確認してください (私の場合、これには少し時間がかかりました)。その後、新しいものを起動します。

これは Java 側よりも C 側に由来するため、これに C/C++ タグを追加することもできます。より多くの/より良い答えが得られるかもしれません。私の場合、GC の警告が表示されましたが、まだ調査していません。

よく読んでください:

  1. http://c2.com/cgi/wiki?PureVirtualFunctionCalled
  2. http://tombarta.wordpress.com/2008/07/10/gcc-pure-virtual-method-called/

これらの場所からの 2 つの引用。1 か所ですべての回答を求めている人もいることを知っています。

C2 ウィキ:

ちなみに、その理由は、子 virtual が、構築されていないか、すでに破棄されている可能性のあるインスタンスメンバーにアクセスする可能性があるためです。したがって、子を virtual と呼ぶことはできません。

Tombarta のブログ:

なぜこれが起こったのですか?まだ使用中のオブジェクトを削除していたためです。

于 2014-01-23T15:33:40.033 に答える