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

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

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

    也非常感谢 帮助我的几篇博客。

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

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

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

    minidump.h

    #include
    #pragma comment(lib, "dbghelp.lib")
    
    
    bool IsDataSectionNeeded(const WCHAR* pModuleName)
    {
        if (pModuleName == 0)
        {
            return false;
        }
    
        WCHAR szFileName[_MAX_FNAME] = L"";
        _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);
    
        if (wcsicmp(szFileName, L"ntdll") == 0) return true;
        return false;
    }
    
    BOOL CALLBACK MiniDumpCallback(
        PVOID                            pParam,
        const PMINIDUMP_CALLBACK_INPUT   pInput,
        PMINIDUMP_CALLBACK_OUTPUT        pOutput
        )
    {
        if (pInput == 0 || pOutput == 0) return FALSE;
        switch (pInput->CallbackType)
        {
        case ModuleCallback:
            if (pOutput->ModuleWriteFlags & ModuleWriteDataSeg)
                if (!IsDataSectionNeeded(pInput->Module.FullPath))
                    pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);
            // fall through
        case IncludeModuleCallback:
        case IncludeThreadCallback:
        case ThreadCallback:
        case ThreadExCallback:
            return TRUE;
        default:;
        }
        return FALSE;
    }
    
    void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCSTR filename)
    {
        HANDLE hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE,
            0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    
        if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
        {
            MINIDUMP_EXCEPTION_INFORMATION mdei;
            mdei.ThreadId = GetCurrentThreadId();
            mdei.ExceptionPointers = pep;
            mdei.ClientPointers = FALSE;
            MINIDUMP_CALLBACK_INFORMATION mci;
            mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
            mci.CallbackParam = 0;
            MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |
                MiniDumpWithDataSegs |
                MiniDumpWithHandleData |
                0x00000800 |
                0x00001000 |
                MiniDumpWithUnloadedModules);
            MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
                hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);
    
            CloseHandle(hFile);
        }
    }

    main.cpp

    #include "minidump.h"
    
    #include
    #include
    
    
    
    LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
    {
        char creashFile[100];
        getcwd(creashFile, 100);
        strcat(creashFile, "\CreatFile.dmp");
        CreateMiniDump(pExceptionInfo, creashFile);
        return EXCEPTION_EXECUTE_HANDLER;
    }
    
    
    
    int main(int argc, char *argv[])
    {
        SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    
        //do something...
    
        return 0;
    
    
    
    }

    http://www.cnblogs.com/swarmbees/p/5621602.html

  • 相关阅读:
    红帽7 Shell编程
    红帽7 vim编辑器
    红帽7 管道符、重定向与环境变量
    红帽7 systemctl管理服务的启动、重启、停止、重载、查看状态等常用命令
    python 装饰器详解
    红帽7 常用系统命令
    转 JSON详解
    转 C# using 三种使用方式
    存储过程详解 转
    使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
  • 原文地址:https://www.cnblogs.com/findumars/p/5738945.html
Copyright © 2011-2022 走看看