Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: andrew.k от Январь 30, 2012, 23:39



Название: Поиск утечки памяти
Отправлено: andrew.k от Январь 30, 2012, 23:39
Возникла необходимость поиска утечки.
Какими инструментами пользуетесь?
Приложение многопоточное. Система типа линункс.
valgrind ничего не показыавет, пишет одни нули, что мол ничего не выделялось и не удалялось. Утечек нет.
Хотя утечка явно есть.

Почему он ничего не видит?


Название: Re: Поиск утечки памяти
Отправлено: LisandreL от Январь 31, 2012, 01:12
Почему он ничего не видит?
Утечка утечке рознь.
Например:
Код:
new QFooBar( parent );
без последующих обращений к оюъекту. По сути тут нничего потекло, так как по удалении parent'а все порождённые так объекты будут удалены и память освободится, но если parent существует на протяжении всего жизненного цикла приложения, то вы будете вполне неилюзорна наблюдать, что память течёт.

Если пробовать искать вручную:
1) по возможности зациклить весь рабочий цикл приложения и убедиться что программа действительно течёт, а вовсе система резервирует память за приложением.
2) по возможности зацикливать отдельные подпроцессы, что бы локализовать проблемное место.
3) в максимально локализованном проблемном месте отсматривать код.

Если речь о потоках:
1) то проверьте, что при закрытии потоков удаляются используемые там обекты.
2) Убедитесь, что потоки у вас завершаются, а не убиваются через QThread::terminate и иже с ним.


Название: Re: Поиск утечки памяти
Отправлено: andrew.k от Январь 31, 2012, 05:19
Почему он ничего не видит?
Утечка утечке рознь.
Например:
Код:
new QFooBar( parent );
без последующих обращений к оюъекту. По сути тут нничего потекло, так как по удалении parent'а все порождённые так объекты будут удалены и память освободится, но если parent существует на протяжении всего жизненного цикла приложения, то вы будете вполне неилюзорна наблюдать, что память течёт.
Спасибо за краткий курс основ Qt. Очень мило)

В ручную естественно пробовал, но это не реально проект большой.
И да действительно течет. 900Мб в памяти это течет?

Нашел похожую тему с потоками и QByteArray.

Если речь о потоках:
1) то проверьте, что при закрытии потоков удаляются используемые там обекты.
2) Убедитесь, что потоки у вас завершаются, а не убиваются через QThread::terminate и иже с ним.
Если бы все было так просто.


Название: Re: Поиск утечки памяти
Отправлено: LisandreL от Январь 31, 2012, 06:59
Спасибо за краткий курс основ Qt. Очень мило
Ну понятно, что в явном виде вы так не напишете, я просто к тому, что формально утечки может и не быть, а память будет занята.

И да действительно течет. 900Мб в памяти это течет?
Ну если полезной информации такого объёма там не содержится, то вероятно да.

Если бы все было так просто.
Если бы всё было так просто вы бы помощи не спрашивали. Если говорить про ручной поиск, то ещё вариант наоборот куски кода исключать, меняя на заглушки и смотреть когда течь исчезнет.
Если течь образовалась недавно, то можно найти в какой ревизии ачалась течь и diff-ом посмотреть что меняли.
Советы примитивные, но не представляя проекта подсказать что-то боле конкретное трудно.

Ну а из инструментов попробуйте с Mudflap'ом поиграться (вы ж gcc используете?). Опыта использования не имею, так что ищите мануалы сами. ;)


Название: Re: Поиск утечки памяти
Отправлено: andrew.k от Январь 31, 2012, 10:41
Видимо очень давно образовалась. Т.к. на маленьких объемах данных почти не заметна утечка.
На больших очень быстро кончается память)
Еще раз говорю проект большой. Что толку, что я буду его тут описывать без кода.

Ручные варианты очевидны, интересуют инструменты.

Да, gcc.
Гугол на mudflap и на mudflap download выдает либо доки либо ерунду.
Где его скачать то?


Название: Re: Поиск утечки памяти
Отправлено: LisandreL от Январь 31, 2012, 10:50
Да, gcc.
Гугол на mudflap и на mudflap download выдает либо доки либо ерунду.
Где его скачать то?
По идее оно должно быть включено в само gcc:
http://lindev.blogspot.com/2011/11/blog-post.html
http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging


Название: Re: Поиск утечки памяти
Отправлено: Igors от Январь 31, 2012, 11:16
Нужно искать инструмент. Насколько я знаю на Линуксе лидирует Valgrind. Я пробовал его на OSX (в принципе тоже nix). Ловит неплохо, минусы замеченные мной

