一、windows下的崩溃捕获
windows程序当遇到异常,没有try-catch或者try-catch也无法捕获到的异常时,程序就会自动退出。windows系统默认是不产生程序dmp文件的。
dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法。

1. 产生dmp的三种方式:

方法一: 使用windows系统api,在要捕获dmp文件的程序代码中添加即可

  1. #include "windows.h"
  2. #include "DbgHelp.h"
  3.  
  4. //ANSI转化成UNICODE
  5. LPWSTR ANSITOUNICODE(const char* pBuf)
  6. {
  7. int lenA = lstrlenA(pBuf);
  8. int lenW=0;
  9. LPWSTR lpszFile;
  10. lenW = MultiByteToWideChar(CP_ACP,0,pBuf,lenA,0,0);
  11. if(lenW > 0)
  12. {
  13. lpszFile = SysAllocStringLen(0,lenW); //申请一个指定字符长度的 BSTR 指针,并初始化为一个字符串
  14. MultiByteToWideChar(CP_ACP,0,pBuf,lenA,lpszFile,lenW); //
  15. }
  16. return lpszFile;
  17. }
  18. typedef BOOL (WINAPI * MINIDUMP_WRITE_DUMP)(
  19. IN HANDLE hProcess,
  20. IN DWORD ProcessId,
  21. IN HANDLE hFile,
  22. IN MINIDUMP_TYPE DumpType,
  23. IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL
  24. IN PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL
  25. IN PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL
  26. );
  27. void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
  28. {
  29. // 创建Dump文件
  30. HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  31. // Dump信息
  32. MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
  33. dumpInfo.ExceptionPointers = pException;
  34. dumpInfo.ThreadId = GetCurrentThreadId();
  35. dumpInfo.ClientPointers = TRUE;
  36. MINIDUMP_WRITE_DUMP MiniDumpWriteDump_;
  37. HMODULE hDbgHelp = LoadLibrary(ANSITOUNICODE("DBGHELP.DLL"));
  38. MiniDumpWriteDump_ = (MINIDUMP_WRITE_DUMP)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
  39. MiniDumpWriteDump_(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
  40. CloseHandle(hDumpFile);
  41. }
  42. // 处理Unhandled Exception的回调函数
  43. LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
  44. {
  45. QDir temp;
  46. QString errorPath;
  47. bool exist = temp.exists(QCoreApplication::applicationDirPath()+"/Log");
  48. if(!exist)
  49. {
  50. bool ok = temp.mkdir(QCoreApplication::applicationDirPath()+"/Log");
  51. if(!ok) //失败 放在执行路径下
  52. errorPath = QCoreApplication::applicationDirPath()+QString("/%1崩溃日志.dmp").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh.mm.ss"));
  53. }
  54. errorPath = QCoreApplication::applicationDirPath()+QString("/Log/%1崩溃日志.dmp").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh.mm.ss"));
  55. // 这里弹出一个错误对话框并退出程序
  56. CreateDumpFile(ANSITOUNICODE(errorPath.toStdString().c_str()), pException);
  57. FatalAppExit(-1, ANSITOUNICODE("*** 未知 错误! ***"));
  58. return EXCEPTION_EXECUTE_HANDLER;
  59. }
  60. int main(int argc, char *argv[])
  61. {
  62. SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
  63. QApplication a(argc, argv);
  64. TestWidget w;
  65. w.showMaximized();
  66. return a.exec();
  67. }

将上述代码 可以移植到任何windows程序中使用即可。

方法二: 修改注册表

1. 打开dmp文件生成:
使用管理员权限,执行一下脚本内容,运行后: 任何程序崩溃都会在C:\CrashDump 产生dmp文件(full dmp)。

  1. @echo 启用Dump
  2. reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
  3. reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "C:\CrashDump" /f
  4. reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f
  5. reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
  6. @echo Dump已经启用

2. 关闭dmp的生成:
管理员权限执行以下脚本修改注册表信息:

  1. @echo 关闭Dump
  2. reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /f
  3. @echo Dump已经关闭

3. 注册表中Windows Error Reporting\LocalDumps (WER)下字段说明:

  1. 在他下面创建一个项,名字为你要检测的程序名。
  2. 此项中需要4个值配置
  3. 值:DumpFolder, 类型:REG_EXPAND_SZ - 就是存储dump的位置
  4. 值:DumpCount, 类型:REG_DWORD - 最大保留的dump个数,默认为10.
  5. 值:DumpType, 类型:REG_DWORD - Dump类型,0Custom dump 1 Mini dump, 2 Full dump. 默认值为1
  6. 值:CustomDumpFlags, 类型:REG_DWORD - 没怎么用。
  7. 启动Windows Error Reporting Server服务
  8. 服务启动后如果相应程序出现了崩溃的情况,WER就会自动将Crash Dump保存到指定的目录
  9. 注意:
  10. 1Windows Error Reporting Server服务每当触发一次dump,就会变成非启动状态,因此在设置此服务时,应当设置启动类型为自动。
  11. 2)在配置WER时,需要注意的是Count大小的设置,如果dmp文件个数超过Count的个数,会进行滚动覆盖,即新的dmp会覆盖旧的dmp

