分类:
软件调试有多种分类方法。
按调试目标的系统环境分 - Windows下调试,Linux下调试,DOS下调试等等。
按目标代码执行方式分 - 脚本调试(不需要编译的语言),需要编译的又分位俩种 - 1. 先编译为中间代码,在运行时候再动态编译成目标代码的,称为托管调试,2. 直接编译和链接成目标代码的,称为本地调试。两种混合起来i一起调试的叫混合调试。
按目标代码执行模式分 - 用户态调试, 内核态调试。
按调试器跟调试目标的相对位置分 - 本地调试,远程调试。
按调试目标的活动性分 - 活动目标调试,转储文件调试(Dump文件)。
按调试工具分 - 使用调试器的软件调试,不使用调试器的软件调试。
调试技术概览:
1. 断点
几种分类,
根据断点的设置空间分:
代码断点:设置在内存空间,地址是某一段代码的起始处。
数据断点:设置在内存空间,地址是要监视数据的起始地址。
I/O断点:设置在I/O空间,地址为某一个I/O地址。当程序访问指定I/O端口的时候中断到调试器。跟数据断点一样,都可以设置触发时候的访问宽度。
根据断点设置方法分:
软件断点:向指定的代码位置插入专用的断点指令,比如INT 3。
硬件断点:通过设置CPU的调试寄存器来设置。IA32 CPU定义了8个调试寄存器,DR0-DR7,可以同时最多设置4个硬件断点(对于一个调试会话)。通过硬件断点可以设置任意的设置空间的断点,但是断点指令只能设置代码断点。
当中断到调试器时,系统或者调试器会将被调试程序的状态保存到一个数据结构中,称为上下文context。
追踪点tracepoint是断点的一种衍生形式。基本思路是当设置一个追踪点时,调试器内部会当作特殊的断点来处理。当执行到追踪点的时候,系统会向调试器报告断点事件,在调试器收到后,会检查内部维护的断点列表,发现目前发生的是追踪点后,便执行这个追踪点所定义的行为,通常是打印提示信息和变量值,然后直接恢复被调试程序执行。所以调试者感觉不到被调试程序中断到调试器的过程。
条件断点: 当用户设置了一个条件断点时,调试器实际插入的还是无条件断点,在断点命中,调试器收到调试事件后,调试器会检查这个断点的条件,如果满足就中断,否则恢复被调试程序。
2. 单步执行
分为单步指令,单步代码句,单步分支和单步任务(多线程使用)。
3. 输出调试信息
打印和输出调试信息是简单而古老的软件调试方法,基本思想是用代码把信息以文本的形式输出到一个可观察的地方比如控制台,窗口,文件,或者调试器。
优点:简单方便,不依赖于调试器跟复杂的工具。
缺点:需要添加代码,影响执行效率,信息有限,容易泄漏程序技术细节。
在Windows系统中,驱动程序可以使用DbgPrint/DbgPrintEx来输出调试信息,应用程序可以使用OutputDebugString,控制台程序可以使用print函数来打印。
4. 日志
与输出调试信息类似,基本思想是编写程序的时候加入特定的代码将程序运行状态信息写到日志文件或者数据库。Windows系统提供了基本的日志记录,观察和管理功能Event Log。
5. 事件追踪
3跟4都是以文本形式的,不适合处理数据庞大且速度要求高的情况。事件追踪机制Event Trace正是针对这个需求设计的, 它使用二进制形式来记录数据,观察时再转化成问基本形式。适用于监视频繁且复杂的软件过程,比如监视文件访问,网络通信等。ETW (Event Trace for Windows)是Windows内建的一种,很多WINDOWS下的工具比如TCPIPView都使用了该机制。
6. 转储文件
转储文件用于将发生问题的时候系统状态像拍照片一样保存下来,分为小,中,大几种规格,最小的叫Mini Dump。WINDOWS S提供了为应用程序和整个系统产生转储文件的机制,可以在不停止程序或者系统运行的情况下生成转储文件。
7. 栈回溯
目前主流CPU架构都是使用栈来进行函数调用的,栈上记录了函数的返回地址,因此通过递归寻找放在栈上的函数返回地址,就可以找到当前线程的函数调用序列,产生
call stack。因为返回的只是地址,所以可以通过调试符号文件symbol将返回地址翻译成函数名。
8. 反汇编
将目标代码翻译成汇编代码。有很多工具,比如IDA, interactive disassembler。
2万+



被折叠的 条评论
为什么被折叠?



