如何查看MC的崩溃报告(1)

Minecraft是个很玄学的游戏,就算你什么模组也不加,玩个原版都有可能崩溃,无非是比有模组时少一点罢了。
正如酒石酸所说:发生崩溃时如果找不到崩溃报告,就说“我崩溃了怎么办”,还不如上街找个算命先生算算为什么崩溃好些,那么在哪里找它们呢?
打开你的MC安装目录(一般为.minecraft文件夹,部分整合包的根目录与整合包同名,比如all the mods,但无论名字有什么不同,它都是mods和saves的所在),找到crash-report文件夹,将内部日期最新(即为你最近的一个崩溃报告)的文件,用记事本或者notepad++打开,就可以看到崩溃信息了。

(一个崩溃报告文件夹的长相)
现在我们随便找一个崩溃报告来看看它的结构。
http://paste.ubuntu.com/25672422/
第28行以前“coremods are present”都是废话——1.10以后非常多的崩溃报告里都有这些,莫非十几个coremod(核心模组)每次都爆炸?
重要信息在31行之后,我们挨个读:
description:rendering item
翻译过来是“故障描述:渲染物品”,但是,渲染的是哪个物品?
java.lang.ClassCastException: net.minecraft.item.ItemAir cannot be cast to net.minecraft.item.ItemBlock
at twilightforest.block.ColorHandler.lambda$init$13(ColorHandler.java:266)
接下来两行的内容:java.lang.class cast exception——这是java.lang包的class(类)cast exception(抛出异常),Java虚拟机这家伙对异常一向没什么责任感,然后就死给你看喽。
net.minecraft.item.itemAir——net作为最上级的目录,含义并不重要;minecraft就是MC本体了,item代指物品,itemAir代表空气——MC的空格并不是什么都没有,而是一个叫空气的物品取代了那里,同样,在MC的天空中也不是什么都没有,而是“空气方块”。
cannot cast to xxx:不能变成……什么呢?
net.minecraft.item.itemBlock:结构和上面那个itemair一样,不过是“不能变成一个方块(block)物品(item)”——block本身也是一种item,只不过是一个能够被玩家右键放在世界中还有碰撞箱的item。
(有意向者可以读一读Java的书籍以了解Java文件的结构,比如Head First Java,此书行文排图优美,译者帅气逼人,是不可多得的好书)
连起来读就是:“一个空气物品(在玩家物品栏中)转变为某个方块时,java.lang包抛出异常。”
java.lang是Java之下最基础的包之一,难道这玩意还坏了?当然不是,让我们看下一行。
at twilightforest.block.xxx——看到这里其实应该松一口气,因为twilight forest就是暮色森林啦,在这儿基本就可以确定是暮色崩溃了。当然我们也不能把暮色一删了事,看看能不能抢救呢?
twilightforest.block.ColorHandler.lambda$init$13(ColorHandler.java:266)
我们可以结合暮色的GitHub代码来看这一条:
https://github.com/TeamTwilight/twilightforest/tree/1.12.x/src/main/java/twilightforest/block
看到了吗?崩溃报告的原句是twilightforest.block,代表崩溃发生在twilightforest下面的block文件夹,与上面的GitHub代码地址形成对应。

不难看出,如崩溃语句中所说,代码中blocks文件夹下面确实有一个colorhandler类(.java文件,编译之后就变成.class扩展名了),它的下面“lambda$init$13”,代表这个类的源码中,一个lambda运算符出现了问题。
问题是发现了,但是如何解决呢?答:解决不了,除非我们是搞开发的——你知道lambda出现在哪里?只能在GitHub页面向作者发issue(问题),希望作者大发慈悲将其修复。
让我们继续往下看第36,37行:
at mod.chiselsandbits.render.helpers.ModelUtil.getItemStackColor(ModelUtil.java:466)
at mod.chiselsandbits.client.ItemColorPatterns.func_186726_a(ItemColorPatterns.java:28)
at就是在,“在哪哪哪”;mod.chiselandbits.xxx代表一个叫chisel and bits(雕刻工艺)的mod发生了异常;cilent代表客户端,render代表渲染器——是雕刻工艺的渲染机制出现了问题?
这要问你当时在干什么了,很多涉及到这种装饰类模组的崩溃,都是当事人在雕刻/打开箱子/打开某个机器的GUI时出现的渲染错误,而这个崩溃发生时,其实我并没有在雕刻什么东西,所以可以排除。
38行之后:
net.minecraft.client.renderer.xxx——MC本身的渲染器;
codechicken.lib.render.xxx——codechickenlib(CCL)的渲染器;
net.minecraft.client.gui.xxx——MC的GUI渲染;
net.minecraftforge.client.xxx——forge的客户端;
sun.reflect.xxx——sun公司为Java写的反射机制;
接下来还有几个便不一一列举,但是它们都有一个共同点:都是MC,forge甚至Java基本的东西,基本的东西是很难出错,也很难去进行修复的——这代表着代码的大幅变动,所以,它们抛出的异常其实是下游(暮色和雕刻工艺这样负责实现的mod)出错时扔给它们的,然而它们也没法解决,继续抛出到Java虚拟机,然后Java虚拟机破罐子破摔崩溃了。
73行以后:stacktrace(异常栈轨迹)里面的信息与先前的基本一样,没啥可看。
121行:affected level(影响)
主要是第129行所代表的内容level spawn location:代表着崩溃发生的具体位置和区块,无法修复时可以用worldedit(创世神插件),MCEdit,NBTExplorer之类编辑器删除掉这一方块/区块。
World: (-28,64,256), (玩家所在点-28,64,256)
Chunk: (at 4,4,0 in -2,16; contains blocks -32,0,256 to -17,255,271), (区块-2,16,区块内部坐标4,4,0,包括了-32,0,256到-17,255,271坐标的方块)
Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511)(区域:包括了-32,0到-1,31这一大片区块,没啥用处)
151行system details之后是你的系统详情,包括你的系统,Java版本,内存,安装了哪些模组等等。
Minecraft Version: 1.11.2 (MC版本1.11.2)
Operating System: Windows 10 (amd64) version 10.0(操作系统Windows 10 64位,一般与MC的崩溃没有关系,以后问崩溃的时候不用说你是哪个系统)
Java Version: 1.8.0_144, Oracle Corporation(Java版本:1.8.0_144,目前的最新版本,如果是Java 1.8.0_60,25甚至是Java 7这样的旧版本请更新)
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 594339048 bytes (566 MB) / 2823290880 bytes (2692 MB) up to 5324144640 bytes (5077 MB)
(当前内存占用,最大可以有5077MB)
JVM Flags: 5 total; -XX:+UseParallelGC -XX:-UseGCOverheadLimit -XX:-OmitStackTraceInFastThrow -Xmn128m -Xmx5120m(Java虚拟机参数,一般都是默认参数启动的,不需要担心)
UCHIJAAAA——仅代表该模组加载正确,如果加载不正确就是UE/UCE形式。
接下来都是废话,不用看。
以上就是对一个一般的崩溃报告描述,肯定有不全甚至错漏的地方,欢迎大家提出,我会后续更新修正。