gpt4 book ai didi

java - 使用 JNA 使用 native Fortran 库时查找 SIGSEGV 原因时出现问题

转载 作者:行者123 更新时间:2023-12-02 05:16:04 25 4
gpt4 key购买 nike

我正在使用 JNA 与 Java/Scala 的 native Fortran 库(物理)进行交互,使用 Apache Spark 分布式计算框架调用。

以下报告是使用我的库 /opt/MYORG/hdd/usr/local/lib/mylib.so 生成的编译ifort和调试编译器选项

-shared -fPIC -save -g -check all -fpe0 -traceback -static -static-intel -Bstatic

我的执行器有时会因为SIGSEGV而崩溃,由 JVM 错误报告指示:

#
# 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

完整报告已上传至此处:https://www.amazon.com/clouddrive/share/GDqXyIRNVkY86XYCXkorjiuE4bZm4AmnNWllXBhMVmk?encoding=UTF8&mgh=1&ref=cd_ph_share_link_copy

我设法创建了一个核心转储,并用

进行了分析
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

我进一步分析了核心

thread apply all bt full

(输出可以在这里找到:https://www.amazon.com/clouddrive/share/ZUmv6GEM2oJ0MCCqfnNEs2OOateJVGnhnxoHsJnbvBV?ref_=cd_ph_share_link_copy)

但是我在我自己的(可能有问题的)库中当前没有看到任何线程 mylib.so ,所有线程似乎都在等待。到目前为止,没有任何证据表明 mylib.so导致 SIGSEGV ,但是如果我将调用替换为 mylib.so在我的代码中使用 Mock(即没有实际的 native 调用),没有 SIGSEGV出现,因此我断定问题一定出在对我的 native 库的 JNA 调用中。

到目前为止,我尝试了以下提示:https://software.intel.com/en-us/articles/determining-root-cause-of-sigsegv-or-sigbus-errors没有成功

有人可以帮我找到上述原因SIGSEGV

最佳答案

这种错误是非常讨厌的。您可以尝试应用以下模式:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo015

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

void *array[100];
size_t size;
size = backtrace (array, 100);
backtrace_symbols_fd (array, size, STDOUT_FILENO);

请注意,您不应该在信号处理程序内执行太多操作。

然后,如果幸运的话,您将能够找出问题的原因。

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

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

http://www.owsiak.org/?p=2095

或这里:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNoD001

或这里:

https://youtu.be/8Cjeq4l5COU

正如已经建议的,尝试在 Fortran 代码中启用边界检查。有时它会有所帮助。

希望对您有所帮助。

享受 JNI/JNA 的乐趣。

关于java - 使用 JNA 使用 native Fortran 库时查找 SIGSEGV 原因时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41766149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com