Контейнер Docker с SWI-Prolog завершен с фатальной ошибкой - PullRequest
0 голосов
/ 06 февраля 2019

Я занимаюсь разработкой веб-приложения Spring Boot, используя JPL-интерфейс SWI-Prolog для вызова Prolog из Java.В режиме разработки все работает нормально.Когда я развертываю его в Docker, первый вызов на JPL через API работает нормально.Когда я снова пытаюсь вызвать JPL, происходит сбой JVM.

Я использую LD_PRELOAD , чтобы указать libswipl.so

SWI_HOME_DIR также устанавливается.

LD_LIBRARY_PATH установлен для указания на libjvm.so

Функция My Controller:

@PostMapping("/rules/testAPI/")
@Timed
public List<String> insertRule() {
    String use_module_http = "use_module(library(http/http_open)).";
    JPL.init();

    Query q1 = new Query(use_module_http);
    if (!q1.hasNext()) {
        System.out.println("Failed to load HTTP Module");
    } else {
        System.out.println("Succeeded to load HTTP Module");
    }

    return null;
}

Консольный выход

1-й звонок

Succeeded to load HTTP Module

2-й звонок

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f31705294b2, pid=16, tid=0x00007f30d2eee700
#
# JRE version: OpenJDK Runtime Environment (8.0_191-b12) (build 1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12)
# Java VM: OpenJDK 64-Bit Server VM (25.191-b12 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libswipl.so+0xb34b2]  PL_thread_attach_engine+0xe2
#
# Core dump written. Default location: //core or core.16
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

Я загрузил файл журнала ошибок в pastebin. нажмите здесь

Кто-нибудь сталкивался с такой же проблемой?Есть ли решение по этому поводу?

Обратите внимание, что я также проверил это также с oracle-java-8, но возникает та же ошибка.

ОБНОВЛЕНИЕ:

@ Ответ CapelliC не сработал.

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019

Наконец это была ошибка пакета JPL.После обращения к разработчикам SWI-Prolog они исправили исправление для SWI-Prolog Git, и теперь ошибка исчезла!

Правильная конфигурация, так что контейнер Docker, способный понимать JPL, находится по этой ссылке: Github: env.sh

0 голосов
/ 06 февраля 2019

Не прямой ответ, потому что он предлагает другой подход, но в течение долгого времени я запускал установку, где написанная мной программа на C ++ обернула бы SWI-Prolog так же, как вы делаете это с Spring Boot, и это было очень труднодобавить функции / поддерживать.Около года назад я перешел на совершенно другой подход, в котором я добавил плагин MQTT для SWI-Prolog, чтобы мой код Prolog мог работать непрерывно, отвечать и отправлять сообщения MQTT.Теперь Prolog может взаимодействовать с другими модулями на разных языках (в основном на Java), но все работает в своем собственном процессе.Это работает намного лучше для меня, и у меня все работает в контейнерах Docker - включая брокера MQTT.Я не твердо предлагаю MQTT (хотя мне это нравится), просто чтобы рассмотреть подход, заключающийся в том, чтобы Java и Prolog были менее тесно связаны.

0 голосов
/ 09 февраля 2019

Скорее всего, причина второго сбоя в том, что вы снова звоните JPL.init().Он должен быть вызван только один раз.

0 голосов
/ 06 февраля 2019

Думаю, я бы попытался «употребить» термин.Например,

Query q1 = new Query(use_module_http);
if (!q1.hasNext()) {
    System.out.println("Failed to load HTTP Module");
} else {
    System.out.println("Succeeded to load HTTP Module:"+q1.next().toString());
    // remember q1.close() if there could be multiple soultions
}

или лучше

if ((new Query(use_module_http)).oneSolution() == null) ...

или еще лучше

if ((new Query(use_module_http)).hasSolution() == false) ...
...