我希望将malloc
包装在一个函数中,该函数将打印分配大小、指针地址和分配时间。这可以通过我的malloc
实现预加载我的共享库来实现。这段代码实现了以下目标:
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
static void* (*real_malloc)(size_t size) = NULL;
static void* (*real_calloc)(size_t nelements, size_t elementSize) = NULL;
static void init(void)
{
real_malloc = dlsym(RTLD_NEXT, "malloc");
if (NULL == real_malloc)
{
fprintf(stderr, "Error: %s\n", dlerror());
}
}
void *malloc(size_t size)
{
if(real_malloc == NULL)
{
init();
}
void *p = NULL;
p = real_malloc(size);
fprintf(stderr, "size=%lu, pointer=%p\n", size, p);
return p;
}
但是,如果我将时间打印功能添加到malloc
static void printTime()
{
time_t timer;
char buffer[26];
struct tm* tm_info;
time(&timer);
tm_info = localtime(&timer);
strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
fprintf(stderr, "%s\n", buffer);
}
并添加time.h
头文件,并使用可执行文件运行我的.so库,它将会冻结,什么也不做。
我怀疑time
或localtime
在幕后调用malloc
,不知何故这会导致问题。另一方面,real_malloc
确实被调用了,所以应该不会有问题。
我的可执行文件是多线程的,但是添加互斥锁没有帮助。我编译.so的方式如下:
gcc -fPIC -shared -o bin/libpreload.so myAlloc.c -ldl
可以使用Linux ps
程序验证该问题:
cd /bin && LD_PRELOAD=/home/username/Desktop/alloc/bin/libpreload.so ./ps
下面是我的.so的ldd
输出:
发布于 2019-05-17 07:10:03
如果malloc
中的日志函数最终调用了malloc
,则需要跳出递归循环。
因此,仅当在日志记录之外调用malloc时才执行日志记录。
void *malloc(size_t size)
{
if(real_malloc == NULL)
{
init();
}
void *p = NULL;
p = real_malloc(size);
if (do_logging)
{
do_logging = 0;
fprintf(stderr, "size=%lu, pointer=%p\n", size, p);
printTime();
do_logging = 1;
}
return p;
}
当然,如果您想让它在多线程程序中工作,就必须将do_logging
放在线程本地存储中。在c11和更高版本中,您可以这样做:
#include <threads.h>
thread_local int do_logging = 1;
哦,你的init
-function可能不是线程安全的。
https://stackoverflow.com/questions/56176875
复制相似问题