自定义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,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...
随机推荐
-
django _meta方法
models.Book._meta.'concrete_model': <class 'books.models.Book'> models.Book._meta.'related_fke ...
-
(原创)即使最可怕的自然力量,也不失美丽&mdash;&mdash;火山喷发(摄影,欣赏)
文中图片摘自腾讯文化:www.cal.qq.com 1.Abstract 最可怕的力量也潜含着最美丽的风景奇观,虽然不能亲眼目睹,但透过大师的视角,一样也能体会到自然力量撼动的美丽. 2.Co ...
-
VS2013 取消 直接单击文件 然后直接打开
工具——选项——
-
并查集hdu1232
Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省*“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道 ...
-
Android在包名称更改项目
通常时引起包名称的变化R文件错误,有时原因不明Manifest混乱多个文本文件. 所以,我们现在感到最简单方便的包名称变更流程文件,如以下: 如果程序包命名com.pepper.util,我们将更改包 ...
-
HDU 3264 Open-air shopping malls ——(二分+圆交)
纯粹是为了改进牛吃草里的两圆交模板= =. 代码如下: #include <stdio.h> #include <algorithm> #include <string. ...
-
Chrome 浏览器报 filed to load resource:net err cache read failure 错误:
在IE/FF下没有该错误提示,但在Chrome下命令行出现如下错误信息: Failed to load resource: net::ERR_CACHE_MISS 该问题是Chrome浏览器开发工具的 ...
-
HTMLTestRunner测试报告中文乱码问题解决
在学习python selenium自动化测试学习中遇到HTMLTestRunner测试报告出现乱码的问题 Test Group/Test case Count Pass Fail Error Vie ...
-
python-networkx学习(1)
介绍: networkx是python的一个库,它为图的数据结构提供算法.生成器以及画图工具.近日在使用ryu进行最短路径获取,可以通过该库来简化工作量.该库采用函数方式进行调用相应的api,其参数类 ...
-
HDU1754-I Hate It (线段树)
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others ...