2010-08-17 195 views
6

我正在編寫一個JNI項目,當我嘗試運行我的Java代碼時,出現以下錯誤日誌。它告訴我,有問題的框架是一個jvm.dll之一,並試圖找出問題,我試圖找出我的問題是在哪裏(在JVM與我的本地代碼)我已經附加線程部分日誌,如果需要可以附加其餘部分。我也嘗試重新安裝JVM。異常訪問衝突Java?

已由 Java運行時環境中檢測到致命錯誤:

EXCEPTION_ACCESS_VIOLATION (0000005)中的PC = 0x6d8fefb5, PID = 720,TID = 3128

JRE版本:6.0_21 -b07的Java VM: 爪哇的HotSpot(TM)客戶機VM(17.0-B17 混合模式下,共享的窗口86) 有問題的幀:V [jvm.dll的+ 0xfefb5]

--------------- THREAD ---------------

當前線程(0x02189000): JavaThread 「主」[_thread_in_vm , ID = 3128,堆疊(0x02120000,0x02170000)]

SIGINFO:ExceptionCode = 0000005, 讀取地址0×00000000

寄存器:EAX = 00000000, EBX = 0x02189118,ECX = 0x02189000, EDX = 0x6da2f76c ESP = 0x0216fa84, EBP = 0x0216facc,ESI = 0x02189000, EDI = 0x00000000 EIP = 0x6d8fef B5, 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

堆棧:[0x02120000,0x02170000], SP = 0x0216fa84,自由空間 = 13e0216f568k本地幀: (J =編譯的Java代碼,J =解釋, VV = VM代碼,C =本地代碼)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 + ([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]Ç [javaw.exe的+ 0x2155]Ç [javaw.exe的+ 0x8614]ç [KERNEL32.DLL + 0x13677]ç [NTDLL.DLL + 0x39d42]ç [NTDLL.DLL + 0x39d15]

的Java幀:(J =編譯的Java代碼, Ĵ =解釋的,Vv = VM代碼)jDPNMain.optimalSideTwist2(ILjava/lang/String; Lvtk/vtkPolyDataAlgorithm; DDDDDD)[D + 0 j PNMain.rotateLeftRight(Z)[D + 282j PNMain.main([Ljava/lang/String;)V + 92 v 〜StubRoutines :: call_stub

回答

3

爲了使您的調試更容易,我們可以排除JVM有問題(在99.99%的情況下,這不是問題),請查看您的代碼。首先簡單地描述一下JNI調用,看看機制是否正確完成。然後在仔細檢查所有內存分配和釋放之後,開始慢慢添加代碼片段。您可以使用調試器來訪問您的代碼,並以此方式進行操作。

也許你可以減少你的DLL到產生問題的最小的一段代碼,並在這裏發佈代碼讓別人運行它,並看看它,如果你卡住了?

導致崩潰的方法是optimalSideTwist2(如果有幫助)。這可能不是導致問題的方法。如果你在不同的方法之間分配內存,你可能會釋​​放不屬於你的內存,或者你可能會覆蓋內存。