客戶端程序出現句柄泄露時查找辦法


背景 
有些客戶反應客戶端程序操作一段時間后,查看任務管理器發現客戶端程序占用句柄數過多,懷疑存在句柄泄露問題。針對該問題,現場測試多個場景,把出現問題的范圍縮小。現發現在以下兩個場景下,會出現句柄泄露: 
1、 打開客戶端程序后操作交易 
2、 在文本框中切換輸入法(百度輸入法2.10版本) 
使用handle.exe收集數據並分析后,已經確定是由於客戶端程序中使用鍵盤鈎子與百度輸入法自帶Bug導致句柄泄露,但排查時還是浪費了大量時間,幾經轉折才查出原因。下面說明下如何使用Windbg來准確快速的定位問題。 
排查步驟 
首先,什么是句柄,微軟是如下描述的: 
An object is a data structure that represents a system resource, such as a file, thread, or graphic image. An application cannot directly access object data or the system resource that an object represents. Instead, an application must obtain an object handle, which it can use to examine or modify the system resource. Each handle has an entry in an internally maintained table. These entries contain the addresses of the resources and the means to identify the resource type

排查問題主要分下面幾步: 
1、安裝Windbg工具 
2、運行存在問題的應用程序 
3、Windbg連接該程序 
4、執行“!htrace –enable“命令,打開堆棧追蹤 
5、執行“!htrace -snapshot”命令,建立快照 
6、開始Debug,操作應用程序 
7、停止Debug,執行“!htrace -diff”命令,找到泄露句柄的堆棧信息

下面具體說明下每一步操作,前兩步不在贅述,從第3步開始

如下圖所示,連接該應用程序 
這里寫圖片描述

執行“!htrace –enable“與“!htrace -snapshot”命令 
這里寫圖片描述

選擇Debug中的“Go”,按句柄增加的場景操作應用程序,並觀察任務管理器中的句柄數 
這里寫圖片描述

觀察到任務管理器中的句柄數增加后,停止Debug 
這里寫圖片描述 
執行“!htrace -diff”命令,可以看到該句柄及申請句柄的程序堆棧信息,下面的圖片中可以直接看到是“swt_extension_win32”的”HookProc”方法申請的句柄。現在問題已經可以確定是由於此處導致。

這里寫圖片描述 
執行“!handle xx f”命令,可以看到該句柄與handle.exe工具收集到的信息一致 
這里寫圖片描述

同樣,切換輸入法時句柄增加可以得到下圖數據,可以看到是“UIPFull”的”DllCanUnloadNow”方法申請的句柄

這里寫圖片描述 
打開百度輸入法安裝目錄,可以看到如下信息,從而可以確定本次泄露是由百度輸入法導致:

這里寫圖片描述

總結 
應用程序在出現句柄泄露時會引起一定的恐慌,誤認為此問題會比較嚴重,從而對查找問題造成一定的干擾。其實,句柄泄露並不可怕,客戶端在存在句柄泄露問題的情況下,依舊可以長時間穩定高效運行。不過查出句柄泄露原因還是很有必要的,查找時可使用handle.exe與windbg配合來使用,先確定出現泄露的場景,然后使用工具在該場景中收集數據,分析問題。 
備注 
注意事項: 
使用”!htrace –diff”命令時,在安裝win8系統的機器上無法打印出堆棧信息,XP系統的機器上可以打印完整信息。 
參考鏈接: 
http://blog.csdn.net/hgy413/article/details/7631187 
https://msdn.microsoft.com/en-us/library/windows/hardware/ff563208(v=vs.85).aspx

Windbg可以從微軟官網下載~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM