前面介绍如如何用WinDBG 生成crash dump 《WinDBG 技巧:如何生成Dump 文件(.dump 命令) 》,但是用户机器上通常不安装WinDBG, 而且多数用户也不知道怎么使用WinDBG。 所以最好是自己程序里面能够捕捉exception/crash,并且生成crash dump,然后通过网络传回到自己服务器。
捕捉exception 可以用API 函数 SetUnhandledExceptionFilter 。生成crash dump 可以用DbgHelp.dll 里面的MiniDumpWriteDump 函数。
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( __in LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter );
BOOL WINAPI MiniDumpWriteDump( __in HANDLE hProcess, __in DWORD ProcessId, __in HANDLE hFile, __in MINIDUMP_TYPE DumpType, __in PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, __in PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, __in PMINIDUMP_CALLBACK_INFORMATION CallbackParam );
代码示例:
view plaincopy to clipboardprint?
#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 文件相关推荐

  1. 关于Windows程序崩溃(Crash)以及生成dump文件的探究

    文章目录 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 崩溃(Crash)的原因是什么 如何消除崩溃时出现的异常信息对话框 如 ...

  2. 启动(程序还没执行生成dump文件的代码)就崩溃的处理流程

    何志丹 如果有专业人员,利用Windbg启动这个程序,在分析就可以了. 上次崩溃,让大家手忙脚乱.所以列了一个启动(程序还没执行生成dump文件的代码)就崩溃的处理流程. 1,用我写的opendll. ...

  3. C++:程序运行崩溃后生成dump文件

    使用方法基本上是一个固定的模板,在main函数中调用一下就可以 主函数 #include<iostream> #include"dump_lzb.h"int main( ...

  4. VC++给软件添加异常捕获模块生成dump文件(附源码)

    VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从 ...

  5. 安卓软件错误log_Android编程实现捕获程序异常退出时的错误log信息功能详解

    本文实例讲述了Android编程实现捕获程序异常退出时的错误log信息功能.分享给大家供大家参考,具体如下: 很多时候我们程序无缘无故的就挂掉了,让我们一头雾水,如果刚好我们在调试,那我们可以通过错误 ...

  6. Windows下生成dump文件的三种方式

    文章目录 前言 一.什么是dump文件? 概述 dump分类 内核模式Dump 用户模式Dump 二.dump生成方式 实现方法 方法一:修改注册表 参数说明 方法二:生动创建转储文件 方法三:通过代 ...

  7. java 生成dump文件_程序自动生成Dump文件

    前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件,drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了m ...

  8. Windows编程01_应用程序分类,开发工具和库,第一个Windows程序,字符编码

    01 Windows应用程序分类 1.应用程序分类 控制台程序Console DOS程序,本身没有窗口,通过Windows DOS窗口执行(借的的操作系统的窗口) 窗口程序 拥有自己的窗口,可以与用户 ...

  9. Android第二十五课 native程序异常crash 定位

    Android程序崩溃退出的时候,会将崩溃的堆栈信息保存在/data/tombstones目录下.该目录需要ROOT权限才能够访问.所以为了访问该路径,手机必须先ROOT破解.jni或者java代码崩 ...

最新文章

  1. bottle模板 template/jinja2_template
  2. Comparable与Comparator用法详解
  3. 19、20_散点图、连接散点图、气泡图、不同颜色的散点图、直方图
  4. 手动修改Win7开机欢迎界面背景图片
  5. CODE[VS]-求和-整数处理-天梯青铜
  6. 80年代出生人坦白十大尴尬事80一代全搜集
  7. 前端:JS/28/CSS DOM动态样式(style对象,style 对象属性与CSS属性的转换),Event DOM,事件对象简介(DOM和IE中的Event对象),实例:点出满天小星星
  8. 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架
  9. Shiro-单点登录原理
  10. 数据结构与算法分析,哪本数据结构教材比较合适
  11. 微信公众服务号申请、认证(开通支付)-微信开发图文教程
  12. 聊一聊Java中的线程中断
  13. C语言中的void和void指针-void*,及void指针做函数参数。
  14. 软件开发、设计、架构的五大原则
  15. 华为云classroom Java练习
  16. windwos设置GifCam录屏全局快捷键
  17. 《Dynamic Filter Networks》动态过滤网络
  18. JavaScript网页设计作业 仿当当书网站 HTML+CSS 学生dreamweaver网页设计作业成品
  19. 安全防御-----IDS
  20. 500多条汉字常见错别字题库ACCESS数据库

热门文章

  1. 【 Vivado 】在工程模式下通过jou文件来学习 Tcl 命令
  2. JavaScript的使用
  3. bind、call、apply
  4. python基础学习-装饰器进阶
  5. word使用宏命令批量按比例设置图片大小
  6. 搜索4--noi6264:走出迷宫
  7. 【Ajax技术】使用XHR对象发送和接受数据
  8. 空值排序(oracle/sqlserver)
  9. c++ 判断nil_golang A=nil,B=A,but B!=nil 这是真的
  10. 9点到17点半 cron_SpringQuartz定时任务的cron表达式书写