VS2008调试dump文件

2023-11-12

让程序在崩溃时体面的退出之Dump文件 .

在我的那篇《让程序在崩溃时体面的退出之CallStack》中提供了一个在程序崩溃时得到CallStack的方法。可是要想得到CallStack,必须有pdb文件的支持。但是一般情况下,发布出去的程序都是Release版本的,都不会附带pdb文件。那么我们怎么能在程序崩溃的时候找到出错的具体位置呢?这个时候就该Dump文件出场了!Dump文件是进程的内存镜像,可以把程序运行时的状态完整的保存下来
        要想在程序崩溃的时候创建Dump文件,就需要用到DbgHelp.dll中Windows API的MiniDumpWriteDump()函数。该函数声明如下:

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
);
具体的参数和返回值的解释可以查找MSDN,有很详细的说明。下面依然用上一篇文章中的例子代码来说明怎么在程序崩溃的时候创建Dump文件。  

// 处理Unhandled Exception的回调函数
//
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{ 
	// 这里弹出一个错误对话框并退出程序
	//
	FatalAppExit(-1,  _T("*** Unhandled Exception! ***"));

	return EXCEPTION_EXECUTE_HANDLER;
}

// 一个有函数调用的类
// 
class CrashTest
{
public:
	void Test() 
	{ 
	Crash(); 
	}

private:
	void Crash() 
	{ 
	// 除零,人为的使程序崩溃
	//
	int i = 13;
	int j = 0;
	int m = i / j;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	// 设置处理Unhandled Exception的回调函数
	// 
	SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);

	CrashTest test;
	test.Test();

	return 0;
}

 上面的程序运行后会调用以下提示框:

 

在上面的程序崩溃的时候,会调用函数ApplicationCrashHandler()。创建Dump文件的代码就需要添加到该函数中。下面就是一个创建Dump文件的函数。

// 创建Dump文件
// 
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
	// 创建Dump文件
	//
	HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

	// Dump信息
	//
	MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
	dumpInfo.ExceptionPointers = pException;
	dumpInfo.ThreadId = GetCurrentThreadId();
	dumpInfo.ClientPointers = TRUE;

	// 写入Dump文件内容
	//
	MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);

	CloseHandle(hDumpFile);
}

  在上面的程序崩溃的时候,会调用函数ApplicationCrashHandler()。创建Dump文件的代码就需要添加到该函数中。下面就是一个创建Dump文件的函数。

// 创建Dump文件
// 
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
	// 创建Dump文件
	//
	HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

	// Dump信息
	//
	MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
	dumpInfo.ExceptionPointers = pException;
	dumpInfo.ThreadId = GetCurrentThreadId();
	dumpInfo.ClientPointers = TRUE;

	// 写入Dump文件内容
	//
	MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);

	CloseHandle(hDumpFile);
}

  在函数ApplicationCrashHandler()用类似下面的代码来调用上面的函数,就可以在程序崩溃的时候创建Dump文件。

1.CreateDumpFile(_T("C:\\Test.dmp"), pException); 

        下面简单说一下Dump文件的用法。将Dump文件拷贝到含有应用程序和对应的pdb文件的目录,在VS里面打开Dump文件(或者直接双击Dump文件),VS会自动创建一个Solution,直接调试运行,代码就会停到使程序崩溃的那一行上。就跟在VS里面调试代码一摸一样。(VS2008)



        在VS2010里打开Dump文件,会显示一个Minidump File Summary,并且可以进行下面图中的操作。








用vs2008分析dump文件

注意:此方法要求代码与.pdb文件严格对应,严格加载不了PDB文件。(如果代码重新从SVN上下来,由于时间CUO变化,所以不能调试)。

它可以解决以下问题:

Debug时不出错,但直接运行就出错的情况。


  1. 双击minidump文件(*.dmp)。默认会启动vs2008。
  2. 菜单Tools/Options, Debugging/Symbols,增加PDB文件路径。注:如果minidump文件与pdb文件在同一目录,就不用设置这个了。
  3. 若调试的程序需要微软基础库的PDB信息,可以增加一个路径为:
  4. http://msdl.microsoft.com/download/symbols
  5. 在界面下方Cache Symbol From symbol…选择本地存储这些Symbols的路径。 注:如果本地已存储过微软基础库的pdb,就直接按照此步操作设置本地路径,不必执行上一步操作了。
  6. 设置代码路径:

设置代码路径:

刚打开的dmp工程,进入解决方案的属性。在这里输入源程序的代码路径。注:一定是sln所在的路径,而不是vcproj的路径!



按F5,debug吧。

 

//

