Название: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: spectre71 от Апрель 25, 2010, 22:42 QT 4.6.*, Windows XP, сборка mingw (через QT Creator 1.3.1) 1. Предыстория Случился :) очередной глобальный рефакторинг. Обычно после сего я провожу определенные тесты, в том числе на утечку памяти. Новая версия: Ооо... Как все плохо... Кушаем, кушаем, кушаем... Поднимаю предыдущий релиз - все ОК. Начинаю долгое нудное тестирование... 2. Тесты APP.v.(*) - приложение собранное под версией * QT.v.(*) - динамические библиотеки QT версии *, подключаемые к приложению. Список : QtCore4.dll QtGui4.dll QtNetwork4.dll QtHelp4.dll QtXml4.dll QtXmlPatterns4.dll QtAssistantClient4.dll QtWebKit4.dll phonon4.dll (нужна для QtWebKit4.dll - не для меня) --------- APP.v.(4.6.0) + QT.v.(4.6.0) --------- Код: Итерация "Mem Usage" "VM Size" --------- APP.v.(4.6.0) + QT.v.(4.6.1) APP.v.(4.6.0) + QT.v.(4.6.2) APP.v.(4.6.2) + QT.v.(4.6.2) --------- Код: Итерация "Mem Usage" "VM Size" (для всех 3-х тестов +/- 0.2 MB) В данном случае наблюдаем стабильную утечку ~ 1.5 MB на 1000 итераций 3. Условия проведения - APP запускалось с идентичными исходными параметрами для всех тестов (в том числе размеры оконных элементов) - Расход памяти отслеживался через "Windows Task Manager" - Использовалась специальная программа для эмуляции щелчков мыши - Сам тест - циклическое селектирование (попеременно) 2-х позиций в центральной таблице - Итерация - одно селектирование. Частота ~10 селектирований/сек. Ниже привожу анимационный "gif" поясняющий процесс тестирования: 4. Что за фигня 99% - бага QT. Может кто сталкивался с подобным? Или желает найти в чем проблема? Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: SABROG от Апрель 25, 2010, 23:16 4. Что за фигня 99% - бага QT. Может кто сталкивался с подобным? Или желает найти в чем проблема? Если бы для меня это было действительно важно, то я бы отключил все ОС зависимые API, загрузил Ubuntu, собрал программу под ней и протестировал под Valgrind'ом. Всё остальное гадание на кофейной гуще. Багов в Qt достаточно, как и везде впрочем. Эти клики по итемам в списке запускают слишком много цепочных функций, о чем свидетельствуют изменения в других окнах, значит искать проблему в одном QTableView/Widget бесполезно. Даже выложи тут свои исходники это ничем не поможет. Можно конечно последовательно отключать вызовы функций и методов пока показания не придут в норму, а там уже найти какой из методов был отключен последним, в нем значит и проблема. Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: spectre71 от Апрель 25, 2010, 23:42 4. Что за фигня 99% - бага QT. Может кто сталкивался с подобным? Или желает найти в чем проблема? Если бы для меня это было действительно важно, то я бы отключил все ОС зависимые API, загрузил Ubuntu, собрал программу под ней и протестировал под Valgrind'ом. Всё остальное гадание на кофейной гуще. Багов в Qt достаточно, как и везде впрочем. Эти клики по итемам в списке запускают слишком много цепочных функций, о чем свидетельствуют изменения в других окнах, значит искать проблему в одном QTableView/Widget бесполезно. Даже выложи тут свои исходники это ничем не поможет. Можно конечно последовательно отключать вызовы функций и методов пока показания не придут в норму, а там уже найти какой из методов был отключен последним, в нем значит и проблема. Согласен - все кроме Ubuntu и вообще первого предложения. Проект мультиплатформенный, и Windows в данном случае более приоритетна. Да на каждую операцию(клик) - дофига чего делается. Я потратил 3 дня, в начале на поиск бага у себя, а затем попытку доказать что он в QT. Определять в чем причина у меня пока нет времени. Данный результат меня временно устраивает(баг в QT > 4.6.0, юзаю 4.6.0). В ближайшее время – 2-3 месяца, мне не до подробных исследований. А открыл тему поскольку: - 1% - может я не прав (в данном случае никто не поможет) - мне не до подробных исследований. - может кто подтвердит, найдет причину; напишет баг-репорт. - может кого это волнует и он разберется. Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: garryHotDog от Апрель 26, 2010, 08:08 А ты не хочешь попробовать более ранние версии QT, например, 4.5.2....в операционке CentOS(ветка RedHat), в репозитории стоит версия 4.2.1...наверное не просто так!?
Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: pastor от Апрель 26, 2010, 11:18 Spectre, а Valgrind что говорит?
Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: Igors от Апрель 26, 2010, 12:19 Valgrind - хорошее ружье, но про версию для Вындоуз я ничего не знаю. Можно перекрыть new/delete и посмотреть какие блоки не освобождаются. Статистику собирать напр. так
QHash <size_t, int> ключ - размер блока значение - число таких распределенных блоков Если размер "утекающего" обнаружен - дальше ходы найдутся. Никаких "фундаментальных исследований" это не требует, можно проверить за день (не забыть флажок рекурсии когда сама QHash выделяет :) ) Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: pastor от Апрель 26, 2010, 12:25 Valgrind - хорошее ружье, но про версию для Вындоуз я ничего не знаю. Верно, но как бы Цитировать Проект мультиплатформенный, и Windows в данном случае более приоритетна. Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: mal от Апрель 26, 2010, 20:46 Igors
А как насчет поюзать CrtDbg под виндой? утечки памяти обнаружает - а что нам еще нужно для полного счастья. * Давайте распишу ибо сам долго искал аналог valgrind' а под винду, пока не наткнулся на одном из форумов. Кратко суть такая - перекрываем new/delete - я сделал h-файл следующего вида win32_debug.h": Код: #ifndef WIN32_DEBUG_H далее включаем этот h-файл там где хотим поискать утечки. в main делаем такой финт: Код: ... осталось включить этот win32_debug.h в те файлы, где мы хотим поискать утечки памяти. по завершении программы имеем лог-файл куда свалено все по обнаруженным утечкам памяти. Так new мы перекрыли, то все наши утечки ищем по имени файла . Например был файл my_file.cpp (и в него я сделал включение win32_debug.h !) - ищем вхождение "my_file.cpp" и если утечки в нем были - находим строку примерно следующего вида: Код: Dumping objects -> Видим что имеем утечку в файле my_file.cpp в строке 1691 - лезем в свой код и устраняем ошибку. Не знаю как насчет кутэшных, но таким образом можно вычистить все свои косяки по работе с памятью. Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: Igors от Апрель 26, 2010, 21:18 Igors Не знаком с этим тулзом, вообще для меня Вындоуз - печальная необходимость. Здравый смысл говорит: нужно его установить, освоить - это, может быть, несколько дней. Поймает ли он - может да, а может и нет (к этому надо спокойно относиться). С др. стороны предложенный мною "велосипед" хоть и примитивен, но все в моих руках, все тестовые изменения компактны, я хорошо понимаю что делаю и поэтому могу сделать быстро. Я могу его локализовать (включить статистику перед тестом строк). Что выбрать? Дело вкуса :)А как насчет поюзать CrtDbg под виндой? утечки памяти обнаружает - а что нам еще нужно для полного счастья. Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: SABROG от Апрель 26, 2010, 21:27 CrtDbg нет в MinGW.
Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: mal от Апрель 27, 2010, 04:23 Зато он есть в MicrosoftVisualStudio ;)
* Опять же под студию есть интегрируемый(!) "искатель" утечек памяти j- RationalPurifyPlus от IBM http://www-01.ibm.com/software/awdtools/purifyplus/ Там можно взять триальную версию на месяц. Хотя например вот тут http://rutracker.org/forum/viewtopic.php?t=88149 есть вполне себе работающая версия с таблеткой ;) Вот что написано про нее: Цитировать IBM Rational PurifyPlus 7.0.0.0-011 build 10166 picСистемные требования: Процессор: Pentium III или старше Операционная система: Windows 2000, Windows 2003, Windows XP Professional, Vista, Server 2008 Языки программирования и компиляторы: * Microsoft Visual Studio 2008 * Microsoft Visual Studio 2005 * Microsoft Visual Studio .NET 2003 * Microsoft Visual Studio .NET * Microsoft Visual Studio 6.0 * Microsoft .NET Framework versions 1.0, 1.1, 1.1 SP1, 2.0, 3.0 used with the following: * Microsoft ASP.NET, Visual Basic, Visual C#, Visual C++, Visual J# with Visual Studio .NET * Microsoft ASP.NET, Visual Basic, Visual C#, Visual C++, Visual J# with Visual Studio .NET 2003 * Microsoft ASP.NET 2.0, Visual Basic, Visual C#, Visual C++, Visual J# with Visual Studio 2005 * Microsoft ASP.NET 2.0, Visual Basic, Visual C#, Visual C++, Visual J# with Visual Studio 2008 * IBM JVM 1.4.2, 5.0 * Sun JVM 1.4.2, 1.5.0 Описание: Rational PurifyPlus - это полный набор автоматизированных инструментальных средств для проведения анализа на этапе выполнения, предназначенный для повышения надежности и производительности приложений, разработанных в среде Windows. Предназначен для Java, C/C++, языков, поддерживаемых оболочкой VS.NET (включая C# и VB.NET), Visual C/C++ и Visual Basic. Проведение анализа на этапе выполнения подразумевает четыре основные функции: * Выявление порчи содержимого в оперативной памяти * Выявление утечек памяти * Профилирование производительности приложений * Анализ полноты кода Пакет Rational PurifyPlus включает в себя несколько средств тестирования, нацеленных на обнаружение различных видов ошибок: - IBM Rational Purify - отслеживает утечки памяти и тестирует программу на наличие runtime-ошибок. Purify тесно интегрируется с VisualStudio и с PureCoverage. Есть возможность идентификации пропущенного при тестировании кода. - IBM Rational Quantify - позволяет собирать ключевую информацию о тестируемом приложении, такую как время исполнения той или иной функции и статистика обращений к функциям. Получив всю нужную информацию, разработчик может оптимизировать код долго работающих функций. Quantify тесно интегрируется с Visual Studio, что позволяет получить доступ к исходному коду тестируемой программы. - IBM Rational PureCoverage - находит пропущенные при тестировании фрагменты в тексте/работе программы, ускоряя тем самым процесс тестирования всего приложения. Имеется возможность параллельного тестирования с последующим сравнением двух версий одного файла. Ставил я Rational PurifyPlus - тоже реально работает. Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: Igors от Апрель 27, 2010, 10:11 mal, спасибо за информацию, буду иметь ввиду для Вындоуз
Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: spectre71 от Апрель 27, 2010, 11:49 Нашел где утечка памяти.
Сделал простой тест. Учтите проверялось только для Windows! Не факт что ошибка будет под Linux или Mac. Но стоит проверить. Учтечку под виндами легко увидеть в "Windows Task Manager". 1) Компилим 2) Запускаем библиотеками с 4.6.0. Утечки нет! 3) Запускаем библиотеками с 4.6.1 или 4.6.2. Стабильная Утечка! Запуск/Приостановка теста кнопкой "Start/Stop" на панели управления. На закладке "Tab 1" - счетчик итераций. На закладке "Tab 2" - QTextEdit. Лучше находиться на закладке "Tab 1", дабы не тормозило из-за перерисовки QTextEdit и быстреее бежали итрации. Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: spectre71 от Апрель 27, 2010, 12:38 Дополнительно.
1) QT 4.6.2 в данном тесте Прогнал уже 200 000 итераций примерно за 40 минут На каждые 100 000 итераций стабильно утекает ~ 7 MB памяти 2) QT 4.6.2 в моем приложении На память убегает примерно в 20 раз быстрее - ~ 7 MB на 5 000 итераций Видимо есть зависимоть от контекста в котором работает QTextEdit. Хотя объем вывода в QTextEdit в приложение в несколько раз меньше. При отключении вывода в QTextEdit память не бежит. 3) QT 4.6.0 - память не бежит ни в каких случаях ни в тесте ни в приложении. Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: Igors от Апрель 27, 2010, 15:38 Мои версии ОС и Qt староваты, но тем не менее
MacOS 10.5.8, Qt 4.5.2 Маленькая но стабильная утечка 1) QT 4.6.2 в данном тесте Да, примерно такаяПрогнал уже 200 000 итераций примерно за 40 минут На каждые 100 000 итераций стабильно утекает ~ 7 MB памяти Название: Re: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0 Отправлено: spectre71 от Апрель 27, 2010, 16:03 Надо проверить на Mac и Linux для версий 4.6.0 и 4.6.2.
А потом уже писать баг-репорт. |