java - 如何为 JNI 代码生成故障转储

标签 java java-native-interface dump

各位

假设我在 Windows 中有一个简单的 JNI 程序:

int* p = NULL;
*p = 5;

当从 JVM 运行它时,不像普通的 C++ 应用程序,JVM 会很好地捕获这种硬异常并做一些清理工作。

这里的问题是它也阻止我在那里生成故障转储,尽管有一个 JVM 选项:-XX:OnError,但此时生成的核心转储远离犯罪现场,因此难以调试。

JVM 使用 SEH 包装每个 Java 线程:

__try
{
    thread.run()
}
__except(topLevelExceptionFilter())
{
}

导致访问冲突的 JNI 代码发生在 thread.run 中,但在 topLevelExceptionFilter 中处理,它已经在其他地方。

您有什么建议吗?

谢谢。

最佳答案

您可以使用 OnError 设置启动 native 调试器,如下所示:

http://download.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/clopts.html#gbmum

java -XX:OnError="gdb - %p" MyApplication

适用于 Windows

JDK7 还有一个 -XX:+ShowMessageBoxOnError-XX:+UseOSErrorReporting 选项,不确定它是否适用于 Linux 核心转储,它应该适用于Windows 和默认操作系统调试器 (DrWatson)。参见 http://blogs.oracle.com/poonam/entry/more_on_windows_crash_dumps

关于java - 如何为 JNI 代码生成故障转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7188412/

相关文章:

java - Amazon Lambda 上 Amazon Echo/Alexa 的正确 Java handleRequest() 方法签名?

JAVA - 如何将字符串中的所有\字符替换为\\

java - linux 64bit - jni 链接错误

java - Jni java启动器可以在c中工作,但不能在c++中工作

java - 尝试将 FFmpeg 与 NDK 一起使用时出现 UnsatisfiedLinkError

file - FFMPEG:Windows 中的标准输出与文件

java - 我该如何解决这个 Java Generics 通配符/抽象歧义问题?

java - java中的静态方法调用栈

java - 从 Java 生成的进程的核心转储

python - 运行不带图形的 Salome 脚本