【问题标题】:JRE Access Exception Crash Caused by JNAJNA 导致的 JRE 访问异常崩溃
【发布时间】:2011-10-19 07:14:24
【问题描述】:

我正在尝试使用 Version.dll 和 JNA 获取 .exe 的版本信息。

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.win32.W32APIOptions;

/**
 *
 * @author geverding
 */
public interface Version extends Library {

Version INSTANCE = (Version) Native.loadLibrary("Version", Version.class, W32APIOptions.UNICODE_OPTIONS);

public int GetFileVersionInfoSizeW(String lptstrFilename);

public int GetFileVersionInfo(String lptstrFilename, int dwHandle, int dwLen, PointerByReference lpData);

public int VerQueryValue(PointerByReference pBlock, String lpSubBlock, PointerByReference lplpBuffer, IntByReference puLen);

}

...在 Main 方法中

int dwlen = Version.INSTANCE.GetFileVersionInfoSizeW("C:\\Test\\VNCSetup.EXE");

此时JRE抛出异常

#

Java 运行时环境检测到致命错误:

#

PC=0x000007fefc6e14ff 处的异常_ACCESS_VIOLATION (0xc0000005),

pid=3884, tid=2248 #

JRE 版本:6.0_26-b03

Java 虚拟机:Java HotSpot(TM) 64 位服务器虚拟机(20.1-b02 混合模式

windows-amd64 压缩 oops)

有问题的框架:

C [Version.dll+0x14ff]

#

如果您想提交错误报告,请访问:

http://java.sun.com/webapps/bugreport/crash.jsp

崩溃发生在 Java 虚拟机之外的本地代码中。

查看有问题的框架以了解报告错误的位置。

#

--------------- T H R E A D ---------------

当前线程 (0x000000000054c000): JavaThread "main" [_thread_in_native,id=2248, 堆栈(0x00000000024e0000,0x00000000025e0000)]

siginfo:ExceptionCode=0xc0000005,写入地址0x00000001800161ca

寄存器:RAX=0x00000000025df4d8,RBX=0x000000009c2e9678, RCX=0x0000000000000001,RDX=0x000000000774fda0 RSP=0x00000000025df330, RBP=0x00000000025df3b0,RSI=0x000000009c0a4258,RDI=0x0000000000000001 R8 =0x00000001800161ca,R9 =0x000000006da78189, R10=0x00000000025f79b2, R11=0x00000000025df380 R12=0x000000000774fda0, R13=0x000000009c2e9678,R14=0x00000000025df758,R15=0x000000000054c000 RIP=0x000007fefc6e14ff,EFLAGS=0x0000000000010206

栈顶:(sp=0x00000000025df330) 0x00000000025df330:
00000000025df388 00000000025df4d8 0x00000000025df340:
0000000000000008 cccccccccccccccc 0x00000000025df350:
00000000025df478 00000001800161e1 0x00000000025df360:
0000000000000000 00000000025df478 0x00000000025df370:
000000009c0a4258 0000000180016213 0x00000000025df380:
000000009c2e9678 00000001800161ca 0x00000000025df390:
0000000000540000 000000006da78189 0x00000000025df3a0:
00000000025f2cd6 000000000000000a 0x00000000025df3b0:
00000000025df380 000000006da7c399 0x00000000025df3c0:
00000000025df400 000000018000ec6a 0x00000000025df3d0:
000000018000e580 00000000025df408 0x00000000025df3e0:
0000000000000028 000000000000000a 0x00000000025df3f0:
00000000025df680 000007fefc6e15fc 0x00000000025df400:
cccccccccccccccc 00000000025df510 0x00000000025df410:
00000000025df680 00000000025df4c0 0x00000000025df420:
cccccccccccccccccccccccccccccccc

指令:(pc=0x000007fefc6e14ff) 0x000007fefc6e14df: c3 90 90 90 90 90 90 90 90 48 89 5c 24 08 56 57 0x000007fefc6e14ef: 41 54 48 83 ec 30 4c 8b e2 8b f9 4d 85 c0 74 04 0x000007fefc6e14ff:41 83 20 00 b9 01 00 00 00 ff 15 c2 4b 00 00 8b 0x000007fefc6e150f:d8 89 44 24 60 33 d2 44 8d 42 22 49 8b cc ff 15

寄存器到内存映射:

