我需要调试我们的 Java 代码与某个本机 dll 的交互。我在windbg + sosex中调试.NET-native交互有一些经验。
但是,似乎不存在任何可以显示 Java 调用堆栈的 windbg 扩展。
另外,我找不到任何 jdk 6 的调试版本。
我并不急于从源代码编译 jdk 6(即使我知道如何)。
所以,我的问题是你将如何调试或分析你的 Java 代码与一些本机 DLL 的交互?
我已经使用 jdb 和 windbg 的组合来完成此操作。在本地调用之前和之后使用 jdb 在 java 中设置 bp,并使用 windbg 在本地函数的开头设置 bp。调试器都不知道对方,也不需要知道。您将无法同时获得包含 Java 字节码帧和本机帧的堆栈跟踪,但这没什么大不了的,因为您可以在本机调用之前和之后查看 Java 堆栈。
注意:jvm(至少 1.5 版本)在正常情况下使用异常,这在本机调试器下运行时是一个巨大的痛苦。幸运的是,EIP 对于所有这些几乎都是相同的,所以你可以忽略使用类似的东西:.if (@eip == <addr>) {gn}