LINUX.ORG.RU

[Qt] [Memory leaks] Профайлер

 


0

0

Имеется Qt-программа, в которой должна создаваться и удаляться определенная иерархия QGraphicsItem. За нее отвечает иерархия QObject обектов, которые тоже создаются и удаляются.

Последние имеют родителей, первые сначала удаляются со сцены, а потом с помощью delete - но не все, а только верхнего уровня иерархии (как я понял нижний уровень удаляется автоматически ядром Qt).

Вроде бы ничего не забыл но после сотни итераций заметно как потребляемая помять растет. После десяти тысяч итераций (просто в цикле создавал и удалял последовательно объекты) потребляемая память увеличилась с номинальных 10 Mb до 150.

Посоветуйте вменяемый профайлер, с помощью которого можно определить место, в котором течет память. Желательно под linux, но так как программа кроссплатформенная, можно и под Windows.

Пробовал valgrind, но он дает море информации, среди которой трудно найти то, что нужно. Напоминает отладку Qt программы с помощью gdb вручную, без всяких «помощников». Может быть есть что-то специально предназначенное для Qt?


чую что речь идет о new delete =)

MikeDM ★★★★★
()

Профайлер тебе не поможет - скорее всего утечки как таковой нет.

Попробуй выводить иерархию QObject в лог и проверять, соответствует ли она ожидаемой. Может, где-то parent не ставится, или ставится так, что ненужные объекты не умирают.

anonymous
()

Проверяй правильное задание parent-указателей, их наверняка не очень много. Вменяемого профайлера не встречал, так что, если проблемы часто бывают, попробуй на каком-нибудь Python или еще чем-нибудь, к чему есть привязки Qt, писать.

PayableOnDeath
()
Ответ на: комментарий от anonymous

> проверь delete [] <somthing>

Массивов не имею.

Fredrik
() автор топика
Ответ на: комментарий от PayableOnDeath

> Проверяй правильное задание parent-указателей, их наверняка не очень много. Вменяемого профайлера не встречал, так что, если проблемы часто бывают, попробуй на каком-нибудь Python или еще чем-нибудь, к чему есть привязки Qt, писать.

Проверил все локальные объекты и те, что создаются в куче - везде есть корректный parent, везде он удаляется.

Вот только QGraphicsItem меня смущает. Сам не QObject, но судя по документации обещает удалять потомков...

Fredrik
() автор топика

Если valgrind море информации дает, то значит прога криво написана и при завершении не удаляет созданные объекты. Займись сначала этим, тем более что в конце вывода самые крупные утечки показываются. Можешь еще google perfomance tools посмотреть, но valgrind'а более, чем достаточно.

dt1 ★★
()

Сам я, кстати, сталкивался с такой проблемой, что valgrind ругался на утечки памяти при неинициализированных указателях. Так что просмотри все конструкторы.

dt1 ★★
()

2 года назад писал более-менее серьезную программу используя тот же Qt. Прошелся по ней valgrind'ом. 80% того что он показал была полная херня. Но остальные 20% - были по делу.

irq
()

имеет еще смысл в флагах покопаться, --undef-value-errors=no очень даже полезен

жаль, что нет для флага для показа только definitely lost блоков, без possibly lost

dt1 ★★
()

Проверил под вендой тот же самый год - память не течет.

На протяжении работы всего цикла, и после него не больше 20 мегабайт памяти отжирается.

Под линуксом растет и по завершении цикла приложение занимает уже 150 метров памяти.

Ну как так может быть?

Fredrik
() автор топика
Ответ на: комментарий от Fredrik

Возможно, что под виндой требуется существенно меньше памяти для создания каких-то объектов. Возможно, что в Qt где-то баг. Установи пакет дебажный для нее и гоняй валгринд. Мне тоже поначалу казалось, что он ерунду какую-то выдает, но дня хватило, чтобы разобраться.

Какой у тебя, кстати, дистрибутив?

dt1 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.