没有合适的资源?快使用搜索试试~ 我知道了~
首页Dump文件作用和生成
资源详情
资源评论
资源推荐

Dump 文件
1 简介
第一次遇到程序崩溃的问题,之前为单位开发了一个插件程序,
在本机运行没有出现问题,但把生成的可执行文件拷贝到服务器上
一运行程序,刚进入插件代码,插件服务就崩溃了,当时被这个问
题整的很惨,在同事的帮助下了解到,对于程序崩溃,最快的解决
方式是生成 dump 文件,通过生成 dump 文件使用调试工具进行调试,
还原程序崩溃时的状态,能够起到快速定位排查问题的作用。Dump
文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到
dump 文件中。Dump 文件是用来给驱动程序编写人员调试驱动程序
用的,这种文件必须用专用工具软件打开,比如使用 WinDbg、VS
打开。因为第一次遇到此类问题,完全没有头绪,但同事很快通过
dump 文件很快定位到空指针问题,秉承着遇到的问题在遇到第二次
不能再是问题的原则,对 dump 文件的含义、生成、作用、分析、
定位排查的过程进行说明,算是对遇到的程序崩溃的问题总结。
本文档适用于开发人员。

2 Dump 文件的含义和作用
2.1 Dump 文件的类型
Windows 下 Dump 文件分为两大类,内核模式 Dump 和用户模式
Dump。内核模式 Dump 是操作系统创建的崩溃转储,最经典的就是
系统蓝屏,这时候会自动创建内核模式的 Dump。用户模式 Dump 进
一 步 可 以 分 为 完 整 Dump ( Full Dump ) 和 迷 你
Dump(Minidump)。完整 Dump 包含了某个进程完整的地址空间数
据,以及许多用于调试的信息,而 Minidump 则有许多类型,根据需
要可以包含不同的信息,有的可能只包含某个线程和部分模块的信
息。在程序开发过程中出现的应用崩溃属于用户模式 Dump。因此,
要弄清楚这种 Dump 文件的组成、生成方式、作用。
2.2 Dump 文件的作用
Dump 文件是进程的内存镜像,可以把程序的执行状态通过调试
器保存到 dump 文件中。主要是用来在系统中出现异常或者崩溃的
时候来生成 dump 文件,然后用调试器进行调试,这样就可以把生
产环境中的 dmp 文件拷贝到自己的开发机上,调试就可以找到程序
出错的位置。
在 C++编程实践中,通常都会遇到内存访问无效、无效对象、
堆栈溢出、空指针调用等常见的 C/C++问题,而这些问题最后常会导
致:系统崩溃。为解决崩溃问题常用的手段一个就是生成 dump 文

件进行代码调试,另外一个就是使用远程调试 remote debugger 进行
调试。但 remote debugger 在要求程序源代码和可执行文件在同一个
局域网内,对环境的要求较高。因此对于程序崩溃较好的解决方式
便是生成 dump 文件进行解析,快速定位到程序崩溃位置,对问题
进行排查。在本次插件崩溃的过程中,程序崩溃的两行代码如下:
!"#$%
#&#" ""%
"""%
#&#" #"!'%
#&#" !##("&%
!)*&+ %
#&#" *!*%
* ,*%
-.""&%
/!"#0!123456789%
:;!**!"!'<!"!'&=!)*&+ =""="""=*!*=* ,*=
># $$
7
./!"!'"!##& /# +"!?#!*&
. $%
"+"@A%
9
BBC#
对应的是
/!"<=
若传入了
#&#"
,程序在此崩溃。调用
#&#"
对象的
#"$
可
以生成对应的
#/!"<
D!)*&+ C&=""C#="""C&=#"!'
C#=!##("&<<<<<<<=*!*C#=* ,*C&=
!)*&+ =""="""=#"!'E#"$=*!*E#"$=* ,*$%
在程序运行的过程中,在插件打印了
!"#
之 后 ,
程 序 崩 溃 , 这 可 以 通 过 日 志 打 印 出 来 , 在 最 下 面
NETSDKPLUGIN_DEBUG 函数中,对应%s,应为 C 风格字符串指针,
而传入的却是 C++ std::string 类型的对象,导致了程序崩溃。
之后的崩溃代码如下:
@<@6%

:A?!*0$$$
"+"A%
/"6"!#!@==F=@=&
<<$G@$%
:/"$GG;6@$$
7
'"H"!'I-!"!'%
'"H"!'A"'!I.*&"!'%
"!'A"'!" !*A'%
/"6@I.++"!'G.*&"!'$%
BB
在没有声卡的情况下
@I.++"!'$
中
.*&"!'
会生成空指针
BB
之前的代码并有对
/"
和
.*&"!'
进行非空判断,导致了程序在此处发生崩溃,因
为生成了空指针
:A/"$JJ66.*&"!'$
7
..++"!':!*&=*!#"""1C&51C&5=/"=
!#"""$$%
"+"A%
9
" !*A'E## A"'!.*&"!'$%
/!"!!'1K85%
BB
基于当前系统的当前日期
B
时间
?'(6?'8$%
'<6*!*?'G($%
#"L#!!'=C&C&C&C&C&C&E(!=I',!"M2N88=I''M2=
I''&!,=I'/+"=I''=I'#$%
#",#0A*!'=#"*!!'$M2=!!'$%
/"6D&A*!!'=A>-O=G-!"!'=
G" !*A'EA"'!&$=" !*A'E-!A"'!P"$$%
上 述 代 码 片 段 蓝 色 划 线 处
originalFmt.AssignFormat(cpOldStream);的函数体如下:
## A"'!"!'A"'!<"!'$
7
!#>'A"'>'-!A"'!P$%
'>'-!A"'!P6%
/"6"!'IA"'!G' +&A"'!&=>'-!A"'!P$%
:/"$GG'>'-!A"'!P$

7
:'>'-!A"'!PI(A"'!! 66-@A.>>$
7
'>'-!A"'!PI)068%BB*(!,##00":"-@A.>>E
9
:'>'-!A"'!PI D,#"668JJ
'>'-!A"'!PID** 668JJ
'>'-!A"'!PI/!*#668$
7
*!"$%
/"6@%
9
9
"+"/"%
9
对应调用了 pStream->GetFormat()函数,而在之前,若声卡被禁
用或者在远程桌面未设置下图,则 pStream 为空指针,而在使用之
前并没有进行 cpOldStream 非空判断,因此程序崩溃,导致程序出
现了崩溃。
而星辰在定位这个问题时在 main 函数中插入了 dump 文件生成
的控制代码,很快便定位到了该空指针异常。
剩余30页未读,继续阅读


















思影影思
- 粉丝: 547
- 资源: 127
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- Xilinx SRIO详解.pptx
- Informatica PowerCenter 10.2 for Centos7.6安装配置说明.pdf
- 现代无线系统射频电路实用设计卷II 英文版.pdf
- 电子产品可靠性设计 自己讲课用的PPT,包括设计方案的可靠性选择,元器件的选择与使用,降额设计,热设计,余度设计,参数优化设计 和 失效分析等
- MPC5744P-DEV-KIT-REVE-QSG.pdf
- 通信原理课程设计报告(ASK FSK PSK Matlab仿真--数字调制技术的仿真实现及性能研究)
- ORIGIN7.0使用说明
- 在VMware Player 3.1.3下安装Redhat Linux详尽步骤
- python学生信息管理系统实现代码
- 西门子MES手册 13 OpcenterEXCR_PortalStudio1_81RB1.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0