展开全部

主编推荐语

一本关于高效调试的实用指南。

内容简介

本书是关于软件调试技术的深度探索,融合了作者的实践智慧。书中不仅指导读者如何使用专业的调试工具,还介绍了如何宏观和微观地分析问题,并最大限度地发挥调试器功能。此外,书中还深入解读了调试背后的技术原理,如调试符号、内存管理及系统内核对内存的操作机制,以揭示内存管理的关键性和复杂性。

除了介绍基础概念外,本书还涵盖了许多增强调试能力的工具与插件。尽管焦点集中在C/C++ ,但其中的策略与技巧具有普适性,适用于多种编程语境。内容包括从内存泄漏预防调试、Linux下的eBPF和strace调试方法,到Kubernetes容器调试,再到C 20的协程与崩溃信息收集策略。

目录

  • 版权信息
  • 作者简介
  • 内容简介
  • 序一
  • 序二
  • 第1章 调试符号和调试器
  • 1.1 调试符号
  • 1.1.1 调试符号概览
  • 1.1.2 DWARF格式
  • 1.2 实战故事1:数据类型的不一致
  • 1.3 调试器的内部结构
  • 1.3.1 用户界面
  • 1.3.2 符号管理模块
  • 1.3.3 目标管理模块
  • 1.4 技巧和注意事项
  • 1.4.1 特殊的调试符号
  • 1.4.2 改变执行及其副作用
  • 1.4.3 符号匹配的自动化
  • 1.4.4 后期分析
  • 1.4.5 内存保护
  • 1.4.6 断点不工作
  • 1.5 本章小结
  • 第2章 堆数据结构
  • 2.1 理解内存管理器
  • 2.1.1 ptmalloc
  • 2.1.2 TCMalloc
  • 2.1.3 多个堆
  • 2.2 利用堆元数据
  • 2.3 本章小结
  • 第3章 内存损坏
  • 3.1 内存是怎么损坏的
  • 3.1.1 内存溢出与下溢
  • 3.1.2 访问释放的内存
  • 3.1.3 使用未初始化的值
  • 3.2 调试内存损坏
  • 3.2.1 初始调查
  • 3.2.2 内存调试工具
  • 3.2.3 堆与栈内存损坏对比
  • 3.2.4 工具箱
  • 3.3 实战故事2:神秘的字节序转换
  • 3.3.1 症状
  • 3.3.2 分析和调试
  • 3.3.3 错误和有价值的点
  • 3.4 实战故事3:覆写栈变量
  • 3.4.1 症状
  • 3.4.2 分析和调试
  • 3.5 本章小结
  • 第4章 C++对象布局
  • 4.1 对齐和大小端
  • 4.1.1 对齐
  • 4.1.2 大小端
  • 4.2 C++对象布局
  • 4.3 实战故事4:访问已经释放的数据
  • 4.3.1 症状
  • 4.3.2 分析和调试
  • 4.4 搜索引用树
  • 4.5 本章小结
  • 第5章 优化后的二进制
  • 5.1 调试版和发行版的区别
  • 5.2 调试优化代码的挑战
  • 5.3 汇编代码介绍
  • 5.3.1 寄存器
  • 5.3.2 指令集
  • 5.3.3 程序汇编的结构
  • 5.3.4 函数调用习惯
  • 5.4 分析优化后的代码
  • 5.5 调试优化后的代码示例
  • 5.6 本章小结
  • 第6章 进程镜像
  • 6.1 二进制文件格式
  • 6.2 运行期加载和链接
  • 6.3 进程映射表
  • 6.3.1 可执行文件
  • 6.3.2 共享库
  • 6.3.3 线程栈
  • 6.3.4 无名区域
  • 6.3.5 拦截
  • 6.3.6 链接时替换
  • 6.3.7 预先加载代理函数
  • 6.3.8 修改导入和导出表
  • 6.3.9 对目标函数进行手术改变
  • 6.3.10 核心转储文件格式
  • 6.3.11 核心转储文件分析工具
  • 6.4 本章小结
  • 第7章 调试多线程程序
  • 7.1 竞争条件
  • 7.2 它是竞争条件吗
  • 7.3 调试竞争条件
  • 7.4 实战故事5:记录重要区域
  • 7.4.1 症状
  • 7.4.2 分析调试
  • 7.5 死锁
  • 7.6 本章小结
  • 第8章 更多调试方法
  • 8.1 重现错误
  • 8.1.1 归因
  • 8.1.2 收集环境信息
  • 8.1.3 重建环境
  • 8.2 防止未来的bug
  • 8.2.1 知识保留和传递
  • 8.2.2 增强提前检查
  • 8.2.3 编写更好调试的代码
  • 8.3 不要忘记这些调试规则
  • 8.3.1 分治法
  • 8.3.2 退一步,获取新的观点
  • 8.3.3 保留调试历史
  • 8.4 逆向调试
  • 8.4.1 rr:Record and Replay
  • 8.4.2 rr注意事项
  • 8.5 本章小结
  • 第9章 拓展调试器能力
  • 9.1 使用Python拓展GDB
  • 9.1.1 美化输出
  • 9.1.2 编写自己的美观打印器
  • 9.1.3 将重复的工作变成一个命令
  • 9.1.4 更快地调试bug
  • 9.1.5 使用Python设置断点
  • 9.1.6 通过命令行来启动程序和设置断点
  • 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.5.1 症状
  • 10.5.2 分析和调试
  • 10.6 本章小结
  • 第11章 Core Analyzer
  • 11.1 使用示例
  • 11.2 主要功能
  • 11.2.1 搜索引用的对象(水平搜索)
  • 11.2.2 查询地址及其底层对象(垂直搜索)
  • 11.2.3 内存模式分析
  • 11.2.4 查询堆内存块
  • 11.2.5 堆遍历(检查整个堆以发现损坏并获取内存使用统计)
  • 11.3 本章小结
  • 第12章 更多调试工具
  • 12.1 strace
  • 12.1.1 常用功能
  • 12.1.2 常用附加选项
  • 12.2 实战故事7:僵尸进程
  • 12.2.1 遇到难题
  • 12.2.2 揭示bug的真相
  • 12.3 Perf
  • 12.4 eBPF
  • 12.4.1 准备环境
  • 12.4.2 编写代码
  • 12.4.3 编译程序
  • 12.4.4 加载和运行程序
  • 12.5 实战故事8:链接问题
  • 12.5.1 切入
  • 12.5.2 更奇怪的事情
  • 12.5.3 柳暗花明
  • 12.5.4 补充
  • 12.5.5 结论
  • 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.3.1 日志
  • 18.3.2 监控
  • 18.4 遵循最佳编码实践
  • 18.5 本章小结
  • 附录A 调试混合语言
  • 使用C++ JNI的Java程序
  • 附录B 在Windows/x86环境下进行程序调试
  • B.1 PE文件格式
  • B.2 Windows Minidump格式
  • 附录C 一个简单的C++ coroutine程序
展开全部

评分及书评

尚无评分
目前还没人评分

出版方

清华大学出版社

清华大学出版社成立于1980年6月,是由教育部主管、清华大学主办的综合出版单位。植根于“清华”这座久负盛名的高等学府,秉承清华人“自强不息,厚德载物”的人文精神,清华大学出版社在短短二十多年的时间里,迅速成长起来。清华大学出版社始终坚持弘扬科技文化产业、服务科教兴国战略的出版方向,把出版高等学校教学用书和科技图书作为主要任务,并为促进学术交流、繁荣出版事业设立了多项出版基金,逐渐形成了以出版高水平的教材和学术专著为主的鲜明特色,在教育出版领域树立了强势品牌。