Как отладить Java -JNI с помощью GDB на Linux? - PullRequest
15 голосов
/ 13 февраля 2012

Может ли кто-нибудь рассказать, как отлаживать код JNI в Linux с помощью отладчика GDB (если возможно, предложите другие варианты).

    -My JNI project when running on Linux is leading to a JVM crash.
    -The CPP code has been compiled into .so files.
    -I run the project like  this : *java xyz.jar -commandline_args_to_project*.

У меня установлен Gdb, но я не понимаю, как мы можем отладитьпроект с его помощью.Также мне обязательно нужно скомпилировать файлы .cpp с параметром -g debug .so files?

Ответы [ 3 ]

13 голосов
/ 13 февраля 2012
  1. Запустите ваше Java-приложение
  2. Найдите pid, используя top, ps, ...
  3. Запустите GDB с этим pid
  4. Прикрепите код вашей программы
  5. Отладка как обычно с использованием gdb

Этот блог post объясняет все это.

2 голосов
/ 28 августа 2012

Я нашел следующий способ действительно интересным.Связав файл ниже с библиотекой jni, которую вы хотите отладить, когда библиотека загружается динамическим компоновщиком, она автоматически запускает сервер gdb для текущего jvm, благодаря атрибуту конструктора gcc.

Просто с помощью удаленного gdbиз командной строки или из затмения облегчить отладку.Я только установил, что, если я собираюсь в режиме отладки, я не реализовал пока, чтобы определить, был ли jvm запущен в отладке, чтобы разрешить это только в данный момент, но это может быть легко.

Я просто адаптировалКонцепция из статьи здесь: http://www.codeproject.com/Articles/33249/Debugging-C-Code-from-Java-Application

#ifndef NDEBUG // If we are debugging

#include <stdlib.h>
#include <iostream>
#include <sstream>

namespace debugger {
    static int gdb_process_pid = 0;

    /**
     * \brief We create a gdb server on library load by dynamic linker, to be able to debug the library when java begins accessing it.
     * Breakpoint have naturally to be set.
     */
    __attribute__((constructor))
    static void exec_gdb() {
        // Create child process for running GDB debugger
        int pid = fork();

        if (pid < 0) {
            abort();

        } else if (pid) {
            // Application process

            gdb_process_pid = pid; // save debugger pid
            sleep(10); /* Give GDB time to attach */

            // Continue the application execution controlled by GDB
        } else /* child */ {
            // GDBServer Process

            // Pass parent process id to the debugger
            std::stringstream pidStr;
            pidStr << getppid();

            // Invoke GDB debugger
            execl("/usr/bin/gdbserver", "gdbserver", "127.0.0.1:11337", "--attach", pidStr.str().c_str(), (char *) 0);

            // Get here only in case of GDB invocation failure
            std::cerr << "\nFailed to exec GDB\n" << std::endl;
        }
    }
}
#endif

Кроме того, он также позволяет отладку на встроенных устройствах с установленным gdbserver и gdb-multiarch на компьютере разработчика.

Во время отладки из затменияон автоматически переключается между отладчиком C / C ++ и отладчиком Java.Вам просто нужно запустить оба сеанса отладки: Java и удаленный C / C ++, который работает на 127.0.0.1:11337.

.
0 голосов
/ 13 августа 2012

Ссылка от tm.sauron верна, но было бы менее удобно, когда у нас есть много параметров для передачи в команду Java, как в моем проекте около нескольких строк параметра для передачи.Таким образом, в этом случае мы можем использовать IDE для запуска приложения и разбивать его на точки, когда мы хотим отлаживать в нативной библиотеке.Естественно, собственную библиотеку нужно создавать в режиме отладки.

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