日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

[Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式]

發布時間:2023/12/6 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


場景:

1. Release的程序崩潰時,崩潰報告能夠讓開發者查明代碼哪里出了問題,用處大大的。

2. 僅僅實用VS的編譯器才支持,所以MinGW就無緣了。

3. 使用了未處理異常過濾處理函數.

4. 生成的.dmp文件用zlib庫壓縮, 用到下面的ZipHelper類,編譯時還是須要zlib庫和dbghelp.lib

http://blog.csdn.net/infoworld/article/details/41290969


5. 使用方式就是把DbgReport作為app類的成員變量,或者文件范圍的全局變量初始化后,在程序執行開始前調用

RegisterCrashFilter

6. 更新: 添加VC CRT異常捕抓. 2015-09-25

參考:

http://blog.csdn.net/limiteee/article/details/8472179



bas_dbg_report.h

#ifndef __BAS_DBG_REPORT #define __BAS_DBG_REPORT#include "bas_exp.h"//1.能夠自己改動參數,加入額外信息. typedef void (*BASReportCallbackFunc)(const wchar_t* dump_zip_path);class LIB_BASIC BASDbgReport { public:void RegisterCrashFilter(const wchar_t* dump_path,BASReportCallbackFunc func);};#endif


bas_dbg_report.cpp

#include "basic/bas_dbg_report.h" #include <Windows.h> #include <DbgHelp.h>#include "basic/bas_utility_string.h" #include "basic/bas_wrap_object.h" #include "basic/bas_utility_zip.h"static std::wstring gDumpPath; static std::wstring gDumpZipPath;static BASReportCallbackFunc gReportCallbackFunc = NULL;static BOOL IsDataSectionNeeded(const WCHAR* pModuleName) { if(pModuleName == NULL) { return FALSE; } WCHAR szFileName[_MAX_FNAME] = L""; _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL); if(wcsicmp(szFileName, L"ntdll") == 0) return TRUE; return FALSE; } static BOOL CALLBACK MiniDumpCallback(PVOID pParam, const PMINIDUMP_CALLBACK_INPUT pInput, PMINIDUMP_CALLBACK_OUTPUT pOutput) { if(pInput == 0 || pOutput == 0) return FALSE; switch(pInput->CallbackType) { case ModuleCallback: if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg) if(!IsDataSectionNeeded(pInput->Module.FullPath)) pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg); case IncludeModuleCallback: case IncludeThreadCallback: case ThreadCallback: case ThreadExCallback: return TRUE; default:; } return FALSE; } static LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS pExInfo) {HANDLE hFile = ::CreateFile( gDumpPath.c_str(), GENERIC_WRITE, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if( hFile != INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION einfo;einfo.ThreadId = ::GetCurrentThreadId();einfo.ExceptionPointers = pExInfo;einfo.ClientPointers = FALSE;MINIDUMP_CALLBACK_INFORMATION mci; mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback; mci.CallbackParam = NULL; ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile,MiniDumpNormal,&einfo, NULL, &mci);::CloseHandle(hFile);}//1.壓縮dmp文件和其它char* utf8 = BASUtilityString::ConvertUnicodeToUtf8(gDumpPath.c_str());BASWrapMalloc wm1(utf8);BASUtilityZip z;z.AddFile(utf8);std::string output(utf8);output.append(".zip");wchar_t* unicode = BASUtilityString::ConvertUtf8ToUnicode(output.c_str());BASWrapMalloc wm2(unicode);gDumpZipPath.append(unicode);z.ToZip(output.c_str());if(gReportCallbackFunc){gReportCallbackFunc(gDumpZipPath.c_str());}return EXCEPTION_EXECUTE_HANDLER; }static LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) { return NULL; }static BOOL PreventSetUnhandledExceptionFilter() {HMODULE hKernel32 = LoadLibrary(L"kernel32.dll");if (hKernel32 == NULL) return FALSE;void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");if(pOrgEntry == NULL) return FALSE;unsigned char newJump[ 100 ];DWORD dwOrgEntryAddr = (DWORD) pOrgEntry;dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp farvoid *pNewFunc = &MyDummySetUnhandledExceptionFilter;DWORD dwNewEntryAddr = (DWORD) pNewFunc;DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;newJump[ 0 ] = 0xE9; // JMP absolutememcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc));SIZE_T bytesWritten;BOOL bRet = WriteProcessMemory(GetCurrentProcess(),pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten);return bRet;}void BASDbgReport::RegisterCrashFilter(const wchar_t* dump_path,BASReportCallbackFunc func) { #ifndef _DEBUGgDumpPath.append(dump_path);gReportCallbackFunc = func;SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter);//BOOL bRet = PreventSetUnhandledExceptionFilter(); //這個部分系統會崩潰,臨時不使用. #endif }


總結

以上是生活随笔為你收集整理的[Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。