繁体   English   中英

C ++中的多线程内存分析

[英]Multithread Memory Profiling in C++

我正在分析应用程序中多个线程的内存使用情况。 我希望能够跟踪正在运行的任何给定线程的最大分配/当前分配。 为了做到这一点,我计划在mallocs / frees上进行设置。 在对malloc的每次调用期间,我都会在静态映射中更新该线程的分配记录,该映射将线程ID与其特定的元数据记录相关联。 我目前在流程退出期间遇到问题。 我认为问题在于,当所有析构函数都需要进行清理时,必须销毁静态映射和保护它的锁。 但是,我插入的malloc / frees在更新概要分析元数据结构之前获取了锁。 最终,该锁被破坏了,但是随后对malloc / free的调用导致尝试获取不再存在的锁,从而导致段错误。

我担心的另一个问题是,在插入的malloc中生成了对malloc的内部调用,以在映射中分配条目。

关于解决基于每个线程的内存使用情况分析问题的方法的任何想法? 关于跟踪每个线程的使用情况的数据结构有什么建议吗? 以上方法看起来是否合理,或者是否有其他方法可以解决问题?

如果您将“额外”数据存储为分配本身的一部分(之前比较容易,但是您也可以在之后进行-只需在某个地方设置大小),那么根本就不需要任何锁。 只是一点点的内存。 当然,您将需要使用原子来更新任何项目列表。

如果您看以下答案:

在自定义堆上设置内存

并想象HeapAllocHeapFree分别是mallocfree 然后添加代码以存储正在使用哪个线程进行分配。

因此,您无需使用地图,而只需更新链表(使用原子防止多次更新)。 当然,这确实使每个线程的最新度量变得有些困难,您必须扫描分配列表。

当然,这仅适用于对mallocfree直接调用。

通过“注入”替换的malloc / free函数(按照另一篇文章中的原理构建,但当然不使用原始malloc分配内存,也不使用free释放内存),可以实现相同的原理。

这是一件复杂的事情,要在所有情况下都可以做。 您会错过许多问题,只有通过反复试验才能找到。 我应该知道,我负责构建可以完成您想做的事情的工具。 自1999年以来,我们就一直在这样做,自2002年以来就可以在市场上购买。

如果使用Windows,则C ++ Memory Validator可以为您提供每个线程分析的统计信息。 http://www.softwareverify.com/cpp-memory.php

“对象”选项卡和“大小”选项卡都有“线程”子选项卡,可让您查看每个线程的数据。 您还可以在“分析”选项卡上运行高级查询,这将使您可以按线程查看数据。

花时间在工作上,而不是在写工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM