【发布时间】: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