如何使用Java Result调试崩溃:error_code

问题描述 投票:-2回答:2

我有一个通过JNA使用C ++ DLL的Java应用程序。 C ++ DLL是专有的,因此,我不能共享代码,除非我可以制作一个简化的可重现的例子。在我进一步调试之前,制作可重现的示例并不是直截了当的。

应用程序偶尔崩溃,并显示错误消息Java Result: -1073740940。我正在运行Netbeans的Java应用程序,尽管它在没有Netbeans的情况下崩溃了。由于没有hs_err_.log,我猜崩溃在C ++层。我怎样才能开始调试此崩溃?

java jna
2个回答
1
投票

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

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

在不知道你正在使用什么代码的情况下,我猜你在使用本机内存,调用本机函数或在应用程序的某个地方错误地操作指针或句柄时做错了。

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


1
投票

崩溃的根本原因是C ++层中的堆损坏。如果由于堆损坏而发生随机崩溃,有时候,确定崩溃的原因很复杂,因为崩溃可能在以后发生,当程序试图操纵损坏的内存时。因此,提供SSCCE也很复杂,特别是在我们处理专有遗留代码时。

我如何调试此崩溃:

  • 复制:尝试找到崩溃的一致用例。如果崩溃是随机的,那么尝试找出一组总是导致崩溃的用户操作。
  • 假设:猜测哪个功能/组件包含崩溃。
  • 验证:确保禁用此功能/组件时不会发生崩溃。
  • 验证:浏览并切片代码。查看一小段代码。
  • 文档:写下所有内容。

丹尼尔的答案非常有助于解决这次崩溃!

© www.soinside.com 2019 - 2024. All rights reserved.