第一种:通过任务管理器:
如果程序挂了的时候,还未退出,比如我运行程序,出现下边的错:
此时打开任务管理器,右击相应进程,点击生成dump文件:
一会创建完成
然后把这个DMP文件拷到开发机器上,用VS打开:会出现下面的界面,要想知道发生错误时候的调用栈,需要设置symbol的路径,点击”Set Symbol Paths“:
注意这个pdb要对应于crash的exe,否则调用栈没法显示:
设置完成后,点击”Debug with Native Only“ 你就可以看到调用栈了。
第二种:通过添加代码生成
如果在无法复现的崩溃后,程序直接退出,可以使用崩溃时自动生成dump文件的方法。
/****************第一步添加createdump.h*********************************
添加一个头文件:createdump.h
#pragma once
#include
#include
#include
#pragma comment(lib, "dbghelp.lib")
inline 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;
}
inline 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);
case IncludeModuleCallback:
case IncludeThreadCallback:
case ThreadCallback:
case ThreadExCallback:
return TRUE;
default:;
}
return FALSE;
}
inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)
{
HANDLE hFile = CreateFile(strFileName, 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 /*MiniDumpWithFullMemoryInfo*/ |0x00001000 /*MiniDumpWithThreadInfo*/ |MiniDumpWithUnloadedModules);
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);
CloseHandle(hFile);
}
}
/***************第二步*************************************
在main 函数的文件中加入
#include
#include "createdump.h"
LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
CreateMiniDump(pExceptionInfo, L"Exception.dmp");
exit(pExceptionInfo->ExceptionRecord->ExceptionCode);
return EXCEPTION_EXECUTE_HANDLER; // 程序停止运行
}
/***************第三步*************************************
在main函数中 加入:
SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);
这样在程序崩溃的时候,就会自动生成dump文件。
重构:
重构原则
重构原则二
如何重构(一)
设计原则:
设计模式之七大设计原则
创建型设计模式:
设计模式之单例模式
设计模式之工厂模式
设计模式之原型模式
设计模式之建造者模式
结构型设计模式:
设计模式之桥接模式
设计模式之适配器模式
设计模式之外观模式
设计模式之组合模式
设计模式之代理模式
设计模式之享元模式
行为型设计模式:
设计模式之观察者模式
设计模式之策略模式
设计模式之模板模式