ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

madeira-jit.js脚本逐行解析:如何读懂 Madeira iOS Windows 游戏模拟器的信号转发、故障处理与日志预算管理完整指南

madeira-jit.js脚本逐行解析:如何读懂 Madeira iOS Windows 游戏模拟器的信号转发、故障处理与日志预算管理完整指南 madeira-jit.js脚本逐行解析如何读懂 Madeira iOS Windows 游戏模拟器的信号转发、故障处理与日志预算管理完整指南【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/MadeiraMadeira是一个在越狱 iOS 上通过 FEX-Emu Wine DXMT 运行 x86-64 Windows PC 游戏的模拟器项目而 madeira-jit.js 就是它运行在 StikDebug 中的核心 JIT 调试脚本仅 330 行却同时管好信号转发、故障处理与日志预算管理三件生死攸关的事。本文按代码顺序逐行拆解带你看懂每个分支背后的设计原因。 这个脚本在项目中扮演什么角色iOS 不允许普通 App 动态生成可执行代码JITMadeira 的思路是借用调试器权限层App 通过 URL scheme 打开 StikDebug、让它附着到自身进程入口见 StikJITHelper.swift 的enableJIT随后执行madeira-jit.js。之后 Wine 每段需要执行的 x86 翻译代码都通过BRK #0xf00d断点请求调试器准备一段可执行内存脚本用 GDB 远程协议命令c继续、m读内存、P写寄存器完成应答。三大职责一句话说明 信号转发把内核借道调试器投递的软信号原样转给进程 故障处理把真正的访存/指令错误映射成 Unix 信号交还 Wine 处理 日志预算管理日志输出硬性封顶防止 iOS 看门狗杀掉调试器 第 1 部分内联转换工具与附着L18–L50脚本前 30 行是四个小工具函数理解它们是读懂后面主循环的前提函数作用littleEndianHexStringToNumber8 字节小端十六进制串 →BigInt64 位寄存器值numberToLittleEndianHexString反向转换写寄存器时用littleEndianHexToU324 字节小端串 → 32 位指令字extractBrkImmediate从 BRK 编码提取 16 位立即数(u32 5) 0xFFFF然后是启动三连L47–L50get_pid()拿到目标进程号 →vAttach;pid十六进制附着 → 记录日志。至此调试器与目标进程建立会话脚本进入常驻响应模式。 第 2 部分只处理 BRK其余全部放行L52–L76这是整段注释最血泪的部分。v2 版本曾对每一次信号和故障停都走完整协议往返Wine 又频繁发线程挂起信号结果60 秒内烧掉 27 秒 CPUiOS 用 scene-update 看门狗0x8BADF00D直接杀掉了 StikDebug——游戏当场消失、日志全空就是用户反复遇到的秒退现象。修复方案是两个尽力而为的包L70–L75QSetIgnoredExceptions:EXC_BAD_ACCESS;EXC_BAD_INSTRUCTION—— 让调试器停止拦截这两类 Mach 异常直接落到 Wine 自己注册的线程级处理器上QPassSignals:1;2;…—— 信号 1–31 投递给进程时不再暂停。注意SIGTRAP5被刻意排除BRK 正是借它送达的那是脚本的本分。两个包在旧版 stub 上会静默失败脚本自动回退到下方完整的处理路径兼容性无损。 第 3 部分日志预算管理L78–L92let logBudget 40; function ulog(msg) { if (logBudget 0) { logBudget--; log(msg); } }这就是日志预算管理的核心L87–L88每一行log()都会驱动一次 SwiftUI 界面刷新而刷新卡顿正是看门狗击杀调试器的元凶。所以主循环内一律用ulog()总预算 40 行配合各自的节流阀软信号只在前 8 次 每 500 次打一条L149故障只打前 16 次L199。同一段还定义了会话状态detached会话结束标志、pending已发 continue 但已返回的停包避免重复等待、lastFaultKey/faultRepeats故障去重计数。looksLikeStop()用正则/^[TSWX]/识别停包与退出包L90–L92。 第 4 部分主循环与软信号转发L109–L161主循环每轮取停包pending优先否则发c然后按序解析寄存器号是两位十六进制前缀00→x0、01→x1、10(16)→x16、20(32)→PCW/X开头→ 目标进程退出记日志、结束会话L114–L118解析出tid、pc解析失败就裸继续不死磕L120–L128metype 5EXC_SOFT_SIGNAL是转发分支L147–L161内核把 Unix 信号pthread_kill、Wine 的挂起信号等借调试器路由过来。它不是故障脚本只把medata[1]里的原始 signo 原样转发绝不计重复、绝不 detach。v1 曾把它们误投成 SIGSEGV结果在 Wine 启动期重试循环里直接 detach酿成 ml345 事故的源头forwardSignal()实现转发L96–L107优先vCont;Csig:tid;c带信号继续不支持就退回裸Csig成功则把返回的停包存入pending供下轮消化。 第 5 部分故障处理——Mach 异常到 Unix 信号的映射L163–L226停包不是软信号时脚本先用mpc,4读出 PC 处的 4 字节指令掩码0xFFE0001F后与0xD4200000比较判断是否 BRKL163–L167。非 BRK 真实故障处理铁律只有一条永远不跳过。老版本无脑 PC4曾把真实崩溃逐指令跳过、顺带清零 x0静默损坏线程ml344 甚至一路 4000 次故障走进共享缓存数据区才暴雷。正确的做法是把故障映射回 Unix 信号让 Wine 的 sigaction 处理器体面地处理L193–L197metypeMach 异常映射信号1EXC_BAD_ACCESSkcode1 非法地址SIGSEGV (11)1EXC_BAD_ACCESSPROT 保护错误SIGBUS (10)2EXC_BAD_INSTRUCTIONSIGILL (4)3EXC_ARITHMETICSIGFPE (8)6EXC_BREAKPOINT非 BRK 的SIGTRAP (5)其他默认SIGSEGV (11)两个特例值得单独记住EXC_RESOURCEmetype 11jetsam 内存高水位只是任务级建议不是线程故障。旧默认行为给无辜线程注入 SIGSEGV在错误时刻崩掉它现在只记录限额kcode 0x1fffMB并静默恢复L185–L191重复守卫L211–L217同一tid:pc故障连续 8 次仍无法投递 → 发k杀掉进程。注意注释里强调永远不在此处 detachdetach 后任务异常端口仍注册但无人服务后续每个故障都会把线程永久挂起ml345 正是这样冻死了 steam.exe 主线程。用脚本自己的话讲可见的死亡优于挂起的线程。 第 6 部分BRK #0xf00d 协议与 x16 命令分发L228–L330走到这里说明是真正的 BRK进入协议路径PC 先加 4 写回L235–L236保证 BRK 不会二次触发同时重置故障计数从x16 寄存器取命令号未知立即数或 x16 缺失 → 写x00告诉 App 的 SIGTRAP 回退逻辑这次被跳过了并继续L242–L246brkImm 0xf00d时按 x16 分发L257–L321x16命令脚本动作写回 x00CMD_DETACH发D分离结束会话—1CMD_PREPARE_REGIONx0 非 0 直接用否则_Msize,rx先分配可读写执行内存再prepare_memory_region(addr, size)就绪地址3CMD_MAP_PAGE_ZERO内核拒绝 App 自己映射地址 0脚本借调试器权限从 TEB 读 256 字节够覆盖 0x60 处的 PEB 指针用M写入地址 0 对应偏移1成功 / 0失败最后保留一条brkImm 0x69的旧协议兼容路径L323–L330x0 非 0 时直接prepare_memory_region(x0, x0)保持对早期 FEX 桥接的向后兼容。 三个值得借鉴的工程决策防御纵深优于单点修复QSetIgnoredExceptions/QPassSignals是新捷径老路径完整保留新旧 stub 通吃每条注释都是事故复盘ml344/345/355/359把为什么写在代码旁边比任何文档都快可见失败优于静默挂起宁可k掉进程留下日志也不让线程悄悄 park——调试体验的底线是死得明白。 相关文件索引脚本本体app/Madeira/madeira-jit.jsStikJIT 启用与 CS_DEBUGGED 轮询app/Madeira/StikJITHelper.swift构建指南docs/BUILDING.md项目总览README.md【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表