如何使用Java结果调试崩溃:error_code

时间:2019-02-15 14:56:25

标签: java jna

我有一个Java应用程序,它通过JNA使用C ++ DLL。 C ++ DLL是专有的,因此,除非可以制作一个简化的可复制示例,否则我无法共享代码。在我进一步调试之前,要制作一个可复制的示例并不容易。

应用程序偶尔崩溃,并显示错误消息Java Result: -1073740940。我正在从Netbeans运行Java应用程序,尽管没有Netbeans也会崩溃。由于没有 hs_err_.log ,因此我认为崩溃发生在C ++层中。如何开始调试此崩溃?

2 个答案:

答案 0 :(得分:1)

Netbeans的“ Java Result”输出仅告诉您Java程序的退出代码。您可以使用System.exit(-1073740940);生成相同的内容。成功的程序退出,代码为0。其他任何情况都是失败,需要文档解释。

您没有给我们任何指示,表明您正在使用哪个DLL,因此,我们唯一需要使用的信息就是此退出代码。将该int转换为十六进制数字会生成0xc0000374,您可以将其输入到您喜欢的搜索引擎中并找出答案是Heap Corruption Exception。提供了一些示例,但是通常这意味着您正在访问未分配的本机内存。

不知道您在使用什么代码,我猜您在本机内存上做错了什么,调用了本机函数,或者错误地操纵了应用程序中的指针或句柄。

您应该首先仔细查看本机函数的参数。如果字节数不匹配,则类型映射可能会成为问题。研究本机函数的任何基于Pointer的自变量,包括ByReference自变量。追溯代码,查找这些指针何时/如何与本机分配的内存相关联。如果从来没有分配过,那就是问题的一种可能。如果已分配,请查看是否可以找到释放该内存的点,可能是通过其他本机函数释放的。

答案 1 :(得分:1)

崩溃的根本原因是C ++层中的堆损坏。如果由于堆损坏而导致随机崩溃,有时,查明崩溃的原因很复杂,因为当程序尝试操纵损坏的内存时,崩溃可能稍后发生。因此,提供SSCCE也很复杂,尤其是当我们处理专有的旧代码时。

我如何调试此崩溃:

  • 复制:尝试查找崩溃的一致用例。如果崩溃是随机的,则尝试找出总是导致崩溃的一组用户操作。

  • 假设:猜测哪个功能/组件包含崩溃。

  • 验证:确保禁用此功能/组件时不会发生崩溃。

  • 验证:略过并切片代码。查看一小段代码。

  • 文档:编写所有内容。

丹尼尔(Daniel)的回答对修复此崩溃非常有帮助!