Java System.loadLibrary вызов в Linux зависает - PullRequest
0 голосов
/ 26 мая 2011

У меня очень маленький файл .so (Доступен здесь: https://docs.google.com/leaf?id=0B4MxFm-ACB3INjhkMjhlNzktYzkxYy00Zjk5LTk0Y2MtZDE2MWQ2MzY1OWUy&hl=en_US&authkey=CMrJguwN)

Я пытаюсь загрузить это в Java на RHEL, а Java main просто зависает (без ошибок или исключений). У меня есть каталог с файлом .so в LD_LIBRARY_PATH, поэтому я знаю, что он на самом деле пытается его загрузить.

Есть идеи, как я могу устранить эту проблему?

public class SmallTester {


    public static void main(String[] args){

        for(String s: System.getenv("LD_LIBRARY_PATH").split(":")){
            System.out.println(s);
        }

        System.loadLibrary("TestAda");

        System.out.println("Here");
    }
}

EDIT:

Основываясь на посте ниже, я сделал стрейс .. Похоже, это повторяет этот вызов снова и снова (хотя я не уверен, что это значит?)

[pid 31464] clock_gettime(CLOCK_MONOTONIC, {3605675, 624255544}) = 0
[pid 31464] gettimeofday({1306417113, 168967}, NULL) = 0
[pid 31464] clock_gettime(CLOCK_MONOTONIC, {3605675, 624435576}) = 0
[pid 31464] clock_gettime(CLOCK_MONOTONIC, {3605675, 624518205}) = 0
[pid 31464] gettimeofday({1306417113, 169216}, NULL) = 0
[pid 31464] clock_gettime(CLOCK_REALTIME, {1306417113, 169306590}) = 0
[pid 31464] futex(0x88b3f04, FUTEX_WAIT_PRIVATE, 1, {0, 49909410}) = -1 ETIMEDOUT (Connection timed out)

Вот полная версия журнала: https://docs.google.com/leaf?id=0B4MxFm-ACB3IYzdhZWIwNWEtYjUzMS00NGM5LWEzZjQtYzMzOWE3MWNhYWQ0&hl=en_US&authkey=CJ-Lv_wG

EDIT2: я также попытался загрузить библиотеку с помощью JNA:

public class SmallTesterJNA {

    public interface CLibrary extends Library {

      CLibrary INSTANCE1 = (CLibrary)
      Native.loadLibrary("TestAda", //  <<< our library goes here
                         CLibrary.class);

    }

    public static void main(String[] args){

        for(String s: System.getenv("LD_LIBRARY_PATH").split(":")){
            System.out.println(s);
        }

        System.loadLibrary(CLibrary.INSTANCE1.toString());

        System.out.println("Here");
    }
}

Вот вывод .. Это выглядит очень похоже: https://docs.google.com/leaf?id=0B4MxFm-ACB3IYzdhZWIwNWEtYjUzMS00NGM5LWEzZjQtYzMzOWE3MWNhYWQ0&hl=en_US&authkey=CJ-Lv_wG

Edit2:

Вот мой вывод gcore, прикрепленный к процессу .. не уверен, что это говорит мне:

(no debugging symbols found)
(no debugging symbols found)
[Thread debugging using libthread_db enabled]
[New Thread 0xb7fb26c0 (LWP 8326)]
[New Thread 0x7fa8eb90 (LWP 8340)]
[New Thread 0x7fe2db90 (LWP 8339)]
[New Thread 0x7fe7eb90 (LWP 8338)]
[New Thread 0x7feffb90 (LWP 8337)]
[New Thread 0x800afb90 (LWP 8336)]
[New Thread 0x80100b90 (LWP 8335)]
[New Thread 0x80351b90 (LWP 8334)]
[New Thread 0x803a2b90 (LWP 8333)]
[New Thread 0x80423b90 (LWP 8332)]
[New Thread 0x8066db90 (LWP 8331)]
[New Thread 0x806eeb90 (LWP 8330)]
[New Thread 0x8076fb90 (LWP 8329)]
[New Thread 0x807f0b90 (LWP 8328)]
[New Thread 0xb7474b90 (LWP 8327)]
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
0xb7fcd402 in __kernel_vsyscall ()
Saved corefile core.8326

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Обычно я пытаюсь использовать strace перед GDB (отслеживание всех системных вызовов). Выполнение:

strace -f java SmallTester > logfile 2>&1

Вы получите много информации в logfile , последняя часть наиболее интересна. Вы найдете процесс jvm, который ищет ваш файл TestAda.so, и посмотрите, успешно ли он загрузил файл .so. Если это не работает, вернитесь к GDB.

1 голос
/ 26 мая 2011

Взгляните на вашу JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) функцию в вашем коде C ++. У него может быть бесконечный цикл :) Также попробуйте определить это, если он еще не определен.

См. здесь для получения подробной информации о JNI_OnLoad.

1 голос
/ 26 мая 2011

Если бы мне пришлось угадывать, я бы сказал, что вероятным виновником является код инициализации общего объекта.

Получите дамп ядра вашего процесса JVM (используя gcore) или прикрепите gdb, чтобы получить в стеке информацию о том, где именно он зависает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...