2023年11月27日发(作者:)

CTDlog分析

前段时间弃坑了,因为新配的台式没有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是无所谓的,或者有所谓,但是你可以无视它,

那么就可以不解决,放着它。如果明确知道它会造成未来的某个严重问题,建议立即解决。

游戏过程中,不会引起CTDLOG:这些log多造成逻辑问题。比如一个给冰怨灵绑定摇

尾巴动作的函数找不到object,只会造成冰怨灵没摇尾巴,而不能ctd。这些error也是一

样,如果你觉得它无所谓,那么不解决也是可以的。

引起CTDLOG这些error出现在的后部,也就是你发生CTD时间戳的

地方。在这里必须多说几句,ctd的原因有三种:文件缺失或者错误,当前游戏环境超过你

的计算机处理能力,脚本严重错误。而你ctd之后查看logctd时间戳上的脚本错误,不

一定是这次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或者uskpsmpc的序号,那么可以明确知道是哪个mod出现的错误。如果是00或者

uskpsmpc的错误,就比较蛋疼,你不知道哪个mod出问题了。就算你知道哪个mod出问

题,直接删掉是完全不可取的,因为删mod会坏档呀,好吧也可以用savetool或者pdt

一下存档,但是不一定能完全清理干净....后面是说究竟发生什么错误了,比如不能找到

objectobject的类型不对呀等等等.....

[ (000C6984)].():第一段是objectform ID,你可

以在CKEDIT等软件里找到它。第二段是发生错误的脚本,第三段是错误的函数。总结一

下就是触发了一个脚本,但是对着某object做后面函数的时候出错了...

- "" Line 38psc是脚本文件。某些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最开

始抛出缺少uibase文件的错误....

这种ctd基本不用看log了,直接检查排序和mod是否缺少master文件即可。

=====================================================

==========================================

今天先写这么多,不知道未来哪一天我会更新.....有错误的话欢迎指出。不过丑话说在这,

如果你有log要分析,请发在话题区。我不是分析log的机器,我也没必要分析。记住,

帮你,你应该感激,但是不帮你,你不能抱怨,因为没人该你的。看完这句话,还不快去陪

陪父母?

暂时