RAD调试器

EpicGames/raddebugger 访问 GitHub ↗
🔤 C ★ 8536 ⑂ 0 weekly #5 (+814) 抓取 2026-10-15

一句话简介

Epic Games 开源的原生调试器项目,提供底层调试功能与符号分析能力,适用于 C/C++ 等系统级程序调试与性能分析。

标签

  • 调试器
  • 逆向工程
  • C语言
  • 性能分析
  • Epic Games

适用应用场景

  • 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_):将各原生格式转换为 RDI
  • render(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…