记一次 .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,具体怎么开,这里就不介绍了,大家可以网上搜一下 。

推荐阅读