阅读:2042回复:1
由windbg里的这些信息怎样得到错误的原因
windbg刚开始使用,目前只知道单步执行,g等几个简单的命令。
下面是出错的地方的一些信息,由下面的信息再用什么命令怎样分析一下才能得到具体的原因呢? VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x478: f7fc4308 0fb74dac movzx ecx,word ptr [ebp-54h] kd> p VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x48b: f7fc431b 8b55f4 mov edx,dword ptr [ebp-0Ch] kd> p VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x4df: f7fc436f 8b4df4 mov ecx,dword ptr [ebp-0Ch] kd> p VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x4e7: f7fc4377 8b550c mov edx,dword ptr [ebp+0Ch] kd> p VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x4f0: f7fc4380 8b4df4 mov ecx,dword ptr [ebp-0Ch] kd> p VScsiDisk!VScsiDiskScsiInternalDeviceIoControlDispatch+0x504: f7fc4394 8b4df0 mov ecx,dword ptr [ebp-10h] kd> p Access violation - code c0000005 (!!! second chance !!!) nt!memcpy+0x33: 80535ae3 f3a5 rep movs dword ptr es:[edi],dword ptr [esi] 出错的代码是: if((METHOD_OUT_DIRECT == METHOD_FROM_CTL_CODE(ulIoCode) ) || (METHOD_IN_DIRECT == METHOD_FROM_CTL_CODE(ulIoCode))) { buffer = MmGetSystemAddressForMdl(Irp->MdlAddress); } if(METHOD_BUFFERED == METHOD_FROM_CTL_CODE(ulIoCode)) { buffer = Irp->AssociatedIrp.SystemBuffer; } if(METHOD_NEITHER == METHOD_FROM_CTL_CODE(ulIoCode)) { buffer = Irp->UserBuffer ; } RtlCopyMemory(g_Buffer + logicalBlockAddress*512, buffer, srb->DataTransferLength ); 走了RtlCopyMemory(g_Buffer + logicalBlockAddress*512, buffer, srb->DataTransferLength );代码后windbg出现了上面的信息。 其中g_Buffer是全局变量: UCHAR * g_Buffer=NULL; g_Buffer=ExAllocatePoolWithTag( NonPagedPool ,VSCSI_BUFFER_SIZE ,'RAMB'); 这里分配内存是成功的。 此时其它变量的值: logicalBlockAddress = 0; srb->DataTransferLength = 1; buffer = 0x00000000; 跟踪发现buffer是由第2个if中得到的值,即:buffer = Irp->AssociatedIrp.SystemBuffer; |
|
沙发#
发布于:2010-05-19 12:23
兄弟啊,你都会用WINDBG了啊。
我生用driverstudio成了一个驱动,用VC6.0打开,功能里面挂了两个子工程,分别编译都能过,我怎么调试呢?? |
|