如何查看MC的崩潰報(bào)告(1)

Minecraft是個(gè)很玄學(xué)的游戲,就算你什么模組也不加,玩?zhèn)€原版都有可能崩潰,無非是比有模組時(shí)少一點(diǎn)罷了。
正如酒石酸所說:發(fā)生崩潰時(shí)如果找不到崩潰報(bào)告,就說“我崩潰了怎么辦”,還不如上街找個(gè)算命先生算算為什么崩潰好些,那么在哪里找它們呢?
打開你的MC安裝目錄(一般為.minecraft文件夾,部分整合包的根目錄與整合包同名,比如all the mods,但無論名字有什么不同,它都是mods和saves的所在),找到crash-report文件夾,將內(nèi)部日期最新(即為你最近的一個(gè)崩潰報(bào)告)的文件,用記事本或者notepad++打開,就可以看到崩潰信息了。

(一個(gè)崩潰報(bào)告文件夾的長(zhǎng)相)
現(xiàn)在我們隨便找一個(gè)崩潰報(bào)告來看看它的結(jié)構(gòu)。
http://paste.ubuntu.com/25672422/
第28行以前“coremods are present”都是廢話——1.10以后非常多的崩潰報(bào)告里都有這些,莫非十幾個(gè)coremod(核心模組)每次都爆炸?
重要信息在31行之后,我們挨個(gè)讀:
description:rendering item
翻譯過來是“故障描述:渲染物品”,但是,渲染的是哪個(gè)物品?
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)
接下來兩行的內(nèi)容:java.lang.class cast exception——這是java.lang包的class(類)cast exception(拋出異常),Java虛擬機(jī)這家伙對(duì)異常一向沒什么責(zé)任感,然后就死給你看嘍。
net.minecraft.item.itemAir——net作為最上級(jí)的目錄,含義并不重要;minecraft就是MC本體了,item代指物品,itemAir代表空氣——MC的空格并不是什么都沒有,而是一個(gè)叫空氣的物品取代了那里,同樣,在MC的天空中也不是什么都沒有,而是“空氣方塊”。
cannot cast to xxx:不能變成……什么呢?
net.minecraft.item.itemBlock:結(jié)構(gòu)和上面那個(gè)itemair一樣,不過是“不能變成一個(gè)方塊(block)物品(item)”——block本身也是一種item,只不過是一個(gè)能夠被玩家右鍵放在世界中還有碰撞箱的item。
(有意向者可以讀一讀Java的書籍以了解Java文件的結(jié)構(gòu),比如Head First Java,此書行文排圖優(yōu)美,譯者帥氣逼人,是不可多得的好書)
連起來讀就是:“一個(gè)空氣物品(在玩家物品欄中)轉(zhuǎn)變?yōu)槟硞€(gè)方塊時(shí),java.lang包拋出異常?!?/p>
java.lang是Java之下最基礎(chǔ)的包之一,難道這玩意還壞了?當(dāng)然不是,讓我們看下一行。
at twilightforest.block.xxx——看到這里其實(shí)應(yīng)該松一口氣,因?yàn)閠wilight forest就是暮色森林啦,在這兒基本就可以確定是暮色崩潰了。當(dāng)然我們也不能把暮色一刪了事,看看能不能搶救呢?
twilightforest.block.ColorHandler.lambda$init$13(ColorHandler.java:266)
我們可以結(jié)合暮色的GitHub代碼來看這一條:
https://github.com/TeamTwilight/twilightforest/tree/1.12.x/src/main/java/twilightforest/block
看到了嗎?崩潰報(bào)告的原句是twilightforest.block,代表崩潰發(fā)生在twilightforest下面的block文件夾,與上面的GitHub代碼地址形成對(duì)應(yīng)。

