2012-02-13 15 views
11

GDBデバッガを使用してLinux上でJNIコードをデバッグする方法については誰でもガイドできます(可能な場合は他のオプションを提案してください)。Linux上でGDBを使ってJava-JNIをデバッグする方法は?

-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をインストールしましたが、それを使ってプロジェクトをどのようにデバッグすることができないのですか? また、必ず-gオプションを使用して.cppファイルをコンパイルする必要がありますか?デバッグ.soファイルをデバッグしますか?

答えて

10
  1. Javaアプリケーションを起動し、このPID
  2. ...、トップは、psを使用してPIDを検索スタートgdbの
  3. あなたのプログラムコードを取り付け
  4. いつものようにデバッグGDB
  5. を使用して

このブログpostはすべてを説明しています。

+4

:[link](http://www2.sys-con.com/itsg/virtualcd/java/archives/0801/austin/index.html)で別の方法を見つけました。このようにして、私はGDBの内部からプロジェクトをデバッグすることができたので、別のシェルを切り替える必要はありませんでした。 –

0

Link by tm.sauronしかし、私のプロジェクトのように多くのパラメータを渡すと、いくつかのパラメータが渡されます。その場合、IDEを使用してアプリケーションを起動し、ネイティブライブラリでデバッグしたいときにポイントにすることができます。 ofcourseネイティブライブラリをデバッグモードで作成する必要があります。

2

私は次の方法が本当に面白いことを発見しました。以下のファイルをデバッグする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で動作します。

関連する問題