问题
I'm currently writing a JNI project where I'm getting the following error log when trying to run my Java code. It tells me that the problematic frame is a jvm.dll one, and in trying to isolate the problem, I'm trying to work out where exactly my problem is (in the JVM vs. my native code) I've attached the thread section of the log, and can append the rest if needed. I also tried reinstalling the JVM.
A fatal error has been detected by the Java Runtime Environment:
EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d8fefb5, pid=720, tid=3128
JRE version: 6.0_21-b07 Java VM: Java HotSpot(TM) Client VM (17.0-b17 mixed mode, sharing windows-x86 ) Problematic frame: V [jvm.dll+0xfefb5]
--------------- T H R E A D ---------------
Current thread (0x02189000): JavaThread "main" [_thread_in_vm, id=3128, stack(0x02120000,0x02170000)]
siginfo: ExceptionCode=0xc0000005, reading address 0x00000000
Registers: EAX=0x00000000, EBX=0x02189118, ECX=0x02189000, EDX=0x6da2f76c ESP=0x0216fa84, EBP=0x0216facc, ESI=0x02189000, EDI=0x00000000 EIP=0x6d8fefb5, EFLAGS=0x00010246
Top of Stack: (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 00000000Instructions: (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 2aStack: [0x02120000,0x02170000], sp=0x0216fa84, free space=13e0216f568k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [jvm.dll+0xfefb5] C [PNMain.dll+0x19c1a] C [PNMain.dll+0x199d3] j PNMain.optimalSideTwist2(ILjava/lang/String;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 frames: (J=compiled Java code, j=interpreted, Vv=VM code) j PNMain.optimalSideTwist2(ILjava/lang/String;Lvtk/vtkPolyDataAlgorithm;DDDDDD)[D+0 j PNMain.rotateLeftRight(Z)[D+282 j PNMain.main([Ljava/lang/String;)V+92 v ~StubRoutines::call_stub
回答1:
To make your debugging easier we can rule out that the JVM has a problem (in 99.99 % of cases it is not the problem), Look in your code. Start by simply stubbing out your JNI call and seeing if the mechanics are properly done. Then start adding pieces of code slowly, after you have inspected all memory allocations and deallocations carefully. You could use a debugger to access your code and go that way also.
Maybe you could reduce your DLL to the smallest piece of code that produces the problem and post the code here for others to run it and look at it if you are stuck ?
The method that caused the crash is optimalSideTwist2 if that helps. That may not be the method that caused the problem. If you are alocating memory between different methods you might be freeing memory that is not yours, or you may be overwriting memory.
来源:https://stackoverflow.com/questions/3500378/exception-access-violation-java