首页 > 编程知识 正文

minidump导致蓝屏,taskkill强制结束进程

时间:2023-05-06 18:59:12 阅读:117767 作者:525

介绍部分来自https://www.cn blogs.com/Li suyun/p/5245609.html

程序的部分是原创的。

Minidump方式保留程序崩溃现场

在Windows平台上开发c上的APP应用程序时,您最不想看到的可能是程序崩溃,调试版本应该是最难的,以解决导致问题的错误。 release版本到来后,调试信息会变少,更何况是向公众开放供用户使用,因此很难在crash现场保存和再现。 目前有几种方法可以解决。 地址映射文件崩溃; 映射文件; setunhandledexceptionfilterminidump。 本文侧重于setunhandledexceptionfilterminidump方式。

一.生成Minidump文件

1、Minidump概念

小型存储转储(minidump )可以理解为一个dump文件,其中包含有助于调试crash的最少有用信息。 实际上,如果在系统属性-高级设置-启动和故障恢复-设置-写调试信息中选择“小内存转储(64 KB )”,则在系统意外停止时C:WindowsMinidump 此文件是minidump文件

我们生成的是用户状态的minidump,文件中包含程序执行的模块信息、线程信息、堆栈调用信息等。 然后,dump文件被压缩,以符合该mini的特性。

2、生成minidump文件

使用drwtsn32、NTSD、CDB等调试工具生成Dump文件。 drwtsn32的缺点可以通过NTSD、CDB完全解决,但并不是所有操作系统都安装了NTSD、CDB等调试工具。 MiniDumpWriteDump接口允许程序自动生成Dump文件。 MiniDumpWriteDump是MS DbgHelp.dll中的API,用于导出当前正在运行的程序的dump。

3、自动生成Minidump文件

如果程序遇到未处理的异常(主要是指针以外的异常)而导致程序崩溃死亡,则在异常发生之前调用SetUnhandledExceptionFilter )函数时,异常将被处理为函数。 在MSDN中记述如下。

issuingsetunhandledexceptionfilterreplacestheexistingtop-levelexceptionfilterforallexistingandallfuturethreadsinthecalllingpration

因此,通过在程序的开头追加SetUnhandledExceptionFilter ()函数,并从函数中以适当的方法生成Dump文件,就能够实现所需的功能。

# include dbghelp.h # pragma comment (lib, 在' DbgHelp.lib ' )//main函数中调用setunhandledexceptionfiltersetunhandledexceptionfilition的longwinapidumpcallback (exception excp ) boost :3360 mutex 33603360 scoped _ locklock ) g _ dump _ m mutex创建dump (excp; 返回执行_执行_处理程序; } voidcreatedump (struct _ exception _ pointers * pexceptionpointers )//信息收集CStringW strBuild; str build.format (l ' build 3360 % s % s ',__DATE__,__TIME__ ); CStringW strError; whar * SZ modulename=l ' my _ module _ name '; strerror.format(L'%s%d,%d,%d.',s

zModuleName, pExceptionPointers->ExceptionRecord->ExceptionCode, pExceptionPointers->ExceptionRecord->ExceptionFlags, pExceptionPointers->ExceptionRecord->ExceptionAddress); //生成 mini crash dump BOOL bMiniDumpSuccessful; WCHAR* szPath = L"./"; WCHAR szFileName[MAX_PATH]; WCHAR* szAppName = L"DumpFile"; WCHAR* szVersion = L"v1.0"; DWORD dwBufferSize = MAX_PATH; HANDLE hDumpFile; SYSTEMTIME stLocalTime; MINIDUMP_EXCEPTION_INFORMATION ExpParam; GetLocalTime(&stLocalTime); //GetTempPathW(dwBufferSize, szPath); StringCchPrintfW(szFileName, MAX_PATH, L"%s%s", szPath, szAppName); CreateDirectoryW(szFileName, NULL); //std::wcout << szFileName; StringCchPrintfW(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()); hDumpFile = CreateFileW(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); MINIDUMP_USER_STREAM UserStream[2]; MINIDUMP_USER_STREAM_INFORMATION UserInfo; UserInfo.UserStreamCount = 1; UserInfo.UserStreamArray = UserStream; UserStream[0].Type = CommentStreamW; UserStream[0].BufferSize = strBuild.GetLength()*sizeof(WCHAR); UserStream[0].Buffer = strBuild.GetBuffer(); UserStream[1].Type = CommentStreamW; UserStream[1].BufferSize = strError.GetLength()*sizeof(WCHAR); UserStream[1].Buffer = strError.GetBuffer(); ExpParam.ThreadId = GetCurrentThreadId(); ExpParam.ExceptionPointers = pExceptionPointers; ExpParam.ClientPointers = TRUE; MINIDUMP_TYPE MiniDumpWithDataSegs = (MINIDUMP_TYPE)(MiniDumpNormal | MiniDumpWithHandleData | MiniDumpWithUnloadedModules | MiniDumpWithIndirectlyReferencedMemory | MiniDumpScanMemory | MiniDumpWithProcessThreadData | MiniDumpWithThreadInfo); bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL); return;}

 

 

 

 

二、调试Minidump文件

双击minidump文件(*.dmp)。默认会启动VisualStudio。菜单Tools/Options, Debugging/Symbols,增加PDB文件路径。注:如果minidump文件与pdb文件在同一目录,就不用设置这个了。若调试的程序需要微软基础库的PDB信息,可以增加一个路径为:http://msdl.microsoft.com/download/symbols在界面下方Cache Symbol From symbol…选择本地存储这些Symbols的路径。 注:如果本地已存储过微软基础库的pdb,就直接按照此步操作设置本地路径,不必执行上一步操作了。设置代码路径:刚打开的dmp工程,进入解决方案的属性。在这里输入源程序的代码路径。注:一定是sln所在的路径,而不是vcproj的路径!

                                            

          6. 按F5,debug吧。

 

 

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。