我正在研究应用程序中多个线程的内存使用情况。我希望能够跟踪正在运行的任何给定线程的最大分配/当前分配。为此,我计划插入mallocs / frees。在每次调用malloc期间,我会更新静态映射中特定线程的分配记录,该静态映射将线程ID与其特定元数据记录相关联。我目前在流程退出期间遇到问题。我认为问题在于,当所有析构函数都被调用时,必须销毁静态映射和保护它的锁。然而,我插入的mallocs / frees在更新分析元数据结构之前获取了锁。最终,锁被销毁,但后来对malloc / free的调用导致尝试获取不再存在的锁,从而导致段错误。
我担心的另一个问题是在我插入的malloc中生成了对malloc的内部调用,以在地图中分配条目。
关于如何在每个线程的基础上解决内存使用情况分析问题的方法?有关数据结构的任何建议,以跟踪每个线程的使用情况?上述方法是否合理或是否有其他方法可以解决问题?
答案 0 :(得分:0)
如果您将“额外”数据存储为分配本身的一部分(以前更容易,但您也可以在之后执行 - 只需要某个地方的大小),那么您根本不需要任何锁定。只是一点点记忆。当然,您需要使用atomics来更新任何项目列表。
如果你看看这个答案:
Setting memory on a custom heap
并假设HeapAlloc
和HeapFree
分别为malloc
和free
。然后添加代码来存储正在用于分配的线程。
因此,您只需更新链接列表(使用原子来防止多次更新),而不是使用地图。这当然会使每个线程进行最新测量变得更加困难,您必须扫描分配列表。
当然,这仅适用于malloc
和free
的直接电话。
通过“注入”替换malloc
/ free
函数(根据其他帖子中的原则构建,但当然不使用原始malloc
来实现相同的原则)分配内存,而不是使用free
释放内存)。
答案 1 :(得分:0)
这是一件很复杂的事情,可以为所有案件工作。有许多问题你会错过,只有通过反复试验才能找到。我应该知道,我一直负责构建一个能够完成你想做的事情的工具。自1999年以来,我们一直在这样做,自2002年开始商业化。
如果您使用的是Windows,C ++ Memory Validator可以为您提供每线程分析统计信息。 http://www.softwareverify.com/cpp-memory.php。
“对象”选项卡和“大小”选项卡都具有“线程”子选项卡,允许您查看每个线程的数据。您还可以在“分析”选项卡上运行高级查询,以允许您基于每个线程查看数据。
把时间花在工作上,而不是写工具。