JNA导致EXCEPTION_ACCESS_VIOLATION?

时间:2008-12-18 22:35:28

标签: java java-native-interface awt jna

我的Java UI意外终止并转储了hs_err_pid文件。该文件显示“崩溃发生在Java虚拟机外部的本机代码中。” JNA是我们使用的唯一本机代码。有没有人知道任何可能导致此问题的JNA版本的任何已知问题或错误。我已经在下面的错误文件中包含了一些内容。

An unexpected error has been detected by Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d02bcbd, pid=312, tid=3616

 Java VM: Java HotSpot(TM) Client VM (11.0-b16 mixed mode, sharing windows-x86)<br>
 Problematic frame:
 C  [awt.dll+0x2bcbd]

 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.

Current thread (0x02acf000):  JavaThread "AWT-Windows" daemon [_thread_in_native, id=3616, stack(0x02eb0000,0x02f00000)]

siginfo: ExceptionCode=0xc0000005, writing address 0xe2789280


Registers:
EAX=0x234f099c, EBX=0x00001400, ECX=0x00000100, EDX=0xe2789280
ESP=0x02eff4a4, EBP=0x00000400, ESI=0x234f099c, EDI=0xe2789280
EIP=0x6d02bcbd, EFLAGS=0x00010206

Top of Stack: (sp=0x02eff4a4)
0x02eff4a4:   02eff500 00000100 02eff584 00000100
0x02eff4b4:   6d0a5697 00000400 00000400 00000100
0x02eff4c4:   00000100 02eff700 02eff500 00000000
0x02eff4d4:   00000000 00000100 041ac3a0 00000100
0x02eff4e4:   00182620 00000400 e2789280 00000000
0x02eff4f4:   00000000 00000100 00000100 00000000
0x02eff504:   00000000 00000100 00000100 00000000
0x02eff514:   00000000 00000004 00000400 00000000

Instructions: (pc=0x6d02bcbd)
0x6d02bcad:   00 00 00 8b 4c 24 14 8b e9 c1 e9 02 8b f0 8b fa
0x6d02bcbd:   f3 a5 8b cd 83 e1 03 f3 a4 8b 74 24 18 8b 4c 24

Stack: [0x02eb0000,0x02f00000],  sp=0x02eff4a4,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [awt.dll+0x2bcbd]

[error occurred during error reporting (printing native stack), id 0xc0000005]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  sun.awt.windows.WToolkit.eventLoop()V+0
j  sun.awt.windows.WToolkit.run()V+69
j  java.lang.Thread.run()V+11
v  ~StubRoutines::call_stub

4 个答案:

答案 0 :(得分:3)

我只是遇到了同样的错误,它恰好是新的Direct3d加速Java2d功能的一个错误,1.6.0_11发生在具有低视频内存的机器上。 如果您使用-Dsun.java2d.d3d = false启动应用程序,它应该再次运行。 跟踪此问题的太阳虫如下:http://bugs.sun.com/view_bug.do?bug_id=6788497

答案 1 :(得分:1)

判断:

Stack: [0x02eb0000,0x02f00000], sp=0x02eff4a4, free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [awt.dll+0x2bcbd]

(此时堆栈跟踪显然已经爆炸)您可能会遇到AWT库中的错误。

答案 2 :(得分:1)

仅仅因为您故意使用的本机代码的唯一部分是JNI /任何并不意味着像您这样的崩溃在位置或时间上与它相关。在任何给定的JVM /执行中都会默默地使用各种本机支持,而且我曾经有过一次由于早期发生的腐败以及JVM本身而导致的奇怪崩溃。

在我的情况下,我在闪亮的新型多CPU(Niagara)盒子上找到了并发GC线程中的令人兴奋的错误,这让各种炸弹等待关闭,我有没有我的应用程序中的非JDK本机代码。

当Sun的GC团队修复了他们的错误(非常友好地为我提供了一个测试盗版VM)时,我的问题就消失了(好吧,经过一两轮之后,这个问题)。

RGDS

戴蒙

答案 3 :(得分:0)

您遇到了访问冲突,这意味着某些代码试图访问不允许访问的地址,这通常是因为给定地址没有任何内存。堆栈跟踪指向跳过问题的位置,可能或可能不是是问题的根源。人们在谈论本机代码时有时会忘记这一点,即使他们已经意识到这一点。

我使用过JNA,但从未遇到任何问题。如果存在访问冲突,那是我的错。这是一些简单的建议。

确保您的机器声音良好。使用Memtest86+测试你的记忆力。如果它是硬件问题,那就找不到软件错误。

使用JNA查看代码。请注意,即使Java中的调用看起来不显眼,您也可以编写可以搞乱任何内容的低级代码。很可能,使用JNA的代码做错了并破坏了内存。例如,确保使用正确的调用约定和数据对齐。如果有疑问,请让一个对C感到满意的人(或更普遍的低级别的东西)来帮助你。

不要完全排除其他因素。你可能会遇到JVM错误或其他问题,但要小心这是多少。如果你听到蹄声,想想马匹,而不是斑马。