Windows调试技术基础

一.序言、

软件调试技术的意义:

1. 在调试上花费时间很多

  2. 调试可以解决很多问题,是强大的工具

  3. 调试是有稳定的生命周期

  4. 调试也是学习技术的好工具

    调试窗口:

BreakPoints. Watch, Local, Call Statck, Memory, Disassembly(反汇编)

   常用快捷键:

设置/取消断点: F9

步入:F11

步过:F10

跳出:Shift + F11

   参数设置:需要设置工作目录,启动参数等

   工程设置中的注意点:关掉编译优化和不关闭编译优化,汇编指令是不一样的。

   参数化:DebugingCommand Arguments中输入参数:this is a test

二. 提高篇

断点:

调试器设置断点的原理:

将指令的第一个字节保存,写入一条INT3指令

在配置文件中只是记录断点位置,在实际执行时候替换

高级语言调试器调试生成多条汇编指令,但是并不是执行一条汇编指令就中断一次,而是针对源代码执行一行中断一次

软件编译过程

编译:

编译期检查:编译错误,警告

运行检查:

Run time Error Check

栈指针检查

局部栈缓冲越界检查:检查Cookie值:若缓冲区溢出,则会将Cookie值覆盖导致检查Cookie不通过,自动中断

未初始化的局部变量检查

存储调试符号的文件:

单独的符号文件:PDB

存放在可执行文件中

调试符号:

Global Variables

Local Variables

函数名和函数入口地址

FPO数据(精确定位到源代码行)

符号文件:KERNEL32.PDB文件

符号文件产生过程:在编译过程中产生PDBPE文件

常用调试器:

WinDbug

若无符号文件,则只可做二进制文件调试

存在符号问件时,需要加入微软服务器地址以及本地符号文件地址,F9设置断点调试,比VS调试简单些

Softice

OllyDbg

在没有源代码和符号文件时,运用该工具查看汇编代码

Syser

WinDBGKd之类的内核调试器:通过穿行发送格式数据包来进行联系

远程调试:

在本机中调试其它机器上的程序

目标机设置:

安装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造成的。内核层程序的编写需要更加谨慎。

你可能感兴趣的:(多线程,windows,优化,汇编,工具,程序开发)