Название: как для упавшей программы генерировать крэшдамп ? Отправлено: virtual_root от Январь 29, 2013, 18:15 Добрый вечер ребята! Если кто сталкивался с моим вопросом, расскажите мне пожалуйста как мне для моей программы, написанной под windows, сделать генерацию креш дампов. Честно говоря в интернете совсем мало информации нашла по этому поводу, так что даже толком не пойму что конкретно из себя представляют креш дампы.
Кто знает про это, поделитесь пожалуйста опытом)) Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: alex312 от Январь 30, 2013, 00:09 Сам пока толком не разбирался, вот просто ссылки :
http://code.google.com/p/crashrpt/ http://code.google.com/p/google-breakpad/ http://www.codeproject.com/Articles/3497/Add-Crash-Reporting-to-Your-Applications-with-the http://stackoverflow.com/questions/5693192/win32-backtrace-from-c-code http://win32easy.blogspot.com/2011/03/exception-handling-inform-your-users_26.html Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: Bepec от Январь 30, 2013, 08:10 По поиску в гуглу десятки примеров.
Самое страшное потом - попытаться отладить сделанный дамп. Подцепить файлы символов у меня так и не получилось и я забросил это дело. Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: vregess от Январь 30, 2013, 11:22 Если программа только под винды и используется компилятор от Microsoft, то пробуй CrashRpt.
Ссылку выше уже дали, или вот на документацию сразу http://crashrpt.sourceforge.net/docs/html/index.html (http://crashrpt.sourceforge.net/docs/html/index.html) Пример оттуда же http://crashrpt.sourceforge.net/docs/html/simple_example.html (http://crashrpt.sourceforge.net/docs/html/simple_example.html) Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: virtual_root от Январь 30, 2013, 16:21 уже подробно почитала об этой библиотеки. Но к сожалению она мне не подходит, я использую компилятор MinGW.
Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: vregess от Январь 30, 2013, 21:21 Тогда у меня для тебя плохие новости.
Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: virtual_root от Февраль 01, 2013, 11:20 Какие плохие?
Bepec, как я поняла ты когда-то этим занимался. А ты случайно не знаешь отладчик gdb умеет работать с минидампами ? И что мне делать если в Qt отсутствует библиотека DbgHelp ? Просто с её помощью можно сделать генерацию мини дампа. Я конечно кое-как выкрутилась. В интеренте нашла примеры и один из них подогнала под Qt. Но всё равно у меня никак не получается использовать фун-ю MiniDumpWriteDump (http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms680360(v=vs.85).aspx (http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms680360(v=vs.85).aspx)) Может вы подскажите мне? Приведу мой пример проекта. В этом проекте необходимо в настройках проекта выставить чистую среду. Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: Bepec от Февраль 01, 2013, 11:24 Кхм. Я пользуюсь только VS 2008. Не могу сказать ничего про отладчик gdb :)
Сама то функция вин апишная. Насколько я помню, занимает всего пяток строк. Другая проблема, что нехватило мне терпения узнать, как подключить файлы символов к загруженному дампу :) Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: virtual_root от Февраль 01, 2013, 15:06 Ребята, помогите пожалуйста. Подскажите, почему у меня не получается использовать фун-ю MiniDumpWriteDump (http://msdn.microsoft.com/en-us/library/ms680360(v=VS.85).aspx (http://msdn.microsoft.com/en-us/library/ms680360(v=VS.85).aspx))
В системе нашла библиотеку dbghelp.dll и dbghelp.lib В файле проекта пытаюсь её подключить: Код: LIBS += -ldbghelp Код: :-1: ошибка: cannot find -ldbghelp Подскажите, как быть? Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: alex312 от Февраль 01, 2013, 15:56 Ребята, помогите пожалуйста. Подскажите, почему у меня не получается использовать фун-ю MiniDumpWriteDump (http://msdn.microsoft.com/en-us/library/ms680360(v=VS.85).aspx (http://msdn.microsoft.com/en-us/library/ms680360(v=VS.85).aspx)) Как быть - начать использовать msvc.В системе нашла библиотеку dbghelp.dll и dbghelp.lib В файле проекта пытаюсь её подключить: Код: LIBS += -ldbghelp Код: :-1: ошибка: cannot find -ldbghelp Подскажите, как быть? По теме - как хранить отладочную информацию стандарт с++ не определяет. Поэтому разные компиляторы хранят ее по своему. Так же разные компиляторы используют разные форматы библиотек. Поэтому библиотеки, собранные одним компилятором, за редким исключением, не подходят для использования другим компилятором. Итак, к чему это я. dbghelp.lib - скомпилирована компилятором msvc и не может быть использована c gcc. Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: virtual_root от Февраль 01, 2013, 16:00 ага, поняла) спасибо) я использовала немного другой код и удалось вызывать нужную мне функцию. Но я почему-то не пойму, почему у меня не сохраняется стек вызовов. Как я поняла из документации, то нужно указать тип минидампа правильно. Я перепробовала уже много типов, но что-то стека вызовов не видно... Может вы сможете мне подсказать в чём я ошиблась?
Код: #include <stdio.h> Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: virtual_root от Февраль 01, 2013, 17:19 уже разобралась) надо было использовать флаг MiniDumpFilterMemory
Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: virtual_root от Февраль 01, 2013, 17:40 хотя даже этот флаг мне не дал такого результат, который я ожидала. Благодаря ему я не видела ошибку в windbg при попытке просмотреть стек вызовов. Что-то не пойму почему так. У меня есть предположение, что для того чтобы увидеть стек вызовов нужен символьный файл?
Когда я открываю файл дампа в windbg, я вижу в нем странную для меня ошибку... (http://helper.program21.ru/wp-content/uploads/2013/02/windbgBookProj.png) Я так понимаю, что windbg нужен символьный файл. Но как его создать? Его похоже во время создания дампа нужно как-то привязать? Это об этом вы говорили, Верес? Может кто что подскажет) Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: Bepec от Февраль 01, 2013, 17:56 Файл символов создаётся при компиляции программы. Т.е. *.pdb и есть файл символов для msvs. Другой вопрос, как его подцепить - этого я понять не смог и бросился на другой проект :)
Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: Igors от Февраль 01, 2013, 21:21 Как это сделать на злополучном Вындоуз - не скажу, но может есть другой, чисто практический выход. Помнится Вы задавали вопросы про Mac OSX, так вот там это делается автоматычно и crashReport действительно информативен и часто полезен. Просто запускаете и ждете краша. Когда случится Вам предложат просмотреть сразу а файл в любом случае сохранится в фолдере CrashReports
Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: vregess от Февраль 01, 2013, 22:00 Конечно нужны pdb файлы твоего проекта, тк вся информация там. И у меня есть сомнения, что с mingw у тебя получится это сделать - врядли он умеет генерировать pdb (hint: ты же не чисто релиз версию компилируешь, а с отладочной информацией, да?). Попробуй поразбираться с документацией google-breakpad, он все-таки позиционируется как кроссплатформенное решение, и возможно я не прав. Но поверхностные исследования говорят, что либо это гемор, либо не возможно на данный момент.
Если хочется нормально работать с крэшдампами под виндой, то лучше переходить на компилятор от MS. Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: virtual_root от Февраль 04, 2013, 09:01 спасибо вам ребята за информацию!
P.S. да я с отладочной информацией компилировала Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: panAlexey от Февраль 05, 2013, 12:10 Надо бы изучить.
Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: Bepec от Февраль 05, 2013, 12:23 Надо, вот только под виндой у меня сивольные файлики не цепляются, а на ассемблерном коде я почти ничего не понимаю :)
Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: panAlexey от Февраль 05, 2013, 15:44 Надо, вот только под виндой у меня сивольные файлики не цепляются, а на ассемблерном коде я почти ничего не понимаю :) асм несложно освоить. только же учить надо.правило вызовов помнить и т.п. зато результат иногда получается потрясный. Вшить в софт так нужную тебе функцию хаком и не трепать себе нервы - дорого стоит. Уж поверь пользуюсь ежедневно на работе хакерской поделкой. счастлив безмерно )))) Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: Bepec от Февраль 05, 2013, 16:26 Не скинешь литературку чтоб попрактичнее? :)
А то иногда выбивает из себя, когда крешится всё нафиг, выдаёт асм... И фиг поймёшь почему, а спросить не у кого - только у зеркала :D Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: panAlexey от Февраль 05, 2013, 20:56 Не скинешь литературку чтоб попрактичнее? :) Заливаю сюда: http://code.google.com/p/undocst/downloads/listА то иногда выбивает из себя, когда крешится всё нафиг, выдаёт асм... И фиг поймёшь почему, а спросить не у кого - только у зеркала :D Название: Re: как для упавшей программы генерировать к& Отправлено: sendevent от Март 07, 2013, 12:03 Может, кому пригодится - немножко опыта про google breakpad. Не удивляйтесь, если покажется, что что-то слишком усложнено, неправильно, через одно место или вообще вредно, все нижеследующее, включая, но не ограничиваясь, примеры кода - привожу не как инструмент, а как путь движения к оному. Пердупердил :)
0. Окружение: lin, mac - gcc win - vc (nmake, cl) Про мак отмечу, что не особо вникал, да и давно это было - могу чего приврать, так что ориентируемся на lin - с большой вероятностью то же самое. Сборка самого брейкпада под все платформы тема отдельная, но достаточно разжевана, проблем быть не должно. Из нюансов (не "вообще", а в контексте данного поста) - с целевым приложением под лин линкуется статически (libbreakpad_client.a), под вин - исходники включались в проект. 1. Собираем нужные нашему приложению фреймфорки, цель - релиз с дебаг инфой; (-g для gcc, про студию не скажу; должно быть достаточно в прошнике добавить в QMAKE_LFLAGS/QMAKE_CXXFLAGS QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO/QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO, но, возможно, придется поправить свой мейкспек - $qtdir$/mkspecs). 2. Добавляем в наше приложение брейкпад (BREAKPAD_SRC_DIR - кастомная переменная окружения): 2.1 В файле проекта указываем необходимые пути/флаги: Код 2.2 Добавляем брейкпадовский обработчик крешей. Обычно это делается в main: Код Примечание-1: Приведенный пример основан на довольно древней ревизии брейкпада; если я ничего не путаю, в свежих они унифицировали интерфейс и хендлер теперь ставится одинаково для всех платформ - не надо возится #elif defined(Q_OS_*). Примечание-2: Вроде очевидно, но на всяк случай - путь сохранения дампов выбирайте таким, чтобы у пользователя был доступ на запись. Если складывать возле бинарника - могут возникнуть проблемы (c:\Program files, etc). 3. Собираем само приложение (релиз с дебаг инфой). 4. На получившиеся бинарники (*.pdb под вин, *.so и *.executable) натравливаем dump_syms из брейкпада. Для примера - имя файла libQtGui.so.4.8.2. На выходе получаем libQtGui.so.4.8.2.sym; 5. Теперь нужно сформировать дерево каталогов с файлами символов в соответствии с ожиданиями брейкпада. В полученном файле .sym первая строка примерно такая: MODULE Linux x86_64 842F9DC91DD2ECBAD5B1867842FF52F30 libQtGui.so.4.8.2 "842F9DC91DD2ECBAD5B1867842FF52F30" - это хеш модуля, по которому брейкпад будет искать доп.инфу при разворачивании дампа; получившийся libQtGui.so.4.8.2.sym должен лежать в директории с этим именем. Т.е. паттерн именования - .../binary_name/binary_sym_hash/binary.sym: /path/2/symbols/storage/libQtGui.so.4.8.2/842F9DC91DD2ECBAD5B1867842FF52F30/libQtGui.so.4.8.2.sym (В необязательную часть можно добавить версию приложения, целевую платформу и пр. вкусности, которые помогут организовать удобное хранение на серваке, но не будем об этом). 6. strip'аем бинарники, если все проделывалось под не-виндовз (под виндовз дебаг инфа в пдб, они не деплоятся); Собираем инсталяционный пакет и пр., чего там нам надо. На этом, в общем-то, все - теперь если приложение упадет, будет сгенерирован файл дампа (GUID.dmp), который раскручивается так: Код Бесплатный бонус - зоопарк операционок нужен только на этапе сборке, после этого все можно делать на одной - файл дампа, сгенерированный под вин, можно раскрутить под лин, если на нем доступны виндовые *.sym; соответсвенно и в обратную сторону, и мак. 7. Уже не про сам брейкпад, а про организацию процесса. 7.1 Генерацию файлов символов можно автоматизировать: Код
7.2 Чтобы пользователей не просить "А гляньте плиз, в кишках хомятника, в папочке с названием приложения, нет ли труднопроизносимого файла с расширением дээмпэ?" и не объяснять, что такое хомятник и расширение, дампы нужно загружать автоматически. Для этого при каждом старте проверяется наличие, если есть - загружаем к себе на сервак, у пользователя стираем. На серваке раскручиваем, заводим тикет в системе багтрекинга, если можем - определяем пользователя и шлем ему письмо про "не расстраивайтесь, сбой - это, конечно, плохо, но мы уже работаем над этим, подпишитесь на наш спам", рассылаем нотификации заинтересованным и вообще делаем, что там нам может понадобиться. Ну а реализация всего этого - к брейкпаду имеет мало отношения, так что на свой вкус. Вроде есть интерфейс для серверного обработчика, но сам с этим не работал, так что - ищем самостоятельно. При необходимости примеров толкового использования в билдрутине можно погуглить, как это сделано в файрфоксе. Название: Re: как для упавшей программы генерировать крэшдамп ? Отправлено: virtual_root от Март 13, 2013, 10:50 спасибо большое! На днях попробую, по разбираюсь google breakpoint под linux.
|