【问题标题】:JAVA JNI C DebuggerJAVA JNI C 调试器
【发布时间】:2012-10-30 05:12:43
【问题描述】:

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

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

【问题讨论】:

标签: java c java-native-interface


【解决方案1】:

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

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

【讨论】:

  • 我在同一条船上。我实际上是 SWT 开发人员,(Eclipse 的界面在 SWT 中)。在 SWT 中有大约 30 个地方 JNI/C 返回到 java。我们找到的唯一解决方案是添加一个由所有回调调用的方法并在那里设置断点。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-11-02
    • 2011-02-15
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多