==========================
下載 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