不難看出,如崩潰語句中所說,代碼中blocks文件夾下面確實(shí)有一個(gè)colorhandler類(.java文件,編譯之后就變成.class擴(kuò)展名了),它的下面“l(fā)ambda$init$13”,代表這個(gè)類的源碼中,一個(gè)lambda運(yùn)算符出現(xiàn)了問題。
問題是發(fā)現(xiàn)了,但是如何解決呢?答:解決不了,除非我們是搞開發(fā)的——你知道lambda出現(xiàn)在哪里?只能在GitHub頁面向作者發(fā)issue(問題),希望作者大發(fā)慈悲將其修復(fù)。
讓我們繼續(xù)往下看第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代表一個(gè)叫chisel and bits(雕刻工藝)的mod發(fā)生了異常;cilent代表客戶端,render代表渲染器——是雕刻工藝的渲染機(jī)制出現(xiàn)了問題?
這要問你當(dāng)時(shí)在干什么了,很多涉及到這種裝飾類模組的崩潰,都是當(dāng)事人在雕刻/打開箱子/打開某個(gè)機(jī)器的GUI時(shí)出現(xiàn)的渲染錯(cuò)誤,而這個(gè)崩潰發(fā)生時(shí),其實(shí)我并沒有在雕刻什么東西,所以可以排除。
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寫的反射機(jī)制;
接下來還有幾個(gè)便不一一列舉,但是它們都有一個(gè)共同點(diǎn):都是MC,forge甚至Java基本的東西,基本的東西是很難出錯(cuò),也很難去進(jìn)行修復(fù)的——這代表著代碼的大幅變動(dòng),所以,它們拋出的異常其實(shí)是下游(暮色和雕刻工藝這樣負(fù)責(zé)實(shí)現(xiàn)的mod)出錯(cuò)時(shí)扔給它們的,然而它們也沒法解決,繼續(xù)拋出到Java虛擬機(jī),然后Java虛擬機(jī)破罐子破摔崩潰了。
73行以后:stacktrace(異常棧軌跡)里面的信息與先前的基本一樣,沒啥可看。
121行:affected level(影響)
主要是第129行所代表的內(nèi)容level spawn location:代表著崩潰發(fā)生的具體位置和區(qū)塊,無法修復(fù)時(shí)可以用worldedit(創(chuàng)世神插件),MCEdit,NBTExplorer之類編輯器刪除掉這一方塊/區(qū)塊。
World: (-28,64,256), (玩家所在點(diǎn)-28,64,256)
Chunk: (at 4,4,0 in -2,16; contains blocks -32,0,256 to -17,255,271), (區(qū)塊-2,16,區(qū)塊內(nèi)部坐標(biāo)4,4,0,包括了-32,0,256到-17,255,271坐標(biāo)的方塊)
Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511)(區(qū)域:包括了-32,0到-1,31這一大片區(qū)塊,沒啥用處)
151行system details之后是你的系統(tǒng)詳情,包括你的系統(tǒng),Java版本,內(nèi)存,安裝了哪些模組等等。
Minecraft Version: 1.11.2 (MC版本1.11.2)
Operating System: Windows 10 (amd64) version 10.0(操作系統(tǒng)Windows 10 64位,一般與MC的崩潰沒有關(guān)系,以后問崩潰的時(shí)候不用說你是哪個(gè)系統(tǒng))
Java Version: 1.8.0_144, Oracle Corporation(Java版本:1.8.0_144,目前的最新版本,如果是Java 1.8.0_60,25甚至是Java 7這樣的舊版本請(qǐng)更新)
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)
(當(dāng)前內(nèi)存占用,最大可以有5077MB)
JVM Flags: 5 total; -XX:+UseParallelGC -XX:-UseGCOverheadLimit -XX:-OmitStackTraceInFastThrow -Xmn128m -Xmx5120m(Java虛擬機(jī)參數(shù),一般都是默認(rèn)參數(shù)啟動(dòng)的,不需要擔(dān)心)
UCHIJAAAA——僅代表該模組加載正確,如果加載不正確就是UE/UCE形式。
接下來都是廢話,不用看。
以上就是對(duì)一個(gè)一般的崩潰報(bào)告描述,肯定有不全甚至錯(cuò)漏的地方,歡迎大家提出,我會(huì)后續(xù)更新修正。