当前位置: 首页 > 编程日记 > 正文

使用windbg抓取崩溃文件和分析的过程

在软件编程中,崩溃的场景比较常见的。且说微软技术再牛X,也是会出现崩溃的场景。网上有一段Win98当着比尔盖茨蓝屏的视频非常有意思。 (转载请指明出于breaksoftware的csdn博客)
我们身边的很多软件都引入了dump生成和收集机制。但是一般情况下,它们都是生成minidump。因为minidump文件相对来说很小,方面我们收集上来进行分析。但是Minidump保存了很少的信息,在一些场景下,可能不能协助我们准确快速定位问题。

但是,如果我们在测试过程中,发生了必现崩溃,而minidump又不能让我们发现什么,那该怎么办呢?我这儿举一个例子。我们看一下代码

// Dump.cpp : 定义控制台应用程序的入口点。
//
//
// 这是一个多线程访问全局变量导致崩溃的例子
//#include "stdafx.h"
#include <Windows.h>
#include <vector>#define INTPTR int* 
typedef std::vector<INTPTR> VecINTPTR;
typedef VecINTPTR::iterator VecINTPTRIter;
typedef VecINTPTR::const_iterator VecINTPTRCIter;VecINTPTR g_VecInt;static DWORD WINAPI ReadRoutine(LPVOID)
{// 读取线程for ( VecINTPTRIter it = g_VecInt.begin(); it != g_VecInt.end(); it++ ) {// 故意将读取时间设置长,这样更大概率导致崩溃Sleep(10);printf("%d %d\n", **it);}return 0;
}static DWORD WINAPI WriteRoutine(LPVOID)
{// 写入线程for ( VecINTPTRIter it = g_VecInt.begin(); it != g_VecInt.end();  ) {// 故意将修改时间设置短,这样更大概率导致奔溃delete *it;*it = NULL;}return 0;
}int _tmain(int argc, _TCHAR* argv[])
{// 初始填充数据for ( int n = 0; n < 128; n++ ) {int* p = new int();*p = n;g_VecInt.push_back(p);}system("pause");HANDLE hRead = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)ReadRoutine, NULL, 0, NULL);HANDLE hWrite = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)WriteRoutine, NULL, 0, NULL);HANDLE hArray[] = {hRead, hWrite};WaitForMultipleObjects( ARRAYSIZE(hArray), hArray, TRUE, INFINITE);printf("Success");return 0;
}
这个例子是典型的多线程访问共享变量,导致崩溃的问题。这个例子还是很清晰的,但是,如果这段逻辑揉入复杂的业务逻辑,问题的排查可能就没那么简单了。
那我们看下如何分析这个问题。
  1. 运行程序(程序会暂停在system(“pause”))
  2. 安装windbg,使用“附加”功能
  3. 在windbg中输入g,让程序继续执行 
  4. 在dump.exe按任意键,重现崩溃路径
  5. 崩溃发生,windbg发现异常并中断
  6. 在windbg中输入.dump /f C:/dump.dmp,其中.dump是dump生成命令,/f是生成全信息dump,生成的dump文件会很大,C:/dump.dmp是路径
至此,我们在客户机器上已经抓到了完整的dmp文件,现在我们回到我们自己的电脑上,配置windbg,并分析这个dump文件。在这个配置中,我们要涉及几块信息的填充。一般,我们发布的产品(release版)不是在我们开发者的机器上编译链接的,而是在某一个编译链接服务器上。在服务器上,我们工程的目录和我们本地的目录极有可能是不同的。一般情况下,最容易配置不正确的是下面的第3步。
  1. 将dump.exe符号文件拷贝到你希望的保存目录,我的目录是F:\TmpSymbol
  2. 用!analyze –v分析dump文件
  3. ctrl+P打开windbg代码目录(工程根目录)
  4. Ctrl+S打开windbg符号设置框,设置符号文件路径,并勾选reload
这样windbg就准确定位到异常的位置