RAX=0x00000000025df4d8 指向线程堆栈: 0x000000000054c000 RBX=0x000000009c2e9678 是一个 oop {方法} - klass: {other class} RCX=0x0000000000000001 是一个未知值 RDX=0x000000000774fda0 是未知值 RSP=0x00000000025df330 是 指向线程堆栈:0x000000000054c000 RBP=0x00000000025df3b0 指向线程堆栈: 0x000000000054c000 RSI=0x000000009c0a4258 是一个 oop {实例类} - klass: {other class} RDI=0x0000000000000001 是一个未知值 R8 =0x00000001800161ca 是未知值 R9 =0x000000006da78189 是 未知值 R10=0x00000000025f79b2 是解释器小码方法 入口点(种类 = 本机)[0x00000000025f74c0, 0x00000000025f8380] 3776 字节 R11=0x00000000025df380 指向堆栈 线程:0x000000000054c000 R12=0x000000000774fda0 是未知值 R13=0x000000009c2e9678 是一个 oop {方法} - klass: {other class} R14=0x00000000025df758 指向 线程堆栈:0x000000000054c000 R15=0x000000000054c000 是 线程

堆栈:[0x00000000024e0000,0x00000000025e0000], sp=0x00000000025df330,可用空间=1020k 本机帧:(J=已编译 Java 代码,j=解释,Vv=VM 代码,C=本机代码)C [Version.dll+0x14ff] GetFileVersionInfoSizeExW+0x17

