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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Утечка памяти? QT 4.6.1(4.6.2) против 4.6.0  (Прочитано 15656 раз)
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"
1000       48.3 MB     40.3 MB
2000       48.5 MB     40.4 MB
5000       48.4 MB     40.4 MB
10000      48.3 MB     40.3 MB

---------
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)
1000       49.4 MB     41.3 MB
2000       51.2 MB     43.2 MB
5000       56.2 MB     48.1 MB
10000      64.7 MB     56.6 MB

В данном случае наблюдаем стабильную утечку ~ 1.5 MB на 1000 итераций

3. Условия проведения
- APP запускалось с идентичными исходными параметрами для всех тестов (в том числе размеры оконных элементов)
- Расход памяти отслеживался через "Windows Task Manager"
- Использовалась специальная программа для эмуляции щелчков мыши
- Сам тест - циклическое селектирование (попеременно) 2-х позиций в центральной таблице
- Итерация - одно селектирование. Частота ~10 селектирований/сек.


Ниже привожу анимационный "gif" поясняющий процесс тестирования:

4. Что за фигня
99% - бага QT.
Может кто сталкивался с подобным?
Или желает найти в чем проблема?
Записан
SABROG
Гость
« Ответ #1 : Апрель 25, 2010, 23:16 »

4. Что за фигня
99% - бага QT.
Может кто сталкивался с подобным?
Или желает найти в чем проблема?

Если бы для меня это было действительно важно, то я бы отключил все ОС зависимые API, загрузил Ubuntu, собрал программу под ней и протестировал под Valgrind'ом. Всё остальное гадание на кофейной гуще. Багов в Qt достаточно, как и везде впрочем. Эти клики по итемам в списке запускают слишком много цепочных функций, о чем свидетельствуют изменения в других окнах, значит искать проблему в одном QTableView/Widget бесполезно. Даже выложи тут свои исходники это ничем не поможет. Можно конечно последовательно отключать вызовы функций и методов пока показания не придут в норму, а там уже найти какой из методов был отключен последним, в нем значит и проблема.
Записан
spectre71
Гость
« Ответ #2 : Апрель 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% - может я не прав (в данном случае никто не поможет)
- мне не до подробных исследований.
- может кто подтвердит, найдет причину; напишет баг-репорт.
- может кого это волнует и он разберется.


« Последнее редактирование: Апрель 25, 2010, 23:44 от Spectre » Записан
garryHotDog
Гость
« Ответ #3 : Апрель 26, 2010, 08:08 »

А ты не хочешь попробовать более ранние версии QT, например, 4.5.2....в операционке CentOS(ветка RedHat), в репозитории стоит версия 4.2.1...наверное не просто так!?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Апрель 26, 2010, 11:18 »

Spectre, а Valgrind что говорит?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 26, 2010, 12:19 »

Valgrind - хорошее ружье, но про версию для Вындоуз я ничего не знаю. Можно перекрыть new/delete и посмотреть какие блоки не освобождаются. Статистику собирать напр. так

QHash <size_t, int>

ключ - размер блока
значение - число таких распределенных блоков

Если размер "утекающего" обнаружен - дальше ходы найдутся. Никаких "фундаментальных исследований" это не требует, можно проверить за день (не забыть флажок рекурсии когда сама QHash выделяет  Улыбающийся )
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Апрель 26, 2010, 12:25 »

Valgrind - хорошее ружье, но про версию для Вындоуз я ничего не знаю.

Верно, но как бы

Цитировать
Проект мультиплатформенный, и Windows в данном случае более приоритетна.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
mal
Гость
« Ответ #7 : Апрель 26, 2010, 20:46 »

Igors
А как насчет поюзать CrtDbg под виндой? утечки памяти обнаружает - а что нам еще нужно для полного счастья.
*
Давайте распишу ибо сам долго искал аналог valgrind' а под винду, пока не наткнулся на одном из форумов.

Кратко суть такая - перекрываем new/delete  - я сделал h-файл следующего вида win32_debug.h":
Код:
#ifndef WIN32_DEBUG_H
#define WIN32_DEBUG_H

#if(defined WIN32 && defined _DEBUG)
#define WIN32_DEBUG
#include <crtdbg.h>
#define _CRTDBG_MAP_ALLOC // enable generation of debug heap alloc map
#define new new( _NORMAL_BLOCK, __FILE__, __LINE__) // redefine "new" to get file names in output
#endif
 
#endif

далее включаем этот h-файл там где хотим поискать утечки.

в main делаем такой финт:
Код:
...
#ifndef WIN32_DEBUG_H
#include "win32_debug.h"
#endif


int main(int argc, char *argv[])
{
QApplication a(argc, argv);

#ifdef WIN32_DEBUG
_CrtMemState _ms;
HANDLE hLogFile;
hLogFile = CreateFile("../Debug/log/log_mem_leak.txt", GENERIC_WRITE,
      FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
      FILE_ATTRIBUTE_NORMAL, NULL);
   _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
   _CrtSetReportFile(_CRT_WARN, hLogFile);
_CrtMemCheckpoint(&_ms); // now forget about objects created before
#endif
...
// тело программы
...
#ifdef WIN32_DEBUG
_CrtMemDumpAllObjectsSince(&_ms); // dump leaks
CloseHandle(hLogFile);
#endif
return res;
}

осталось включить этот win32_debug.h  в те файлы, где мы хотим поискать утечки памяти.
по завершении программы имеем лог-файл куда свалено все по обнаруженным утечкам памяти. Так new мы перекрыли, то все наши утечки ищем по имени файла . Например был файл my_file.cpp (и в него я сделал включение  win32_debug.h !) - ищем вхождение "my_file.cpp" и если утечки в нем были - находим строку примерно следующего вида:
Код:
Dumping objects ->
...
.\my_file.cpp(1691) : {37521} normal block at 0x015293A0, 4 bytes long.
 Data: <@   > 40 00 9F 03

Видим что имеем утечку в файле my_file.cpp в строке 1691 - лезем в свой код и устраняем ошибку.
Не знаю как насчет кутэшных, но таким образом можно вычистить все свои косяки по работе с памятью.
« Последнее редактирование: Апрель 26, 2010, 21:04 от mal » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 26, 2010, 21:18 »

Igors
А как насчет поюзать CrtDbg под виндой? утечки памяти обнаружает - а что нам еще нужно для полного счастья.
Не знаком с этим тулзом, вообще для меня Вындоуз - печальная необходимость. Здравый смысл говорит: нужно его установить, освоить - это, может быть, несколько дней. Поймает ли он - может да, а может и нет (к этому надо спокойно относиться).  С др. стороны предложенный мною "велосипед" хоть и примитивен, но все в моих руках, все тестовые изменения компактны, я хорошо понимаю что делаю и поэтому могу сделать быстро. Я могу его локализовать (включить статистику перед тестом строк). Что выбрать? Дело вкуса  Улыбающийся
Записан
SABROG
Гость
« Ответ #9 : Апрель 26, 2010, 21:27 »

CrtDbg нет в MinGW.
Записан
mal
Гость
« Ответ #10 : Апрель 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 - тоже реально работает.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Апрель 27, 2010, 10:11 »

mal, спасибо за информацию, буду иметь ввиду для Вындоуз
Записан
spectre71
Гость
« Ответ #12 : Апрель 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 и быстреее бежали итрации.
Записан
spectre71
Гость
« Ответ #13 : Апрель 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 - память не бежит ни в каких случаях ни в тесте ни в приложении.
   
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Апрель 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 памяти
Да, примерно такая
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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