用C++17从零开发一个GDB调试器

admin 2026-04-13 06:29:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档介绍了使用C++17从零开发调试器的技术专栏内容,涵盖项目设置、寄存器操作、断点实现、内存管理、多线程调试等核心主题,并提供了加入知识星球获取完整内容与技术支持的可操作建议。 综合评分: 78 文章分类: 安全开发,二进制安全,安全工具,红队,安全培训


cover_image

用C++17从零开发一个GDB调试器

CppGuide

2026年4月8日 11:39 上海

各位小伙伴,小方的新专栏《用C++17从零开发一个调试器》已经上线啦。

以下是专栏详细目录:

  • 引言 xxv

  • 针对Windows用户 xxix

  • 针对macOS用户 xxix

  • 源语言 xxvi

  • 局限性 xxvii

  • 什么是调试器?xxv

  • 我们要构建什么?xxvi

  • 本书内容 xxvii

  • 目标平台 xxix

  • 首字母缩略词 xxxi

  • 第1章:项目设置 1

  • 编写顶级CMake文件 2

  • 构建libsdb库 3

  • 构建sdb可执行文件 4

  • 目录结构 1

  • 使依赖项可访问 5

  • 使用vcpkg管理依赖项 7

  • 测试 8

  • 总结 10

  • 第2章:编译与计算机体系结构 11

  • 寄存器

  • 程序计数器

  • 汇编与指令编码

  • 字节序

  • 栈帧

  • 程序加载 15

  • 用户空间与内核空间 16

  • 虚拟内存 17

  • 调试API 18

  • 信号 19

  • 编码 13

  • 调试信息 14

  • 编译 12

  • 操作系统与调试器 15

  • 计算机体系结构

  • 总结

  • 知识测验

  • 第3章:附加到进程

  • 创建进程类型

  • 实现启动和附加功能

  • 处理错误

  • 销毁进程

  • 恢复进程

  • 等待信号

  • 主函数

  • 附加函数

  • fork和exec

  • ptrace

  • 进程交互

  • 启动并附加到进程

  • 添加用户界面

  • 处理用户输入

  • 手动测试

  • 重构为库

  • 总结

  • 知识测验

  • 第4章:管道、procfs文件系统与自动化测试

  • 测试用例

  • 测试进程启动

  • 用于进程间通信的管道

  • Linux的procfs文件系统

  • 测试进程附加

  • 测试进程恢复

  • 总结

  • 知识测验

  • 第5章:寄存器

  • 读取 83

  • 写入 85

  • 问题排查 89

  • X宏 73

  • 寄存器表 75

  • 通用寄存器 68

  • 浮点和向量寄存器 69

  • 调试寄存器 70

  • x64寄存器

  • 与ptrace的交互 70

  • 描述寄存器 72

  • 寄存器交互

  • 总结 94

  • 知识测验 94

  • 第6章:用x64汇编测试寄存器 95

  • 帮助命令 110

  • 寄存器读取操作 111

  • 寄存器写入操作 114

  • 寄存器交互操作 121

  • 为什么用汇编测试?95

  • x64汇编入门 96

  • 测试设置 97

  • 发出系统调用 100

  • printf函数 101

  • 通用寄存器 102

  • MMX寄存器 103

  • SSE寄存器 104

  • x87寄存器 105

  • 寄存器读取 107

  • 公开寄存器 110

  • 总结 122

  • 知识测验 122

  • 第7章:软件断点 125

  • 位置无关可执行文件 149

  • 断点测试 151

  • 列出断点 145

  • 设置断点 146

  • 启用、禁用和删除断点 147

  • 提供帮助信息 147

  • 表示位置 127

  • 创建断点位置 128

  • 管理断点位置 130

  • 测试断点位置管理 138

  • 启用断点 141

  • 禁用断点 143

  • 硬件断点与软件断点 126

  • 实现软件断点 126

  • 向调试器添加断点 144

  • 确定设置断点的位置 148

  • 继续执行 153

  • 自动化测试 157

  • 总结 161

  • 知识测验 162

  • 第8章:内存与反汇编 163

  • 读取和写入 164

  • 向用户公开内存 168

  • 测试内存操作 172

  • 内存操作 164

  • 反汇编 174

  • 总结 182

  • 知识测验 182

  • 第9章:硬件断点与观察点 183

  • 向用户公开观察点 204

  • 测试观察点 207

  • 跟踪 185

  • 设置 189

  • 清除 194

  • 调试寄存器 184

  • 实现硬件断点

  • 测试硬件断点 195

  • 观察点 200

  • 总结 209

  • 知识测验 209

  • 第10章:信号与系统调用 211

  • 跟踪系统调用 223

  • 公开系统调用捕获点 231

  • 跟踪调试寄存器赋值 217

  • 跟踪观察点值 219

  • 显示停止信息 221

  • 信号处理程序 211

  • 打印停止信息 215

  • 捕获点 223

  • 测试系统调用捕获点 236

  • 信号和中断的内部机制 239

  • 总结 243

  • 知识测验 244

  • 第11章:目标文件 245

  • 辅助向量 270

  • 目标 272

  • 获取节名称 254

  • 构建节映射 254

  • 解析通用字符串表 256

  • 节(Sections)和段(Segments)246

  • 文件结构 248

  • 什么是ELF文件?246

  • 解析ELF文件头 248

  • 解析节头 251

  • 字符串表 253

  • 文件地址、文件偏移和虚拟地址 257

  • 解析符号表 263

  • 创建目标类型 270

  • 测试 278

  • 总结 278

  • 知识测验 279

  • 第12章:调试信息 281

  • 获取DIE名称 330

  • 为DIE建立索引 331

  • 优化子迭代器 317

  • 提取DIE地址范围 318

  • 检查偏移并支持范围列表 325

  • 实现表单跳过 303

  • 遍历DIE树 306

  • 整数编码 289

  • 条目结构 290

  • DWARF游标 290

  • 提取 294

  • DWARF节 282

  • DIE二进制编码 285

  • DWARF简介 282

  • 获取常量文件 286

  • 解析缩写表 287

  • 解析编译单元头 296

  • 解析DIE 299

  • 读取属性 311

  • 为DIE添加属性支持 317

  • 增强DWARF类型 327

  • 测试解析器 332

  • 总结 336

  • 知识测验 336

  • 第13章:行表 337

  • 程序头 338

  • 抽象机器 346

  • 程序指令 350

  • 行表内容 338

  • 解释行表程序 338

  • 通过行号或文件地址检索条目 360

  • DIE行属性辅助函数 362

  • 测试解释器 364

  • 总结 364

  • 知识测验 365

  • 第14章:源代码级断点与单步执行 367

  • 断点 413

  • 单步执行 417

  • 扩展断点位置 391

  • 确定断点位置类型 392

  • 实现断点函数 395

  • 创建断点子类型 396

  • 创建断点 401

  • 向用户公开断点 403

  • 步入(Step In)378

  • 步过(Step Over)383

  • 步出(Step Out)385

  • 跟踪内联 372

  • 找到当前栈 375

  • 函数内联 368

  • 获取内联函数栈 372

  • 源代码级单步执行 377

  • 向用户公开单步执行功能 387

  • 源代码级断点 388

  • 打印当前执行的源代码 408

  • 测试 413

  • 总结 421

  • 知识测验 421

  • 第15章:调用帧信息 423

  • 解析EH帧头 438

  • 搜索EH帧表 440

  • 通用信息条目 426

  • 帧描述条目 428

  • 回溯示例 424

  • DWARF调用帧信息 425

  • 解析通用信息条目 429

  • 解析帧描述条目 435

  • 查找帧描述条目 437

  • 将解析器添加到调试器 442

  • 总结 444

  • 知识测验 444

  • 第16章:栈展开 445

  • 添加up和down命令 471

  • 从其他栈帧读取寄存器 472

  • 打印回溯信息 474

  • 创建栈帧类型 460

  • 跟踪和操作栈帧 461

  • 理解展开算法 463

  • 编写展开函数 467

  • 表示规则 446

  • 返回寄存器 449

  • 编写栈展开器 451

  • 执行指令 453

  • 执行调用帧信息 445

  • 执行寄存器规则 459

  • 展开栈 460

  • 向用户公开栈展开功能 471

  • 测试 476

  • 总结 478

  • 知识测验 478

  • 第17章:共享库 479

  • 添加断点命中回调 492

  • 定位会合结构 493

  • 处理多个ELF文件 496

  • 读取已加载库列表 501

  • 全局偏移表 488

  • 重定位记录 489

  • 过程链接表 490

  • .dynamic节 483

  • 会合结构 485

  • 静态可执行文件 482

  • 动态可执行文件 482

  • 程序加载 480

  • 加载依赖项 483

  • 重定位 486

  • 跟踪共享库加载 491

  • 测试 505

  • 总结 506

  • 知识测验 506

  • 第18章:多线程 509

  • 更新信号处理函数 526

  • 停止和恢复线程 528

  • 清理已退出的线程 531

  • 报告生命周期事件 531

  • 处理信号 532

  • 捕获新线程 513

  • 识别线程创建 513

  • 表示线程状态 514

  • pthreads库 510

  • 竞态条件 511

  • ptrace和procfs文件系统 512

  • Linux上的线程 509

  • 跟踪线程 512

  • 支持多线程进程 517

  • 多线程信号处理 524

  • 跟踪目标中的线程 536

  • 向用户公开线程 541

  • 测试 545

  • 总结 547

  • 知识测验 547

  • 第19章:DWARF表达式 549

  • 读取DWARF表达式结果 576

  • 为全局变量建立索引 580

  • 添加变量查找接口 582

  • 定义结果类型 553

  • 计算表达式 554

  • 执行栈操作 555

  • 找到当前简单位置描述 556

  • 处理操作码范围 557

  • 处理单个操作码 558

  • 执行栈操作 560

  • 执行解引用指令 561

  • 将特定实体的地址压入栈 562

  • 执行算术、位运算和关系运算 562

  • 执行控制流指令 565

  • 执行非地址位置类型 565

  • 处理复合位置 567

  • 单位置描述 551

  • 简单位置描述 551

  • 复合位置描述 552

  • DWARF表达式分类 550

  • 执行简单位置描述 553

  • 执行位置列表 568

  • 向用户公开属性 570

  • 增强栈展开器 572

  • 读取全局变量 576

  • 测试 583

  • 总结 586

  • 知识测验 586

  • 第20章:变量与类型 587

  • 成员指针 599

  • 指针 600

  • 类 601

  • 数组 605

  • 基本类型 607

  • 基本类型 589

  • 数组类型 589

  • 类和联合类型 590

  • 成员指针类型 592

  • 类型DIE 588

  • 存储类型信息 593

  • 可视化类型化数据 598

  • 查找局部变量 608

  • 解析间接名称 611

  • 向用户公开变量 617

  • 测试 620

  • 总结 624

  • 知识测验 624

  • 第21章:表达式求值 625

  • 执行低级目标调用 643

  • 为参数分配内存 645

  • 对参数进行分类 646

  • 检查调用的复杂性 653

  • 识别构造函数和析构函数 654

  • 实现参数传递 657

  • 读取返回值 661

  • 为成员函数建立索引 663

  • 对参数进行分类 640

  • 传递参数 642

  • 返回值 643

  • 表示内置类型 631

  • 解析单个参数 633

  • 收集所有参数 634

  • 支持表达式求值 626

  • 扩展名称查找 627

  • 解析参数 630

  • 重载解析 636

  • 调用约定 640

  • 在调试器中调用函数 643

  • 执行高级目标调用 666

  • 计算表达式 667

  • 向用户公开表达式求值功能 669

  • 测试求值器 670

  • 总结 674

  • 知识测验 674

  • 第22章:高级主题 677

  • GDB机器接口 679

  • 调试适配器协议 680

  • 该使用什么 681

  • 远程调试 677

  • 开发工具通信 678

  • 线程局部存储 681

  • 时间旅行调试 682

  • 异常捕获点 683

  • 非停止模式 684

  • 跟踪分叉模式 684

  • 总结 684

专栏对全体小方说服务器开发知识星球球友开发,加入星球后,看置顶帖子即可阅读。

星球提供五大服务:

  1. 优问优答

  2. 不定期的技术直播和录像

  3. 优质源码分享和指导

  4. 模拟面试、职业解惑和简历review

  5. 星球专属技术专栏。

小方说服务器开发知识星球详细介绍点击这里

如果你还不是球友,可以通过下面的优惠券扫码加入:

老球友续费扫码如下:

推荐阅读

  • 高级 C++ 开发综合岗面试题,能挑战否?
  • 大型开源 FTP 软件 FileZilla 源码分析
  • 如何尽快适应大型 C++ 项目?
  • 如果你想低成本的快速提高开发水平,推荐这个

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:CppGuide 《用C++17从零开发一个GDB调试器》

评论:0   参与:  0