各位
假设我在 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/