DLL中的结构化异常不能通过调用SetUnhandledExceptionFilter来全局进行捕获,可以对关键代码加__try来进行捕获,如下:
头文件dump.h
#pragma once
#include <Windows.h>
long WINAPI CreateMiniDump( LPEXCEPTION_POINTERS lpExceptionInfo);
#define SEH_BEGIN __try {
#define SEH_END } \
__except(CreateMiniDump(GetExceptionInformation()), \
EXCEPTION_EXECUTE_HANDLER){}
源文件dump.cpp:
#include "dump.h"
#include <DbgHelp.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#pragma comment(lib, "dbghelp.lib")
long WINAPI CreateMiniDump( LPEXCEPTION_POINTERS lpExceptionInfo)
{
char szFileName[MAX_PATH] = {0};
char szTime[64] = {0};
time_t tmVal = time(NULL);
strftime(szTime, sizeof(tm), "%Y-%m-%d %H-%M-%S", localtime(&tmVal));
if (!GetModuleFileName(NULL, szFileName, MAX_PATH)){
return GetLastError();
}
int lastIndex = -1;
for (int i = MAX_PATH - 1; i >= 0; i--){
if (szFileName[i] == '\\'){
szFileName[i] = '\0';
printf("find last slash\n");
lastIndex = i;
break;
}
}
memset(szFileName + lastIndex, 0, MAX_PATH - lastIndex);
strcat(szFileName, "\\");
strcat(szFileName, szTime);
strcat(szFileName, ".dmp");
HANDLE hFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwStatus = 0;
if (hFile != INVALID_HANDLE_VALUE )
{
MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = lpExceptionInfo;
mdei.ClientPointers = FALSE;
MINIDUMP_TYPE mdt = MiniDumpNormal;
BOOL retv = MiniDumpWriteDump(
GetCurrentProcess(), GetCurrentProcessId(),
hFile,
mdt,
( lpExceptionInfo != 0 ) ? &mdei : 0, 0, 0);
CloseHandle( hFile );
}
dwStatus = GetLastError();
return dwStatus;
}
使用时注意“error C2712: 无法在要求对象展开的函数中使用__try ”这个错误,还要链接dbghelp.lib。