请选择 进入手机版 | 继续访问电脑版
查看: 4897|回复: 29

[分享] 由精灵小助手引发崩溃的临时解决方案

 关闭 [复制链接]

94

主题

9503

帖子

3108

积分

玩家版主

一条咸鱼天上来,奔流东海不复回。基岩版就像新游戏一样!

UID
275090
小麦
621
金锭
8217
下界之星
0

二周年纪念勋章

发表于 2018-10-30 17:20:33 | 显示全部楼层 |阅读模式
本帖最后由 火車撞鳥 于 2018-10-30 17:38 编辑


  最近几个月,偶尔有看到关于 Minecraft 崩溃的帖子,看看崩溃报告,都是由于精灵小助手引起的,它们都抛出了同一个错误:java.lang.IllegalAccessError;这个错误字面上是因为访问了类中的私有字段导致的,但是这个问题之前在我电脑上一直都没有复现过,因为这个需要看 debug.log ,而 debug.log 默认只保存最近五次启动的,他们早就不知道启动了多少次了,所以也不好继续研究问题到底出在哪里;组件中心里只有精灵小助手带小地图功能,所以各位玩家也非常之痛苦;
  直到昨天,我也因为这个问题崩溃了一次,也终于能看到这唯一的崩溃前的 debug.log 了。经过一些粗浅的研究,我发现是因为 Forge 在加载 FMLCorePlugin 指向的类时,抛出了一连串的 java.io.FileNotFoundException 异常(找不到指定文件),导致这些 Core Mod 的类转换器无法正常加载(第三方模组则不受影响) ,从而引发了错误。


那么为什么会找不到文件?
  猜想是由于启动器复制模组和启动游戏不同步引起的:先启动了游戏,而后才进行了 删除-复制过程 (很迷|仅仅是猜想)
  所以在网易修复这个问题之前,只能自己动动手,用外部程序修复一下这个问题


那怎么判断我是不是由于精灵小助手引起的崩溃?
  首先找到「MCLDownload」文件夹(如果你把启动器安装在默认位置,那么这个文件夹应该在C盘根目录下;如果你改了其他位置,那么这个文件夹就应该在你的安装路径里面),然后依次打开「MCLDownload\Game\.minecraft」,看看里面有没有「crash-reports」文件夹,如果没有,你还崩溃,那就不是由于程序异常引起的了,如果有,打开它,里面应该有一串以「crash-yyyy-MM-dd_hh.mm.ss-client.txt」命名的文件,这些就是崩溃报告,其中 yyyy-MM-dd_hh.mm.ss 代表 年-月-日_时.分.秒 ,表示崩溃的时刻,你别找是最近崩溃的,结果上面时间写的大半年前的,那这样也是徒劳。
  找到之后,双击打开,看看有没有以下内容:
  1. net.minecraftforge.fml.common.LoaderExceptionModCrash: Caught exception from Inventory Sort (invsort)
  2. Caused by: java.lang.IllegalAccessError: tried to access field net.minecraft.client.settings.KeyBinding.field_74512_d from class com.netease.invsort.InvTweaksObfuscation
  3.         at com.netease.invsort.InvTweaksObfuscation.getKeyBindingForwardKeyCode(InvTweaksObfuscation.java:272)
复制代码

如果有的话,基本上就是了。

  
  我的解决思路还是治 java.lang.IllegalAccessError 的标,至于 java.io.FileNotFoundException ,知识盲区,我的想法也非常简单,只需要把那几个要访问的类成员的修饰符改成 public 就完事了,所以可以利用ASM修改。

  ClassTransformer.java:

  1. package invsortfix;

  2. import java.util.Arrays;
  3. import java.util.List;
  4. import org.objectweb.asm.ClassReader;
  5. import org.objectweb.asm.ClassWriter;
  6. import org.objectweb.asm.Opcodes;
  7. import org.objectweb.asm.tree.ClassNode;
  8. import org.objectweb.asm.tree.FieldNode;
  9. import net.minecraft.launchwrapper.IClassTransformer;
  10. import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;

  11. public class ClassTransformer implements IClassTransformer {
  12.     private List<String> targetClass = Arrays.asList("net.minecraft.client.settings.KeyBinding", "net.minecraft.client.gui.GuiScreen");
  13.     private List<String> targetField = Arrays.asList("field_74512_d", "field_146292_n");

  14.     @Override
  15.     public byte[] transform(String className, String transformedName, byte[] basicClass) {
  16.         if (targetClass.contains(transformedName)) {  // 查找指定的类
  17.             ClassReader classReader = new ClassReader(basicClass);
  18.             ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
  19.             ClassNode classNode = new ClassNode();
  20.             classReader.accept(classNode, 0);
  21.             for (FieldNode fieldNode : classNode.fields) {  // 遍历指定类中的所有字段
  22.                 String mappedFieldName = FMLDeobfuscatingRemapper.INSTANCE.mapFieldName(className, fieldNode.name, fieldNode.desc); // 反混淆Minecraft中的名称
  23.                 if (targetField.contains(mappedFieldName)) {  // 将指定字段的修饰符改为 public
  24.                     fieldNode.access = Opcodes.ACC_PUBLIC;
  25.                 }
  26.             }
  27.             classNode.accept(classWriter);
  28.             return classWriter.toByteArray();
  29.         }
  30.         return basicClass;
  31.     }
  32. }
