DLL 文件产生dump

来源:互联网 发布:高并发解决方案php 编辑:程序博客网 时间:2024/05/04 23:17

程序运行过程中不免会崩溃

有必要添加dump产生代码:

创建except.h


#ifndef _except_inc__#define _except_inc__#pragma once#include <DbgHelp.h>#include <Shlwapi.h>#pragma comment(lib, "dbghelp.lib")#pragma comment(lib, "shlwapi.lib")#ifndef CRASH_DUMP_FILE#define CRASH_DUMP_FILE _T("Crash.dmp")#endifstatic void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo){if (excpInfo == NULL) {__try {RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);} __except(DumpMiniDump(hFile, GetExceptionInformation()),EXCEPTION_CONTINUE_EXECUTION) {}} else{MINIDUMP_EXCEPTION_INFORMATION eInfo;eInfo.ThreadId = GetCurrentThreadId();eInfo.ExceptionPointers = excpInfo;eInfo.ClientPointers = FALSE;MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),hFile,MiniDumpWithFullMemory,excpInfo ? &eInfo : NULL,NULL,NULL);}}static LONG WINAPI Local_UnhandledExceptionFilter(PEXCEPTION_POINTERS pExcept){TCHAR szModuleName[MAX_PATH] = {0};GetModuleFileName(NULL, szModuleName, MAX_PATH);PathRemoveFileSpec(szModuleName);PathAddBackslash(szModuleName);lstrcat(szModuleName, _T("Dump\\"));CreateDirectory(szModuleName, NULL);lstrcat(szModuleName, CRASH_DUMP_FILE);HANDLE hFile = CreateFile(szModuleName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,NULL);if (hFile != INVALID_HANDLE_VALUE){DumpMiniDump(hFile, pExcept);CloseHandle(hFile);}return 0;}#endif
然后再dllmain中调用SetUnhandledExceptionFilter(::Local_UnhandledExceptionFilter);即可;

#include "stdafx.h"#define CRASH_DUMP_FILE _T("dump.dmp")#include "..\..\include\except.h"BOOL APIENTRY DllMain( HMODULE hModule,                       DWORD  ul_reason_for_call,                       LPVOID lpReserved ){SetUnhandledExceptionFilter(::Local_UnhandledExceptionFilter);switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}

程序崩溃时就会在dump文件夹下产生dump文件,windbg调试时添加pdb文件即可指导程序不崩在什么第方 。

0 0
原创粉丝点击