==========================
下载 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 FilesDebugging 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 FilesDebugging Tools for Windows (x64)symchk.exe" "c:windowssystem32calc.exe" /s SRV*c:symbols*http://msdl.microsoft.com/download/symbols
示例2: 扫描c:windows 下所有的exe/dll文件, 并把它们对应的pdb文件下载到本地 c:symbols
"C:Program FilesDebugging 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排查内存泄漏的过程
https://www.cnblogs.com/lanxiaoke/p/12997032.html
调试内存泄漏问题的一些经验
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