Skip to content

调试技巧

前言

错误与异常讲了怎么报错。这一篇更进一步:当程序不报错、但行为不对时,怎么把它揪出来。

教程依赖

本教程假设您已完成入门教程,并读过错误与异常

第一件事:用调试模式启动

调试模式是排错的利器。以命令行参数 -debug 启动 Emuera:

Emuera1824.exe -debug

它提供普通模式没有的能力,详见调试模式

调试窗口能做什么

调试模式下可以打开调试窗口(快捷键 Ctrl+D,或用调试命令 @DEBUG),其中有:

  • 变量监视:查看当前所有变量的值。程序“算出个奇怪结果”时,第一时间来看这里;
  • 堆栈追踪:看当前调用到了哪个函数、是从哪里调进来的。递归或层层调用出问题时尤其有用;
  • 调试控制台:直接输入并执行任意 ERB 代码,边试边看结果。

在调试控制台里,你可以随时输入变量名查看它的值:

@ FLAG:0
@ NAME:0

@ 后面的空格不是必须的。注意,会改变执行流程或需要输入的指令(如 IFINPUT)在调试命令里不能使用。

调试命令

在游戏运行中,输入以 @ 开头的文本就会被当作调试命令立即执行,比如临时给自己加钱:

@MONEY = 99999

完整清单见调试命令

日志与断言

  • 日志:出错或行为异常时,先看根目录的 emuera.log,里面有文件名、行号等细节;

  • ASSERT:把“本来不该发生”的前提写下来。一旦不成立,立刻停下并报错,比让错误悄悄传下去好定位得多:

    erb
    ASSERT BASE:0:0 >= 0
  • THROW:主动抛出带说明的错误,方便在关键分支确认“到底走到哪了”;

  • ;#;:只在调试模式下执行的行。可以把临时调试代码留在脚本里,正式运行时自动失效。

只想看某段代码执行没有?

用调试输出,把信息打到调试控制台,不干扰游戏画面:

erb
;#;DEBUGPRINTFORML 进入分支 A,MONEY = {MONEY}

DEBUGPRINT 系只在调试模式下输出,且不受 SKIPDISP 影响。

定位技巧

二分法

当不确定问题出在哪一段时,在中间插一个 THROW 到这里了 或调试输出,看它是否执行到;据此把范围切一半,重复几次就能锁定。

最小复现

把出问题的功能单独抽出来,写成一个最小的脚本去跑。这一步往往在整理的过程中就发现了问题。

对比“正常”和“异常”的差异

把正常情况和异常情况下同一批变量的值并排打印出来,差异点通常就是原因。

几个常见的“幽灵问题”

现象可能原因
换台电脑行为不同文件读取顺序依赖文件系统,可用 読み込み順をファイル名順にソートする 固定
升级引擎后报错 / 显示错乱兼容性开关未按需设置,见兼容性
同名函数只有第一个生效Eramaker/Emuera 的既有规格,可用同名の非イベント関数が複数定義されたとき警告する发现
存档能存不能读游戏代码 / 版本不匹配,用 CHKDATA 查看原因

小结

  • 先用 -debug 启动,善用调试窗口的变量监视与堆栈;
  • 调试命令能当场查看 / 修改运行中的变量;
  • ASSERT / THROW 让问题尽早暴露;
  • 二分法 + 最小复现,是定位疑难问题的两把利器;
  • 遇到“幽灵问题”,先怀疑读取顺序与兼容性开关。

相关链接

GPL-3.0+ Licensed