# 5.3.1.核心傾印

## 1.目的

* 使用MiniDumpWiteDump產生.dmp file

## 2.專案設定

* 範例程式碼修改自[MSDN](https://msdn.microsoft.com/zh-tw/library/windows/desktop/ee416349.aspx?f=255\&MSPPError=-2147217396#analyzing_a_minidump), 此範例在SomeFunction()中的pBadPtr的地址被指向0, 這會造成crash, 藉此產生.dmp file
* 貼上程式碼並對專案做下面設定:&#x20;
  * 專案Property -> Linker -> input -> Additional Dependencies: 加入Dbghelp.lib
  * 專案Property -> Linker -> Debugging -> Generate Debug Info -> Yes (/DEBUG)
  * 專案Property -> Linker -> Debugging -> Generate Map File -> Yes (/MAP)

## 3.步驟

* 1.貼上程式碼並完成**專案設定**後, Build/Rebuild這個專案, 將會產生exe檔, pdb檔及map檔
* 2.[將這些編譯中所產生的檔案放到對應的路徑, 並設定WinBbg](https://jenhsuan.gitbooks.io/debugging-tools-experience/content/chapter3-windbg/32she-ding-project-ji-symbol-path.html)
* 3.利用WinDbg進一步[分析dmp file](https://jenhsuan.gitbooks.io/debugging-tools-experience/content/chapter3-windbg/33fen-6790-dmp-file.html)

## 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;
}
```
