. 写代码有些时候会出现某个功能Debug下不会崩溃,但是Release下就崩的情况。这种情况要是没法定位的话那是最烦躁的。这时候崩溃时产生一个dump文件利用windbg来进行分析崩溃点或许是唯一的解决方法了。。。
. 一下代码是当程序崩溃时自动创建一个dump文件代码。
#include <wchar.h> #include <windows.h> #include < Dbghelp.h> #include <iostream> #include <vector> using namespace std; #pragma comment(lib, "Dbghelp.lib") namespace NSDumpFile { void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException) { // 创建Dump文件 HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // Dump信息 MINIDUMP_EXCEPTION_INFORMATION dumpInfo; dumpInfo.ExceptionPointers = pException; dumpInfo.ThreadId = GetCurrentThreadId(); dumpInfo.ClientPointers = TRUE; // 写入Dump文件内容 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL); CloseHandle(hDumpFile); } LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) { return NULL; } 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 far void *pNewFunc = &MyDummySetUnhandledExceptionFilter; DWORD dwNewEntryAddr = (DWORD) pNewFunc; DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr; newJump[ 0 ] = 0xE9; // JMP absolute memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc)); SIZE_T bytesWritten; BOOL bRet = WriteProcessMemory(GetCurrentProcess(), pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten); return bRet; } LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException) { TCHAR szMbsFile[MAX_PATH] = { 0 }; ::GetCurrentDirectory(MAX_PATH, szMbsFile); TCHAR* pFind = wcschr(szMbsFile, L'\\'); if (pFind) { *(pFind + 1) = 0; wcscat_s(szMbsFile, L"CrashDumpFile.dmp"); CreateDumpFile(szMbsFile, pException); } // TODO: MiniDumpWriteDump FatalAppExit(-1, L"Fatal Error"); return EXCEPTION_CONTINUE_SEARCH; } void RunCrashHandler() { SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); PreventSetUnhandledExceptionFilter(); } }; #define DeclareDumpFile() NSDumpFile::RunCrashHandler();
. 。。。
发表评论