一:背景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,具体怎么开,这里就不介绍了,大家可以网上搜一下 。
推荐阅读
- Bing 广告平台迁移到 .net6
- 微信怎么删除好友,微信好友怎么快速删除(微信怎么一次性删除所有的好友)
- control 掌控 方法记录
- n维偏序 方法记录
- SpringBoot实战派读书笔记---响应式编程
- .NET 6 跨服务器联表查询
- 小米平板5pro可以插卡吗_小米平板5pro可以打电话吗
- 不安装运行时运行 .NET 程序 - NativeAOT
- ARC148游记
- 桃源记铜币怎么获取