gpt4 book ai didi

java - 如何调试 JNI 堆损坏问题?

转载 作者:搜寻专家 更新时间:2023-10-31 20:06:27 24 4
gpt4 key购买 nike

我有一个 Java 应用程序,它通过 JNI 调用遗留应用程序的许多不同 native 方法。但是 JVM 在任何 JNI 调用之外的随机位置崩溃并出现堆栈转储。有时候在GC的时候会崩溃,有时候会在类加载的时候崩溃等等。我怀疑一种或多种 native 方法正在破坏 JVM 堆或其他一些数据结构。我需要知道这是哪个调用,所以我可以修复 native 实现。

遗留应用程序是第 3 方 DLL,我没有它的源代码或符号信息。为了使其可从 Java 调用,我构建了一个使用 JNI 调用约定的包装器 DLL。

完美的解决方案是扩展 JVM 选项,强制 JVM 在每次 JNI 调用后自动检查堆及其其他数据结构的完整性。

你知道有什么可以帮助的吗?

附言请不要告诉我在 JVM 和遗留应用程序之间构建套接字或管道层,因为我们的要求不允许这样做。这是关于错误检测,而不是架构设计。

最佳答案

因为我找不到答案并且无法自己找到现成的解决方案,所以我最终用纯 C++ 构建了一个沙箱进程来找出问题所在。我的 Java 应用程序使用 ProcessBuilder 实例化沙盒进程,然后使用标准输入和标准输出与其通信。实际加载和调用遗留 DLL 的是沙箱,而不是 JVM。然后我使用 Microsoft 的 Application Verifier 监控沙箱进程,发现内存损坏问题 - 有一个调用传递的缓冲区小于预期。确定后,我只是增加了byte[]的长度,在Java应用中用作缓冲区,现在JVM可以不使用沙箱直接调用DLL。

总的来说,我浪费了将近 10 天的时间,因为 JVM 没有在每次 JNI 调用后验证堆的选项。但至少现在,如果有人发现崩溃,我们可以使用沙箱快速调试它。

关于java - 如何调试 JNI 堆损坏问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5305079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com