PS:或者可以这样加载符号路径,如果没有加载本应用程序的符号表,可以在加载模块里面修改符号表的路径.(也是弹出菜单Tools/Options, Debugging/Symbols)






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS2008调试dump文件 的相关文章

  • Codeforces ZeptoLab Code Rush 2015

    Codeforces ZeptoLab Code Rush 2015 比赛链接 http codeforces com contest 526 A King of Thieves time limit per test 1 second m
  • python不能创建字典的是_python字典key不能是可以是啥类型

    python中字典的key不能是可变类型 字典可存储任意类型对象 其中值可以取任何数据类型 但键必须是不可变的 如字符串 数字或元组 语法格式 d key1 value1 key2 value2 字典是另一种可变容器模型 且可存储任意类型对
  • c++的类与对象(下)

    1 初始化列表 在创建对象时 编译器通过调用构造函数 给对象中各个成员变量一个合适的初始值 构造函数体中的语句只能将其称作为赋初值 而不能称作初始化 因为初始化只能初始化一次 初始化的本质就是只能初始化一次 而构造函数体内可以多次赋值 以一
  • 漫话算法[二分查找]:不用背你也能写出漂亮的二分查找框架并秒杀至少5道题!

    快来和叮当学习算法吧 B站同步更新 同步到开源项目Github传送门 Easy Programming及微信公众号 CVBear 项目内含Leetcode五杀刷题指南 致力于通过5个问题带你入门掌握算法套路 漫话算法 二分查找 算法模板 一
  • VT系列二:检测是否支持虚拟化

    本文只是学习此视频后的一些总结 不当之处还请指出 视频作者 小宝来了 视频连接 http bbs pediy com showthread php t 211973 约定 本文中出现的名词 虚拟机 客户机 GUEST 都是被监控的操作系统或
  • Python第一课:print()函数、变量与赋值

    Python第一课 print 函数 变量与赋值 所有的符号输入 必须是英文状态 一 print 函数的用法 单刀赴会 不带引号 数据 黄袍加身 单引号 双引号 三引号 单引号与双引号效果一致 当括号内有的语句有单引号或双引号时 三引号可以
  • 初级1 题目一 时间复杂度及示例

    1 什么是时间复杂度 常数时间的操作 一个操作如果和数据量没有关系 每次都是固定时间内完成的操作 叫做常数操作 一个算法流程中 常数操作数量的指标 就是常数操作在算法里总共有多少次 称为时间复杂度 常用O 读作big O 来表示 具体来说
  • 如何选择一款趁手的光纤测试仪

    光纤测试仪是一种用于物理学 电子与通信技术领域的物理性能测试仪器 于1996年11月1日启用 常用光纤测试表有 光功率计 光万用表 稳定光源 光时域反射仪 OTDR 和光故障定位仪 如何选择合适的光纤测试仪 选择光纤测试仪表 一般需考虑以下

