如何看懂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目录下的全部文件都是以
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,这个表明玩家登出服务器。
也就是玩家掉线
而后咱们结合这些堆栈抛出异常的顺序。
咱们就能够得知一个大概顺序。
这是下面的内容。
咱们能够看到大大的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上原创发布。
如对你有帮助,或是让你了解了更多知识,那真是再好不过了。