Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Admin от Июль 20, 2009, 15:04



Название: Ваша программа падает у пользователей - ваши действия.
Отправлено: Admin от Июль 20, 2009, 15:04
   Хотелось бы обсудить, что можно сделать в такой ситуации. Падает программа у некоторых пользователей, доступа к компам пользователей нет, я с ними даже не знаком. У меня не падает нигде, хотя стоит около 5 виндоусов для этой цели.

Вопрос - что можно включить в программу, что бы иметь некоторую диагностику. К примеру, я видел некоторые игры на DirectX когда падают, показывают окошко с номером строки где произошло падение. Как такое сделать в QT?


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: f-r-o-s-t от Июль 20, 2009, 15:38
Реальный способ узнать строчку вставлять assertы. А с клиентами совсем нет связи? может можно как-то связаться? вопспроизводимо ли место падения, если нет то как часто это происходит?  а кроме вас её кто нибудь тестирует? ведь сам обычно не ждешь очевидной ошибки? Вполне вероятно что ошибка не в особенностях разных windows а в чем то другом.
 


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: kuzulis от Июль 20, 2009, 16:00
мне тож интересно как это сделать? например как в КДЕ делают при падении чего-либо - типа "отправить отчет разработчикам" и т.п. и показывается дамп и т.п.

Цитировать
Реальный способ узнать строчку вставлять assertы.
ассетры что позволят? т.е что будет происходить при крахе?


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: Admin от Июль 20, 2009, 16:00
Пользователи скачивают программу  с сайта  и говорят у меня падает через 5 минут или при нажатии на кнопку. А какой смысл от ASSERT? В основном сообщают о наличии ошибки и версии windows.


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: f-r-o-s-t от Июль 20, 2009, 16:16
void Q_ASSERT ( bool test )
Prints a warning message containing the source code file name and line number if test is false.

При неверном условии обычно завершает программу и выводи номер строки,
можно написать самому и через __LINE__ узнавать номер.(при наличии #ifndef в больших количествах поможет врятле).

а вообще есть ли какие то мысли из за чего может быть такое поведение?


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: alex12 от Июль 20, 2009, 16:26
Как я понимаю, единственный вариант - распространять debug сборку и как-то делать запуск через программу, показывающую отладочную информацию при крахе программы. Могу ошибаться, но с QtCreater-ом идет похожая на это утилитка.


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: f-r-o-s-t от Июль 20, 2009, 16:28
Как я понимаю, единственный вариант - распространять debug сборку и как-то делать запуск через программу, показывающую отладочную информацию при крахе программы. Могу ошибаться, но с QtCreater-ом идет похожая на это утилитка.

Надеюсь ты не про отладчик ...


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: crackedmind от Июль 20, 2009, 17:58
Во время падения генерируем dump файл и дальше дело техники :) Я для этих целей решил прикрутить google breakpad, кроссплатформенное решение генерации дампов. Правда документировано скудно, точнее никак :) Только комментарии и спасают, и сорцы мозиловского crashreporter'a, в котором google breakpad также используется.

Если конкретно под винду и не охота возится с 3rdparty либами, то вот довольно интересная статейка.
http://dev.dtf.ru/articles/print.php?id=37058

Ну и также сайт: DebugInfo.com


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: agentprog от Июль 20, 2009, 20:44
А не проще все что находится в main() запихнуть в try ... catch и при перехвате писать в лог файл все что возможно?


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: f-r-o-s-t от Июль 20, 2009, 20:49
А не проще все что находится в main() запихнуть в try ... catch и при перехвате писать в лог файл все что возможно?

Интересно что писать будем ? =)


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: pastor от Июль 20, 2009, 21:17
void Q_ASSERT ( bool test )
Prints a warning message containing the source code file name and line number if test is false.

При неверном условии обычно завершает программу и выводи номер строки,
можно написать самому и через __LINE__ узнавать номер.(при наличии #ifndef в больших количествах поможет врятле).

а вообще есть ли какие то мысли из за чего может быть такое поведение?

Все верно, но это справедливо ТОЛЬКО для дебаг сборки.


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: pastor от Июль 20, 2009, 21:19
Админ, глянь вот эти темки:

http://www.prog.org.ru/topic_6574_0.html
http://www.prog.org.ru/topic_4638_0.html


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: agentprog от Июль 20, 2009, 21:31
А не проще все что находится в main() запихнуть в try ... catch и при перехвате писать в лог файл все что возможно?

Интересно что писать будем ? =)

