Windbg是一款功能十分强大的调试工具,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、调试转储文件、远程调试等等。
windbg的下载:
链接: https://pan.baidu.com/s/1QHcd85qASn5ryI9mJr6A9A 提取码: mcvb
或者:
http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools/dbg_x86.msi
利用windbg分析dmp基本步骤:
● STEP 1:在file菜单中分别设置好Symbol file path 和 Source file path。和Image File Path (好像不用设置这个也能实现)
a. 其中Symbol file path是程序编译时所生成的pdb文件,具体到某一个.pdb文件,如:
另外想要添加网络上符号文件的引用,添加以下的内容到你的 .sympath
SRV*downstream_store*http://msdl.microsoft.com/download/symbols
使用的命令就是:
.sympath+ SRV*c:/tmp*http://msdl.microsoft.com/download/symbols
C:/tmp就是download_store,所需要的符号文件会被下载存储至此。注意这个符号服务器仅仅开放了公有的符号文件。
VS下编译时可以通过勾选编译选项来生成。生成pdb文件的方法参考:vs利用DMP文件、pdb文件查找release下的异常行号的方法_baidu_16370559的博客-CSDN博客
b Source file path则是对应的代码路径。
c. Image File Path的设置:
●STEP 2:打开Windbg,在file中选择open crash Dump来打开所需要调试的Dump文件。
● STEP 3:设置完这些之后,就可以在command窗口中使用Windbg的命令行来进行各种调试分析了。这里使用的是 !analyze –v
崩溃位置定位:
常用调试命令:
!analyze –v 自动分析
kv 查看堆栈
kb:显示当前线程call stack(调用栈)的内容
~*kb ,它用来显示dump中所有线程的call stack
!runaway 显示所有线程的CPU消耗
!handle e00 f 显示句柄详细详细
!cs 00bcd034 临界对象
!teb查看TEB的结构
bp 下断点,还有条件断点
!address 显示整个地址空间和使用摘要的信息
dd 按字节查看
dt 查看结构
其他的命令
1. x : 以通配符的方式检查一个模块内的符号地址
例如: x nt!Psp* (显示内核里所有以Psp开头的内核符号)
2. lm : 显示所有已加载的模块列表
3. dd : 显示一个地址起始的32位整数值(默认显示32个整数,每行4个,共8行)
例如: dd 1014db0 L1 (L1表示只显示一个整数)
4. du : 显示UNICODE形式的字符串
5. .formats <数字> : 以各种进制显示这个数字
6. !process 0 0 : 打印系统中所有进程(只在内核调试下有效)
!process
7. !dd : 显示物理地址(只在内核调试下有效)
8. 使用Windbg在内核调试下调试用户进程.
!process 0 0 列出所有进程
.process /p
.reload /f /user 重新加载此进程用户空间的符号信息
.process /i /p
bp
9. bl : 查看已设置的断点列表
10. bc : 取消一个断点
11. ba : 设定一个内存访问断点
例如: ba w1 0042201c
ba r2 0042201c
12. r : 显示寄存器的值
13. u : 反汇编,例如: u 401500 L9 反汇编当前地址以后的9条指令
14. ub: 向前反汇编,例如: ub 4014f9 L2 反汇编当前地址之前的两条指令
15. k : 显示栈回溯
16. kp: 显示栈回溯并且显示每个函数被调用时的参数信息
17. g : 继续执行程序
18. dt: 显示类型结构命令
例如,在内核调试下:
dt _EPROCESS <某进程的EPROCESS首地址>
19. 在内核调试下显示一个进程的PEB信息
.process
dt _PEB
20. ln [address] : 显示指定地址的类型信息,或临近address的符号的类型信息.address为可选.
21. ~* kp : 显示所有线程的栈回溯
22. ~* : 显示所有线程(同时也显示出线程的启动函数的地址)
23. dt ntdll!*create* : 显示一个模块内的所有结构体类型名
24. !handle : 查看句柄(表)
25. uf
26. !peb [address] : 显示一个进程的进程块信息
27. !object 查看内核对象,格式如下:
Usage: !object [-p] | [[
28. t : 单步跟入. tc: 单步跟入直到一个call为止.
tct: 单步跟入直到一个call或ret为止. tt: 单步步入直到一个ret为止.
29. p : 单步步过. pc: 单步步过直到一个call为止. pct: 单步步过直到一个call或ret为止.
pt: 单步步过直到一个ret为止.
29. bu kernel32!BaseProcessStart : 设置一个延迟的以后再落实的断点
注: 上面这个命令常用来对还没有加载的模块内的函数设置断点。