windbg 简单使用

愿君学长松,慎勿作桃李。这篇文章主要讲述windbg 简单使用相关的知识,希望能为你提供帮助。
==========================
下载 windbg
==========================
搜索 windbg 官网, http://windbg.org/


windbg 工具包含在  Windows Software Development Kit (SDK) 中, 所以要下 windows SDK.  我的操作系统系统 win7, 所以下的是 win7版本 SDK,  下载地址为 https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/
下载下来的是一个installer, 在installer中选 Debugging Tools for Windows"


==========================
下载 windows的 symbols 配置
==========================
一般的 windows 的dll/exe程序文件都做过优化, 文件内部并不包含symbol信息(函数名/变量名), 所以分析dump文件, 一定需要先下载这些程序的 symbol 文件, symbol 文件一般的扩展名是 *.pdb.


1. [有效方法] 下载 symbol 方法:
微软已经不提供offline symbols 下载包, 只能使用 symchk.exe 下载.
将symbols文件下载到本地命令格式为:
"C:\\Program Files\\Debugging Tools for Windows (x64)\\symchk.exe" [filename] /s SRV*[symbol_folder]*http://msdl.microsoft.com/download/symbols


示例1: 将指定的calc.exe的pdb文件下载到本地 c:\\symbols
"C:\\Program Files\\Debugging Tools for Windows (x64)\\symchk.exe" "c:\\windows\\system32\\calc.exe" /s SRV*c:\\symbols\\*http://msdl.microsoft.com/download/symbols


示例2: 扫描c:\\windows 下所有的exe/dll文件, 并把它们对应的pdb文件下载到本地 c:\\symbols
"C:\\Program Files\\Debugging Tools for Windows (x64)\\symchk.exe" /r c:\\windows /s SRV*c:\\symbols\\*http://msdl.microsoft.com/download/symbols
其中 /r 代表循环, -r c:\\windows 即循环windows系统目录下的exe/dll文件, 所以上面的命令会花费很长时间才能完成下载.





==========================
windbg 中使用已经下载的symbols
==========================
查看当前的symbol search path, 只需要直接运行 .sympath 即可.
.sympath


要本地程序的 C:\\symbols 路径, 使用.sympath+ 命令,
.sympath+ C:\\symbols
.sympath+ cache*


直接设置sym path 命令,
.sympath C:\\symbols1; C:\\symbols2


==========================
windbg 中直接使用微软服务器上的symbols
==========================
使用下面命令:
.sympath srv*c:\\symbols*https://msdl.microsoft.com/download/symbols


前缀srv代表是 symbol server
第一个*后是download server下载下来的local directory,
第二个*后是微软 symbol server path, 包含 shell32.dll, gdi32.dll, advapi32.dll, kernel32.dll, ntdll.dll 等文件的symbols.


==========================
准备自研工具的symbols
==========================
推荐将 windows 官方的symbols单独放到一个目录, 比如 c:\\symbols
将自研工具的pdb文件 放到另一个目录, 比如c:\\privateSymbols 
.sympath+ C:\\privateSymbols


==========================
加载 symbols 文件
==========================
设置 symbol search path之后, 需要加载相关 modules 的 symbol 文件, windbg 命令为:
.reload /f
该命令也能报错当前缺少哪些 symbol 库. 如果使用了微软远端的symbols server, reload 命令需要很久时间, 见下面的截图.


如果 .reload /f 命令报错, 可以使用下面命令进入 verbose 模式, 可以看出更详尽的信息:
!sym noisy
然后再运行 .reload /f 命令
 


==========================
创建需要debug程序的 dump 文件
==========================
可以用任务管理器将该程序的进程导出一个转储dump文件,  有时会报 "拒绝访问"的错误, 原因往往是资源管理和你程序64bit/32bit版本不一致, 但有时候也不太管用.


推荐使用 windbg , 方法是: windbg 菜单 file/attach to a process, 选中目标程序, 然后运行下面命令:
??.dump /ma /u c:\\calc.dmp??
.dump命令参数比较多,常用的组合就是/ma,??/m???表示生成minidump,??/a???表示dmp包含所有信息,??/u??参数就是上面说的附加时间和PID信息到文件名。


================================
windbg 实例学习
================================
记一次使用windbg排查内存泄漏的过程


调试内存泄漏问题的一些经验
http://fresky.github.io/2015/06/21/how-to-attack-the-memory-leak-issue/


https://www.codeproject.com/articles/31382/memory-leak-detection-using-windbg


https://stackoverflow.com/questions/674247/vb6-memory-leak




【windbg 简单使用】


    推荐阅读