JavaFX EXCEPTION_ACCESS_VIOLATION [英] JavaFX EXCEPTION_ACCESS_VIOLATION
问题描述
我遇到了JavaFX桌面应用程序的问题,特别是3d渲染功能。
每次我尝试构建和启动JavaFX应用程序时,JVM会出现错误,并且我会得到类似以下错误:
#
#Java运行时环境检测到致命错误:
#
#EXCEPTION_ACCESS_VIOLATION(0xc0000005),pc = 0x0000000000000000,pid = 8440,tid = 9008
#
#JRE版本:Java(TM)SE运行时环境(7.0_51-b13)(版本1.7.0_51-b13)
#Java VM:Java HotSpot(TM)64位服务器VM(24.51-b03)混合模式windows-amd64压缩oops)
#有问题的帧:
#C 0x0000000000000000
#
#无法写入核心转储。默认情况下,在Windows的客户端版本上未启用小型转储器
#
#包含更多信息的错误报告文件保存为:
#D:\ apps\desktop\hs_err_pid8440.log
#
#如果您想提交错误报告,请访问:
#http://bugreport.sun.com/bugreport/crash.jsp
#崩溃在本机代码中发生在Java虚拟机之外。
#查看有问题的框架,了解报告错误的位置。
#
整个日志: http://pastebin.com/FC6NfVjF
我尝试了不同的java版本(1.7_51,1.7_60,以及作为1.8_5),我尝试更新显卡驱动程序。
有些项目确实启动了,但只要我想显示一些更复杂的效果(即悬停按钮),我就会得到同样的例外。
从堆栈跟踪来看,我认为它与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
我正在使用Windows 8.1和DirectX 11的机器上工作。可能它不会帮助,但在这里我也粘贴了DirectX诊断工具日志:
http://pastebin.com/giN4AFv4
感谢任何输入。
崩溃已经发生在 C:\ Windows \system32 \igdumdim64.dll
里面,偏移 0xe5fe9
。
这个库是Intel HD Graphics Driver的一部分。
以下是如何从崩溃日志中找到此内容的快速提示。
#Problematic frame:
#C 0x0000000000000000
零指令指针意味着有一个间接调用,并且目标地址碰巧是 NULL
。此调用的返回地址可能位于堆栈顶部。
堆栈顶部:(sp = 0x000000000ef4d398)
0x000000000ef4d398:00007ffb308b5fe9 000000000e979800
00007ffb308b5fe9
是保存的返回地址。让我们找到它所属的范围。
动态库:
...
0x00007ffb307d0000 - 0x00007ffb31019000 C :\ Windows \ system32 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\基地址:
0x00007ffb308b5fe9 - 0x00007ffb307d0000 = 0xe5fe9
接下来,掌握了dll,我们可以将其拆解并找出确切的函数。给定偏移。
PS
还有一个特定于Windows的Java标志 -XX :+ CreateMinidumpOnCrash
,有助于为分析生成更有意义的崩溃转储。
I have a problem with JavaFX desktop application, specifically with 3d rendering functionalities.
Every time I try to build and launch JavaFX application, JVM crshes and I get error similiar to following one:
#
# 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.
#
Entire log: http://pastebin.com/FC6NfVjF
I tried different java version (1.7_51, 1.7_60, as well as 1.8_5), I tried updating graphic card drivers.
Some project does launch, but as soon as I want to display some 'more complicated' effects (i.e. hovering a button), I get the same exception.
Judging from the stacktrace, I believe it has something to do with 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
I'm working on machine with Windows 8.1 and DirectX 11. Probably it won't help, but here I'm also pasting DirectX Diagnostic Tool log:
http://pastebin.com/giN4AFv4
Thanks for any input.
解决方案 The crash has happened inside C:\Windows\system32\igdumdim64.dll
at offset 0xe5fe9
.
This library is a part of Intel HD Graphics Driver.
Here is a quick tip how to find this from the crash log.
# Problematic frame:
# C 0x0000000000000000
Zero instruction pointer means there was an indirect call, and the target address happened to be NULL
. The return address for this call is likely to be on the top of stack.
Top of Stack: (sp=0x000000000ef4d398)
0x000000000ef4d398: 00007ffb308b5fe9 000000000e979800
00007ffb308b5fe9
is the saved return address. Let's find the range it belongs to.
Dynamic libraries:
...
0x00007ffb307d0000 - 0x00007ffb31019000 C:\Windows\system32\igdumdim64.dll
Find the offset in the library by subtracting the base address:
0x00007ffb308b5fe9 - 0x00007ffb307d0000 = 0xe5fe9
Next, having the dll in hand, we can disassemble it and figure out the exact function at the given offset.
P.S.
There is also a Windows-specific Java flag -XX:+CreateMinidumpOnCrash
that helps to produce a more meaningful crash dump for analysis.
这篇关于JavaFX EXCEPTION_ACCESS_VIOLATION的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!