在软件编程中,崩溃的场景比较常见的。且说微软技术再牛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再去调试是非常难以接受的,且会破坏用户的环境)

使用windbg抓取崩溃文件和分析的过程的更多相关文章

  1. WinDbg抓取dmp文件

    应用程序发生异常时抓取dmp: adplus.vbs -crash -pn w3wp.exe -y srv*c:\symbols*http://msdl.microsoft.com/download/ ...

  2. WinDbg抓取程序报错dump文件的方法

    程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...

  3. Windbg抓取程序崩溃的dmp文件的方法

    Windbg抓取程序崩溃的dmp文件的方法 一.        简介 windbg是在windows平台下,强大的用户态和内核态调试工具.相比较于Visual Studio,它是一个轻量级的调试工具, ...

  4. 抓取Dump文件的方法和工具介绍

    一.Windows系统的任务管理器里抓dump 启动任务管理器,选中某个进程,右键,弹出菜单"创建转储文件" 注意事项: 当你在64位Windows系统上抓32位进程的dmup文件 ...

  5. 如何抓取崩溃的log日志

    4.手机录屏工具的推荐 Andriod:录屏大师,易录屏等等. iOS:AirPlayer,iTools. 5.如何抓取崩溃的log日志? android闪退获取日志方法: 1.下载adb工具包 2. ...

  6. 下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片 将图片的二进制字节字符串在HTML页面以图片形式输出 asp.net 文件 操作方法

    下载远程(第三方服务器)文件.图片,保存到本地(服务器)的方法.保存抓取远程文件.图片   将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 ...

  7. WinDbg-如何抓取dump文件

    这要分两种情况:第一种情况:如果是Vista或者是Windows2008操作系统就是一个简单的事情,在任务管理器中,切换到"进程"选项卡,右键点击你想要创建dump文件的进程,然后 ...

  8. Android--iOS抓取崩溃日志

    android闪退获取日志方法: 1.下载adb工具包 2.注意事项 请确保电脑上只连接了一台手机设备(最好只连接一条USB线),同时确保手机已开启USB调试模式(可通过手机助手查看连接状态) 3.A ...

  9. 抓取崩溃的log日志

    1.下载adb工具包 也就是解锁软件,如果要解锁的话,需确认有fastboot 安装jdk.sdk 2.注意事项 请确保电脑上只连接了一台手机设备(最好只连接一条USB线),同时确保手机已开启USB调 ...

随机推荐

  1. 查询死锁的Session SQL 语句

    /* Formatted on 2018/3/14 23:34:49 (QP5 v5.256.13226.35538) */ SELECT dob.object_name table_name , l ...

  2. Map HashMap 排序 迭代循环 修改值

    HashMap dgzhMap = Dict.getDict("dgzh"); Iterator it_d = dgzhMap.entrySet().iterator(); whi ...

  3. ifeq endif

    ifeq ($(PLATFORM_VERSION),4.4)$(info "________________________4.4"); LOCAL_CFLAGS += -DPLU ...

  4. 高通与MTK瓜分天下?手机处理器品牌分析

    http://mobile.pconline.com.cn/337/3379352.html [PConline 杂谈]如果你向朋友请教买一台怎样的台式机或者笔记本的话,很多时候那朋友会根据你对电脑的 ...

  5. Tomcat 报 The valid characters are defined in RFC 7230 and RFC 3986

    问题 24-Mar-2017 23:43:21.300 INFO [http-apr-8001-exec-77] org.apache.coyote.http11.AbstractHttp11Proc ...

  6. 黑镜第一至二季/全集Black Mirror迅雷下载

    本季第一.二季 Black Mirror (2011-2013)看点:<黑镜>(Black Mirror)是一部由查理·布洛克主创.英国电视4台(Channel 4)于2011年12月播出 ...

  7. 用开源项目RoundedImageView来实现 圆形 / 圆角 / 椭圆的图片

    该开源项目的地址:https://github.com/vinc3m1/RoundedImageView 我自己分流下载文件的:http://download.csdn.net/detail/shar ...

  8. Restful API 的设计规范(转)

    1. URI URI 表示资源,资源一般对应服务器端领域模型中的实体类.URI规范 不用大写; 用中杠-而不用下杠_; 参数列表要encode; URI中的名词表示资源集合,使用复数形式; 资源集合与 ...

  9. Svg.Js 父类的基础操作

    一.SVG.Doc 创建SVG文档 var draw = SVG('drawing') <div id="svg1"></div> <script&g ...

  10. cplusplus 库 在线管理; 类似于 python的 pip install 、nodejs 的npm模块

    cplusplus 库 在线管理: 类似于 python的 pip install .nodejs 的npm模块 还有 apache 经常使用的 Apache Ivy 项目依赖管理工具/Maven 这 ...