Я нашел следующий способ действительно интересным.Связав файл ниже с библиотекой 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.
.