利用visual studio产生dump文件分析程序崩溃 您所在的位置:网站首页 如何查看exe文件的代码信息 利用visual studio产生dump文件分析程序崩溃

利用visual studio产生dump文件分析程序崩溃

2024-07-17 22:50| 来源: 网络整理| 查看: 265

pdb文件

PDB文件是"程序数据库" Program DataBase的简称,包含的程序的代码信息 通过此文件可以查看程序断点的位置以及函数运行堆栈等信息。

dump文件

dump文件全称是 附加堆栈信息的存储文件。 文件拓展名为 .dmp 通过dump 文件可以得到程序运行某一时刻的堆栈信息。 可用于在程序崩溃的时候,分析此刻的dmp文件来排查崩溃的原因

VS中release配置生成pdb文件 右键项目属性。连接器-----调试-----选择生成调试信息 在这里插入图片描述 转储生成dmp文件(VS2015 32位) #include #include #include #include #include using namespace std; #pragma comment(lib, "Dbghelp.lib") namespace NSDumpFile { void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException) { // 创建Dump文件 HANDLE hDumpFile = CreateFile(((LPCWSTR)lpstrDumpFilePathName), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // Dump信息 MINIDUMP_EXCEPTION_INFORMATION dumpInfo; dumpInfo.ExceptionPointers = pException; dumpInfo.ThreadId = GetCurrentThreadId(); dumpInfo.ClientPointers = TRUE; // 写入Dump文件内容 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL); CloseHandle(hDumpFile); } LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) { return NULL; } BOOL PreventSetUnhandledExceptionFilter() { //Windows 本身的32位的动态链接库,确保自己有这个库 HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll")); if (hKernel32 == NULL) return FALSE; void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter"); if (pOrgEntry == NULL) return FALSE; unsigned char newJump[100]; DWORD dwOrgEntryAddr = (DWORD)pOrgEntry; dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far void *pNewFunc = &MyDummySetUnhandledExceptionFilter; DWORD dwNewEntryAddr = (DWORD)pNewFunc; DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr; newJump[0] = 0xE9; // JMP absolute memcpy(&newJump[1], &dwRelativeAddr, sizeof(pNewFunc)); SIZE_T bytesWritten; BOOL bRet = WriteProcessMemory(GetCurrentProcess(), pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten); return bRet; } LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException) { TCHAR szMbsFile[MAX_PATH] = { 0 }; ::GetModuleFileName(NULL, szMbsFile, MAX_PATH); TCHAR* pFind = _tcsrchr(szMbsFile, '\\'); if (pFind) { *(pFind + 1) = 0; //这边是生成的DUMP文件的名称 _tcscat(szMbsFile, _T("CrashDumpFile.dmp")); CreateDumpFile((LPCWSTR)szMbsFile, pException); } //这边提示的消息可根据自己的需求设计 // TODO: MiniDumpWriteDump MessageBox(NULL, _T("***程序不小心崩溃***"), _T("错误"), MB_OK); //FatalAppExit(-1, _T("***又双叒叕崩溃了,惊不惊喜?意不意外?***")); return EXCEPTION_CONTINUE_SEARCH; } void RunCrashHandler() { SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); PreventSetUnhandledExceptionFilter(); } }; #define DeclareDumpFile() NSDumpFile::RunCrashHandler();

上述生成代码来自于 https://blog.csdn.net/zl_95520/article/details/82985273

class TestDump { public: TestDump() { } ~TestDump() { } void testDumpFunc() { std::wcout // 加入崩溃dump文件功能 DeclareDumpFile(); TestDump test; test.testDumpFunc(); test.testDumpFunc(); test.testDumpFunc(); test.dump(); test.testDumpFunc(); test.testDumpFunc(); test.testDumpFunc(); return 0; } 注意

1.运行exe文件崩溃后产生dump文件(采用上述代码是在当前exe目录下产生dump文件) 2.若是生成release版本的时候release目录中没有exe文件,那么请查看常规中 exe的生成目录 在这里插入图片描述 3.请确保release已生成了调试信息 具体步骤参见上方

dmp文件的分析

1.配置源代码目录 打开一个项目解决方案(可新建,可以利用现有的)。右键属性。选择 通用属性 调试源文件 添加程序源代码目录 附加源代码目录 上图中蓝色框选部分就是附加的源代码目录 2.配置pdb信息 将生成的dump文件直接拖入到vs中。 dump文件信息 拖入后可看到如上界面。右上方红色框选部分。设置符号路径。点击进入。配置pdb文件。 配置PDB信息 如上绿色框选部分为配置的pdb文件目录。配置完毕后。点击确定即可。 在 上方 dump文件信息界面,按下F5即可定位到崩溃处。 F5运行后 如上图所示。根据右侧蓝色框选部分,查看函数调用堆栈。可定位到崩溃出。然后即可分析崩溃原因。(上图中是因为指针未分配内存。而直接使用,导致崩溃) 至此,dump文件的分析已结束

dump文件分析文章

https://www.cnblogs.com/yudongdong/p/9687320.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有