简介
今天,Windows仍然是软件历史上最复杂的操作系统,深入理解这个操作系统对于任何软件工程师来说都是一个巨大的挑战。本培训从Windows应用程序调试为主题,深入Windows系统内部,以生动鲜活的方式,解读IRQL、IRP、设备栈等诸多难以理解的概念,领略NT内核的博大精深,解读Windows应用程序。培训形式: 演讲 + 演示及动手实验
课程时长
3天(18H)
受众人群
可以是从事Windows应用软件开发和测试的软件工程师、项目带头人和技术经理。
分享提纲
第一部分:Windows系统核心机制(2小时) | 概述Windows操作系统的架构、系统组件(HAL、内核、执行体、Native进程和子系统)、重要的系统机制(内核服务调用、中断管理、内核对象等)以及主要数据结构(进程、线程、内核对象、设备对象等),并介绍进程、线程、操作系统的用户和内核空间、登录会话等重要概念 |
第二部分:WinDBG精要(1.5小时) | 系统介绍 WinDBG的命令类型、基本使用方法、定制调试事件的方法和重要的调试命令,包括用户态调试和内核态调试的常用命令,远程调试,应用程序的模型和工作原理 [试验一] WinDBG基础(15分钟) [试验二] 自由驾驭调试目标(30分钟) |
第三部分:应用程序崩溃和用户态转储(2小时) | 介绍应用程序崩溃的完整过程和调试方法,转储的基本知识,如何使用ADPLUS自动产生用户态转储,以及分析用户态转储的常用命令和技巧,真实案例分析 [试验三] JIT调试和异常事件处理(30分钟) |
第四部分:栈调试 (1.5 hours) | 详细介绍栈的自动增长机制,栈帧的组织方法,并通过实例演示栈溢出攻击的原理,通过Windows 7系统的真实案例介绍基于Cookie的溢出检测机制 [试验四] 理解栈和栈溢出(30分钟) |
第五部分:多线程调试(2小时) | 进程与线程,使用WinDBG来调试多线程程序,同时调试多个进程,控制线程执行状态、观察同步对象、临界区,线程死锁死锁案例分析;CPU的LOCK前缀,互锁递增,同步机制比较 |
第六部分:堆调试(1.5小时) | 多层存储架构,内存管理器,内核态池,用户态堆,介绍调试内存有关的典型问题的方法和技巧,包括使用CRT堆和Win32堆的调试支持,分析内存泄漏、访问违例等,在探讨实践经验的同时会穿插重要的理论知识,包括Win32对和CRT堆的结构、内存管理常识、堆布局等,真实案例分析 [试验五] 使用UMDH定位内存泄漏(30分钟) |
第七部分:使用SOS扩展调试 .Net程序(2小时) | 使用WinDBG从操作系统层次来调试托管程序,了解托管模块的加载过程,托管程序的线程结构,及时编译(JIT)的工作过程和托管异常的工作原理;通过SOS扩展库来调试托管程序,包括加载SOS的方法、SOS的常用命令和如何观察托管堆上的对象等,案例分析 [试验六] 使用SOS调试托管程序(30分钟) |
第八部分:事件追踪和调优 (2小时) | 简要介绍ETW (Event Tracing for Windows) 机制的原理和在Windows系统中的重要地位,演示如何使用Windows Performance Toolkit (WPT) 来发现应用程序的热点和瓶颈,涵盖常用的调优工具,包括perfmon,任务管理器中的重要性能指标(Page Fault,Memory),xperf, xbootmgr, xperfview等 |
第九部分:VC编译器的调试支持(1.5小时) | 编译过程,编译器检查,静态检查工具,运行期检查,栈指针被破坏(Stack pointer corruption.),局部缓冲区(数组)越界(Overruns),栈被破坏(Stack corruption.),依赖未初始化过的局部变量,因为赋值给较短的变量导致数据丢失;调试版本的运行时,运行期检查的工作原理 |
第十部分:在调试器中理解C++对象模型(1.5小时) | 解析和观察方法表,虚函数的工作原理,对象的构造和析构,对象引用,对象作为函数参数,隐式创建临时对象,继承,接口 |
Jack Zhang
百林哲咨询(北京)有限公司专家团队成员
Jack Zhang
百林哲咨询(北京)有限公司专家团队成员
Jack Zhang
百林哲咨询(北京)有限公司专家团队成员
Jack Zhang
百林哲咨询(北京)有限公司专家团队成员
Jack Zhang
百林哲咨询(北京)有限公司专家团队成员
Jack Zhang
百林哲咨询(北京)有限公司专家团队成员
Jack Zhang
百林哲咨询(北京)有限公司专家团队成员