各位小伙伴,小方的新专栏《用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
专栏对全体小方说服务器开发知识星球球友开发,加入星球后,看置顶帖子即可阅读。
星球提供五大服务:
1. 优问优答
2. 不定期的技术直播和录像
3. 优质源码分享和指导
4. 模拟面试、职业解惑和简历review
5. 星球专属技术专栏。
小方说服务器开发知识星球详细介绍点击这里。
如果你还不是球友,可以通过下面的优惠券扫码加入:
老球友续费扫码如下:
推荐阅读

