互联网
类型
6.7
豆瓣评分
可以朗读
语音朗读
187千字
字数
2024-01-01
发行日期
展开全部
主编推荐语
一本关于高效调试的实用指南。
内容简介
本书是关于软件调试技术的深度探索,融合了作者的实践智慧。书中不仅指导读者如何使用专业的调试工具,还介绍了如何宏观和微观地分析问题,并最大限度地发挥调试器功能。此外,书中还深入解读了调试背后的技术原理,如调试符号、内存管理及系统内核对内存的操作机制,以揭示内存管理的关键性和复杂性。
除了介绍基础概念外,本书还涵盖了许多增强调试能力的工具与插件。尽管焦点集中在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月,是由教育部主管、清华大学主办的综合出版单位。植根于“清华”这座久负盛名的高等学府,秉承清华人“自强不息,厚德载物”的人文精神,清华大学出版社在短短二十多年的时间里,迅速成长起来。清华大学出版社始终坚持弘扬科技文化产业、服务科教兴国战略的出版方向,把出版高等学校教学用书和科技图书作为主要任务,并为促进学术交流、繁荣出版事业设立了多项出版基金,逐渐形成了以出版高水平的教材和学术专著为主的鲜明特色,在教育出版领域树立了强势品牌。