LINUX.ORG.RU

QTreeView падает на мой модели в drawRow()


0

1

Такая печальная история: пишу свою модель для построения дерева из БД. Вроде, написал, все unit-тесты проходит без вопросов, но на реальном примере, когда её впихиваешь в QTreeView, происходит странное падение: http://pastebin.com/gGqRpJPX. Район падения в GDB:

#0  _int_malloc (av=<value optimized out>, bytes=<value optimized out>) at malloc.c:4436
#1  0x01c5bf9c in *__GI___libc_malloc (bytes=138) at malloc.c:3660
#2  0x012bcb8d in qMalloc (size=138) at global/qmalloc.cpp:55
#3  0x0130fad4 in QString::fromLatin1_helper (str=0x16cb3c0 "TreeResourceModel::parent: No parent row for index %1,%2,%3", size=59)
    at tools/qstring.cpp:3603
#4  0x013158f4 in QString::fromAscii_helper (str=0x16cb3c0 "TreeResourceModel::parent: No parent row for index %1,%2,%3", size=88) at tools/qstring.cpp:3638
#5  0x0167ed65 in QString (this=0x82b9838, index=...) at /usr/include/qt4/QtCore/qstring.h:413
#6  IBD::TreeResourceModel::parent (this=0x82b9838, index=...) at ../pkibd-core/libibd-core/treeresourcemodel.cpp:525
#7  0x00b280cd in QModelIndex::parent (this=0x82b43d8, painter=0xbfffd28c, option=..., index=...)
    at ../../include/QtCore/../../src/corelib/kernel/qabstractitemmodel.h:389
#8  QTreeView::drawRow (this=0x82b43d8, painter=0xbfffd28c, option=..., index=...) at itemviews/qtreeview.cpp:1471
#9  0x00b334a9 in QTreeView::drawTree (this=0x82b43d8, painter=0xbfffd28c, region=...) at itemviews/qtreeview.cpp:1433
#10 0x00b365bd in QTreeView::paintEvent (this=0x82b43d8, event=0xbfffdae4) at itemviews/qtreeview.cpp:1266

Пробовал снести весь код из parent() - падает где-то ещё, но тоже в чём-то вызванном из drawRow(). Как я только не изгалялся в тестах с этим parent() - воспроизвести падение не могу, только на живой вьюшке. Гугл тоже ничем не помог.

Буду благодарен за любую идею, как изгнать баг!

★★

> IBD::TreeResourceModel::parent

Внимательно посмотрите что вы делаете в этом методе. Это падение - симптом замусоренной памяти, возможно не прямо в этом методе, а косвенно, то-есть она была уже испорчена ранее. И возьмите на вооружение Q_ASSERT() - пользуйтесь им где только можно.

Dendy ★★★★★
()

Помнится, тоже исправлял как-то падение программы в совершенно неожиданном месте. Помог valgrind, причина была очень далеко от места падения :)

Так что рекомендую пройтись и поисправлять все, на что он будет ругаться.

wmd
()
Ответ на: комментарий от Dendy

ASSERT'ы есть везде, где можно. Память бьётся, видимо, в другом месте, в самом parent негде.

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

Valgrind мучал, но он ругается на что-то внутри Qt, причём ругается не только, когда прога падает. Есть ещё какие-нибудь отладчики памяти?

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

Ну просто нужно научиться им пользоваться. Я бы начал с устранения ругани по поводу неинициализированных значений. Если в классе есть указатели, то в конструкторе они обязательно должны быть проинициализированы, хотя бы нулем.

На ошибки в Qt не стоит внимания обращать, они вряд ли приводят к падению.

И из всех подобных программ valgrind, по-моему, самый адекватный.

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

На ошибки в Qt не стоит внимания обращать, они вряд ли приводят к падению

А вот только они и присутствуют до самого падения.

Ну просто нужно научиться им пользоваться. Я бы начал с устранения ругани по поводу неинициализированных значений

Вы немножко недооцениваете мой уровень=)

И из всех подобных программ valgrind, по-моему, самый адекватный

И всё-таки, есть ещё какие-то?

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

А вот только они и присутствуют до самого падения.

Очень странно, а треды используются?

И всё-таки, есть ещё какие-то?

Извиняюсь, напуталось что-то в голове у меня. Это я для отладки многопоточной проги пользовался разными инструментами.

А так, может вот это как-то поможет: http://code.google.com/p/google-perftools/

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

Уффф! Отловил-таки злобное насекомое=) Спасибо за поддержку.

Мне сильно мешали qDebug-и в коде, на них всё дело и падало, как заменил на старый добрый printf - сразу нашёл, где была проблема.

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

Может, если память сорвалась раньше, а где-то внутрях этого Qdebug() и случилась попытка обращения не туда.

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