AChen
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2002-10-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:9547回复:44

请回答(SoftIce调试)

楼主#
更多 发布于:2002-04-18 01:36
问题一:现象如下
{
...
char ch;
...
...
...
}

如上定义的一个临时变量,为什么在单步调试时发现ch的值会经常变化,没有直接对其进行操作的代码!!!

问题二:
为什么经常 watch 这样的临时变量,会invalid expression

问题三
XxxDeviceControl
{
BYTE b;

b= *(BYTE*)Irp->Associate->SystemBuffer;

}
可是为什么b却得不到SystemBuffer地址的第一个字节的内容?

最新喜欢:

sourensouren RED_springRED_sp...
This posting is provided "AS IS" with no warranties, and confers no rights.
KungFu
驱动大牛
驱动大牛
  • 注册日期2001-09-27
  • 最后登录2008-04-08
  • 粉丝0
  • 关注0
  • 积分221分
  • 威望24点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-18 08:04
问题一:现象如下
{
...
char ch;
...
...
...
}

如上定义的一个临时变量,为什么在单步调试时发现ch的值会经常变化,没有直接对其进行操作的代码!!!

 

 你没有给定初值,系统会附一个随机数
我不写驱动好多年
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-04-18 08:34
回答问题二:
如果你超出了变量的范围,当然会invalid expression
AChen
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2002-10-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-18 08:47
楼上两位,不是的,我说的是ch值会不断的变,而且我决定赋值了。

那个没有超出作用范围的。

没有人遇到相同的情况吗?郁闷
This posting is provided "AS IS" with no warranties, and confers no rights.
wilton
驱动牛犊
驱动牛犊
  • 注册日期2001-04-23
  • 最后登录2005-03-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-18 09:21
你用什么调试器?
估计是因为你的执行代码和调试文件不对应。你试试Rebuild All。
第二个问题我在SoftIce下碰到过,不知道为什么。
AChen
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2002-10-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-18 12:17
不好意思,没有解决问题,所以不好给分呀。

问题其实是这样的,APP通过DeviceIoControl传进一个结构,
如 typedef struct _parm {
 char c;
 ...
} PARM, *PPARM;
如果通过如下代码,可以得到结构c的值
PPARM p;
p = (PPARM)Irp->Associate->SystemBuffer;

但是我现在想直接读到一个变量,所以
char ch;
ch= *(char*)Irp->Associate->SystemBuffer;
但是发现不行,反而发现ch老是变来变去,于是有了问题一和三。

至于问题二,绝对是在那个变量的作用域中的,难道除了wilton外没别的朋友碰到过!???

This posting is provided "AS IS" with no warranties, and confers no rights.
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-18 12:36
1,具体不清楚,和那几位的想法相同
2,遇到过,也是不清楚。
3,你是否是传递的一个结构指针下来?
我就是我,没什么可说的。
wilton
驱动牛犊
驱动牛犊
  • 注册日期2001-04-23
  • 最后登录2005-03-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-18 15:52
我的一个朋友也遇到过同样的问题。
你试一试编译开关 /Z7。可以解决部分问题。另外我建议用WinDbg。
还有,你选择Symbols loader\\Module\\Load还是Symbols loader\\Module\\Tanslate?因该用后者。
AChen
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2002-10-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-18 22:08
发现一个现象,强烈建议大家试试看。

过程如下:
1,将局部变量 char
This posting is provided "AS IS" with no warranties, and confers no rights.
wilton
驱动牛犊
驱动牛犊
  • 注册日期2001-04-23
  • 最后登录2005-03-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-18 22:31
估计ch是指的寄存器CX的高半字节CH。
你看看寄存器窗口。这种傻瓜问题我也犯过。当时我也直骂调试器。
AChen
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2002-10-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-19 01:10
是呀,说的极有道理,虽然在watch窗口的ch值一直变,但是

DbgPrint(\"ch = %d\", ch);却是正常,哈哈!!!!!!!

气到~~~害我
This posting is provided "AS IS" with no warranties, and confers no rights.
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-19 18:33
en,又学到一些。
我就是我,没什么可说的。
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2003-02-25 15:06
看来变量名不能随便起了
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-02-26 13:17


深有痛感,我更笨,竟然用了一个Fs 的变量,结果可想而之!
大家在用softice时,千万不要用和寄存器重名的变量!
但是要说明的是,重名的变量的变量只是使你在调式的时候,看不到
变量的值而已,对程序的结果并没有影响,也就是说变量在内存里面
的值,实际上,并没有变化,你看到是是寄存器的值在变化而已。
放弃瘟草,现吃李草
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-02-27 04:46
问题二:

   我发现,如用C方式,在函数头就声明会部的话,可以watch,如用C++方法,用到在声明,你说的现象,是天天发生,以致于我只有大理使用KdPrint,没有办法,我喜欢C++的方式。
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-03-02 09:25
问题一:可能由于缓冲区溢出的问题导致
问题二:可能是已经出了这个函数(作用域),变量已经消失了
问题三:没有道理,肯定是你错了,嘿嘿
签名是什么?
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2003-03-04 16:22
对于问题二可以在setenv.bat中设成如下
:checked

rem set up an NT checked build environment

set BUILD_ALT_DIR=chk
set NTDBGFILES=1
set NTDEBUG=ntsd
set NTDEBUGTYPE=windbg
set MSC_OPTIMIZATION= /Od /Oi

不同部分修改一下即可
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2003-03-11 11:06
我觉得可能是系统用寄存器来做的变量,这样在没用到该变量(初始化前及最后一次使用后)时可能会被挪作它用
易水
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-03-19 14:18
问题一:现象如下
{
...
char ch;
...
...
...
}

如上定义的一个临时变量,为什么在单步调试时发现ch的值会经常变化,没有直接对其进行操作的代码!!!

问题二:
为什么经常 watch 这样的临时变量,会invalid expression

问题三
XxxDeviceControl
{
BYTE b;

b= *(BYTE*)Irp->Associate->SystemBuffer;

}
可是为什么b却得不到SystemBuffer地址的第一个字节的内容?
 



SoftIce把ch当成了寄存器,所以显示的实际上是CX寄存器你低字节的内容。但这不影响程序执行,只是不方便调试。
解决办法就是不要用任何寄存器关键字作变量。
Tom_lyd
alan2u
驱动巨牛
驱动巨牛
  • 注册日期2001-12-11
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分5926分
  • 威望43813点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2003-04-04 11:22
回答问题二:
如果你超出了变量的范围,当然会invalid expression
 


我也遇到过这个情况,我发现编译器把代码优化了,如过一定要看到这个变量,建议你修改编译条件

在makefile。def中的
DEFAULT_MSC_OPT = /Oxs
改为
DEFAULT_MSC_OPT = /Od
上一页
游客

返回顶部