阅读:9547回复:44
请回答(SoftIce调试)
问题一:现象如下
{ ... char ch; ... ... ... } 如上定义的一个临时变量,为什么在单步调试时发现ch的值会经常变化,没有直接对其进行操作的代码!!! 问题二: 为什么经常 watch 这样的临时变量,会invalid expression 问题三 XxxDeviceControl { BYTE b; b= *(BYTE*)Irp->Associate->SystemBuffer; } 可是为什么b却得不到SystemBuffer地址的第一个字节的内容? |
|
|
沙发#
发布于:2002-04-18 08:04
问题一:现象如下 你没有给定初值,系统会附一个随机数 |
|
|
板凳#
发布于:2002-04-18 08:34
回答问题二:
如果你超出了变量的范围,当然会invalid expression |
|
地板#
发布于:2002-04-18 08:47
楼上两位,不是的,我说的是ch值会不断的变,而且我决定赋值了。
那个没有超出作用范围的。 没有人遇到相同的情况吗?郁闷 |
|
|
地下室#
发布于:2002-04-18 09:21
你用什么调试器?
估计是因为你的执行代码和调试文件不对应。你试试Rebuild All。 第二个问题我在SoftIce下碰到过,不知道为什么。 |
|
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外没别的朋友碰到过!??? |
|
|
6楼#
发布于:2002-04-18 12:36
1,具体不清楚,和那几位的想法相同
2,遇到过,也是不清楚。 3,你是否是传递的一个结构指针下来? |
|
|
7楼#
发布于:2002-04-18 15:52
我的一个朋友也遇到过同样的问题。
你试一试编译开关 /Z7。可以解决部分问题。另外我建议用WinDbg。 还有,你选择Symbols loader\\Module\\Load还是Symbols loader\\Module\\Tanslate?因该用后者。 |
|
8楼#
发布于:2002-04-18 22:08
发现一个现象,强烈建议大家试试看。
过程如下: 1,将局部变量 char |
|
|
9楼#
发布于:2002-04-18 22:31
估计ch是指的寄存器CX的高半字节CH。
你看看寄存器窗口。这种傻瓜问题我也犯过。当时我也直骂调试器。 |
|
10楼#
发布于:2002-04-19 01:10
是呀,说的极有道理,虽然在watch窗口的ch值一直变,但是
DbgPrint(\"ch = %d\", ch);却是正常,哈哈!!!!!!! 气到~~~害我 |
|
|
11楼#
发布于:2002-04-19 18:33
en,又学到一些。
|
|
|
12楼#
发布于:2003-02-25 15:06
看来变量名不能随便起了
|
|
13楼#
发布于:2003-02-26 13:17
深有痛感,我更笨,竟然用了一个Fs 的变量,结果可想而之! 大家在用softice时,千万不要用和寄存器重名的变量! 但是要说明的是,重名的变量的变量只是使你在调式的时候,看不到 变量的值而已,对程序的结果并没有影响,也就是说变量在内存里面 的值,实际上,并没有变化,你看到是是寄存器的值在变化而已。 |
|
|
14楼#
发布于:2003-02-27 04:46
问题二:
我发现,如用C方式,在函数头就声明会部的话,可以watch,如用C++方法,用到在声明,你说的现象,是天天发生,以致于我只有大理使用KdPrint,没有办法,我喜欢C++的方式。 |
|
15楼#
发布于:2003-03-02 09:25
问题一:可能由于缓冲区溢出的问题导致
问题二:可能是已经出了这个函数(作用域),变量已经消失了 问题三:没有道理,肯定是你错了,嘿嘿 |
|
|
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 不同部分修改一下即可 |
|
17楼#
发布于:2003-03-11 11:06
我觉得可能是系统用寄存器来做的变量,这样在没用到该变量(初始化前及最后一次使用后)时可能会被挪作它用
|
|
|
18楼#
发布于:2003-03-19 14:18
问题一:现象如下 SoftIce把ch当成了寄存器,所以显示的实际上是CX寄存器你低字节的内容。但这不影响程序执行,只是不方便调试。 解决办法就是不要用任何寄存器关键字作变量。 |
|
|
19楼#
发布于:2003-04-04 11:22
回答问题二: 我也遇到过这个情况,我发现编译器把代码优化了,如过一定要看到这个变量,建议你修改编译条件 在makefile。def中的 DEFAULT_MSC_OPT = /Oxs 改为 DEFAULT_MSC_OPT = /Od |
|
上一页
下一页