简介与前期准备:
模组“.NET Script Framework”可以在你游戏的部分闪退出错时为你生成一些闪退日志。这些闪退日志可以帮助你查找定位部分模组的问题,为你提供一个排错的方向,方便大家进行取消或者修复。然而很多人不会看日志,这个帖子就浅聊一下怎么看日志,并且提供一些案例来帮助大家进行理解。
准备以下模组:
.NET Script Framework
以及对应的前置:
DLL Plugin Loader
这两个都是最基础的前置模组,相信大部分朋友都有安装,安装时注意看原址说明
再准备SSEdit,这是天际的编辑器也能帮助我们做一些小玩具
你的报错日志都会存在overwrite文件夹中对应路径为(overwrite\NetScriptFramework\Crash)的文件夹中什么是overwrite文件夹
日志(log)结构简介以及查看方法:
一般来说你的log日志结构如下:
跳出原因
游戏基础信息与报错时间
Possible relevant objects
Probable callstack
Registers
Stack
Modules
Plugins
但是我们实际上只需要前面4部分,即:
跳出原因
游戏基础信息与报错时间
Possible relevant objects
Probable callstack
1、跳出原因:
通常为日志的第一行,直接反应了你报错的地方
2、游戏基础信息与报错时间:
没什么大用,但是既然都截了,不妨一起截下来对吧
3、Possible relevant objects:
闪退时涉及到的游戏内对象,很可能与闪退有关
4、Probable callstack:
可能造成出错的游戏堆栈,需要重点排查的地方
很多人看日志时基本上只关注第三点,但是实际上1,3,4都是我们需要重点查看的地方。
尤其是第4点,有计算机编程基础的朋友们可以在里面发现一些报错的函数之类的来进一步缩小原因,不过由于本教程面向的大部分人都是没太多编程基础的,因此在这里只会提供一些简单无脑的方法。
以下以一些实战来帮助大家理解。
实战演示:
日志1——来源某裔:
Unhandled native exception occurred at 0x7FF71D20D9BD (SkyrimSE.exe+D4D9BD) on thread 12960!
FrameworkName: NetScriptFramework
FrameworkVersion: 15
FrameworkArchitecture: x64
GameLibrary: SkyrimSE
GameLibraryVersion: 18
ApplicationName: SkyrimSE.exe
ApplicationVersion: 1.5.97.0
VersionInfo: Successfully loaded
Time: 01 Jun 2023 21:41:01.536
Possible relevant objects (21)
{
[ 23] BSTriShape(Name: `FeetB`)
[ 24] BSTriShape(Name: `BaseShapeB`)
[ 28] NiNode(Name: `NPC Spine [Spn0]`)
[ 36] NiNode(Name: `Scene Root`)
[ 47] NiNode(Name: `NPC Root [Root]`)
[ 52] NiNode(Name: `Scene Root`)
[ 85] TESNPC(Name: `???????????????`, FormId: FF004D38)
[ 85] Character(FormId: 000D3C13, File: `Skyrim.esm`, BaseForm: TESNPC(Name: `???????????????`, FormId: FF004D38))
[ 87] NiNode(Name: `Scene Root`)
[ 90] BSFadeNode(Name: ` (000214EA)[0]/ (000214EB) [60%]`)
[ 102] NiNode(Name: `CME Spine2 [Spn2]`)
[ 104] NiNode(Name: `bootsm_0.nif`)
[ 114] NiNode(Name: `CME Spine1 [Spn1]`)
[ 120] NiNode(Name: `NPC Spine1 [Spn1]`)
[ 138] NiNode(Name: `CME UBody [UBody]`)
[ 144] NiNode(Name: `CME Body [Body]`)
[ 150] NiNode(Name: `NPC COM [COM ]`)
[ 156] BSFlattenedBoneTree(Name: `NPC Root [Root]`)
[ 162] NiNode(Name: `CME Camera3rd [Cam3]`)
[ 176] BSFadeNode(Name: `skeleton.nif`, Owner: `Character(FormId: 000D3C13, File: `Skyrim.esm`, BaseForm: TESNPC(Name: `???????????????`, FormId: FF004D38))`)
[ 340] TESRace(Name: NordRace `?????????`, FormId: 00013746, File: `Aetherius.esp <- Unofficial Skyrim Special Edition Patch.esp <- Update.esm <- Skyrim.esm`)
}
Probable callstack
{
[0] 0x7FF71D20D9BD (SkyrimSE.exe+D4D9BD) BSTriShape::unk_D4D760+25D
[1] 0x7FF71D20D465 (SkyrimSE.exe+D4D465) BSTriShape::unk_D4D360+105
[2] 0x7FF71D20DFE2 (SkyrimSE.exe+D4DFE2) unk_D4DFA0+42
[3] 0x7FF71D20DED8 (SkyrimSE.exe+D4DED8) NiNode::unk_D4DE90+48
[4] 0x7FF71D20DF53 (SkyrimSE.exe+D4DF53) NiNode::unk_D4DE90+C3
[5] 0x7FF71D20D2F0 (SkyrimSE.exe+D4D2F0) NiNode::unk_D4D2A0+50
[6] 0x7FF71C6878BF (SkyrimSE.exe+1C78BF) unk_1C6F90+92F
[7] 0x7FFE69F7B644 (CopyCharacterAppearance.dll+B644)
[8] 0x8802F300
[9] 0xFFFFFFFF
[10] 0xB9F2335B4D00
[11] 0x2787B31B700
[12] 0xBF800000
[13] 0xFFFFFFFFFFFFFFFE
[14] 0xBF800000
}
首先看第一行,这是报错原因:
Unhandled native exception occurred at 0x7FF71D20D9BD (SkyrimSE.exe+D4D9BD) on thread 12960!
“这是一个出现在SkyrimSE.exe的0x7FF71D20D9BD处,线程12960上的未处理异常。”
什么意思?看不懂,直接跳过,当然如果你是能够读取并且了解你计算机的每个程序每个地址每个线程上是什么的超级赛博人,请直接关闭该贴并私信我如何机械飞升。
第二部分不用看,直接跳过第三部分先看第四部分:
Probable callstack
{
[0] 0x7FF71D20D9BD (SkyrimSE.exe+D4D9BD) BSTriShape::unk_D4D760+25D
[1] 0x7FF71D20D465 (SkyrimSE.exe+D4D465) BSTriShape::unk_D4D360+105
[2] 0x7FF71D20DFE2 (SkyrimSE.exe+D4DFE2) unk_D4DFA0+42
[3] 0x7FF71D20DED8 (SkyrimSE.exe+D4DED8) NiNode::unk_D4DE90+48
[4] 0x7FF71D20DF53 (SkyrimSE.exe+D4DF53) NiNode::unk_D4DE90+C3
[5] 0x7FF71D20D2F0 (SkyrimSE.exe+D4D2F0) NiNode::unk_D4D2A0+50
[6] 0x7FF71C6878BF (SkyrimSE.exe+1C78BF) unk_1C6F90+92F
[7] 0x7FFE69F7B644 (CopyCharacterAppearance.dll+B644)
[8] 0x8802F300
[9] 0xFFFFFFFF
[10] 0xB9F2335B4D00
[11] 0x2787B31B700
[12] 0xBF800000
[13] 0xFFFFFFFFFFFFFFFE
[14] 0xBF800000
}
我们看到了一个dll文件出现了,一般到这步就十有八九稳了(SkyrimSE.exe相关的不用管,原因和刚刚讲第一部分的一样)。
"CopyCharacterAppearance.dll",带有这个dll文件的模组就是我们的重点关注对象,基本上十有八九都是他了,从dll文件的名字我们可以看出这是一个和角色外观有关的文件。
然后我们在看第二部分来进行辅助确认:
Possible relevant objects (21)
{
[ 23] BSTriShape(Name: `FeetB`)
[ 24] BSTriShape(Name: `BaseShapeB`)
[ 28] NiNode(Name: `NPC Spine [Spn0]`)
[ 36] NiNode(Name: `Scene Root`)
[ 47] NiNode(Name: `NPC Root [Root]`)
[ 52] NiNode(Name: `Scene Root`)
[ 85] TESNPC(Name: `???????????????`, FormId: FF004D38)
[ 85] Character(FormId: 000D3C13, File: `Skyrim.esm`, BaseForm: TESNPC(Name: `???????????????`, FormId: FF004D38))
[ 87] NiNode(Name: `Scene Root`)
[ 90] BSFadeNode(Name: ` (000214EA)[0]/ (000214EB) [60%]`)
[ 102] NiNode(Name: `CME Spine2 [Spn2]`)
[ 104] NiNode(Name: `bootsm_0.nif`)
[ 114] NiNode(Name: `CME Spine1 [Spn1]`)
[ 120] NiNode(Name: `NPC Spine1 [Spn1]`)
[ 138] NiNode(Name: `CME UBody [UBody]`)
[ 144] NiNode(Name: `CME Body [Body]`)
[ 150] NiNode(Name: `NPC COM [COM ]`)
[ 156] BSFlattenedBoneTree(Name: `NPC Root [Root]`)
[ 162] NiNode(Name: `CME Camera3rd [Cam3]`)
[ 176] BSFadeNode(Name: `skeleton.nif`, Owner: `Character(FormId: 000D3C13, File: `Skyrim.esm`, BaseForm: TESNPC(Name: `???????????????`, FormId: FF004D38))`)
[ 340] TESRace(Name: NordRace `?????????`, FormId: 00013746, File: `Aetherius.esp <- Unofficial Skyrim Special Edition Patch.esp <- Update.esm <- Skyrim.esm`)
}
从日志中提供的可能相关的对象信息,我们可以看到,异常可能与以下对象有关:
BSTriShape 对象:BSTriShape 是一个用于表示游戏中三角形网格的对象。三角形网格(TriShape)是游戏中物体、角色和场景的基本构成元素,它们构成了游戏中的 3D 模型。
NiNode 对象:NiNode 是游戏引擎中的节点对象,用于组织和管理场景中的 3D 对象。NiNode 可以有子节点,这样就形成了一个场景的层次结构。NiNode 对象可以表示游戏中的骨骼、物体、角色等各种元素。
TESNPC 对象:TESNPC(The Elder Scrolls Non-Player Character)对象表示游戏中的非玩家角色(NPC)。这些角色可能是敌人、友军、商人等,它们有自己的 AI,在游戏世界中与玩家互动。
Character 对象:Character 对象是游戏中角色的基类,包括玩家角色和非玩家角色(NPC)。它包含了角色的基本属性(如生命值、魔法值等)、技能、状态等信息。
BSFadeNode 对象:BSFadeNode 是一个特殊的场景图节点,它包含了一些额外的功能,如逐渐消失(Fade)的效果。在游戏中,BSFadeNode 被用于控制物体和角色的可视化效果。
TESRace 对象:TESRace 对象表示游戏中的种族信息,如 Nord、Imperial、Argonian 等。
可以看到这些信息基本上都与第四部分的得到的信息吻合,基本上就可以确定是带“CopyCharacterAppearance.dll”的模组出的问题。
日志2——来源我自己:
Unhandled native exception occurred at 0x7FF9565DD7F0 (UnequipQuiverSE.dll+D7F0) on thread 15972!
FrameworkName: NetScriptFramework
FrameworkVersion: 15
FrameworkArchitecture: x64
GameLibrary: SkyrimSE
GameLibraryVersion: 18
ApplicationName: SkyrimSE.exe
ApplicationVersion: 1.5.97.0
VersionInfo: Successfully loaded
Time: 05 Jun 2023 19:49:21.124
Possible relevant objects (6)
{
[ 1] TESNPC(Name: `??????????????????`, FormId: FF0025EC)
[ 1] Character(FormId: FF0025EB, BaseForm: TESNPC(Name: `??????????????????`, FormId: FF0025EC))
[ 20] TESObjectCELL(Name: FortAmolExterior, FormId: 00009664, File: `Occlusion.esp <- SynthesisPatch.esp <- ELFX - Exteriors.esp <- Treescale.esm <- Landscape and Water Fixes.esp <- Unofficial Skyrim Special Edition Patch.esp <- Update.esm <- Skyrim.esm`)
[ 46] BSFadeNode(Name: `skeleton.nif`, Owner: `Character(FormId: FF0025EB, BaseForm: TESNPC(Name: `??????????????????`, FormId: FF0025EC))`)
[ 104] BSFadeNode(Name: `Campfire01Burning`, Owner: `TESObjectREFR(FormId: B107E110, File: `DynDOLOD.esp`, BaseForm: BGSMovableStatic(FormId: 1C007F8E, File: `DynDOLOD.esm`))`)
[ 121] TESObjectCELL(Name: ??????, FormId: FF000B8B)
}
Probable callstack
{
[0] 0x7FF9565DD7F0 (UnequipQuiverSE.dll+D7F0)
[1] 0x2D9E5F75740
[2] 0x2D883DF8210
[3] 0x2DB88EC7D00
[4] 0x7FF654F8FDE0 (SkyrimSE.exe+1EBFDE0)
[5] 0x7FF654F8FE28 (SkyrimSE.exe+1EBFE28)
}
老样子,先看第一部分:
Unhandled native exception occurred at 0x7FF9565DD7F0 (UnequipQuiverSE.dll+D7F0) on thread 15972!
“这是一个出现在UnequipQuiverSE.dll处,线程15972上的未处理异常。”直接锁定“UnequipQuiverSE.dll”,对应模组“Unequip Quiver SE”,后面全部不用看,结束。
日志3——来源某裔:
Unhandled native exception occurred at 0x7FF68A13A5F3 (SkyrimSE.exe+C2A5F3) on thread 2092!
FrameworkName: NetScriptFramework
FrameworkVersion: 15
FrameworkArchitecture: x64
GameLibrary: SkyrimSE
GameLibraryVersion: 18
ApplicationName: SkyrimSE.exe
ApplicationVersion: 1.5.97.0
VersionInfo: Successfully loaded
Time: 04 Jun 2023 17:34:58.857
Possible relevant objects (2)
{
[ 388] TESNPC(Name: Erith, FormId: 000133AB, File: RSChildren.esp <- HearthFires.esm <- Skyrim.esm)
[ 388] Character(FormId: 000199B4, File: HearthFires.esm <- Skyrim.esm, BaseForm: TESNPC(Name: Erith, FormId: 000133AB, File: RSChildren.esp <- HearthFires.esm <- Skyrim.esm))
}
Probable callstack
{
[0] 0x7FF68A13A5F3 (SkyrimSE.exe+C2A5F3) unk_C2A590+63
[1] 0x7FF68A138C64 (SkyrimSE.exe+C28C64) BSFixedString::Initialize_C28BF0+74
[2] 0x7FF68A01746F (SkyrimSE.exe+B0746F) hkbCharacterStringData::unk_B06FC0+4AF
[3] 0x7FF68A016702 (SkyrimSE.exe+B06702) unk_B06670+92
[4] 0x7FFED1D20D0F (DynamicAnimationReplacer.dll+10D0F)
[5] 0x2550F66AAA0
[6] 0x257E6465028
[7] 0x2568A6732B0
[8] 0x25792049230
[9] 0xCD00AFED20
[10] 0x2552EEBB0A0
[11] 0x2552DDB2C40
[12] 0xFFFFFFFFFFFFFFFF
[13] 0x3F9A
[14] 0x25792049230
}
老样子,第一部分看不懂,跳到第四部分
找到了DAR的dll(DynamicAnimationReplacer.dll)
看第三部分的信息,发现了Erith这个被RSchild修改的小孩,盲猜是dar的某个动作用在了不该用的小孩身上发生了闪退,因此后续的排查主要是尝试在Erith身上尝试能否重复闪退。
因此我们应该向两方面查找:1修改小孩的模组,比如和RSchild相关的模组。2DAR相关的动作模组,尤其是修改小孩动作的。
日志4——来源我:
Unhandled native exception occurred at 0x7FF779BB23D5 (SkyrimSE.exe+13223D5) on thread 1640!
FrameworkName: NetScriptFramework
FrameworkVersion: 15
FrameworkArchitecture: x64
GameLibrary: SkyrimSE
GameLibraryVersion: 18
ApplicationName: SkyrimSE.exe
ApplicationVersion: 1.5.97.0
VersionInfo: Successfully loaded
Time: 04 Jun 2023 11:50:36.841
Possible relevant objects (5)
{
[ 14] BSTriShape(Name: `MaleGlovesGlow`)
[ 18] NiNode(Name: ` (1003D787)[0]/ (1003D788) [50%]`)
[ 26] BSFadeNode(Name: `skeleton.nif`, Owner: `Character(FormId: 100F8202, File: `Vigilant.esm`, BaseForm: TESNPC(Name: `???????????????????????`, FormId: 1003D78A, File: `Vigilant Voiced.esp <- Vigilant.esm`))`)
[ 38] TESNPC(Name: `???????????????????????`, FormId: 1003D78A, File: `Vigilant Voiced.esp <- Vigilant.esm`)
[ 38] Character(FormId: 100F8202, File: `Vigilant.esm`, BaseForm: TESNPC(Name: `???????????????????????`, FormId: 1003D78A, File: `Vigilant Voiced.esp <- Vigilant.esm`))
}
Probable callstack
{
[0] 0x7FF779BB23D5 (SkyrimSE.exe+13223D5) BSEffectShaderPropertyFloatController::Update_13222E0+F5
[1] 0x7FF7794F798F (SkyrimSE.exe+C6798F) unk_C67960+2F
[2] 0x7FF779501417 (SkyrimSE.exe+C71417) BSGeometry::UpdateDownwardPass_C713D0+47
[3] 0x7FF7794E8602 (SkyrimSE.exe+C58602) NiNode::UpdateDownwardPass_C584C0+142
[4] 0x7FF7794E8602 (SkyrimSE.exe+C58602) NiNode::UpdateDownwardPass_C584C0+142
[5] 0x7FF778E99A76 (SkyrimSE.exe+609A76) Character::unk_609A10+66
[6] 0x7FF778E6A037 (SkyrimSE.exe+5DA037) Character::unk_5DA020+17
[7] 0x7FF778F6CAF4 (SkyrimSE.exe+6DCAF4) unk_6DC9A0+154
[8] 0x7FF778F71684 (SkyrimSE.exe+6E1684) ProcessActorAnimSG_6E1670+14
[9] 0x7FF7794C2A81 (SkyrimSE.exe+C32A81) JobList::Process_C329B0+D1
[10] 0x7FF7794C4C48 (SkyrimSE.exe+C34C48) BSJobs::JobThread::Func1_C34930+318
[11] 0x7FF77949D6BD (SkyrimSE.exe+C0D6BD) StartAddress_0_C0D680+3D
[12] 0x7FFACBB77614 (KERNEL32.DLL+17614)
[13] 0x7FFACC0E26A1 (ntdll.dll+526A1)
}
先看第一部分,看不懂,跳过。
第四部分,发现了 KERNEL32.DLL和ntdll.dll。但实际上这两个是你电脑自带的dll文件非模组文件,因此排除。
看第三部分,发现了警戒者,Vigilant Voiced.esp,Vigilant.esm。我首先检查我的Vigilant和Vigilant Voiced是最新版本,并且在评论区并未发现相关报错。于是我打开了游戏,又在相同地点产生了闪退,正是一个NPC(对应FormID:1003D78A)角色刷新出来的时候(就是在白金塔守着阿莱西亚的那个莫拉格巴尔手下)闪退了,是固定闪退。
打开了SSEdit,找到1003D78A,发现并未被其他esp修改
因此不是插件的问题,应该检查非插件模组,于是我找到了警戒者的HIMBO改装,发现我是旧版本,存在这个闪退问题,更新了新版本,刷新bs,问题解决。
日志5——来源我:
Unhandled native exception occurred at 0x7FF779A3DDDA (SkyrimSE.exe+D6DDDA) on thread 22896!
FrameworkName: NetScriptFramework
FrameworkVersion: 15
FrameworkArchitecture: x64
GameLibrary: SkyrimSE
GameLibraryVersion: 18
ApplicationName: SkyrimSE.exe
ApplicationVersion: 1.5.97.0
VersionInfo: Successfully loaded
Time: 15 May 2023 17:07:58.303
Possible relevant objects (5)
{
[ 206] BSLightingShaderProperty(Name: null)
[ 319] TESNPC(Name: `?????????`, FormId: FF0008A7)
[ 319] Character(FormId: 0401A566, File: `Dragonborn.esm`, BaseForm: TESNPC(Name: `?????????`, FormId: FF0008A7))
[ 358] NiNode(Name: `sprigganburnt`)
[ 424] BSLeafAnimNode(Name: `TundraDriftWood01`)
}
Probable callstack
{
[0] 0x7FF779A3DDDA (SkyrimSE.exe+D6DDDA) unk_D6DD70+6A
[1] 0x7FF779FF83B5 (SkyrimSE.exe+13283B5) unk_1328370+45
[2] 0x7FF779938CEF (SkyrimSE.exe+C68CEF) unk_C68BA0+14F
[3] 0x7FF779A0A58E (SkyrimSE.exe+D3A58E) unk_D3A4D0+BE
[4] 0x7FF7791EE646 (SkyrimSE.exe+51E646) unk_51E440+206
[5] 0x7FF779A09445 (SkyrimSE.exe+D39445) unk_D392B0+195
[6] 0x7FF779F65D93 (SkyrimSE.exe+1295D93) unk_1295C30+163
[7] 0x7FF779FB53DE (SkyrimSE.exe+12E53DE) BSShaderTextureSet::SetTexture_12E5390+4E
[8] 0x7FF779F9F537 (SkyrimSE.exe+12CF537) BSLightingShaderMaterialBase::OnLoadTextureSet_12CF480+B7
[9] 0x7FF779FA128A (SkyrimSE.exe+12D128A) BSLightingShaderMaterialGlowmap::OnLoadTextureSet_12D1250+3A
[10] 0x7FF779F94E76 (SkyrimSE.exe+12C4E76) BSLightingShaderProperty::unk_12C4CC0+1B6
[11] 0x7FF77992BD71 (SkyrimSE.exe+C5BD71) NiStream::Func15_C5BA80+2F1
[12] 0x7FF779929FBE (SkyrimSE.exe+C59FBE) NiStream::Func1_C59F90+2E
[13] 0x7FF779A069D8 (SkyrimSE.exe+D369D8) BSStream::unk_D36950+88
[14] 0x7FF7799FE949 (SkyrimSE.exe+D2E949) unk_D2E880+C9
[15] 0x7FF778DD35B1 (SkyrimSE.exe+1035B1) unk_1033E0+1D1
[16] 0x7FF778E8A12F (SkyrimSE.exe+1BA12F) unk_1BA000+12F
[17] 0x7FF779A00240 (SkyrimSE.exe+D30240) unk_D300F0+150
[18] 0x7FF779A00D10 (SkyrimSE.exe+D30D10) BSResource::EntryDB<BSModelDB::DBTraits>::Func3_D30CE0+30
[19] 0x7FF779913EBE (SkyrimSE.exe+C43EBE) BSResource__EntryDB_gs_T1_ge_::unk_C43E70+4E
[20] 0x7FF7799FD69D (SkyrimSE.exe+D2D69D) IOManager::Func21_D2D630+6D
[21] 0x7FF7799FA361 (SkyrimSE.exe+D2A361) BSTaskManagerThread::Func1_D2A220+141
[22] 0x7FF7798DD6BD (SkyrimSE.exe+C0D6BD) StartAddress_0_C0D680+3D
[23] 0x7FFB9E717614 (KERNEL32.DLL+17614)
[24] 0x7FFB9F5626A1 (ntdll.dll+526A1)
}
第一部分日常看不懂,第四部分没有太多有用信息但是从中可以看出大概是画质模组出了问题。
看第三部分,发现了“FormID:0401A566”和“sprigganburnt”,0401A566是灰烬魔,sprigganburnt是烈焰树精。我这个闪退是在索瑟海姆出鸦石镇的固定闪退,那里会刷新灰烬魔和烈焰树精。首先我没有任何修改灰烬魔的模组,因此排除灰烬魔。然后我取消掉了第四未知的树精材质模组,ctd修复,看了原模组评论区,是半大小材质的问题。
总结:
日志能够为我们提供很多排查方向,但它有时并不能为我们直接指出问题所在,甚至部分情况无法为我们提供一些有用信息。但是能够启发我们根据日志信息查找修改该内容的相关模组并且能达到很高的正确率。
将日志分为四部分,第一部分能够帮你直接找到问题所在,第四部分能够帮你定位出问题的dll从而定位模组,第三部分可以进一步帮你找到是哪个对象出了问题进而辅助你找到排查方向。
但是,报错日志能让你知道你哪里产生闪退,但并不能完全让你了解为什么闪退
一家之言,欢迎各位大佬指正。
打赏点口水钱,买瓶斯库玛解渴