如何看懂 游戲《Minecraft》的錯誤報告 客戶端/服務端


如何看懂Minecraft報錯的關鍵信息。

 

 

前言

[WARNING] 本篇適用於Minecraft服務端/客戶端報錯的診斷分析,其他游戲除外,比如網易
[WARNING] 本篇適用於Minecraft服務端/客戶端報錯的診斷分析,其他游戲除外,比如網易
[WARNING] 本篇適用於Minecraft服務端/客戶端報錯的診斷分析,其他游戲除外,比如網易

我所說的報錯,指的是一款名為《Minecraft》的游戲中的報錯。並不是《我的世界》的報錯
在大家游玩Minecraft時,有時需要裝一些Forge模組以此來提高可玩度,但自己配置模組包的時候,總會造成游戲崩潰,並且大多數人還看不懂崩潰報告更有甚者連崩潰報告輸出目錄都不知道在哪,於是本篇教程應運而生。

一些俏皮話

Minecraft這個游戲,各種BUG和解決方案如果寫成一堆不重復的書,摞起來的厚度可以比姚明還高。
所以這個游戲不是一般的神奇,尤其是當你在看崩潰報告的時,你更會體驗到這一點。

你不加模組,MC也會崩潰,加了還是崩潰。這是一個比較罕見的情況。
大多數情況是你一股腦加了一堆模組,然后突然蹦了,就不知道怎么辦了。
幸運的是,這時候,你有60%的概率可以找到問題所在並解決這個問題。

尋找崩潰日志

首先,你得知道你的客戶端/服務端目錄

客戶端的CrashReport文件夾目錄:(.minecraft\crash-reports)
如果你啟用了版本隔離,那就在(.minecraft\versions\xxxx\crash-reports)

服務端的CrashReport在你的服務端根目錄下。
這個條件的前提是你的服務端是人類已知的服務端,而不是外星人制造的服務端。

打開崩潰日志

接下來我們對報錯的分析,均以一個Minecraft 1.12.2 Forge服務端為例

crashreport文件夾
嗯,我們可以看到,crashreport目錄下的所有文件都是以
crash-日期_具體時間-server.txt命名的
如果是客戶端的崩潰報告日志,后面的server則是client。

然后我們找到一個最新的日志打開並分析。

告訴你怎么瞬間找到最新崩潰日志,在這里插入圖片描述
直接點擊這個按鈕就完事了。然后會按照報告的生成時間進行排列。

重要的事說三遍

接下來我們對報錯的分析,均以一個Minecraft 1.12.2 Forge服務端為例
接下來我們對報錯的分析,均以一個Minecraft 1.12.2 Forge服務端為例
接下來我們對報錯的分析,均以一個Minecraft 1.12.2 Forge服務端為例

下載文本編輯器

首先你需要一個文本編輯器來查看崩潰報告,
這里我推薦微軟官方的Visaul Code: 點我下載.

然后我們就可以愉快地打開報告進行查看了。

開始分析

好了,我們說了這么多廢話,是時候開始正式的分析了。
我估計前面的事大多數人已經做完了,就等着我講這個。

廢話不多說,開始。

打開后我們首先看到的是這個
在這里插入圖片描述其中,WARNING coremods are present:xxxxx 是廢話,你根本不用管。
產生這種警告是因為有的作者動了Minecraft底層的代碼,然后Forge為了方便,給你整出來了。
在99.9999999%的情況下,coremods在理論上不會造成崩潰。所以你可以忽略這些。

再往下看。

在這里插入圖片描述我們先引出幾個重要概念,當然你不用理解。
你會發現這些報錯里都會有一大堆的文字:

at net.xxxxx
at org.xxxxxxxx
at com.xxxxxx
at java.lang.xxxx

這些有專門的術語,叫做棧幀(stacktrace)。

CPU寄存器的空間是極其有限的,因此方法的調用需要在棧上開辟空間,每調用一個方法就會生成一個棧幀,因此崩潰報告里的一堆at at
at所代表的一系列棧幀,某種意義上是一條調用鏈,最后被調用的方法(也就是爆出異常的方法)會被崩潰報告放在最上面

我們可以看見,頂上有
在這里插入圖片描述
這3行東西,
第一行是廢話,你可以不用管。
第二行這個報告中最后一個棧幀拋出異常的時間。
第三行是這個報錯的描述,也就是人類可讀的大白話形式。
從這開始,下面的句子都不是人類可讀形式,當然。相比原版的報錯來說,Forge的報錯非常非常人性化了。

我們可以從第三行看到,這個崩潰報告的描述是 Ticking player。
player代表球員 玩家,也就是說這個報錯跟玩家有關系。
Tciking指的是刻,這個以后再說。

