windows下面生成 dump

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 也会生成。

image


加上try 不生成崩溃的配置如下:

image


另一种,加上try 不生成崩溃的配置如下:

image

事实上,在我做过的项目就,生成一个DLL,以服务方式运行这个DLL文件。

加入了上面的代码,配置为:Yes (/EHsc)

最后,这里有个问题:

int *p = NULL;
*p = 1;

使用上面这样的代码,在我上面所说到的项目中生成的DLL。在有的线程中,会产生崩溃文件;但是在有的线程中,死活都不崩溃,当然也不可能产生崩溃文件了。

我百思不得其解,有没有高手遇到过,是如何解决的?请在下面留个言。

posted on 2020-07-23 15:26  thinkinc999  阅读(289)  评论(0编辑  收藏  举报

导航