5.3.1.核心傾印

1.目的

  • 使用MiniDumpWiteDump產生.dmp file

2.專案設定

  • 範例程式碼修改自MSDN, 此範例在SomeFunction()中的pBadPtr的地址被指向0, 這會造成crash, 藉此產生.dmp file

  • 貼上程式碼並對專案做下面設定:

    • 專案Property -> Linker -> input -> Additional Dependencies: 加入Dbghelp.lib

    • 專案Property -> Linker -> Debugging -> Generate Debug Info -> Yes (/DEBUG)

    • 專案Property -> Linker -> Debugging -> Generate Map File -> Yes (/MAP)

3.步驟

4.範例程式碼

#include "stdafx.h"
#include <Windows.h>
#include <dbghelp.h>
#include <shellapi.h>
#include <shlobj.h>
#include <StrSafe.h>
#include <iostream>
using namespace std;

int GenerateDump(EXCEPTION_POINTERS* pExceptionPointers)
{
    BOOL bMiniDumpSuccessful;
    WCHAR szPath[MAX_PATH];
    WCHAR szFileName[MAX_PATH];
    WCHAR* szAppName = L"AppName";
    WCHAR* szVersion = L"v1.0";
    DWORD dwBufferSize = MAX_PATH;
    HANDLE hDumpFile;
    SYSTEMTIME stLocalTime;
    MINIDUMP_EXCEPTION_INFORMATION ExpParam;

    GetLocalTime(&stLocalTime);
    GetTempPath(dwBufferSize, szPath);

    StringCchPrintf(szFileName, MAX_PATH, L"%s%s", szPath, szAppName);
    CreateDirectory(szFileName, NULL);


    StringCchPrintf(szFileName, MAX_PATH, L"%s%s\\%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",
        szPath, szAppName, szVersion,
        stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
        stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,
        GetCurrentProcessId(), GetCurrentThreadId());


    wprintf(L"%s", szFileName);

    hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

    ExpParam.ThreadId = GetCurrentThreadId();
    ExpParam.ExceptionPointers = pExceptionPointers;
    ExpParam.ClientPointers = FALSE;

    bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
        hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);

    return EXCEPTION_EXECUTE_HANDLER;
}
void SomeFunction()
{
        int *pBadPtr = NULL;
        *pBadPtr = 0;

}

int _tmain(int argc, _TCHAR* argv[])
{
    __try
    {
        SomeFunction();
    }
    __except ( GenerateDump(GetExceptionInformation()))
    {

    }
    return 0;
}

Last updated