本帖最后由 LCX87654321 于 2010-06-20 16:25:52 编辑

解决方案 »

  1.   

    要有PDB符号。然后蓝屏的时候WINDBG会捕获到。然后 analysis -v 他会显示出出错的原因,还有造成蓝屏的代码的位置,不过前提是你要有PDB符号,否则是汇编代码
      

  2.   

    我用了!analysis -v这个命令,也有自己驱动程序的调试符号文件,但Windbg还是只给出驱动程序出错的偏移量,而不是出错的源代码位置,好像是因为我的程序已经卸载(Windbg里面显示的是unloaded),windbg无法找到对应的驱动程序,因此无法找到对应的调试符号,从而导致不知道哪行出错,这只是我的猜想,还请各位高人指点一下。
      

  3.   

    你有 pdb文件吗?也要把相应的路径设置,还有源码的
      

  4.   

    我这个驱动已经从启动到卸载都没有出现错误,关键是卸载完以后出错(我的驱动已经显示为Unloaded了),是系统调用已我那个卸载的驱动出错,无法单步调试,我的源码,pdb文件都有且设置正确,其它蓝屏错误都能正确定位到出错的地方,就这个不行,好抑郁。
      

  5.   

    DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS这句的意思是你驱动卸载了,但是没有取消掉你处于 Pending 状态的IRP。你检查下你的代码,是否没有取消掉所有Pending状态的IRP,如果是,需要设置取消例程,然后把Pending状态的IRP取消掉。另外如果你是做像键盘过滤那种,也就是说你的驱动是一个过滤驱动,你需要设置一个变量,保存当前有多少个irp处于pending状态,当卸载的时候,你需要设置一个等待函数,等待所有pending 的 irp 全部返回了,才能继续卸载。(这个方面的代码你可以参见下rootkit.com上的klog)
      

  6.   

    是用什么版本的编译器编译的? VC6? 2005,2008,2010??不同的编译器产生的PDB文件
    格式是不一样的,包括微软本身文件的符号文件,去微软网站下载对应版本的符号文件,
    然后实用正确的编译参数,产生windbg能识别的符号文件,这样才能正确的定位到源代码的行中。
      

  7.   


    驱动有专门的WDK。另外windbg会自动找到你编写的驱动的PDB的。微软的PDB是用来显示系统自带驱动的符号的。
      

  8.   

    一般来说,程序每次运行加载依赖库和驱动的地址空间都是相同的,所以,在你再次正常运行的时候查看一下你的这个驱动的加载地址(lm t n),然后再加上你这次崩溃的地址就是出错的地址,uf一下
      

  9.   

    我的驱动是过滤驱动,虽然还是找不出源代码哪行出错,现在我用了xfill的方法,暂时没有蓝屏了,呵呵。结贴