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 ★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.