作品简介

《高效C/C++调试》是关于软件调试技术的深度探索,融合了作者的实践智慧。书中不仅指导读者如何使用专业的调试工具,还介绍了如何宏观和微观地分析问题,并最大限度地发挥调试器功能。此外,书中还深入解读了调试背后的技术原理,如调试符号、内存管理及系统内核对内存的操作机制,以揭示内存管理的关键性和复杂性。除了介绍基础概念外,本书还涵盖了许多增强调试能力的工具与插件。尽管焦点集中在C/C++,但其中的策略与技巧具有普适性,适用于多种编程语境。内容包括从内存泄漏预防调试、Linux下的eBPF和strace调试方法,到Kubernetes容器调试,再到C++20的协程与崩溃信息收集策略。《高效C/C++调试》主要面向具有C/C++编程基础的读者,同时也非常适合对软件技术原理有深入探索兴趣的读者以及追求高效调试技巧的开发人员。

严琦,毕业于中国科技大学和美国伦斯勒理工学院。毕业后近三十年里曾先后任职于五家软件技术公司从事技算机编程工作,从初级程序员成长为一个中等规模的软件公司的首席架构师,涉及包括嵌入式系统,有限元分析,计算机辅助设计,商业智能系统等领域,致力于微处理器,编译器,服务器,系统内核等技术。作者有多项开源项目在实际应用中受到公司内外的肯定和感谢,在工作中申请并获批一项软件专利,并有另一项专利在审批中。

卢宪廷,本科毕业于天津大学,研究生东南大学。目前在微策略软件担任高级软件工程师,负责设计和开发优化企业全域搜索引擎;专注于高稳定/事件驱动异步架构/C++/Rust编程。

作品目录

  • 作者简介
  • 内容简介
  • 序一
  • 序二
  • 第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
  • 17.5 实战故事11:liveness failure
  • 17.6 本章小结
  • 第18章 尽量不要调试程序
  • 18.1 借助编译器来提前发现错误
  • 18.2 编写简短的实验代码
  • 18.3 日志和监控
  • 18.4 遵循最佳编码实践
  • 18.5 本章小结
  • 附录A 调试混合语言
  • 使用C++ JNI的Java程序
  • 附录B 在Windows/x86环境下进行程序调试
  • B.1 PE文件格式
  • B.2 Windows Minidump格式
  • 附录C 一个简单的C++ coroutine程序
展开全部