使用场景:

Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来很大的帮助。一般程序崩溃时我们需要搜集的信息包括:系统信息、CPU寄存器信息、堆栈信息、调用堆栈信息、CPU和内存状态、内存当前地址等。调用堆栈是我们最常用到的。

技术方案:

目前我搜集的方法有以下三种,日志记录、dbghelp(.dmp) 、SHE(Structured Exception Handling)。

上一篇提供日志记录的实现方法,此篇提供一个基于dbghelp生成dump文件,同时使用符号文件和Windbg跟踪和分析系统出现的bug。

注意:SetUnhandledExceptionFilter,函数可以捕获大部分的异常,但栈溢出、覆盖产生的异常可能捕获不到。

案例演示:

如果系统在Windows kit下没有对应的库,在MSDN上下载 Windows 驱动程序工具包 (WDK) 和 Windows 调试工具 (WinDbg) 。

下载地址:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms679294(v=vs.85).aspx

Install Debugging Tools for Windows 32-bit Version
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
  Install Debugging Tools for Windows 64-bit
Versions
http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx

安装后,查看此目录

示例代码:

SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER
lpTopLevelExceptionFilter)主要通过这个异常过滤的函数来实现。

 // dbghelpSample.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include "dbghelp.h" #pragma comment(lib, "dbghelp.lib") LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionInfo)
{ HANDLE hFile = CreateFile(_T("project.dmp"), GENERIC_WRITE, , NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
MINIDUMP_EXCEPTION_INFORMATION stExceptionParam;
stExceptionParam.ThreadId = GetCurrentThreadId();
stExceptionParam.ExceptionPointers = pExceptionInfo;
stExceptionParam.ClientPointers = FALSE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpWithFullMemory, &stExceptionParam, NULL, NULL);
CloseHandle(hFile); return EXCEPTION_EXECUTE_HANDLER;
//EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常, 可以优雅地结束了
//EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理, 其他人来吧, 于是windows调用默认的处理程序显示一个错误框, 并结束
//EXCEPTION_CONTINUE_EXECUTION equ - 1 表示错误已经被修复, 请从异常发生处继续执行
} int _tmain(int argc, _TCHAR* argv[])
{
//进入主函数。
SetUnhandledExceptionFilter(TopLevelExceptionFilter);
int *pVar = NULL;
*pVar = ; //创建一个异常。程序编译不会出问题,但在执行时会因为没有分配内存而程序崩溃。
printf("测试");
return ;
}

在Release模式下,编译项目,运动生成后的exe,就会当前目录下生成project.dmp 文件。

通过.dmp文件进行release版本程序的调试,除了使用WinDbg,也可以用 VisualStudio进调试。

(一) 使用WinDbg进行调试

(1)设置符号文件。

(2)打开.dmp文件

在WinDbg命令中输入“!analyze -v”命令。进一步详细分析异常出现的信息。

(二)使用VS进行.dmp进行调试。

提示:将.dmp放到程序编译的exe旁边。

参考:

http://support.icafe8.com/technologynews/focus/932.html

http://blog.csdn.net/longlong530/article/details/43307249

http://www.cnblogs.com/happyhippy/archive/2007/04/08/710933.html

http://www.cnblogs.com/appsucc/p/3458906.html

Windows系统上release版本程序bug跟踪解决方案-.dmp文件。的更多相关文章

  1. Windows系统上release版本程序bug跟踪解决方案(1)-日志记录

    使用场景: Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来 ...

  2. 在Windows系统上一批可以下载但是需要经过编译再安装的第三方的直接编译后的版本(UCI页面)

    在Windows系统上一批可以下载但是需要经过编译再安装的第三方的直接编译后的版本(UCI页面) (https://www.lfd.uci.edu/~gohlke/pythonlibs/) win10 ...

  3. 使用VS2017 编写Linux系统上的Opencv程序

    背景 之前写图像算法的程序都是在window10下使用VS编写,VS这个IDE结合“ImageWatch.vsix“插件,用于调试opencv相关的图像算法程序十分方便.后因项目需要,需将相关程序移植 ...

  4. windows系统上安装与使用Android NDK r5 (转)

    windows系统上安装与使用Android NDK r5  很早就听说了android的NDK应用,只是一直没有时间去研究,今天花了点时间在windows平台搭建了NDK环境,并成功运行了第一个简单 ...

  5. Redis进阶实践之三如何在Windows系统上安装安装Redis

    一.Redis的简介        Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合 ...

  6. Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)

    Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...

  7. 解决Tomcat6解压版在64位windows系统上无法启动服务的问题

    解决Tomcat6解压版在64位windows系统上无法启动服务的问题         由于客户环境为64位windows系统,开发环境一直用32位.tomcat使用6.0.20非安装版.部署时发现在 ...

  8. 如何在Windows系统上利用Telnet协议连接Linux服务器

    Telnet协议是Internet远程登录服务的标准协议,它为用户提供了在本地计算机上完成远程主机工作的能力.很多终端使用者都习惯在计算机上利用Telnet会话来远程控制服务器.这里小编就分两步为大家 ...

  9. windows系统上安装与使用Android NDK r5

    windows系统上安装与使用Android NDK r5  很早就听说了android的NDK应用,只是一直没有时间去研究,今天花了点时间在windows平台搭建了NDK环境,并成功运行了第一个简单 ...

随机推荐

  1. 【codesmith】 初次试用(未发布)

      一直都有听过codesmith,一个很好用的软件,减少大量代码的输入,比如你生成一个list,并添加5个项. ArrayList list1=new ArrayList(); list1.Add( ...

  2. JavaScript 编程模式

    编程模式,是源自经验和探索总结出的最佳实践方案,既有助于可读性和可维护性,也有助于提升整体性能. 行为隔离 总则:结构.样式和行为之间两两隔离. 避免在结构中使用内联事件 尽量少用 <scrip ...

  3. python字典方法

    本文参考自<python基础教程 (第二版)> 操作 语法 举例 结果 建立字典 dict() 1.以关键字参数建立字典 2.以其他映射作为参数建立字典 1.d = dict(name=' ...

  4. ural 2016 Magic and Science

    2016. Magic and Science Time limit: 1.0 secondMemory limit: 64 MB Scientists who specialize in witch ...

  5. logz.io一个企业级的ELK日志分析器 内部集成了机器学习识别威胁——核心:利用用户对于特定日志事件的反馈处理动作来学习判断日志威胁 + 类似语音识别的专家系统从各方收集日志威胁信息

    转自: 可看到它使用机器学习算法来识别DNS安全问题 http://logz.io/blog/machine-learning-log-analytics/ A Machine Learning Ap ...

  6. [原创]Java动态填充word文档并上传到服务器

    一. 需求背景 在一些特殊应用场合,客户希望在服务器上生成文档的同时并填充数据,客户端的页面不显示打开文档,但是服务器上生成文档对服务器压力很大,目前服务器上生成文档第一种就是方式是jacob, 但是 ...

  7. Spring_总结_04_高级配置(二)_条件注解@Conditional

    一.前言 本文承接上一节:Spring_总结_04_高级配置(一)之Profile 在上一节,我们了解到 Profile 为不同环境下使用不同的配置提供了支持,那么Profile到底是如何实现的呢?其 ...

  8. 201621123014《Java程序设计》第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...

  9. len(),range()函数

    len()函数返回字符串.列表.字典.元组等长度 eg1:计算字符串的长度: >>>s='hello good boy doiido' >>>len(s) > ...

  10. Redis底层探秘(三):字典

    字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对的抽象数据结构. 字典经常作为一种数据结构内置在很多高级编程语言里面 ...