在我正在处理的一些原生M1代码中,调用特定函数会引发一个毫无意义的SIGBUS故障:
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000280dc7da0
Exception Codes: 0x0000000000000002, 0x0000000280dc7da0
Exception Note: EXC_CORPSE_NOTIFY
Termination Reason: Namespace SIGNAL, Code 10 Bus error: 10
Terminating Process: exc handler [12171]
VM Region Info: 0x280dc7da0 is in 0x280d50000-0x280dd0000; bytes after start: 490912 bytes before end: 33375
REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL
VM_ALLOCATE 280cf0000-280d50000 [ 384K] rw-/rwx SM=ZER
---> VM_ALLOCATE 280d50000-280dd0000 [ 512K] rwx/rwx SM=ZER
VM_ALLOCATE 280dd0000-280e50000 [ 512K] rw-/rwx SM=ZER
根据此转储:
- 故障地址与功能地址相同
- 函数地址(0x280dc7da0(已正确对齐
- 目标区域具有
rwx
保护,因此是可执行的
这里可能触发SIGBUS的是什么?
顺便说一句,这个程序的英特尔(x64(版本在x64 Mac和罗塞塔上运行良好。
这里的问题很可能是线程JIT写入保护,这是一项仅在Apple Silicon上存在的功能,除了传统的内存页面权限外,它还可以运行。不幸的是,苹果的崩溃转储似乎没有表明线程JIT写入保护可能是SIGBUS触发器。