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

Multithread Memory Profiling in C++

本文关键字:内存 多线程 c++      更新时间:2023-10-16

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

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

在每个线程的基础上分析内存使用的方法有什么想法吗?对跟踪每个线程使用情况的数据结构有什么建议吗?上面的方法看起来合理吗?还是有其他的方法来解决这个问题?

如果您将"额外的"数据存储为分配本身的一部分(之前更容易,但之后也可以这样做——只需要在某个地方确定大小),那么您根本不需要任何锁。再多一点内存。当然,您需要使用原子来更新任何项列表。

如果你看这个答案:

在自定义堆上设置内存

,想象HeapAllocHeapFree分别是mallocfree。然后添加代码来存储正在用于分配的线程。

因此,不使用映射,只需更新链表(使用原子来防止多次更新)。当然,这使得对每个线程进行最新的测量变得有点困难,您将不得不扫描分配列表。

当然,这只适用于直接调用mallocfree

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

这是一件很复杂的事情,并使其适用于所有情况。有许多问题你会错过,只有通过尝试和错误才能发现。我应该知道,我一直负责构建一个工具来做你想做的事情。我们从1999年开始这样做,从2002年开始商业化。

如果你使用的是Windows, c++内存验证器可以给你每个线程的分析统计。http://www.softwareverify.com/cpp-memory.php。

对象选项卡和大小选项卡都有线程子选项卡,允许您查看每个线程的数据。您还可以在Analysis选项卡上运行高级查询,这将允许您以每个线程为基础查看数据。

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