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.步驟
1.貼上程式碼並完成專案設定後, Build/Rebuild這個專案, 將會產生exe檔, pdb檔及map檔
3.利用WinDbg進一步分析dmp file
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
Was this helpful?