我正在寻找一种方法来跟踪 C++ 程序中的内存分配。我是not对内存泄漏感兴趣,这似乎是大多数工具试图找到的,而是为应用程序创建内存使用情况配置文件。理想的输出是函数名称的大列表加上随时间变化的最大分配字节数,或者更好的是随时间变化的堆的图形表示。横轴是时间,纵轴是堆空间。每个函数都会获得自己的颜色并根据分配的堆字节绘制线条。识别分配的对象类型也有奖励点。
这个想法是找到内存瓶颈/可视化哪些函数/线程消耗最多内存并且应该作为进一步优化的目标。
我简单地浏览过 Purify、BoundsChecker 和 AQTime,但它们似乎不是我想要的。 Valgrind 看起来很合适,但是,我在 Windows 上。Memtrack http://www.almostinfinite.com/memtrack.html看起来很有希望,但需要对源代码进行重大更改。
我的谷歌技能一定让我失望了,因为这似乎并不是一个罕见的请求?创建此类工具所需的所有信息都应该可以从程序的调试符号和运行时 API 调用中轻松获得 - 不是吗?
使用 Valgrind 及其工具 Massif。其示例输出(其中一部分):
99.48% (20,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->49.74% (10,000B) 0x804841A: main (example.c:20)
|
->39.79% (8,000B) 0x80483C2: g (example.c:5)
| ->19.90% (4,000B) 0x80483E2: f (example.c:11)
| | ->19.90% (4,000B) 0x8048431: main (example.c:23)
| |
| ->19.90% (4,000B) 0x8048436: main (example.c:25)
|
->09.95% (2,000B) 0x80483DA: f (example.c:10)
->09.95% (2,000B) 0x8048431: main (example.c:23)
因此,您将获得详细信息:
- 谁分配了内存(函数:上例中的 g()、f() 和 main());您还可以获得导致分配函数的完整回溯,
- 内存转到哪个数据结构(上例中没有数据结构),
- 发生的时候,
- 它占所有已分配内存的百分比(g:39.7%,f:9.95%,main:49.7%)。
Here is 地块手册 http://valgrind.org/docs/manual/ms-manual.html
您可以跟踪堆分配以及堆栈分配(默认情况下关闭)。
附言。我刚刚读到您使用的是 Windows。不过,我会留下答案,因为它给出了您可以从可能的工具中获得什么的图片。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)