调试 java-native 交互
Posted
技术标签:
【中文标题】调试 java-native 交互【英文标题】:Debugging java-native interaction 【发布时间】:2012-11-07 22:10:40 【问题描述】:我需要调试我们的 Java 代码与某个本机 dll 的交互。我有一些在 windbg + sosex 中调试 .NET-native 交互的经验。
但是,似乎不存在任何可以显示 Java 调用堆栈的 windbg 扩展。
另外,我找不到任何 jdk 6 的调试版本。
我并不是那么急于从源代码编译 jdk 6(即使我知道如何)。
那么,我的问题是您将如何调试或分析您的 Java 代码与一些本机 DLL 的交互?
【问题讨论】:
这里是一个起点,虽然这篇文章已经有 3 年的历史了:ibm.com/developerworks/mydeveloperworks/blogs/MatthewWhite/… 您可能对 jsadebugd (docs.oracle.com/javase/7/docs/technotes/tools/share/…) 和 jstack docs.oracle.com/javase/7/docs/technotes/tools/share/jstack.html 或 VisualVM 感兴趣 这是 2012 年 5 月发表的关于使用 Netbeans 和 Visual Studio 调试 JNI 应用程序的文章:codeproject.com/Articles/69965/… 谢谢,我需要一些时间来消化这一切。 【参考方案1】:我已经使用 jdb 和 windbg 的组合来完成此操作。在本地调用之前和之后使用 jdb 在 java 中设置 bp,并使用 windbg 在本地函数的开头设置 bp。调试器都不知道对方,也不需要知道。您将无法同时获得包含 java 字节码帧和本机帧的堆栈跟踪,但这没什么大不了的,因为您可以在本机调用之前和之后查看 java 堆栈。
注意:jvm(至少 1.5 版本)在正常情况下使用异常,这在本机调试器下运行时非常痛苦。幸运的是,EIP 对于所有这些几乎都是相同的,所以你可以忽略使用类似的东西:.if (@eip == <addr>) gn
【讨论】:
谢谢,看起来很简单的组合。以上是关于调试 java-native 交互的主要内容,如果未能解决你的问题,请参考以下文章