《Using SoftICE》 第七章 使用断点 (一)

断点<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

u?????? 介绍

u?????? 支持类型

u?????? 虚拟断点

u?????? 设置断点动作

u?????? 条件断点

u?????? Elapsed Time

u?????? 断点统计表

u?????? 断点表达式

u?????? 操作断点

u?????? 使用嵌入式断点

?

1.?? 介绍

SoftICE可以在程序运行、内存读写、中断和I/O端口读写时设置断点。SoftICE给每个断点分配了一个范围从0FF的索引号,你可以使用断点索引来设置、删除、禁止、enable和修改它们。

所有的SoftICE断点都具有粘性(原文:sticky),也就是说,除非你用BC或者BD命令清除或者禁止它,SoftICE会一直跟踪和维持这个断点。清除断点可以用BH命令查看,这个命令显示断点历史。

SoftICE可以同时建立32个断点,但是由于x86处理器的限制,内存和I/O端口的断点总数不能超过4个。

如果有符号信息,你还可以利用函数名建立断点。在源代码或者混合模式下,你可以在代码行上建立point-and-shoot风格断点。一个比较有用的特性就是你能在模块加载前为它建立point-and-shoot断点。

?

2.?? 支持类型

SoftICE充分利用x86框架,提供了一组强大的断点功能:

——运行断点(Execution Breakpoints):SoftICEINT3替换一个现有指令。可以用BPX命令建立运行断点。

——内存断点(Memory Breakpoints):当某些确定的字节//双字被读写或者运行时,SoftICE利用x86的调试寄存器来进入中断。可以用BPM命令建立内存断点。

——中断断点(Interrupt Breakpoints):SoftICE通过修改IDTInterrupt Descriptor Table)向量来拦截中断。可以用BPINT命令建立中断断点。

——I/O断点(I/O Breakpoints):SoftICE利用PentiumPentium-Pro CPU提供的扩展调试寄存器查看进入一个特定端口地址的INOUT指令来实现中断。可以用BPIO命令建立I/O断点。

——窗口消息断点(Window Message Breakpoints):当一个特定的或者一个范围内的消息到达窗口的时候,SoftICE实现中断。实际上它不是一个基础断点,而仅仅是建立在其它断点上的一个非常方便的断点类型。可以用BMSG命令建立窗口消息断点。

?

2.1. 断点选项

对于所有的断点命令,即BPXBPMBPIOBPINTSoftICE允许命令修饰符来限制断点范围。在Windows NT/2000/XP下允许.t.p修饰符。比如说,如果当前进程IDPID)是0x200,你在SoftICE中输入BPINT.p 2e,那么当PID0x200的进程遇到int 2e断点的时候,SoftICE就会弹出;相对的,如果仅仅输入BPINT 2e,所有的进程只要遇到int 2e断点,SoftICE都会弹出。

命令修饰符

说明

.t

设置一个针对当前活动的线程的断点

.p

设置一个针对当前活动的进程ID的断点

.a

设置一个针对当前活动的地址上下文的断点

.v

设置一个针对当前活动的VMM ID的断点

1 SoftICE命令修饰符

?

可以用以下两种选项来限制断点:

——条件表达式[IF expression]:当表达式为非零(TRUE)时,断点就被触发了。

——断点动作[DO “command1;command2;…”]:当断点触发时,自动运行一套SoftICE命令,可以用用户自定义宏实现。

?

2.2. 运行断点

运行断点在代码的函数调用或者语句声明处中断,这是使用频率最高的断点类型。SoftICE将一个现有的指令替换成INT 3指令,当运行到INT 3断点处时,SoftICE就能取得控制权。

SoftICE提供了两种方式建立运行断点:使用鼠标和BPX命令。

2.2.1.??? 使用鼠标建立断点

如果你使用Pentium处理器和鼠标,就可以用鼠标建立和清除point-and-shoot (sticky)one-shot断点。要建立一个sticky断点,双击你想建立断点的代码行,SoftICE就会高亮显示这行,表示你建立了一个断点,再次双击可以清除这个断点。要建立了一个one-shot断点,点击你想建立断点的代码行,然后用HERE命令(F7)建立断点,SoftICE就会运行到这一行。

?

2.2.2.??? 使BPX命令建立断点

使用BPX命令以及跟随的参数建立一个运行断点:

BPX [address] [IF expression] [DO “command1;command2;…”]

比如,为应用程序的函数WinMain建立断点,使用这个命令:

BPX WinMain

使用不带参数的BPX命令可以为源代码建立point-and-shoot运行断点。按Alt-C将光标移到代码窗口,然后用箭头键将光标移到你想要建立断点的代码行,最后输入BPX命令(F9)。如果你想用鼠标建立断点,用滚动箭头滚动代码窗口,然后双击你想要建立断点的代码行。

?

2.3. 内存断点

内存断点利用386和其后系列的CPU出现的调试寄存器,监视对某些内存区域的访问。在找到程序变量什么时候,什么地方被改变和为只读内存建立运行断点的时候,这类断点非常有用。因为CPU只包含四个调试寄存器,所以同时只能建立四个内存断点

BPM命令建立内存断点:

BPM[B|W|D] address [R|W|RW|X] [debug register] [IF expression] [DO “command1;command2;…”]

BPMBPMB ???? ——建立一个字节大小断点

BPMW ??????????????? ——建立一个字大小断点

BPMD ???????????????? ——建立一个双字大小断点

R, W, and RW ????? ——当读、写或者读写的时候中断

X ??????????????????????? ——在运行时中断;因为内存不会改变,所以它比BPX更加强大,使用这个选项,可以在ROM内和非当前的地址上建立断点。

debug register ????? ——指定使用哪个调试寄存器。除非你在特别环境下必须手动指定,SoftICE通常都会为你管理这些调试寄存器的。

?

以下这个例子建立了一个内存断点,当一个双字变量MyGlobalVariable被设置成5时,中断被触发。

BPMD MyGlobalVariable W IF MyGlobalVariable==5

如果BPM指定的内存目标经常被访问,不管表达式是否为FALSE,执行性能都会被降低。
阅读更多
想对作者说点什么? 我来说一句

SOFTICE帮助文档

2010年05月30日 7.85MB 下载

SOFTICE教程及使用手册

2008年11月16日 389KB 下载

softice 用户手册中文版

2009年01月16日 203KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