Russian Qt Forum

Qt => Вопросы новичков => Тема начата: opera от Апрель 02, 2021, 15:56



Название: Создание dmp-файла для Сервиса
Отправлено: opera от Апрель 02, 2021, 15:56
Добрый день. Задавал раньше вопрос по поводу создания дамп файла тут, мне успешно помогли, за что всем причастным огромное спасибо. Но сейчас у меня имеется сервис, который стартует и останавливается через таск менеджер.Вот пример кода main:

Код:
#include <Dbghelp.h>
#include <tchar.h>

#define __CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW

typedef BOOL(WINAPI* MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);




void make_minidump(EXCEPTION_POINTERS* e)
{
    auto hDbgHelp = LoadLibraryA("dbghelp");
    if (hDbgHelp == nullptr)
        return;
    auto pMiniDumpWriteDump = (decltype(&MiniDumpWriteDump))GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
    if (pMiniDumpWriteDump == nullptr)
        return;

    char name[MAX_PATH];
    {
        auto nameEnd = name + GetModuleFileNameA(GetModuleHandleA(0), name, MAX_PATH);
        SYSTEMTIME t;
        GetSystemTime(&t);
        wsprintfA(nameEnd - strlen(".exe"),
            "_%4d%02d%02d_%02d%02d%02d.dmp",
            t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
    }

    auto hFile = CreateFileA(name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if (hFile == INVALID_HANDLE_VALUE)
        return;

    MINIDUMP_EXCEPTION_INFORMATION exceptionInfo;
    exceptionInfo.ThreadId = GetCurrentThreadId();
    exceptionInfo.ExceptionPointers = e;
    exceptionInfo.ClientPointers = FALSE;

    auto dumped = pMiniDumpWriteDump(
        GetCurrentProcess(),
        GetCurrentProcessId(),
        hFile,
        MINIDUMP_TYPE(MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory),
        e ? &exceptionInfo : nullptr,
        nullptr,
        nullptr);

    CloseHandle(hFile);

    return;
}

LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e)
{
    make_minidump(e);
    return EXCEPTION_CONTINUE_SEARCH;
}


int main(int argc, char *argv[])
{
    SetUnhandledExceptionFilter(unhandled_handler);

    WinService a(argc, argv);
    return  a.exec();
}

если внутри кода сделать специальную ошибку, то сервис стартует и сразу же останавливаетя=все правильно, но dmp файл не создается. Как сделать так, чтобы он создавался?


Название: Re: Создание dmp-файла для Сервиса
Отправлено: opera от Апрель 02, 2021, 17:54
Вопрос:
Я внутри класса WinService  при старте создаю объект и помещаю его внутри другого потока. Методом тыка, добавив код, который приведен в самом начале в именно в мой объект, а не в main, я увидел падение и создание dmp файла, разъясните пожалуйста, кто знает, если бы был тот же поток, то можно было бы добавлять и в main?Как это вообще работает