AsOne2020 发表于 2024-6-6 12:22:24

[Java] 一次Minecraft崩溃分析及解决方法

今天在某群里看到群友的Minecraft崩溃了,经过了解,可能是由于一个名为screenshot-to-clipboard mod引起的
分析问题先上日志经过一番简单的分析,我们得知是 screenshotclipboard 模组在应用ScreenshotMixinAWT mixin到net.minecraft.class_318类时出的问题,继续往下看可以知道注入时函数的参数不对Expected (Lnet/minecraft/class_1011;Ljava/io/File;Ljava/lang/Object;Ljava/util/function/Consumer;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V but found (Lnet/minecraft/class_1011;Ljava/io/File;Ljava/util/function/Consumer;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V
继续观察日志


https://article.biliimg.com/bfs/new_dyn/0db2011e9ea2b3f9a466f4806968ec80259168987.png@.webp
通过日志我们可以得知mod运行的环境Minecraft 1.16.5Fabric Loader 0.14.25optifabric 1.13.16OptiFine_1.16.5_HD_U_G8screenshotclipboard 1.0.7
尝试复现bug,这里我们首先下载安装对应的版本以及mod

这里先禁用掉optifabric和optifine启动,按下F2进行截图,截图成功保存到剪切板,发现功能是正常的,因此推测可能是由于和其他mod冲突导致的
反编译screenshotclipboard模组,并找到对应类我们可以看到这里向class_318的method_1661函数注入代码
我们先使用arthas dump出 net.minecraft.class_318并查看字节码
记录下这里方法method_1661(Lnet/minecraft/class_1011;Ljava/io/File;Ljava/util/function/Consumer;)V
关闭游戏,回到mod管理界面,我们打开optifabric和optifine,并启动游戏,按下F2进行截图,游戏崩溃,查看日志,出现了同样的崩溃日志


禁用掉screenshotclipboard模组,再次启动游戏,按下F2,正常截图再次使用arthas dump出net.minecraft.class_318类,并查看字节码此时我们发现方法 method_1661变为了method_1661(Lnet/minecraft/class_1011;Ljava/io/File;Ljava/lang/Object;Ljava/util/function/Consumer;)V到此我们可以得知问题是由于optifabric模组更改了方法method_1661的参数导致模组mixin无法成功注入,因此我们可以通过 修改mixin中函数参数与新method_1661方法匹配 进行解决。
这里我们使用JByteMod修改对应mixin(ScreenshotMixinAWT、ScreenshotMixinMacOS)的字节码并保存将原有的screenshotclipboard mod文件替换为修改后的并启动,按下F2截图,截图成功保存到剪切板,到此问题已经成功解决。

雷电星空 发表于 2024-6-6 13:23:21

阿巴阿巴阿巴阿巴
页: [1]
查看完整版本: [Java] 一次Minecraft崩溃分析及解决方法