LINUX.ORG.RU

boehmgc через LD_PRELOAD чтобы заменить malloc/free

 ,


0

1

Есть плохо написанная программа которая течёт по памяти. Изначально это не являлось проблемой потому что она расчитана на однократный запуск. А теперь потребовалось её держать в памяти и кормить новыми данными. Естественно, через некоторое время она отжирает всю память и падает. Я вот подумал, а что если прикрутить garbage collector? Есть ли уже готовые решения для такого или надо колхозить?

PS Прога ничего mission-critical не делает, делается это всё just for fun.

cast tailgunner, mv, madcore, anonymous, sdio, hizel, mashina

★★★★★
Ответ на: комментарий от tailgunner

Эм, я имел в виду, есть ли уже готовая либа которую можно было бы в LD_PRELOAD указать? Ну, чтобы самому вот такое не писать:

#include <gc.h>

void *malloc(size_t size) {
  return GC_MALLOC(size);
}

Или boehm-gc это умеет? Я что-то пока не увидел в доках.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Сделал вот так и оно падает с Exclusion ranges overlap :(. Подозреваю проблемы с двойным инициализирвоанием. Есть идеи как лечить?

$ cat gcpreload.c
#include <stdio.h>
#include <gc.h>

void __attribute__((constructor)) _initializer (void) {
  printf("gcpreload inits!\n");
  GC_INIT();
}

void *malloc(size_t size) {
  return GC_MALLOC(size);
}

void free(void *ptr) {
  GC_FREE(ptr);
}
void *calloc(size_t nmemb, size_t size) {
  return GC_MALLOC(nmemb*size);
}

void *realloc(void *ptr, size_t size) {
  return GC_REALLOC(ptr, size);
}

///////////////////////////////////////////
$ cat test.c
#include <stdlib.h>

int main(void) {
  void* ptr = malloc(1);
}

///////////////////////////////////////////
$ cat run.sh
gcc -shared -fPIC ./gcpreload.c -o gcpreload.so -lgc
gcc ./test.c -o test
LD_PRELOAD="./gcpreload.so" ./test

PS Ещё попытался запустить вот так: LD_PRELOAD=/usr/lib/libgc.so GC_FIND_LEAK=1 GC_PRINT_STATS=1 GC_DUMP_REGULARLY=1 <прога>

Но это никак не повлияло на вывод на экран. Я где-то туплю, но не понимаю где.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Я понял проблему в коде выше: сам gc тоже использует malloc/free. Т.е., если переименовать malloc в malloc1 то всё запускается. Что делать?

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

сам gc тоже использует malloc/free. Т.е., если переименовать malloc в malloc1 то всё запускается. Что делать?

Ну, если по-хорошему, то нужно модифицировать программу. А так - посмотри, нельзя ли задать свои аллокаторы.

tailgunner ★★★★★
()
Ответ на: комментарий от devl547

Да, на тестовой программе получилось.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от devl547

Как думаешь, стоит просить мейнтейнеров собирать с этой опцией по-дефолту? Не должно же это вызвать проблем? Дистр арч :)

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Нет, проблем точно не будет. Хочешь - попроси.

devl547 ★★★★★
()

valgrind тчк

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.