Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JNA使用本机fortran库时查找SIGSEGV原因时出现问题_Java_Fortran_Native_Jna_Core - Fatal编程技术网

Java 使用JNA使用本机fortran库时查找SIGSEGV原因时出现问题

Java 使用JNA使用本机fortran库时查找SIGSEGV原因时出现问题,java,fortran,native,jna,core,Java,Fortran,Native,Jna,Core,我正在使用JNA与来自Java/Scala的本地Fortran库(物理)进行接口,该库使用apachespark分布式计算框架调用 以下报告是使用my library/opt/MYORG/hdd/usr/local/lib/mylib生成的。因此使用ifort和调试编译器选项编译而成 -shared -fPIC -save -g -check all -fpe0 -traceback -static -static-intel -Bstatic 由于JVM错误报告指示的SIGSEGV,我的执行

我正在使用
JNA
与来自Java/Scala的本地Fortran库(物理)进行接口,该库使用apachespark分布式计算框架调用

以下报告是使用my library
/opt/MYORG/hdd/usr/local/lib/mylib生成的。因此
使用
ifort
和调试编译器选项编译而成

-shared -fPIC -save -g -check all -fpe0 -traceback -static -static-intel -Bstatic
由于JVM错误报告指示的
SIGSEGV
,我的执行器不时崩溃:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fea0f490700, pid=33080, tid=140647778658048
#
# JRE version: Java(TM) SE Runtime Environment (8.0_60-b27) (build 1.8.0_60-b27)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  0x00007fea0f490700
报告全文上载于此处:

我设法创建了一个核心转储,我用它进行了分析

gdb /usr/java/jdk1.8.0_60/bin/java core.33080

(gdb) bt
#0  0x00007fed0a04f1d7 in raise () from /usr/lib64/libc.so.6
#1  0x00007fed0a0508c8 in abort () from /usr/lib64/libc.so.6
#2  0x00007fed0995b6b5 in os::abort(bool) () from /usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so
#3  0x00007fed09af9bf3 in VMError::report_and_die() () from /usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so
#4  0x00007fed09960edf in JVM_handle_linux_signal () from /usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so
#5  0x00007fed09957673 in signalHandler(int, siginfo*, void*) () from /usr/java/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so
#6  <signal handler called>
#7  0x00007fea0f490700 in ?? ()
#8  0x00007fed0a7fcbc2 in __nptl_deallocate_tsd () from /usr/lib64/libpthread.so.0
#9  0x00007fed0a7fcdd3 in start_thread () from /usr/lib64/libpthread.so.0
#10 0x00007fed0a11173d in clone () from /usr/lib64/libc.so.6
(可以在此处找到输出:)

但是我在我自己的(可能有故障的)库
mylib中没有看到任何线程。因此,所有线程似乎都在等待。到目前为止,没有任何东西能告诉我
mylib.so
导致了
SIGSEGV
,但是如果我用代码中的Mock替换对
mylib.so
的调用(即没有实际的本机调用),就不会出现
SIGSEGV
,因此我得出结论,问题一定是在对本机库的JNA调用中

到目前为止,我尝试了以下提示:没有成功


有人能帮我找到上面的原因吗?

这类错误非常严重。您可以尝试应用以下模式:

在这种方法中,您可以在代码中“捕获”SIGSEGV。然后,您可以尝试使用backtrace函数获取backtrace:

void *array[100];
size_t size;
size = backtrace (array, 100);
backtrace_symbols_fd (array, size, STDOUT_FILENO);
请注意,您不应该在信号处理程序内部执行太多操作

然后,如果你运气好,你将能够发现问题的原因

另一种方法是使用gdb实际调试JVM,看看那里发生了什么

您可以在此处找到JNI调试的示例:

或在此:

或在此:

如前所述,尝试在Fortran代码中启用边界检查。有时它会有帮助

我希望这会有所帮助


享受JNI/JNA带来的乐趣。

您可能不想同时使用
-dynamic
-static
(您可能应该删除后者,但这有时会因平台而异)。@technomage我在哪里使用了
-dynamic
?我担心您的Fortran库中几乎会有任何东西。您确定其中没有错误吗?FWIW您的错误报告表明出错线程试图执行数据-指令指针(RIP)没有引用代码页。这似乎是由于堆栈损坏造成的-当过程结束时引用的堆栈上的返回指令指针已被破坏。堆栈和基指针(RSP/RBP)不一致以及缺乏一致的堆栈跟踪也表明了堆栈损坏。在Fortran中要查找的内容包括(通常)数组边界冲突或过程调用和定义之间的接口不匹配。对不起,我指的是
-shared
,而不是
-dynamic
void *array[100];
size_t size;
size = backtrace (array, 100);
backtrace_symbols_fd (array, size, STDOUT_FILENO);