2023年11月27日发(作者:)
CTD的log分析
前段时间弃坑了,因为新配的台式没有HDD硬盘,SSD只有128G。安装了WOW就没
多少地方了,不过WOW毕竟不能总玩,老滚还是要玩的,于是我回来玩了。
然后呢....S逗让我到教学区装一贴,我说发个NMM教程可好?好吧那是开玩笑的,这次
装的技术我自己懂的都不多,所以加了【误导型教程】。究竟是误导,还是正确的知识呢?
摊手...
误导开始之前呢,不...教程开始之前呢,我要说一些“前置”的内容。
1.上古卷轴5本身是一个B社的一个魔幻RPG沙盒游戏,原版就那样,你们都知道的。但
是B社给出了CK这个工具,我们可以修改它,让它变成我们希望的样子。TESV是一个程
序,CK是一个开发者工具,做MOD的过程也就是开发(修改)一个程序(的一部分)的
过程。我一直把做mod放在编程范畴,所以我有觉悟。我在修改程序,所以任何错误都是
可能发生的,所以我必须付出一定时间来调试和解决错误。为什么说这些呢?因为就怕这个
观点---上古卷轴5只是一个游戏,我玩个游戏还学编程?你一旦有这个观点,就懒得去弄
一些东西了,遇到问题也没办法解决了,毕竟你什么都不会,我跟你解释变量null,数组溢
出....之类的名词,你也听不懂,对吧。so,这个觉悟还是比较重要的。
2.我不喜欢弄什么订阅才能查看,所以点不点订阅完全看你心情。
3.开启log文件记录的方法自行百度。
4.如果你玩2分钟,LOG就刷出了100K以上,我只能说,你的存档已经毁的差不多了,
或者mod冲突非常严重。那么多的error,够你当小说看了,还分析个球。
5.如果你很随便,喜欢玩mod就装,不喜欢就卸掉,或者不喜欢看mod说明,检查兼容
性等等.....那么你的老滚之路会非常艰难。
那么,开始吧。我不会一次写完的,而且这个教程也会随着我对papyrus的了解深入,慢
慢改变,所以这个教程会很坑的......看之前也要有心理准备,表喷我。
=====================================================
==========================================
1.根据LOG内容出现的时间,我把LOG内容分为三种。
运行游戏,读档,出现的LOG:这个所谓的档,最好是在吸烟室,并且保证吸烟室只有你
自己,没有其他NPC,尸体,以及多余的物品。这部分LOG内容中的ERROR,建议大家
弄懂它们的意思。如果明确知道这些error是无所谓的,或者有所谓,但是你可以无视它,
那么就可以不解决,放着它。如果明确知道它会造成未来的某个严重问题,建议立即解决。
游戏过程中,不会引起CTD的LOG:这些log多造成逻辑问题。比如一个给冰怨灵绑定摇
尾巴动作的函数找不到object,只会造成冰怨灵没摇尾巴,而不能ctd。这些error也是一
样,如果你觉得它无所谓,那么不解决也是可以的。
引起CTD的LOG:这些error出现在的后部,也就是你发生CTD时间戳的
地方。在这里必须多说几句,ctd的原因有三种:文件缺失或者错误,当前游戏环境超过你
的计算机处理能力,脚本严重错误。而你ctd之后查看log,ctd时间戳上的脚本错误,不
一定是这次ctd的罪魁祸首,因为还可能是第二种原因引起的分辨的方法就是多次试
验,100%跳的就是脚本原因。如果知道是脚本原因了,就要排查这个错误。时刻记住,找
到发生错误的mod,就卸掉它,这是不可取的,至于原因,我后面会说,当然也可能忘掉
了....
warning:警告。如果你不蛋疼,警告可以无视,因为它任何时候都不会引起ctd。但是你
分析error的时候可能会借鉴一下这些警告。
2.如果CTD了,并且你已经确定某一条error或者某一堆error是引起这次ctd的原因,那
么怎么办呢?
我随便找个脚本错误的例子....
[11/02/2014 - 12:21:22AM] Error: (000C6984): cannot find variable named
fToggleBlend.
stack:
[ (000C6984)].mationVariableFloat() - "" Line ?
[ (000C6984)].() - ""
Line 38
[11/02/2014 - 12:21:22AM]:时间戳,你可以通过ctd发生的时间找到对应的脚本错误区
域。
Error: (000C6984): cannot find variable named fToggleBlend.:错误,括号里如果不
是00或者uskp,smpc的序号,那么可以明确知道是哪个mod出现的错误。如果是00或者
uskp,smpc的错误,就比较蛋疼,你不知道哪个mod出问题了。就算你知道哪个mod出问
题,直接删掉是完全不可取的,因为删mod会坏档呀,好吧也可以用savetool或者pdt清
一下存档,但是不一定能完全清理干净....后面是说究竟发生什么错误了,比如不能找到
object,object的类型不对呀等等等.....
[ (000C6984)].():第一段是object的form ID,你可
以在CK,EDIT等软件里找到它。第二段是发生错误的脚本,第三段是错误的函数。总结一
下就是触发了一个脚本,但是对着某object做后面函数的时候出错了...
- "" Line 38:psc是脚本文件。某些mod的脚本在bsa文
件里,有些是散装的。line是行,那个函数就在psc的第几行。但是吧,某些mod只有pex
文件,没有这就是作者不给源码,怕别人抄。反编译之后line对对不上了...
3.知道了error的意思,然后呢?
首先根据object,在ck里找到那个触发脚本的入口。因为脚本一定是绑在某个入口上的,
比如绑在武器上,你拔出这个武器,就触发..等等等...你必须找到这个入口,然后看这个入
口是什么,npc啊,武器啊,还是lvlnpc啊...等等....
然后读出错的那个psc文件,这需要papyrus的知识。CK官网有papyrus的教学,也有
每个函数的解释和注意事项。skse的那些脚本,去纯净的skse里一个一个看,也就都知道
了。其中有中文的部分,只有papyrus最基础的部分....只看那些其实也是够用的,你知道
了papyrus的语法,然后函数不懂是吧?需要哪个就去ck官网查,看不懂就机翻,再自己
润色一下。
以出错的line为重点,分析,为什么会出错。
4.知道为什么出错,然后呢?
最可行的办法,也是最难以做到的办法,就是修改脚本。把一个脚本,或者一系列脚本都改
了。一般来说除了坏档的error,也就只有冲突的error了,所以对照冲突的mod,修改脚
本。然后,用savetool打开存档,把修改的脚本,以及牵连的脚本进行选择性删除。删除
之后的脚本的宿主mod配置会清空,你可能需要重新设置一下。当然这个方法难度巨大,
我不一定能做得到。
最简单的办法,但是可能会有后遗症:删除冲突的mod的其中一个。怎么选择呢?这些内
容你需要考虑:你希望保留哪个的功能,哪个对存档影响最小。考虑之后删掉整个mod。
然后去存档里删掉error的那一条脚本,然后清理整个存档。
不经常用到的方法:修改MOD。某些时候,你可以把触发的那个脚本删掉,然后也把存档
里的那个脚本实例删掉,这样会损失功能,但是确实能解决问题。某些时候,你可以创作一
个新mod,用来解决问题,新mod的作用可能是创建一个无用object,让脚本有对象可
作用,等等.....
=====================================================
==========================================
还有一种error类型,是这种。
[02/22/2015 - 01:27:54AM] Papyrus log opened (PC)
[02/22/2015 - 01:27:54AM] Update budget: 2.400000ms (Extra tasklet budget:
2.400000ms, Load screen budget: 2000.000000ms)
[02/22/2015 - 01:27:54AM] Memory page: 256 (min) 512 (max) 2457600 (max total)
DefeatPlayerQST (1C000D62) because their base types do not match
[02/22/2015 - 01:28:30AM] Error: Property FrostfallArmor on script
_de_compatibility attached to alias _DE_CompatibilityPlayer on quest
_DE_Compatibility (150286F3) cannot be bound because alias DE_Player on quest
_DE_Main_1_6 (15015CAE) is not the right type
[02/22/2015 - 01:28:30AM] Error: Unable to bind script
daymoyl_playervalidatequestalias to alias PlayerRef on quest DefeatPlayerQST
(1C000D62) because their base types do not match
这是我刚刚的没有ctd,但是形式比较像我要说的这种。它会造成游戏都进不去就ctd
了...这是为什么呢?因为你某个esp缺少master文件,或者把master文件排在了这个esp
的后面。(不确定的内容)也可能是某个esp需要的脚本不存在,missing file。为什么说
我不确定呢?因为很多带mcm菜单的mod,不装skyui也能进入游戏,然后在log最开
始抛出缺少ui的base文件的错误....
这种ctd基本不用看log了,直接检查排序和mod是否缺少master文件即可。
=====================================================
==========================================
今天先写这么多,不知道未来哪一天我会更新.....有错误的话欢迎指出。不过丑话说在这,
如果你有log要分析,请发在话题区。我不是分析log的机器,我也没必要分析。记住,
帮你,你应该感激,但是不帮你,你不能抱怨,因为没人该你的。看完这句话,还不快去陪
陪父母?
暂时


发布评论