Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: Kanareyka от Октябрь 08, 2013, 12:45



Название: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Kanareyka от Октябрь 08, 2013, 12:45
Добрый день!

Нужна помощь, я совершенно застряла.

QT Creator 2.7.2 на QT 5.1.0 (32bit) и MinGW.
Пытаюсь реализовать комбинацию QTreeView + QAbstractItemModel + QSortFilterModel, не все получается - соответственно, начала отлаживаться. И то, что я вижу в выводе gdb, я не понимаю. Я новичок в QT, но в целом разработке лет 15 уже и дебагерами раньше пользовалась, в том числе для c++. Но то, что я вижу у себя - оно по-моему логике не поддается... Или у меня не хватает какого-то базового знания.

Чтобы не было сомнений, что я это вижу: сейчас буду показывать скриншотами.
Скриншоты демонстририруют отладку функции insertRow.
Перед запуском функции я
а) выбираю (select) ветку в дереве и
б) ввожу некоторый текст (переменная pSubject).
После этого запускается функция.

(http://i064.radikal.ru/1310/be/a145b9f0ec9bt.jpg) (http://i064.radikal.ru/1310/be/a145b9f0ec9b.jpg)
На этой картинке видно, что я
- остановила дебагер на "QModelIndex index = выбранный index из selection model",
- нажала F10 чтобы перейти на следующий оператор.
Здесь я вижу корректные - а главное, ожидаемые мной - значения column = 0, row = 9, model = ExTreeProxy (это прокси-модель - наследник от QSortFilterModel)
Т.е. на этом скрине все ок.

Что здесь не видно, но может быть важно:
- в прокси-модели активен фильтр (реализована функция ExTreeProxy::filterAcceptsRow);
- все items базовой модели под этот фильтр попадают (т.е. все items, которые есть в базовой модели, через фильтр проходят и отображаются в дереве).

Дальше начинаются странности:
(http://i016.radikal.ru/1310/3d/eb22cb7268fbt.jpg) (http://i016.radikal.ru/1310/3d/eb22cb7268fb.jpg)

Здесь видим:
1) Пометка "1" на картинке - демонстрирует, что я получаю после выполнения "sourceIndex = map from index"
По-моему это фигня - ведь я точно знаю, что
- выбрала ветку в дереве (это доказывает предыдущая картинка - index там совершенно нормальный);
- что index - это правильный индекс в прокси, а значит маппинг должен какой-то быть. И все же я вижу невалидный индекс после map from index.

2) Пометка "2" на картинке - демонстрирует, что при входе в else мой нормальный хороший index превращается в index.col = 0, index.row - 0 (и, конечно, следующие операторы из-за этого работают неправильно). Отчего вдруг оно 0/0 стало???

Я думала, это из-за кривого дебагера в поставке - собрала сама (по инструкции на qtlinux.narod.ru). Но новая сборка ведет себя так же.

Помогите разобраться, пожалуйста. Если это правильно - то почему? Если неправильно - как заставить дебагер работать нормально? И заодно - как проверить, что QT Creator подхватил именно новый экзешник? (Думаю, что подхватил, но мало ли...)


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Bepec от Октябрь 08, 2013, 12:51
Возможно буду выглядеть глупо, но почему вы решили что индексы selectedModel и индексы proxyModel должны совпадать?


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Kanareyka от Октябрь 08, 2013, 13:23
Потому что на индекс, полученный из selection model - дебагер указывает, чей он (в смысле - из какой модели).
Там подчеркнуто на первом скриншоте.


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Kanareyka от Октябрь 08, 2013, 13:27
Я сначала сомневалась, что индекс из selection model - это индекс прокси. А потом мне на QTCentre подсказали, что index.model() - это модель индекса, по ней можно определить, из какой модели индекс. А потом я в дебагере заметила, что он класс модели индекса показывает.


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Bepec от Октябрь 08, 2013, 13:50
Минимально компилируемый пример помог бы нам разобраться.

PS походу нет такого индекса в модели :D


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Kanareyka от Октябрь 08, 2013, 14:06
Я пока такого не делала - надеялась, что навскидку кто-нибудь знает, что за ерунда, и время тратить не нужно будет.
Но, похоже, придется. Попробую сегодня сделать.

С этой комбинацией у меня вообще фигня какая-то, потому отладку и начала. Без прокси - insertRow зашибись работает; только прокси добавляю - insertRow разваливается.


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Bepec от Октябрь 08, 2013, 14:26
Делайте, а там может вы и сами разберётесь :D Ну и поможем чем можем ^.^


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Kanareyka от Октябрь 09, 2013, 16:28
Ну вот и оно (см. аттач).

