调试技巧
前言
错误与异常讲了怎么读报错。这一篇更进一步:当程序不报错、但行为不对时,怎么把它揪出来。
第一件事:用调试模式启动
调试模式是排错的利器。以命令行参数 -debug 启动 Emuera:
Emuera1824.exe -debug它提供普通模式没有的能力,详见调试模式。
调试窗口能做什么
调试模式下可以打开调试窗口(快捷键 Ctrl+D,或用调试命令 @DEBUG),其中有:
- 变量监视:查看当前所有变量的值。程序“算出个奇怪结果”时,第一时间来看这里;
- 堆栈追踪:看当前调用到了哪个函数、是从哪里调进来的。递归或层层调用出问题时尤其有用;
- 调试控制台:直接输入并执行任意 ERB 代码,边试边看结果。
在调试控制台里,你可以随时输入变量名查看它的值:
@ FLAG:0
@ NAME:0@ 后面的空格不是必须的。注意,会改变执行流程或需要输入的指令(如 IF、INPUT)在调试命令里不能使用。
调试命令
在游戏运行中,输入以 @ 开头的文本就会被当作调试命令立即执行,比如临时给自己加钱:
@MONEY = 99999完整清单见调试命令。
日志与断言
日志:出错或行为异常时,先看根目录的
emuera.log,里面有文件名、行号等细节;ASSERT:把“本来不该发生”的前提写下来。一旦不成立,立刻停下并报错,比让错误悄悄传下去好定位得多:erbASSERT BASE:0:0 >= 0THROW:主动抛出带说明的错误,方便在关键分支确认“到底走到哪了”;;#;:只在调试模式下执行的行。可以把临时调试代码留在脚本里,正式运行时自动失效。
只想看某段代码执行没有?
用调试输出,把信息打到调试控制台,不干扰游戏画面:
erb
;#;DEBUGPRINTFORML 进入分支 A,MONEY = {MONEY}DEBUGPRINT 系只在调试模式下输出,且不受 SKIPDISP 影响。
定位技巧
二分法
当不确定问题出在哪一段时,在中间插一个 THROW 到这里了 或调试输出,看它是否执行到;据此把范围切一半,重复几次就能锁定。
最小复现
把出问题的功能单独抽出来,写成一个最小的脚本去跑。这一步往往在整理的过程中就发现了问题。
对比“正常”和“异常”的差异
把正常情况和异常情况下同一批变量的值并排打印出来,差异点通常就是原因。
几个常见的“幽灵问题”
| 现象 | 可能原因 |
|---|---|
| 换台电脑行为不同 | 文件读取顺序依赖文件系统,可用 読み込み順をファイル名順にソートする 固定 |
| 升级引擎后报错 / 显示错乱 | 兼容性开关未按需设置,见兼容性 |
| 同名函数只有第一个生效 | Eramaker/Emuera 的既有规格,可用同名の非イベント関数が複数定義されたとき警告する发现 |
| 存档能存不能读 | 游戏代码 / 版本不匹配,用 CHKDATA 查看原因 |
小结
- 先用
-debug启动,善用调试窗口的变量监视与堆栈; - 调试命令能当场查看 / 修改运行中的变量;
ASSERT/THROW让问题尽早暴露;- 二分法 + 最小复现,是定位疑难问题的两把利器;
- 遇到“幽灵问题”,先怀疑读取顺序与兼容性开关。