如何预加载共享库并使用在同一包装函数中使用malloc的函数包装malloc?

尤斯

我想包装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库,它只会冻结而无所事事。

我怀疑是在幕后timelocaltime打来电话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

下面也是ldd我的.so输出:在此处输入图片说明

HAL9000

如果您的日志记录功能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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用包装器函数调用Malloc

Java构造函数无法在同一包中使用

Chocolatey允许并排使用同一包装的多个版本吗?

如何包装一个C函数,该函数使用ctypes返回指向malloc数组的指针?

如何使Byte Buddy将多个类型加载到同一包装类加载器中

您如何包装一个C函数,该函数使用ctypes返回指向malloc&d数组的指针?

如何使用由同一包装箱中的另一个宏定义的宏?

为什么在同一包装中看不到包装保护方法?

R如何在同一包中使用文件

JavaFX“位置是必需的。” 即使在同一包装中

确保同一包装中的两个div高度相等

在包__init__内修补函数,并在同一包内的模块内使用它

如何在Numba中使用指针包装CFFI函数

在 type() 函数中使用包装变量。柏

Python3包装函数

一包T型包装的模板

获取一包包装

如何使用Sinon存根“包装器”函数?

Java函数接口:如何使用andThen或类似函数包装函数

如何使用malloc()函数以返回数组?

如何使用malloc从函数返回char数组

如何引用在ON CONFLICT中使用函数的唯一索引?

如果参数之一包含多个值,如何使用currying函数工作?

在 Kotlin 中使用高阶函数在 try catch 中包装一个函数

如何在同一包中的另一个类中使用一个类?

转:同一包中的未定义函数

从同一包中的过程返回特定事物的函数

使用“约束”包使包装函数的多态性降低

使用传递给函数的闭包会导致malloc崩溃