2026-06-11 06:31:40

问题和回答¶

错误追踪能否检测其本身产生的错误?¶

当然不可以。

如果该mod运行出现了问题,可以直接在b站或steam评论区向老王反馈。

错误追踪无法检测的bug有哪些?¶

1. 逻辑问题¶

由于算法、数值设计中的失误导致的,游戏不发生崩溃,但并未按照程序员的意愿运行的一类bug,具体范例见下。

-- scripts/prefabs/myweapon.lua

-- 想做一把伤害为34的武器,但不小心在代码中写成了99999

inst.components.weapon:SetDamage(99999)

错误追踪只在游戏崩溃时做检测!

2. 储存错误的参数¶

mod向游戏提交错误的参数(包括类型错误和值错误)引发的崩溃,具体范例见下。

-- scripts/prefabs/myweapon.lua

-- [类型错误] 将一个本应是函数的键值设置为数字

-- 设置时,程序不做类型检查,因此不报错

-- 一旦调用 inst.components.equippable:Equip() ,因为数字不是 callable 导致崩溃

inst.components.equippable:SetOnEquip(0)

-- scripts/prefabs/mybox.lua

-- [值错误] 传入一些非法的值

-- 设置时程序不检查,调用时才崩溃

-- 本例中,由于设置的容器界面不存在导致报错,该错误只会定位在游戏本体

inst.components.container:WidgetSetup("lw-day-day-write-bug")

这类错误目前我还没想到比较好的解决方案...

3. 强制覆盖源文件¶

一些mod会直接复制一份游戏源文件作出修改,这很容易引发错误!

-- scripts/components/health.lua

-- 由于mod文件加载优先级高于游戏本体,当游戏需要加载血量组件时,会使用本文件

-- 一旦有其他地方调用组件类方法,就会报空值错误

return Class(function(self, inst) self.inst = inst end)

强制覆盖源文件是非常糟糕的操作,会严重影响mod的兼容性和稳定性。

错误追踪能检测mod是否有覆盖操作并给出警告。如果某些报错定位到游戏本体,你可以试着关闭一些有覆盖警告的mod。

4. 移除组件¶

一些mod会错误的移除关键组件,移除过程本身不报错,但如果再次尝试调用这个不存在的组件就会发生崩溃。

一个典型例子是 Loot pump(传送泵)和晓美焰的冲突,由于传送泵会强制移除晓美焰手雷的「投掷」组件,导致拿起手雷的瞬间报错,且错误定位在晓美焰mod内部。

(我已经反馈这个问题了但是作者一直不修)

5. c++底层错误¶

这类错误往往会导致游戏直接闪退

-- modmain.lua

-- 假设同时加载的两个动画文件 apple 和 peach 共用一个材质名 fruit,游戏进程会直接结束,任何mod包括错误追踪当然无法运行

-- log文件中仍可见c++输出的报错信息

Assets = {

Asset("ANIM", "anim/apple.zip"), -- bank: apple, build: fruit

Asset("ANIM", "anim/peach.zip"), -- bank: peach, build: fruit

}

-- in console

-- 另一个典型的例子是在控制台输入:

print(string.rep("A", 100000))

-- 然后按 ctrl+L 打开调试日志界面

-- 由于超出游戏的文本渲染字数上限,直接闪退了