1.课程名:对抗软件瑕疵的最佳实践
2.作者:张银奎(Raymond Zhang)
3.作者简介:
>15年编程经历
《软件调试》作者
译作:《机器学习》《观止--微软创建NT和未来的夺命狂奔》
《程序员》杂志调试之剑专栏作者
作者更具体的介绍通过http://www.msup.com.cn/solutions/Expert-ZhangYinkui查看
4.培训时间2012/04/20-04/21
后感:两天的培训,如果说学到了什么具体的技术知识,那倒真没有,大部分的时间都只是在接收讲师所传递的一种“可调试化设计”思想,
感叹讲师的无比强大之外,也认识到windows系统完美的可调试化设计,可惜的是他不是做linux/ninux方面的专家,只字没提及linux/ninux方面的东西!
日程
1。软件瑕疵概览
2。软件瑕疵的成本曲线
3。软件的根本
4。D4T和D4D
5。可调试设计--设计
6。程序员强则软件强--开发
7。观止(Showstopper)--测试
8。自动诊断和远程报告--售后
demo 寻找win7 "发疯"的原因
讲师通过自己发现的win7 bug演示了一个缓冲区溢出的案例,具体bug好象是与电源服务有关,时间过的太久了,记不太清了.
stack frame -栈帧
1。供函数使用的一块连续栈区域
2。父函数在下方
3。子函数在上方
4。函数返回即释放
5。常用EBP来记录栈帧基地址
6。FPO(帧指针省略)
缓冲区溢出
栈是向低地址方向生长的,向缓冲区写入超过其容量的内容可以覆盖栈上的函数返回地址,使函数返回到意外的地方--栈溢出攻击便基于此
如何从栈回溯看出溢出
1。异常的函数返回地址
2。观察栈帧长度
3。观察栈帧使用情况
基于cookie的安全检查
1。在栈帧的起始处存放一个整数--cookie
2。visual studio .net 2002开始支持
3。windows server 2003 首先采用
4。编译时,指定/GS选项, 默认启用
5。发布版本和调试版本都可以使用
6。编译时会判断是否有很必要对当前函数使用cookie
7。函数返回时检查cookie的完好性,如果损坏则报告
启示
努力打造逻辑完备、无懈可击的代码,切忌掉以轻心或者想当然
标准标注语言
Standard Annotation Language(SAL)
__CRT_INSECURE_DEPRECATE_MEMORY(memcpy_s)void *
__cdecl memcpy(__out_bcount_full_opt(_Size)void *_Dst,
__in_bcount_opt(_Size) const void *_Src, __in size_t _Size);
#if __STDC_WANT_SECURE_LIB__
_CRTIMP errno_t __cdecl
memcpy_s(__out_bcount_part_opt(_DstSize, _MaxCount)void *_Dst,
__in rsize_t _DstSize, __in_bcount_opt(_MaxCount) const
void *_Src, __in rsize_t _MaxCount);
#endif
安全的CRT函数, xxx_s()
启示
软件的根本在代码,不要脱离代码来讨论软件问题
启示
代码的根本在程序员,程序员的素质相差悬殊,在软件工程师的论证体制完善前,如何甄选程序员是项目经理要练就的关键功夫
好程序员与差程序的产出比是1:28
JTAG
1。Joint Test Action Group
2。成立于1985年
3。JTAG的Test Access Port and Boundary Scan Architecture(测试访问端口和边界扫描架构)提议
于1990年被IEEE批准,简称为IEEE 1149.1-1990
4。CPU普遍采用
NT的经验
调试设施遍布整个系统
1。内核
2。执行体
3。系统进程
4。系统服务
5。系统DLL
6。应用程序
微软的软件强在哪里?我认为是从里到外的可调试性。这种特性赋予产品持续改进的能力,使其可以不断提高,后来居上。
典型技术
1。消息输出
2。日志转储
3。栈回溯
4。断言
5。验证
6。认证
7。自检
8。自动报告
WER
9。性能计数器
10。Telemetry
目标
1。可见度
2。可控制性
可配置性,可重现性
3。可诊断性
可辨识性,一致和稳定性
4。自动报告和辅助诊断
Windows Error Reporting(WER), CER, Telemetry
5。让错误跳出来,而不是藏起来