記一次 .NET 某工控視覺軟件 非托管泄漏分析

一:背景1.講故事最近分享了好幾篇關于 非托管內存泄漏 的文章,有時候就是這么神奇,來求助的都是這類型的dump,一飲一啄,莫非前定 。讓我被迫加深對 NT堆, 頁堆 的理解,這一篇就給大家再帶來一篇內存泄漏 。
前段時間有位朋友找到我,說他的程序出現了非托管泄漏,某一塊的操作會導致非托管內存上漲的很快 , 讓我幫忙逆向看下是哪里的操作沒有釋放資源? 既然找到我,那就上 WinDbg 分析吧 。
二:WinDbg 分析1. 哪里的內存泄漏看內存泄漏還是老規矩,使用 !address -summary 命令就可以了 。
0:000> !address -summary--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotalFree                                    443      7fc`685d1000 (   7.986 TB)           99.82%Heap                                    658        3`563aa000 (  13.347 GB)  92.89%    0.16%<unknown>                               770        0`1ff5a000 ( 511.352 MB)   3.48%    0.01%Image                                  1196        0`108ba000 ( 264.727 MB)   1.80%    0.00%Stack                                   108        0`08c40000 ( 140.250 MB)   0.95%    0.00%Other                                    31        0`081d8000 ( 129.844 MB)   0.88%    0.00%TEB                                      36        0`00048000 ( 288.000 kB)   0.00%    0.00%PEB                                       1        0`00001000 (   4.000 kB)   0.00%    0.00%--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotalMEM_FREE                                443      7fc`685d1000 (   7.986 TB)           99.82%MEM_COMMIT                             2464        3`67933000 (  13.618 GB)  94.77%    0.17%MEM_RESERVE                             336        0`300ec000 ( 768.922 MB)   5.23%    0.01%從卦中看 , 當前進程有 13.6 G 的提交內存,NtHeap 占用了 13G,很明顯這是非托管內存泄漏,既然是非托管泄漏,那就需要二番戰,也就是讓朋友開啟 ust,或者啟用應用程序驗證器 (Application Verifier) 開啟頁堆,目的就是記錄分配這塊內存的源頭,這里就讓朋友用 gflags 開啟下 ust,具體怎么開,這里就不介紹了,大家可以網上搜一下 。

推薦閱讀