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

时间:2023-02-20 13:30:31

原文地址:http://blog.csdn.net/starlee/article/details/6630816

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

  1. BOOL WINAPI MiniDumpWriteDump(
  2. __in  HANDLE hProcess,
  3. __in  DWORD ProcessId,
  4. __in  HANDLE hFile,
  5. __in  MINIDUMP_TYPE DumpType,
  6. __in  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
  7. __in  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
  8. __in  PMINIDUMP_CALLBACK_INFORMATION CallbackParam
  9. );

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

  1. // 处理Unhandled Exception的回调函数
  2. //
  3. LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
  4. {
  5. // 这里弹出一个错误对话框并退出程序
  6. //
  7. FatalAppExit(-1,  _T("*** Unhandled Exception! ***"));
  8. return EXCEPTION_EXECUTE_HANDLER;
  9. }
  10. // 一个有函数调用的类
  11. //
  12. class CrashTest
  13. {
  14. public:
  15. void Test()
  16. {
  17. Crash();
  18. }
  19. private:
  20. void Crash()
  21. {
  22. // 除零,人为的使程序崩溃
  23. //
  24. int i = 13;
  25. int j = 0;
  26. int m = i / j;
  27. }
  28. };
  29. int _tmain(int argc, _TCHAR* argv[])
  30. {
  31. // 设置处理Unhandled Exception的回调函数
  32. //
  33. SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
  34. CrashTest test;
  35. test.Test();
  36. return 0;
  37. }

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

  1. // 创建Dump文件
  2. //
  3. void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
  4. {
  5. // 创建Dump文件
  6. //
  7. HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  8. // Dump信息
  9. //
  10. MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
  11. dumpInfo.ExceptionPointers = pException;
  12. dumpInfo.ThreadId = GetCurrentThreadId();
  13. dumpInfo.ClientPointers = TRUE;
  14. // 写入Dump文件内容
  15. //
  16. MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
  17. CloseHandle(hDumpFile);
  18. }

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

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

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

[转]让程序在崩溃时体面的退出之Dump文件
        在VS2010里打开Dump文件,会显示一个Minidump File Summary,并且可以进行下面图中的操作。

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

[转]让程序在崩溃时体面的退出之Dump文件的更多相关文章

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

             在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在程序崩溃时得到CallStack的方法.但是要想得到CallStack,必须有pdb文件的支持.但 ...

  2. &lbrack;转&rsqb;让程序在崩溃时体面的退出之SEH&plus;Dump文件

    原文地址:http://blog.csdn.net/starlee/article/details/6649605 在我上篇文章<让程序在崩溃时体面的退出之SEH>中讲解了SEH中try/ ...

  3. &lbrack;转&rsqb;让程序在崩溃时体面的退出之CallStack

    原文地址:http://blog.csdn.net/starlee/article/details/6618849 在我的那篇<让程序在崩溃时体面的退出之Unhandled Exception& ...

  4. &lbrack;转&rsqb;让程序在崩溃时体面的退出之Unhandled Exception

    原文地址:http://blog.csdn.net/starlee/article/details/6613424 程序是由代码编译出来的,而代码是由人写的.人非圣贤,孰能无过.所以由人写的代码有缺陷 ...

  5. &lbrack;转&rsqb;让程序在崩溃时体面的退出之SEH

    原文地址:http://blog.csdn.net/starlee/article/details/6636723 SEH的全称是Structured Exception Handling,是Wind ...

  6. 编写的windows程序,崩溃时产生crash dump文件的办法

    一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序 ...

  7. sublime打开文件时自动生成并打开&period;dump文件

    GBK Encoding Support 没有安装前打开ASNI格式编码文件会乱码,安装成功重启则可以打开正常 关于.dump文件生成的解释: 当打开一个非utf-8格式且包含汉字的文件时,subli ...

  8. android在程序崩溃时Catch异常并处理

    Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Th ...

  9. &lbrack;转&rsqb;window下使用SetUnhandledExceptionFilter捕获让程序的崩溃

    简单使用SetUnhandledExceptionFilter()函数让程序优雅崩溃 虽然是大公司的产品,QQ它还是会在我们的折腾下崩溃的,但是它总是崩溃的很优雅,还要弹出自己的对话框来结束.并且发送 ...

随机推荐

  1. NSStringCompareOptions

    typedefNS_OPTIONS(NSUInteger, NSStringCompareOptions) { NSCaseInsensitiveSearch = 1,    //不区分大小写比较 N ...

  2. GitHub for Windows呆瓜级操作1

    如何安装.注册.创建仓库等操作请参考http://www.cnblogs.com/foreveryt/p/4077380.html 1.点击右上角+号创建本地新仓库LHJ.点击Create repos ...

  3. RTSP协议转换RTMP直播协议

    RTSP协议转换RTMP直播协议 RTSP协议也是广泛使用的直播/点播流媒体协议,最近实现了一个RTSP协议转换RTMP直播协议的程序,为的是可以接收远端设备或服务器的多路RTSP直播数据,实时转换为 ...

  4. CSS学习心得2

    CSS样式 链接 a:link - 普通的.未被访问的链接 a:visited - 用户已访问的链接 a:hover - 鼠标指针位于链接的上方 a:active - 链接被点击的时刻 当为链接的不同 ...

  5. 小谈 - web模仿手机打电话与正则表达式

    昨天遇到了一个很棘手的问题,就是手机端调用web端的页面,如果用编辑器插入的内容页面中有电话的的数据就要变一下格式,让手机端可以实现拨号的功能. 研究了半天就是没一点头绪,但是偶尔看到数据中每一个电话 ...

  6. ArcEngine查询、添加、删除要素的方法

    原文 ArcEngine查询.添加.删除要素的方法 1.查找数据 1).利用FeaturCursor进行空间查询 //空间查询 ISpatialFilter spatialFilter = new S ...

  7. LinearLayout具体解释二&colon;LinearLayout的创建过程以及状态全程解析

    正在撰稿中,请稍等...

  8. 在虚拟机中安装metasploit官方攻防模拟器

    首先我们要在windwos下载安装perl环境.下载地址: http://pan.baidu.com/s/1i3GLKAp 然后我们安装 点击next 我同意,next next next,然后他会安 ...

  9. 【原创】一文掌握 Linux 性能分析之 I&sol;O 篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 一文掌握 Li ...

  10. 第九次作业——K-means算法应用:图片压缩

    一.读取一张示例图片或自己准备的图片,观察图片存放数据特点. 根据图片的分辨率,可适当降低分辨率. 再用k均值聚类算法,将图片中所有的颜色值做聚类. 然后用聚类中心的颜色代替原来的颜色值. 形成新的图 ...