Russian Qt Forum

Qt => Общие вопросы => Тема начата: qtshnik от Июнь 16, 2014, 14:38



Название: Диалог открытия файлов порождает ошибку
Отправлено: qtshnik от Июнь 16, 2014, 14:38
Ситуация, которую уже давно не могу решить. Есть приложение, написанное на Qt4, немало строчек кода.
Пользователь может часами работать с приложением без его падения, только если не вызывает диалог открытия файлов QFileDialog::getOpenFileName. Как только вызвал - приложение падает примерно через минуту, может и чуть дольше. Бывает, это воспроизводится часто, бывает, и не очень. Поменял строку
кода в произвольном месте и перекомпилировал - может измениться частота возникновения этой ошибки. У нас в команде, которая пишет это приложение, только у одного человека на компьютере это воспроизводится. Debug ничего не дает, поскольку в call-stack'е только вызовы системных DLL, то есть ошибка возникает не в коде, написанном нами.
Характерны 3 вещи:
1) среди выполняющихся потоков присутствует поток RPC Callback Thread, который создается при вызове диалога открытия файлов, но падение происходит не в нем.
2) до падения несколько раз в окне вывода (Output в Visual Studio) выводится сообщение
First-chance exception at 0x7684c41f in scanner.exe: 0x000006BA: Сервер RPC недоступен.
или
First-chance exception at 0x7684c41f in scanner.exe: 0x800401FD: Объект не подключен к серверу.
или
First-chance exception at 0x7684c41f in scanner.exe: 0x80010108: Вызванный объект был отключен от клиентов.
3) При падении в окне пишется пишется следующее:
First-chance exception at 0x7684c41f in scanner.exe: 0x80010108: Вызванный объект был отключен от клиентов.
First-chance exception at 0x74bcc99e in scanner.exe: 0xC0000005: Access violation reading location 0xfeeefeee.
First-chance exception at 0x7684c41f in scanner.exe: 0x80010108: Вызванный объект был отключен от клиентов.
Unhandled exception at 0x74bcc99e in scanner.exe: 0xC0000005: Access violation reading location 0xfeeefeee.

То, что возникает не всегда, похоже на порчу памяти, но тогда совсем не понятно: если память портится где-то в коде, написанном нами, то почему это не проявляется без диалога вызова файлов, хотя перераспределений памяти и вычислений разного характера много? Видимо, диалог открытия файлов подгружет разные специфические dll для ОС (типа dll системы контроля версий, которая подсвечивает специальными иконками статус файлов, поставленных на контроль), но почему эти DLL "живут" после закрытия этого диалога и пытаются подключаться к какому-то серверу? Как вычислить ту DLL, из-за которой падение?


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: Swa от Июнь 16, 2014, 14:53
Может быть это зависит от софта, установленного на ПК? У меня, когда я установил программу Wuala (тоже меняет значки файлов в проводнике windows), при открытии диалога выбора файлов выполнение останавливалось на брейкпоинте в каком-то ассемблерном коде. Попробуйте выявить эту программу и может быть обновить её?


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: Bepec от Июнь 16, 2014, 16:35
Бред предыдущий комментарий.

Это может происходить от распила памяти. Много строчек кода кроют в себе распил. А fileDialog просто на него изредка попадает. Вот и всё.


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: qtshnik от Июнь 16, 2014, 17:05
а почему остальной код не попадает на распил? я же говорю, можно часами гонять программу в интенсивном режиме без этого диалога открытия файлов, и ничего не упадет. А можно попробовать обратный сценарий: запустить приложение, вызвать в нем диалог открытия файлов, закрыть, и потом вообще ничего не делать (а таймеров там никаких нет), можно даже свернуть приложение.  В результате оно все равно через пару минут упадет.


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: Old от Июнь 16, 2014, 17:09
На это не похоже?
http://www.prog.org.ru/topic_27069_0.html


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: __Heaven__ от Июнь 16, 2014, 19:49
я бы заменил строчку с вызовом диалога на результат его выполнения, чтобы проверить, что это именно он, а не открываемый файл


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: qtshnik от Июнь 17, 2014, 10:30
На это не похоже?
http://www.prog.org.ru/topic_27069_0.html
похоже. только по вине другой dll. но делать-то чего?

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


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: GreatSnake от Июнь 17, 2014, 11:47
Как workaround попробуй не использовать нативный диалог (QFileDialog::DontUseNativeDialog).


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: xokc от Июнь 18, 2014, 01:56
У меня нечто подобное тоже возникает на одной машине: под отладчиком в креаторе при вызове QFileDialog::getOpenFileName в любом приложении возникает аналогичный креш. Так и не победил это никак.


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: Bepec от Июнь 18, 2014, 02:52
Я докопался один раз что дело в подгружаемых Dll. При вызове диалога подгружается куча dll-лок, использующихся далее. Порча памяти рубит указатели => обращение хзкуда => вылет.

Был исправлен вылет за границы массива и всё заработало как надо.


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: xokc от Июнь 25, 2014, 11:57
Был исправлен вылет за границы массива и всё заработало как надо.
Ну я ж писал - "в любом Qt приложении" из под отладки. Искать вылет за границы массива в отладчике или Qt?


Название: Re: Диалог открытия файлов порождает ошибку
Отправлено: Bepec от Июнь 25, 2014, 12:57
Я бы советовал убрать из списка слабых мест QtCreator :D У меня имеется несколько неопровержимых фактов, что он бывает тупит как черепашка не ниндзя :)