如何使用 Java 调试崩溃结果:error_code
How to debug a crash with Java Result: error_code
我有一个 Java 应用程序,它通过 JNA 使用 C++ DLL。 C++ DLL 是专有的,因此,除非我可以制作一个简化的可重现示例,否则我无法共享代码。在我进一步调试之前,制作一个可重现的例子并不是直截了当的。
应用程序偶尔崩溃并显示错误消息 Java Result: -1073740940
。我是 运行 来自 Netbeans 的 Java 应用程序,尽管它在没有 Netbeans 的情况下崩溃。由于没有hs_err_.log,我猜crash是在C++层。我怎样才能开始调试这个崩溃?
Netbeans 的 "Java Result" 输出只是告诉您 java 程序的退出代码。您可以使用 System.exit(-1073740940);
生成相同的内容。一个成功的程序以代码 0 退出。任何其他都是失败,需要文档来解释。
您没有向我们提供您正在使用的 DLL 的任何指示,因此我们需要处理的唯一信息就是此退出代码。将该 int 转换为十六进制数字会导致 0xc0000374
,您可以将其输入您最喜欢的搜索引擎并找出 Heap Corruption Exception。提供了一些示例,但通常这意味着您正在访问未分配的本机内存。
在不知道您使用的是什么代码的情况下,我猜您在本机内存、调用本机函数或错误地操作应用程序中某处的指针或句柄方面做错了。
您应该首先仔细查看本机函数的参数。如果字节数不匹配,类型映射可能会出现问题。调查本机函数的任何基于 Pointer
的参数,包括 ByReference
参数。追溯代码,发现 when/how 这些指针与本机分配的内存相关联。如果它从未被分配,那是问题的一种可能性。如果已分配,请查看是否可以找到释放该内存的点,可能是由不同的本机函数释放的。
崩溃的根本原因是 C++ 层中的堆损坏。如果由于堆损坏而发生随机崩溃,有时很难查明崩溃的原因,因为当程序试图操作损坏的内存时,崩溃可能会在稍后发生。因此,提供 SSCCE 也很复杂,尤其是当我们处理专有遗留代码时。
我是如何调试这个崩溃的:
重现: 尝试为崩溃找到一致的用例。如果崩溃是随机的,那么尝试找出一组总是导致崩溃的用户操作。
假设: 猜猜哪个 feature/component 包含崩溃。
验证: 确保禁用此功能时不会发生崩溃 feature/component。
验证:浏览代码,切分代码。查看一小段代码。
文档:什么都写。
Daniel 的回答对修复此崩溃很有帮助!
我有一个 Java 应用程序,它通过 JNA 使用 C++ DLL。 C++ DLL 是专有的,因此,除非我可以制作一个简化的可重现示例,否则我无法共享代码。在我进一步调试之前,制作一个可重现的例子并不是直截了当的。
应用程序偶尔崩溃并显示错误消息 Java Result: -1073740940
。我是 运行 来自 Netbeans 的 Java 应用程序,尽管它在没有 Netbeans 的情况下崩溃。由于没有hs_err_.log,我猜crash是在C++层。我怎样才能开始调试这个崩溃?
Netbeans 的 "Java Result" 输出只是告诉您 java 程序的退出代码。您可以使用 System.exit(-1073740940);
生成相同的内容。一个成功的程序以代码 0 退出。任何其他都是失败,需要文档来解释。
您没有向我们提供您正在使用的 DLL 的任何指示,因此我们需要处理的唯一信息就是此退出代码。将该 int 转换为十六进制数字会导致 0xc0000374
,您可以将其输入您最喜欢的搜索引擎并找出 Heap Corruption Exception。提供了一些示例,但通常这意味着您正在访问未分配的本机内存。
在不知道您使用的是什么代码的情况下,我猜您在本机内存、调用本机函数或错误地操作应用程序中某处的指针或句柄方面做错了。
您应该首先仔细查看本机函数的参数。如果字节数不匹配,类型映射可能会出现问题。调查本机函数的任何基于 Pointer
的参数,包括 ByReference
参数。追溯代码,发现 when/how 这些指针与本机分配的内存相关联。如果它从未被分配,那是问题的一种可能性。如果已分配,请查看是否可以找到释放该内存的点,可能是由不同的本机函数释放的。
崩溃的根本原因是 C++ 层中的堆损坏。如果由于堆损坏而发生随机崩溃,有时很难查明崩溃的原因,因为当程序试图操作损坏的内存时,崩溃可能会在稍后发生。因此,提供 SSCCE 也很复杂,尤其是当我们处理专有遗留代码时。
我是如何调试这个崩溃的:
重现: 尝试为崩溃找到一致的用例。如果崩溃是随机的,那么尝试找出一组总是导致崩溃的用户操作。
假设: 猜猜哪个 feature/component 包含崩溃。
验证: 确保禁用此功能时不会发生崩溃 feature/component。
验证:浏览代码,切分代码。查看一小段代码。
文档:什么都写。
Daniel 的回答对修复此崩溃很有帮助!