console-tester 面向主机游戏移植(如 PS2 移植)的迭代测试循环,把“构建—运行—读日志—决定下一步”的过程标准化。
用途:在移植过程中反复运行游戏、读取崩溃日志、判断本次运行的结果,并给出下一步优先修复项;还能对比两次运行判断改动到底是修复、破坏,还是让游戏推进到了下一个阻塞点。
主要能力:
- run.py 执行一次或多次运行。boot 子命令搭配 --runner 与 --elf 运行,--seconds 控制时长,--expect(可重复)与 --until-expect 检测里程碑日志行,--input / --record 回放与录制手柄输入,--out(默认 console/runs)、--arg、--cwd、--keep(默认 2000 行)、--tail-chars(默认 5000 字符)、--json 控制输出。soak 子命令用 --runs 和 --seconds 重复同一启动,用于发现偶发崩溃。last 返回最近一次结果。
- 运行结果判定为四类:PASS(所有 --expect 出现,或未指定时全程无崩溃)、HANG(超时且期望行未出现)、CRASH(日志出现致命行、非零退出、信号或跳转到缺失函数后停止;运行时可能捕获异常仍返回 0,因此以日志为准)、FAIL(在期望行之前自行正常退出)。
- triage.py:scan 按 functions.csv(Ghidra 导出,列 Name,Start,End,Size,End 为开区间)把日志整理成带负责人的排序修复清单,支持 --markdown 输出;compare 对比两次日志;lookup 按地址在映射表中查找函数。
- abdiff.py:regs 与 mem 子命令对比 PCSX2 与移植端的寄存器/内存转储,打印第一处分歧。
- 文件约定:console/STATE.md 记录运行命令、构建目录、回归运行列表与每次结果;console/runs/ 下保存带 UTC 时间戳的日志、latest.log/latest.json 与 soak 汇总;console/ab/ 存放 A/B 转储。
使用方式:从 console/STATE.md 读取运行命令与构建目录(不凭记忆重建),先增量构建(如 cmake --build <build dir>),用 run.py boot 做 10–15 秒的短运行(菜单约 30 秒),加上针对当前里程碑的 --expect;读取判定与末尾 5000 字符,不打开整份日志;用 triage.py scan 处理最优先项(先致命行,再缺失函数、stub、系统调用、IOP、文件 I/O),按负责人列转交对应技能;修复后重建、重跑并用 compare 对比;在 STATE.md 记录一行。任何运行时改动后重新运行“Regression runs”中的全部里程碑命令。同一崩溃连续三次修复失败则停止猜测,重读 STATE.md、在 Ghidra 查代码并做 PCSX2 A/B 对比。
适用场景:移植版启动、引导程序、首画面、标题画面、菜单、进入游戏等阶段的可重复验证;以及用 PCSX2-MCP 调试服务器或 PCSX2 自带调试器做寄存器与内存对照定位问题。
限制与边界:soak 只是用同一脚本输入重复同一启动,不会替你玩游戏,“能玩”仍以真人试玩为准;只可用于自己拥有并从自有光盘转储的游戏,不得下载或帮助寻找 ISO、ELF、BIOS,分享修复、覆盖与回放脚本而非转储;日志与内存转储属于游戏数据需留在本机;与 Sony 无关,PlayStation 是 Sony Interactive Entertainment 的商标;测试应使用短超时、一次只运行一个、结束时结束所有进程,不带“清空以保证正确”的清理,不为让测试通过而修改 runner/*.cpp 或头文件。
输出交接:缺失函数交给 /console-reverse,stub、系统调用、IOP、文件与光盘 I/O 交给 /console-backend,GS、VU、MPEG 交给 /console-graphics,音频交给 /console-sound,记忆卡交给 /console-saves,手柄与回放脚本交给 /console-controller,覆盖交给 /console-mod,FFmpeg 等构建选项交给 /console-anywhere。