[Windows编程] 如何捕捉程序异常/crash 并生成 dump 文件
#include <dbghelp.h>
#include <shellapi.h>
#include <shlobj.h>
// 自定义的exectpion filter
LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionPointers)
{
SetErrorMode( SEM_NOGPFAULTERRORBOX );
//收集信息
CStringW strBuild;
strBuild.Format(L"Build: %s %s", __DATE__, __TIME__);
CStringW strError;
HMODULE hModule;
WCHAR szModuleName[MAX_PATH] = L"";
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)pExceptionPointers->ExceptionRecord->ExceptionAddress, &hModule);
GetModuleFileName(hModule, szModuleName, ARRAYSIZE(szModuleName));
strError.AppenedFormat(L"%s %d , %d ,%d.", szModuleName,pExceptionPointers->ExceptionRecord->ExceptionCode, pExceptionPointers->ExceptionRecord->ExceptionFlags, pExceptionPointers->ExceptionRecord->ExceptionAddress);
//生成 mini crash dump
BOOL bMiniDumpSuccessful;
WCHAR szPath[MAX_PATH];
WCHAR szFileName[MAX_PATH];
WCHAR* szAppName = L"AppName";
WCHAR* szVersion = L"v1.0";
DWORD dwBufferSize = MAX_PATH;
HANDLE hDumpFile;
SYSTEMTIME stLocalTime;
MINIDUMP_EXCEPTION_INFORMATION ExpParam;
GetLocalTime( &stLocalTime );
GetTempPath( dwBufferSize, szPath );
StringCchPrintf( szFileName, MAX_PATH, L"%s%s", szPath, szAppName );
CreateDirectory( szFileName, NULL );
StringCchPrintf( 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 = CreateFile(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 = MiniDumpNormal
| MiniDumpWithHandleData
| MiniDumpWithUnloadedModules
| MiniDumpWithIndirectlyReferencedMemory
| MiniDumpScanMemory
| MiniDumpWithProcessThreadData
| MiniDumpWithThreadInfo;
bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);
// 上传mini dump 到自己服务器(略)
...
return EXCEPTION_CONTINUE_SEARCH; //或者 EXCEPTION_EXECUTE_HANDLER 关闭程序
}
int _tmain()
{
// 设置 execption filter
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
....
return 0;
}
转载于:https://blog.51cto.com/wingeek/273979
[Windows编程] 如何捕捉程序异常/crash 并生成 dump 文件相关推荐
- 关于Windows程序崩溃(Crash)以及生成dump文件的探究
文章目录 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 崩溃(Crash)的原因是什么 如何消除崩溃时出现的异常信息对话框 如 ...
- 启动(程序还没执行生成dump文件的代码)就崩溃的处理流程
何志丹 如果有专业人员,利用Windbg启动这个程序,在分析就可以了. 上次崩溃,让大家手忙脚乱.所以列了一个启动(程序还没执行生成dump文件的代码)就崩溃的处理流程. 1,用我写的opendll. ...
- C++:程序运行崩溃后生成dump文件
使用方法基本上是一个固定的模板,在main函数中调用一下就可以 主函数 #include<iostream> #include"dump_lzb.h"int main( ...
- VC++给软件添加异常捕获模块生成dump文件(附源码)
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从 ...
- 安卓软件错误log_Android编程实现捕获程序异常退出时的错误log信息功能详解
本文实例讲述了Android编程实现捕获程序异常退出时的错误log信息功能.分享给大家供大家参考,具体如下: 很多时候我们程序无缘无故的就挂掉了,让我们一头雾水,如果刚好我们在调试,那我们可以通过错误 ...
- Windows下生成dump文件的三种方式
文章目录 前言 一.什么是dump文件? 概述 dump分类 内核模式Dump 用户模式Dump 二.dump生成方式 实现方法 方法一:修改注册表 参数说明 方法二:生动创建转储文件 方法三:通过代 ...
- java 生成dump文件_程序自动生成Dump文件
前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件,drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了m ...
- Windows编程01_应用程序分类,开发工具和库,第一个Windows程序,字符编码
01 Windows应用程序分类 1.应用程序分类 控制台程序Console DOS程序,本身没有窗口,通过Windows DOS窗口执行(借的的操作系统的窗口) 窗口程序 拥有自己的窗口,可以与用户 ...
- Android第二十五课 native程序异常crash 定位
Android程序崩溃退出的时候,会将崩溃的堆栈信息保存在/data/tombstones目录下.该目录需要ROOT权限才能够访问.所以为了访问该路径,手机必须先ROOT破解.jni或者java代码崩 ...
最新文章
- bottle模板 template/jinja2_template
- Comparable与Comparator用法详解
- 19、20_散点图、连接散点图、气泡图、不同颜色的散点图、直方图
- 手动修改Win7开机欢迎界面背景图片
- CODE[VS]-求和-整数处理-天梯青铜
- 80年代出生人坦白十大尴尬事80一代全搜集
- 前端:JS/28/CSS DOM动态样式(style对象,style 对象属性与CSS属性的转换),Event DOM,事件对象简介(DOM和IE中的Event对象),实例:点出满天小星星
- 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架
- Shiro-单点登录原理
- 数据结构与算法分析,哪本数据结构教材比较合适
- 微信公众服务号申请、认证(开通支付)-微信开发图文教程
- 聊一聊Java中的线程中断
- C语言中的void和void指针-void*,及void指针做函数参数。
- 软件开发、设计、架构的五大原则
- 华为云classroom Java练习
- windwos设置GifCam录屏全局快捷键
- 《Dynamic Filter Networks》动态过滤网络
- JavaScript网页设计作业 仿当当书网站 HTML+CSS 学生dreamweaver网页设计作业成品
- 安全防御-----IDS
- 500多条汉字常见错别字题库ACCESS数据库
热门文章
- 【 Vivado 】在工程模式下通过jou文件来学习 Tcl 命令
- JavaScript的使用
- bind、call、apply
- python基础学习-装饰器进阶
- word使用宏命令批量按比例设置图片大小
- 搜索4--noi6264:走出迷宫
- 【Ajax技术】使用XHR对象发送和接受数据
- 空值排序(oracle/sqlserver)
- c++ 判断nil_golang A=nil,B=A,but B!=nil 这是真的
- 9点到17点半 cron_SpringQuartz定时任务的cron表达式书写