方法三:手动创建转储文件

当windows应用程序出现无响应时,可以打开任务管理器,找到无响应的进程,右键选择创建转储文件即可,即生成崩溃对应的dmp文件,该文件一般位于 C:\Users\happy\AppData\Local\Temp目录。

Windows下 dmp文件的产生的更多相关文章

  1. 关于Windows下的文件后缀名问题

    一.背景说明 有很多的小伙伴对windows下的文件后缀名不能很好地理解作用和区别,更不用说高深的使用了,在这里给大家说一下这些文件后缀名到底有什么区别,有什么作用呢? 二.说明 简单的说来,wind ...

  2. 将Windows下的文件同步到Linux下

    需求:把Windows下的某些文件自动传送到Linux指定目录下 实现: 1. Windows下安装 WinSCP工具,并把Liunx服务器信息保存 2. 编写脚本,实现双击工具就把Windows下的 ...

  3. Windows下对文件夹下所有图片批量重命名(附C++,python,matlab代码)

    https://blog.csdn.net/u011574296/article/details/72956446: Windows下对文件夹下所有图片批量重命名(附C++,python,matlab ...

  4. windows下在文件夹中快速启动cmd

    在windows下,有时候由于特定需要,我们经常需要将cmd  cd到某文件下进行命令行操作,其实,这里有一个小技巧: 在一个文件下,按住shift键,然后点击鼠标右键,你就会发现菜单栏中多出一个“在 ...

  5. windows下的文件遍历(使用CFindFile)

    这个我一直都很想做了,前两天开始准备,查找了一下CFindFile的资料,然后把思路理清楚,就直接开始做了. 文件系统是一个操作系统以一部分,所以想文件操作,基本上就要依赖于操作系统提供的接口函数. ...

  6. windows下计算文件的md和sha值

    在windows下可以使用FCIV命令行工具计算文件的md5和sha值,具体例子如下: FCIV -md5 -sha1 path\filename.ext 例如: FCIV-md5-sha1 c:\w ...

  7. windows下建立文件的换行符^M导致linux下的shell脚本执行错误的解决方式

    常常在windows下编辑的文件远程传送到linux下的时候每行末尾都会出现^M.这将导致shell脚本执行错误,主要是由于dos下的编辑器和linux下的编辑器对文件末行的回车符处理不一致导致. 主 ...

  8. Windows下切分文件(GnuWin32)

    windows下碰到查看大日志文件还真麻烦,今天找了个工具来做这个:安装GnuWin32,然后用里面的split命令分割日志文件 ps:发现intellij idea还挺好,超过2g的日志文件也能进行 ...

  9. windows下数据库文件使用脚本同步到linux下的mysql数据库中

    1.背景 windows server 2008 下 每天会有 *.sql数据文件 需要上传到linux 中的mysql数据库中 而运维人员是在 windows server 下使用 xshell 连 ...

随机推荐

  1. PTA的Python练习题(四)

    从 第3章-1 3-1.大于身高的平均值 开始 1. 引入列表的概念 a=list(map(int,input().split())) b=sum(a) c=len(a) d=b/c for i in ...

  2. python学习记录(持续更新)--最最最基础的一部分(方法,异常处理,注释,类)

    写在前面 本系列教程针对有一定编程经验的伙伴快速入门python基础,一些涉及开发的常识问题,本文并不涉及. 方法 function def greet_user(name): print(f'Hi ...

  3. Java 调用系统系统可执行文件

    public class Test { public static Map<String, String> executeCmd(String cmd) { Runtime rt = Ru ...

  4. Laravel 6.X + Vue.js 2.X + Element UI +vue-router 配置

    Laravel 版本:6.X Vue 版本:2.X Laravel配置: Laravel使用的是Laragon安装 选择Laravel:接下来弹出框,输入项目名,laravel会自动创建一个数据库,数 ...

  5. Mysql 锁定 读情况

    在一个事务中,标准的SELECT语句是不会加锁,但是有两种情况例外. SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE SELECT ... LO ...

  6. MySQL操作之DDL

    目录 SQL语句的分类 DDL语句 SQL语句的分类 DDL(Data Definition Languages)语句:数据定义语言.这些语句定义了不同的数据段. 数据库.表.列.索引等数据库对象的定 ...

  7. 生成资源文件时候,可以动态替换为maven属性

    1.maven管理的文件或者是maven插件处理的文件中   可以引用maven属性,在编译输出时候,可以替换   ${project.build.testOutputDirectory}   在资源 ...

  8. python学习 第一章 one day(补)

    python入门 一.编写Hello,World 方法一. 进入解释器,实施输入并获取到执行结果 C:\Users\84535>python Python 3.7.4 (tags/v3.7.4: ...

  9. Adroid ViewPage+GridView实现每页6个元素,三页滑动切换

    //}//public class MainActivity extends Activity {// private static final float APP_PAGE_SIZE = 16.0f ...

  10. 【C++】【STL】【map】基础知识干货

    1.map简介 map是一种关联式容器,主要用于对数据一对一的映射. 2.map的构造 (1)头文件:#include<map> (2)定义:map<第一关键字,第二关键字> ...