Russian Qt Forum
Ноябрь 24, 2024, 01:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: как для упавшей программы генерировать крэшдамп ?  (Прочитано 15238 раз)
virtual_root
Гость
« : Январь 29, 2013, 18:15 »

Добрый вечер ребята! Если кто сталкивался с моим вопросом, расскажите мне пожалуйста как мне для моей программы, написанной под windows, сделать генерацию креш дампов. Честно говоря в интернете совсем мало информации нашла по этому поводу, так что даже толком не пойму что конкретно из себя представляют креш дампы.
Кто знает про это, поделитесь пожалуйста опытом))
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #1 : Январь 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
Записан
Bepec
Гость
« Ответ #2 : Январь 30, 2013, 08:10 »

По поиску в гуглу десятки примеров.

Самое страшное потом - попытаться отладить сделанный дамп. Подцепить файлы символов у меня так и не получилось и я забросил это дело.
Записан
vregess
Гость
« Ответ #3 : Январь 30, 2013, 11:22 »

Если программа только под винды и используется компилятор от Microsoft, то пробуй CrashRpt.
Ссылку выше уже дали, или вот на документацию сразу http://crashrpt.sourceforge.net/docs/html/index.html
Пример оттуда же http://crashrpt.sourceforge.net/docs/html/simple_example.html
Записан
virtual_root
Гость
« Ответ #4 : Январь 30, 2013, 16:21 »

уже подробно почитала об этой библиотеки. Но к сожалению она мне не подходит, я использую компилятор MinGW.
Записан
vregess
Гость
« Ответ #5 : Январь 30, 2013, 21:21 »

Тогда у меня для тебя плохие новости.
Записан
virtual_root
Гость
« Ответ #6 : Февраль 01, 2013, 11:20 »

Какие плохие?
Bepec, как я поняла ты когда-то этим занимался. А ты случайно не знаешь отладчик gdb умеет работать  с минидампами ?
И что мне делать если в Qt отсутствует библиотека DbgHelp ? Просто  с её помощью можно сделать генерацию мини дампа.
Я конечно кое-как выкрутилась. В интеренте нашла примеры и один из них подогнала под Qt. Но всё равно у меня никак не получается использовать фун-ю MiniDumpWriteDump (http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms680360(v=vs.85).aspx)
Может вы подскажите мне?
Приведу мой пример проекта. В этом проекте необходимо в настройках проекта выставить чистую среду.
Записан
Bepec
Гость
« Ответ #7 : Февраль 01, 2013, 11:24 »

Кхм. Я пользуюсь только VS 2008. Не могу сказать ничего про отладчик gdb Улыбающийся

Сама то функция вин апишная. Насколько я помню, занимает всего пяток строк. Другая проблема, что нехватило мне терпения узнать, как подключить файлы символов к загруженному дампу Улыбающийся

Записан
virtual_root
Гость
« Ответ #8 : Февраль 01, 2013, 15:06 »

Ребята, помогите пожалуйста. Подскажите, почему  у меня не получается использовать фун-ю MiniDumpWriteDump (http://msdn.microsoft.com/en-us/library/ms680360(v=VS.85).aspx)
В системе нашла библиотеку dbghelp.dll и dbghelp.lib
В файле проекта пытаюсь её подключить:
Код:
LIBS += -ldbghelp
но получаю всё время сообщение об ошибке..
Код:
:-1: ошибка: cannot find -ldbghelp
Почему Qt не находит её?

Подскажите, как быть?
« Последнее редактирование: Февраль 01, 2013, 15:28 от tiny developer » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #9 : Февраль 01, 2013, 15:56 »

Ребята, помогите пожалуйста. Подскажите, почему  у меня не получается использовать фун-ю MiniDumpWriteDump (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.
Записан
virtual_root
Гость
« Ответ #10 : Февраль 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
Записан
virtual_root
Гость
« Ответ #11 : Февраль 01, 2013, 17:19 »

уже разобралась) надо было использовать флаг MiniDumpFilterMemory
Записан
virtual_root
Гость
« Ответ #12 : Февраль 01, 2013, 17:40 »

хотя даже этот флаг мне не дал такого результат, который я ожидала. Благодаря ему я не видела ошибку в windbg при попытке просмотреть стек вызовов. Что-то не пойму почему так. У меня есть предположение, что для того чтобы увидеть стек вызовов нужен символьный файл?
Когда я открываю файл дампа в windbg, я вижу в нем странную для меня ошибку...

Я так понимаю, что windbg нужен символьный файл. Но как его создать? Его похоже во время создания дампа нужно как-то привязать?
Это об этом вы говорили, Верес?
Может кто что подскажет)
« Последнее редактирование: Февраль 01, 2013, 17:42 от tiny developer » Записан
Bepec
Гость
« Ответ #13 : Февраль 01, 2013, 17:56 »

Файл символов создаётся при компиляции программы. Т.е. *.pdb и есть файл символов для msvs. Другой вопрос, как его подцепить - этого я понять не смог и бросился на другой проект Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Февраль 01, 2013, 21:21 »

Как это сделать на злополучном Вындоуз - не скажу, но может есть другой, чисто практический выход. Помнится Вы задавали вопросы про Mac OSX, так вот там это делается автоматычно и crashReport действительно информативен и часто полезен. Просто запускаете и ждете краша. Когда случится Вам предложат просмотреть сразу а файл в любом случае сохранится в фолдере CrashReports
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.316 секунд. Запросов: 23.