前言:通过drwtsn32、NTSD、CDB等调试工具生成Dump文件,drwtsn32存在的缺点虽然NTSD、CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD、CDB等调试工具。了解了mini dump文件格式后,完全可以程序自动生成Dump文件。

本文主要讨论以下内容:

1、运行原理

2、程序修改

3、注意事项

一、运行原理

当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。MSDN中描述为:

Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。

二、程序修改

1、重载<< 操作符。(本步可以不实现)

std::ostream&operator<

{

returnos <

<

<

<

<

}

2、实现UnhandledExceptionFilter

#include"minidmp.h"

LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)

{

CreateMiniDump(pExceptionInfo, L"Exception.dmp");

std::cerr <ExceptionRecord) << std::endl;

exit(pExceptionInfo->ExceptionRecord->ExceptionCode);

returnEXCEPTION_EXECUTE_HANDLER;//程序停止运行

}

3、在异常发生之前调用SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);

通常在Main()函数开始时调用即可。

4、CreateMiniDump()函数在minidmp.h头文件中定义,文件如下:

#pragmaonce

#include

#include

#include

#pragmacomment(lib,"dbghelp.lib")

inlineBOOL IsDataSectionNeeded(constWCHAR* pModuleName)

{

if(pModuleName == 0)

{

returnFALSE;

}

WCHAR szFileName[_MAX_FNAME] = L"";

_wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);

if(wcsicmp(szFileName, L"ntdll") == 0)

returnTRUE;

returnFALSE;

}

inlineBOOL CALLBACK MiniDumpCallback(PVOIDpParam,

constPMINIDUMP_CALLBACK_INPUTpInput,

PMINIDUMP_CALLBACK_OUTPUTpOutput)

{

if(pInput == 0 || pOutput == 0)

returnFALSE;

switch(pInput->CallbackType)

{

caseModuleCallback:

if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg)

if(!IsDataSectionNeeded(pInput->Module.FullPath))

pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);

caseIncludeModuleCallback:

caseIncludeThreadCallback:

caseThreadCallback:

caseThreadExCallback:

returnTRUE;

default:;

}

returnFALSE;

}

inlinevoidCreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)

{

HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,

0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))

{

MINIDUMP_EXCEPTION_INFORMATION mdei;

mdei.ThreadId= GetCurrentThreadId();

mdei.ExceptionPointers= pep;

mdei.ClientPointers= FALSE;

MINIDUMP_CALLBACK_INFORMATION mci;

mci.CallbackRoutine= (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;

mci.CallbackParam= 0;

MINIDUMP_TYPE mdt= (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |

MiniDumpWithDataSegs |

MiniDumpWithHandleData |

0x00000800/*MiniDumpWithFullMemoryInfo*/|

0x00001000/*MiniDumpWithThreadInfo*/|

MiniDumpWithUnloadedModules);

MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),

hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);

CloseHandle(hFile);

}

}

三、注意事项

1、可执行文件(exe)必须找到dbghelp.dll,才能生成Dump文件。这个DLL可以从调试工具包中找到。

2、当异常代码定位成功以后,如果无法阻止异常的产生,可以用__try 结构包装异常代码,__try 和try 不同,前者可以捕获非法指针产生的异常。

__try {

// 会异常的函数

}

__except( EXCEPTION_EXECUTE_HANDLER ){

// 异常处理

}

参考文档:

