gpt4 book ai didi

c - LD_PRELOADing malloc 和 free

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:49 27 4
gpt4 key购买 nike

我自己编写了 mallocfree 并将它们编译到一个共享库中。我用我的程序 LD_PRELOAD 那个库。通过这种方式,我的程序将始终使用我的自定义 mallocfree 还是在某些情况下不是这样。我听说 gcc 也内置了 malloc 和 free。我的 gcc 附带的 glibc 是否有可能使用内置的 mallocfree

其次,我注意到当我运行我的程序时,我看到 free 函数调用比 malloc/calloc 调用更频繁(98 到 16)。我自己不做任何内存分配(除了一个地方),所以所有分配都是由我使用的标准库函数完成的。还要注意我在我的程序中使用了 pthread。如果你想知道,我的程序是这样的。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>

#define NUM_THREADS 8

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

int sum;
float total = 1;
extern int __did_libc_start_main;

void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
pthread_mutex_lock( &m );
sum++;
total *= total + tid * 0.097891313423578;
printf( "p%d, tid%d, total = %g, start = %d!\n", getpid(), tid, total, 0 );
pthread_mutex_unlock( &m );
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
char * p;
char * m;

fork();

p = (char*)mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
p[0] = 78;
printf( "p = %p, p[0] = %d, pid = %d!\n", p, p[0], getpid() );
m = (char*)malloc( 80 );
printf( "m = %p!\n", m );
#if 1
for(t=0; t<NUM_THREADS; t++)
{
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
for(t=0; t<NUM_THREADS; t++)
pthread_join(threads[t], NULL);

printf( "\n\nTotal = %g\n\n", total );

/* Last thing that main() should do */
pthread_exit(NULL);
#endif
printf( "\n\n%d: Done without major problems\n\n", getpid() );
return 0;
}

最佳答案

使用 LD_PRELOAD 覆盖 malloc 等预计会起作用;这就是例如DUMA有效。

除了 malloccallocfree 之外,确保覆盖 reallocmemalign valloc。此外,您可能需要覆盖 C++ newnew[]deletedelete[]

参见 Overriding 'malloc' using the LD_PRELOAD mechanism有关如何正确执行此操作的示例。

关于c - LD_PRELOADing malloc 和 free,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913186/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com