2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Динамическая память.
Сообщение05.12.2006, 14:53 
У меня тут возник один вопросик, можно ли как-нибудь в програме на Си следить за динамической памятью? Я имею ввиду, что допустим в процессе програмы я несколько раз выделяю динамическую память для своих переменных, в програме происходит освобождение этой памяти и выделение. Так вот хотелось бы следить за этим процессом, т.е. каким то образом проверять что все что нужно было удалено и освобождено и что не осталось ни одного указателя на ненужную область памяти. Хотелось бы это делать без помощи внешних библиотек. На крайний случай просто проверять сколько было дин. памяти в начале и сколько в конце, что бы сравнить и хотя бы знать была ли утечка или нет.

 
 
 
 
Сообщение05.12.2006, 22:21 
Аватара пользователя
:evil:
Существует несколько способов:

1) можно подменить в программе malloc(), free() и realloc() на свои функции, делающие тоже самое, но плюс трассу. Желательно подменить new и delete

2) если среда -- MS, то в библиотек есть пара зацепок (hooks), которые позволяют вставить свои функции для обработки. Плюс, есть MS Application Verifier, который рапортует результаты прогона.

 
 
 
 
Сообщение06.12.2006, 00:54 
Нет я не работаю, под видовс... Когда Вы говорите, что мне нужно заменить фун-ции malloc и free это не совсем мне решает задачу. Хотя конечно там можно вести счет сколько раз функция вызывалась. Но мне бы хотелось более интересного подхода. Я хочу следить за самой памятью, например проверить сколько памяти в куче до и потом посмотреть сколько после. Желательно делать это без вмешательства ассемблера и т.п. Я хочу проверить если есть неосвобожденная память, ну и если средствами Си это возможно то и узнать где именно этот фрагмент находится. Буду благодарен за любую подсказку.

 
 
 
 
Сообщение06.12.2006, 01:02 
Аватара пользователя
:evil:
Вам нужно посмотреть исходные тексты Вашей библиотеки времени исполнения. Может быть, Вы найдете там ответы на все Ваши вопросы.

Что же касается вышеописанной подмены, то многое зависит от Вас. Я, например, записывал каждое обращение в файл, и потом прогонял скрипт, проверявший парность. Программа, конечно, замедлялась, зато абсолютная уверенность…

Есть и другие трюки. Иногда удобно захватывать память пулами, а потом освобождать пул целиком. Это освобождает от необходимости аккуратно освобождать память в пуле (пул только растет) и уменьшает накладные расходы. Правда, пул можно освободить только когда все объекты в пуле умирают.

 
 
 
 
Сообщение06.12.2006, 02:40 
А можно подробнее про пул? Я не совсем с этим понятием знаком. Я не могу проверить исходниик своей библиотеки, я подключаюсь через терминал к юниковскому серверу в универе и у меня очень ограниченный доступ. Мне нужно это сделать стандартными библиотечными функциями.

 
 
 
 
Сообщение06.12.2006, 03:08 
Аватара пользователя
:evil:
Идея стара, но сейчас о ней мало знают / редко пользуются. (А ведь разработка 60х)

Вообще говоря, никто не сказал, что одна куча — это хорошо. Просто — да, но хорошо?!? Слишком часто возникают разные трения. Например, кто-то хапает очень маленькими кусочками, а кто-то большими. Возвращают, но возникает фрагментация памяти. Или другой пример: захват памяти thread'ами. Если памать общая, приходится делать глоабальную блокировку.

Отсюда идея: сделать вариант управления памятью, при котором не просто запрашивают сколько надо, но и из какой кучи (пула). Дальше — интереснее. Пулы можно пополнять динамически (не хватило места — запросим глобальной памяти. Если пул не разделяется между thread'ами, нам и блокировка не нужна (ну, только на момент пополнения). Если разделяется — все равно, блокируются только thread'ы использующие этот пул (блокировка перестает быть глобальной). Мелкие запросы оказываются в одном пуле, крупные — в другом, и фрагментация уменьшается. У пулов может быть общий интрефейс запросов, и разная реализация. Одна из реализаций — когда пул не производит реального возврата памяти (по pool.free(), жадный пул), а возвращает всю память в систему только по уничтожению пула. Жестоко, но иногда очень эффективно.

Описание стандартной Unix-библиотеки есть на Sinlge Unix (посмотрите ссылку в интернет-ресурсах).

 
 
 
 
Сообщение06.12.2006, 16:13 
Частичный оффтоп:
ИМХО программа должна быть написана так, чтобы свести вероятность утечки памяти в минимуму. Для этого малоподходит язык С, а вот в Си++ уже можно разработать концепции, позволяющие следить за использованием памяти, и очищать ненужную автоматически. См. к примеру Джефф Элджер "C++ for real programmers" и вообще концепцию умных указателей.
Что-то сходу не соображу, какими методами достигнуть похожего в С.

 
 
 
 
Сообщение06.12.2006, 19:52 
Аватара пользователя
:evil:
Бесплатный сыр бывает только в мышеловке. А за «ум» указателей приходиться платить, и, иногда, не мало. Кроме того, мы не всегда пишем программу от начала и до конца. Что делать, если какая-то нужная библиотека не знакома с этой концепцией?

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group