RAD调试器
一句话简介
Epic Games 开源的原生调试器项目,提供底层调试功能与符号分析能力,适用于 C/C++ 等系统级程序调试与性能分析。
标签
适用应用场景
- C/C++ 程序的原生调试与断点设置
- 游戏与系统级软件的性能瓶颈分析
- 崩溃现场的栈回溯与符号解析
- 二进制文件的符号信息查询与解析
README 中文摘要
项目总览
RAD Debugger 是一款本地用户模式、图形化的多进程调试器,目前支持 Windows x64 平台(基于 PDB 调试信息)。项目处于 ALPHA 阶段,未来计划扩展至 Linux 原生调试和 DWARF 调试信息。除调试器外,项目还包含两项配套技术:RAD Debug Info (RDI) 格式与 RAD Linker 高性能链接器。
RAD 调试信息(RDI)格式
RDI 是项目自定义的调试信息格式,调试器不直接解析工具链原生输出的 PDB 或 DWARF,而是按需将它们转换为 RDI。格式定义在 src/lib_rdi 目录中:
rdi.h/rdi.c:定义格式的核心类型与函数rdi_parse.h/rdi_parse.c:解析辅助函数
src/lib_rdi_make 目录提供构建与序列化 RDI 数据的库(开发中)。项目内的 radbin 工具(也可通过调试器 --bin 命令行参数调用)支持将原生调试信息格式转换为 RDI,并能以可读文本形式转储 RDI 文件内容。
RAD Linker
RAD Linker 是面向 x64 PE/COFF 二进制的高性能链接器,主要为巨型可执行文件的编译-调试循环设计,可生成标准 PDB,也可选生成原生 RAD Debug Info 文件,后者对调试巨型程序尤为重要,因为这些程序生成的 PDB 经常因内部 32 位表溢出而损坏。
关键特性:
- 命令行语法完全兼容 MSVC,使用
/help可查看已实现的开关列表 - 默认线程数等于 CPU 核心数;可使用
/rad_workers限制线程数 - 支持大内存页(通过
/rad_large_pages启用,可额外减少约 25% 的链接时间),但默认关闭。Windows 对大页支持不够稳定,建议仅在 Docker 或 VM 镜像中使用;Linux 移植版将以稳健方式支持大页 - 在调试信息达数 GB 的测试用例中,链接时间较常规链接器提升约 50%
- 尚未支持链接时优化(LTCG),但已在路线图中
项目路线图
初始 Alpha 稳定性阶段
首要任务是确保核心组件在 x64 Windows 本地开发场景下的可靠性,包括调试信息转换与加载、进程控制、单步执行、求值(正确使用位置信息与类型信息)以及健壮的前端。链接器方面侧重可靠性与收敛现有链接器行为。性能优化也是该阶段的工作重点,包括前端性能、缓存机制,以及提升中小型项目的链接速度。后续计划加入死代码消除(/opt:ref)和基于 Clang 的 LTO(不支持 MSVC 的 LTCG,因其未文档化)。
本地 x64 Linux 调试阶段
将调试器移植到 Linux,主要工作包括:
- 在
src/demon层实现本地进程控制抽象 API - 在
src/ctrl层实现 x64 ELF Linux 栈展开器 - 实现 DWARF 到 RDI 的转换器(
src/rdi_from_dwarf已有部分实现) - 将
src/render层从 D3D11 后端移植到 Linux 兼容 API - 将
src/font_provider层移植到 FreeType(Windows 使用 DirectWrite) - 将
src/os层(虚拟内存分配、线程与同步原语、窗口与输入事件等)移植到 Linux
完成上述工作后,x64 Windows 调试体验将原生迁移到 Linux。
未来方向
远程调试、移植到其他处理器架构、改进调试器功能(如可视化引擎)等。
代码库结构
顶层目录中,data 存放构建时使用的小型二进制文件,src 存放全部源代码;构建后生成的 build 与 local 目录未纳入版本控制。
代码库按"层"组织,对应 src 目录下的文件夹(结构尽量保持扁平),并采用 1–3 字符前缀加下划线的命名空间约定。类型与枚举值使用大写,函数与全局变量使用小写。层之间构成有向无环图,少数以 lib_ 为前缀的目录(如 lib_rdi)可作为独立库被其他代码库复用,不依赖项目内的其他层。
主要层及其命名空间示例:
base(无命名空间):通用基础构造,字符串、数学、内存分配器、辅助宏、命令行解析等ctrl(CTRL_):异步进程控制、单步、断点,与附加进程同步运行dbg_engine(D_):核心调试系统,包含单步、启动、冻结线程、运行时断点添加、缓存等顶层逻辑dbg_info(DI_):异步调试信息转换与加载,维护 RDI 缓存,必要时启动子进程进行按需转换demon(DMN_):本地进程控制抽象层,为ctrl提供跨平台接口eval(E_):表达式语言编译器,用于对变量、寄存器、类型等求值,分为词法、解析、类型检查、IR 生成、IR 求值等阶段eval_visualization(EV_):非图形化的求值可视化引擎,用于监视表file_stream(FS_):异步文件流,存储于content与artifact_cache层,支持热重载font_cache(FNT_):光栅化字体数据缓存,由font_provider提供来源font_provider(FP_):字体文件解码与光栅化后端的抽象层lib_rdi(RDI_)、lib_rdi_make(RDIM_)、lib_raddbg_markup(RADDBG_):可独立迁出的库linker(LNK_):RAD Linker 可执行文件实现mdesk(MD_):解析.mdesk格式(JSON 的超集),用于用户与项目配置文件及元代码metagen(MG_):元程序,消耗 Metadesk 文件并生成 C 代码,用于管理大型数据表、嵌入二进制文件或多行字符串os/core(OS_):操作系统核心非图形功能抽象os/gfx(OS_):基于os/core的图形操作系统功能抽象pdb(PDB_):PDB 文件格式解析与写入pe(PE_):PE 格式解析与写入raddbg(RD_):整合所有模块的主图形调试器可执行文件,包含前端 UI、内置可视化器与命令行接口rdi_from_coff(C2R_)、rdi_from_dwarf(D2R_)、rdi_from_elf(E2R_)、rdi_from_pdb(P2R_):将各原生格式转换为 RDIrender(R_):GPU 渲染 API 抽象层,不实现高层绘图 API,由draw层完成ui(UI_):图形用户界面构建机制,提供即时模式层级结构构建 API
其他层还包括 artifact_cache(AC_)、codeview(CV_)、coff(COFF_)、content(C_)、disasm(DASM_)、draw(DR_)、dwarf(DW_)、eh(EH_)、elf(ELF_)、msf(MSF_)、msvc_crt(MSCRT_)、mutable_text(MTX_)、radbin(RB_)、rdi(RDI_)、rdi_make(RDIM_)、regs(REGS_)、text(TXT_)、third_party(无命名空间)、mule(无命名空间,调试器功能测试程序)、scratch(无命名空间,临时小程序)、tester(无命名空间,自动测试程序)、natvis(无命名空间,类型可视化文件)。
摘要更新于 2026-10-08 00:32:27
· 原文 25518 字符
· md5 da7c56fb3372…