- загибался на больших объемах (гигабайты)
- манипуляции с командной строкой и полное отсутствие мышака часто невыносимы (ну это для Mac пользователя)

А потом на OSX появился Leaks и мой интерес к Valgrind пропал


Название: Re: Поиск утечки памяти
Отправлено: LisandreL от Январь 31, 2012, 11:42
Valgrind он уже пробовал, как видно из первого поста.


Название: Re: Поиск утечки памяти
Отправлено: b-s-a от Январь 31, 2012, 12:05
как вариант, можно запустить под валгриндом, поработать немного, пока куча памяти не скушается. Затем кильнуть программу (если у нее есть возможности по перехвату sigkill, то отключить временно). После этого валгринд создаст огромный отчет. По нему можно попытаться найти причину. Скорее всего, это будет что-то вроде: потеряно 900000000 байт в 1000 блоках... Вот это уже и надо начинать разбирать.


Название: Re: Поиск утечки памяти
Отправлено: Igors от Январь 31, 2012, 14:21
Valgrind он уже пробовал, как видно из первого поста.
Вижу, но не могу же я ответить "плохо смотрел, руки из задницы растут" и.т.п.

как вариант, можно запустить под валгриндом, поработать немного, пока куча памяти не скушается. Затем кильнуть программу (если у нее есть возможности по перехвату sigkill, то отключить временно). После этого валгринд создаст огромный отчет. По нему можно попытаться найти причину. Скорее всего, это будет что-то вроде: потеряно 900000000 байт в 1000 блоках... Вот это уже и надо начинать разбирать.
Да, часто бывает и так, утечек нет, просто кто-то много жрет. У меня для этого др инструмент "Allocations" а как на Линуксе - не знаю


Название: Re: Поиск утечки памяти
Отправлено: andrew.k от Январь 31, 2012, 15:28
Valgrind он уже пробовал, как видно из первого поста.
да. пробовал. Проблема была в том, что он хочет права рута.
Но все равно, что-то он не показал ничего полезного.
Нашел как будто кучу утечек в кутишных классах типа QThread.

Там большое количество потоков и под валгриндом все просто загибается.


Название: Re: Поиск утечки памяти
Отправлено: GreatSnake от Январь 31, 2012, 16:54
да. пробовал. Проблема была в том, что он хочет права рута.
С чего бы это  ???

Попробуй тогда dmalloc.


Название: Re: Поиск утечки памяти
Отправлено: andrew.k от Январь 31, 2012, 17:58
да. пробовал. Проблема была в том, что он хочет права рута.
С чего бы это  ???

Попробуй тогда dmalloc.
Не знаю, может у меня пользователь был сильно ограничен. Хз.
Хотя может че другое помогло.


Название: Re: Поиск утечки памяти
Отправлено: andrew.k от Январь 31, 2012, 18:01
а dmalloc подойдет для отладки qt-приложения?


Название: Re: Поиск утечки памяти
Отправлено: andrew.k от Январь 31, 2012, 18:53
Google Performance Tools кто-нибудь пользовался?
Выдает мне ошибку header size >= 2**16 и все.


Название: Re: Поиск утечки памяти
Отправлено: Авварон от Февраль 01, 2012, 16:55
У эпла очень крутые Instruments


Название: Re: Поиск утечки памяти
Отправлено: Nimbus от Февраль 01, 2012, 17:09
Возникла необходимость поиска утечки.
Какими инструментами пользуетесь?
Приложение многопоточное. Система типа линункс.
valgrind ничего не показыавет, пишет одни нули, что мол ничего не выделялось и не удалялось. Утечек нет.
Хотя утечка явно есть.

Почему он ничего не видит?
А с какими флагами запускали valgrind?
Алсо, юзаю valgrind и для визуализации лога alleyoop


Название: Re: Поиск утечки памяти
Отправлено: andrew.k от Февраль 01, 2012, 19:04
Возникла необходимость поиска утечки.
Какими инструментами пользуетесь?
Приложение многопоточное. Система типа линункс.
valgrind ничего не показыавет, пишет одни нули, что мол ничего не выделялось и не удалялось. Утечек нет.
Хотя утечка явно есть.

Почему он ничего не видит?
А с какими флагами запускали valgrind?
Алсо, юзаю valgrind и для визуализации лога alleyoop
--leak-check=full
Но чем-то конкретным это не помогло.
С какими надо?