WinDBG調試簡介

前段時間做了個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吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章