MyCard“编辑”入口导致 KoishiPro 闪退:问题说明与临时处理
问题发生于 2026 年 9 月 6 日。环境为 macOS 26.6.2、Apple Silicon 原生 ARM64,客户端为 MyCard 内安装的 KoishiPro Mesmerizer。
一、现象与复现条件
点击 MyCard 的“编辑”按钮后,KoishiPro 在启动约 2.66 秒后退出。同一份游戏程序通过普通入口启动,再手动进入卡组编辑器,可以正常使用。
MyCard 的 macOS 卡组编辑动作使用“-d”参数直接打开编辑器。本次安装同时存在根目录 lflist.conf 与 expansions/lflist.conf;二者各包含 102 张禁限表,规则内容完全一致,仅扩展副本末尾多一个换行。
可用于定位的原始崩溃记录:ygopro-2026-09-06-220857.ips。记录显示游戏于 22:08:19.365 启动、22:08:22.028 崩溃;退出的是由 MyCard Helper 启动的 ygopro 子进程。主线程异常为 EXC_BAD_ACCESS / SIGSEGV,首帧位于 ygopro 的偏移 0x529a4。已核对安装程序的 ARM64 UUID 与该报告一致。
二、原因定位
崩溃位置是绘制卡片缩略图后、查询该卡禁限数量的步骤。反汇编显示程序读取禁限表哈希桶时使用了无效地址;当时查询的官方卡号为 43096270(紫翠玉龙)。该卡号只是触发当帧查询的数据,没有证据表明这张卡本身有问题。
KoishiPro 官方源码中存在以下启动顺序:
- 初始化时先读取根目录禁限表。
- 处理“-d”参数时,立即打开编辑器;编辑器保存当前禁限表对象的地址。
- 随后进入 MainLoop,才读取扩展目录。
- expansions/lflist.conf 中的列表被插入禁限表 vector,先前保存的对象地址因此失效。
- RefreshLFList 只刷新下拉框,没有重新绑定编辑器持有的禁限表指针。之后绘制禁限标志时访问旧地址,触发崩溃。
普通启动先完成扩展加载,再由用户进入编辑器,因此取得的是加载完成后的有效地址。这与本次“快捷编辑闪退、普通启动正常”的实际差异一致。
源码依据为官方仓库 purerosefallen/ygopro 的固定提交 a681a2004decfd3e87801c8d7e55d39634966333。相关函数参数和绘制逻辑与本机反汇编匹配;未取得安装包对应的完整构建记录,因此不将该提交宣称为安装包的精确构建源码。
三、本次实际处理与验证
本次采用的是可逆的配置处理:确认两份禁限表仅末尾换行不同后,将重复的 expansions/lflist.conf 移到扩展扫描路径之外,保留根目录 lflist.conf。没有修改游戏二进制,也没有修复或重新编译游戏源码。补丁脚本应默认只检查;两份文件的规则内容不同时拒绝处理,避免移走有效的独立规则。
当时扩展扫描路径中没有其他包含禁限表的 ZIP/YPK 包,默认仅扫描 expansions;配置选择的是第 0 张禁限表,根目录与扩展副本的首表均为 2026.7。移开重复副本后,规则仍由根目录文件提供,并消除了本次启动时再次插入重复列表的触发条件。
处理后已连续两次通过 MyCard 的实际“编辑”按钮成功打开编辑器;原崩溃中出现的紫翠玉龙也已完成正常查卡验证。
四、适用边界与上游修复方向
这是针对当前安装内容的临时处理,尚未消除程序中的启动顺序缺陷。后续自动更新如果重新生成 expansions/lflist.conf,或新增其他扩展路径、包含禁限表的 ZIP/YPK 包,问题仍可能复发。规则内容不相同的扩展禁限表不能直接按此方法移除。
上游修复应让扩展加载先于快捷编辑器初始化,或在禁限表容器发生改变后安全地重新绑定编辑器指针;同时验证“-d”启动、普通启动、多个扩展表以及压缩包内禁限表等入口。恢复本次移开的副本后,原触发条件也会恢复。
公开源码链接:
https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/game.cpp#L1113