Russian Qt Forum
Ноябрь 24, 2024, 09:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Диалог открытия файлов порождает ошибку  (Прочитано 7435 раз)
qtshnik
Новичок

Offline Offline

Сообщений: 9


Просмотр профиля
« : Июнь 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, из-за которой падение?
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #1 : Июнь 16, 2014, 14:53 »

Может быть это зависит от софта, установленного на ПК? У меня, когда я установил программу Wuala (тоже меняет значки файлов в проводнике windows), при открытии диалога выбора файлов выполнение останавливалось на брейкпоинте в каком-то ассемблерном коде. Попробуйте выявить эту программу и может быть обновить её?
Записан
Bepec
Гость
« Ответ #2 : Июнь 16, 2014, 16:35 »

Бред предыдущий комментарий.

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

Offline Offline

Сообщений: 9


Просмотр профиля
« Ответ #3 : Июнь 16, 2014, 17:05 »

а почему остальной код не попадает на распил? я же говорю, можно часами гонять программу в интенсивном режиме без этого диалога открытия файлов, и ничего не упадет. А можно попробовать обратный сценарий: запустить приложение, вызвать в нем диалог открытия файлов, закрыть, и потом вообще ничего не делать (а таймеров там никаких нет), можно даже свернуть приложение.  В результате оно все равно через пару минут упадет.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Июнь 16, 2014, 17:09 »

На это не похоже?
http://www.prog.org.ru/topic_27069_0.html
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Июнь 16, 2014, 19:49 »

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

Offline Offline

Сообщений: 9


Просмотр профиля
« Ответ #6 : Июнь 17, 2014, 10:30 »

На это не похоже?
http://www.prog.org.ru/topic_27069_0.html
похоже. только по вине другой dll. но делать-то чего?

я бы заменил строчку с вызовом диалога на результат его выполнения, чтобы проверить, что это именно он, а не открываемый файл
Я так давно и сделал, потому и говорю, что вся соль проявляется, только если вызвать диалог, а если не вызывать, то и проблемы не будет.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Июнь 17, 2014, 11:47 »

Как workaround попробуй не использовать нативный диалог (QFileDialog::DontUseNativeDialog).
Записан

Qt 5.11/4.8.7 (X11/Win)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #8 : Июнь 18, 2014, 01:56 »

У меня нечто подобное тоже возникает на одной машине: под отладчиком в креаторе при вызове QFileDialog::getOpenFileName в любом приложении возникает аналогичный креш. Так и не победил это никак.
Записан
Bepec
Гость
« Ответ #9 : Июнь 18, 2014, 02:52 »

Я докопался один раз что дело в подгружаемых Dll. При вызове диалога подгружается куча dll-лок, использующихся далее. Порча памяти рубит указатели => обращение хзкуда => вылет.

Был исправлен вылет за границы массива и всё заработало как надо.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #10 : Июнь 25, 2014, 11:57 »

Был исправлен вылет за границы массива и всё заработало как надо.
Ну я ж писал - "в любом Qt приложении" из под отладки. Искать вылет за границы массива в отладчике или Qt?
Записан
Bepec
Гость
« Ответ #11 : Июнь 25, 2014, 12:57 »

Я бы советовал убрать из списка слабых мест QtCreator Веселый У меня имеется несколько неопровержимых фактов, что он бывает тупит как черепашка не ниндзя Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 22.