ну как минимум

мне тож интересно как это сделать? например как в КДЕ делают при падении чего-либо - типа "отправить отчет разработчикам" и т.п. и показывается дамп и т.п.


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: f-r-o-s-t от Июль 20, 2009, 23:11
void Q_ASSERT ( bool test )
Prints a warning message containing the source code file name and line number if test is false.

При неверном условии обычно завершает программу и выводи номер строки,
можно написать самому и через __LINE__ узнавать номер.(при наличии #ifndef в больших количествах поможет врятле).

а вообще есть ли какие то мысли из за чего может быть такое поведение?

Все верно, но это справедливо ТОЛЬКО для дебаг сборки.

Согласен, не учел =)

А не проще все что находится в main() запихнуть в try ... catch и при перехвате писать в лог файл все что возможно?

Интересно что писать будем ? =)

ну как минимум

мне тож интересно как это сделать? например как в КДЕ делают при падении чего-либо - типа "отправить отчет разработчикам" и т.п. и показывается дамп и т.п.

Ну произошло у нас исключение в main, что мы на основании этого сможем записать в этот отчет ?


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: break от Июль 21, 2009, 00:39
Если с пользователем связи нет - то вы по идее даже не узнаете о крахе программы..
Все же надо или выбивать из пользователя все сведения о том как и что он делает. В том числе что у него за компьютер, какие еще программы запущены и т.д. Либо ехать к нему самому. Несколько раз мне приходилось часами на телефоне так общаться и причину ошибки все же удавалось установить. Кроме того иногда приходилось отсыласть особо проблемным пользователям версию программы с выводом комментарием в особо подозрительных местах. Однажды выяснилось что программа не устанавливала сетевое подключение т.к. была заблокирована в "Брандмауре Виндовз". Так что с вашей программой может вообще все ОК а неродивый антивирус пытаясь ее проверять на лету падает ее(такое тоже не раз встречал)...
В общем ищите с ними связь...


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: crackedmind от Июль 21, 2009, 00:48
dump + подробный лог спасут :)


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: break от Июль 21, 2009, 01:01
Цитировать
dump + подробный лог спасут

Как если причиной краха является внешняя программа или битая планка памяти? А ошибка в модуле памяти может проявляться раз в 2 недели...


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: kirill от Июль 21, 2009, 04:33
Была статейка у Криса по этому поводу.
Цитировать
при возникновении критической ошибки, система завершает работу приложения еще до того, как будут сброшены дисковые буфера. Даже использование функции fflush ничего не решает (а вот скорость программы замедляет весьма радикально). Как же быть?! Да очень просто - создать в shared-memory кольцевой буфер заданного размера и весь отладочный вывод направлять туда, читая оттуда с помощью дочернего процесса. Тогда при аварийном завершении материнского процесса shared-memory не будет освобождена системой и дочерний процесс успеет принять последнее отладочное сообщение, отправленное упавшей программой. К тому же, этот метод работает намного быстрее прямой записи на диск.

http://www.insidepro.com/kk/200r.shtml (http://www.insidepro.com/kk/200r.shtml)


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: break от Июль 21, 2009, 05:46
Все равно если причина неисправное железо - ничего не даст... (модуль памяти или перегревающаяся видюха или проц). Какой бы не был механизм вывода хороший - что выводить то если в программе все ОК? Или если ошибка в другой программе - написанной не пойми кем (антивирус...)


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: kirill от Июль 21, 2009, 10:44
Никто и не говорит, что надо тестировать железо перед запуском.
Просто у Админа скорее всего проблема не с железом а бага в коде вот и все. Тщательный анализ лог файла поможет локализовать ее.


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: Admin от Июль 21, 2009, 13:12
То что бага с кодом, это однозначно. Только у меня нигде не падает :(. Вообще идеи есть - есть пара мест в проектировании программы, которорые сделаны на авось.


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: kirill от Июль 21, 2009, 14:26
Может ты потоки используешь? Там бага может проявляться через раз и даже реже.


Название: Re: Ваша программа падает у пользователей - ваши действия.
Отправлено: Admin от Июль 21, 2009, 14:53
Использую - дело в том, что поток и основная программа пишут в базу данных, и синхронизация доступа к базе сделана только на уровне транзакции базы.