iOS17(Xcode15)中CNContactViewController的UIColor越界告警调试问题
iOS 17下ContactsUI颜色告警排查指南
环境
iOS 17 (Xcode 15)
问题情况
用系统ContactsUI展示联系人时,控制台弹出如下告警:
UIColor创建时使用的组件值远超预期范围。请设置UIColorBreakForOutOfRangeColorComponents断点调试。此消息仅记录一次。
触发代码:
let contact = CNContact() let cnVC = CNContactViewController(forUnknownContact: contact) present(cnVC, animated: true)
疑问:我没有编写任何自定义颜色相关代码,该如何设置UIColorBreakForOutOfRangeColorComponents断点?怀疑问题出在ContactsUI框架内部。
更新进展
已按提示设置符号断点,运行后停在以下汇编代码处:
UIKitCore`UIColorBreakForOutOfRangeColorComponents: -> 0x103885104 <+0>: sub sp, sp, #0x40 0x103885108 <+4>: stp x29, x30, [sp, #0x30] 0x10388510c <+8>: add x29, sp, #0x30 0x103885110 <+12>: adrp x8, 4606 0x103885114 <+16>: ldr x8, [x8, #0xaf8] 0x103885118 <+20>: str x8, [sp, #0x8] 0x10388511c <+24>: adrp x8, 2957 0x103885120 <+28>: ldr d0, [x8, #0x2d8] 0x103885124 <+32>: str d0, [sp, #0x10] 0x103885128 <+36>: adrp x8, 0 0x10388512c <+40>: add x8, x8, #0x178 ; __UIColorBreakForOutOfRangeColorComponents_block_invoke(该函数的block回调) 0x103885130 <+44>: adrp x9, 4619 0x103885134 <+48>: add x9, x9, #0x5f0 ; __block_descriptor_40_e5_v8?0l(block描述符) 0x103885138 <+52>: stp x8, x9, [sp, #0x18] 0x10388513c <+56>: adrp x8, 3061 0x103885140 <+60>: add x8, x8, #0x1ef ; "UIColorBreakForOutOfRangeColorComponents"(函数名) 0x103885144 <+64>: str x8, [sp, #0x28] 0x103885148 <+68>: adrp x8, 5726 0x10388514c <+72>: ldr x8, [x8, #0xc00] 0x103885150 <+76>: cmn x8, #0x1 0x103885154 <+80>: b.ne 0x103885164 ; <+96>(跳转到+96位置) 0x103885158 <+84>: ldp x29, x30, [sp, #0x30] 0x10388515c <+88>: add sp, sp, #0x40 0x103885160 <+92>: ret 0x103885164 <+96>: adrp x0, 5726 0x103885168 <+100>: add x0, x0, #0xc00 ; UIColorBreakForOutOfRangeColorComponents.once(该函数的once单例变量) 0x10388516c <+104>: add x1, sp, #0x8 0x103885170 <+108>: bl 0x1042cc8f4 ; symbol stub for: dispatch_once(dispatch_once符号桩) 0x103885174 <+112>: b 0x103885158 ; <+84>(跳转到+84位置)
具体处理方法
1. 设置符号断点的步骤
在Xcode中按以下操作:
- 按
Cmd + 8打开断点导航栏 - 点击左下角的
+按钮,选择Symbolic Breakpoint - 在
Symbol输入框中填入UIColorBreakForOutOfRangeColorComponents - 点击
Done保存断点,下次运行触发时会自动断停
2. 分析汇编代码定位问题
从汇编代码可以确认,断点触发在UIKitCore的内部函数中,说明确实是ContactsUI框架自身创建UIColor时传入了超出范围的组件值。进一步定位的方法:
- 断点触发后,按
Cmd + 7打开调用栈面板 - 向上翻阅调用栈,找到ContactsUI相关的上层函数,即可定位到具体创建颜色的位置
- 如果是系统框架的bug,只要UI显示正常,完全可以忽略该告警;也可以向苹果提交反馈
3. 临时关闭告警的方案
如果觉得告警干扰调试体验,可以临时关闭:
- 打开
Edit Scheme(左上角项目名称旁的下拉菜单中) - 选择
Run->Arguments->Environment Variables - 添加
OS_ACTIVITY_MODE,值设为disable(注意:此操作会关闭所有系统日志,调试完成后建议恢复)
内容的提问来源于stack exchange,提问作者benc
相关产品推荐
相关产品推荐

