如何取樣 memory dump (3)

September 6th, 2009

大多數軟體業界的 escalation engineer 都會將他們的日常工作比喻為 CSI,因為做的事情很類似: 蒐集證據, 拼湊線索, 找出嫌犯。不過呢,大部份的相關書籍都著重於分析線索和推理的部份,很少有提及如何蒐證的技巧,這也是為何我們用了這麼多篇幅來講解取樣的技巧,因為它並不如想像中的那麼容易 🙂

如果我們不能在客戶的機器上安裝任何東西的話 (這多半是受制於客戶的 IT policy),那要如何取樣 memory dump 呢?這時我們可以在家裡先找台機器裝好 Debugging Tools for Windows,然後把程式的資料夾直接燒到 CD 或拷到 USB 隨身碟。我們可以直接從 CD/USB 去執行這些工具,而不必安裝程式,這就是微軟常提起的 “xcopy installation”: 除了直接 copy 到硬碟就會動之外,copy 到光碟或隨身碟也是可以的。對了,通常我們會同時準備 32-bit 和 64-bit 的版本,也會順便帶一套 SysInternals suite

我們在第一篇文章中,推薦使用 ADPlus 來蒐集 user-mode 的 memory dump,但有時客戶的機器是無法執行 ADPlus 的,這是因為若機器本身有問題 (如 COM registry corruption),它根本無法執行 cscript。這時候我們可以使用像是 userdump 之類的工具,或是直接使用手動的方式來取樣。我個人比較偏好使用手動的方式,因為可以得到較好的控制。那麼,要如何手動來做呢? 首先我們必須了解 ADPlus 的流程:

  • 檢查環境,如 OS 版本、系統時間等等
  • 蒐集重要資訊,如 PID,自訂的中斷點等等
  • 產生 CDB script
  • 執行 CDB script

ADPlus 產生的 CDB script 基本架構是這樣的:

.logopen <資料夾>\<記錄檔>
.time
!version
<設定 alias>
* set exceptions, 這裡會有很多個 sx* 指令自動產生
sx{e|d|i|n} -c @”<1st chance cmds>-c2 @”<2nd chance cmds>
g
.time
Q

1st-chance 和 2nd-chance 指令裡,又會內嵌下列的 script:

<一大堆 .echo,輸出訊息用的>
~#kvn250 * dump faulting thread stack, frame depth 250
* create dump: /mdi for 1st chance, /ma for 2nd chance
.dump -u {/mdi|/ma} -c <comments>
{!locks; !runaway} * 某些狀況下會多跑這兩個指令
{!elog_str} * 只有 2nd-chance dumps 會 log
gn * 忽略 exception,繼續執行,以便讓其他元件接手

了解 ADPlus 的工作原理之後,我們就可以直接用 cdb/ntsd/windbg 去 attach 要除錯的 process,然後仿照它的思路來進行我們的取樣工作。當然,也可以用取巧的方法: 直接在家裡先用 ADPlus 來取樣該 process,然後把 CDBScripts 下的 script 拿去現場跑。

Debugging, Windows, 技術文章 | Comments Jump to the top of this page

Comments are closed.

隨便寫寫大家隨便看看的不出名小格子

舊文索引

站內管理