zoukankan      html  css  js  c++  java
  • vs 自动生成core dump文件

      一直以来觉着core dump这个东西很神奇,在初步学习的时候也没有个大方向,最近项目需要记录程序崩溃时的日志信息,因此在网上寻找相关的信息,此时core dump也成为了我重点关注的东西。

        说说我的辛酸历史吧,刚毕业1年的我,C++领域的东西还是知之甚少啊,记得又一次面试被问起了demp文件,我当时真是对此一无所知,然而面试过后,我 也查询了有关dump的信息,由于当时是百度的,所以也没有查到什么有用的信息,直到最近项目上的需求我又重新拾起了这个问题,而这次是用google搜 索的相关字眼,结果被我找到了几篇不错的文章,而且还附带有事例代码,短短几分钟,我就成功的在我的程序中生成了dump文件,在此记录一下,也非常感谢 帮助我的几篇博客。

    自己创建 minidump:该篇博客中封装好的代码,下载下来,导入自己的工程,在main函数中执行有关代码,dump文件在异常时会自动写入

    程序自动生成Dump文件: 这篇文字的内容基本和上面的文章一样,只是略显乱一点,这么说应该不太合适。

    下面 我贴出头文件和main函数中应该加入的代码的代码:

    minidump.h

     1 #include
     2 #pragma comment(lib, "dbghelp.lib")
     3 
     4 
     5 bool IsDataSectionNeeded(const WCHAR* pModuleName)
     6 {
     7     if (pModuleName == 0)
     8     {
     9         return false;
    10     }
    11 
    12     WCHAR szFileName[_MAX_FNAME] = L"";
    13     _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);
    14 
    15     if (wcsicmp(szFileName, L"ntdll") == 0) return true;
    16     return false;
    17 }
    18 
    19 BOOL CALLBACK MiniDumpCallback(
    20     PVOID                            pParam,
    21     const PMINIDUMP_CALLBACK_INPUT   pInput,
    22     PMINIDUMP_CALLBACK_OUTPUT        pOutput
    23     )
    24 {
    25     if (pInput == 0 || pOutput == 0) return FALSE;
    26     switch (pInput->CallbackType)
    27     {
    28     case ModuleCallback:
    29         if (pOutput->ModuleWriteFlags & ModuleWriteDataSeg)
    30             if (!IsDataSectionNeeded(pInput->Module.FullPath))
    31                 pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);
    32         // fall through
    33     case IncludeModuleCallback:
    34     case IncludeThreadCallback:
    35     case ThreadCallback:
    36     case ThreadExCallback:
    37         return TRUE;
    38     default:;
    39     }
    40     return FALSE;
    41 }
    42 
    43 void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCSTR filename)
    44 {
    45     HANDLE hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE,
    46         0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    47 
    48     if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
    49     {
    50         MINIDUMP_EXCEPTION_INFORMATION mdei;
    51         mdei.ThreadId = GetCurrentThreadId();
    52         mdei.ExceptionPointers = pep;
    53         mdei.ClientPointers = FALSE;
    54         MINIDUMP_CALLBACK_INFORMATION mci;
    55         mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
    56         mci.CallbackParam = 0;
    57         MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |
    58             MiniDumpWithDataSegs |
    59             MiniDumpWithHandleData |
    60             0x00000800 |
    61             0x00001000 |
    62             MiniDumpWithUnloadedModules);
    63         MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
    64             hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);
    65 
    66         CloseHandle(hFile);
    67     }
    68 }
    View Code

    main.cpp

     1 #include "minidump.h"
     2 
     3 #include
     4 #include
     5 
     6 
     7 
     8 LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
     9 {
    10     char creashFile[100];
    11     getcwd(creashFile, 100);
    12     strcat(creashFile, "\CreatFile.dmp");
    13     CreateMiniDump(pExceptionInfo, creashFile);
    14     return EXCEPTION_EXECUTE_HANDLER;
    15 }
    16 
    17 
    18 
    19 int main(int argc, char *argv[])
    20 {
    21     SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    22 
    23     //do something...
    24 
    25     return 0;
    26 
    27 
    28 
    29 }
    View Code
    如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!! 

     

      


    很重要--转载声明

    1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
    2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。 

  • 相关阅读:
    vue使用elementui合并table
    使用layui框架导出table表为excel
    vue使用elementui框架,导出table表格为excel格式
    前台传数据给后台的几种方式
    uni.app图片同比例缩放
    我的博客
    【C语言】取16进制的每一位
    SharePoint Solution 是如何部署的呢 ???
    无效的数据被用来用作更新列表项 Invalid data has been used to update the list item. The field you are trying to update may be read only.
    SharePoint 判断用户在文件夹上是否有权限的方法
  • 原文地址:https://www.cnblogs.com/swarmbees/p/5621602.html
Copyright © 2011-2022 走看看