我想包装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
可以使用Linuxps
程序验证该问题:
cd /bin && LD_PRELOAD=/home/username/Desktop/alloc/bin/libpreload.so ./ps
如果您的日志记录功能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
功能可能不是线程安全的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句