# LLDB ## LLDB 架构 说明:类似一个 CS 架构。 - **`lldb-mi` 的角色:** 它是一个**协议适配器**,专注于将 **GDB/MI 协议** 翻译成 **LLDB API 调用**。 - **`API` 是关键桥梁:** `lldb-mi` 几乎所有的功能都通过调用 **LLDB Public API** 来实现。 - **Core 下的模块是 LLDB 的能力:** 图中 `Core` 下列出的 `Object Files`, `Symbols`, `Process` 等,代表了 **LLDB 调试器引擎本身提供的强大核心功能**。`lldb-mi` 依赖 API 来利用这些功能。 - **依赖关系:** `lldb-mi` -> `API` -> (LLDB 核心引擎的) `Object Files`, `Mach-O/ELF`, `Symbols`, `DWARF`, `Disassembly`, `LLVM`, `Process`, `GDB Remote`。 - **目的:** 这张图说明了 `lldb-mi` 是如何构建在 LLDB 强大的核心调试引擎之上,通过标准的 API 调用其功能,从而为支持 GDB/MI 协议的客户端提供调试服务。 ## LLDB Workflow 说明: - **lldb-server**:调试服务端,`lldb-server` 作为“调试代理”,直接操控目标程序。分为两种部署方式: - **Host 端**:调试本地程序(如 macOS 进程)。 - **Remote 端**:部署到目标设备(如手机/嵌入式设备),直接控制被调试程序 - 通信层:TCP + GDB RSP 协议 - **TCP Socket**:物理传输通道,连接 Host 的 LLDB 和 Remote 的 lldb-server - **GDB RSP (Remote Serial Protocol)** - **基于 ASCII 的调试协议**(明文消息,如 `$m,#` 读取内存) - 历史原因:兼容 GDB 的远程协议,使 LLDB 能对接各类设备(Android gdbserver 等) QA:好像有点反人类设计,手机上反而是 Server,电脑端的 LLDB 反而是 Client?也就是为什么必须让手机充当 Server? **权限问题**: - 手机操作系统(如 iOS)禁止外部进程直接访问 App 内存。 - 只有手机本地的 `lldb-server` 可通过系统权限(如 `task_for_pid()`)操控目标进程。