阅读:1952回复:11
SoftIce问题
你好:
我是驱动初学者,现在基本上掌握了驱动开发工具的使用,想学习一下调试工具,据说softice是最好的调试工具,单机上就能debug,我试了一下,发现它不能象在应用程序里单步调试那样简单好用。 当程序单步执行时,我想看某个变量的当前值该怎么做?比如如下语句: 1、int a; 2、a = 5; 现在执行完第二行,我想看变量a的值,在linux的gdb里可以用“p a”就可以看到了。在softice里我试过“watch a”、“d a”、“hex a”、“local a”……很多很多,总之我没办法看到这个变量的值,我该怎么办? 当驱动写好后编译成.sys文件,怎样让这个文件运行起来(只有运行起来才能用softice调试),当然不能象我原来的愚笨做法――把它安装到操作系统里,饱受死机的苦痛。driver monitor好象不能启动WDM驱动程序,WDM驱动可以用工具启动它吗? 还有哪些调试工具可以使用呢?windbg、dbgprint、driver monitor分别是什么工具?好用吗? |
|
|
沙发#
发布于:2002-07-04 16:01
问题好多呀。 ;)
多看看贴子,还有帮助,问题就会少很多的。 watch a是正确的方法,可能是其他原因才看不见。 driver monitor,选Open Driver,然后Start Driver |
|
板凳#
发布于:2002-07-04 16:58
arthurtu 你好:
谢谢你给我的回答,这个问题我还是不能解决: “当驱动写好后编译成.sys文件,怎样让这个文件运行起来(只有运行起来才能用softice调试)”,我用driverMonitor试过,提示如下错误:“ERROR(1058):The driver is marked as disabled(Start=4)in its service database entry.”在注册表中的Start设置为“3”。是不是DriverMonitor不能加载WDM的驱动啊? |
|
|
地板#
发布于:2002-07-05 09:29
怎么会呢?
我立刻试了一个WDM的driver,可以open和start的。并且monitor会在registry生成一个service的。 你reboot看看 |
|
地下室#
发布于:2002-07-05 13:11
arthurtu 你好:
谢谢你给我的回复,我用DriverMonitor测试时,先用open打开一个.sys文件,然后点“start”,然后提示如下错误:“ERROR(1058):The driver is marked as disabled(Start=4)in its service database entry.”,我用softice设置断点时发现,.sys的DriverEntry执行了,然后马上执行到Unload去了,然后驱动就退出了。如果reboot的话,DriverMonitor还会加载open时打开的驱动吗?是不是和操作系统有关啊,我现在用的是win2000专业版的。 我用watch查看变量当前值时候发现有些变两可以看到,有些变量不能,提示说是无效的表达式,而我要看的变量是已经定义并赋值了的啊,用watch看变量有什么规定吗? |
|
|
5楼#
发布于:2002-07-05 17:26
确认一下DriverEntry执行是否SUCCESS
|
|
|
6楼#
发布于:2002-07-05 17:34
DriverEntry()执行永远返回STATUS_SUCCESS,应该没什么问题吧?
|
|
|
7楼#
发布于:2002-07-17 10:57
DriverEntry( )例程作为驱动程序启动时首先执行,不能保证总是能够返回STATUS_SUCCESS,如果在该例程中有硬件的初始化,DPC的初始化,事件的初始化,这些都不能保证都能成功,如果失败,要做相应处理,并返回STATUS_UNSUCCESSFUL,此时,DriverUnload( )将被调用,其他例程就不会再处理了。
|
|
8楼#
发布于:2002-07-17 14:26
我也遇到同样的问题,提示start=4,但注册表里的值是3,我只好每次都安装到系统上测试,很麻烦
|
|
|
9楼#
发布于:2002-07-17 14:46
如果你的是WDM驱动,是不能用drivermonitor启动的。只能安装成功以后,再用softice调试。否则,就需先编kmd,用monitor条好后再变为WDM。
|
|
|
10楼#
发布于:2002-07-17 19:28
kmd程序怎么做啊?
还有,当我用watch看当前变量值时为什么有时能看到,有时看不到,watch能看所有当前变量的值吗?比如一个结构体 typedef struct _temp { int a; } t_temp; 定义 t_temp tmp; tmp.a = 1; t_temp *p = *tmp; 为全局变量 譬如在一个函数里单步执行时想观察p->a的值,用“watch p->a”有时可以看到这个值,有时提示“无效的表达式”这是怎么回事? [编辑 - 7/17/02 by chrys] |
|
|
11楼#
发布于:2002-07-18 11:20
当前的可以看,结构里面的也可以。
如 watch temp 那么在watch窗口,他会有个+的 |
|