加载使用 jffi 的 RAR 导致 JBoss/JVM 出现段错误
Loading RAR which uses jffi causes JBoss/JVM to segfault
我有一个内部包含 jffi-1.2.9-native.jar
库的 rar - 加载这个 rar 会导致 jvm 出现段错误 - 并出现以下错误:
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library
<path
to>/wildfly/standalone/tmp/vfs/deployment/deploymentb41f06df572811e7/jffi-1.2.9-native.jar-d3417b30dd3cfd1/contents/jni/x86_64-Windows/jffi-1.2.dll
which might have disabled stack guard. The VM will try to fix the
stack guard now. It's highly recommended that you fix the library with
'execstack -c <libfile>', or link it with '-z noexecstack'.
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f9f0990e938, pid=28629, tid=140320456898304
#
# JRE version: Java(TM) SE Runtime Environment (8.0_40-b25) (build 1.8.0_40-25)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.40-b25 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [ld-linux-x86-64.so.2+0x6938] _dl_map_object_from_fd+0x898
我不明白的是,当我 运行 所在的平台是:
时为什么要尝试加载此 dll
Linux <machine> 3.0.101-0.15-default #1 SMP Wed Jan 22 15:49:03 UTC 2014 (5c01f4e) x86_64 x86_64 x86_64 GNU/Linux
我的问题是 - 以前有没有人遇到过这种问题 - 是什么导致 windows dll 被加载到这里?
我能想到的唯一可能性,为什么尝试加载 *.dll
而不是 *.so
,是系统 属性 os.name
通过了到 JVM 并指定了错误的操作系统。
class OsName {
public static void main(String[] args) {
System.out.println("OS: " + System.getProperty("os.name"));
}
}
如果您 运行 示例为 java -Dos.name=FooBar
,则输出为 OS: FooBar
。
我会 post 一个答案,以防有人遇到类似的问题。我没有找到问题的真正根源。我的解决方法是重新组织 EAR,所以现在所有外部依赖项都被收集到 EAR 中,所有其他子模块(例如 EJB 和 WAR)在 maven 依赖项中指定一个 <scope>provided</scope>
.因此 WAR 和 EJB 不包含外部依赖项。这意味着必须在多个地方指定 Maven 依赖项。
我有一个内部包含 jffi-1.2.9-native.jar
库的 rar - 加载这个 rar 会导致 jvm 出现段错误 - 并出现以下错误:
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library
<path
to>/wildfly/standalone/tmp/vfs/deployment/deploymentb41f06df572811e7/jffi-1.2.9-native.jar-d3417b30dd3cfd1/contents/jni/x86_64-Windows/jffi-1.2.dll
which might have disabled stack guard. The VM will try to fix the
stack guard now. It's highly recommended that you fix the library with
'execstack -c <libfile>', or link it with '-z noexecstack'.
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f9f0990e938, pid=28629, tid=140320456898304
#
# JRE version: Java(TM) SE Runtime Environment (8.0_40-b25) (build 1.8.0_40-25)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.40-b25 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [ld-linux-x86-64.so.2+0x6938] _dl_map_object_from_fd+0x898
我不明白的是,当我 运行 所在的平台是:
时为什么要尝试加载此 dllLinux <machine> 3.0.101-0.15-default #1 SMP Wed Jan 22 15:49:03 UTC 2014 (5c01f4e) x86_64 x86_64 x86_64 GNU/Linux
我的问题是 - 以前有没有人遇到过这种问题 - 是什么导致 windows dll 被加载到这里?
我能想到的唯一可能性,为什么尝试加载 *.dll
而不是 *.so
,是系统 属性 os.name
通过了到 JVM 并指定了错误的操作系统。
class OsName {
public static void main(String[] args) {
System.out.println("OS: " + System.getProperty("os.name"));
}
}
如果您 运行 示例为 java -Dos.name=FooBar
,则输出为 OS: FooBar
。
我会 post 一个答案,以防有人遇到类似的问题。我没有找到问题的真正根源。我的解决方法是重新组织 EAR,所以现在所有外部依赖项都被收集到 EAR 中,所有其他子模块(例如 EJB 和 WAR)在 maven 依赖项中指定一个 <scope>provided</scope>
.因此 WAR 和 EJB 不包含外部依赖项。这意味着必须在多个地方指定 Maven 依赖项。