java - 调试 Java 原生交互

标签 java debugging profiling native

我需要调试 Java 代码与某个 native dll 的交互。我有一些在 Windbg + sosex 中调试 .NET 原生交互的经验。

但是,似乎不存在任何可以向我显示 Java 调用堆栈的 Windbg 扩展。

此外,我找不到 jdk 6 的任何调试版本。

我并不是那么迫切希望从源代码编译jdk 6(即使我知道如何编译)。

所以,我的问题是如何调试或分析 Java 代码与某些 native DLL 的交互?

最佳答案

我使用 jdb 和 Windbg 的组合来完成此操作。在 native 调用之前和之后使用 jdb 在 java 中设置 bp,并使用 Windbg 在 native 函数的开头设置 bp。两个调试器都不知道对方,也不需要知道对方。您将无法同时获得 Java 字节码帧和 native 帧的堆栈跟踪,但这没什么大不了的,因为您可以在 native 调用之前和之后查看 Java 堆栈。

注意:jvm(至少 1.5 版本)在正常情况下使用异常,这在 native 调试器下运行时是一个巨大的痛苦。幸运的是,EIP 对于所有这些都基本相同,因此您可以忽略使用类似以下内容: .if (@eip == <addr>) {gn}

关于java - 调试 Java 原生交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13279144/

相关文章:

java - 连接相机时出错 : 0

java - 如何在 jdialog 中添加内部框架

java - 如何实时远程调试更改

windows - 内存范围内的 Windbg 中断

c++ - 如何分析程序运行时间

php - 如何读取 .xhprof 文件?

c# - 为什么导入 speedscope 后在 Linux 中跟踪 C# 代码会失败?

java - 在 Android 中使用 Runtime.getRuntime() 创建新进程

java - Tomcat 安全约束不起作用

macos - Mac OSx 上的 OpenCL 内核错误