Thursday, February 07, 2013

detect Kernel-Mode memory leak

這陣子遇到一個怪Case ,客戶開機上線大概三天左右就會出錯, 因為有時間性, 所以一開始就鎖定是memory leak 的方向, 不過因為現場常會被破壞, 因為一出問題, 客戶就重開電腦, 後來請客戶保留現場後, 總算看到狀況了, 什麼程式都點不開了,會出現 resource 不足Message, 所以確定是Memory leak

執行工作管理員, 可以看到memory 已經吃了4G 了, 但怪的是找不到哪個process 吃走的, 這下麻煩了, 是kernel level 的, 把現場配制拉回公司內部覆製, 還是出不出問題, 後來才想到客戶端有接IO 裝置, 透過USB to COM 去控制, 所以就完整接了起來, 就看到問題了..!!


  利用 WDK 內附的Poolmon 來看, 可以加個 -b 的參數讓pool tag 以吃記憶體大小做排列,  白色的為有記憶體變動的pool tag, 慢慢的就看到問題了, 紅色框起來的Ser2 慢慢往上長, 這下抓到了, 那來看一下是誰搞的鬼摟.!!




   用Windbg 的kernel debug 連進去


KD > ed nt!poolhittag '2reS' 

記得tag 要反過來.!

按了幾下g 就可以確定問題了, ser2pl64.sys 這個檔案出問題, 確定是USB2COM的Driver有問題
kd> kb
: Call Site
: nt!ExDeferredFreePool+0xb57
: Wdf01000!FxPoolAllocator+0x29b
: Wdf01000!FxObjectHandleAlloc+0xb2
: Wdf01000!imp_WdfMemoryCreatePreallocated+0x16e
: ser2pl64+0x1239d
: ser2pl64+0x121cc
: ser2pl64+0x1138e
: ser2pl64+0xed35
: ser2pl64+0xad65
: ser2pl64+0x28065
: Wdf01000!FxPkgGeneral::OnCreate+0x4b1
: Wdf01000!FxPkgGeneral::Dispatch+0x15c
: Wdf01000!FxDevice::Dispatch+0xa9
: serenum!Serenum_DispatchPassThrough+0x86
: serenum!Serenum_CreateClose+0xd9
: nt!IopParseDevice+0x5a5
: nt!ObpLookupObjectName+0x588
: nt!ObOpenObjectByName+0x306
: nt!IopCreateFile+0x2bc
: nt!NtCreateFile+0x78
: nt!KiSystemServiceCopyEnd+0x13
: ntdll!ZwCreateFile+0xa
: 0x7529bff7
: 0x3bffd98
: 0x3bffdb0

update 他們公司最新的Driver ,問題依舊, 在64 bit OS 下就會出問題, 打去給他們公司要反應這問題, 結果一定要問我是哪家公司, 因為這產品也不是我買的, 是我客戶買的, 我跟他說我是誰有啥義意, 本來還在幫忙trace 看是為啥他們會一直allocate memory 而不release, 這下算了, 請客戶換別家USB2COM 好了, 而且還一定不能用這家chip 的.!!

參考連結
     Using the Kernel Debugger to Find a Kernel-Mode Memory Leak