CPU 的调试支持 |
调试设施的简要历史,支撑软件调试核心功能硬件基础:
|
操作系统的调试支持 |
为什么要支持调试,比较Linux 和Windows 这两个操作系统支持用户态调试和内核态调试的基本设施,
- 包括用户态调试模型,
- 异常分发和管理,
- 调试信息输出,
- 错误记录,
- 错误报告机制等内容。
试验1:通过内核调试理解操作系统内核 (30 分钟) |
编译器的调试支持 |
本部分将以Visual Studio 和GCC 这两大著名编译器为例,比较介绍:
- 调试符号的产生过程、
- 存储格式和使用方法,
- 编译期检查、
- 运行期检查等内容。
|
调试器 |
比较介绍WinDBG 和GDB 调试器的:
- 特点、
- 实现模型,
- 重要调试功能的实现方法,
- 使用它们执行典型调试任务的方法,
- 比较介绍常用的调试命令。
|
应用程序崩溃和用户态转储 |
介绍应用程序崩溃的完整过程和调试方法,
转储的基本知识,
如何使用ADPLUS 自动产生用户态转储,
用户态转储的常用命令和技巧。
[试验2] JIT 调试(30 分钟) |
栈调试 |
- 栈有关的基本概念
- 栈的自动增长机制,
- 栈上的缓冲区溢出
- 检测缓冲区溢出的方法。
|
堆调试 |
- 内存管理的多层次架构,
- 比较Windows 和Linux 系统的堆管理器,
- 导致堆问题的典型原因以及调试方法。
|
内核调试 |
内核调试模型,深入解析Windows 操作系统的内核调试引擎(KD):
- 工作原理,
- 关键
- 操作,调试协议),
- KD 的变体等;
比较介绍Linux 下的内核调试设施 |
系统崩溃和转储 |
- 系统崩溃概览,
- Windows 蓝屏崩溃(BSOD)的过程,Linux 的Panic 过程(包括产生call
stack和寻找函数符号的方法),
- 系统转储,分析系统转储的方法
- 试验3:分析系统转储 (30 分钟)
|
验证器 |
验证器(verifier)的目标,Windows 操作系统的驱动验证器:
|
多线程调试 |
- 控制线程的常用命令,
- 关键区,
- volatile 关键字,
- 死锁案例解析,
- CPU 的同步支持(lock 前缀,特别指令),
- 互锁操作
|
可调试性 |
被调试程序的可调试性对于提高调试效率有着重要意义,如何在软件工程实践中提高软件的可调试性:
- 包括可观察性、
- 可辨别性、
- 可追溯性、
- 自动报告错误等。
|