跳转至

问题和回答

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

当然不可以。

如果该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 打开调试日志界面
-- 由于超出游戏的文本渲染字数上限,直接闪退了
回到页面顶部