为什么tcmalloc不打印功能名称,它通过提供的dlopen(Why tcmalloc don&#

2019-10-23 14:24发布

我有一些未来项目:main.cpp中

#include <iostream>
#include <cstddef>
#include <dlfcn.h>

int main()
{
    void* handle = dlopen("./shared_libs/libshared.so", RTLD_LAZY);
    if (NULL == handle)
    {
        std::cerr << "Cannot open library: " << dlerror() << '\n';
        return -1;
    }


    typedef int (*foo_t)(const std::size_t);
    foo_t foo = reinterpret_cast<foo_t>(dlsym(handle, "foo"));


    const char* dlsym_error = dlerror();
    if (dlsym_error)
    {
        std::cerr << "Cannot load symbol 'foo': " << dlsym_error << '\n';
        dlclose(handle);
        return -2;
    }


    std::cout << "call foo" << std::endl;
    foo(10);


    dlclose(handle);


    return 0;
}

shared.cpp:

#include <cstddef>
#include <iostream>


extern "C"
{
    int foo(const std::size_t size)
    {
        int b = size / size;
        int* a = new int[size];
        std::cout << "leaky code here" << std::endl;
    }
}

和Makefile:

all:
    g++ -fPIC -g -c shared.cpp
    g++ -shared -o shared_libs/libshared.so -g shared.o
    g++ -L shared_libs/ -g main.cpp -ldl

我用tcmalloc调试该测试程序,其负载动态libshared.so:foo并执行it.run命令:LD_PRELOAD = / USR /本地/ LIB / libtcmalloc.so HEAPCHECK =正常./a.out

1.最大的泄漏:

  • 使用本地文件./a.out。
  • 在1个对象从被分配40个字节泄漏:
  • @ 7fe3460bd9ba 0x00007fe3460bd9ba
  • @ 400b43主
  • @ 7fe346c33ec5 __libc_start_main
  • @ 400999 _start
  • @ 0 _init

为什么我得到的地址0x00007fe3460bd9ba而不是线FOO功能? 请帮忙

附言:我试图用GDB与LD_PRELOAD = ... / tcmalloc.so,但我得到:“有人是ptrace的()荷兰国际集团我们,会自动关机打开perftools堆泄漏检查关”

Answer 1:

尝试删除dlclose电话。

据了解,堆检查和剖析不能处理卸载共享对象的问题。



文章来源: Why tcmalloc don't print function name, which provided via dlopen