2017-01-20 18 views
3

Я взаимодействую с собственной библиотекой Fortran (физикой) из Java/Scala с использованием JNA, вызывается с использованием распределенной вычислительной инфраструктуры Apache Spark.Проблемы с поиском причины SIGSEGV при использовании собственной библиотеки fortran с использованием JNA

следующие отчеты производятся с использованием моей библиотеки /opt/MYORG/hdd/usr/local/lib/mylib.so скомпилирован с ifort и отладочные опции компилятора

Мои исполнители аварии время от времени из-за SIGSEGV, обозначенном JVM ошибки-Report:

# 
# 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 в моем коде (т.е. нет фактического собственного вызова), то нет SIGSEGV, поэтому я заключаю, что проблема должна быть в вызов JNA в мою родную библиотеку.

До сих пор я попытался следующие подсказки: https://software.intel.com/en-us/articles/determining-root-cause-of-sigsegv-or-sigbus-errors без успеха

Может кто-то помочь моему найти причину выше SIGSEGV?

+0

Вы _probably_ не хотите как '-динамический', так и' -статический' (вы, вероятно, должны отказаться от последнего, но иногда это зависит от платформы). – technomage

+0

@technomage Где я использовал '-динамический'? –

+0

Я беспокоюсь, что в вашей библиотеке Fortran может быть почти что угодно. Вы уверены, что в нем нет ошибок? –

ответ

0

Такие ошибки довольно неприятные. Вы можете попытаться применить следующий шаблон:

http://jnicookbook.owsiak.org/recipe-No-015/

При таком подходе вы можете «поймать» SIGSEGV внутри кода. Затем, вы можете попытаться получить трассировку с помощью функции трассировки:

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

Пожалуйста, обратите внимание, что вы не должны делать слишком много внутри обработчика сигналу.

Затем, если вам повезет, вы сможете определить причину проблемы.

Другой подход - фактически отладить JVM с помощью gdb и посмотреть, что там происходит.

Вы можете найти образец JNI отладки здесь:

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

или здесь:

http://jnicookbook.owsiak.org/recipe-No-D002/

или здесь:

https://youtu.be/8Cjeq4l5COU

Как уже было сказано, попробуйте включить проверку границ внутри кода Fortran. Иногда это помогает.

Я надеюсь, что это поможет.

Удачи с JNI/JNA.