Russian Qt Forum

Qt => Общие вопросы => Тема начата: astramax57 от Декабрь 10, 2012, 17:12



Название: Спонтанное закрытие 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