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

在我上篇文章《让程序在崩溃时体面的退出之SEH》中讲解了SEH中try/except可以捕捉异常,避免程序的崩溃,并且可以在处理完异常之后,还能决定进该进程如何执行。对于应用程序的使用者来说,并不知道异常的发生。但是对于软件的开发者来说,虽然避免了程序的崩溃,可是这样可以让程序崩溃的缺陷存在于代码中,就像一个定时炸弹,不知道什么时候会爆炸。要想修复这样的缺陷,首先要找到导致程序崩溃的那行代码。而我在我的那篇《让程序在崩溃时体面的退出之Dump文件》里面介绍了如何用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. }

从上面的代码中可以看出,要想创建Dump文件,必须得到一个指向EXCEPTION_POINTERS结构的指针。怎么在try/except块中得到这个指针呢?这个时候就需要用到Windows API中的GetExceptionInformation()。这个函数的返回值就是一个指向EXCEPTION_POINTERS结构的指针。下面是具体的代码。

  1. // 作为except块中表达式的函数
  2. //
  3. LONG CrashHandler(EXCEPTION_POINTERS *pException)
  4. {
  5. // 在这里添加处理程序崩溃情况的代码
  6. //
  7. // 这里以弹出一个对话框为例子
  8. //
  9. MessageBox(NULL, _T("Message from Catch handler"), _T("Test"), MB_OK);
  10. // 创建Dump文件
  11. //
  12. CreateDumpFile(_T("C:\\Test.dmp"), pException);
  13. return EXCEPTION_EXECUTE_HANDLER;
  14. }
  15. int _tmain(int argc, _TCHAR* argv[])
  16. {
  17. __try
  18. {
  19. MessageBox(NULL, _T("Message from '__try' section"), _T("Test"), MB_OK);
  20. // 除零,人为的使程序崩溃
  21. //
  22. int i = 13;
  23. int j = 0;
  24. int m = i / j;
  25. }
  26. // 捕捉到让程序崩溃的异常时创建Dump文件
  27. //
  28. __except(CrashHandler(GetExceptionInformation()))
  29. {
  30. // 这里以弹出一个对话框为例子
  31. //
  32. MessageBox(NULL, _T("Message from '__except' section"), _T("Test"), MB_OK);
  33. }
  34. MessageBox(NULL, _T("Funcation completed"), _T("Test"), MB_OK);
  35. return 0;
  36. }

编译上面的代码并运行,会依次弹出下面这些对话框,并在C盘创建一个Dump文件Test.dmp。

有了Dump文件,就可以轻松定位使程序崩溃的那行代码,具体方法可参考我的《让程序在崩溃时体面的退出之Dump文件》。

最新文章

  1. Adobe Flash player 10 提示:Error#2044:未处理的IOErrorEvent. text=Error#2036:加载未完成 的解决方法
  2. SQL..如何用命令删除数据库中所有的表?
  3. JUQERY 获取同名称的所有CHECKBOX ,获取已经选择的,并且jquery进行勾选!
  4. spi 子系统
  5. python 函数基础
  6. Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO
  7. 【HDOJ】2851 Lode Runner
  8. CSharp设计模式读书笔记(9):组合模式(学习难度:★★★☆☆,使用频率:★★★★☆)
  9. jdb
  10. 201521123037 《Java程序设计》第4周学习总结
  11. Cocos Creator 监听安卓屏幕下方返回键
  12. 自制操作系统Antz(15)——实现启动界面
  13. FTP判断ftp上是否有文件目录,没有就创建的具体案例
  14. mysql创建用户和库
  15. 2019.02.09 bzoj4710: [Jsoi2011]分特产(容斥原理)
  16. Mac 下搭建服务器
  17. stark 增删改
  18. 关于kafka的一些问题理解
  19. Command(命令)
  20. Python用户交互-密码不可见

热门文章

  1. android-satellite-menu
  2. SQL Server2008 附加数据库失败 错误代码5120
  3. PL/SQL 访问网页(get or post方式)
  4. linux下安装mysql5.6(官方文档)
  5. C# 虚方法 抽象方法 接口
  6. Lucene索引的初步创建
  7. lower_bound()函数
  8. Linux权限体系总结
  9. angularJs 页面筛选标签小功能
  10. Linux 防火墙设置,禁止某个ip访问