这个流程非常适合于分析的场景是:

  1. 没有做通过异常方式做保护的程序(否则windbg挂载后会一直陷入中断,非常烦人。或者程序发现自己被调试,就直接退出了……)
  2. VS不便分析的dump
  3. 不破坏用户环境(windbg是个非常小巧独立的程序,试想如果我们给客户装个庞大的VS再去调试是非常难以接受的,且会破坏用户的环境)

相关文章:

TF 2.1.0-rc2发布,2020年停止支持Python 2

作者 | 神经星星来源 | HyperAI超神经&#xff08;ID:HyperAI&#xff09;【导读】2020 年 1 月 1 日&#xff0c;Python 2 停止维护&#xff0c;正式退休。Python 3 全面登场的时刻&#xff0c;TensorFlow 也在悄悄改变。近日 TensorFlow 官方 GitHub 账号中&#xff0c;发布了…

重新认识笔记本锂电池的保养

重新认识笔记本锂电池的保养 对于笔记本电脑来说&#xff0c;电池可以说是一个比较重要的部件&#xff0c;它的效能直接关系到笔记本电脑在缺少电源的环境中的工作能力。而电池在笔记本电脑的众组件中又算是一个不折不扣的消耗品&#xff0c;因此涉及到笔记本电脑电池的保养和合…

nginx转发及后端服务器获取真实client的IP

针对nginx的模块介绍可以查阅wiki:http://wiki.nginx.org/Modules常用模块&#xff1a;HTTP CoreProxyRewriteUpstream 原理&#xff1a;squid&#xff0c;varnish以及nginx等&#xff0c;在做反向代理的时候&#xff0c;因为要代替客户端去访问服务器&#xff0c;所以&#xf…

AJAX的组成应用

表示层XHTMLCSS 动态显示和数据 DOM (文档对象模型)数据交互和操作 XML,XSLT 异步数据获取 XMLHttpRequest 绑定和处理数据 JavaScript XMLhttpRequest对象属性:Number readyState 4 表示完成Function onreadystatechange 回调函数string responseText XMLDocument responseXM…

打开,保存文件框的文本溢出排查

工作中遇到的这个问题还是很有意思的。其中嵌套了很多奇葩性的问题。 &#xff08;转载请指明出于breaksoftware的csdn博客&#xff09;我们来看下故事的发生过程&#xff0c;QA同学发现我们存在如下的bug 看到如此多的串&#xff0c;可以认为这个是典型的溢出问题。后来我咨询…

2020年,为什么说入坑AI是最好的时机?

2019年可以说是AI全面落地和商用的一年&#xff0c;产业智能化成为各个行业重点关注的发展方向&#xff0c;交通、工业、农业、医疗等主流行业无一例外。随着人工智能技术的进一步发展和落地&#xff0c;深度学习、数据挖掘、自动程序设计等领域也将在更多应用场景中得到实现。…

IIS 伪静态配置(安装ISAPI_Rewrite配置)

第一&#xff1a;首先到官方网站下载ISAPI_Rewrite 我的机子是32位的就下32位免费版的&#xff0c;链接地址如下&#xff1a; http://www.helicontech.com/download/isapi_rewrite/ISAPI_Rewrite3_0064_Lite.msi 可以选择不同版本&#xff1a;http://www.helicontech.com/downl…

Github标星24k,127篇经典论文下载,这份深度学习论文阅读路线图不容错过

