mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 20:00:40 +00:00
47 lines
2.1 KiB
Markdown
47 lines
2.1 KiB
Markdown
# LLDB
|
||
|
||
|
||
|
||
## LLDB 架构
|
||
|
||
<img src="./../assets/LLDBArchitecture.png" style="zoom:40%" />
|
||
|
||
说明:类似一个 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
|
||
|
||
<img src="./../assets/LLDBWorkflow.png" style="zoom:40%" />
|
||
|
||
说明:
|
||
|
||
- **lldb-server**:调试服务端,`lldb-server` 作为“调试代理”,直接操控目标程序。分为两种部署方式:
|
||
|
||
- **Host 端**:调试本地程序(如 macOS 进程)。
|
||
|
||
- **Remote 端**:部署到目标设备(如手机/嵌入式设备),直接控制被调试程序
|
||
|
||
- 通信层:TCP + GDB RSP 协议
|
||
|
||
- **TCP Socket**:物理传输通道,连接 Host 的 LLDB 和 Remote 的 lldb-server
|
||
- **GDB RSP (Remote Serial Protocol)**
|
||
- **基于 ASCII 的调试协议**(明文消息,如 `$m<addr>,<length>#<checksum>` 读取内存)
|
||
- 历史原因:兼容 GDB 的远程协议,使 LLDB 能对接各类设备(Android gdbserver 等)
|
||
|
||
QA:好像有点反人类设计,手机上反而是 Server,电脑端的 LLDB 反而是 Client?也就是为什么必须让手机充当 Server?
|
||
|
||
**权限问题**:
|
||
|
||
- 手机操作系统(如 iOS)禁止外部进程直接访问 App 内存。
|
||
- 只有手机本地的 `lldb-server` 可通过系统权限(如 `task_for_pid()`)操控目标进程。
|
||
|