利用VS2005进行dump文件调试
前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件。使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置。本文将讨论以下内容:
1、 程序编译选项
2、 利用VS2005 分析dump文件
3、 常见问题讨论
一、 程序编译选项
PDB files contains all debug information like type definition and function prototype. When application crashes, we need the PDB files to analyze the root cause, so make sure these PDB files will be created when building it. You must do the following setting:
C/C++/General/Debug Information Format=Program Database (/Zi).
图1.1 调试信息格式
Linker/Debugging/Generate Program Database File=”Name and location of your PDB files”
图1.2 PDB文件输出路径
PDB文件路径最好设置在同一个文件夹中,这样方便dmp文件调试时调用。
调试时,所有的PDB文件和源文件必须严格匹配(the PDB files should be the one generated by build the source code),并存储在一个安全的位置。当客户报告了一个错误时,你需要这些文件来帮忙以便定位错误于源代码中并解决问题。
二、 VS2005 分析dump文件
In this simple application, there is an unhandled Access Violation Reading exception, because GetNameFromDatabase returns a NULL pointer, and this pointer is passed into IsPrefix and then it’s used directly without NULL pointer checking.
图1.3 演示代码
利用Release模式编译该测试程序,在客户机上运行该程序,将根据NTSD设置生成相对应的DMP格式文件。
可以使用Visual Studio.Net、NTSD或是其他的调试工具对DMP格式文件进行分析。
l Start Visual Studio.Net
Click File/Open Solution and make sure the files of type is *.dmp then click Open.
图1.3 Open Dump File (GUI)
l Set Symbol Path
Click Tools/Options, Debugging/Symbols,增加PDB文件路径。若调试的程序需要微软基础库的PDB信息,可以增加一个路径为:
http://msdl.microsoft.com/download/symbols
在界面下方Cache Symbol From symbol…选择本地存储这些Symbols的路径。
图1.4 Symbol Path
如果DMP文件没有放入本身PDB文件所在目录,也可以在此处增加一个本地目录。点OK后,VS2005将从网络中下载所需要的Symbols,需要等待一段时间。如果是多次调试同一个程序错误所生成的DMP文件,可以在对话框中选择“Search the above locations only when symbols are loaded manually”。从而可以节省网络带宽。
l Set Source code path
Open Solution Property Pages and set the source code path.
图1.5 属性菜单
图1.6 Debug Source Files
l Start to Debug the Dump File
Click the Debug menu, it will ask you to save as a solution, save it. Then it will go to the line which caused the crash of your application.
图1.7 调试窗口,定位到源代码
三、 常见问题讨论
1、 Dump文件放在哪里?
Dump文件不用非要放在你编译出来的位置,你完全可以建立一个新的文件夹来放它。但若不是存放在编译出来的位置,需要将编译生成的PDB文件拷贝到Dump文件目录,或是利用VS2005打开Dump文件后,设置PDB文件路径。参照图1.4。
2、 如何恢复当时的现场?
可能你要问,怎么可能,这个dump文件可是用户发给我的,我不可能去用户家里调试吧?这个恢复现场可不是指的非要到那台机器上去,而是要把产生dump文件对应的二进制文件拿到。
但是恢复现场需要所有的二进制文件都要对应,你一定要有导致用户崩溃的那些Exe和DLL。既然是你发布的程序,Exe文件当然你会有。所以这里只考虑DLL就行了。
Dump文件中记录了所有DLL文件的版本号和时间戳,所以你一定可以同过某种途径拿到它。如果你能从用户那里拿到最好,如果不方便,用户不可能用的是我们平常不常用的操作系统,所以找个有对应系统的机器一般都会有。但是记住不仅是文件名称要一致,还要核对版本和时间戳,如果不同一样没有办法用。
如果客户用了某个特殊的补丁怎么办?
其实这个问题也很好解决,只要它不阻碍阅读堆栈,就不用管它,调试Dump和运行程序不一样,缺少一两个DLL没有任何问题。
3、 如果真的需要怎么办?
符号文件现在主要是指PDB文件。
如果没有符号文件,那么调试的时候可能导致堆栈错误。
如果你丢失了这个发布版本中你编译出来的那些exe和DLL的PDB,那么这个损失是严重的,重新编译出来的版本是不能使用的。
我自己的DLL都有了,可是缺的是系统的DLL的对应PDB文件怎么办?图1.4中已经介绍了方法。微软在它的符号数据库上为我们提供了所有的PDB文件,还有部分非关键DLL。设置好后程序将自动下载需要的PDB及DLL文件。
4、 拿到需要的文件了,这些文件应该放在哪里?
符号数据库中的文件不用动,把其它的exe和DLL、PDB文件放在dump文件目录里就行了。
5、 我用的是VS2005,明明有源代码,为什么显示不了?
这个是dump调试的最头痛问题,代码可能已经改过了,即使你从SVN拿到当时的版本,时间戳也是错的,VS2005就是不让你显示代码。其实只要在
Tools/Options,Debugging/General中去掉
Require source files to exactly match the original version的复选就行了。
利用VS2005进行dump文件调试的更多相关文章
- 利用VS2005进行dump文件调试(17篇博客)
前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件.使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置.本文将讨论以下内容: 1. 程序编译选 ...
- mac下利用Breakpad的dump文件进行调试
一.前情回顾 最近把公司的一个视频处理程序更新了一个版本,准备提交测试的发现了崩溃的情况.这个程序采用Qt和ffmpeg技术栈开发,主要用于对视频进行渲染拼接处理,在Windows和mac两个平台同时 ...
- VC++ 利用PDB和dump文件定位问题并进行调试
转载:https://blog.csdn.net/zfs_kuai/article/details/43646665 转载:https://blog.csdn.net/i_chaoren/articl ...
- centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)
写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用. 当然,在真实的产线环境中需要分析的数据和难度远远高于demo所示,所以demo的作用也仅仅只能起到介绍工具的作用. ...
- windows下dump文件调试
dump调试:在系统中异常或者崩溃的时候,来生成dump文件,然后用调试器来调试.这样就可以在生产环境中的dmp文件,拷贝到自己的开发机器上,调试就可以找到错误的位置,配合程序调试符号pdb文件,直接 ...
- 自定义VS程序异常处理及调试Dump文件(一)
自定义VS程序异常处理及调试Dump文件(一) 1. Dump文件 1. Dump文件介绍 Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀.dump文件是进程在内存中的镜像文件 ...
- (转)使用MAT比较多个heap dump文件
使用MAT比较多个heap dump文件 调试内存泄露时,有时候适时比较2个或多个heap dump文件是很有用的.这时需要生成多个单独的HPROF文件. 下面是一些关于如何在MAT里比较多个heap ...
- [MAT]使用MAT比較多个heap dump文件
使用MAT比較多个heap dump文件 调试内存泄露时,有时候适时比較2个或多个heap dump文件是非常实用的.这时须要生成多个单独的HPROF文件. 以下是一些关于怎样在MAT里比較多个hea ...
- 记一次dump文件分析历程
一.背景 今天下午,正酣畅淋漓的搬砖,突然运维同事在群里通知,核心服务某个节点内存异常,服务假死.神经一下子紧张起来,赶紧跑到运维那边观察现象. 观察的结果是服务内存溢出,该服务是核心服务,分配了5G ...
随机推荐
- 大数据技术 —— MapReduce 简介
本文为senlie原创,转载请保留此地址:http://www.cnblogs.com/senlie/ 1.概要很多计算在概念上很直观,但由于输入数据很大,为了能在合理的时间内完成,这些计算必须分布在 ...
- C#全屏随机位置显示图片的小程序
想法:将屏幕截图作为程序背景图,在之上弹出提示窗口,选择确定后进行定时图片随机位置显示.(支持ESC键退出) 需要添加的控件:Timer 需要修改的Form1属性为下图红色区域: 资源文件的添加:添加 ...
- Entity Framework学习(一)
网上看了很多的资料,发现都不是想要的学习资料,讲的不是很明白,最后在msdn开始自己研究EF MSDN的地址 https://msdn.microsoft.com/zh-cn/library/gg69 ...
- 第一节 Hibernate 基本配置
1 新建maven工程 1)打开eclipse,依次点击File---->New---->Maven Project. 2)选择org.apache.maven.archetypes ma ...
- [GeekBand] STL与泛型编程(1)
在C++语法的学习过程中,我们已经对模板有了基本的了解.泛型编程就是以模板为工具的.泛化的编程思想.本篇文章介绍了一些在之前的文章中没有涉及到的一些模板知识.泛型编程知识和几种容器.关于模板的一些重复 ...
- 处理器在 protected mode 下的 protection
前言 实模式,保护模式,分段,分页,虚拟内存,内核态,用户态,如果你对这些术语之间的关系非常熟悉,那就不用继续看了.这篇主要记录我对用户态/内核态的一些理解,如有不对还请指教. 下述说明均为 x86- ...
- Linux C 程序 预处理,结构体(13)
C语言预处理,结构体 C语言预处理命令1.宏定义 1.无参数宏 #define 标识符 字符串 #代表本行是编译预处理命名 习惯上,宏定义大写 代替一个字符串,介绍重复书写某个字符串的工作量 有意义的 ...
- (转)jquery ajax使用及跨域访问解决办法
原文地址:***/UIweb/jquery_ajax_kuayujiejue.html 最近开发中,设计到智能手机项目,给领导做几个demo.主要是用jquery和jqeury mobile. 越来越 ...
- 静态的html页面想要设置使用浏览器缓存
设置html页面缓存方法: 静态的html页面想要设置使用缓存: 通过HTTP的META设置expires和cache-control code 1. <meta http-equiv=&qu ...
- LeetCode 解题报告--202Happy Number
1 题目描述 Write an algorithm to determine if a number is "happy". A happy number is a number ...