Название: Спонтанное закрытие GUI-приложения Отправлено: astramax57 от Декабрь 10, 2012, 17:12 Доброго всем!
Пришла беда откуда не ждали ) Итак, есть GUI-приложение, qt-4.7.1, статическая линковка, VS 2008. Главное окно - наследник от QMainWindow. Приложение запускается на 12 серверах с WS2008 R2 и ровно через 3 суток корректно закрывается, причем одновременно на всех серверах. В логах ничего странного, в журналах ОС тоже. Провожу эксперимент. Запускаю приложение под отладкой, ставлю бряк на входе closeEvent. Проходит 3 суток - ничего. Проходит еще 14 часов - и бряк сработал. Ниже привожу callStack. На первый взгляд смущает название функции sendSpontaneousEvent ). Погуглил - пишут что-от про флаг WA_QuitOnClose, но он определяет завершать работу приложения после закрытия окна или нет, а окно явно никто не закрывал. Сейчас прога под отладкой висит. Думаю, что делать. Может кто сталкивался с таким поведением? зы Сейчас перешел на 12 студию и кьют 4,8,4, но проблема все-равно актуальна именно для старых версий. Так что советы вроде "а не попробовать ли более новую версию" не совсем уместны. Может и поможет, но надо разобраться с непонятным поведением ) Заранее спасибо. Итак, callStack manager.exe!manager::closeEvent(QCloseEvent * e=0x0000000000229560) Line 2643 C++ manager.exe!QWidget::event(QEvent * event=0x0000000000229560) Line 8359 C++ manager.exe!QMainWindow::event(QEvent * event=0x0000000000229560) Line 1479 C++ > manager.exe!QApplicationPrivate::notify_helper(QObject * receiver=0x0000000001c77640, QEvent * e=0x0000000000229560) Line 4445 + 0x15 bytes C++ manager.exe!QApplication::notify(QObject * receiver=0x0000000001c77640, QEvent * e=0x0000000000229560) Line 4410 + 0x1d bytes C++ manager.exe!QCoreApplication::notifyInternal(QObject * receiver=0x0000000001c77640, QEvent * event=0x0000000000229560) Line 732 + 0x26 bytes C++ manager.exe!QCoreApplication::sendSpontaneousEvent(QObject * receiver=0x0000000001c77640, QEvent * event=0x0000000000229560) Line 218 + 0x4c bytes C++ manager.exe!QWidgetPrivate::close_helper(QWidgetPrivate::CloseMode mode=CloseWithSpontaneousEvent) Line 7765 C++ manager.exe!QETWidget::translateCloseEvent(const tagMSG & __formal={...}) Line 3860 C++ manager.exe!QtWndProc(HWND__ * hwnd=0x0000000000010648, unsigned int message=0x00000010, unsigned __int64 wParam=0x0000000000000000, __int64 lParam=0x0000000000000000) Line 2154 C++ user32.dll!00000000776a9bd1() [Frames below may be incorrect and/or missing, no symbols loaded for user32.dll] user32.dll!00000000776a72cb() user32.dll!00000000776a6829() ntdll.dll!0000000077901225() user32.dll!00000000776a685a() user32.dll!00000000776a68a2() user32.dll!00000000776a760e() uxtheme.dll!000007fefbe0795a() uxtheme.dll!000007fefbe2637a() uxtheme.dll!000007fefbe0168e() uxtheme.dll!000007fefbe01445() user32.dll!00000000776a89d3() manager.exe!QWinInputContext::DefWindowProcW(HWND__ * hwnd=0x0000000000010648, unsigned int msg=0x00000112, unsigned __int64 wParam=0x000000000000f060, __int64 lParam=0x0000000000000555) Line 365 + 0x19 bytes C++ manager.exe!QtWndProc(HWND__ * hwnd=0x0000000000010648, unsigned int message=0x00000112, unsigned __int64 wParam=0x000000000000f060, __int64 lParam=0x0000000000000555) Line 2636 + 0x2b bytes C++ user32.dll!00000000776a8971() user32.dll!00000000776a72cb() user32.dll!00000000776a6829() ntdll.dll!0000000077901225() user32.dll!00000000776a685a() user32.dll!00000000776a68a2() user32.dll!00000000776a760e() uxtheme.dll!000007fefbe0795a() uxtheme.dll!000007fefbe26425() uxtheme.dll!000007fefbe0168e() uxtheme.dll!000007fefbe01445() user32.dll!00000000776a89d3() manager.exe!QWinInputContext::DefWindowProcW(HWND__ * hwnd=0x0000000000010648, unsigned int msg=0x000000a1, unsigned __int64 wParam=0x0000000000000014, __int64 lParam=0x0000000000000555) Line 365 + 0x19 bytes C++ manager.exe!QtWndProc(HWND__ * hwnd=0x0000000000010648, unsigned int message=0x000000a1, unsigned __int64 wParam=0x0000000000000014, __int64 lParam=0x0000000000000555) Line 2636 + 0x2b bytes C++ user32.dll!00000000776a9bd1() user32.dll!00000000776a98da() manager.exe!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> * flags=0x000000000022f660) Line 807 C++ manager.exe!QGuiEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> * flags=0x000000000022f6ac) Line 1170 + 0x26 bytes C++ manager.exe!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> * flags=0x000000000022f718) Line 150 C++ manager.exe!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> * flags=0x000000000022f7a0) Line 201 + 0x53 bytes C++ manager.exe!QCoreApplication::exec() Line 1009 + 0x23 bytes C++ manager.exe!QApplication::exec() Line 3720 C++ manager.exe!main(int argc=0x00000001, char * * argv=0x0000000001c63fb0) Line 129 + 0x5 bytes C++ manager.exe!WinMain(HINSTANCE__ * instance=0x000000013f610000, HINSTANCE__ * prevInstance=0x0000000000000000, char * __formal=0x0000000000265520, int cmdShow=0x00000001) Line 131 + 0x16 bytes C++ manager.exe!__tmainCRTStartup() Line 263 + 0x42 bytes C manager.exe!WinMainCRTStartup() Line 182 C kernel32.dll!00000000777a652d() ntdll.dll!00000000778dc521() Название: Re: Спонтанное закрытие GUI-приложения Отправлено: Alex Custov от Декабрь 10, 2012, 19:00 прога получает close для основного окна. Возможно, это делает система по каким-то признакам для долго работающих приложений, раз вылетают сразу все проги на разных машинах, и событие имеет статус spontaneous.
Название: Re: Спонтанное закрытие GUI-приложения Отправлено: astramax57 от Декабрь 11, 2012, 07:46 Согласен.
Вот это - QtWndProc(HWND__ * hwnd=0x0000000000010648, unsigned int message=0x00000010, unsigned __int64 wParam=0x0000000000000000, __int64 lParam=0x0000000000000000) не что иное как WM_CLOSE. Т.е. система явно закрывает приложение. В чем причина? Приложение работает и с сетью, и с файлами, и память выделяет. То есть для системы оно явно не выглядит "спящим". Название: Re: Спонтанное закрытие GUI-приложения Отправлено: Serr500 от Декабрь 11, 2012, 08:27 Возможно, приложение запускается планировщиком и в свойствах задания стоит максимальное время выполнения.
Название: Re: Спонтанное закрытие GUI-приложения Отправлено: astramax57 от Декабрь 11, 2012, 08:35 Да, на серверах (которых 12 штук ) оно запускается через планировщик, с другой машины! Очень похоже, что копать нужно именно в эту сторону. Спасибо.
Однако на моей машине под отладкой (соответственно без планировщика) возникла описанная выше ситуация. Название: Re: Спонтанное закрытие GUI-приложения Отправлено: Fregloin от Декабрь 11, 2012, 11:00 Может ОС думает что приложение зависло (мало ли по каким причинам) и шлет ему сигнал о закрытии главного окна - это как вариант.
Название: Re: Спонтанное закрытие GUI-приложения Отправлено: astramax57 от Декабрь 14, 2012, 09:46 Попробую с Qt 4.8.4 и под 11 студией
Название: Re: Спонтанное закрытие GUI-приложения Отправлено: astramax57 от Декабрь 20, 2012, 07:52 Итак, Qt 4.8.4 и 11 студия. Почти 6 суток, полет нормальный. Жду дальше.
Название: Re: Спонтанное закрытие GUI-приложения Отправлено: astramax57 от Декабрь 27, 2012, 14:48 Программа проработала почти 13 суток, дальше ждать не хочу.
Думаю проблема решена. Только вот не понятно, в чем именно была причина. Название: Re: Спонтанное закрытие GUI-приложения Отправлено: Alex Custov от Декабрь 27, 2012, 23:07 Программа проработала почти 13 суток, дальше ждать не хочу. Думаю проблема решена. Только вот не понятно, в чем именно была причина. а попробуй 4.7.1 с mingw Название: Re: Спонтанное закрытие GUI-приложения Отправлено: astramax57 от Декабрь 29, 2012, 11:02 а попробуй 4.7.1 с mingw спасибо за предложение, но я не использую mingw |