一.序言、
软件调试技术的意义:
1. 在调试上花费时间很多
2. 调试可以解决很多问题,是强大的工具
3. 调试是有稳定的生命周期
4. 调试也是学习技术的好工具
调试窗口:
BreakPoints. Watch, Local, Call Statck, Memory, Disassembly(反汇编)等
常用快捷键:
设置/取消断点: F9
步入:F11
步过:F10
跳出:Shift + F11
参数设置:需要设置工作目录,启动参数等
工程设置中的注意点:关掉编译优化和不关闭编译优化,汇编指令是不一样的。
参数化:Debuging中Command Arguments中输入参数:this is a test
二. 提高篇
断点:
调试器设置断点的原理:
将指令的第一个字节保存,写入一条INT3指令
在配置文件中只是记录断点位置,在实际执行时候替换
高级语言调试器调试生成多条汇编指令,但是并不是执行一条汇编指令就中断一次,而是针对源代码执行一行中断一次
软件编译过程
编译:
编译期检查:编译错误,警告
运行检查:
Run time Error Check
栈指针检查
局部栈缓冲越界检查:检查Cookie值:若缓冲区溢出,则会将Cookie值覆盖导致检查Cookie不通过,自动中断
未初始化的局部变量检查
存储调试符号的文件:
单独的符号文件:PDB
存放在可执行文件中
调试符号:
Global Variables
Local Variables
函数名和函数入口地址
FPO数据(精确定位到源代码行)
符号文件:KERNEL32.PDB文件
符号文件产生过程:在编译过程中产生PDB和PE文件
常用调试器:
WinDbug:
若无符号文件,则只可做二进制文件调试
存在符号问件时,需要加入微软服务器地址以及本地符号文件地址,F9设置断点调试,比VS调试简单些
Softice
OllyDbg:
在没有源代码和符号文件时,运用该工具查看汇编代码
Syser
WinDBG,Kd之类的内核调试器:通过穿行发送格式数据包来进行联系
远程调试:
在本机中调试其它机器上的程序
目标机设置:
安装VS Remote Debuging Monitor
运行VS Remote Debuging Monitor,选择:Tools->Options中的远程调试模式
VS2005设置:在属性-Debuging中设置
实用篇---调试技巧
条件断点:
被频繁调用的子函数,循环和多线程可使用条件断点
F9设置断点,Alt + F9 进入BreakPoints,选中条件断点并输入条件表达式
内存断点:
F9设置断点,进入调试模式
Debuing New Breakpoint, New Data Breakpoint
写入监视地址:0x12345678或者 &i形式均可
让程序继续执行,当指定地址的内存内容被改变时,中断发生
MessageBox大法
不方便用调试模式启动的程序可以添加一个MessageBox
查看时间日志
部分无法正常启动的程序
函数退出时崩溃
一般是缓冲区溢出导致,可以注释掉部分代码逐步缩小范围定位错误
释放内存时崩溃
内存被重复释放等导致
查看程序链接依赖的动态链接库:
eXeScope工具
实例篇--崩溃分析
应用程序崩溃:
捕捉dump
Windbug分析步骤:
打开dump,加载符号文件,执行 !analyze -v指令(分析出错误的位置),查看结果
蓝屏:
蓝屏信息包括:
错误描述
建议措施
技术信息(停止码)
转储dump信息
认识蓝屏:
是Windows系统终极错误报告方式
操作系统检测到威胁系统安全的行为或者情况,继续运行可能导致严重错误,是操作系统的积极动作
蓝屏原因:
错误驱动
硬件错误
内核代码中的bug以及未处理的异常
应用层程序和内核层程序开发的区别:
应用层程序出错可以直接关闭,结束程序,造成的危害相比与内核层程序错误来说较小,内核层程序出错会造成蓝屏,停止运行,一般是驱动程序bug造成的。内核层程序的编写需要更加谨慎。