在我正在处理的一些 native 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?
顺便说一句,该程序的 Intel (x64) 版本在 x64 Mac 和 Rosetta 上运行良好。
最佳答案
这里的问题很可能是线程 JIT 写保护,该功能仅存在于 Apple Silicon 上,并且在传统内存页面权限之外运行。不幸的是,Apple 的故障转储似乎没有表明线程 JIT 写保护可能是 SIGBUS 触发器。
关于crash - (Apple Silicon) (M1) 莫名其妙的 SIGBUS 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73389982/