如何分析一个dump

设置symbols

kd>.sympath SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

这个的意思是去C:\Symbols找symbols,如果没有就会去M$的服务器下载对应的symbols.

另外在File-> Symbos File Path也可以设置

打开dump文件, !analyze -v

!analyze –v 在STACK_TEXT:里面可以看到自己的驱动,如果是自己的驱动问题。高版本的Windbg还会给出错的源代码,当然这是需要pdb的。

这个命令其实可以看到许多信息,基本定位驱动的问题大概在什么地方

STACK_TEXT:

WARNING: Frame IP not in any known module. Following frames may be wrong.

..

f88f2d58 805b9ee5 80000234 8123a000 81e826e8 nt!IopLoadDriver+0x5e1

这行(frame)主要的信息是

  • f88f2d58  IopLoadDriver调用时的ebp
  • 805b9ee5 IopLoadDriver调用后返回的返回地址
  • 80000234 IopLoadDriver第一个参数

frame和callstack差不多一个概念。只要理解调用约定,就应该明白。

基本上,在有源码的情况下,这样用Windbg已经足够分析驱动的bug了。

对于双机调试,如果不习惯完全可以用UI操作,不用去记着些命令。不过我个人还是喜欢命令调试。

主要用的命令
  • d系列命令主要是查看内存
  • r系列查看寄存器
  • b系列和断点有关系
  • u系列就是反汇编
  • x可以看函数的原型
多参考BugCheck表
  • Windbg文档里面有
  • kd> !analyze -show Code
关于C调用约定的一些解释
;假设
;ebp=0x80000000
;esp=0x90000000
;ebp+arg1 和 ebp+arg1的内容为10,20
mov eax [ebp+arg2] ;得到参数2
push eax           ;参数2入栈,esp=90000000h-4h
mov eax [ebp+arg1] ;得到参数1
push eax           ;参数1入栈,esp=90000000h-8h

call foo           ;返回eip入栈,esp=90000000h-ch


foo:
;以下是肯定会这样编译的
push ebp           ;调者的ebp入栈,esp=90000000h-10h
mov ebp,esp           ;把ebp设置为当前esp,此时,ebp=90000000h-10h
;以下用ebp访问参数,无论如何以下3句完成后,esp=90000000h-10h,这样就能保证不乱
mov eax,[ebp+0x8;ebp+8h为90000000h-8h,即参数1的地址
mov ecx,[ebp+0xc;ebp+ch为90000000h-4h,即参数2的地址
add eax,ecx           ;把参数2的值加到参数1上,eax=30
;以下是肯定会这样编译的
pop ebp            ;调用者的ebp出栈,esp=90000000h-ch
ret                   ;恢复eip

posted on 2009-08-11 20:05  devcfei  阅读(5749)  评论(0编辑  收藏  举报