Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Февраль 23, 2013, 18:35



Название: Отловить вылет программы
Отправлено: ecspertiza от Февраль 23, 2013, 18:35
Для начала всех с праздником :) Подтолкните пожалуйста меня на мысль. Есть софт кроссплатформеный, хочется добавить в него такую фичу, если вдруг по каким то причинам софт упал, сформировать некий дамп типа

1. Класс\метод где упал софт.
2. Какова причина ну например деление на 0 или ошибка сегментации.

может что то еще. Естественно хочется ловить это все глобально, есть ли варианты для решения такой задачи, с ходу что то в голову ничего не приходит ?


Название: Re: Отловить вылет программы
Отправлено: Bepec от Февраль 23, 2013, 19:04
Говорю о Windows!

Собственно для такой ситуации имеется вроде решение аля запись дампа памяти и отправки разработчику. Этим же кроссплатформенно вроде занимается библиотека CrashReport, но у меня не получилось её приструнить - нехватило времени.


Название: Re: Отловить вылет программы
Отправлено: Igors от Февраль 24, 2013, 08:51
В Mac OSX это делается автоматически - и очень хорошо. Симитируйте краш и посмотрите CrashReport - отпадет желание "лезть с грыжей на танк"  :)

Опять у Вас какие-то "задачи обслуживания"  :'(


Название: Re: Отловить вылет программы
Отправлено: ecspertiza от Февраль 24, 2013, 13:49
Дамп памяти это конечно хорошо, но лично мне он мало о чем говорит, может я не настолько хорошо его понимаю, но когда идет список hex кода и мол приложение упало в QtNetwork.dll в 0x73dc3 вообще ничего не говорит :) Сидел я значит вчера и игрался в Starcraft 2 ,что то наделал там и он у меня упал, после падения появилось окошко, с надписью приложение упало при работе с OpenGL бла бла в такой то процедуре и галочка отправить это разработчику или нет. И я задумался софт вроде как делаем публичный используется на множестве компьютеров, конфигураций естественно тысячи, где то может ,что то не так сработать и софт упадет. Так вот я и задумался что было бы здорово иметь возможность отловить именно место падения софта, то есть имя процедуры может даже класс, естественно сопутствующую инфу и дать возможность юзверю отправить это дело разработчику. Ну по сути то ,что я увидел у Blizzard. И собственно говоря меня мучает вопрос как они это сделали, навряд ли каждую процедуру в try catch заключали.


Название: Re: Отловить вылет программы
Отправлено: Bepec от Февраль 24, 2013, 16:56
Дамп памяти по сути и есть программа, замершая в точке падения. Если корректное падение (т.е. стек не затёрт), то будет вам стек, порядок вызовов, вплоть до начала программы. А при наличии самого дампа можно пойти назад по шагам вроде, причём все переменные и прочая будут аналогичны как при падении.

PS сам снимал дампы, сам пытался открыть - почему то нет стандартных решений для просмотра дампов. Никак символьные файлы не цеплялись, а в ассемблере нифига непонятно :D


Название: Re: Отловить вылет программы
Отправлено: Igors от Февраль 24, 2013, 17:11
Дамп памяти это конечно хорошо, но лично мне он мало о чем говорит,
Как и мне и любому другому, а это просто значит что ничего хорошего в нем нет. У Вас чисто велосипедная идея, это давно есть, и прекрасно работает, и юзверь отправить может. Тем более странно что на Mac Вы работаете, неужели никогда не сталкивались  ???


Название: Re: Отловить вылет программы
Отправлено: maxxant от Февраль 24, 2013, 19:12
именно кросплатформенно есть же
http://code.google.com/p/google-breakpad/

если что, есть краткое описание на русском:
http://lo-tips.blogspot.ru/2011/03/google-breakpad.html


Название: Re: Отловить вылет программы
Отправлено: ecspertiza от Февраль 24, 2013, 22:08
Igors, на Mac , да, это сделано хорошо, но кабы хочется все платформы сразу и какую нибудь свою оболочку. За Google Breakpad спасибо, покурю, вроде ,что то похожее.