Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Январь 29, 2013, 18:15



Название: как для упавшей программы генерировать крэшдамп ?
Отправлено: 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
Почему Qt не находит её?

Подскажите, как быть?


Название: 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))
В системе нашла библиотеку dbghelp.dll и dbghelp.lib
В файле проекта пытаюсь её подключить:
Код:
LIBS += -ldbghelp
но получаю всё время сообщение об ошибке..
Код:
:-1: ошибка: cannot find -ldbghelp
Почему Qt не находит её?

Подскажите, как быть?
Как быть - начать использовать msvc.

По теме - как хранить отладочную информацию стандарт с++ не определяет. Поэтому разные компиляторы хранят ее по своему. Так же разные компиляторы используют разные форматы библиотек. Поэтому библиотеки, собранные одним компилятором, за редким исключением, не подходят для использования другим компилятором.

Итак, к чему это я. dbghelp.lib - скомпилирована компилятором msvc и не может быть использована c gcc.


Название: Re: как для упавшей программы генерировать крэшдамп ?
Отправлено: virtual_root от Февраль 01, 2013, 16:00
ага, поняла) спасибо) я использовала немного другой код и удалось вызывать нужную мне функцию. Но я почему-то не пойму, почему у меня не сохраняется стек вызовов. Как я поняла из документации, то нужно указать тип минидампа правильно. Я перепробовала уже много типов, но что-то стека вызовов не видно... Может вы сможете мне подсказать в чём я ошиблась?
Код:
#include <stdio.h>
#include "targetver.h"
#include "createDump.h"

#define DBG_HELP_DLL "DBGHELP.DLL"
#define DUMP_FILE_NAME PROGRAM_NAME ".exe.dmp"
#define DUMP_FUNCTION "MiniDumpWriteDump"
#define UNHANDLED_EXCEPTION_OCCURRED " An unhandled exception occurred. "

using namespace std;

void PrintWin32Error(const char* message);

LONG WINAPI TopLevelFilter(struct _EXCEPTION_POINTERS* pExceptionInfo)
{
    LONG result = EXCEPTION_CONTINUE_SEARCH;    // finalize process in standard way by default
    HMODULE hDll = NULL;
    MINIDUMP_EXCEPTION_INFORMATION exInfo = { 0 };
    BOOL isOK = FALSE;
    MINIDUMPWRITEDUMP pfnDump = NULL;
    HANDLE hFile = NULL;

    hDll = LoadLibraryA(DBG_HELP_DLL);

    if (hDll == NULL) {
        PrintWin32Error(" Cannot load dll " DBG_HELP_DLL);
        return result;
    }
    // get func address
    pfnDump = (MINIDUMPWRITEDUMP)GetProcAddress(hDll, DUMP_FUNCTION);
    if (!pfnDump) {
        PrintWin32Error(" Cannot get address of " DUMP_FUNCTION " function");
        return result;
    }

    hFile = CreateFileA(DUMP_FILE_NAME,
                        GENERIC_WRITE,
                        0,
                        NULL,
                        CREATE_ALWAYS,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);

    if (hFile == INVALID_HANDLE_VALUE) {
        PrintWin32Error(UNHANDLED_EXCEPTION_OCCURRED "Error on creating dump file: " DUMP_FILE_NAME);
        return result;
    }

    exInfo.ThreadId = GetCurrentThreadId();
    exInfo.ExceptionPointers = pExceptionInfo;
    exInfo.ClientPointers = 0;

    // Write pDumpFile
    isOK = pfnDump(GetCurrentProcess(),
                   GetCurrentProcessId(), hFile, MiniDumpIgnoreInaccessibleMemory, &exInfo, NULL, NULL);
    if (isOK) {
        printf(UNHANDLED_EXCEPTION_OCCURRED "Dump saved to: %s", DUMP_FILE_NAME);
        result = EXCEPTION_EXECUTE_HANDLER;
    } else {
        PrintWin32Error(UNHANDLED_EXCEPTION_OCCURRED "Error saving dump file: " DUMP_FILE_NAME);
    }
    CloseHandle(hFile);
    return result;
}

void PrintWin32Error(const char* message)
{
    DWORD errorCode = 0;
    void* buffer = NULL;

    try {
        errorCode = GetLastError();
        FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
                       FORMAT_MESSAGE_MAX_WIDTH_MASK | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                       NULL, errorCode, MAKELANGID(LANG_NEUTRAL,
                                                   SUBLANG_DEFAULT), (char*)&buffer, 0, NULL);
        printf("%s. Windows error %#x: %s", message, errorCode, (char*)buffer);
    } catch(...) {
        if (buffer != NULL) {
            LocalFree(buffer);
        }
    }
}
в isOK  результат вызова той самой функции MiniDumpWriteDump


