Russian Qt Forum
Ноябрь 23, 2024, 08:20
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Qt-инструментарий
>
Поиск утечки памяти
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Поиск утечки памяти (Прочитано 11502 раз)
andrew.k
Гость
Поиск утечки памяти
«
:
Январь 30, 2012, 23:39 »
Возникла необходимость поиска утечки.
Какими инструментами пользуетесь?
Приложение многопоточное. Система типа линункс.
valgrind ничего не показыавет, пишет одни нули, что мол ничего не выделялось и не удалялось. Утечек нет.
Хотя утечка явно есть.
Почему он ничего не видит?
Записан
LisandreL
Птица говорун
Offline
Сообщений: 984
Надо улыбаться
Re: Поиск утечки памяти
«
Ответ #1 :
Январь 31, 2012, 01:12 »
Цитата: andrew.k от Январь 30, 2012, 23:39
Почему он ничего не видит?
Утечка утечке рознь.
Например:
Код:
new QFooBar( parent );
без последующих обращений к оюъекту. По сути тут нничего потекло, так как по удалении parent'а все порождённые так объекты будут удалены и память освободится, но если parent существует на протяжении всего жизненного цикла приложения, то вы будете вполне неилюзорна наблюдать, что память течёт.
Если пробовать искать вручную:
1) по возможности зациклить весь рабочий цикл приложения и убедиться что программа действительно течёт, а вовсе система резервирует память за приложением.
2) по возможности зацикливать отдельные подпроцессы, что бы локализовать проблемное место.
3) в максимально локализованном проблемном месте отсматривать код.
Если речь о потоках:
1) то проверьте, что при закрытии потоков удаляются используемые там обекты.
2) Убедитесь, что потоки у вас завершаются, а не убиваются через QThread::terminate и иже с ним.
Записан
andrew.k
Гость
Re: Поиск утечки памяти
«
Ответ #2 :
Январь 31, 2012, 05:19 »
Цитата: LisandreL от Январь 31, 2012, 01:12
Цитата: andrew.k от Январь 30, 2012, 23:39
Почему он ничего не видит?
Утечка утечке рознь.
Например:
Код:
new QFooBar( parent );
без последующих обращений к оюъекту. По сути тут нничего потекло, так как по удалении parent'а все порождённые так объекты будут удалены и память освободится, но если parent существует на протяжении всего жизненного цикла приложения, то вы будете вполне неилюзорна наблюдать, что память течёт.
Спасибо за краткий курс основ Qt. Очень мило)
В ручную естественно пробовал, но это не реально проект большой.
И да действительно течет. 900Мб в памяти это течет?
Нашел похожую тему с потоками и QByteArray.
Цитата: LisandreL от Январь 31, 2012, 01:12
Если речь о потоках:
1) то проверьте, что при закрытии потоков удаляются используемые там обекты.
2) Убедитесь, что потоки у вас завершаются, а не убиваются через QThread::terminate и иже с ним.
Если бы все было так просто.
Записан
LisandreL
Птица говорун
Offline
Сообщений: 984
Надо улыбаться
Re: Поиск утечки памяти
«
Ответ #3 :
Январь 31, 2012, 06:59 »
Цитата: andrew.k от Январь 31, 2012, 05:19
Спасибо за краткий курс основ Qt. Очень мило
Ну понятно, что в явном виде вы так не напишете, я просто к тому, что формально утечки может и не быть, а память будет занята.
Цитата: andrew.k от Январь 31, 2012, 05:19
И да действительно течет. 900Мб в памяти это течет?
Ну если полезной информации такого объёма там не содержится, то вероятно да.
Цитата: andrew.k от Январь 31, 2012, 05:19
Если бы все было так просто.
Если бы всё было так просто вы бы помощи не спрашивали. Если говорить про ручной поиск, то ещё вариант наоборот куски кода исключать, меняя на заглушки и смотреть когда течь исчезнет.
Если течь образовалась недавно, то можно найти в какой ревизии ачалась течь и diff-ом посмотреть что меняли.
Советы примитивные, но не представляя проекта подсказать что-то боле конкретное трудно.
Ну а из инструментов попробуйте с Mudflap'ом поиграться (вы ж gcc используете?). Опыта использования не имею, так что ищите мануалы сами.
Записан
andrew.k
Гость
Re: Поиск утечки памяти
«
Ответ #4 :
Январь 31, 2012, 10:41 »
Видимо очень давно образовалась. Т.к. на маленьких объемах данных почти не заметна утечка.
На больших очень быстро кончается память)
Еще раз говорю проект большой. Что толку, что я буду его тут описывать без кода.
Ручные варианты очевидны, интересуют инструменты.
Да, gcc.
Гугол на mudflap и на mudflap download выдает либо доки либо ерунду.
Где его скачать то?
Записан
LisandreL
Птица говорун
Offline
Сообщений: 984
Надо улыбаться
Re: Поиск утечки памяти
«
Ответ #5 :
Январь 31, 2012, 10:50 »
Цитата: andrew.k от Январь 31, 2012, 10:41
Да, gcc.
Гугол на mudflap и на mudflap download выдает либо доки либо ерунду.
Где его скачать то?
По идее оно должно быть включено в само gcc:
http://lindev.blogspot.com/2011/11/blog-post.html
http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Поиск утечки памяти
«
Ответ #6 :
Январь 31, 2012, 11:16 »
Нужно искать инструмент. Насколько я знаю на Линуксе лидирует Valgrind. Я пробовал его на OSX (в принципе тоже nix). Ловит неплохо, минусы замеченные мной
- загибался на больших объемах (гигабайты)
- манипуляции с командной строкой и полное отсутствие мышака часто невыносимы (ну это для Mac пользователя)
А потом на OSX появился Leaks и мой интерес к Valgrind пропал
Записан
LisandreL
Птица говорун
Offline
Сообщений: 984
Надо улыбаться
Re: Поиск утечки памяти
«
Ответ #7 :
Январь 31, 2012, 11:42 »
Valgrind он уже пробовал, как видно из первого поста.
Записан
b-s-a
Гость
Re: Поиск утечки памяти
«
Ответ #8 :
Январь 31, 2012, 12:05 »
как вариант, можно запустить под валгриндом, поработать немного, пока куча памяти не скушается. Затем кильнуть программу (если у нее есть возможности по перехвату sigkill, то отключить временно). После этого валгринд создаст огромный отчет. По нему можно попытаться найти причину. Скорее всего, это будет что-то вроде: потеряно 900000000 байт в 1000 блоках... Вот это уже и надо начинать разбирать.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Поиск утечки памяти
«
Ответ #9 :
Январь 31, 2012, 14:21 »
Цитата: LisandreL от Январь 31, 2012, 11:42
Valgrind он уже пробовал, как видно из первого поста.
Вижу, но не могу же я ответить "плохо смотрел, руки из задницы растут" и.т.п.
Цитата: b-s-a от Январь 31, 2012, 12:05
как вариант, можно запустить под валгриндом, поработать немного, пока куча памяти не скушается. Затем кильнуть программу (если у нее есть возможности по перехвату sigkill, то отключить временно). После этого валгринд создаст огромный отчет. По нему можно попытаться найти причину. Скорее всего, это будет что-то вроде: потеряно 900000000 байт в 1000 блоках... Вот это уже и надо начинать разбирать.
Да, часто бывает и так, утечек нет, просто кто-то много жрет. У меня для этого др инструмент "Allocations" а как на Линуксе - не знаю
Записан
andrew.k
Гость
Re: Поиск утечки памяти
«
Ответ #10 :
Январь 31, 2012, 15:28 »
Цитата: LisandreL от Январь 31, 2012, 11:42
Valgrind он уже пробовал, как видно из первого поста.
да. пробовал. Проблема была в том, что он хочет права рута.
Но все равно, что-то он не показал ничего полезного.
Нашел как будто кучу утечек в кутишных классах типа QThread.
Там большое количество потоков и под валгриндом все просто загибается.
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Поиск утечки памяти
«
Ответ #11 :
Январь 31, 2012, 16:54 »
Цитата: andrew.k от Январь 31, 2012, 15:28
да. пробовал. Проблема была в том, что он хочет права рута.
С чего бы это
Попробуй тогда dmalloc.
Записан
Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
Re: Поиск утечки памяти
«
Ответ #12 :
Январь 31, 2012, 17:58 »
Цитата: GreatSnake от Январь 31, 2012, 16:54
Цитата: andrew.k от Январь 31, 2012, 15:28
да. пробовал. Проблема была в том, что он хочет права рута.
С чего бы это
Попробуй тогда dmalloc.
Не знаю, может у меня пользователь был сильно ограничен. Хз.
Хотя может че другое помогло.
Записан
andrew.k
Гость
Re: Поиск утечки памяти
«
Ответ #13 :
Январь 31, 2012, 18:01 »
а dmalloc подойдет для отладки qt-приложения?
Записан
andrew.k
Гость
Re: Поиск утечки памяти
«
Ответ #14 :
Январь 31, 2012, 18:53 »
Google Performance Tools кто-нибудь пользовался?
Выдает мне ошибку header size >= 2**16 и все.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...