以下为Windows案例 |
案例:混合调试之右键菜单异常缓慢(90分钟) |
现场定位Windows资源管理器中右键菜单异常缓慢的原因,介绍如下知识和调试技巧:“本地程序中的托管来客”;混合代码情况下的未处理异常;栈溢出;浮点计算单元和浮点寄存器;浮点异常的延迟性;上下文扩展模块的注册方法;如何调试性能有关的问题。 |
实验:转储分析之寻找右键菜单缓慢原因(30分钟) |
案例:堆损毁导致的随机崩溃(60分钟) |
以一个典型的因为字符串类使用不当而导致的堆错误为例,深刻理解进程中的多个CRT堆,堆管理器的脆弱之处,字符串类分配内存的方法,静态链接和动态链接可能产生的影响;分享使用堆的最佳实践。 |
案例:转储分析之应用程序随机崩溃(60分钟) |
以某真实商业软件的低概率崩溃留下的转储文件为例,介绍应对应用程序崩溃的常用调试方法和有关的知识和调试技巧:JIT调试,WER和崩溃转储,没有源代码的情况下定位崩溃点和崩溃原因。 |
案例:随机崩溃之无效句柄(90分钟) |
解析一个因句柄使用不当而导致的应用程序崩溃问题,介绍如何从没有源代码的系统函数入手寻找线索。并介绍Windows系统中关于句柄的调试机制和用法。 |
案例:应用程序挂死之陷在内核态(90分钟) |
以Office程序普遍存在的DDE问题为例,介绍如何结合用户态调试与内核态调试两种手段发现负责软件问题的根本原因;并介绍如何在没有源代码和私有符号的情况下分析函数的参数和理解程序的执行内幕。 |
实验:拯救挂死的PowerPoint(30分钟) |
案例:.Net程序调试之SDK安装程序死循环(90分钟) |
分析真实案例——Windows 7 Platform SDK安装程序因为异常处理不当而意外陷入死寻坏,熟悉如下调试工具和技巧:使用WinDBG + SOS扩展分析.Net程序的转储文件;使用ildasm反汇编.Net程序,理解基本的中间代码;理解异常处理机制;思考异常处理机制的深层风险——引入不确定的程序出口。 |
案例:转储分析之双重错误(90分钟) |
分析因为双重错误(Double Fault)而导致的Windows系统崩溃,理解如下知识点:操作系统的任务切换机制;CPU的硬件任务切换;内核态栈溢出;任务状态段TSS,内核态栈溢出; CR2寄存器;CR3寄存器。 |
实验:分析内核态栈溢出导致的系统崩溃转储(30分钟) |
以下为Linux案例 |
案例:文件数据意外混乱(90分钟) |
:分析因为标准文件句柄误用而导致的后台服务进程与驱动程序之间的通信数据混乱案例,介绍如下知识点和调试方法:Daemon,Linux Driver,使用虚拟文件系统与用户态模块通信,标准文件,kprint, dmesg。 |
案例:后台服务因段错误崩溃(90分钟) |
现场演示和分析Linux后台服务意外崩溃的原因,介绍调试Linux下应用程序崩溃的三种常用方法:GDB、dmesg + map文件、插入代码JIT调试。本案例介绍的知识点有:段错误的内在原因,信号和信号处理器,函数调用协议,C标准中关于无原型函数的处理方式,空指针,使用GDB分析栈的常用命令。 |
实验:定位导致段错误的原因(30分钟) |