设置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