私は次の方法が本当に面白いことを発見しました。以下のファイルをデバッグするjniライブラリにリンクすると、ライブラリが動的リンカによってロードされると、gccコンストラクタ属性のおかげで、現在のjvmのgdbサーバが自動的に起動します。
コマンドラインからリモートgdbを使用するか、Eclipseから簡単にデバッグするだけです。私は、デバッグモードでビルドした場合、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
さらに、それはまた、あなたの開発用PC上でgdbserverをインストールし、GDB-multiarchと組み込みデバイス上でデバッグすることができます。
eclipse内からデバッグするときに、C/C++デバッガとJavaデバッガの間で自動的にジャンプします。デバッグセッションの両方を開始するだけです:JavaのものとリモートのC/C++のものは127.0.0.1:11337で動作します。
:[link](http://www2.sys-con.com/itsg/virtualcd/java/archives/0801/austin/index.html)で別の方法を見つけました。このようにして、私はGDBの内部からプロジェクトをデバッグすることができたので、別のシェルを切り替える必要はありませんでした。 –