发信人: sanvador()
整理人: webfan(2000-08-08 20:48:31), 站内信件
|
第三章 SoftICE教程
介绍
本教程给你一个亲手调试Windows程序的经验,教你调试应用程序和驱动程序的基 本步骤。在调试过程中,你将学会下面的的技能:
载入SoftICE
构造一个程序
装入程序的源码和符号文件
跟踪和逐步调试汇编码
看本地数据和结构
设置目标断点
使用SoftICE信息命令读程序的状态
处理符号和符号表
修改断点以使用条件表达式
本教程的每一小节都与前面的小节相关,所以你应按顺序学习。
教程所使用的样本文件是GDIDEMO程序。GDIDEMO是一个演示GDI功能的程序。它在 光盘上的\EXAMPLES\GDIDEMO目录下。它也可以从\mstools\samples\win32\GDID EMO下得到。如果GDIDEMO位于光盘上,将它拷入硬盘。
你可以用其它的样本程序或自己设计的程序来替换它。本教程使用SoftICE调试的 原理和特性可以应用到许多程序中去。
注意:在本教程中使用的程序是基于Windows NT的。如果你使用Windows 95的话 ,输出可能会有些许的不同。
载入SoftICE
如果你在Windows 95或Windows NT的Boot、System、Automatic模式下运行SoftI CE,它会在启动或重启计算机的时候自动载入。如果你在Windows NT下使用Maua l Startup模式,SoftICE不会自动载入。
在Windows 95下载入SoftICE,键入命令:WINICE。在Windows NT下载入SoftICE ,需要:
1. 选择START SOFTICE(开始SoftICE)
2. 键入命令:NET START NTICE
注意:一旦你装入了SoftICE,除非重启计算机,否则你将不能卸载SoftICE。
检验SoftICE是否装入了,按SoftICE的热键CTRL+D。SoftICE的窗口将弹出。返回 Windows操作系统,使用X(exit)或G(go to)命令(F5)。
构造GDIDEMO样本程序
准备调试Windows应用程序的第一步是构造它的调试信息。样本程序GDIDEMO的ma kefile(构造文件)已经设置好了。
构造样本文件的步骤:
1.启动DOS壳(就是打开DOS窗口)。
2.有样本文件的路径下。
3. 执行NMAKE命令:
C:\MSTOOLS\SAMPLES\WIN32\GDIDEMO>NMAKE
(讨论...我始终不明白这个NMAKE命令为何要这样执行。这个命令好象是把GDID EMO的输出显示放到NMAKE这个文件中去。在MASM中也有一个NMAKE.EXE的文件,是 关于程序维护的东西。因为我没有GDIDEMO文件。不过我认为一定是它有什么特殊 的输出。)
如果GDIDEMO位于其它路径下,改变到合适的路径中去。
装入GDIDEMO样本程序
载入一个程序并从程序的调试信息中建立符号文件,然后将符号文件和源文件载 入到SoftICE中。要载入GDIDEMO程序需要如下步骤:
1. 启动Symbol Loader。
2. 从File菜单下选择OPEN MODULE(打开模块)或单击OPEN按纽。打开文件窗口 弹出。
3. 选择GDIDEMO.EXE然后点击OK按纽。
4. 从Module菜单下选择LOAD或单击LOAD按纽装入GDIDEMO。
Symbol Loader将调试信息翻译成.NME符号文件。装入符号文件和源文件,启动G DIDEMO,打开SoftICE窗口,显示了GDIDEMO.C文件的源代码。
控制SoftICE屏幕
SoftICE窗口使看信息和调试的场所。它提供了多达7个的窗口和帮助行使你读以 及控制调试过程中的不同部分。缺省情况下,SoftICE显示如下部分:
本地窗口--显示并展开分布在堆栈中的变量
代码窗口--显示源代码或反汇编码
命令窗口--输入命令并显示信息
帮助行--提供关于SoftICE命令行的帮助和活动地址内容
1. 看代码窗口的内容。注意SoftICE在第34行显示WinMain例程。缺省情况下, SoftICE载入程序后所遇到的第一个主模块中建立一个断点并停在那里。
2. 要看SoftICE载入的所有源文件,键入FILE命令和通配符:
:FILE *
SoftICE显示GDIDEMO的源文件:draw.c, maze.c, xform.c, poly.c, wininfo.c , dialog.c, init.c, bounce.c和gdidemo.c。命令行窗口的大小按你所打开的窗 口数量而定,所以你可能无法看见全部的文件名。要显示剩下的文件名,按任意 键。(参考第五章)。
3. 许多SoftICE窗口可以滚动。如果你有鼠标,你可以单击滚动箭头。没有的话 ,SoftICE提供了一系列的按键让你滚动指定的窗口。用如下的方式滚动代码窗口 :
窗口滚动方式 按键 鼠标
到前一页 PageUp
到下一页 PageDown
到上一行 UpArrow
到下一行 DownArrow
向左移一个字符 Ctrl+LeftArrow
向右移一个字符 Ctrl+RightArrow
4. 在U命令下输入EIP,对当前指令点反汇编:
:U EIP
你也可以使用点(.)命令完成同样功能。
通过源码跟踪和逐步调试
下面的步骤教你如何使用SoftICE去跟踪源代码:
1. 输入T命令或按F8键去跟踪一条指令。
:T
执行过程到下一条指令并突出显示它。现在你可以看到如下显示:
if(!hPrevInst)
2. 代码窗口当前显示源代码。它也可以显示汇编码或者两者混合显示。要看混 合代码,使用SRC命令:
:SRC
注意每一行源代码都跟着相应的汇编指令。
3. 按F3看汇编码,再按一次看源码。
4. 输入T或按F8键去跟踪下一条指令。
执行到RegisterAppClass这一行。
正如这一步所展示的,T命令执行一条源代码或汇编指令。你可以使用P命令(F1 0)来完成一个程序段。它们之间有很大的不同。如果你逐步跟踪到指令中的调用 中去了,在调用结束之前无法返回到调用的位置。(我插一句,就是说P指令可以 直接完成调用的程序段,执行到调用语句的下一语句上。)
提示:如果调用的源代码不存在的话,T命令不会进入到调用中去。典型的例子就 是Win32 API调用。如果跟踪时所调用的源码没有的话,使用SRC命令转换到混合 或汇编模式。
读本地数据
本地窗口显示当前的堆栈结构。本例中它包含WinMain函数的本地数据。下面介绍 了如何使用本地窗口:
1. 输入T命令进入RegisterAppClass函数。本地窗口为空,因为还没有为这个函 数分配数据。
RegisterAppClass函数的实现是在INIT.C文件中。SoftICE在代码窗口的左上角显 示当前源文件。
2. 再输入T命令。
本地窗口包含了传递到RegisterAppClass的参数(hInstance),和局部结构体w ndClass。WndClass的结构标志是一个加号(+)。这个加号表示你可以展开结构 体以浏览其内容。
注意:你也可以展开字符串和数组。
3.如果你的处理器是奔腾型号的,你可以用鼠标双击WNDCLASSA结构以展开它。 要迭起wndClass,双击它即可。
3. 使用键盘来展开结构体:按Alt+L移动光标到本地窗口,用UpArrow和DownAr row将亮条移到wndClass结构体上,按回车键。再按回车迭起它。
-------------------------------------
今天闹肚子,让我感觉生不如死。呵...睡了十五、六个小时,真是过瘾。
精神不是很好...所以翻译的速度慢了,心情也很沮丧。
所以今天就此结束...明天,也许会更好。
-- 无意苦争春
一任群芳妒
零落成泥碾作尘
依旧香如故
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.137.190.129]
|
|