任何有用的建议,以确定在Win32进程中哪些内存被释放?

Leo*_*Hat 5 c++ windows memory-management

我正在使用的应用程序表现出以下行为:

  1. 在特定的高内存操作期间,任务管理器(内存使用情况统计)下的进程的内存使用量达到大约2.5GB的峰值(注意:已设置注册表项以允许此操作,因为通常最大为2GB对于32位Windows下的进程)

  2. 操作完成后,进程大小缓慢开始以每秒1MB的速率降低.

我试图找出最简单的方法来快速确定谁释放了这个内存,以及它在哪里被释放.

我无法将内存分析器附加到我的代码中,我并不特别想覆盖new/ delete运算符来跟踪分配/解除分配(IOW,我想这样做而不重新编译我的代码).

任何人都可以提供有关如何通过Visual Studio调试器执行此操作的任何有用建议吗?


更新

我还应该提到它是一个多线程应用程序,因此暂停应用程序并通过调试器分析调用堆栈并不是最理想的选择.我考虑一次冻结一个不同的线程,看看内存是否停止减少,但我相当肯定这会导致应用程序崩溃.

Ale*_*ski 2

啊!您看错柜台了!

Mem Usage并没有告诉你内存正在被释放。只是工作集正在被清除!这可能意味着某些其他应用程序需要内存,或者 VMM 决定将某些进程的页面标记为“备用”以供其他进程快速使用。这并不意味着VirtualFreeHeapFree或任何其他自由函数正在被调用。

查看提交大小(VM 大小、专用字节等)。

但是,如果您仍然想知道内存何时被解除提交或释放或您拥有什么,那么请中断一些空闲调用。例如(对于 Visual C++)

{,,kernel32.dll}HeapFree
Run Code Online (Sandbox Code Playgroud)

或者

{,,msvcr80.dll}free
Run Code Online (Sandbox Code Playgroud)

ETC。

或者只是上面的常规函数​​断点。只要确保它解析地址即可。

cdb/WinDbg 让你通过

bp kernel32!HeapFree
bp msvcrt!free
Run Code Online (Sandbox Code Playgroud)

ETC。

名称可能会有所不同,具体取决于您使用的 CRT 版本以及链接方式(通过/MT/MD及其变体)