如何统计Windows运行进程的C++对象数量与类型?无商业工具排查内存问题
Windows C++进程内存对象排查与统计的免费方案
针对你提到的Windows C++进程内存增长排查、对象统计需求,不需要商业工具也能实现,以下是几种实用方案:
一、利用WinDbg原生调试能力
你已经熟悉WinDbg调试.NET应用,其实它也能搞定C++场景,核心是依赖符号文件(PDB):
- 准备符号:用
.symfix设置微软符号服务器,再执行.reload /f强制加载进程的私有PDB(必须包含类型信息,否则无法识别对象类型)。 - 堆内存分析:
- 执行
!heap -s查看所有堆的基本状态,定位占用异常的堆(通常是默认进程堆或程序自定义堆)。 - 对目标堆执行
!heap -stat -h <堆地址>,统计不同大小内存块的占比,快速锁定异常增长的块尺寸。 - 筛选特定大小的堆块:
!heap -flt s <对象大小>,然后对每个块用dt <类型名> <块地址>查看对象内容。如果不知道类型,可通过块内的虚表地址(若对象有虚函数),用dps <虚表地址>查看类名(符号正确的话会显示)。
- 执行
- 统计对象数量:若已知目标类型,可写简单的WinDbg脚本批量遍历匹配。例如:
然后统计输出中有效对象的数量(注意排除已释放的无效块)。.foreach (block {!heap -flt s <对象大小>}) { dt <目标类型> ${block} }
二、免费第三方工具
- Visual Studio Community版内存探查器:完全免费,功能足够覆盖日常排查。启动调试后,打开「性能探查器」→选择「内存使用情况」,运行进程后拍摄多份内存快照,对比快照即可查看C++对象的类型、数量变化,以及分配堆栈。
- Sysinternals工具集(VMMap + Process Explorer):
- VMMap可以直观展示进程内存的分布(私有数据、堆、栈等区域),结合符号能显示部分对象的类型信息,快速定位内存增长的区域。
- Process Explorer辅助查看进程的句柄、线程等信息,配合VMMap缩小排查范围。
- Dr. Memory:开源免费的内存调试工具,能全程跟踪内存分配与释放。运行命令:
它会生成详细报告,包含所有分配的内存块、调用栈,以及不同类型对象的分配统计(依赖符号),还能检测内存泄漏。drmemory.exe -- <你的进程路径>
三、代码层面临时统计(需重新编译)
如果可以修改代码,添加轻量级统计逻辑:
- 重载全局new/delete:自定义全局内存分配函数,在分配时记录内存地址、大小、调用栈(用
CaptureStackBackTrace获取),维护哈希表统计每种类型的对象数量(需开启RTTI,用typeid获取类型名)。 - CRT分配钩子(Debug模式):使用
_CrtSetAllocHook拦截CRT的内存分配请求,记录分配信息,统计对象类型与数量,适合Debug环境下的快速排查。
内容的提问来源于stack exchange,提问作者Brajesh
相关产品推荐
相关产品推荐