然后我們再來看下面的報錯

在這里插入圖片描述這個報錯片段中。
第一行是錯誤類型
我們可以看到,這個報錯的錯誤類型是
java.lang.IndexOutOfBoundsException
如果你開過Minecraft群組服務器,或者學過java。你可以知道
這個叫做數組下標越界異常,是一個在Minecraft中非常常見的異常。

我們不用去管這個具體是什么,直接往下看。
下面那些一大堆棧幀的排列,並非沒有順序。
這些棧幀的排列方式,是由它們拋出異常的順序決定的。
聽不懂?我們看圖

在這里插入圖片描述紅色箭頭指的棧幀,是第一個拋出異常的棧幀。
然后黃色箭頭的棧幀,是最后一個拋出異常的棧幀。
現在你懂了棧幀的排列順序了吧。
最前面的棧幀就是最后一個拋出錯誤的位置,也就是說大多數情況我們是從這里下手。
或者從第一個棧幀的后面幾個棧幀下手。

好,我們繼續看。

現在我們遇到的是指數組下標越界異常。
例如:一個ArrayList數組中沒有元素,而你想獲取第一個元素,運行是就會報此類型的錯誤。
聽不懂?我們看報錯!

在這里插入圖片描述
看看,最后棧幀拋出的異常,就是ArrayList在獲取元素的時候沒找到。
當然你不用在意這個,繼續往下看。

在這里插入圖片描述這里已經出現了產生這個崩潰的模組名字。
這個模組叫做:slashblade,也就是大家經常玩的拔刀劍。

然后你發現,這些棧幀的形式都是
at xxx.xxxxxxx.xxxxxx.xxxxxxxx.xxxxxxx.xxxxxx(xxxx.java:xxxx)
如果你以壓縮包形式打開拔刀劍模組JAR文件,
你會發現一件事。
那就是這些棧幀其實就是這個JAR壓縮包的內部目錄結構!!!!!

就比如這條棧幀
at mods.flammpfeil.slashblade.item.ItemSlashBlade$ComboSequence.get(ItemSlashBlade.java:310)

我們可以把所有的" . “去掉,改成” / 或者 \ "
這樣就是一個文件目錄了!!

at mods.flammpfeil.slashblade.item.ItemSlashBlade$ComboSequence.get(ItemSlashBlade.java:310)
相當於
at mods\flammpfeil\slashblade\item\itemSlashBlade
在這里插入圖片描述而這段藍色的,ComboSequence.get,指的是這個棧幀中拋出異常的方法。並不是文件目錄。
括號里的ItemSlashBlade.java:310指的是,
這個異常發生在
ItemSlashBlade.java這個文件夾中的第310行。

是不是突然明白一大堆東西!!!!!!!!!

下面的圖就是我用壓縮包形式打開拔刀劍模組文件后,
把棧幀轉換成目錄,就找到了拋出異常的文件路徑。

在這里插入圖片描述

深度分析

好了,那么我們接下來進行硬核(Hardcore)分析吧

上面我們已經找到了這個崩潰中有拔刀劍的信息
那么我們就進一步分析。

我們知道,拔刀劍有幾個棧幀拋出了異常,那么我們以最后一個拋出異常的棧幀進行分析。
amods.flammpfeil.slashblade.item.ItemSlashBlade$ComboSequence.get
從這段信息中我們得知,這個拋出異常的方法在ComboSequence.Get中

ComboSequence翻譯過來就是組合技,然后我們進一步分析
既然這個崩潰出在了拔刀劍的組合技上,那也就是說。
我的服務器崩潰是因為,有某個人用了拔刀的組合技,然后不知道觸發了什么BUG。服務器就因此崩潰了。

很好,如果你能分析到這一步,那就快接近真相了!

上 代 碼

我們首先登陸Github(世界上最大的代碼托管站)
然后找到拔刀劍的開源代碼倉庫,並依次進入目錄
src/main/java/mods/flammpfeil/slashblade/item/ItemSlashBlade.java
然后這個就是拋出異常的原代碼了。
然后搜索方法 ComboSequence.get

//報錯產生的位置
	public static ComboSequence getComboSequence(NBTTagCompound tag){
		return ComboSequence.get(tag.getInt(comboSeqStr));
	}

很好,你可能看見一個熟悉的詞匯,叫做NBT
我們引用一段百度百科上的話

二進制命名標簽(Name Binary Tag),NBT格式為Minecraft中用於向文件中存儲數據的一種存儲格式。NBT格式以樹形結構並配以許多標簽的形式存儲數據

