Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Стандартные средства


Автор: Rickert 14.3.2007, 13:42
Интересуют стандартные средства для поиска утечек, чтобы указывали хоть строку, по исполнению которой была получена ошибка сегментации. Возможности установить новый софт - нет, аксиома.


Автор: MAKCim 14.3.2007, 22:03
1.
<mcheck.h>
mtrace()
muntrace()
2.
библиотека http://www.inf.ethz.ch/personal/biere/projects/ccmalloc
3.
библиотека http://www.perens.com/FreeSoftware

Автор: Rickert 15.3.2007, 08:53
Цитата

1.
<mcheck.h>
mtrace()
muntrace()

У меня man на них ничего не выдаёт. Не объяснишь вкратце, как их юзать?

Автор: MAKCim 15.3.2007, 09:56
mtrace() ставит хуки на вызовы malloc(), realloc(), free()
muntrace() отключает хуки
переменная среды MALLOC_TRACE должна содержать путь к доступному для записи файлу, куда mtrace() будет сливать всю статистику по вызовам
кроме того, как GNU extensions доступны в libc (<malloc.h>)
__malloc_hook(), __realloc_hook(), __memalign_hook(), __free_hook(), __malloc_initialize_hook(), __after_morecore_hook()
да, еще <mcheck.h> тоже GNU extension

Автор: Rickert 15.3.2007, 12:43
Всё что ты перечислил работает только с malloc / free ?
Я на new / delete ориентировался.

Автор: MAKCim 15.3.2007, 12:49
new/delete реализованы через malloc()/free()
в конце концов можно попробовать

Автор: Rickert 16.3.2007, 12:36
Спасибо!

Автор: proc_maker 22.3.2007, 15:36
Цитата(Rickert @ 15.3.2007,  08:53)
Цитата

1.
<mcheck.h>
mtrace()
muntrace()

У меня man на них ничего не выдаёт. Не объяснишь вкратце, как их юзать?

Скажите пожалуйста, а какими средствами можно сделать то же самое что делает mtrace но только для одного конкретного потока программы, чтобы не получать данные по другим потокам т.к. получаются ОГРОМНЕЙШИЕ логи. И еще попутный вопрос. Как в gdb я могу посмотреть в каком месте программы была выделена эта память (в случае утечки) если стека уже нет, а только остался адрес переменной чтобы найти причину утечки. Т.е. другими словами, я вижу что моя программа занимает пол-гига виртуальной памяти, как узнать какой из потоков занимает ее большую часть чтобы найти где утечка?

Спасибо огромное!

Автор: MAKCim 22.3.2007, 18:56
Цитата(proc_maker @  22.3.2007,  15:36 Найти цитируемый пост)
Скажите пожалуйста, а какими средствами можно сделать то же самое что делает mtrace но только для одного конкретного потока программы, чтобы не получать данные по другим потокам т.к. получаются ОГРОМНЕЙШИЕ логи

mtrace() ставит hook на malloc, а обращение к malloc может быть в разных потоках
так что без извращений никак
я так понимаю у тебя речь идет о pthreads
тогда думаю может помочь связка pthread_self() + mtrace() + __malloc_initialize_hook (см. man malloc_hook)

Автор: proc_maker 23.3.2007, 08:58
Спасибо за совет!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)