更新时间:2024-12-31 19:56:27
封面
版权页
作者简介
内容简介
序一
序二
第1章 调试符号和调试器
1.1 调试符号
1.2 实战故事1:数据类型的不一致
1.3 调试器的内部结构
1.4 技巧和注意事项
1.5 本章小结
第2章 堆数据结构
2.1 理解内存管理器
2.2 利用堆元数据
2.3 本章小结
第3章 内存损坏
3.1 内存是怎么损坏的
3.2 调试内存损坏
3.3 实战故事2:神秘的字节序转换
3.4 实战故事3:覆写栈变量
3.5 本章小结
第4章 C++对象布局
4.1 对齐和大小端
4.2 C++对象布局
4.3 实战故事4:访问已经释放的数据
4.4 搜索引用树
4.5 本章小结
第5章 优化后的二进制
5.1 调试版和发行版的区别
5.2 调试优化代码的挑战
5.3 汇编代码介绍
5.4 分析优化后的代码
5.5 调试优化后的代码示例
5.6 本章小结
第6章 进程镜像
6.1 二进制文件格式
6.2 运行期加载和链接
6.3 进程映射表
6.4 本章小结
第7章 调试多线程程序
7.1 竞争条件
7.2 它是竞争条件吗
7.3 调试竞争条件
7.4 实战故事5:记录重要区域
7.5 死锁
7.6 本章小结
第8章 更多调试方法
8.1 重现错误
8.2 防止未来的bug
8.3 不要忘记这些调试规则
8.4 逆向调试
8.5 本章小结
第9章 拓展调试器能力
9.1 使用Python拓展GDB
9.2 GDB自定义命令
9.3 本章小结
第10章 内存调试工具
10.1 ptmalloc's MALLOC_CHECK_
10.2 Google Address Sanitizer
10.3 AccuTrak
10.4 有效地调试内存损坏
10.5 实战故事6:内存管理器的崩溃问题
10.6 本章小结
第11章 Core Analyzer
11.1 使用示例
11.2 主要功能
11.3 本章小结
第12章 更多调试工具
12.1 strace
12.2 实战故事7:僵尸进程
12.3 Perf
12.4 eBPF
12.5 实战故事8:链接问题
12.6 实战故事9:临时变量的生命周期
12.7 本章小结
第13章 崩溃发送机制
13.1 客户端
13.2 远程报告收集服务器
13.3 终端集成器
13.4 本章小结
第14章 内存泄漏
14.1 为什么RAII是基石
14.2 分析
14.3 调试内存泄漏
14.4 本章小结
第15章 协程
15.1 C++协程
15.2 协程的切分点
15.3 协程之诺
15.4 本章小结
第16章 远程调试
16.1 GDB远程调试
16.2 Visual Studio远程调试
16.3 本章小结
第17章 容器世界
17.1 容器示例
17.2 容器应用
17.3 C/C++容器调试
17.4 实战故事10:CrashLoopBackOff