zcbdandan 2024-07-21 11:06 采纳率: 25%
浏览 52
已结题

JNA调用DLL报堆栈溢出错误(0xC00000FD)

问题描述:

我使用JNA调用一个第三方dll(必须要用,且自己无法修改,对方也不给修改的那种)时,该dll中其他方法均正常调用,唯独调用某个固定方法时,JVM直接crash,出现0xC00000FD的错误,这个错误是stack overflow,而且必现!
在vs2017中用C调用该dll也会出现这种现象,不过如果把vs2017的属性-->连接器-->系统-->堆栈保留大小设置为大于16M,即可运行正常。所以猜测是dll的这个方法是有过深的递归或者过大的局部数组。

运行环境

64位jdk1.8;JNA版本是5.12;操作系统是64位 win10;其他硬件环境是10代i7、16G内存。

已尝试过的方案

jvm运行配置参数 Xms4G、Xmx8G,其他参数比如-Xcheck:jni,Xss从128K--50M都试过,XX:StackShadowPages从3--50也都试过,均无法解决问题。
代码中使用“System.setProperty("jna.protected", "true")”,无法解决问题。
此外,jdk也试过11和13,JNA版本也用过目前最新的5.14,JNI方式也试过,均无法解决问题。
在C中起新线程调用那个有问题的方法——不能解决问题。
Java中起新线程指定stacksize为500M——不能解决问题。

2024年7月28日 结题了!

没有回答能解决问题,手动结题不返还悬赏,应该会每个回答者都分点儿吧?
这次提问咋说呢,回答里780%都是“参照GPT”啥的,每5条建议里会有34条我在提问里明确说过尝试过、没用的建议。

  • 写回答

33条回答 默认 最新

  • 阿里嘎多学长 2024-07-21 11:06
    关注
    获得0.15元问题酬金

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    面对使用Java Native Access (JNA) 调用第三方 DLL 时遇到的堆栈溢出错误(0xC00000FD),你已经采取了一系列的措施,但问题仍未解决。以下是一些可能的解决方案和进一步的排查步骤:

    1. 深入分析DLL代码:如果可能的话,检查DLL的源代码,特别是那个导致问题的函数。确定是否存在递归调用或大数组,以及它们是否是必要的。如果可以的话,优化这些部分以减少堆栈使用。

    2. JVM参数调优:尽管已经尝试了不同的Xss值,但可能还有其他JVM参数可以调整,比如-XX:ThreadStackSize,这可以为每个线程设置更大的堆栈大小。

    3. JNA调用优化:检查JNA调用的方式,确保没有不必要的对象创建或复杂的数据结构传递,这些都可能增加堆栈的使用。

    4. JNI替代方案:如果JNA无法解决问题,考虑使用JNI调用DLL。虽然JNI比JNA复杂,但它提供了更多的控制,包括堆栈大小的调整。

    5. JDK和JNA版本兼容性:确保使用的JDK和JNA版本之间是兼容的。有时新版本可能修复了旧版本中的bug。

    6. JNA配置:除了jna.protected属性外,还可以查看JNA的其他配置选项,比如内存管理和线程属性。

    7. 操作系统和硬件测试:在不同的操作系统和硬件上测试,以确定问题是否与特定的环境设置有关。

    8. 代码审查和优化:审查Java代码,特别是与DLL交互的部分,优化任何可能导致堆栈溢出的代码。

    9. 社区和专家咨询:在Stack Overflow、GitHub Issues或专业的Java论坛上寻求帮助,可能有其他开发者遇到过类似问题。

    10. 日志和调试:增加详细的日志记录和使用调试工具,比如JDB或Eclipse的调试器,来跟踪调用堆栈和内存使用情况。

    11. 内存分析工具:使用内存分析工具,如jmap或VisualVM,来分析JVM的堆栈使用情况,这可能会揭示问题的根本原因。

    12. 错误处理和异常捕获:确保你的代码中有适当的错误处理和异常捕获机制,以便在发生堆栈溢出时能够捕获并处理异常。

    13. 限制递归深度:如果问题函数确实存在递归调用,考虑是否有办法限制递归的深度或重构代码以避免过深的递归。

    14. 使用第三方工具:考虑使用第三方工具或库来帮助调用DLL,这些工具可能提供了额外的错误处理和堆栈管理功能。

    最后,如果所有尝试都失败了,可能需要与DLL的开发者联系,看看他们是否能够提供支持或修改DLL以解决这个问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 修改了问题 7月28日
  • 修改了问题 7月28日
  • 修改了问题 7月23日
  • 展开全部

悬赏问题

  • ¥15 WangEditor嵌入到geeker-admin中,回车没有办法换行
  • ¥30 stm32f103c8t6制作万能红外遥控器
  • ¥15 有人会fastcrud写前端页面吗
  • ¥15 如何解除Uniaccess管控
  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码