Название: Создание 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?Как это вообще работает
|