一、使用程序自动生成dump文件。在程序运行崩溃时,会自动生成到程序运行目录。添加以下。
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")//注意:动态库dbghelp.dll也要加入到运行目录下。
LONG __stdcall ExceptCallBack(EXCEPTION_POINTERS *pExcPointer)
{
char szFileName[1024] = { 0 };
GetModuleFileName(NULL, szFileName, sizeof(szFileName));
string strFilePath(szFileName);
int pos = strFilePath.find_last_of('\\', strFilePath.length());
string strDir = strFilePath.substr(0, pos + 1); // 获取文件夹路径
int suffixPos = strFilePath.find_last_of(".", strFilePath.length());
string strFile = strFilePath.substr(pos + 1, suffixPos - pos - 1); // 文件名称
string strDmpfile = strDir.append(strFile).append(".dmp"); // 配置文件路径
string erromsg = "程序崩溃!相关信息记录在:" + strDmpfile;
MessageBox(NULL, erromsg.c_str(), NULL, MB_OK);
//创建dump文件
HANDLE hFile = CreateFile(strDmpfile.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
//向文件写下当前程序崩溃相关信息
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = pExcPointer;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, (MiniDumpNormal), &loExceptionInfo, NULL, NULL);
CloseHandle(hFile);
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char* argv[])
{
//main开始,注册生成dump回调
SetUnhandledExceptionFilter(ExceptCallBack);
...
}
二、然后将对应版本的pdb文件和dump文件放到同一个文件夹内。用windbg.exe 加载“Open crash Dump”.
加载后,输入命令:“.ecxr” 来显示错误上下文
“ kb ” 来显示调用堆栈
即可定位问题行数。
或者用 !analyze -v 来自动分析