公司动态
iOS Crash Dump Analysis Book:坏内存崩溃(SIGSEGV/SIGBUS)彻底搞懂——从地址空间到野指针
iOS Crash Dump Analysis Book坏内存崩溃SIGSEGV/SIGBUS彻底搞懂——从地址空间到野指针【免费下载链接】ios-crash-dump-analysis-bookiOS Crash Dump Analysis Book项目地址: https://gitcode.com/gh_mirrors/io/ios-crash-dump-analysis-bookiOS Crash Dump Analysis BookiOS 崩溃转储分析是一本教你读懂 iOS 崩溃报告的开源书籍与案例库配有真实崩溃日志和配套示例工程。这篇文章聚焦其中最常见的坏内存崩溃EXC_BAD_ACCESS (SIGSEGV)段错误与EXC_BAD_ACCESS (SIGBUS)总线错误从操作系统的地址空间讲起帮你彻底搞懂野指针的来龙去脉。 一、如何识别坏内存崩溃先看 Exception Type拿到一份崩溃报告Crash Report第一步是定位Exception Type字段。坏内存崩溃只有两种面孔Exception Type: EXC_BOOK_ACCESS (SIGSEGV) Exception Type: EXC_BAD_ACCESS (SIGBUS)信号名字本质含义典型场景SIGSEGV段错误Segment Violation访问的地址根本没有映射进进程地址空间野指针、空指针、越界访问SIGBUS总线错误Bus Error地址已经映射但不允许访问或对齐方式非法未对齐访问、动态库加载异常一句话记忆SIGSEGV 是这片内存不属于我SIGBUS 是这片内存属于我但我不许/不能这么碰。 二、先搞懂地址空间页、段与 __TEXT操作系统管理内存的方式是先把连续内存划分成内存页Page再把页归组成段Segment段统一携带元数据属性。比如程序的代码段__TEXT被设置为只读但可执行兼顾了性能与安全。崩溃报告里的故障地址必须放到这个地址地图里才能理解它属于哪个段。下面这张图来自反汇编器 Hopper 的地址视图可以看到__TEXT段中函数与变量的布局以及地址0x14549800落在-[PlanetViewController viewDidLoad] 396附近 提示新版崩溃报告还会附带VM Region Info字段直接告诉你故障地址落在哪个区域如--- __TEXT 100ae4000-100aec000是判断地址有没有被映射的最快依据。⚠️ 三、SIGSEGV 段错误地址未映射野指针重灾区SIGSEGV 意味着程序访问了一个完全不在进程地址空间内的地址。最常见的根源就是野指针悬垂指针对象已释放指针仍指向那块内存未初始化指针编译器常把这类寄存器填成特殊值0xbaddc0dedeadbead看到它基本可以断定指针未初始化指针算术跑偏算出的目标地址落在了无效区域。下面这张 Xcode 调试器截图就是典型案例程序点击按钮后崩溃内存检查器里0x680000019da0处全是0xAA垃圾字节——指针指向了一块从未初始化/已被复用的内存ARM64e 上的特殊形态指针认证失败PAC在 iPhone 11 等使用 arm64e 架构的机型上SIGSEGV 还可能表现为指针认证失败。真实案例icdab_ptr示例的报告中写着Exception Subtype: KERN_INVALID_ADDRESS at 0x2000000100ae9df8 - 0x0000000100ae9df8 (possible pointer authentication failure)指针低 32 位有效但高 24 位的 PAC 校验值错误系统判定为可能的指针认证失败。案例源码见 examples/icdab_ptr_ios/icdab_ptr_ios_explanation.md对应章节为markdown/PointerAuthentication.md。其他 SIGSEGV 实战案例examples/fud_crash_osx/fud_crash_explanation.md典型段错误分析examples/leak_agent_ios/leakagent_crash_explanation.md内存泄漏引发的崩溃。 四、SIGBUS 总线错误地址映射了但访问不被允许SIGBUS 比 SIGSEGV 更隐蔽两种典型成因1️⃣ 对齐错误BUS_ADRALNCPU 架构要求某些数据类型按特定边界对齐。真实案例 Jablotron智能家居 App在 Swift Core 运行时中崩溃Exception Type: SIGBUS Exception Codes: BUS_ADRALN at 0xcd0b1c崩溃发生在编译器自动生成的泛型元数据访问代码中最终是 Apple 修复编译器缺陷解决。经验崩溃出现在系统公共代码里通常意味着 API 使用方式不当应尝试简化代码复现。案例见 examples/jablotron_sigbus_align_ios/jablotron_crash_explanation.md。2️⃣ 动态库加载异常XBMC 案例中dyld在dlopen加载插件时触发EXC_BAD_ACCESS (SIGBUS)故障地址落在 App 二进制与 dyld 之间——地址被映射了但内容并非预期的库。这类启动即崩溃最好打开动态链接器诊断开关排查部署或签名问题在Product Scheme Edit Scheme的 Run → Arguments → Environment Variables 中勾选DYLD_PRINT_LIBRARIES控制台即可看到每个动态库的加载过程。案例见 examples/xbmc_sigbus_ios/xmbc_crash_explanation.md。️ 五、坏内存崩溃排查 5 步清单看异常类型区分EXC_BAD_ACCESS (SIGSEGV)还是(SIGBUS)锁定未映射还是不允许/未对齐。看故障地址结合Exception Subtype如KERN_INVALID_ADDRESS at 0x...与VM Region Info确认地址落在哪个段对照报告末尾Binary Images的地址范围。看寄存器特征值出现0xbaddc0dedeadbead说明指针未初始化出现possible pointer authentication failure则是 PAC 问题。打开 Address Sanitizer可自动检测越界访问与释放后使用use-after-free在 Xcode 的 Scheme 诊断设置中开启。必要时反汇编现场用反汇编器查看崩溃指令与指针来源例如 Hopper 打开 Mach-O 文件直接查看反汇编 六、书中章节与案例资料路径坏内存崩溃的完整学习路线可沿以下资料深入均在项目内章节正文markdown/BadMemory.md、markdown/BadMemorySegv.mdSIGSEGV、markdown/BadMemoryBus.mdSIGBUS中文版章节markdown/zh/BadMemory.md、markdown/zh/NilOptionalUnwrap.md可选解包崩溃案例库examples/icdab_ptr_ios/、examples/fud_crash_osx/、examples/leak_agent_ios/、examples/xbmc_sigbus_ios/、examples/jablotron_sigbus_align_ios/配套截图screenshots/hopperAddressView.png、screenshots/scribble.png、screenshots/dynamic_loading_env.png总结面对EXC_BAD_ACCESS崩溃先分清 SIGSEGV 与 SIGBUS再用地址 → 区域 → 寄存器特征 → ASan → 反汇编五步法定位野指针根源。iOS Crash Dump Analysis Book 的章节与真实案例正是这套方法论的最佳练习场。【免费下载链接】ios-crash-dump-analysis-bookiOS Crash Dump Analysis Book项目地址: https://gitcode.com/gh_mirrors/io/ios-crash-dump-analysis-book创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考