问题描述 当 WebLogic Server 进程因一些无效的本地内核(特定于机器的代码)而终止时,应用程序就会产生二进制核心文件。服务器崩溃、JVM 崩溃、计算机崩溃或 HotSpot 错误也可能与此事件相关联。本模式将介绍从各种平台的核心文件收集信息所需的操作步骤。 |
|
故障排除 请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。
快速链接
|
为什么发生此问题? 为了确定这类错误的产生原因,需要确定 WebLogic Server 进程所使用的本地代码的所有潜在来源。要重点注意的位置有:
- WebLogic Server 性能包。WebLogic Server 性能包是本地代码,如启用则可能会产生这类错误。禁用此功能以确定这是不是引起问题的原因。可以通过控制台或命令行来执行此操作。,使用控制台来查看“Server”选项卡,将 NativeIOEnabled 设置为 false。请参阅“启用性能包”部分来获得在控制台中的“Server”选项卡下的确切操作步骤顺序。对于 WLS 8.1,这将位于以下网址:http://e-docs.bea.com/wls/docs81/perform/WLSTuning.html#1142800 操作步骤为:
a. 启动管理服务器(如果它还没有运行)。 b. 访问该域的管理控制台。 c. 展开左边窗格中的服务器节点,以显示域中配置的服务器。 d. 单击要配置的服务器实例的名称。 e. 选择“Configuration”->“Tuning”选项卡。 f. 如果未选中“Enable Native IO”复选框,请选中该复选框。 g. 单击“Apply”。 h. 重新启动服务器。
您也可以通过 WebLogic Server 的启动命令的 java 选项来执行此步骤。在命令行中设置 -Dweblogic.NativeIOEnabled=false,然后启动服务器。命令行将优先于通过控制台发送的命令。
- 任何 2 类 JDBC 驱动程序都要利用本地 DBMS 库,这些库也会产生这类错误。切换到纯 java(4 类)JDBC 驱动程序,以确定这是不是出错原因。
- 用 JNI 调用访问的任何本地库也会引起这类错误。如果应用程序使用这些库,则必须仔细检查它们。可能很难排除这些库的问题,因为可能不太容易从应用程序中删除其功能。可能需要进行大量的记录,来确定某个使用模式是否能与核心转储/Dr Watson 错误相关联。
- JVM 本身是一个本地程序,可能会引起这类错误。当有疑问时,可尝试使用其它认证的 JVM 和/或更新版本,以确定是否由 JVM 错误导致故障。很多 JVM 错误涉及到 JIT 编译器的使用,禁用此功能通常会解决这类问题。一般可通过提供 -Djava.compiler=none 命令选项来实现此目的。
- 有时候,JVM 将产生一个小日志文件,其中可能包含说明内核来自哪一个库的有用信息,但有时也并非如此。该文件产生于启动 WebLogic Server 的目录中,且其形式为 hs_err_pid<PID #>.log,其中 <PID #> 是 WebLogic Server 进程的进程 ID。
如果在执行这些步骤后,您不能确定错误的原因,则可以检查在启动 WebLogic Server 的目录中产生的核心文件。 您必须从二进制核心文件获得准确的堆栈跟踪来查明产生内核信息的原因。为此,可以像在本“诊断模式”所概述的那样运行一个调试器,例如 dbx 或 gdb,这取决于您的操作系统。
返回页首
|
从以下操作系统收集内核信息:SOLARIS
- 执行 file <full path>/core来验证该核心文件是否来自
Java VM。
- 按如下方式使用 dbx 或 gdb 获取堆栈跟踪。利用 gdb,您可以获得更多有用的信息。Sun 技术支持部门推荐使用 dbx(1) 执行核心文件分析。如果您没有获得 dbx 许可产品,可以从 Sun 下载一个 30 天的试用版本,其中 dbx 打包在 http://wwws.sun.com/software/sundev/buy.html 中。
如果“没有”生成核心文件,那么原因可能在于文件权限问题或核心文件本身的实际限制。核心转储文件的大小可能受下列因素的影响:
- 检查 ulimit -a以查看您的环境是否允许生成核心文件。
- ulimit -c (这是核心文件的大小限制。用 ulimit -c unlimited 调整其大小)。
- 内核限制(ulimit -c的硬极限)。
- 用户的可用磁盘空间(例如,是否有磁盘容量限额?)。
- 另请参阅:应针对核心文件的生成而检查的操作系统值
如果生成了一个核心文件,则对该核心文件运行 dbx 或 gdb。下面用 gdb 产生的一个输出示例说明用于 dbx 和 gdb 的命令。(备注:DEBUG_PROG 是一个环境变量,它允许您指定使用 java 时要启动的调试器或探查器。)
a. dbx: |
$ java -version (need to use right version of jdk) $ ls /opt/bin/dbx (need to know dbx location) or "which dbx" $ export DEBUG_PROG=/opt/bin/dbx (or wherever "dbx" is located)
For JDK 1.3.X do the following: $ <path to java command>/java corefile For JDK 1.4.X do the following: $ dbx <path to java command>/java corefile
Now you will be in the debugger. Execute the following commands: (dbx) where ("shows a summary of the stack") (dbx) threads ("shows the state of the existing threads")
(dbx) quit
|
|
这些命令获得所执行的最后一个线程的堆栈跟踪(where
命令)并显示核心文件中的所有线程的状态(threads命令)。
b. gdb:
|
$ java
-version (need to use right version of jdk)
$ ls /usr/local/bin/gdb (need to know gdb location) or "which gdb" $ export DEBUG_PROG=/usr/local/bin/gdb (or wherever "gdb" is located)
For JDK 1.3.X do the following: $ <path to java command>/java corefile For JDK 1.4.X do the following:
$ gdb <path to java command>/java corefile
Now you will be in the debugger. Execute the following commands: (gdb) where ("shows a summary of the stack") (gdb) thr ("switch among threads or show the current thread") (gdb) info thr ("inquire about existing threads") (gdb) thread apply 1 bt ("apply a command to a list of threads, specifically the backtrace to thread #1")
(gdb) quit
|
使用这些命令将生成已执行的最后一个线程的堆栈跟踪(where命令),显示当前线程(thr命令),显示所有线程的状态(info
thr 命令),以及提供另一个途径获得核心文件中的线程 1 的堆栈跟踪(thread
apply 1 bt命令)。使用最后一个命令(thread
apply # bt)可获得个别线程的堆栈跟踪,具体做法是用实际线程编号替代 #。您也可以用“all”替代
3 以获得所有线程的堆栈跟踪。
下面是一个使用 gdb 调试器中的那些命令的核心文件示例。此示例核心文件是由应用程序中的用户本地代码错误引起的。(请参阅粗体项。)在此堆栈跟踪上,查看调用信号处理程序之前的最后一行。这将引导您查看本地库
libhello.so中的 displayHelloWorld函数。 |
$ export DEBUG_PROG=/usr/local/bin/gdb $ java core
GNU gdb 5.0 Copyright 2000 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "sparc-sun-solaris2.8"... (no debugging symbols found)... Core was generated by `/wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/bin/../bin/sparc/native_threads'. Program terminated with signal 9, Killed. Reading symbols from /usr/lib/libthread.so.1...(no debugging symbols found)... Loaded symbols for /usr/lib/libthread.so.1 Reading symbols from /usr/lib/libdl.so.1...(no debugging symbols found)...done. Loaded symbols for /usr/lib/libdl.so.1 Reading symbols from /usr/lib/libc.so.1...(no debugging symbols found)...done. Loaded symbols for /usr/lib/libc.so.1 Reading symbols from /usr/platform/SUNW,UltraAX-i2/lib/libc_psr.so.1... (no debugging symbols found)...done. Loaded symbols for /usr/platform/SUNW,UltraAX-i2/lib/libc_psr.so.1 Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so...(no debugging symbols found)... done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so Reading symbols from /usr/lib/libCrun.so.1...(no debugging symbols found)... Loaded symbols for /usr/lib/libCrun.so.1 Reading symbols from /usr/lib/libsocket.so.1...(no debugging symbols found)... Loaded symbols for /usr/lib/libsocket.so.1 Reading symbols from /usr/lib/libnsl.so.1...(no debugging symbols found)... Loaded symbols for /usr/lib/libnsl.so.1 Reading symbols from /usr/lib/libm.so.1...(no debugging symbols found)...done. Loaded symbols for /usr/lib/libm.so.1 Reading symbols from /usr/lib/libw.so.1... warning: Lowest section in /usr/lib/libw.so.1 is .hash at 00000074 (no debugging symbols found)...done. Loaded symbols for /usr/lib/libw.so.1 Reading symbols from /usr/lib/libmp.so.2...(no debugging symbols found)... Loaded symbols for /usr/lib/libmp.so.2 Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/native_threads/libhpi.so...(no debugging symbols found)...done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/native_threads/libhpi.so Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libverify.so...(no debugging symbols found)...done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libverify.so Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libjava.so...(no debugging symbols found)...done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libjava.so Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libzip.so...(no debugging symbols found)...done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libzip.so Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libnet.so...(no debugging symbols found)...done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libnet.so Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libfilelock.so...(no debugging symbols found)...done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libfilelock.so Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libioser12.so...(no debugging symbols found)...done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/libioser12.so Reading symbols from /usr/lib/nss_nis.so.1...(no debugging symbols found)... Loaded symbols for /usr/lib/nss_nis.so.1 Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libstackdump.so...(no debugging symbols found)...done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libstackdump.so Reading symbols from /usr/lib/libmd5.so.1...(no debugging symbols found)... Loaded symbols for /usr/lib/libmd5.so.1 Reading symbols from /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libmuxer.so...(no debugging symbols found)...done. Loaded symbols for /wwsl/sharedInstalls/solaris/wls70sp2/server/lib/solaris/libmuxer.so Reading symbols from /usr/ucblib/libucb.so.1...(no debugging symbols found)... Loaded symbols for /usr/ucblib/libucb.so.1 Reading symbols from /usr/lib/libresolv.so.2...(no debugging symbols found)... Loaded symbols for /usr/lib/libresolv.so.2 Reading symbols from /usr/lib/libelf.so.1...(no debugging symbols found)... Loaded symbols for /usr/lib/libelf.so.1 Reading symbols from /home/usera/wls70/solaris/projectWork/lib/libhello.so... (no debugging symbols found)...done. Loaded symbols for /home/usera/wls70/solaris/projectWork/lib/libhello.so
(gdb) where
#0 0xff369764 in __sigprocmask () from /usr/lib/libthread.so.1 #1 0xff35e978 in _resetsig () from /usr/lib/libthread.so.1 #2 0xff35e118 in _sigon () from /usr/lib/libthread.so.1 #3 0xff361158 in _thrp_kill () from /usr/lib/libthread.so.1 #4 0xff24b908 in raise () from /usr/lib/libc.so.1 #5 0xff2358f4 in abort () from /usr/lib/libc.so.1 #6 0xfe3c6904 in __1cCosFabort6Fl_v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #7 0xfe3c59f8 in __1cCosbBhandle_unexpected_exception6FpnGThread_ipCpv_v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #8 0xfe20a8bc in JVM_handle_solaris_signal () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #9 0xff36b82c in __sighndlr () from /usr/lib/libthread.so.1 #10 <signal handler called> #11 0xe9f90420 in Java_HelloWorld_displayHelloWorld () from /home/usera/wls70/solaris/projectWork/lib/libhello.so #12 0x90aec in ?? () #13 0x8dc54 in ?? () #14 0x8dc54 in ?? () #15 0x8dc54 in ?? () #16 0x8ddbc in ?? () #17 0x8dde0 in ?? () #18 0x8dc54 in ?? () #19 0x8dc54 in ?? () #20 0x8dde0 in ?? () #21 0x8dc78 in ?? () #22 0x8dc54 in ?? () #23 0x8ddbc in ?? () #24 0x8dc54 in ?? () #25 0xfe5324f0 in __1cMStubRoutinesG_code1_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #26 0xfe0cbe9c in __1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #27 0xfe1f6dc4 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #28 0xfe1fcd94 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #29 0xfe21b708 in __1cMthread_entry6FpnKJavaThread_pnGThread__v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #30 0xfe216208 in __1cKJavaThreadDrun6M_v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #31 0xfe213ed0 in _start () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
(gdb) thr
[Current thread is 1 (LWP 14 )]
(gdb) info thr 16 LWP 13 0xff29d194 in _poll () from /usr/lib/libc.so.1 15 LWP 12 0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1 14 LWP 11 0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1 13 LWP 10 0xff29bc2c in _so_accept () from /usr/lib/libc.so.1 12 LWP 9 0xff29bc2c in _so_accept () from /usr/lib/libc.so.1 11 LWP 8 0xff29d194 in _poll () from /usr/lib/libc.so.1 10 LWP 7 0xff29d194 in _poll () from /usr/lib/libc.so.1 9 LWP 6 0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1 8 LWP 5 0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1 7 LWP 4 0xff29f008 in _lwp_sema_wait () from /usr/lib/libc.so.1 6 LWP 3 0xff29d194 in _poll () from /usr/lib/libc.so.1 5 LWP 2 0xff29e958 in _signotifywait () from /usr/lib/libc.so.1 4 LWP 1 0xff29d194 in _poll () from /usr/lib/libc.so.1 3 LWP 16 0xff29c4fc in door_restart () from /usr/lib/libc.so.1 2 LWP 15 0xff369774 in private___lwp_cond_wait () from /usr/lib/libthread.so.1 * 1 LWP 14 0xff369764 in __sigprocmask () from /usr/lib/libthread.so.1
(gdb) thread apply 1 bt
Thread 1 (LWP 14 ): #0 0xff369764 in __sigprocmask () from /usr/lib/libthread.so.1 #1 0xff35e978 in _resetsig () from /usr/lib/libthread.so.1 #2 0xff35e118 in _sigon () from /usr/lib/libthread.so.1 #3 0xff361158 in _thrp_kill () from /usr/lib/libthread.so.1 #4 0xff24b908 in raise () from /usr/lib/libc.so.1 #5 0xff2358f4 in abort () from /usr/lib/libc.so.1 #6 0xfe3c6904 in __1cCosFabort6Fl_v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #7 0xfe3c59f8 in __1cCosbBhandle_unexpected_exception6FpnGThread_ipCpv_v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #8 0xfe20a8bc in JVM_handle_solaris_signal () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #9 0xff36b82c in __sighndlr () from /usr/lib/libthread.so.1 #10 <signal handler called> #11 0xe9f90420 in Java_HelloWorld_displayHelloWorld () from /home/usera/wls70/solaris/projectWork/lib/libhello.so #12 0x90aec in ?? () #13 0x8dc54 in ?? () #14 0x8dc54 in ?? () #15 0x8dc54 in ?? () #16 0x8ddbc in ?? () #17 0x8dde0 in ?? () #18 0x8dc54 in ?? () #19 0x8dc54 in ?? () #20 0x8dde0 in ?? () #21 0x8dc78 in ?? () #22 0x8dc54 in ?? () #23 0x8ddbc in ?? () #24 0x8dc54 in ?? () #25 0xfe5324f0 in __1cMStubRoutinesG_code1_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #26 0xfe0cbe9c in __1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #27 0xfe1f6dc4 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandle_4pnRJavaCallArguments_pnGThread__v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #28 0xfe1fcd94 in __1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pnGThread__v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #29 0xfe21b708 in __1cMthread_entry6FpnKJavaThread_pnGThread__v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #30 0xfe216208 in __1cKJavaThreadDrun6M_v_ () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so #31 0xfe213ed0 in _start () from /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/jre/lib/sparc/server/libjvm.so
(gdb) quit |
返回页首
从以下操作系统收集内核信息:LINUX GDB 是缺省的首选 Linux 调试器,其功能强大而且很稳定。尽管也有各种可视化调试器可用,但实际上只需要一个简单的命令行调试器来从内核中获得栈跟踪。
- 执行 file <full path>/core 来验证该核心文件是否来自 Java VM。
- 确保您正在 Linux 上使用 GNU 提供的最新 GDB 版本,以避免任何已知的缺陷。
- 参见: http://ftp.gnu.org/gnu/gdb/
- 另外确保在 Linux 上为核心文件设置了 ulimit。(例如,ulimit
-c unlimited)。
- 在 Linux 上,缺省为在所有系统上关闭核心转储。在 RedHat Advanced Server 2.1 中,则应在 /etc/security 下。应该有一个名称为 limits.conf 的文件。此文件本身是自解释的,查找单词“core”。如果设置为 0,则禁用了核心转储。
- 另请参阅:应针对核心文件的生成而检查的操作系统值
- 使用 gdb 按如下方式获得堆栈跟踪(与此前操作相同):
|
$ java -version (need to use right version of jdk) $ ls /usr/local/bin/gdb (need to know gdb location) or "which gdb" $ export DEBUG_PROG=/usr/local/bin/gdb (or wherever "gdb" is located)
For JDK 1.3.X do the following: $ <path to java command>/java corefile For JDK 1.4.X do the following:
$ gdb <path to java command>/java corefile
Now you will be in the debugger. Execute the following commands: (gdb) where ("shows a summary of the stack") (gdb) thr ("switch among threads or show the current thread") (gdb) info thr ("inquire about existing threads") (gdb) thread apply 1 bt ("apply a command to a list of threads, specifically the backtrace to thread #1")
(gdb) quit
|
| 使用这些命令将生成已执行的最后一个线程的堆栈跟踪(where命令),显示当前线程(thr命令),显示所有线程的状态(info
thr 命令),以及提供另一个途径获得核心文件中的线程 1 的堆栈跟踪(thread
apply 1 bt命令)。使用最后一个命令(thread
apply # bt)可获得个别线程的堆栈跟踪,具体做法是用实际线程编号替代 #。您也可以用“all”替代
3 以获得所有线程的堆栈跟踪。 |
返回页首
从以下操作系统收集内核信息:HPUX 常见的命令行调试器是 GDB 和 ADB。 GDB: 遵循与前面对 gdb 所述相同的操作信息(如果该调试器是可用的),下面还提供: |
$ java -version (need to use right version of jdk) $ ls /usr/local/bin/gdb (need to know gdb location) or "which gdb" $ export DEBUG_PROG=/usr/local/bin/gdb (or wherever "gdb" is located)
For JDK 1.3.X do the following: $ <path to java command>/java corefile For JDK 1.4.X do the following:
$ gdb <path to java command>/java corefile
Now you will be in the debugger. Execute the following commands: (gdb) where ("shows a summary of the stack") (gdb) thr ("switch among threads or show the current thread") (gdb) info thr ("inquire about existing threads") (gdb) thread apply 1 bt ("apply a command to a list of threads, specifically the backtrace to thread #1")
(gdb) quit
|
$ java -version (need to use right version of jdk) $ ls /usr/local/bin/adb (need to know adb location) or "which adb" $ export DEBUG_PROG=/usr/local/bin/adb (or wherever "adb" is located) $ <path to java command>/java corefile
Now you will be in the debugger. Execute the following commands: adb> $C ("shows a summary of the stack and you may get an error at this point, see below") adb> $r ("shows the state of the registers")
adb> $q
("the command to quit adb") |
返回页首
从以下操作系统收集内核信息:AIX
- 如果 gdb 可用,并且如果产生了实际的二进制核心文件,则遵循前面针对 gdb 所述的操作信息:
|
$ java -version (need to use right version of jdk) $ ls /usr/local/bin/gdb (need to know gdb location) or "which gdb" $ export DEBUG_PROG=/usr/local/bin/gdb (or wherever "gdb" is located)
For JDK 1.3.X do the following: $ <path to java command>/java corefile For JDK 1.4.X do the following:
$ gdb <path to java command>/java corefile
Now you will be in the debugger. Execute the following commands: (gdb) where ("shows a summary of the stack") (gdb) thr ("switch among threads or show the current thread") (gdb) info thr ("inquire about existing threads") (gdb) thread apply 1 bt ("apply a command to a list of threads, specifically the backtrace to thread #1")
(gdb) quit
|
- 但是,AIX 上的 JVM 通常打印出一个 javacore<PID>.<ID Number>.txt 文件,用于调试应用程序。其中包含一些很有用的信息,并且其将显示发生信息转储时正在执行的当前线程。例如,下列信息将指出您创建的 displayHelloWorld() 本地方法中发生的问题。查看本地代码以确定为什么发生核心转储。
来自 javacore<PID>.<ID Number>.txt 文件的样例信息:
|
Current Thread Details: "ExecuteThread: '10' for queue: 'default'" (TID:0x31c70ad0, sys_thread_t:0x3e52df68, state:R, native ID:0xf10) prio=5 at HelloWorld.displayHelloWorld(Native Method) at servlets.NativeServlet.doGet(NativeServlet.java:85) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1058) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:401) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:306) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:5445) at weblogic.security.service.SecurityServiceManager.runAs(SecurityServiceManager.java:780) at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3105) at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2588) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:213)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:189) |
- 查找“当前线程细节”,它将为您提供关于该问题的意见。例如,以下信息说明内核信息来自 ExecuteThread 24,但此时 JVM 正在执行一些 JIT。因此,这看起来像是 IBM 提供的此 JVM 版本上的 JIT 编译器的问题。
Current Thread Details "ExecuteThread: '24' for queue: 'default'" sys_thread_t:0x781 Native Stack at 0xD0F15924 in get_invoke_op at 0xD0F1535C in resolve_a_method at 0xD0F1E610 in resolve_method_call_graph at 0xD0F29C40 in jit_compiler_entry at 0xD0F2A404 in _jit_fast_compile
|
返回页首
从以下操作系统收集内核信息:WINDOWS
- drwtsn32.log 文件类似于 Unix 上的核心文件。在 Windows 2000 上,这些文件位于以下目录中:C:\Documents and Settings\All Users\Documents\DrWatson。在输入 drwtsn32 ? 后,将出现 Dr. Watson for Windows 2000 框。DrWatson 日志文件概述选项将显示一个屏幕,其中说明了 drwtsn32.log 文件的格式。
- 也可能从 JVM 本身产生 hs_err_pid<#>.log文件,其中包含了一些有用的信息。
启用/禁用 Dr. Watson: 缺省情况下,在安装 Windows NT 时将启用 Dr. Watson。
- 检查下面的注册表项,以确保启用了 Dr. Watson(0 为启用,1 为禁用):
\HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\Windows NT\CurrentVersion\AeDebug。
- 有一个名为“Auto”的条目,它决定了将如何启动 Dr. Watson。这将在 Debugger 注册表值下决定启动哪个调试器或应用程序。
- 对于 Dr. Watson,Debugger 值应包含:
drwtsn32 -p %ld -e %ld -g
|
返回页首
core 'core' of 20956: /wwsl/sharedInstalls/solaris/wls70sp2/jdk131_06/bin/../bin/sparc/nativ ----------------- lwp# 14 / thread# 25 -------------------- ff369764 __sigprocmask (ff36bf60, 0, 0, e6181d70, ff37e000, 0) + 8 ff35e110 _sigon (e6181d70, ff385930, 6, e6180114, e6181d70, 6) + d0 ff361150 _thrp_kill (0, 19, 6, ff37e000, 19, ff2c0450) + f8 ff24b900 raise (6, 0, 0, ffffffff, ff2c03bc, 4) + 40 ff2358ec abort (ff2bc000, e6180268, 0, fffffff8, 4, e6180289) + 100 fe3c68fc __1cCosFabort6Fl_v_ (1, fe4c8000, 1, e61802e8, 0, e9f90420) + b8 fe3c59f0 __1cCosbBhandle_unexpected_exception6FpnGThread_ipCpv_v_ (ff2c02ac, fe53895c, fe4dc164, fe470ab4, fe4c8000, e6180308) + 254 fe20a8b4 JVM_handle_solaris_signal (0, 25d5b8, e6180d90, fe4c8000, b, e6181048) + 8ec ff36b824 __sighndlr (b, e6181048, e6180d90, fe20a8cc, e6181e14, e6181e04) + c ff3684d8 sigacthandler (b, e6181d70, 0, 0, 0, ff37e000) + 708 --- called from signal handler with signal 11 (SIGSEGV) --- e9f90420 Java_HelloWorld_displayHelloWorld (25d644, e6181224, e61819b8, 0, 2, 0) + 30 00090ae4 ???????? (e6181224, e61819b8, 25d5b8, fe4c8000, 0, 109a0) 0008dc4c ???????? (e61812c4, ffffffff, ffffffff, 97400, 4, e61811b8) 0008dc4c ???????? (e618135c, e61819b8, fe4c8000, 99600, c, e6181250) 0008dc4c ???????? (e61813ec, f76a2f90, e618147c, 99600, c, e61812f8) 0008ddb4 ???????? (e618147c, f68578b8, 0, 99974, c, e6181388)
0008ddd8 ???????? (e618154c, e61815c8, e61815cc, 99974, 4,
e6181410)
...... |
........ E9500000 1184K read E9680000 1392K read E9800000 4608K read E9F60000 136K read/write/exec E9F90000 8K read/exec /home/usera/wls70/solaris/projectWork/lib/libhello.so E9FA0000 8K read/write/exec /home/usera/wls70/solaris/projectWork/lib/libhello.so E9FB4000 8K read/write/exec E9FC0000 120K read/exec /usr/lib/libelf.so.1
E9FEE000 8K read/write/exec
/usr/lib/libelf.so.1
....... |
|
从 pstack 输出可注意到,出现错误的地址是 e9f90420。pmap输出片段说明
e9f90420 位于 E9F90000 和 E9FA0000 之间,因此该错误是出现在 libhello.so共享对象内的某处。
返回页首
|
应针对核心文件的生成而检查的操作系统值
- 分别在系统级和用户级检查 ulimit -c(配置的核心文件大小)。
- 检查用户的可用磁盘空间(例如,是否有磁盘容量限额?)。
- 此外,检查以下参数,在 Solaris 上,该参数在 /etc/system 文件中,并可用其来禁用核心文件:set sys:coredumpsize=0
- 在 Linux 上,缺省为在所有系统上关闭核心转储。在 RedHat Advanced Server 2.1 中,其应在 /etc/security下。应该有一个名称为
limits.conf
的自解释文件,并查找单词“core”。如果设置为 0,则禁用了信息转储。
- 更改 HP OS 设置内核参数 maxdsiz(max_per_proc_data_size,此参数增加用户进程数据段大小。),从原来的值(如 64M)改为更大的值(如 134M)。
返回页首
|
停止 JVM 进行 Thread Dump 您可以设置下列标志,以便在生成核心文件之前对服务器进行 Thread Dump,以得到此时刻的线程状态:
Sun JVM 在 SUN JVM 上,该选项是 -XX:+ShowMessageBoxOnError(在 SUN 网站上没有正式记载)。当 JVM 崩溃时,程序将提示:您想要调试此问题吗?然后您可以进行 JVM Thread Dump。
JRockit JVM 当发布 JRockit 的 8.1 SP2 版 Service Pack 时,将在该版本中提供相应的选项。该选项在 JRockit 中是 -Djrockit.waitonerror。
返回页首
|
返回页首
|
反馈
请给我们提供您的意见,说明此支持诊断模式“二进制核心文件分析”一文对您有如何帮助,您需要的任何解释,以及对支持诊断模式的新主题的任何要求。
|
|
免责声明:
依据 BEA 与您签署的维护和支持协议条款,BEA Systems, Inc. 在本网站上提供技术技巧和修补程序供您使用。虽然您可以将这些信息和代码与您获得 BEA 授权的软件一起使用,但 BEA 并不对所提供的技术技巧和修补程序做任何形式的担保,无论是明确的还是隐含的。
本文档中引用的任何商标是其各自所有者的财产。有关完整的商标信息,请参考您的产品手册。
|
返回页首
|