main.cpp
1 #include "Windows.h" 2 #include "DbgHelp.h" 3 #include <tchar.h> 4 5 int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers) 6 { 7 // 定义函数指针 8 typedef BOOL(WINAPI * MiniDumpWriteDumpT)( 9 HANDLE, 10 DWORD, 11 HANDLE, 12 MINIDUMP_TYPE, 13 PMINIDUMP_EXCEPTION_INFORMATION, 14 PMINIDUMP_USER_STREAM_INFORMATION, 15 PMINIDUMP_CALLBACK_INFORMATION 16 ); 17 // 从 "DbgHelp.dll" 库中获取 "MiniDumpWriteDump" 函数 18 MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL; 19 HMODULE hDbgHelp = LoadLibrary(_T("DbgHelp.dll")); 20 if (NULL == hDbgHelp) 21 { 22 return EXCEPTION_CONTINUE_EXECUTION; 23 } 24 pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump"); 25 26 if (NULL == pfnMiniDumpWriteDump) 27 { 28 FreeLibrary(hDbgHelp); 29 return EXCEPTION_CONTINUE_EXECUTION; 30 } 31 CreateDirectory(_T("Crash"), NULL); 32 // 创建 dmp 文件件 33 TCHAR szFileName[MAX_PATH] = { 0 }; 34 const TCHAR* szVersion = _T("Appmgmt_"); 35 SYSTEMTIME stLocalTime; 36 GetLocalTime(&stLocalTime); 37 wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d.dmp", 38 szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, 39 stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond); 40 HANDLE hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, 41 FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); 42 if (INVALID_HANDLE_VALUE == hDumpFile) 43 { 44 FreeLibrary(hDbgHelp); 45 return EXCEPTION_CONTINUE_EXECUTION; 46 } 47 // 写入 dmp 文件 48 MINIDUMP_EXCEPTION_INFORMATION expParam; 49 expParam.ThreadId = GetCurrentThreadId(); 50 expParam.ExceptionPointers = pExceptionPointers; 51 expParam.ClientPointers = FALSE; 52 pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), 53 hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL); 54 // 释放文件 55 CloseHandle(hDumpFile); 56 FreeLibrary(hDbgHelp); 57 return EXCEPTION_EXECUTE_HANDLER; 58 } 59 60 LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo) 61 { 62 // 这里做一些异常的过滤或提示 63 if (IsDebuggerPresent()) 64 { 65 return EXCEPTION_CONTINUE_SEARCH; 66 } 67 return GenerateMiniDump(lpExceptionInfo); 68 } 69 70 DWORD WINAPI workthread(LPVOID lpThreadParameter) 71 { 72 try 73 { 74 int *p = NULL; 75 *p = 1; 76 } 77 catch (...) 78 { 79 80 } 81 82 //Sleep(3000); 83 return 0; 84 } 85 int main() 86 { 87 // 加入崩溃dump文件功能 88 SetUnhandledExceptionFilter(ExceptionFilter); 89 90 HANDLE h = CreateThread(NULL, 0, workthread, NULL, 0, NULL); 91 WaitForSingleObject(h, INFINITE); 92 93 // 使程序崩溃产生 Dump 文件 94 //int *p = NULL; 95 //*p = 1; 96 97 98 } 99 100
默认生成崩溃,加上try 也会生成。
加上try 不生成崩溃的配置如下:
另一种,加上try 不生成崩溃的配置如下:
事实上,在我做过的项目就,生成一个DLL,以服务方式运行这个DLL文件。
加入了上面的代码,配置为:Yes (/EHsc)
最后,这里有个问题:
int *p = NULL;
*p = 1;
使用上面这样的代码,在我上面所说到的项目中生成的DLL。在有的线程中,会产生崩溃文件;但是在有的线程中,死活都不崩溃,当然也不可能产生崩溃文件了。
我百思不得其解,有没有高手遇到过,是如何解决的?请在下面留个言。