4

是否有任何调试器可以帮助调试 Java JNI 程序以及 C 库?

我应该能够在 Java 中从 static void main 开始调试程序并继续调试并在本机 c 函数中放置断点,然后在控制从 C 转移到 Java 后继续在 Java 中调试。

4

2 回答 2

4

Java 虚拟机调试器与本机代码调试器非常不同。目前还没有这样成熟的解决方案,因为一个调试器能够无缝地从 Java 步进到本机代码并返回。虽然这是一个非常棘手的问题,使得一些聪明的人试图开发这样的解决方案,但毫无疑问,其中涉及到大量无法想象的问题。我个人是通过以下方式做到的:

  1. 在调试模式下启动您的 Java 代码并在您感兴趣的第一个本地调用处放置一个断点。您甚至可以实现一个静态本地调用,它不会做任何重要的事情,但可以让您尽快中断。
  2. 启动本机调试器。这绝对可以是 Eclipse 的同一个实例,有两个先决条件:您安装了 CDT 并且您的本机代码以某种方式编译,CDT 可以理解调试信息。附加到java(w.exe)运行 Java 代码的进程。在本机代码中放置一个断点。
  3. 每当您需要转换 JNI 接口时,尽可能(或需要)将断点放置在调用入口/出口附近。
于 2012-10-30T08:47:06.823 回答
0

我发现在 IntelliJ IDEA 调试器中运行 java 代码并设置一个非常早的断点允许将 CLion 的调试器附加到进程(之后sudo echo 0 > /proc/sys/kernel/yama/ptrace_scope)。然后,每个 IDE 将停止 JVM 并在 Java 或 JNI Native 代码中的相应刹车点处提升它的窗口,并检查内存中曾经停止过上下文的对象。这带来了相当流畅的体验。

于 2020-04-14T18:51:21.480 回答