2011-03-01 430 views
12

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

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

感谢

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

底线:
1.某些Java崩溃未按JVM预期进行处理,因此未创建hs_err_pid文件。
2.配置OS以创建核心转储可以在这些情况下提供帮助,因为JVM不处理的崩溃将由OS处理。在这种情况下,你会得到更少的信息,但它仍然有帮助。

+0

JVM在Java异常时崩溃 - 什么是异常,您可以在这里粘贴堆栈跟踪或代码。 – 2011-03-01 12:33:25

+1

@Suresh - 他正试图*查找*日志输出,这将给他更多的崩溃细节(包括异常跟踪,如果有的话)。 – 2011-03-01 12:38:40

+0

如果进程无法访问它通常写入的目录,它将不会写入该文件。 – 2011-03-01 12:41:58

回答

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环境变量的值。

+0

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

+0

@Leonid:ok.This线程可能会帮助您http://boardreader.com/thread/JVM_Crash_log_file_hs_err_pid_log_not_fo_vvqzX37n41.html – 2011-03-01 13:23:44

6

请注意,hs_err_pid.log文件只有在实际的JVM崩溃时才会被创建。

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

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

+0

所有未处理的异常都会打印到日志中。当应用程序以未处理的异常退出时,我们在日志文件的末尾看到它,在这种情况下,日志中没有异常。 – 2011-03-01 15:33:26

7

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

+0

这不是原生堆栈溢出的情况。我们配置了Dr.'Watson并分析了核心转储文件。我看到的错误是“访问冲突”。 – 2012-08-20 09:04:03

+0

访问冲突和堆栈溢出并不相互排斥。发生堆栈溢出时会发生什么取决于操作系统,运行时环境以及溢出发生的方式等。 – BeeOnRope 2012-08-21 19:34:25

+0

例如,在Linux上,堆栈溢出通常(通常是?)会产生SIGSEV,这相当于Windows上的访问冲突。其他的东西,比如错误的指针访问,可能会导致SIGSEV,但在其他情况下,JVM通常能够创建一个hs_err_pid文件。 – BeeOnRope 2012-08-21 19:35:45

相关问题