https://bbs.pediy.com/thread-178808-2.htm ---看雪的windbg调试手册
http://blog.youkuaiyun.com/wangningyu/article/details/6748138 ----程序异常收集代码
https://msdn.microsoft.com/en-us/library/cc704588.aspx ---所有内核错误码对照
http://blog.youkuaiyun.com/lixiangminghate/article/details/52232285
--解决win7/win8.1 驱动调试KdPrint不能输出的问题
http://blog.youkuaiyun.com/keidoekd2345/article/details/50125747 ---
Windbg调试命令详解
http://blog.youkuaiyun.com/chenlycly/article/details/37912755 ----堆栈调试基础,讲解的很详细
http://blog.youkuaiyun.com/wangyezi19930928/article/details/16921927 ----Linux下的函数调用栈分析
--------------------------------------------
设置条件断点:
简单设置:
bp CSFDrv!PfpCommonCreate+0x14d2 ".if(bFirstOpen<7) {.echo \"Breakpoint hit, condition myVar\"};gc;" ---表示满足条件bFirstOpen值小于7,打印,然后gc表示断点继续运行,这个例子断点是不会停的
bp CSFDrv!PfpCommonCreate+0x14d2 "
.if(bFirstOpen==0) {
.echo \"Breakpoint hit, not first open!\"}
.else{
.echo\"first open\";gc;}" ---->注意红色的语法
bp CSFDrv!PfpCommonCreate+0x14d2 "dt FileFullPath;gc;}" ---直接打印有具体类型的值,FileFullPath, 然后不断,继续执行,查看FileFullPath的值变化
-----------------------------------------
!Analyze -v
.reload ---重新
lm ----列出当前系统加载的模块
x Filesfilter!Driver* ----列出该驱动的函数查找
k*
命令显示给定线程的调用堆栈,
u 查看汇编 例如
: kd> u ffffffff9551e350
.reload /f Filesfilter.sys ---强制重载
.frame 0 ---切换堆栈
设置断点
1: kd> bp Filesfilter!DriverEntry -----该断点没效,因为bp需要在运行的时候才可以设置
1: kd> g
bl ---显示所有断点
bc 0 1 2 ----删除断点 cancel, 不可恢复
bd 0-2 ---取消0-2的所有断点,包含0和2
be 3 ---恢复3号断点
bu Filesfilter!DriverEntry ---------可以不运行就设置断点
dv /V VariableName ---指定查看的变量名称, 变量的结构也已经有显示了。 display value
dt Filesfilter!gSFilterDriverObject ----显示该模块的全局变量, dt 是display type的缩写
------------------------------------------------------------------------
.open -a funcGetProcessInfoForCurProc ---- 打开源码文件,并直接定位找到
funcGetProcessInfoForCurProc位置
.open -a TestDrv!DeviceIoControl ----也可以这样打开
du poi(ptrbuffer) -----Poi操作符在WinDBG中可以被用来对指针进行解引用. 类似C语言中对指针的操作符*
dd ptr ---显示内存地址信息,有点类似gdb的p /x ptr
dt type addr ---给地址以type的结构强转显示
!handle ---显示所有系统句柄
------------------------------------------------------------------------
- .cls ---清屏命令
- uf 函数名称 ----反汇编
- x *!*NtCreateFile* ---符号全局搜索(/f:将只显示函数符号;并且会显示函数的详细定义)
-
ln 7c8179f0 ----(根据给定的地址)列出附近一定范围内的所有符号
-
d /p [地址范围] ----此选项用来显示物理内存信息,只能用于内核模式中
-
dt [结构体] ---查看结构体信息
查看结构体
dt -v _tagPfpProcessInfo----查看结构信息,struct的定义,不能是typedef的!
?? sizeof(_tagPROCESSINFO) ----查看结构大小
dx pProcessInfo->ProcessHashValue ----------查看某个变量值
dv -------显示所有变量值
5.1 查看内存
有非常丰富的内存查看命令,它们被统一为d*格式,如下所示:
- d[类型] [地址范围]
d代表Display,类型包括:字符、字符串、双字等。具体来说,d*命令共有这几种:d、 da、db、dc、dd、dD、df、dp、dq、du、dw、dW、dyb、dyd、ds、dS。解释如下:
内存类型
基本类型:
- dw = 双字节WORD格式;
- dd = 4字节DWORD格式 ;
- dq = 8字节格式;
- df = 4字节单精度浮点数格式;
- dD =8字节双精度浮点数格式;
- dp = 指针大小格式,32位系统下4字节,64位系统下为8字节。
基本字符串:
- da = ASCII字符串格式;
- du = UNICODE字符串格式;
- db =字节 + ASCII字符串;
- dW = 双字节WORD + ASCII字符串;
- dc = 4字节DWORD + ASCII字符串。
高级字符串:
- ds = ANSI_STRING类型字符串格式;
- dS = UNICODE_STRING类型字符串格式。
二进制 + 基本类型:
- byb = 二进制 + 字节;
- byd = 二进制 + DWORD值
http://www.dependencywalker.com/ ---查看依赖关系
winobj ----------查看所有的设备
调试:
打开vmmonitor.exe, 注意windbg窗口不能经常关闭,要重新设置路径。
注意: 每次更新驱动,一定要重新安装,即确保widows\system\driver下的驱动文件是最新的,再sc start Drvier
SRV*d:\localsymbols*http://msdl.microsoft.com/download/symbols;;D:\Work\co
de\testProject\filefilterDrvier\Debug
D:\Work\co
de\testProject\filefilterDrvier\FileSfilter
参考:
http://blog.youkuaiyun.com/AloneSword/article/details/3696839