随机推荐

  • 虚拟化原理以及应用(8)课堂笔记-第三章KVM的概述第四章-课堂笔记-virt-manager默认方式创建虚拟机(1)

    一 KVM的概念 重点 KVM关键词 1 基于Linux内核的全虚拟化解决方案 运行在支持硬件虚拟化功能的X86平台 Intel VT 或AMD V 基于LINUX内核的全虚拟化的解决方案 运行在支持硬件虚拟化功能的x86平台 intel
  • RNN(循环神经网络)

    文章目录 RNN概述 RNN模型 RNN前向传播算法 RNN反向传播算法推导 RNN小结 DNN的特例CNN的模型和前向反向传播算法 这些算法都是前向反馈的 模型的输出和模型本身没有关联关系 今天我们就讨论另一类输出和模型间有反馈的神经网络
  • Vue.config.productionTip = false 是什麽意思

    阻止启动生产消息 常用作指令 阻止启动生产消息 這又是什麽意思 看下效果 Vue config productionTip false Vue config productionTip true 感覺多了一行信息
  • python3(二)Numpy

    这两个库都是基于C语言的 所以这两个库的计算速度相比python的list或dict来说很快 pandas又是基于numpy的库 相当于numpy的升级版本 并且用到了矩阵的计算 计算速度相比利用单个数据或字典 列表来说 快很多 1 基本
  • CAD+开发小结+交互+选择集+深度拷贝AcDbObjectId中指向的实体集+读取其他DWG文件

    深度拷贝将数组中的实体ID指向的实体拷贝至blockId为ID的块中 AcDbIdMapping adimIdMap AcApDocument pDoc acDocManager gt curDocument acDocManager gt
  • 【Kubernetes部署篇】Kubeadm方式搭建K8s集群 1.27.0版本

    文章目录 一 集群规划及架构 二 系统初始化准备 所有节点同步操作 三 安装并配置cri dockerd插件 四 安装kubeadm 所有节点同步操作 五 初始化集群 六 Node节点添加到集群 七 安装网络组件Calico 八 测试Cor
  • sqli labs less 25

    按照常规输入id 1 提示报错信息如下 一个很常见的报错 可以看出是单引号闭合的语句 输入 id 1 or 1 报出的错误信息不明显 加入一个括号进行试探能不能报出更多的语句错误 输入 id 1 or 1 从上图看出来or 被屏蔽了 经过更
  • ubuntu搭建android编译环境

    本文来自linux与嵌入式技术Q群52240781 ubuntu12 04 14 04安装后搭建android编译环境 注安装的是64位ubuntu系统12 04或14 04 请安装ubuntu的LTS版即12 04或14 04 每2年发布
  • 87_BigDecimal的doubleValue()、toString()、toPlainString()与科学计数法

    主题 BigDecimal toPlainString 可以避免出现科学计数法格式的数据 项目上面有个小伙伴在用Bigdecimal进行数值计算时 用return num doubleValue 的方式将结果送到前台 测试数值较小时无问题
  • 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

    报错如下 检查npm目录下是否还有node exe文件如果没有复制过来 我复制过来问题解决 首先我是node和npm版本和项目版本不适应 需要更换版本 所以重新安装node js在重新安装的过程中将安装的位置改变了 所以造成了这个可能
  • DSS简介

    原文链接 去中心化软件服务 DSS 是一个基于CCR的轻量级 net运行时环境 DSS提供了一个轻量级的 状态导向的服务模型 它将REST概念和构造高性能高扩展性应用的系统级方法结合在一起 在DSS中服务被暴露为一种可以被程序和UI操作界面
  • 将 Tocmat5.0 注册为 Windows 的服务程序

    将 Tocmat5 0 注册为 Windows 的服务程序 步骤 1 下载 Tomcat 5 0 x 不要下载安装版本 2 解压到 TOMCAT HOME 3 安装或者从别处拷贝JRE 推荐拷贝 可以删除不需要的文件 如文档等 4 在 TO
  • Qt编译MySQL数据库驱动

    文章目录 一 我的编译环境 二 需要 三 Qt的下载 四 编译驱动 主题 4 1 第一步打开msql pro 4 2 第二步 4 3 第三步 4 4 第四步 4 5 第五步 编译 最后一步 一 我的编译环境 Qt 5 14 2 mingw7
  • 大模型时代,企业如何重构 AI 应用落地范式?

    近一年来 生成式人工智能 AIGC 技术的快速发展和各种大模型的涌现 引发了全球范围内对于通用人工智能 AGI 时代是否即将到来的讨论 在 AIGC 大模型公共服务逐渐被大众辩证地接受后 如何用 AIGC 技术重塑企业智能服务成为一个深水区
  • 使用Jmeter进行http接口做功能、性能测试

    使用Jmeter进行http接口做功能 性能测试 1 使用Jmeter进行http接口做功能 性能测试 在测试移动APP时 会有很多接口需要做测试 我在这里介绍一下对HTTP接口做功能 性能的测试 首先我们会从开发人员拿到接口数据 1 1
  • 苹果IOS开发者账号总结

    详细地址 https developer apple com programs which program 个人账号 Individual 费用99美金一年 该账号在App Store销售者只能显示个人的ID 比如zhitian zhang
  • Linux 查看进程消耗内存情况总结

    在Linux中 有很多命令或工具查看内存使用情况 今天我们来看看如何查看进程消耗 占用的内存情况 Linux的内存管理和相关概念要比Windows复杂一些 在此之前 我们需要了解一下Linux系统下面有关内存的专用名词和专业术语概念 物理内
  • LeetCode之最长公共子序列问题LCS解决方法

    Leetcode官网解答 使用动态规划原理 请参考原文地址 https leetcode cn com problems longest common subsequence solution zui chang gong gong zi
  • Python机器学习--算法实现--常用算法在Sklearn中的回归算法关键参数详解

    常用算法在Sklearn中的关键参数详解 回归算法 线性回归算法 from sklearn linear model import LinearRegression LinearRegression fit intercept True n
  • VS2008调试dump文件

    让程序在崩溃时体面的退出之Dump文件 在我的那篇 让程序在崩溃时体面的退出之CallStack 中提供了一个在程序崩溃时得到CallStack的方法 可是要想得到CallStack 必须有pdb文件的支持 但是一般情况下 发布出去的程序都