java 生成dump文件_程序自动生成Dump文件相关推荐

  1. java 自动生成mybatis文件_如何自动生成Mybatis的Mapper文件详解

    前言 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,mybatis官方也发现了这个问题,因此给我 ...

  2. android getter不起作用,java - 如何在Android Studio中自动生成getter和setter

    java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...

  3. Java支持latex,基于Java和LaTeX的文档自动生成技术研究

    基于Java和 LaTeX 的文档 自动生成技术研究 ◆尚宝欣 徐 屹 (东北电力大学理学院,吉林 长春 132012) [摘 要]讨论了结合Java与LaTex 自动生成 PDF文档的方法.针 展名 ...

  4. SpringBoot如何自动生成实体类和Dao层以及映射文件(mybatis generator 自动生成代码)

    一.首先添加自动生成代码插件 <!-- mybatis generator 自动生成代码插件 生成时解除注释 --><plugin><groupId>org.myb ...

  5. DELMIA软件弧焊仿真:以工件边缘曲线为焊缝的机器人程序自动生成

    目录 功能介绍 弧焊焊接焊点坐标创建 弧焊焊点坐标姿态批量调整 机器人弧焊焊接程序自动生成 弧焊焊接机器人仿真运行 本文已经首发在个人微信公众号:工业机器人仿真与编程(微信号:IndRobSim),欢 ...

  6. 痞子衡嵌入式:MCUXpresso IDE下工程链接文件配置管理与自动生成机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下工程链接文件配置管理与自动生成机制. 痞子衡在 2018 年初写过一个专题 <嵌入式开发文件系列&g ...

  7. 额,你在main.xml中加了一个id以后,要右键点save,才会将这个id加入到R中,否则是没有的。。。R里的东西是程序自动生成的~~~...

    我修改了 main.xml 然后我在主函数中调用main里面的东西 例如在main.xml加了一个id 我在主函数用 R.id老是调用不出来 如何才能快速的准确的调用出 main.xml里面的东西呢? ...

  8. MyEclipse中流程定义文件保存时自动生成流程图

    前提:MyEclipse已安装Activiti插件 第一步:打开菜单Windows->Preferences 第二步:选择Activiti->Save 第三步:勾选Create proce ...

  9. 解决VScode在保存less文件时,自动生成对应的css文件以及安装Easy less之后,计算式子不显示结果的问题

    解决VScode在保存less文件时,自动生成对应的css文件以及安装Easy less之后,计算式子不显示结果的问题 一.解决VScode在保存less文件时,自动生成对应的css文件的问题 下载安 ...

最新文章

  1. poj2240(Bellman-ford)
  2. 2d的公式_钢筋下料计算公式分享,助你提高施工效率!
  3. SAP WM 采购订单收货后LT06报错-No bin types have been assigned to storage unit type IP-
  4. 中国移动宽带业务怎么样?和电信的比有什么不同?
  5. tengine 调用php,nginx 或tengine 访问日志分割处理
  6. 多行匹配.+表示分组的错误
  7. Chrome常用快捷键整理汇总
  8. spring不自动下载_Spring:自动接线或不自动接线
  9. c语言self用法,C/C++知识点之Self Numbers C语言 UVA640
  10. 在Eclipse中调试Maven项目
  11. Java Servlet 使用slf4j配置log4j
  12. 获取小程序 openid
  13. 安装RabbitMq启动运行出现服务无法启动 发生系统错误1067解决方案
  14. 传智播客视频python视频爬虫
  15. Linux 文本去重——uniq
  16. 服务器硬盘开机吱吱响,开机时硬盘吱吱响的原因
  17. L4RE学习笔记——服务介绍
  18. 未来已来!域乎“区块链+产业应用赋能精英论坛”成功举办
  19. 无法连接GitHub完整解决方案
  20. 【戏言、昔言、惜言】谭惜言写了一辈子的戏,真情假意,全在戏言里。

热门文章

  1. 缓冲(buffer)和缓存(cache)区别
  2. Numpy线性代数-numpy.inner()
  3. 陈景润“1+2”定理与黎曼“1/2”猜想
  4. STM32 GPIO 寄存器配置
  5. 改变es的text的type为keyword
  6. linux recv返回值,recv recvfrom
  7. C++动态数组的简易实现
  8. 本地缓存天花板-Caffeine
  9. 知识付费的下一个风口究竟在哪里?
  10. Android内存管理机制官方详解文档