есть ли на солярисе альтернативный malloc и бесплатная библиотека? - PullRequest
2 голосов
/ 13 декабря 2011

Я пытаюсь найти утечки памяти в очень сложной устаревшей системе, написанной на C ++ / C в операционной системе Solaris. Идея состоит в том, чтобы регистрировать каждый malloc и бесплатно, а затем обрабатывать журнал.

Мне удалось написать заглушку malloc и свободную функцию, которая вызывается правильно. проблема в том, что они не делают ничего, кроме лога. В результате система вылетает

У меня вопрос: являются ли они заменяющей библиотекой malloc, работающей на солярисе, которая может вызываться из моей заглушки malloc & free functions?

Ответы [ 3 ]

3 голосов
/ 13 декабря 2011

Почему бы вам просто не сделать LD_PRELOAD из libumem и использовать UMEM_DEBUG? Страница man для umem_debug должна дать вам больше информации.

3 голосов
/ 13 декабря 2011

В идеале, вам нужен какой-нибудь инструмент для профилирования памяти, но в отсутствие этого вы можете попытаться реализовать свой собственный детектор утечек, как вы планируете.

Вы можете просто вызвать библиотеку malloc и freeверсии через вашу обертку.

Вот схема, которую вы можете попытаться реализовать:

Ваша функция оболочки должна реализовывать функциональность, в которой ваша оболочка для malloc хранит номер строки, имя файла, запрашиваемый размер и адрес, являющийсявозвращается malloc в связанном списке.
Как получить имя файла и номер строки?
Подсказка: используйте __FILE__, __LINE__

Оболочка free должна проверять адрес, отправляемый дляосвобождение от списка и удалить запись из связанного списка.

В конце программы вы должны распечатать содержимое этого связанного списка, в котором указан объем памяти, имя файла и номер строки, из которой был выделен буфер.

Обновление:
Как вы сопоставляете программы malloc вызовы собственных вызовов-оболочек без бесконечной рекурсии?

Через умное использованиеМакросы!

#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__)

void* my_malloc(size_t size, const char *file, int line, const char *func)
{

    void *p = malloc(size);
    printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);

    /*Link List functionality goes in here*/

    return p;
}
0 голосов
/ 14 декабря 2011

В дополнение к libumem, я бы рекомендовал использовать Solaris Studio dbx, который включает в себя RTC , детектор утечки памяти.

...