课程对象
使用C++语言开发Windows应用软件的软件工程师,或者相关项目的测试工程师、项目带头人和技术经理
课程形式
演讲 + 演示及动手实验
课程大纲
第一部分:Windows系统精要(1小时)
概述Windows操作系统的架构、系统组件(HAL、内核、执行体、Native进程和子系统)、重要的系统机制(内核服务调用、中断管理、内核对象等)以及主要数据结构(进程、线程、内核对象、设备对象等),并介绍进程、线程、操作系统的用户和内核空间等重要概念
第二部分:Visual Studio IDE的调试和优化支持(1.5小时)
编译过程,编译器检查,静态检查工具,运行期检查,栈指针被破坏(Stack pointer corruption.),局部缓冲区(数组)越界(Overruns),栈被破坏(Stack corruption.),依赖未初始化过的局部变量,因为赋值给较短的变量导致数据丢失;调试版本的运行时,运行期检查的工作原理,性能探测器,分析CPU使用率,分析内存使用率,使用性能向导定制分析过程
第三部分:WinDBG精要(1小时)
系统介绍 WinDBG的命令类型、基本使用方法、定制调试事件的方法和重要的调试命令,包括用户态调试和内核态调试的常用命令
第四部分:异常处理和应用程序崩溃(1.5小时)
结构化异常处理(SEH),C++异常处理,Windows的异常奋发机制,程序崩溃的完整过程和调试方法,转储的基本知识,如何使用ADPLUS自动产生用户态转储,以及分析用户态转储的常用命令和技巧
[试验一] WinDBG基础(15分钟)
[试验二] JIT调试和异常事件处理(30分钟)
第五部分:C++对象模型(1.5小时)
解析和观察方法表,虚函数的工作原理,对象的构造和析构,对象引用,对象作为函数参数,隐式创建临时对象,继承,接口
第六部分:深入理解栈 (1 hours)
详细介绍栈的自动增长机制,栈帧的组织方法,并通过实例演示栈溢出攻击的原理,通过Windows 7系统的真实案例介绍基于Cookie的溢出检测机制
[试验三] 理解栈和栈溢出(30分钟)
第七部分:多线程调试和优化(1小时)
C++程序中创建线程的多种方法,在VC和WinDBG中观察和操纵线程的方法,使用WinDBG来调试多线程程序和同时调试多个进程,包括控制线程执行状态、观察同步对象、分析死锁等;会穿插介绍多核和多处理器系统中的各种同步机制
第八部分:堆(1.5小时)
C++程序中动态分配内存的多种方法(malloc, new, HeapAlloc),介绍调试内存有关的典型问题的方法和技巧,包括使用CRT堆和Win32堆的调试支持,分析内存泄漏、访问违例和栈溢出等,在探讨实践经验的同时会穿插重要的理论知识,包括Win32对和CRT堆的结构、内存管理常识、堆布局等,真实案例分析
[试验四] 使用UMDH定位内存泄漏(30分钟)
第九部分:转储文件分析(1.5小时)
转储文件简介,产生转储文件的多种方法,AdPlus,崩溃模式和挂死模式,断点触发,分析转储文件的常用命令,最佳实践,真实案例解析
第十部分:事件追踪和调优 (1小时)
简要介绍ETW (Event Tracing for Windows) 机制的原理和在Windows系统中的重要地位,演示如何使用Windows Performance Toolkit (WPT) 来发现应用程序的热点和瓶颈,涵盖常用的有关工具,包括xperf, xbootmgr, xperfview等
第十一部分: 使用vTune调优(1.5小时)
要点:vTune背景,版本历史,关键组件,收集数据的方法,基本热点(Hotspot)分析,高级热点分析,符号文件和符号文件设置,自定义分析模板,观察线程切换细节(上下文切换和preempt),观察中断,手工设置Marker,案例分析