我正在研究多线程应用程序的跟踪工具,尤其是内存分配。
我想要每线程内存分配。我知道当一个线程执行malloc时,使用的内存是全局堆。我想跟踪哪个线程分配了多少内存。
我在malloc上做了一个包装器,每次有一个malloc时递增值:
void *mymalloc(size_t size) {
mem_used[thread_id] += size;
return malloc(size);
}
效果很好。问题在于free
方法,它不会返回释放多少内存。
不要考虑我的解决方案,只是为了展示我的尝试。
编辑:
如上所述,保留自己的桌子是一个太沉重的方法。
答案 0 :(得分: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);
}
这可以优化,但我希望你能得到这个想法......
答案 1 :(得分:1)
我能想到的唯一想法(虽然你可能认为这个)是保留这些列的分配表:
然后,您必须使用自己的 malloc 和免费函数来执行实际的mallocing和释放,同时保持更新分配表。
这是出于调试目的吗?否则,维护此表的开销可能很大。
答案 2 :(得分:0)
这有点复杂。脱离我的头脑:
my_malloc
中,使用size
参数更新地图。free
编写自己的包装器,减去该线程的size
(通过查找指针值检索)。