【问题标题】:JNI EXCEPTION_ACCESS_VIOLATION (0xc0000005) msvcr100.dll+0x1ed7 in Windows onlyJNI EXCEPTION_ACCESS_VIOLATION (0xc0000005) msvcr100.dll+0x1ed7 仅适用于 Windows
【发布时间】:2018-10-29 11:31:04
【问题描述】:

我们有一段 JNI 代码可以让我们链接到一个遗留的 C 库。 Java 应用程序引用 C dll/so 来调用 c 方法,这些方法创建一个带有整数、长整数和字符串负载的新 Java 对象,然后将该对象传递回 Java 代码。 Java 代码尝试打印从 C 接收的这些值,并在代码的不同点随机崩溃。当我们在 Linux 中运行它时,它运行没有问题,但在 Windows 中它会间歇性地崩溃:

# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77e11ed7, pid=893220, 
   tid=887676
#
# JRE version: Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05- b13)
# Java VM: Java HotSpot(TM) Client VM (25.5-b02 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [msvcr100.dll+0x1ed7]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows

我会尝试将其归咎于上帝模式快捷方式 -> Fatal error crashing on latest version of Java on Windows 10 machine

但它只发生在一些代码上,而不是其他代码......所以这肯定是 jni 位是如何在 C 端完成的。

【问题讨论】:

  • 当我们在 linux 中运行它时,它运行没有问题,但在 windows 中它会间歇性崩溃 听起来像是对破坏内存的用户编写代码的完美描述。
  • 问题出在您的 C 代码中。首先寻找未初始化的变量。
  • 你们知道为什么它会在 windows 中崩溃,而在 linux 中却没有吗?
  • 未定义行为在不同操作系统上的不同编译器中表现不同。如何在 Windows 上编译 C 代码?
  • 视觉工作室(开发环境)

标签: java c java-native-interface access-violation


【解决方案1】:

看起来像是某种空指针问题,因为访问发生在接近 0 (0xc0000005) 的位置。由于它不完全为 null,因此您的 C 代码中可能存在一些错误编码的指针算法。

【讨论】:

  • 0xc0000005 是错误代码,不是进程内存地址。
【解决方案2】:

经过大量调试后,通过将几个 java 内部类更改为静态解决了该问题。这些内部类是从 C 代码中引用的。

public class MyClass{
   // public class MyInnerClass{}
   // was changed to 
   public static class MyInnerClass{}
}

显然,C 中的所有 jni 引用也已更改以反映这一点。仍然不知道为什么,但问题现在已经解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2011-04-15
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多