Обрезано практически все, но некоторая избыточность есть. В частности:
- в главное окно встраивается не сразу вью, а QDialog, а уже в нем - вью (мне в итоге именно так надо будет);
- начальные данные в дереве - зверски захардкодены (см. конструктор класса ExObject);
- оставлен расчет порядкового поля order.

Дебагер снова ведет себя непонятно - так же, как описано в первом посте темы.
Скриншоты сделаю по запросу, а можете просто поверить на слово - они совершенно такие же будут, как в первом посте.

Как с этим обращаться:
- в QT Creator открывать проект TreeViewExample.W.pro;
- открыть файл ExFS.cpp, на строке 34 поставить брейкпойнт;
- запустить приложение в режиме отладки: откроется окно с 2мя виджетами:
   полем текстового ввода и деревом;
- в дереве один раз ткнуть мышкой на строку x20 (чтобы выбралась ветка);
- в поле ввода написать название новой ветки (например "x25")
  (задумано так, что ветка с именем x25 будет вставлена в дерево после x20);
- смотреть, что показывает отладчик, сверять со скриншотами в первом посте темы.

Страстно желаю узнать, будет ли у других отладчик вести себя так же, как у меня на скриншотах.


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: VPS от Октябрь 10, 2013, 08:55
При отладке показывает, что почему-то работают 5 потоков. ???
С индексами тоже непонятки. Также бывает, что отладчик просто отваливается...

P.S.: qt 4.8.5 + qt creator 2.8.1 + mingw.


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Kanareyka от Октябрь 10, 2013, 09:29
У меня отладчик не "иногда" отваливается. Он у меня стабильно себя ведет так, как я описала. Абсолютно всегда на этом компьютере (Lenovo X220, Windows XP SP3) - именно так.

Про 5 потоков - не вижу связи с проблемой, не объясните? Мне казалось, это особенности настройки среды, но уж никак не кода.


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: VPS от Октябрь 10, 2013, 10:29
Про 5 потоков - не вижу связи с проблемой, не объясните? Мне казалось, это особенности настройки среды, но уж никак не кода.

Просто не могу понять, откуда они взялись. У меня обычно, если приложение однопоточное, то при отладке отладчик показывает один поток. А тут пять...


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: kamre от Октябрь 10, 2013, 11:24
В MSVC все правильно показывает отладчик:


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Kanareyka от Октябрь 10, 2013, 15:39
Охотно верю, но мне нужно GDB чтобы правильно показывал.


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: kamre от Октябрь 10, 2013, 18:30
нужно GDB чтобы правильно показывал

GDB тоже вроде правильно показывает:
Цитировать
...
Reading symbols from C:\Users\...\Qt\TreeViewExample\debug\TreeViewExample.exe...done.
(gdb) break ExFS.cpp:34
Breakpoint 1 at 0x4021c9: file src\interface\ExFS.cpp, line 34.
(gdb) run
Starting program: C:\Users\...\Qt\TreeViewExample\debug\TreeViewExample.exe
[New Thread 4240.0x1424]
[New Thread 4240.0x17ec]
[New Thread 4240.0x724]
[New Thread 4240.0x1228]
[New Thread 4240.0xd48]
[New Thread 4240.0xa7c]

Breakpoint 1, ExFS::insertRow (this=0x139317c8, mSubject=...) at src\interface\ExFS.cpp:34
34          QModelIndex index = mTree->selectionModel()->currentIndex();
(gdb) next
35          QModelIndex sourceIndex = mProxyModel->mapToSource(index);
(gdb) next
37          QModelIndex parent;
(gdb) p index
$1 = {r = 1, c = 0, i = 328422688, m = 0x139399a0}
(gdb) p sourceIndex
$2 = {r = 1, c = 0, i = 328439688, m = 0x13939038}


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Kanareyka от Октябрь 11, 2013, 10:01
Спасибо, особенно за кусок сессии дебагера.
Попробую в текстовом режиме, и попробую обновить QT Creator.


Название: Re: Дебагер GDB в QT Creator ведет себя неожиданно
Отправлено: Kanareyka от Октябрь 17, 2013, 12:54
Снова здравствуйте!

gdb в текстовом режиме ведет себя нормально и предсказуемо - так же, как у kamre.

Тот же самый экзешник gdb, подключенный к QT Creator ведет себя, как описано в первом посте темы, т.е. неприлично.
Поставила последний QT Creator (2.8.что-то) - та же ерунда с дебагером.

С текстовой версией работать, конечно, как-то можно, но удобнее в графике.
От того хотелось бы все-таки получить нормальное поведение в QT Creator.
Как добиться желаемого? Хотя бы в каком направлении копать?