Skip to content

P2 Startup 挂起源就绪屏障 v1 方案

E4 修正依据

  • iOS 17 挂起启动屏障证明 SIGCONT 可恢复同一 PID,但 marker begin 仍早于 CoreProfile 最早真实 KDebug 记录约 172 ms;start ack 不等于数据窗口已打开。
  • 目标进程在 CoreProfile 启动前已挂起存在,因此首 chunk 的 trace header 可直接提供目标 PID/TID 归属,不再需要“运行后动态发现”的 0x07000000 / 0x25010000 订阅。

最终屏障时序

text
launch target suspended, obtain PID
→ CoreProfile setConfig/start/ack
→ single consumer receives and persists first non-empty trace chunk
→ validate timebase and confirm target PID exists in trace header
→ SIGCONT same PID
→ persist launch.requested.raw at resume boundary

Startup 过滤集收窄为 decoder 的 4 组阶段事件:

text
startupSuspendedFilters = {
  0x1F070000, 0x2BDC0000, 0x2B870000, 0x31CA0000
}

公式与质量门禁

text
preResumeSourceReady = firstChunk.byteLength > 0
                       AND firstChunk.timeConfig.numer > 0
                       AND firstChunk.timeConfig.denom > 0
                       AND traceHeader.threadPidMap contains suspendedPID

resumeAllowed = targetSuspended AND preResumeSourceReady
filterSetExact = actualKdebugFilters == startupSuspendedFilters
  • launchBarrierMode=process-control-suspended-source-ready-v1
  • 首 chunk 先写入 immutable Session,再恢复进程;launch.requested.raw 仍以 resume 边界计时。
  • trace header 不含挂起 PID、首 chunk 空、timebase 缺失、resume 失败均 fail closed,指标保持 null/—
  • 不改包、不注入、不增加第二 DTX socket。

验收

  1. E2:锁定 suspended PID → first chunk 写盘 → resume → launch envelope 顺序,并锁定 4 组过滤集。
  2. E4:iOS 17/18 各执行 control、willFinish 300 ms、didFinish 300 ms 单轮,要求 identity verified、drop=0、marker 完整且窗口内。
  3. 单轮通过后再进入 3×3;未通过前正式 mapping 仍为 0。

回滚

恢复 process-control-suspended-v1 ack 屏障或 v12 的非挂起首 chunk 屏障;历史 Session 不回写。

Perfowl · Performance Observer