zoukankan      html  css  js  c++  java
  • 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。在有的线程中,会产生崩溃文件;但是在有的线程中,死活都不崩溃,当然也不可能产生崩溃文件了。

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

    PS:会笑的人,运气通常都会比别人好。
  • 相关阅读:
    eclipse提速01
    eclipse提速02
    快速清空Access资料库中所有表的数据
    删除数据之后自增长列重新开始计数
    JS中控制两个小数位
    JS控制table中tr位置互换
    MIME 类型列表
    JS中对于email格式的判断
    获取网站根目录的方法
    通过存储过程创建SQL作业
  • 原文地址:https://www.cnblogs.com/thinkinc999/p/13366567.html
Copyright © 2011-2022 走看看