JavaFX EXCEPTION_ACCESS_VIOLATION

emb*_*ber 4 java jvm javafx directx-11 access-violation

我有 JavaFX 桌面应用程序的问题,特别是 3d 渲染功能。每次我尝试构建和启动 JavaFX 应用程序时,JVM 都会崩溃,并且出现类似于以下错误:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000000000, pid=8440, tid=9008
#
# JRE version: Java(TM) SE Runtime Environment (7.0_51-b13) (build 1.7.0_51-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  0x0000000000000000
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\apps\desktop\hs_err_pid8440.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Run Code Online (Sandbox Code Playgroud)

整个日志:http : //pastebin.com/FC6NfVjF

我尝试了不同的 Java 版本(1.7_51、1.7_60 以及 1.8_5),我尝试更新显卡驱动程序。某些项目确实启动了,但是一旦我想显示一些“更复杂”的效果(即悬停按钮),我就会遇到相同的异常。

从stacktrace来看,我相信它与directX有关。

j  com.sun.prism.d3d.D3DVertexBuffer.nDrawIndexedQuads(J[F[BI)I+0
j  com.sun.prism.d3d.D3DVertexBuffer.drawQuads(I)V+13
j  com.sun.prism.impl.VertexBuffer.flush()V+12
Run Code Online (Sandbox Code Playgroud)

我正在使用 Windows 8.1 和 DirectX 11 的机器上工作。可能不会有帮助,但在这里我也粘贴 DirectX 诊断工具日志:http : //pastebin.com/giN4AFv4

感谢您提供任何意见。

apa*_*gin 10

崩溃发生C:\Windows\system32\igdumdim64.dll在 offset内部0xe5fe9
该库是英特尔高清显卡驱动程序的一部分。

这是如何从崩溃日志中找到它的快速提示。

# Problematic frame:
# C  0x0000000000000000
Run Code Online (Sandbox Code Playgroud)

零指令指针表示存在间接调用,目标地址恰好是NULL. 此调用的返回地址可能位于堆栈顶部。

Top of Stack: (sp=0x000000000ef4d398)
0x000000000ef4d398:   00007ffb308b5fe9 000000000e979800
Run Code Online (Sandbox Code Playgroud)

00007ffb308b5fe9是保存的返回地址。让我们找到它所属的范围。

Dynamic libraries:
...
0x00007ffb307d0000 - 0x00007ffb31019000      C:\Windows\system32\igdumdim64.dll
Run Code Online (Sandbox Code Playgroud)

通过减去基地址找到库中的偏移量:
0x00007ffb308b5fe9 - 0x00007ffb307d0000 = 0xe5fe9

接下来,有了 dll,我们可以反汇编它并找出给定偏移量处的确切函数。

PS
还有一个特定于 Windows 的 Java 标志-XX:+CreateMinidumpOnCrash,有助于生成更有意义的故障转储以供分析。