复制代码


  不过因为治标不治本(没有解决组件中心及自带模组的类转换器无法加载的问题),所以精灵小助手里带的R键整理无法使用,但是至少是把崩溃治了一下;
  我这里有一份编译好的程序提供下载,只需要将压缩包里的「MCLDownload」文件夹解压,和中国版的「MCLDownload」文件夹合并就行了。(回复后可见)
  
游客,如果您要查看本帖隐藏内容请回复


评分

参与人数 6 小麦 +2 金锭 +24 收起 理由
龙卷啊 + 1 因吹丝汀
逗比Devil + 2 --------
Mc三连长 + 1 观点赞同
蓝颜5886 + 20 善意灌水
云月 + 1 海星
Argon_gas + 1 .

查看全部评分

0

主题

33

帖子

9

积分

Lv.1 新手木匠

UID
5793728
小麦
1
金锭
33
下界之星
0
发表于 2018-10-30 17:54:29 | 显示全部楼层
本帖最后由 我是一个复读机 于 2018-10-30 17:57 编辑

火鸟大神强啊 不愧是@ZekerZhayard  (hypixel榜1猎人!!! p4猎人!)

161

主题

5815

帖子

2812

积分

Lv.8 凋零克星

UID
187749
小麦
1169
金锭
3173
下界之星
0

二周年纪念勋章

发表于 2018-10-30 20:56:12 | 显示全部楼层
本帖最后由 Tommy0328 于 2018-10-30 21:27 编辑

楼主加油,有人占楼!


40

主题

2448

帖子

1201

积分

Lv.7 下界居民

UID
42484
小麦
543
金锭
825
下界之星
0

二周年纪念勋章一周年纪念勋章内测精英勋章

发表于 2018-10-30 21:04:09 | 显示全部楼层
小精灵有危险了
我不要当版主!
练习inso中
预计7月底喵人技术会得到提升
鎵f墸锛氬叚鍏叚浜屼節涓浜斾簩

0

主题

46

帖子

14

积分

Lv.1 新手木匠

UID
3384765
小麦
2
金锭
89
下界之星
0
发表于 2018-10-30 21:08:33 来自手机 | 显示全部楼层
Tommy0328 发表于 2018-10-30 22:56
禁止UID为3384765水贴!
火鸟顺便删掉沙发层,因为他水帖了

抱歉,请不要水贴

点评

你也是水啊  发表于 2018-10-30 21:09

77

主题

3697

帖子

1787

积分

Lv.7 下界居民

UID
33166
小麦
775
金锭
403
下界之星
0

二周年纪念勋章一周年纪念勋章内测精英勋章

发表于 2018-10-30 21:20:15 | 显示全部楼层
支持一下.会编程就是好;-;

0

主题

46

帖子

14

积分

Lv.1 新手木匠

UID
3384765
小麦
2
金锭
89
下界之星
0
发表于 2018-10-30 21:21:50 | 显示全部楼层
Tommy0328 发表于 2018-10-30 22:56
禁止UID为3384765水贴!
火鸟顺便删掉沙发层,因为他水帖了

你哪里来的脸说我?

114

主题

4320

帖子

1511

积分

玩家版主

愿来年今日 春暖花开

UID
37934
小麦
305
金锭
3123
下界之星
0

二周年纪念勋章

发表于 2018-10-30 22:20:28 | 显示全部楼层
支持一下火鸟

143

主题

2717

帖子

1027

积分

Lv.7 下界居民

UID
7176
小麦
195
金锭
69
下界之星
0
发表于 2018-10-30 22:31:06 | 显示全部楼层
发现JAVA大佬一枚

0

主题

2

帖子

1

积分

Lv.1 新手木匠

UID
5843242
小麦
0
金锭
2
下界之星
0
发表于 2018-10-31 10:33:25 来自手机 | 显示全部楼层
试试这个办法

0

主题

2

帖子

1

积分

Lv.1 新手木匠

UID
5843242
小麦
0
金锭
2
下界之星
0
发表于 2018-10-31 10:37:28 来自手机 | 显示全部楼层
没有用啊

94

主题

9503

帖子

3108

积分

玩家版主

一条咸鱼天上来,奔流东海不复回。基岩版就像新游戏一样!

UID
275090
小麦
621
金锭
8217
下界之星
0

二周年纪念勋章

 楼主| 发表于 2018-10-31 11:47:59 | 显示全部楼层

emmmm
你确定是由于精灵小助手引起的崩溃嘛
如果是的话,发一下MCLDownload\Game\.minecraft\logs\debug.log看看

113

主题

1万

帖子

6693

积分

玩家版主

沉迷我的手艺.jpg

UID
514
小麦
1921
金锭
18500
下界之星
0

二周年纪念勋章一周年纪念勋章内测精英勋章问答斯基的方向盘

发表于 2018-11-1 07:21:42 来自手机 | 显示全部楼层
支持啊仰望大佬

0

主题

1

帖子

0

积分

Lv.1 新手木匠

UID
5394048
小麦
0
金锭
3
下界之星
0
发表于 2018-11-2 00:26:26 来自手机 | 显示全部楼层
6啊

12

主题

36

帖子

23

积分

Lv.2 石器学徒

UID
78231
小麦
1
金锭
72
下界之星
0
发表于 2018-11-3 21:57:59 | 显示全部楼层
大佬大佬 佩服佩服
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部