Почему tcmalloc не печатает имя функции, предоставленное через dlopen

У меня есть следующий проект:
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 / local / lib / libtcmalloc.so HEAPCHECK = нормальный ./a.out

1 крупнейших утечек:

  • Используя локальный файл ./a.out.
  • Утечка 40 байтов в 1 объекте, выделенном из:
  • @ 7fe3460bd9ba 0x00007fe3460bd9ba
  • @ 400b43 main
  • @ 7fe346c33ec5 __libc_start_main
  • @ 400999 _start
  • @ 0 _init

Почему я получаю адрес 0x00007fe3460bd9ba вместо строки в функции foo?
пожалуйста помоги

Постскриптум Я пытался использовать GDB с LD_PRELOAD = … / tcmalloc.so, но я получаю:
«Кто-то нас использует ptrace (); он выключится. Отключение проверки утечки кучи perftools»

1

Решение

Попробуйте удалить вызов dlclose.

Это известная проблема, что проверка кучи & профилировщики не могут обрабатывать незагруженные
общие объекты.

0

Другие решения


По вопросам рекламы [email protected]