5

アプリケーションでJMEを使用していますが、次のメッセージが表示されてクラッシュすることがあります。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x3d601ad7, pid=168, tid=4012
#
# JRE version: 6.0_29-b11
# Java VM: Java HotSpot(TM) Client VM (20.4-b02 mixed mode, sharing windows-x86)
# Problematic frame:
# C  [ig4dev32.dll+0x21ad7]
#
# An error report file with more information is saved as:
# C:\...\hs_err_pid168.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

ログファイルは次のリンクから見つけることができます:http ://sergpank.heliohost.org/log.html

最も奇妙なことは、私の場合、ビルドされたコードのみがクラッシュすることですが、Eclipseからそれを起動すると、すべてが私のマシンで正常に動作します。AMDビデオアダプタを搭載したマシンでは、何もクラッシュしません。Intelビデオカードを搭載した他のマシンでは、クラッシュが表示され、デバッグ段階で発生することがあります。

これは、antの設定が正しくないために発生すると思い始めています(startup.iniでは、次のパスが設定されています:-Djava.library.path = lib / dllsなので、プロジェクトのdllが表示されます)。しかし、AMDでほぼ完全に動作し、Intelでクラッシュする理由をまだ理解できません。

多分それはアリに関連したものであり、私はマンフェストにdllを追加する必要があります...ドキュメントを調べて、それがどのように行われるかを見つけることができません。

解決:

64ビットシステムでは、対応するJVM(64ビット)を使用する必要があり、その後何もクラッシュしません=))

4

2 に答える 2

2

クラッシュは、32ビットJVMが64ビットOSで使用されたために発生します。この場合、32ビットのdllがロードされたようで、クラッシュが発生したのはそのためです。

問題はIntelビデオカードでのみ再現可能であり、重大なバグと見なすことができると思います。Intelがそれを修正したり、実用的な解決策/回避策を提案したりしたい場合、これは素晴らしいことです!=)

于 2012-01-15T07:16:20.980 に答える
1

SwingイベントディスパッチスレッドでOpenGLのような重い作業を行うことは避けてください(JVMをクラッシュさせるスレッドに注意してください:) =>0x3a88e000 JavaThread "AWT-EventQueue-0" [_thread_in_native, id=5228, stack(0x3b170000,0x3b1c0000)。OpenGLの処理は、JMonkeyEngineが提供するスレッドで、JMonkeyEngineが持つイベントディスパッチメカニズムを使用して実行する必要があると思います。Swingレンダリングに他の誰かのAPIを使用している場合は、それを変更するか、別の方法で行う必要があるかもしれません。

編集:AWTGLCanvasがこれを実行し、コンテキストを現在のスレッドに変更しているように見えます。通常のフルスクリーン3Dが機能する場合、Intelドライバーはコンテキストスイッチで問題が発生する可能性があるようです。厳密に言えば、単一のOpenGLレンダリングビューポートしかない限り、実行する作業を単一のOpenGLスレッドにいつでもディスパッチできるため、GLスレッドコンテキストのものは必要ありません。LWJGL Canvasの実装では、必ずしもそうとは限らない場合に、複数のビューポートが必要になると想定しています。これで問題がなければ、1つのビューポートのみをサポートするようにこれを再コーディングできます。コードが単純なので、クラッシュすることはありません。

于 2012-01-10T12:49:12.687 に答える