作者 | Floodsung翻译 | 黄海广来源 | 机器学习初学者(ID&#xff1a;ai-start-com&#xff09;【导读】如果你是深度学习领域的新手&#xff0c;那么你可能会遇到的第一个问题是“我应该从哪篇论文开始阅读&#xff1f;”本文就是一篇深度学习论文的阅读路线图&#xff01;该…

c/c++面试

1. static在c&#xff0c;c中有什么不同点2. 堆和栈的区别3. 纯虚函数4. 指针和引用的区别5. 如果构造函数出错&#xff0c;如何处理&#xff1f;6. 对设计模式是否熟悉&#xff0c;用过哪些&#xff1f;7. c如何使用c中的函数&#xff0c;为什么&#xff1f;整理&#xff1a;1…

一种解决启动进程传递参数过长的方法

工作中&#xff0c;QA同学在测试我们程序的时候&#xff0c;发现在XP下&#xff0c;我们的A进程无法启动我们的B进程。而在Win7 64bit系统下功能正常。RD同学调试后&#xff0c;发现我们A进程中使用ShellExcute去启动了B进程&#xff08;转载请指明出于breaksoftware的csdn博客…

Ubuntu“无法获得锁\加锁”解决方案

2019独角兽企业重金招聘Python工程师标准>>> 当你添加了源&#xff0c;更新源的时候&#xff0c;如果中途中断了更新&#xff0c;安装软件或者再次更新的时候就是出现如下提示&#xff0c; E: 无法获得锁 /var/lib/apt/lists/lock – open (11: 资源暂时不可用) E: …

一步一步学Silverlight 2系列(3):界面布局

概述 Silverlight 2 Beta 1版本发布了&#xff0c;无论从Runtime还是Tools都给我们带来了很多的惊喜&#xff0c;如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython&#xff0c;对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlig…

一种准标准CSV格式的介绍和分析以及解析算法

CSV是一种古老的数据传输格式&#xff0c;它的全称是Comma-Separated Values&#xff08;逗号分隔值&#xff09;。出生在那个标准缺失的蛮荒年代&#xff0c;CSV的标准一直&#xff08;到2005年&#xff09;是NULL——世间存在着N种CSV格式&#xff0c;它们自成体系&#xff0…

新战场路在何方——详解360金融数据中台之旅

作者 |360金融架构总监黄建庭出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;本文为CSDN即将推出的《新战场&#xff1a;决胜中台》专刊的第 4 篇文章。自阿里巴巴引入中台概念后&#xff0c;市场对中台的关注度持续“高烧”不退。作为企业的基础平台&#xff0c;数据…

oracle中的exists 和not exists 用法详解

有两个简单例子&#xff0c;以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.aT2.a) ; T1数据量小而T2数据量非常大时&#xff0c;T1<<T2 时&#xff0c;1) 的查询效率高。 2) select * from T1 where T1.a in (select…

现代内存编号解读(转)

现代SDRAM、DDR SDRAM、DDR2 SDRAM三种主流内存颗粒的编号一、DDR SDRAM&#xff1a;HYNIX DDR SDRAM颗粒编号&#xff1a;HY XX X XX XX X X X X X X X — XX X1 2 3 4 5 6 7 8 9 10 11 12 — 13 14整个DDR SDRAM颗粒的编号&#xff0c;一共是由14…

被追捧为“圣杯”的深度强化学习已走进死胡同

作者 | 朱仲光编译 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai1100&#xff09;【导读】近年来&#xff0c;深度强化学习成为一个被业界和学术界追捧的热门技术&#xff0c;社区甚至将它视为金光闪闪的通向 AGI 的圣杯&#xff0c;大多数人都看好它未来发展的巨大潜力。但…

一种清除windows通知区域“僵尸”图标的方案——问题分析

通知区域名称有趣的历史 假如说到windows通知区域&#xff0c;可能很多人还是不清楚它是什么。如果改称Tray区域&#xff0c;可能有人就懂了。如果再白话点&#xff0c;叫它“托盘”或者“系统托盘”&#xff0c;可能会有更多的人猜到它是windows什么部位。现在我们揭开…

Apache2.4+Tomcat7集群搭建

一、安装jdk、Tomcat、Apache1.安装jdk1.7cd /home/java/software #把软件下载到/home/java/software目录下&#xff0c;将应用安装到/home/java目录下。 wget http://download.oracle.com/otn/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz tar -zxvf jdk-7u80-linux-x64.tar…

一种清除windows通知区域“僵尸”图标的方案——XP系统解决方案

XP下“僵尸”图标的解决方案 从《一种清除windows通知区域“僵尸”图标的方案——问题分析》&#xff08;以后简称《问题分析》&#xff09;一文中分析的通知区域结构可以看出&#xff0c;XP的通知区域结构是相对简单的。如果我们解决了XP下的问题&#xff0c;那么Win7上的问题…

《评人工智能如何走向新阶段》后记(再续12)

由AI科技大本营下载自视觉中国151. 新一代人工智能研究方向: &#xff08;1&#xff09;研究新一代人工智能基础理论&#xff08;机理、模型和算法&#xff09;&#xff1b;&#xff08;2&#xff09;研发面向需求的共性技术&#xff08;以神经网络和算法为核心、数据和硬件为基…

正则表达式测试工具 Regex Tester 的使用方法

2019独角兽企业重金招聘Python工程师标准>>> 正则表达式测试工具“RegexTester”&#xff0c;下载地址&#xff1a;http://www.oschina.net/p/regextester 一、关于本文 今天的工作中遇到了一些正则表达式&#xff0c;我需要检验它们是否正确&#xff0c;不过我对自…

一种清除windows通知区域“僵尸”图标的方案——Windows7系统解决方案

Windows7下“僵尸”图标的解决方案 从《一种清除windows通知区域“僵尸”图标的方案——问题分析》&#xff08;以后简称《问题分析》&#xff09;一文中分析的通知区域结构可以看出&#xff0c;Windows7的通知区域比XP通知区域多出了一个“临时”系统通知区域&#xff08;转载…

《评人工智能如何走向新阶段》后记(再续13)

由AI科技大本营下载自视觉中国161. 引自美国科技媒体TNW记者对美欧企业主管与AI专家的访谈录摘要&#xff0c;谈到2020年AI的八大趋势&#xff1a; ①人工智能将使医疗保健更准确、成本更低&#xff1b; ②可解释性和信托及AI伦理将受到更多关注&#xff1b; ③在人工智能领…

在特定情况下的简单SSO实现方案

最近需要实现类似单点登录的功能。情况是这样的&#xff0c;最初在做网站A&#xff0c;做着做着&#xff0c;要做网站B了&#xff0c;要求与网站A完全分开作为两个应用&#xff0c;但用户数据要求与网站A保持一致&#xff0c;也要求用户在网站A登录后&#xff0c;转到网站B时不…

为创业者保驾护航 “无安全 不创业” 安全狗全国路演北京站

2019独角兽企业重金招聘Python工程师标准>>> 2015年上半年&#xff0c;网络安全问题毫无疑问已经成为了互联网行业关注的重点。在短短一年多的时间里&#xff0c;网络安全问题就从隐患转而呈现出爆发之势&#xff0c;即使是网易、支付宝、携程这样的互联网行业巨头也…

一种将快捷方式从开始菜单“常用应用”的中去除的方法

当我们安装一款软件的时候&#xff0c;这款软件的一些快捷方式可能被设置到开始菜单的“常用应用”区域。但是&#xff0c;如果是“卸载”快捷方式被“钉”到该区域&#xff0c;就会造成非常不好的体验。毕竟把“卸载”接口暴露得如此醒目&#xff0c;如同把该款软件的地狱大门…

ISA---不能访问网址或是多次刷新才能访问的解决方法一则

当你安装ISA2006在WINDOWS 2003 SERVER上&#xff0c;并打上SP2补订时。遇SNAT客户端不能访问WEB&#xff0c;但能PING通&#xff0c;能TELNET通&#xff0c;也能访问QQ或是MSN的问题时可以利用以下方法解决。同时&#xff0c;如果你遇到在此环境下&#xff0c;客户端访问外部网…

《评人工智能如何走向新阶段》后记(深谈人工智能发展前沿)

由AI科技大本营下载自视觉中国来自国内外的跟贴留言 深谈人工智能发展前沿 自从我们发表《评人工智能如何走向新阶段》一文以来&#xff0c;至今约5个月&#xff0c;引来了中外专家、草根们的大量跟贴留言&#xff08;也有人转录他人的公开言论作为跟贴来发表的&#xff09;。…

URAL 2027 URCAPL, Episode 1 (模拟)

题意&#xff1a;给你一个HxW的矩阵&#xff0c;每个点是一个指令&#xff0c;根据指令进行一系列操作。 题解&#xff1a;模拟 #include<cstdio> #include<algorithm> using namespace std;const int maxn 101; char G[maxn][maxn];int dx[] {-1,0,1, 0}; int d…