【问题标题】:Multithread Memory Profiling in C++C++ 中的多线程内存分析
【发布时间】:2014-06-21 08:36:09
【问题描述】:

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

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

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

【问题讨论】:

  • 您是使用 RAII 作为锁还是使用全局/类静态锁?你能描述一下“对 malloc 的内部调用”吗

标签: c++ multithreading memory profiling profiler


【解决方案1】:

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

如果你看这个答案:

Setting memory on a custom heap

并想象HeapAllocHeapFree 分别是mallocfree。然后添加代码来存储哪个线程被用于分配。

因此,您无需使用映射,而是简单地更新链表(使用原子来防止多次更新)。这当然会使每个线程的最新测量变得更加困难,您必须扫描分配列表。

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

通过“注入”替换malloc/free 函数(按照另一篇文章中的原则构建,但当然不使用原始malloc 分配内存,而不是使用free 释放内存)。

【讨论】:

    【解决方案2】:

    这是一件复杂的事情,并且适用于所有情况。您会错过许多问题,并且只能通过反复试验才能找到。我应该知道,我一直负责构建一个工具来做你想做的事情。我们从 1999 年就开始这样做了,从 2002 年开始商业化。

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 1970-01-01
      • 2010-09-13
      • 2021-11-18
      • 2011-06-15
      • 2016-02-10
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多