文章总结: 该文档介绍了使用C++17从零开发调试器的技术专栏内容,涵盖项目设置、寄存器操作、断点实现、内存管理、多线程调试等核心主题,并提供了加入知识星球获取完整内容与技术支持的可操作建议。 综合评分: 78 文章分类: 安全开发,二进制安全,安全工具,红队,安全培训
用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
专栏对全体小方说服务器开发知识星球球友开发,加入星球后,看置顶帖子即可阅读。
星球提供五大服务:
-
优问优答
-
不定期的技术直播和录像
-
优质源码分享和指导
-
模拟面试、职业解惑和简历review
-
星球专属技术专栏。
小方说服务器开发知识星球详细介绍点击这里。
如果你还不是球友,可以通过下面的优惠券扫码加入:
老球友续费扫码如下:
推荐阅读
- 高级 C++ 开发综合岗面试题,能挑战否?
- 大型开源 FTP 软件 FileZilla 源码分析
- 如何尽快适应大型 C++ 项目?
- 如果你想低成本的快速提高开发水平,推荐这个
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:CppGuide 《用C++17从零开发一个GDB调试器》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论