Windows系统上release版本程序bug跟踪解决方案-.dmp文件。
使用场景:
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文件。的更多相关文章
- Windows系统上release版本程序bug跟踪解决方案(1)-日志记录
使用场景: Win32程序在release模式下编译完成,发送给最终用户使用时,我们的程序有时候也会出现崩溃的情况,这个时候如果能快速定位崩溃原因或提供一些程序崩溃时的状态信息,对我们解决问题将会带来 ...
- 在Windows系统上一批可以下载但是需要经过编译再安装的第三方的直接编译后的版本(UCI页面)
在Windows系统上一批可以下载但是需要经过编译再安装的第三方的直接编译后的版本(UCI页面) (https://www.lfd.uci.edu/~gohlke/pythonlibs/) win10 ...
- 使用VS2017 编写Linux系统上的Opencv程序
背景 之前写图像算法的程序都是在window10下使用VS编写,VS这个IDE结合“ImageWatch.vsix“插件,用于调试opencv相关的图像算法程序十分方便.后因项目需要,需将相关程序移植 ...
- windows系统上安装与使用Android NDK r5 (转)
windows系统上安装与使用Android NDK r5 很早就听说了android的NDK应用,只是一直没有时间去研究,今天花了点时间在windows平台搭建了NDK环境,并成功运行了第一个简单 ...
- Redis进阶实践之三如何在Windows系统上安装安装Redis
一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合 ...
- Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)
Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...
- 解决Tomcat6解压版在64位windows系统上无法启动服务的问题
解决Tomcat6解压版在64位windows系统上无法启动服务的问题 由于客户环境为64位windows系统,开发环境一直用32位.tomcat使用6.0.20非安装版.部署时发现在 ...
- 如何在Windows系统上利用Telnet协议连接Linux服务器
Telnet协议是Internet远程登录服务的标准协议,它为用户提供了在本地计算机上完成远程主机工作的能力.很多终端使用者都习惯在计算机上利用Telnet会话来远程控制服务器.这里小编就分两步为大家 ...
- windows系统上安装与使用Android NDK r5
windows系统上安装与使用Android NDK r5 很早就听说了android的NDK应用,只是一直没有时间去研究,今天花了点时间在windows平台搭建了NDK环境,并成功运行了第一个简单 ...
随机推荐
- ActiveMq 高级特性的使用
消费者的 destination 可以使用 wildcards 生产者的 destination 可以使用 composite destinations VirtualTopic 真是一大利器,当初读 ...
- 2017-03-01 Oracle10g的安装与配置使用
今天项目中又用到了Oracle,时隔三年没有碰过Oracle,之前在做某城市公共自行车管理系统时使用的是Orace10g版本,Oracle给我最大的感觉就是安装上以后,电脑就会变得很卡,所以大家当不使 ...
- python MySQLdb连接mysql失败(转载)
最近了解了一下django,数据库选用了mysql, 在连接数据库的过程中,遇到一点小问题,在这里记录一下,希望能够对遇到同样的问题的朋友有所帮助,少走一些弯路.关于django,想在这里也额外说一句 ...
- Handsontable 的数据保存(增删改查+导出excel)
项目用到handsontable 插件 根据官网 API写的handsontable初始化, 数据展示, ajax请求, 参数封装, Controller参数接受 全局容器 var AllData = ...
- vue-cli项目中如何使用锚点
两种方式: 1.使用vue-router实现锚点功能(利用html5的history模式,vue-router的滚动行为) import Vue from 'vue' import VueRouter ...
- db2还原离线备份文件报错SQL2071N 提示“访问共享库出现错误”解决
db2 buffers buffer 提示报错: SQL2071N An error occurred while accessing the shared library “/home/db2a ...
- mac下安装libpng环境
用go写一个爬虫工具时需要使用一个go的库,而这个库有需要使用libpng库,不然编译就会提示说 png.h找不到等之类的信息,于是想到应该和windows一样需要安装gcc环境,然后让gcc里安装l ...
- docker+jenkins 部署持续集成环境
1.使用docker container的方式安装jenkins [root@hadoop default]# docker pull jenkin 创建一个目录用于后边映射 [root@hadoop ...
- npm 安装参数中的 --save-dev 是什么意思
看到有些 node.js 的包安装的时候都加上 --save-dev 参数,不知道这参数是做什么的,加和不加有什么区别吗? $ npm install xxx --save-dev 当你为你的模块安装 ...
- laravel 多个where的连接使用
在查询的时候需要用到多个where条件来查询 1.直接多个where连接 ->where()->where() 2.把查询条件 放到where数组$where中 然后 ->where ...