Название: 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
Не скинешь литературку чтоб попрактичнее? :)

А то иногда выбивает из себя, когда крешится всё нафиг, выдаёт асм... И фиг поймёшь почему, а спросить не у кого - только у зеркала :D
Заливаю сюда: http://code.google.com/p/undocst/downloads/list


Название: 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 В файле проекта указываем необходимые пути/флаги:
Код
Bash
#ourapp.pro
...
CONFIG(debug, debug|release) {
...
} else {
...
   QMAKE_LFLAGS += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
...
}
 
INCLUDEPATH += $$(BREAKPAD_SRC_DIR)
unix:LIBS += $$(BREAKPAD_SRC_DIR)/client/linux/libbreakpad_client.a
 
win32{
INCLUDEPATH += $$(BREAKPAD_SRC_DIR)/client/windows
SOURCES += \
   $$(BREAKPAD_SRC_DIR)/common/windows/guid_string.cc \
   $$(BREAKPAD_SRC_DIR)/client/windows/handler/exception_handler.cc \
   $$(BREAKPAD_SRC_DIR)/client/windows/crash_generation/client_info.cc \
   $$(BREAKPAD_SRC_DIR)/client/windows/crash_generation/crash_generation_client.cc \
   $$(BREAKPAD_SRC_DIR)/client/windows/crash_generation/crash_generation_server.cc \
   $$(BREAKPAD_SRC_DIR)/client/windows/crash_generation/minidump_generator.cc \
}
...
 
2.2 Добавляем брейкпадовский обработчик крешей. Обычно это делается в main:
Код
C++ (Qt)
//-- ourapp/main.cpp
...
#define HAS_CRASHHANDLER
#if defined(Q_OS_LINUX)
#include "client/linux/handler/exception_handler.h"
#elif defined(Q_OS_WIN32)
#include "client/windows/handler/exception_handler.h"
#elif defined(Q_OS_MAC)
#include "client/mac/handler/exception_handler.h"
#endif
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
#ifdef HAS_CRASHHANDLER
   const QString absPathForDump = ...
 
#if defined(Q_OS_LINUX)
   google_breakpad::ExceptionHandler eh
   (
   absPathForDump.toLocal8Bit().data(),
   NULL,
   NULL,
   NULL,
   true
   );
#elif defined(Q_OS_WIN32)
   using namespace google_breakpad;
   ExceptionHandler *handler = new ExceptionHandler
   (
   absPathForDump.toStdWString(),
   NULL,
   NULL,
   NULL,
   ExceptionHandler::HANDLER_ALL
   );
   Q_UNUSED(handler);
#elif defined(Q_OS_MAC)
#warning think, блядь, different!
#endif
#endif
 
   return a.exec();
}
 
Примечание-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), который раскручивается так:
Код
Bash
$BREAKPAD_SRC_DIR/src/processor/minidump_stackwalk -m /path/2/GUID.dmp /path/2/symbols/storage > /path/2/readable.log
Бесплатный бонус - зоопарк операционок нужен только на этапе сборке, после этого все можно делать на одной - файл дампа, сгенерированный под вин, можно раскрутить под лин, если на нем доступны виндовые *.sym; соответсвенно и в обратную сторону, и мак.

7. Уже не про сам брейкпад, а про организацию процесса.

7.1 Генерацию файлов символов можно автоматизировать:
Код
Bash
#!/bin/bash
 
WIN_32=win_x32
WIN_64=win_x64
LIN_32=lin_x32
LIN_64=lin_x64
MAC_64=mac_x64
 
export DUMP_SYMS_EXE=dump_syms
 
PATH_ON_SERV=/var/www/dbg_symbs_storage/on/our/http
#for paths corrections:
doubleSlash=//
singleSlash=/
 
if [ x"$1" == x"" ]; then
   echo "You must specify directory with build"
   exit 1
fi
 
BUILD_DIR=$1
 
if [ ! -d $BUILD_DIR ]; then
   echo "$BUILD_DIR is not a directory"
   exit 2
fi
 
