首先声明, 如果你的电脑上没有安装 windbg, 请忽略这篇文章, 请百度谷歌其他的文章。因为本文记录的问题原因是windbg引起的, 没有装windbg说明你的问题可能是其他原因造成的, 本文对你提供不了参考。
没有排版, 请见谅。
现象: 安装时显示出现一个DOS命令行窗口, 检查完 显示器256色什么的然后就一闪而过 就退出了。
解决方法: 取消勾选gflags 的 create user mode stack trace database、 应用, 然后重启电脑, 再安装即可成功。
过程:
安装时, 留意到DOS窗口时, 启动的是 C:\Users\think\AppData\Local\Temp\OraInstall2014-05-21_03-10-27PM \ 目录下的程序, 所以我到相关目录去找失败日志
有一个installActions2014-05-21_03-10-27PM.log , 遗憾的是, 里面只有两行日志, 没有错误信息, 这里就不贴了。 后来无意中发现Temp目录下面有
hs_err_pid6804.log 这样的很多文件, 生成时间跟我的安装时间差不多, 所以就去点开一看, 果然是相关的日志, 这个是JVM crash的日志。
贴出开头部分内容 如下:
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000773d08c5, pid=6804, tid=8028
#
# Java VM: Java HotSpot(TM) 64-Bit Server VM (1.5.0_17-b04 mixed mode)
# Problematic frame:
# C [ntdll.dll+0x508c5]
#
--------------- T H R E A D ---------------
Current thread (0x00000000009fdb50): JavaThread "main" [_thread_in_Java, id=8028]
siginfo: ExceptionCode=0xc0000005, reading address 0xffffffffffffffff
Stack: [0x0000000000030000,0x0000000000130000), sp=0x000000000012e698, free space=1017k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [ntdll.dll+0x508c5]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
v blob 0x0000000002725c7e
j java.net.URL.(Ljava/net/URL;Ljava/lang/String;Ljava/net/URLStreamHandler;)V+350
j java.net.URL.(Ljava/net/URL;Ljava/lang/String;)V+4
j java.net.URL.(Ljava/lang/String;)V+3
以“ntdll.dll+0x508c5 ” 以及 JAVA 调用堆栈代码 为关键字百度谷歌了许久,没有找到有用的信息。
然后是各种尝试, 花费了非常多的时间。 我把部分有价值的说一下。
因为oracle 自带了JDK, 所以是不需要事先安装JDK 环境的, 但是我木有办法, 所以JDK 重装、卸载、换版本一一尝试, 还有JAVA的环境变量配置, 环境变量配置的一篇文章中写了一个 Hello.java 来验证环境是否配置成功 http://yangwen.blog.51cto.com/337928/98099/.
然后就发现了一个很囧的事情, 在JDK1.5.0.17 时Hello.java 都编译不过, JDK1.7是可以编译过hello.java, 但是oracle11g R2 安装时使用的是自带的JDK1.5, 我尝试过修改install目录下的oraparam.ini, 指定别的JRE 路径, 但是没成功。
然后用windbg 调试, 编译程序javac, 因为是64为JDK, 所以要用64位windbg, 在cmd下 输入 windbg javac D:\hello.java. 然后就先后遇到两个0xc00000005 的内存访问错误, 第一个错误终端的堆栈连模块都看不到, 输入g, 继续 遇到第二个断点, 堆栈如下: (之前忘记截图了,所以堆栈 找了个网上相同的)
00000000`0404ca88 00000000`7727e7e2 ntdll!RtlCaptureContext+0x8c
00000000`0404ca98 00000000`7727e72b ntdll!RtlpWalkFrameChain+0x52
00000000`0404d018 00000000`773352f2 ntdll!RtlCaptureStackBackTrace+0x4b
00000000`0404d048 00000000`772e1d35 ntdll!RtlpStackTraceDatabaseLogPrefix+0x42
00000000`0404d178 00000000`7715d9fa ntdll! ?? ::FNODOBFM::`string'+0xa93f
00000000`0404d1f8 000007fe`fef0175c kernel32!HeapFree+0xa
*** WARNING: Unable to verify checksum for C:\Program Files\Java\jdk1.6.0_06\jre\bin\server\jvm.dll
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files\Java\jdk1.6.0_06\jre\bin\server\jvm.dll -
00000000`0404d228 00000000`08101c09 msvcrt!free+0x1c
然后谷歌了 "JVM crash ntdll!RtlCaptureContext" , 终于找到了一条 http://jpassing.com/2008/05/11/the-case-of-the-mysterious-jvm-x64-crashes/
里面有一段 :So I disabled the stack trace database in gflags, rebooted the machine and �?voilà, the crash disappeared!
我按照他的说法取消勾选gflags 的 create user mode stack trace database、 应用, 然后重启电脑, 再尝试在JDK1.5下 编译hello.java。
激动人心的时刻到了, 果然编译过了, 然后执行(注意hello大小写), 输出正常。
再尝试安装oracle11gR2, 在固态硬盘的强劲作用下15分钟安装完毕, 嘎嘎嘎。
解决这个问题 用了2天的时间, 希望此文能帮到跟我一样喜欢用windbg 的童鞋们, 不再走我的弯路。