arm64架构开发协程时触发EXC_BAD_ACCESS(code=259)问题咨询
EXC_BAD_ACCESS (code=259) 错误说明与官方查询方式
- 首先纠正一个常见误区:你能搜到的常规EXC_BAD_ACCESS错误码都是Mach内核层定义的通用错误(比如空指针访问是code=1,内存权限不匹配是code=2),这类错误码数值都在个位数到几十区间,259不属于这个范畴。
- 259是ARM64平台特有的异常码,是LLDB对内核捕获的CPU异常综合寄存器(ESR)值做转换后输出的结果,本质是CPU访问内存时,内存总线/MMU返回了不可恢复的同步外部错误,不是普通的野指针、只读内存写入这类软件层面可直接定位的内存错误。
- 官方资料查询路径:
- 系统内置头文件:在Xcode对应SDK的
usr/include/mach/exception_types.h、osfmk/arm/proc_reg.h中,可以查到EXC_BAD_ACCESS的异常码映射规则,以及ARM64平台异常码的转换逻辑,明确259对应的是ARM64 ESR寄存器的同步外部中止类异常。 - ARM官方架构参考手册:在ARMv8/ARMv9架构手册的异常处理章节,找到ESR寄存器ISS域的编码说明,259转十六进制为0x103,对应3级页表转换阶段触发的外部内存访问错误,常见触发原因包括:访问的虚拟地址对应的物理页已被系统回收且未触发缺页处理、内存映射被内核或其他模块意外破坏、硬件检测到对应内存区域存在不可纠正的错误。
- 系统内置头文件:在Xcode对应SDK的
- 结合你给出的崩溃栈排查方向:
崩溃点停在ct_main函数的起始大括号位置,还未执行到局部变量赋值逻辑,说明CPU刚跳转到协程入口准备取指、建立栈帧时就触发了异常,优先排查协程栈的分配释放逻辑(比如协程栈内存被提前free、栈溢出破坏了栈内存映射)、协程上下文切换的汇编实现(比如切换时恢复的SP/PC寄存器值非法)。
注意:不要按照普通EXC_BAD_ACCESS的思路去查代码里的野指针写越界,这类code=259的崩溃90%以上场景和栈/寄存器上下文损坏、内存映射被异常修改有关。
内容的提问来源于stack exchange,提问作者wangha
相关产品推荐
相关产品推荐

