4

我正在开发用于多线程应用程序的跟踪工具,尤其是关于内存分配的跟踪工具。

我想要一个每个线程的内存分配。我知道当一个线程做 malloc 时,使用的内存是全局堆。我想跟踪哪个线程分配了多少内存。

我对 malloc 做了一个包装,每次有 malloc 时递增值:

void *mymalloc(size_t size) {
    mem_used[thread_id] += size;
    return malloc(size);
}

它运作良好。问题在于free方法,它不返回释放了多少内存。

不要考虑我的解决方案,这只是为了展示我的尝试。

编辑:

如上所述,保留自己的桌子是一种过于繁重的方法。

4

3 回答 3

8

如何将 mymalloc 更改为:

int* mymem = malloc(size + sizeof(int)*2);
mymem[0] = thread_id;
mymem[1] = size;
mem_used[thread_id] += size;
return &mymem[2].

然后,在 myfree(void* mem) 中,您:

void myfree(void* mem)
{
    int* imem = (int*)(mem - sizeof(int)*2);
    int thread_id = imem[0];
    int size = imem[1];
    mem_used[thread_id] -= size;
    free(imem);
}

这可以优化,但我希望你明白......

于 2009-04-23T10:28:17.263 回答
1

我能想到的唯一想法(尽管您可能考虑过这一点)是在这些列中保留一个分配表:

  • ThreadID(当然)
  • 指针
  • 分配大小

然后,您将不得不使用自己的mallocfree函数来执行实际的 malloc 和 free 操作,同时还要保持分配表的更新。

这是为了调试目的吗?因为否则,维护此表的开销可能很大。

于 2009-04-23T10:29:20.537 回答
0

这有点复杂。在我的头顶上:

  • 使用为该指针分配的指针值和内存大小创建一个映射。
  • 在您的my_malloc中,使用参数更新地图size
  • 编写您自己的包装器来free减去该size线程的(您通过查找指针值来检索)。
于 2009-04-23T10:27:29.280 回答