JHHK

欢迎来到我的个人网站
行者常至 为者常成

调试流程⭐️

目录

调试的核心角色

一、在 iOS 调试中,主要涉及以下关键组件:

Xcode
提供 IDE 和调试界面(断点、变量窗口、控制台)。
负责编译、打包、符号文件管理、与设备通信。

LLDB(Low Level Debugger)
Apple 默认调试器(替代 GDB)。
命令解析、符号解析(用 dSYM)、断点管理、格式化输出(变量、对象)、提供给 Xcode UI。

debugServer(运行在设备上)
iOS 设备上的代理。
实际控制目标进程(启动/attach/暂停/继续)、读取/写入目标内存、读寄存器、设置/清除断点或硬件寄存器、当断点命中时向 LLDB 报告。

dSYM 文件
保存 App 的 DWARF 调试信息(符号表、源码映射)。
用于把机器地址 ↔ 源文件/函数/变量对应起来。

DeviceSupport
存放 iOS 系统的符号(系统 Frameworks、dyld、libobjc 等)。
存放 DeveloperDiskImage.dmg,挂载到设备用于调试。

二、调试中的配合关系

App 地址 -----> dSYM -----> 源代码/行号/变量
系统库地址 ---> DeviceSupport/Symbols ----> 系统函数名
LLDB 命令 -----> debugserver -----> 设备执行/返回数据

三、通信

LLDB 与 debugserver 用“远程调试协议”在一条通道上通信(通过 USB 隧道或网络端口)。Xcode 实际上是用 LLDB 做后端,UI 把命令发给 LLDB。

简化流程:Xcode UI → LLDB (client) → (remote protocol) → debugserver (device) → target process。

调试流程

一、流程

[1] Xcode 编译 App (Debug)
      │
      ├─► 生成 App 可执行文件 (Mach-O)
      │
      └─► 生成 dSYM (存放源码符号信息)
                  │
                  ▼
[2] Xcode 连接设备
      │
      ├─► 查找 DeviceSupport/<iOS版本>/
      │       │
      │       ├─ DeveloperDiskImage.dmg → 挂载到设备 → 启动 debugserver(监听调试端口、负责执行、暂停、内存访问)
      │       │
      │       └─ Symbols → 提供系统库符号 (UIKit, libobjc 等)
      │
      └─► 如果找不到完全匹配的版本 (如 16.5),
              尝试使用最近的版本 (如 16.4)
                  │
                  ▼
[3] LLDB attach 到 debugserver(通过 USB 连接,建立调试通道)
      │
      ├─► 使用 dSYM 映射 App 自己的函数/变量/行号
      │
      └─► 使用 DeviceSupport/Symbols 映射系统框架的符号
                  │
                  ▼
[4] 用户打断点 / 查看调用栈
      │
      ├─► Xcode App 内代码 → LLDB 使用 dSYM 精准解析 → debugserver
      │
      ├─► 系统框架代码 → LLDB 使用 DeviceSupport 符号 (缺失时显示地址) → debugserver
      │
      ├─► debugserver 捕获断点
      │
      └─► debugserver → 通知 LLDB → Xcode 界面刷新


二、Xcode 的断点是如何传递给 debugserver 的,debugserver 是如何命中的?

1. 用户在 Xcode 设置断点(UI / Breakpoint Navigator)
    ↓
2. Xcode 将断点下发给 LLDB(LLDB 客户端在本地接受)
    ↓
3. LLDB 解析断点(符号->地址):使用 image list/dSYM 把 源文件/函数 名 -> 内存地址 映射
    ↓
4. LLDB 向 debugserver 发起“设置断点”请求(告知地址、类型)
    ↓
5. debugserver 在目标进程上实现断点(软件断点或硬件断点 / watchpoint)
    ↓
6. 目标进程运行到断点地址 → CPU 触发异常 → debugserver 捕获异常并向 LLDB 报告 → LLDB 通知 Xcode UI

常见调试命令(LLDB)

命令 作用
bt 打印调用栈 (backtrace)
frame variable 查看当前函数作用域的变量
po object 打印对象(调用 NSObject description)
image list 查看已加载的二进制和符号
image lookup -n functionName 查找函数符号
register read 查看寄存器
expr (type) var 强制类型转换并查看变量

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.