看懂 遊戲《Minecraft》的崩潰報告 服務端/客戶端

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

 

 

前言

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

我所說的報錯,指的是一款名爲《Minecraft》的遊戲中的報錯。並非《個人世界》的報錯
在你們遊玩Minecraft時,有時須要裝一些Forge模組以此來提升可玩度,但本身配置模組包的時候,總會形成遊戲崩潰,而且大多數人還看不懂崩潰報告更有甚者連崩潰報告輸出目錄都不知道在哪,因而本篇教程應運而生。
數組

一些俏皮話

Minecraft這個遊戲,各類BUG和解決方案若是寫成一堆不重複的書,摞起來的厚度能夠比姚明還高。
因此這個遊戲不是通常的神奇,尤爲是當你在看崩潰報告的時,你更會體驗到這一點。bash

你不加模組,MC也會崩潰,加了仍是崩潰。這是一個比較罕見的狀況。
大多數狀況是你一股腦加了一堆模組,而後忽然蹦了,就不知道怎麼辦了。
幸運的是,這時候,你有60%的機率能夠找到問題所在並解決這個問題。服務器

尋找崩潰日誌

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

客戶端的CrashReport文件夾目錄:(.minecraft\crash-reports)
若是你啓用了版本隔離,那就在(.minecraft\versions\xxxx\crash-reports)編輯器

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

打開崩潰日誌

接下來咱們對報錯的分析,均以一個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上原創發佈。

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

在這裏插入圖片描述

相關文章
相關標籤/搜索