异常访问违规Java?

时间:2010-08-17 07:51:59

标签: java crash jvm java-native-interface crash-dumps

我正在编写一个JNI项目,我在尝试运行Java代码时遇到以下错误日志。它告诉我有问题的框架是一个jvm.dll,并试图隔离问题,我试图找出我的问题究竟在哪里(在JVM与我的本机代码)我附加了线程日志部分,如果需要可以附加其余部分。我也尝试重新安装JVM。

  

已检测到致命错误   Java运行时环境:

     

EXCEPTION_ACCESS_VIOLATION   (0xc0000005)在pc = 0x6d8fefb5,   pid = 720,tid = 3128

     

JRE版本:6.0_21-b07 Java VM:   Java HotSpot(TM)客户端VM(17.0-b17   混合模式,共享windows-x86)   有问题的框架:V   [+的jvm.dll 0xfefb5]

     

--------------- T H R E A D ---------------

     

当前线程(0x02189000):   JavaThread“main”[_thread_in_vm,   id = 3128,stack(0x02120000,0x02170000)]

     

siginfo:ExceptionCode = 0xc0000005,   读地址0x00000000

     

寄存器:EAX = 0x00000000,   EBX = 0x02189118,ECX = 0x02189000,   EDX = 0x6da2f76c ESP = 0x0216fa84,   EBP = 0x0216facc,ESI = 0x02189000,   EDI = 0x00000000 EIP = 0x6d8fefb5,   EFLAGS = 0x00010246

     

堆栈顶部:(sp = 0x0216fa84)   0x0216fa84:0216fb38 0216fae4   34497370 0216faa0 0x0216fa94:
  6d8010e0 02189000 0216fd34 0216fad0   0x0216faa4:6d906d09 02189000   00000006 00000004 0x0216fab4:
  0216fb38 0216fae8 02189000 02189a08   0x0216fac4:000004c4 6da2f76c   0216faf0 57669c1a 0x0216fad4:
  02189118 0216fbf0 00000000 0216fb04   0x0216fae4:0216fb04 cccccccc   0216fb04 0216fb38 0x0216faf4:
  576699d3 02189118 0216fbf0 00000000

     

说明:(pc = 0x6d8fefb5)   0x6d8fefa5:00 00 00 74 08 8d 4d f0   e8 1e 20 09 00 8b 7d 10 0x6d8fefb5:
  8b 07 c7 45 e0 0c 00 00 00 8b 48 08 0f   b7 51 2a

     

Stack:[0x02120000,0x02170000],   sp = 0x0216fa84,免费   space = 13e0216f568k原生帧:   (J =编译的Java代码,j =解释,   Vv = VM代码,C =本机代码)V   [jvm.dll + 0xfefb5] C.   [PNMain.dll + 0x19c1a] C.   [PNMain.dll + 0x199d3] j   PNMain.optimalSideTwist2(ILjava /郎/字符串; Lvtk / vtkPolyDataAlgorithm; DDDDDD)[d 0 +   j PNMain.rotateLeftRight(Z)[D + 282 j   PNMain.main([Ljava / lang / String;)V + 92 v   ~StubRoutines :: call_stub V   [jvm.dll + 0xf3abc] V.   [jvm.dll + 0x1865b1] V.   [jvm.dll + 0xf3b3d] V [jvm.dll + 0xfd385]   V [jvm.dll + 0x104fdd] C.   [javaw.exe + 0x2155] C.   [javaw.exe + 0x8614] C.   [kernel32.dll + 0x13677] C.   [ntdll.dll + 0x39d42] C.   [NTDLL.DLL + 0x39d15]

     

Java框架:(J =编译的Java代码,   j =解释,Vv = VM代码)j   PNMain.optimalSideTwist2(ILjava /郎/字符串; Lvtk / vtkPolyDataAlgorithm; DDDDDD)[d 0 +   j PNMain.rotateLeftRight(Z)[D + 282 j   PNMain.main([Ljava / lang / String;)V + 92 v   〜StubRoutines :: call_stub

1 个答案:

答案 0 :(得分:3)

为了使调试更容易,我们可以排除JVM存在问题(在99.99%的情况下不是问题),查看代码。首先简单地删除你的JNI调用并查看机制是否正确完成。然后在仔细检查所有内存分配和解除分配后,开始慢慢添加代码片段。您可以使用调试器来访问您的代码,也可以使用这种方式。

也许你可以将你的DLL减少到产生问题的最小代码片段,然后在这里发布代码供其他人运行,如果你被卡住了就看看它?

导致崩溃的方法是OptimalSideTwist2,如果有帮助的话。这可能不是导致问题的方法。如果你在不同方法之间分配内存,你可能会释​​放不属于你的内存,或者你可能会覆盖内存。