相关疑难解决方法(0)

使用LD_PRELOAD机制覆盖'malloc'

我正在尝试编写一个简单的共享库,它可以将malloc调用记录到stderr(如果你愿意,可以使用某种'mtrace').

但是,这不起作用.这是我做的:

/* mtrace.c */
#include <dlfcn.h>
#include <stdio.h>

static void* (*real_malloc)(size_t);

void *malloc(size_t size)
{
    void *p = NULL;
    fprintf(stderr, "malloc(%d) = ", size);
    p = real_malloc(size);
    fprintf(stderr, "%p\n", p);
    return p;
}

static void __mtrace_init(void) __attribute__((constructor));
static void __mtrace_init(void)
{
    void *handle = NULL;
    handle = dlopen("libc.so.6", RTLD_LAZY);
    if (NULL == handle) {
        fprintf(stderr, "Error in `dlopen`: %s\n", dlerror());
        return;
    }
    real_malloc = dlsym(handle, "malloc");
    if (NULL == real_malloc) {
        fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
        return;
    } …
Run Code Online (Sandbox Code Playgroud)

c malloc dynamic-linking

39
推荐指数
4
解决办法
3万
查看次数

glibc弃用的__malloc_hook功能的替代方案

我正在为C写一个内存分析器,因为它拦截了对mall的调用malloc,reallocfree通过malloc_hooks 来调用函数.不幸的是,由于它们在多线程环境中的不良行为而被弃用.我找不到描述替代最佳实践解决方案的文档来实现同样的事情,有人可以启发我吗?

我已经读过一个简单的#define malloc(s) malloc_hook(s)方法可以解决这个问题,但是这对我想到的系统设置不起作用,因为它太过于干扰原始代码库,不适合在分析/跟踪工具中使用.必须手动更改原始应用程序代码是任何体面的分析器的杀手.最理想的是,我要寻找的解决方案只需链接到可选的共享库即可启用或禁用.例如,我当前的设置使用声明的函数__attribute__ ((constructor))来安装拦截malloc挂钩.

谢谢

c malloc gcc glibc deprecated

33
推荐指数
1
解决办法
1万
查看次数

标签 统计

c ×2

malloc ×2

deprecated ×1

dynamic-linking ×1

gcc ×1

glibc ×1