Russian Qt Forum
Ноябрь 23, 2024, 08:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Поиск утечки памяти  (Прочитано 11502 раз)
andrew.k
Гость
« : Январь 30, 2012, 23:39 »

Возникла необходимость поиска утечки.
Какими инструментами пользуетесь?
Приложение многопоточное. Система типа линункс.
valgrind ничего не показыавет, пишет одни нули, что мол ничего не выделялось и не удалялось. Утечек нет.
Хотя утечка явно есть.

Почему он ничего не видит?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Январь 31, 2012, 01:12 »

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

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

Если речь о потоках:
1) то проверьте, что при закрытии потоков удаляются используемые там обекты.
2) Убедитесь, что потоки у вас завершаются, а не убиваются через QThread::terminate и иже с ним.
Записан
andrew.k
Гость
« Ответ #2 : Январь 31, 2012, 05:19 »

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

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

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

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

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Январь 31, 2012, 06:59 »

Спасибо за краткий курс основ Qt. Очень мило
Ну понятно, что в явном виде вы так не напишете, я просто к тому, что формально утечки может и не быть, а память будет занята.

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

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

Ну а из инструментов попробуйте с Mudflap'ом поиграться (вы ж gcc используете?). Опыта использования не имею, так что ищите мануалы сами. Подмигивающий
Записан
andrew.k
Гость
« Ответ #4 : Январь 31, 2012, 10:41 »

Видимо очень давно образовалась. Т.к. на маленьких объемах данных почти не заметна утечка.
На больших очень быстро кончается память)
Еще раз говорю проект большой. Что толку, что я буду его тут описывать без кода.

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

Да, gcc.
Гугол на mudflap и на mudflap download выдает либо доки либо ерунду.
Где его скачать то?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Январь 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
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Январь 31, 2012, 11:16 »

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

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

А потом на OSX появился Leaks и мой интерес к Valgrind пропал
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Январь 31, 2012, 11:42 »

Valgrind он уже пробовал, как видно из первого поста.
Записан
b-s-a
Гость
« Ответ #8 : Январь 31, 2012, 12:05 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Январь 31, 2012, 14:21 »

Valgrind он уже пробовал, как видно из первого поста.
Вижу, но не могу же я ответить "плохо смотрел, руки из задницы растут" и.т.п.

как вариант, можно запустить под валгриндом, поработать немного, пока куча памяти не скушается. Затем кильнуть программу (если у нее есть возможности по перехвату sigkill, то отключить временно). После этого валгринд создаст огромный отчет. По нему можно попытаться найти причину. Скорее всего, это будет что-то вроде: потеряно 900000000 байт в 1000 блоках... Вот это уже и надо начинать разбирать.
Да, часто бывает и так, утечек нет, просто кто-то много жрет. У меня для этого др инструмент "Allocations" а как на Линуксе - не знаю
Записан
andrew.k
Гость
« Ответ #10 : Январь 31, 2012, 15:28 »

Valgrind он уже пробовал, как видно из первого поста.
да. пробовал. Проблема была в том, что он хочет права рута.
Но все равно, что-то он не показал ничего полезного.
Нашел как будто кучу утечек в кутишных классах типа QThread.

Там большое количество потоков и под валгриндом все просто загибается.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Январь 31, 2012, 16:54 »

да. пробовал. Проблема была в том, что он хочет права рута.
С чего бы это  Непонимающий

Попробуй тогда dmalloc.
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #12 : Январь 31, 2012, 17:58 »

да. пробовал. Проблема была в том, что он хочет права рута.
С чего бы это  Непонимающий

Попробуй тогда dmalloc.
Не знаю, может у меня пользователь был сильно ограничен. Хз.
Хотя может че другое помогло.
Записан
andrew.k
Гость
« Ответ #13 : Январь 31, 2012, 18:01 »

а dmalloc подойдет для отладки qt-приложения?
Записан
andrew.k
Гость
« Ответ #14 : Январь 31, 2012, 18:53 »

Google Performance Tools кто-нибудь пользовался?
Выдает мне ошибку header size >= 2**16 и все.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 22.