什么会导致崩溃时无法创建 hs_err_pid 文件?

Posted

技术标签:

【中文标题】什么会导致崩溃时无法创建 hs_err_pid 文件?【英文标题】:What can cause hs_err_pid file not to be created on crash? 【发布时间】:2011-07-06 11:38:27 【问题描述】:

我需要调查 Java 客户端应用程序的崩溃。它是一个 Swing 应用程序,在 Windows 上的 Java SE 6 Update 23 上的 Java Web Start 环境中运行。不幸的是,对于某些崩溃情况,没有创建 hs_err_pid 文件。它不在桌面上,所以我在 PC 上搜索它并没有找到它(桌面上有一个旧的 hs_err_pid 文件,用于相同的应用程序,所以假设应该创建新文件是合理的那里也有)。最后日志中没有异常,因为它通常发生在JVM崩溃Java异常时,所以看起来应该是创建hs_err_pid文件导致的崩溃。

我是否需要配置一些东西才能让它工作? Dr. Watson 的配置会影响 hs_err_pid 文件的创建吗?

谢谢

我们配置了 Dr'Watson 并分析了核心转储文件,该文件是在应用再次崩溃后创建的。我看到的错误是“访问冲突”。从堆栈跟踪中,我能够看到崩溃是由我们使用的第三方的本机代码中的异常引起的。这足以将问题委托给他们。

底线: 1. JVM没有按预期处理一些Java崩溃,导致没有创建hs_err_pid文件。 2. 在这些情况下,将操作系统配置为创建核心转储会有所帮助,因为 JVM 未处理的崩溃将由操作系统处理。在这种情况下,您获得的信息会更少,但它仍然会有所帮助。

【问题讨论】:

JVM 因 Java 异常而崩溃 - 异常是什么,您能否在此处粘贴堆栈跟踪或代码。 @Suresh - 他正在尝试找到日志输出,该日志输出将为他提供有关崩溃的更多详细信息(包括异常跟踪,如果有的话)。 如果进程无权访问它通常写入的目录,它就不会写入文件。 @Peter Lawrey 用户桌面上已经有我们应用程序的旧 hs_err_pid 文件,因此用户可以访问该目录。在某些特定条件下未创建 Looks 文件 你有没有弄明白这件事?我也有这个问题。 JVM 崩溃,有核心转储,但没有 hs_err 文件。工作目录中有足够的空间和写权限(这就是核心转储文件放在那里的原因。) hs_err 文件仅在大约 50% 的时间生成。 【参考方案1】:

如果崩溃是由于本机堆栈溢出(通常在应用程序尝试读取/写入堆栈保护页时导致 SIGSEGV),则在许多平台(例如 Linux)上不会生成 hs_err_pid 文件,因为如果堆栈空间不足,则创建文件的过程无法完成。

【讨论】:

这不是本机堆栈溢出的情况。我们配置了 Dr' Watson 并分析了核心转储文件。我看到的错误是“访问冲突”。 井访问冲突和堆栈溢出不是相互排斥的。发生堆栈溢出时会发生什么取决于操作系统、运行时环境、溢出发生的方式等。 例如,在 Linux 上,堆栈溢出通常(经常?)产生 SIGSEV,这相当于 Windows 上的访问冲突。其他事情,比如错误的指针访问,可能会导致 SIGSEV,但在这些其他情况下,JVM 通常能够创建一个 hs_err_pid 文件。【参考方案2】:

请注意,hs_err_pid.log 文件仅在发生实际 JVM 崩溃时才会创建。

如果您的应用程序“仅”由于某处未处理的异常而退出,则不会创建此类文件。

您确定崩溃是真正的 JVM 崩溃吗?

【讨论】:

所有未处理的异常都会打印到日志中。当应用程序以未处理的异常退出时,我们会在日志文件的末尾看到它,在这种情况下,日志中没有异常。【参考方案3】:

JDK 5 http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf

When a fatal error occurs an error log is created in the file

hs_err_pid.log(在哪里 进程的进程ID)。在哪里 文件可能是在 进程的工作目录。在 文件不能被 在工作目录中创建 (空间不足,权限 问题或其他问题)然后文件 在临时目录中创建 为操作系统。在 Solaris 上 而 Linux 的临时目录是 /tmp。在 Windows 上是临时的 目录由值指定 TMP 环境变量,或者如果 即未定义,的值 TEMP 环境变量。

【讨论】:

用户桌面上已经有我们的应用程序的旧 hs_err_pid 文件(那是应用程序的链接所在,所以这是工作目录),因此用户可以访问该目录。看起来文件不是在某些特定条件下创建的

以上是关于什么会导致崩溃时无法创建 hs_err_pid 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何理解 Java 热点错误

避免 jvm 捕获 SEGV 和 hs_err_pid 生成

试图了解tomcat hs_err_pid 日志

如何设置jvm崩溃日志文件的位置

以编程方式添加约束会导致崩溃

当我启动 iphone 模拟器时,Lion Osx 有时会导致所有应用程序崩溃