VB6程序內(nèi)存泄漏診斷
生成 dump 文件
- 如果要分析 32bit 程序問題, 需要使用 32-bit dump文件, 比如 taskmgr.exe 32bit版, DebugDiag 工具. taskmgr.exe 32bit版路徑是" " C:\Windows\SysWOW64\Taskmgr.exe
- 如果要分析 64bit 程序, 需要使用 64-bit dump文件, 有很多可用的dump文件生成工具, 比如 taskmgr.exe, DebugDiag 工具, winDbg, sysinternals 的process explorer 等.
需要說明的是, 可以使用64-bit版本的DebugDiag程序來分析32-bit的dump文件,而不會遇到任何問題。
使用 DebugDiag 分析dump文件
當(dāng)然可以使用微軟的DebugDiag工具來分析user dump文件。該程序可以幫助診斷各種應(yīng)用程序問題,如性能、內(nèi)存泄漏和崩潰等. 功能較 winDbg 要弱不少, 優(yōu)點是上手簡單. 以下是使用DebugDiag分析user dump的詳細(xì)步驟:
-
下載并安裝DebugDiag工具
訪問微軟官方下載頁面(https://docs.microsoft.com/en-us/sysinternals/downloads/debugview)下載并安裝DebugDiag工具。 -
啟動DebugDiag
安裝完成后,打開DebugDiag。您將看到“DebugDiag 2 Collection”和“DebugDiag 2 Analysis”兩個選項。我們需要使用“DebugDiag 2 Analysis”進(jìn)行分析。 -
添加user dump文件
單擊“DebugDiag 2 Analysis”打開DebugDiag Analysis。在界面中,單擊“Add Data Files”按鈕,然后瀏覽并選擇要分析的user dump文件。 -
選擇分析類型
添加user dump文件后,單擊“Start Analysis”按鈕。然后選擇適用于您的問題場景的分析規(guī)則。例如,如果您要診斷內(nèi)存泄漏問題,請選擇“Memory Analysis”。單擊“Next”繼續(xù)。 -
開始分析
確認(rèn)分析規(guī)則后,單擊“Start Analysis”按鈕。DebugDiag將開始對user dump文件進(jìn)行分析。分析完成后,它會生成一個MHTML報告文件,其中包含有關(guān)問題的詳細(xì)信息和可能的解決方案。 -
查看報告
打開生成的MHTML報告文件,查看分析結(jié)果。報告中可能包含有關(guān)異常、內(nèi)存使用情況、調(diào)用堆棧等的詳細(xì)信息。根據(jù)報告中的建議,您可以找到問題的原因并采取相應(yīng)的解決措施。
使用 winDbg 分析dump文件
下載Debugging Tools for Windows,安裝WinDbg或KD等調(diào)試工具, 具體步驟如下:
- 打開WinDbg或KD,選擇打開Dump文件,打開你的user dump文件。
- 輸入!analyze -v命令,分析dump文件,檢查是否有內(nèi)存泄漏報告。泄漏報告中會指出泄漏對象的類型和數(shù)量,這可以作為分析的提示。
- 輸入!heap -stat命令,檢查堆使用概況,看是否有異常的堆塊數(shù)量。正常情況下應(yīng)只有少量堆塊,如果堆塊數(shù)量過多,可能存在內(nèi)存泄漏。
- 輸入!handle命令,列出當(dāng)前所有句柄,按類型分類。可以查找句柄中是否存在大量未釋放的GDI/USER對象,這也可能導(dǎo)致內(nèi)存泄漏。
- 輸入!tok臨時對象地址,查看對象 details。這個可以查看對象的類型,大小,引用計數(shù)等信息。通過這個了解對象的詳細(xì)信息,分析是否存在異常。
- 使用!gcroot命令,可以跟蹤對象的GC Root,查看哪些對象開啟了引用鏈導(dǎo)致該對象無法被回收。這可以用來分析循環(huán)引用等情況。
- 利用WinDbg的GUI窗口,可以在“窗口”菜單中選擇“顯示全局符號”和“顯示內(nèi)存”等窗口,像尋找對象關(guān)系,更直觀的查看和分析內(nèi)存泄漏情況。
如果需要,還可以加載SOS調(diào)試擴(kuò)展插件,它有更豐富的CLR內(nèi)存分析命令,可以分析managed代碼的內(nèi)存泄漏。
所以,熟練使用WinDbg各種內(nèi)存調(diào)試命令和窗口,是分析User Dump內(nèi)存泄漏的關(guān)鍵。對內(nèi)存和對象的熟悉,可以幫助更好的分析ROOT CAUSE,找到內(nèi)存泄漏產(chǎn)生的原因。
VB6程序的內(nèi)存泄漏分析方法
分析VB6程序的內(nèi)存泄漏,可以從以下幾個方面入手:
- 檢查是否有循環(huán)引用。VB6使用引用計數(shù)內(nèi)存管理,如果兩個對象相互引用,但沒有其他引用,就會產(chǎn)生循環(huán)引用導(dǎo)致內(nèi)存泄漏。可以使用工具分析內(nèi)存快照,查找環(huán)形引用鏈。
- 檢查是否有未釋放的COM對象。VB6使用COM對象,如果創(chuàng)建COM對象后沒有調(diào)用Release方法釋放,會產(chǎn)生內(nèi)存泄漏。可以在內(nèi)存快照中查找類名中包含“VB6”的對象,確認(rèn)是否有未調(diào)用Release的對象。
- 檢查Dynamic Arrays的使用。VB6的Dynamic Arrays如果redim后沒有調(diào)用Erase清空,舊的數(shù)組空間不會釋放,會產(chǎn)生內(nèi)存泄漏。在代碼中搜索redim確認(rèn)后是否有及時調(diào)用Erase。
- 檢查是否有事件無法解除訂閱。如果有對象注冊事件后被釋放,但事件無法解除訂閱,會產(chǎn)生內(nèi)存泄漏。要確認(rèn)對象釋放前是否正確解除訂閱所有事件。
- 使用vbWatch工具監(jiān)視對象引用計數(shù)。這個工具可以實時顯示對象的引用計數(shù),可以觀察對象從創(chuàng)建到釋放的全過程,確認(rèn)是否有引用計數(shù)無法下降到0的情況,從而找到內(nèi)存泄漏的原因。
- rational Purify 這類內(nèi)存泄漏檢測工具也可以用于分析VB6程序的內(nèi)存泄漏,它們可以自動檢測上述幾種情況,幫助程序員定位內(nèi)存泄漏代碼。
所以綜上,要想分析VB6內(nèi)存泄漏,關(guān)鍵是要熟悉VB6的內(nèi)存管理機(jī)制,著重檢查循環(huán)引用,COM對象釋放,動態(tài)數(shù)組使用,事件訂閱等情況。然后可以借助一些工具,觀察對象生命周期,輔助查找內(nèi)存泄漏代碼。
使用vbWatch檢查對象引用計數(shù)和內(nèi)存泄漏
vbWatch是一款用于監(jiān)視和調(diào)試Visual Basic 6.0應(yīng)用程序的工具,它可用于檢查對象引用計數(shù)和內(nèi)存泄漏等問題。 網(wǎng)站
該工具提供了一個可視化的界面,可以顯示應(yīng)用程序中各種對象的引用計數(shù),包括窗體、控件、類和模塊等。它還可以監(jiān)視對象的創(chuàng)建和銷毀,以及在調(diào)試過程中查看變量和表達(dá)式的值。
除了對象引用計數(shù)的監(jiān)視,vbWatch還包括許多其他特性,比如:
- 腳本編輯器:可以在應(yīng)用程序運行時運行腳本,以便更方便地調(diào)試和測試應(yīng)用程序。
- 日志記錄:可將應(yīng)用程序的運行日志保存到文件中,以便在出現(xiàn)問題時進(jìn)行分析。
- 自動化:可以通過COM接口自動化vbWatch,以便更好地集成到自己的開發(fā)工作流程中。
vbWatch是一個商業(yè)產(chǎn)品,需要購買許可證才能使用。它的價格因版本和許可證類型而異。不過,該工具提供了一個免費的試用版,可以在30天內(nèi)免費試用,以便用戶可以測試其功能和性能。
使用vbWatch的步驟如下:
在Visual Basic項目中添加一個引用,引入vbWatch.dll。這是一個COM組件。
在代碼中實例化vbWatch對象:
Dim vw As New vbWatch.vbWatch
對任意對象調(diào)用vw.Watch()方法開始監(jiān)視其引用計數(shù):
vw.Watch(someObject)
此后,vbWatch will在后臺跟蹤這個對象的引用計數(shù)變化。
隨時可以調(diào)用vw.Status()方法獲取所有被監(jiān)視對象的當(dāng)前狀態(tài):
Dim status As String = vw.Status()
status會返回所有被監(jiān)視對象的引用計數(shù)信息,如:
Object1: Ref Count=2 (Started at 3)
Object2: Ref Count=1 (Started at 1)
當(dāng)不再需要監(jiān)視某對象時,調(diào)用vw.Unwatch(someObject)方法停止監(jiān)視。
當(dāng)不再需要vbWatch時,設(shè)置 vw = Nothing 結(jié)束其實例。

浙公網(wǎng)安備 33010602011771號