前段時間做了個PPT分享:WinDBG調試簡介.特別的感觸有以下幾點(後面是對PPT內容的簡單梳理):
- 有壓力纔會有動力。那一週行動力特別強,翻資料找書寫例程,時間利用率特別高
- 網上的資料沒書上的系統權威。書真心是首選
- 開始就是工作的一半。拖延了2天遲遲不開工,後面一旦開始了,就進入刷刷刷的節奏
- 先理出框架,細節慢慢完善,整個過程會通暢很多。一定要分配好任務片
- 不會畫流程圖真是做PPT的硬傷
WinDBG的好處:
- 可達到內核態調試
- 可進行遠程調試
- 綠色輕量級(幾十M而已)
- 支持windows平臺下所有調試命令
- 輕易找出內存泄漏問題
- 配合堆調試功能,輕易找出崩潰原因
使用WinDBG調試崩潰問題:
- 發生崩潰後用~*kbn,輸出所有線程的堆棧。
- 找出UnHandledExceptionFilter一行,其參數(第三個)中記錄了異常信息和異常地址。
- dd指引打印出參數值。打印出的第三個值是異常上下文地址。.cxr (地址)切換上下文
- 切換了上下文,通過kbn輸出堆棧進行分析。 (windows平臺下,所有異常都是通過上述接口進行派發,各種異常處理也是捕獲上述異常信息)
使用Windbg定位內存泄漏:
- 抓取兩個時刻t1,t2, 用heap -s命令輸出每一時刻的內存快照(堆分配大概統計信息)
- 通過比較內存快照,找出增長堆的句柄,假設爲aHandle
- heap -stat -h aHandle分析增長堆,找出多大的內存塊分配主導了該堆的增長,假設大小爲size
- heap -flt s size命令過濾出大小爲size的內存塊的分配情況
- heap -p -a 命令定位到內存塊分配的call stack,一切就清楚了 (注意要打開windows的堆調試功能,特別是要記錄用戶態棧回溯數據庫:UST)
使用配套的工具UMDH定位內存泄漏:
- 記錄t1時刻的內存快照,保存到文件u1.log: umdh -p:1228 -f:u1.log -v
- 記錄t2時刻的內存快照,保存到文件u2.log: umdh -p:1228 -f:u2.log -v
- 比較兩個時刻的內存快照,輸出增長的堆棧分配過程: umdh -d u1.log u2.log -v (-p後跟的是進程ID)
寫blog很累,上面給出的全是框架,不詳細一一解釋了,背景知識、細枝末節等自己google吧。