既然如此,我們就可以知道
這個報錯的產生和NBT標簽有關系,然后我們只需要看見tag這個詞即可。
這就代表,這個異常的產生是因為在獲取組合技的NBT數據時產生異常,在結合最后一個拋出的異常
也就是數組下標越界異常
我們就可以推導出這個異常的產生了。

一個玩家在使用拔刀的組合技時,然后這個組合技因為某種原因無法使用,也就是ArrayList數組元素為空,導致拋出數組下標越界異常,引發Minecraft服務器保護機制然后自動關服。並產生這個報錯。

好了,我們繼續看下面的棧幀。
對於下面的棧幀來說,上面的棧幀全是主要原因。也就是說下面的棧幀都是廢話
不過我還是貼出來讓你了解一下。

在這里插入圖片描述很好,接下來我們看紅圈內的棧幀。

其中所有 net.minecraftforge.fml.xxxx的棧幀,基本上沒什么有價值的信息。
我們繼續看下面 net.minecraft.xxxx的棧幀,我們可以看到關鍵詞匯那就是entity

得出結論

Entity就是實體的意思,也就是說這個東西出現在玩家使用組合技與實體進行交互時才發生的數組下標躍境異常

我們繼續看
在這里插入圖片描述
這2段代表了有關玩家的信息,意義不大。
在這里插入圖片描述我們在這些棧幀中可以看到有network和server單詞。
這代表這些棧幀與網絡和服務端關西了。
這段也是意義不大,而且與拔刀劍產生的報錯無關,我們繼續看。
在這里插入圖片描述
這段才是好戲,我們可以看到一個詞組叫playerLoggedOut,這個代表玩家登出服務器。
也就是玩家掉線
然后我們結合這些堆棧拋出異常的順序。
我們就可以得知一個大概順序。

  1. 玩家使用組合技后,首先從掉線
  2. 然后服務端發現異常
  3. 然后服務端整理崩潰后就關閉服務器了。
    很好,我們對錯誤的分析已經結束了。
    接下來我們繼續往下看!
  • 完成看崩潰報告的棧幀並得出結論~

修復報錯

在這里插入圖片描述這是下面的內容。
我們可以看到大大的Head (頭部)字樣
然后Thread(線程): Server thread(主線程)
我們可以得到一個信息
那就是說,這些棧幀拋出錯誤是在服務器主線程上拋出的,所以才會導致服務器自我保護機制開啟並關閉服務器。

我們繼續往下看。
在這里插入圖片描述我們可以看見大大的 Player being ticked
這段代表有關出錯實體的名字。
然后既然出現了Player,代表這個實體是玩家。
也就代表,這個是出錯的實體是玩家。因為那個錯誤拔刀劍在玩家手上。所以出錯實體是玩家。

在這里插入圖片描述
然后
Entity Type是實體類型,Entity ID是實體的ID,Name就不用解釋了,是實體名。
因為這個實體是玩家,所以實體名就是玩家名。

如果是一只名為蔡徐坤(cxk)的生物(mobs)實體扔出了籃球,造成了異常。那就是
在這里插入圖片描述
好了,我們已經知道造成異常的原因、造成異常的玩家了。
那么接下來,就是解決方案拉。

解決方案

好,我們開始解決。
一般來說由實體引起的報錯,我們只需要刪除這個實體就行了。
這段包含了出錯實體,也就是用了錯誤拔刀劍玩家的位置。
如果這些實體不是玩家,我們可以利用MCEdit、創世神、原版kill指令讓這些實體GG。

可問題在於,這個是玩家。那怎么辦?

我們有2個辦法

第一個是刪除有關這個玩家的背包信息,
第二個是打開Forge的錯誤實體自動移除功能。

我們選擇第二個對吧,
我們在服務端的config文件夾內找forge.cfg然后打開
並找到如下兩行
然后把false改成true並重啟服務器即可。
在這里插入圖片描述
好了,報錯修復到此結束。

看懂更多

先說一下,這個與解決崩潰沒什么關系了
純粹是為了讓你了解更多的東西。
直接上圖,
在這里插入圖片描述我們可以看到。
System Details的意思是 系統細節
然后下面有
Minecraft Version 游戲版本
Operating System 操作系統型號
Java Version Java版本
Java VM Version JVM版本
Memory 內存大小
JVM Flags JVM附加參數等東西
然后還有Plugins 里面有你加載到服務器里的插件名字
還有FML 代表Forge版本
State和下面的表,是你載入到服務器里的模組和模組的情況
這些英文自己翻譯就行了。
建議平時多積累點詞匯量。

結束

好了,本文到此結束。轉載須注明作者名字和原文地址
本文由Dinnerbone晚餐骨於CSDN上原創發布。

如對你有幫助,或是讓你了解了更多知識,那真是再好不過了。

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM