怎么看崩潰日志(入門)
總有人問我怎么看崩潰日志,這里我簡單講一下。
日志(崩潰日志、崩潰報告、log、crash-report),是診斷問題的主要途徑。
(嚴格來講,崩潰報告和日志不一樣,但這里我就不做區(qū)分了,因為它們在崩潰的時候幾乎完全一樣,不崩潰的時候都沒什么人看。)
看日志有三步:
看報錯類型,看看是不是內(nèi)存不足之類的
看堆棧,找是哪個mod
看游戲當前狀態(tài),合理分析
當然,這只是給新手做的劃分。像我實際看的時候,都是憑感覺隨便翻翻就行。熟練之后你也可以。

上圖是日志的核心部分舉例。
一篇日志可能前后都有很長的內(nèi)容,但,
核心部分的開頭一定是“---- Minecraft Crash Report ----”(意思是“我的世界崩潰報告”)(Mohist服務器則是中文的“---- Mohist 崩潰報告 ----”)
后面有一句“A detailed walkthrough of the error, its code path and all known details is as follows:”(意思是“錯誤的詳細信息,其代碼路徑和所有已知的細節(jié)如下所示:”)
大部分情況是英文的,但,如果你用的是mohist服務器,你會發(fā)現(xiàn)這些都變成了中文,那么你就要找到中文的這兩句話。
這兩句的后面都有著明顯的開頭空格對齊的文字,開頭都是“at”,特征很明顯。有經(jīng)驗的人只要一眼就能找到這部分,如果你是新手,可以靠Ctrl+F搜索“detailed walkthrough”一詞來尋找。
當然,如果你發(fā)現(xiàn)日志里真的沒有這一段,那可能是非常嚴重的底層錯誤,就得找大佬了。
舉例:

像這種沒頭沒尾的日志,就算是大佬都不一定能搞定。我只能祝你遇到的不是這種情況。

回到圖1,看正常的例子?!?strong>Description: ”后面的一句話是報錯類型,有時候還跟著幾行,告訴你為什么崩潰。當然,這句話是給程序員看的,很多時候不寫代碼的人并不能看懂。
一眼就能確診的有:
Description: Not Enough Memory ——內(nèi)存不足
Wrong Minecraft Versions!?—— 裝到了錯誤的MC版本。舉例來說,你把1.12.2的mod裝到了1.7.10里。
沒法一眼確診的典型:
Description: Exception ticking world
Description: Exception in server tick loop
Description: Unexpected error
Description: Initializing game
Description: Batching chunks
……
好,一眼不能確診的話,我們往下看“堆棧”區(qū)。堆棧區(qū)的格式是這樣的:
某某錯誤
? at 某某.某某.某某……(某文件的某行)
? at 某某.某某.某某……(某文件的某行)
? at 某某.某某.某某……(某文件的某行)
? ……
崩潰例子A:
java.lang.NoClassDefFoundError: net/minecraft/world/World$2
? at net.minecraft.world.World.func_190524_a(World.java:557)
? at net.minecraft.world.World.func_175685_c(World.java:492)
? at net.minecraft.world.World.func_175722_b(World.java:440)
? at net.minecraft.world.World.markAndNotifyBlock(World.java:381)
? at net.minecraft.world.World.func_180501_a(World.java:361)
? at net.minecraft.block.BlockBush.func_176475_e(BlockBush.java:68)
? at net.minecraft.block.BlockBush.func_180650_b(BlockBush.java:60)
? at com.rumaruka.thaumicbases.common.block.BlockTBSapling.func_180650_b(BlockTBSapling.java:59)
? at net.minecraft.block.Block.func_180645_a(Block.java:508)
? at net.minecraft.world.WorldServer.func_147456_g(WorldServer.java:476)
? at net.minecraft.world.WorldServer.func_72835_b(WorldServer.java:225)
? at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:756)
? at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:668)
? at net.minecraft.server.integrated.IntegratedServer.func_71217_p(IntegratedServer.java:185)
? at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526)
? at java.lang.Thread.run(Unknown Source)
后面一大堆“at”開頭的行,你會發(fā)現(xiàn)他們的開頭格式固定為“某某點某某點某某……”,這一般是com.作者名.mod名,mod名就藏在這一部分。當然,也有可能是其他的格式,這取決于mod作者怎么寫的。后面會講到,你不需要知道所有的情況,你只需要知道這里是最與眾不同的部分即可。
準確地說,這里的不是mod名,而是modid,一個用來區(qū)分mod的詞。比如,匠魂是“tconstruct”,神兵是“dweapon”,別指望這里有漢字的名稱。
那,怎么判斷哪行來自mod呢?
排除以下開頭的行,剩下的基本就是了:
net.minecraft
net.minecraftforge
java.
sun.reflect
cpw.mods.modlauncher
com.google.
說白了,mod運行在MC上,MC運行在Java上,崩潰了你既不能刪mc也不能刪java,只好刪mod,所以日志里提到的mc和java相關(guān)的東西都無視掉就好。
例子A里,唯一提到的mod是“com.rumaruka.thaumicbases”,那么九成九的情況下它就是罪魁禍首。可是,這是什么mod呢?如果你經(jīng)驗豐富,你會知道“thaumic”是神秘時代。如果你經(jīng)驗不豐富,那么就把這一段的每個單詞(除了“com”“github”以外)拿出來Ctrl+F搜索,看看他會不會在某個列表里出現(xiàn)。如果你發(fā)現(xiàn)你的日志沒有mod列表,或者根本查不到,那就得去網(wǎng)上搜搜這是個啥了。


1.12.x的mod列表

查出來是哪個mod的問題了,怎辦?如果你毫無頭緒,那就更新這個mod的版本。如果還不行,刪了這mod。
當然,也有的時候有好幾個mod都被點名了。比如這個例子:(這里com/xxx/xxx視同com.xxx.xxx來看)
java.lang.NoClassDefFoundError: com/animania/common/entities/sheep/EntityEweBase
at org.orecruncher.dsurround.client.renderer.AnimaniaBadge.scale(AnimaniaBadge.java:109)
at org.orecruncher.dsurround.client.renderer.BadgeRenderLayer.doRenderLayer(BadgeRenderLayer.java:127)
at net.minecraft.client.renderer.entity.RenderLivingBase.renderLayers(RenderLivingBase.java:561)
at net.minecraft.client.renderer.entity.RenderLivingBase.doRender(RenderLivingBase.java:270)
這里,“animania”是動物谷,“dsurround”是動態(tài)環(huán)繞。出現(xiàn)多個mod的時候,往往是它們沖突了。這也很正常,各個mod作者各寫各的,誰也不能保證互相全都兼容。世界上少說幾萬個,誰也不能逐一測試。遇到這情況,請果斷裁決,刪掉哪個。如果是我的話……我可能會刪動態(tài)環(huán)繞。
到此,你已經(jīng)能查出一些基本的問題了。剩下的第三步,通俗點說就是整篇日志全都看一遍,然后看哪里可疑。這個過程需要比較好的英語水平,以及對MC和mod運作原理的認知,還要有豐富的經(jīng)驗。對于小白來說,知道前面的看報錯類型和堆棧就已經(jīng)差不多了。
第三步的舉例,以后我再講解吧。
(待續(xù))