自定义VS程序异常处理及调试Dump文件(一)
自定义VS程序异常处理及调试Dump文件(一)
1. Dump文件
1. Dump文件介绍
Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀。dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件。dump文件根据存储时的选项不同,会生成不同大小的文件,其中记录信息也自然有所不同。
2. Dump文件分类
程序分两种,内核模式程序和用户模式程序,也即Ring0程序和Ring3程序。Dump文件是伴随着程序而生成的,所以Dump文件也同样分两种。
- Kernel-Mode Dump Files(内核模式Dump文件),主要是驱动程序,此文不涉及。
User-Mode Dump Files(用户模式Dump文件),主要是应用程序及服务程序,此文所讲。
用户模式Dump文件又分Full User-Mode Dumps和Minidumps。前者生成的是完整的内存快照,所以文件比较大。后者依然生成选项,生成包含不同信息的Dump文件。此文以Minidumps文件来分析调试。3. Dump文件生成方式
- 通过WinDbg工具的命令
用WinDbg来Attach崩溃提示窗口的process,然后输入.dump /m C:\myapp.dmp命令,即可生成默认的miniDump文件(只包含系统信息、加载的模块(DLL)信息、 进程信息和线程信息)。 - 通过Windows任务管理器,选择指定进程,右键生成转储文件(此时的转储文件即为Full User-Mode Dumps,包含所有信息,所以文件比较大)。
通过代码在程序崩溃时生成Dump文件。
```CPPinclude
pragma comment(lib, "Dbghelp.lib")
// 此函数需要包含上面头文件和引入相应的库
LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* _pExcp)
{
HANDLE hFile = CreateFile(
"d:\Format.dmp",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return EXCEPTION_CONTINUE_EXECUTION;
}MINIDUMP_EXCEPTION_INFORMATION einfo = {0};
einfo.ThreadId = ::GetCurrentThreadId();
einfo.ExceptionPointers = _pExcp;
einfo.ClientPointers = FALSE;MiniDumpWriteDump(GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MiniDumpNormal, // 指定生成默认的Minidump文件
&einfo,
NULL,
NULL);
CloseHandle(hFile);return EXCEPTION_EXECUTE_HANDLER;
}
// 下面函数放在当前模块的入口函数处,指定ExceptionFilter替换原生的异常处理
// 即当原本要弹出崩溃提示窗口前,需要经过此函数处理,可以处理完立即退出,也可以继续
SetUnhandledExceptionFilter(ExceptionFilter);
``## 2. 分析Dump文件 ###1. 使用Visual Studio - 选择与生成Dump文件相同版本的VS。 - 启动VS并打开Dump文件。 - 必须保证生成Dump文件的程序的PDB文件和源代码相一致。 - VS2005打开Dump文件时,直接按F5调试,代码会停在出错的地方,通过Call Stack窗口查看。 - VS2010打开Dump文件时, ![Dump][1] 需要通过Set symbol paths设置符号文件路径,也即PDB文件路径。然后点击Debug with Native Only,代码即会暂时在出错的地方,通过Call Stack窗口查看相关信息。 ###2. 使用WinDbg - 选择相应版本的WinDbg,x86还是AMD64(也即X64,因为64桌面架构系统是AMD最新发布)。 - File->Open Crush Dump,打开指定的Dump文件。 - File->Symbol File Path,添加srvD:\Symbolshttp://msdl.microsoft.com/download/symbols- File->Symbol File Path,添加程序的PDB文件夹路径。这样可以调试系统DLL,也可以调试自有程序。 - 然后在WinDbg命令行中输入!analyze -v,等待WinDbg分析完毕。 - ![WinDbg][2] - 通过上图,即可以看到代码崩溃的行数。 ##3. 自定义崩溃窗口 1. 通常Windows会提供一个默认的崩溃提示窗口,或者是程序直接闪退。 ![此处输入图片的描述][3] 2. 重写ExceptionFilter函数,即可以重新定义崩溃窗口,用以提示用户发送相关信息给软件提供商。 ![此处输入图片的描述][4] 3. 示例代码 示例代码是Win32类型的DLL,导出接口SetCustomUnhandledExceptionFilter`在Solution的启动Project的最开始调用一次即可。
下载
自定义VS程序异常处理及调试Dump文件(一)的更多相关文章
- 使用VS2012调试Dump文件
前一节我讲了怎么设置C++崩溃时生成Dump文件 , 点击 传送门 , 这一节我讲讲怎么使用 VS2012 调试生成的 Dump 文件 , 甚至可以精确到出错的那一行代码上面 ; 1. 生成 Dump ...
- (转)解决WinDbg调试Dump文件不同环境mscordacwks.dll版本问题
解决WinDbg调试Dump文件不同环境mscordacwks.dll版本问题 开发人员提交一个dump文件(Windows Server 2008 R2),当前调试环境Windows Serve ...
- 调试dump文件
1.设置好pdb文件和源代码路径 为了能正确分析Dump文件,我们必须要指定和程序一起出来的PDB文件,如果程序重新被编译了一次,即使代码没有任何变化,之前的PDB文件我们不能再继续使用.
- C++ 程序崩溃时生成Dump文件
#include <DbgHelp.h> //生产DUMP文件 int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExcept ...
- 使用VS调试DUMP文件
使用前准备: 1.保存编译文件的PDB文件(要和生成exe文件的对应) 2.在开发机器上,使用vs直接双击打开dmp文件,注意 进程名称 ,这个是程序运行crash的时候所在的目录位置,这个很重要. ...
- Qt 使用 Google Breakpad 捕获程序崩溃报告(dump文件) good
http://blog.csdn.net/GoForwardToStep/article/details/56685810
- 如何使用dump文件进行调试
转载[文尾出处链接] 1 简介第一次遇到程序崩溃的问题,之前为单位开发了一个插件程序,在本机运行没有出现问题,但把生成的可执行文件拷贝到服务器上一运行程序,刚进入插件代码,插件服务就崩溃了,当时被这个 ...
- WinDbg抓取程序报错dump文件的方法
程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...
- dotnet core调试docker下生成的dump文件
最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...
随机推荐
- Heartbeat高可用解决方案
Heartbeat高可用 Heartbeat作用: 通过heartbeat,可以将资源(ip以及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务 ...
- 读《深入理解Java虚拟机》
Java虚拟机运行时数据区 对象的创建 Java创建对象,在语言层面上使用new关键字.虚拟机遇到new关键字时,会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的 ...
- python基础入门教程《python入门经典》
第一章 在python中使用数字 1.用变量存储信息 1.1变量的类型 变量,用于存储很多不同的数据类型的信息. 基本数据类型 数据类型 存储内容 示例 integer 整 float 浮点 ...
- TeamViewer——可以实现在手机上随时远程控制你的电脑
小编今天给大家推荐一款强大的远程控制软件——TeamViewer,可以让你的手机连接你自己的电脑,不管你身处何处,只要电脑和手机都能联网,那么你就可以在手机上控制你的电脑了.以下介绍下如何安装和使用方 ...
- SHELL命令集锦
1.定时任务crond使用. crontab -e -u www文件编辑保存在/var/spool/cron/www文件中. 参考示例: */1 * * * * /usr/local/php/bin/ ...
- Bash环境配置文件
一.环境配置文件读取优先级 其中~/.bash_profile,~/.bash_login,~/.profile三个文件只有一个有效,查找优先级从左至右降低.bash会一直检查是否有~/.bashrc ...
- Redis可视化工具Redis Desktop Manager使用
Redis可视化工具,RedisDesktopManager 没错,它开源的,托管在github上:https://github.com/uglide/RedisDesktopManager 还不错, ...
- git 知识点汇总
git commit git commit 命令执行后, git 主要执行了三个操作: 为每一个文件生成一个快照 每一个文件其实是真的数据, 所以 git 会把整个文件内容转成二进制, 然后经过压缩直 ...
- python 标准库 -- configparser
configparser 用于处理 ini 格式的配置文件, 其本质上是利用 open 来操作文件. 示例文件 : [zhangsan] name = zhangsan age = 12 job = ...
- Python 内置函数汇总
循环设计与循环对象 range() enumerate() zip() iter() 函数对象 map() filter() reduce() 序列操作 all([True, 1, "hel ...