SoftICE for WIN95中文命令解说(二)
继续整理SoftICE的命令集,这次聚焦在断点管理相关的几个关键指令。搞调试的人都知道,断点就是调试的“锚点”,用得好,事半功倍。下面这些命令,从清除、禁用、恢复到历史记录,一个都不能少。
BC——清除断点
作用:清除一个或多个断点。
语法:BC list | *
用法:清除之后,用BL命令就再也看不到这个断点了,而且它也不再起作用。注意,这是彻底删除,不是暂时禁用。
参数:
- list:可以指定多个断点,用空格或逗号隔开。
- *:清除所有断点。
点评:BC = Breakpoint Clearing,简单粗暴,直接删干净。
BD——禁用断点
作用:使一个或多个断点失效,但保留其定义。
语法:BD list | *
用法:和BC不同,BD只是让断点暂时“休眠”,用BE命令可以随时唤醒。而BC是彻底删除,没法恢复。
参数:
- list:单个或一系列断点,空格或逗号隔开。
- *:禁用所有断点。
点评:BD = Breakpoint Disabling,相当于给断点戴了个“暂停”牌。
BE——恢复断点
作用:使一个或多个被禁用的断点重新生效。
语法:BE list | *
用法:专门用来恢复之前用BD命令禁用的断点。注意,每次新定义或编辑断点时,系统会自动把它设为有效状态,所以BE通常只对有BD历史的断点有意义。
参数:
- list:单个或一系列断点,空格或逗号隔开。
- *:恢复所有被禁用的断点。
点评:BE = Breakpoint Enabling,秒级唤醒。
BH——历史断点管理
作用:在SoftICE的历史数据库中显示或选择曾经设过的断点。
语法:BH
用法:执行BH后,SoftICE会弹出一个列表,每行是一个以前用过的断点。用上下光标键定位,按INSERT键选中,再按ENTER确认,按ESC取消。SoftICE只记录最近的32个断点,而且只在Windows正常退出时才会写入WINICE.BRK文件。这里有个坑:如果MSDOS.SYS中配置的是BootGUI=1(默认启动方式),那么关机时控制权不会回到SoftICE手里,断点记录就丢了。所以,想要完整记录,得把BootGUI设为0。
点评:注意,SoftICE只在SHUT DOWN时记录,如果使用“重新启动并切换到MS-DOS方式”再退出,那就不行——至少V3.20版本如此。而且,如果这么操作后再用EXIT退回到Windows,很容易出现VxD连接错误,因为WINICE并没有完全退出内存(用MEM.EXE可以看到)。所以,建议在MSDOS.SYS里把BootGUI置为0。如果不想每次开机都敲WIN,可以在AUTOEXEC.BAT里加个WIN.COM(注意别在WINICE.EXE后面再加WIN,那是画蛇添足)。如果只是偶尔用SoftICE,也可以每次启动Windows后,再重新启动并切换到MS-DOS方式,然后运行WINICE.EXE,这样也能记录。BH的好处是省纸省笔,下次重调同一个程序时,不用再挖空心思回忆断点。
BL——列出当前断点
作用:显示当前所有已设置的断点。
语法:BL
用法:BL命令会列出每个断点的序号、类型、是否被禁用等信息。如果某个断点被禁用了,序号后面会带一个“*”号(比如用BD命令产生的效果)。这个序号在BC、BE、BD等命令中都会用到。
点评:BL = Breakpoint Listing,一目了然。
BMSG——消息断点
作用:在Windows消息上设置断点。
语法:BMSG window-handle [L] [begin-msg [end-msg]] [IF expression] [DO "command1;command2;..."]
用法:参数说明:
- window-handle:消息发向的窗口句柄,是唯一必填项。
- begin-msg:消息标识符的范围。如果只给一个,则只对那个消息下断点;如果给了begin-msg和end-msg,则对区间内的所有消息下断点。
- end-msg:见上。
- IF expression:当表达式为真时,SoftICE才弹出。
- DO "command1;command2;...":到达断点时自动执行的一系列SoftICE命令。
- L:表示不弹出SoftICE,而是在命令窗口中记录Windows消息。
窗口句柄可以用HWND命令查看,消息标识符可以用WMSG命令查看,可以是16进制数,也可以是习惯的写法,比如WM_CREATE。SoftICE弹出后,会停在处理该消息的过程的第一句代码上。
点评:BMSG = (set) Breakpoint on Message。Windows本身是消息驱动的,跟踪一个消息往往能得到很底层的答案。我主页上那篇“修改RICHWIN4.3”的文章就是个好例子。
BPE——编辑已有断点
作用:编辑一个已经存在的断点。
语法:BPE index_number
用法:index_number是断点的序号,用BL命令可以看到。BPE可以很方便地修改已有断点,但有个陷阱:执行BPE时,它会先清除你指定的断点,然后再把修改后的版本使能。如果你在修改时按ESC键退出,原来的断点就没了;如果修改错误,结果也一样——原断点消失。
点评:小心使用,建议先备份或记下原参数。具体用法可参考后面的BPT命令。
