大数跨境
0
0

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

用C++17从零开发一个GDB调试器 CppGuide
2025-08-18
1
导读:掌握C++17开发GDB调试器的关键步骤,提升你的编程技巧与项目维护能力。

各位小伙伴,小方的新专栏《用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. 星球专属技术专栏。

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

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


老球友续费扫码如下:

推荐阅读



【声明】内容源于网络
0
0
CppGuide
专注于高质量高性能C++开发,站点:cppguide.cn
内容 1260
粉丝 0
CppGuide 专注于高质量高性能C++开发,站点:cppguide.cn
总阅读783
粉丝0
内容1.3k