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

1. 产生dmp的三种方式:

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

#include "windows.h"
#include "DbgHelp.h" //ANSI转化成UNICODE
LPWSTR ANSITOUNICODE(const char* pBuf)
{
int lenA = lstrlenA(pBuf);
int lenW=0;
LPWSTR lpszFile;
lenW = MultiByteToWideChar(CP_ACP,0,pBuf,lenA,0,0);
if(lenW > 0)
{
lpszFile = SysAllocStringLen(0,lenW); //申请一个指定字符长度的 BSTR 指针,并初始化为一个字符串
MultiByteToWideChar(CP_ACP,0,pBuf,lenA,lpszFile,lenW); //
}
return lpszFile;
}
typedef BOOL (WINAPI * MINIDUMP_WRITE_DUMP)(
IN HANDLE hProcess,
IN DWORD ProcessId,
IN HANDLE hFile,
IN MINIDUMP_TYPE DumpType,
IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL
IN PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL
IN PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL
);
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
// 创建Dump文件
HANDLE hDumpFile = CreateFile(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;
MINIDUMP_WRITE_DUMP MiniDumpWriteDump_;
HMODULE hDbgHelp = LoadLibrary(ANSITOUNICODE("DBGHELP.DLL"));
MiniDumpWriteDump_ = (MINIDUMP_WRITE_DUMP)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
MiniDumpWriteDump_(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
// 处理Unhandled Exception的回调函数
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
QDir temp;
QString errorPath;
bool exist = temp.exists(QCoreApplication::applicationDirPath()+"/Log");
if(!exist)
{
bool ok = temp.mkdir(QCoreApplication::applicationDirPath()+"/Log");
if(!ok) //失败 放在执行路径下
errorPath = QCoreApplication::applicationDirPath()+QString("/%1崩溃日志.dmp").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh.mm.ss"));
}
errorPath = QCoreApplication::applicationDirPath()+QString("/Log/%1崩溃日志.dmp").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh.mm.ss"));
// 这里弹出一个错误对话框并退出程序
CreateDumpFile(ANSITOUNICODE(errorPath.toStdString().c_str()), pException);
FatalAppExit(-1, ANSITOUNICODE("*** 未知 错误! ***"));
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char *argv[])
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
QApplication a(argc, argv);
TestWidget w;
w.showMaximized();
return a.exec();
}

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

方法二: 修改注册表

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

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

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

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

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

在他下面创建一个项,名字为你要检测的程序名。
此项中需要4个值配置
值:DumpFolder, 类型:REG_EXPAND_SZ - 就是存储dump的位置
值:DumpCount, 类型:REG_DWORD - 最大保留的dump个数,默认为10.
值:DumpType, 类型:REG_DWORD - Dump类型,0:Custom dump, 1: Mini dump, 2: Full dump. 默认值为1
值:CustomDumpFlags, 类型:REG_DWORD - 没怎么用。
启动Windows Error Reporting Server服务
服务启动后如果相应程序出现了崩溃的情况,WER就会自动将Crash Dump保存到指定的目录
注意:
(1)Windows Error Reporting Server服务每当触发一次dump,就会变成非启动状态,因此在设置此服务时,应当设置启动类型为自动。
(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. Swift3.0-字符串和字符

    一.简介 Swift中的字符串和字符与OC中在表示上并无大的区别,考虑到字符串在平时的开发工作中属于频繁使用的类型,重点需要掌握的内容是String各种操作函数的写法. 二.Swift与OC的区别 三 ...

  2. VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.

    方案一: sudo vim /etc/sysctl.conf 增加下面内容(环境变量) fs.inotify.max_user_watches = 1638400 fs.inotify.max_use ...

  3. .NET精彩博文

    vs2019安装和使用教程(详细) 为什么选择.NETCore? C#中Socket的简单使用

  4. SpringBoot Controller找不到视图路径

    在启动类加注解@ComponentScan("com.controller")即可,括号里表示Controller所在包名. 参考:https://blog.csdn.net/ji ...

  5. Windows驱动开发-DPC定时器

    DCP是一种使用更加灵活的定时器,可以对任意间隔时间进行定时.DPC定时器的内部使用了一个定时器对象KTIMER,当你设定了定时器之后,从设定开始起经过这个时间之后操作系统会将一个DPC定时器的例程插 ...

  6. 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数

    Scala高级特性 1.    课程目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  7. Dam-list

    1. Dam 2. 溃坝 3. 水坝对环境的影响 4. 水坝列表 4.1 黄河干流水电站列表 4.2 长江干流水电站列表 4.3 长江水系支流 431. 大渡河 432. 乌江 433. 雅砻江 43 ...

  8. Python语法速查: 20. 线程与并发

    返回目录 本篇索引 (1)线程基本概念 (2)threading模块 (3)线程间同步原语资源 (4)queue (1)线程基本概念 当应用程序需要并发执行多个任务时,可以使用线程.多个线程(thre ...

  9. 普通用户切换不到root用户--权限更改

    https://blog.csdn.net/lianjoke0/article/details/82598149 [root@java133 ~]# ll /etc/passwd -rw-r--r-- ...

  10. MySQL帮助文档的使用

    帮助文档使用 在 MySQL 使用过程中,可能经常会遇到以下问题: 某个操作语法忘记了,需要快速查找. 当前版本上,某个字段类型我们想快速知道它的取值范围? 当前版本上,都支持哪些函数?希望有例子能快 ...