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排查内存泄漏的过程
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

posted @ 2021-01-15 21:55  harrychinese  阅读(1888)  评论(0编辑  收藏  举报