10

libgdx Android Java開発フレームワーク(gdx-bullet)でラップされた弾丸物理ライブラリを使用しようとしていますが、ランダムな短い作業期間の後に、JVMクラッシュまたは「呼び出された純粋仮想メソッド」がクラッシュします。

それらのいくつかは、一般的に以下を含むhs_err_pidXXXX.logファイルを生成します。

#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0aa0c217, pid=7956, tid=7440
#
# JRE version: 7.0_05-b05
# Java VM: Java HotSpot(TM) Client VM (23.1-b03 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [gdx-bullet.dll+0x1c217]

Current thread (0x04af2800):  JavaThread "LWJGL Application" [_thread_in_native, id=7440, stack(0x04d70000,0x04dc0000)]

siginfo: ExceptionCode=0xc0000005, reading address 0x6572fc0f

Registers:
EAX=0x0073f370, EBX=0x0073f480, ECX=0x0073f484, EDX=0x6572fc07
ESP=0x04dbf3c0, EBP=0x04dbf400, ESI=0x0073f120, EDI=0x04dbf3f0
EIP=0x0aa0c217, EFLAGS=0x00010206

Instructions: (pc=0x0aa0c217)
0x0aa0c217:   ff 52 08 f3 0f 10 05 0c f0 ba 0a f3 0f 10 4c 24

Register to memory mapping:
EDX=0x6572fc07 is an unknown value

Stack: [0x04d70000,0x04dc0000],  sp=0x04dbf3c0,  free space=316k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [gdx-bullet.dll+0x1c217]
C  0x38cffed8

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  com.badlogic.gdx.physics.bullet.gdxBulletJNI.btDiscreteDynamicsWorld_stepSimulation__SWIG_1(JLcom/badlogic/gdx/physics/bullet/btDiscreteDynamicsWorld;FI)I+0
j  com.badlogic.gdx.physics.bullet.btDiscreteDynamicsWorld.stepSimulation(FI)I+7

これはおそらく、Javaコードで参照されなくなったオブジェクトの割り当てを解除するJava GCの問題であるとアドバイスされましたが、Bulletネイティブコードでは引き続き必要です。

私はそれらのために私のコードをレビューしましたが、そのような状況は見つかりませんでした。それはそれらがそこにないという意味ではありません。もっと長く探すこともできますが、このアプローチを進めるには、そのような状況を自分でデバッグする方法を学ぶ必要があると思います。

そこで、gdx-bullet.dllでdumpbin.exeを実行すると、次のことがわかりました。

6AB80000 image base (6AB80000 to 6BD4FFFF)

次に、0x6AB80000 + 0x1c217 = 0x6AB9C217を追加し、dumpbin.exeの分解で調べました。

6AB9C206: 8B 10              mov         edx,dword ptr [eax]
6AB9C208: 89 6C 24 0C        mov         dword ptr [esp+0Ch],ebp
6AB9C20C: 89 7C 24 08        mov         dword ptr [esp+8],edi
6AB9C210: 89 4C 24 04        mov         dword ptr [esp+4],ecx
6AB9C214: 89 04 24           mov         dword ptr [esp],eax
6AB9C217: FF 52 08           call        dword ptr [edx+8]
6AB9C21A: F3 0F 10 05 0C F0  movss       xmm0,dword ptr ds:[6AD3F00Ch]
          D3 6A
6AB9C222: F3 0F 10 4C 24 30  movss       xmm1,dword ptr [esp+30h]
6AB9C228: 80 7E 2C 00        cmp         byte ptr [esi+2Ch],0
6AB9C22C: F3 0F 5C C8        subss       xmm1,xmm0

これはすべて素晴らしいことですが、[edx + 8]に何があるのか​​わからないため、行き詰まっているところです。

使用した弾丸のソースコード(おおよそこれ)があります。

windbg.exeをインストールし、userdump.exeにjavaw.dmpファイルを生成させることができましたが、1つで何をどのように探すべきかわかりませんでした。「r」コマンドを使用してrdxに何があるかを調べようとしましたが、ランダムな値であるhs_err_pidファイルとは対照的に0x0でした。

いくつかのビルドスクリプトを見つけましたが、「デバッグ情報を含める」フラグを追加して、タイムリーに機能させることができるかどうか疑問に思っています。

どの特定のネイティブメソッドに問題があるのか​​を把握するにはどうすればよいですか?

それを知っていれば、そのソースコードを確認して、渡した不正なパラメータや、GCによって必要なオブジェクトの割り当てが解除されたオブジェクトを理解できます。

4

1 に答える 1