Java 框架:(J=编译的 Java 代码,j=解释的,Vv=VM 代码)j com.sun.jna.Native.invokeInt(JI[Ljava/lang/Object;)I+0 j com.sun.jna.Function.invoke([Ljava/lang/Object;Ljava/lang/Class;Z)Ljava/lang/Object;+333 j com.sun.jna.Function.invoke(Ljava/lang/Class;[Ljava/lang/Object;Ljava/util/Map;)Ljava/lang/Object;+214 j com.sun.jna.Library$Handler.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;+341 j $Proxy0.GetFileVersionInfoSize(Ljava/lang/String;)I+16 j windowsversion.WindowsVersion.main([Ljava/lang/String;)V+26 v ~StubRoutines::call_stub

--------------- P R O C E S S ---------------

Java线程:(=>当前线程)0x0000000006463800 JavaThread “低内存检测器”守护进程 [_thread_blocked, id=2284, 堆栈(0x0000000006d00000,0x0000000006e00000)] 0x000000000645f800 JavaThread "C2 CompilerThread1" 守护进程 [_thread_blocked, id=3808, 堆栈(0x0000000006c00000,0x0000000006d00000)] 0x000000000645e000 JavaThread "C2 CompilerThread0" 守护进程 [_thread_blocked, id=3780, 堆栈(0x0000000006b00000,0x0000000006c00000)] 0x000000000644d000 JavaThread“JDWP 命令阅读器”守护进程 [_thread_in_native, id=2944, 堆栈(0x0000000006a00000,0x0000000006b00000)] 0x0000000006449800 JavaThread“JDWP 事件帮助线程”守护进程 [_thread_blocked, id=744, 堆栈(0x0000000006900000,0x0000000006a00000)] 0x0000000006443800 JavaThread“JDWP 传输侦听器:dt_shmem”守护进程 [_thread_blocked,id=3336, 堆栈(0x0000000006800000,0x0000000006900000)] 0x0000000000525000 JavaThread“附加监听器”守护进程 [_thread_blocked, id=3244, 堆栈(0x0000000006700000,0x0000000006800000)] 0x0000000000524800 JavaThread“信号调度程序”守护进程 [_thread_blocked, id=1784, 堆栈(0x0000000006600000,0x0000000006700000)] 0x000000000050c000 JavaThread“终结器”守护进程 [_thread_blocked, id=3652, 堆栈(0x0000000006300000,0x0000000006400000)] 0x0000000000508800 JavaThread“引用处理程序”守护进程 [_thread_blocked, id=2216, 堆栈(0x0000000006200000,0x0000000006300000)] => 0x000000000054c000 JavaThread“主”[_thread_in_native,id=2248, 堆栈(0x00000000024e0000,0x00000000025e0000)]

其他线程:0x0000000000502000 VMThread [堆栈: 0x0000000006100000,0x0000000006200000] [id=3596] 0x0000000006480000 WatcherThread [堆栈:0x0000000006e00000,0x0000000006f00000] [id=3156]

VM 状态:不在安全点(正常执行)

VM Mutex/Monitor 当前由一个线程拥有:无

堆 PSYoungGen 总计 28352K,已使用 2499K [0x00000000e0600000, 0x00000000e25a0000, 0x0000000100000000) 伊甸园空间 24320K, 10% 已使用 [0x00000000e0600000,0x00000000e0870f18,0x00000000e1dc0000) 从 空间 4032K,已使用 0% [0x00000000e21b0000,0x00000000e21b0000,0x00000000e25a0000) 到
空间 4032K,已使用 0% [0x00000000e1dc0000,0x00000000e1dc0000,0x00000000e21b0000) PSOldGen
总共 64768K,使用了 0K [0x00000000a1200000, 0x00000000a5140000, 0x00000000e0600000) 对象空间 64768K,已使用 0% [0x00000000a1200000,0x00000000a1200000,0x00000000a5140000) PSPermGen 总计 21248K,使用 4506K [0x000000009c000000, 0x000000009d4c0000, 0x00000000a1200000) 对象空间 21248K,已使用 21% [0x000000009c000000,0x000000009c466a90,0x000000009d4c0000)

代码缓存 [0x00000000025e0000, 0x0000000002850000, 0x00000000055e0000) total_blobs=191 nmethods=7 适配器​​=146 free_code_cache=49918592 maximum_free_block=8704

动态库:0x0000000000400000 - 0x000000000042e000 C:\Program 文件\Java\jdk1.6.0_26\bin\java.exe 0x0000000077620000 - 0x00000000777cc000 C:\Windows\SYSTEM32\ntdll.dll 0x0000000077500000 - 0x000000007761f000 C:\Windows\system32\kernel32.dll 0x000007fefd840000 - 0x000007fefd8ab000 C:\Windows\system32\KERNELBASE.dll 0x000007fefdb70000 - 0x000007fefdc4b000 C:\Windows\system32\ADVAPI32.dll 0x000007feff5c0000 - 0x000007feff65f000 C:\Windows\system32\msvcrt.dll 0x000007feff5a0000 - 0x000007feff5bf000 C:\Windows\SYSTEM32\sechost.dll 0x000007fefda40000 - 0x000007fefdb6e000 C:\Windows\system32\RPCRT4.dll 0x000000006d890000 - 0x000000006e048000 C:\程序 文件\Java\jdk1.6.0_26\jre\bin\server\jvm.dll 0x0000000077400000 - 0x00000000774fa000 C:\Windows\system32\USER32.dll 0x000007feff8c0000 - 0x000007feff927000 C:\Windows\system32\GDI32.dll 0x000007feff3b0000 - 0x000007feff3be000 C:\Windows\system32\LPK.dll 0x000007fefd970000 - 0x000007fefda3a000 C:\Windows\system32\USP10.dll 0x000007fefb090000 - 0x000007fefb0cb000 C:\Windows\system32\WINMM.dll 0x000007feff7e0000 - 0x000007feff80e000 C:\Windows\system32\IMM32.DLL 0x000007feff2a0000 - 0x000007feff3a9000 C:\Windows\system32\MSCTF.dll 0x000000006d800000 - 0x000000006d80e000 C:\程序 文件\Java\jdk1.6.0_26\jre\bin\verify.dll 0x000000006d450000 - 0x000000006d477000 C:\Program Files\Java\jdk1.6.0_26\jre\bin\java.dll 0x00000000777f0000 - 0x00000000777f7000 C:\Windows\system32\PSAPI.DLL 0x000000006d4c0000 - 0x000000006d4f4000 C:\程序 文件\Java\jdk1.6.0_26\jre\bin\jdwp.dll 0x000000006d6d0000 - 0x000000006d6d8000 C:\Program Files\Java\jdk1.6.0_26\jre\bin\npt.dll 0x000000006d850000 - 0x000000006d862000 C:\程序 文件\Java\jdk1.6.0_26\jre\bin\zip.dll 0x000000006d300000 - 0x000000006d30a000 C:\程序 文件\Java\jdk1.6.0_26\jre\bin\dt_shmem.dll 0x000007fefce50000 - 0x000007fefce67000 C:\Windows\system32\CRYPTSP.dll 0x000007fefcb50000 - 0x000007fefcb97000 C:\Windows\system32\rsaenh.dll 0x000007fefc8b0000 - 0x000007fefc8ce000 C:\Windows\system32\USERENV.dll 0x000007fefd580000 - 0x000007fefd58f000 C:\Windows\system32\profapi.dll 0x000007fefd4b0000 - 0x000007fefd4bf000 C:\Windows\system32\CRYPTBASE.dll 0x000000006d6a0000 - 0x000000006d6b7000 C:\程序 文件\Java\jdk1.6.0_26\jre\bin\net.dll 0x000007fefec90000 - 0x000007fefecdd000 C:\Windows\system32\WS2_32.dll 0x000007feff810000 - 0x000007feff818000 C:\Windows\system32\NSI.dll 0x000007fefcdf0000 - 0x000007fefce44000 C:\Windows\system32\mswsock.dll 0x000007fefcde0000 - 0x000007fefcde7000 C:\Windows\System32\wship6.dll 0x000007fefae10000 - 0x000007fefae25000 C:\Windows\system32\NLAapi.dll 0x000007fefcc70000 - 0x000007fefcccb000 C:\Windows\system32\DNSAPI.dll 0x000007fef4a70000 - 0x000007fef4a7b000 C:\Windows\System32\winrnr.dll 0x000007fef4a50000 - 0x000007fef4a65000 C:\Windows\system32\napinsp.dll 0x000007fef4a30000 - 0x000007fef4a49000 C:\Windows\system32\pnrpnsp.dll 0x000007fefc7b0000 - 0x000007fefc7b7000 C:\Windows\System32\wshtcpip.dll 0x000007fefb470000 - 0x000007fefb497000 C:\Windows\system32\IPHLPAPI.DLL 0x000007fefb450000 - 0x000007fefb45b000 C:\Windows\system32\WINNSI.DLL 0x000007fef4b50000 - 0x000007fef4b58000 C:\Windows\system32\rasadhlp.dll 0x000007fefb2e0000 - 0x000007fefb333000 C:\Windows\System32\fwpuclnt.dll 0x0000000180000000 - 0x0000000180037000 C:\Users\geverding\AppData\Local\Temp\jna7891581094505694184.dll 0x000007fefc6e0000 - 0x000007fefc6ec000 C:\Windows\system32\Version.dll

VM 参数:jvm_args:-Xdebug -Xrunjdwp:transport=dt_shmem,address=javadebug -Dfile.encoding=UTF-8 java_command:windowsversion.WindowsVersion 启动器类型: SUN_STANDARD

环境变量: PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;c:\Program 文件 (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files (x86)\WinMerge;C:\Program Files\SlikSvn\bin\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;c:\Program 文件 (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files (x86)\WinMerge;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;c:\Program 文件 (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files (x86)\WinMerge;C:\Program 文件 (x86)\CVSNT;C:\Program 文件\WinRar;C:\Program Files\WinRar;C:\ProgramFiles\SlikSvn\bin USERNAME=geverding OS=Windows_NT PROCESSOR_IDENTIFIER=Intel64 系列 6 Model 15 Stepping 6,正版Intel

--------------- S Y S T E M ---------------

操作系统:Windows 7 Build 7600

CPU:共 2 个(每个 cpu 2 个内核,每个内核 1 个线程)系列 6 型号 15 步进 6、cmov、cx8、fxsr、mmx、sse、sse2、sse3、ssse3

内存:4k 页,物理 6216888k(3835956k 空闲),交换 12431876k(9888884k免费)

vm_info:Java HotSpot(TM) 64 位服务器 VM (20.1-b02) 用于 windows-amd64 JRE (1.6.0_26-b03),建于 2011 年 5 月 4 日 07:15:24 由 带有 MS VC++ 8.0 (VS2005) 的“java_re”

时间:2011 年 8 月 3 日星期三 11:33:47 经过时间:8 秒

有人知道为什么会这样吗?

【问题讨论】:

  • 您能否将导致 VM 崩溃的调用分成两行,第一行获取实例,第二行进行方法调用,然后看看哪一行终止了 VM?当您在 VM 之外执行本机代码时遇到问题时,这种硬崩溃很常见。
  • @berry120,我在搞砸之后发现了我的错误。 MSDN 说这个方法调用中的一个参数是可选的MSDN。显然它需要在那里,因为在我添加了第二个参数之后,部分代码起作用了。您对 JNA/获取文件版本信息有任何经验吗?
  • 害怕 - 我从来没有真正需要,而且我可能也不会以这种方式接近它,因为它会将您与平台特定的 API 联系起来。我可能会亲自使用校验和。
  • 我对编程比较陌生,所以这可能是错误的。我试图获取本地文件的版本信息以确定我是否需要下载/安装存储在服务器上的文件。校验和只会告诉我文件是否损坏,这就是我理解的方式。如果我错了,请纠正我。
  • 校验和(几乎)对文件来说是唯一的 - 仅更改文件中的一个字节会产生完全不同的校验和。所以如果知道服务器上最新文件的校验和,而当前本地文件有不同的校验和,那肯定是老版本了。

标签: java jna jvm-crash


【解决方案1】:

如果这是一个 MS 库,您需要从 StdCallLibrary 派生,或者将 OPTION_CALLING_CONVENTION=>STDCALL_CONVENTION 添加到传递给库加载的选项中。

如果您使用错误的调用约定进行调用,您可能会导致 VM 崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多