PLATFORM=$2
PDB_SUFFIX=""
 case "$PLATFORM" in
   $WIN_32)
   echo one
     FILES=`find $BUILD_DIR -name "*.pdb"`
     PDB_SUFFIX=".pdb"
     ;;
   $WIN_64)
     FILES=`find $BUILD_DIR -name "*.pdb"`
     PDB_SUFFIX=".pdb"
     ;;
   *)
     FILES=$(find $BUILD_DIR -type f)
     ;;
 esac
 
function generateDbgSymbols {
IFS=$'\n'
for f in $FILES
do
   if [ $PLATFORM == $WIN_32 ] || [ $PLATFORM == $WIN_64 ] || file "$f"|grep -Eq  'Mach-O|ELF' ; then
       OUTNAME="";
       OUTNAME=`dirname $f`/`basename $f "$PDB_SUFFIX" `.sym
       OUTNAME=${OUTNAME/$doubleSlash/$singleSlash}
 
       if echo $PLATFORM | grep -i "win" > /dev/null; then
               f=`cygpath -w $f`
       fi
 
       if [ -f $f ] && [ -n OUTNAME ] ; then
           echo generating sym file $OUTNAME from $f
           $DUMP_SYMS_EXE $f > $OUTNAME
       fi
 
       OUTNAME="";
   fi
done
unset IFS
}
 
# Clear old syms dir if exists
SYMBOLS_DIR=$BUILD_DIR/symbols
SYMBOLS_DIR=${SYMBOLS_DIR/$doubleSlash/$singleSlash}
 
test -d "$SYMBOLS_DIR" && rm -rf $SYMBOLS_DIR
mkdir -p $SYMBOLS_DIR
 
# Generating sym
generateDbgSymbols
 
echo builddir-2 is $BUILD_DIR
 
OIFS="$IFS"
IFS=$'\n'
 
for SYM_FILE in $(find $BUILD_DIR -name "*.sym" ); do
 
       SYM_FILE=${SYM_FILE/$doubleSlash/$singleSlash}
       echo "Processing $SYM_FILE"
   MODULE_NAME=`basename $SYM_FILE`$PDB_SUFFIX
   MODULE_NAME=${MODULE_NAME/.sym/}
   MODULE_CHECKSUM=$(head -n1 $SYM_FILE | awk '{print $4}')
 
   echo "Module name: $MODULE_NAME"
   echo "Module checksum: $MODULE_CHECKSUM"
 
   MODULE_SYMBOLS_DIR=$SYMBOLS_DIR/1/$MODULE_NAME/$MODULE_CHECKSUM
   mkdir -p $MODULE_SYMBOLS_DIR
   echo "module symbols dir:" $MODULE_SYMBOLS_DIR
   cp $SYM_FILE $MODULE_SYMBOLS_DIR
done
unset IFS
 
echo "Symbol directory $SYMBOLS_DIR ready. Copying it to server"
convertedPath=$SYMBOLS_DIR/1
if echo $PLATFORM | grep -i "win" > /dev/null; then
   convertedPath=`cygpath -u $SYMBOLS_DIR/1`
fi
 
scp -r $convertedPath user@our/http:$PATH_ON_SERV/$PLATFORM
 
if [ "${?}" == "0" ] ; then
   echo Symbols copyed successfuly.
else
   echo Symbols copying failed.
fi
 
rm -rf $SYMBOLS_DIR
 
exit 0
 
 

7.2 Чтобы пользователей не просить "А гляньте плиз, в кишках хомятника, в папочке с названием приложения, нет ли труднопроизносимого файла с расширением дээмпэ?" и не объяснять, что такое хомятник и расширение, дампы нужно загружать автоматически. Для этого при каждом старте проверяется наличие, если есть - загружаем к себе на сервак, у пользователя стираем. На серваке раскручиваем, заводим тикет в системе багтрекинга, если можем - определяем пользователя и шлем ему письмо про "не расстраивайтесь, сбой - это, конечно, плохо, но мы уже работаем над этим, подпишитесь на наш спам", рассылаем нотификации заинтересованным и вообще делаем, что там нам может понадобиться. Ну а реализация всего этого - к брейкпаду имеет мало отношения, так что на свой вкус.
Вроде есть интерфейс для серверного обработчика, но сам с этим не работал, так что - ищем самостоятельно.

При необходимости примеров толкового использования в билдрутине можно погуглить, как это сделано в файрфоксе.


Название: Re: как для упавшей программы генерировать крэшдамп ?
Отправлено: virtual_root от Март 13, 2013, 10:50
спасибо большое! На днях попробую, по разбираюсь google breakpoint под linux.