使用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;
}
这个例子是典型的多线程访问共享变量,导致崩溃的问题。这个例子还是很清晰的,但是,如果这段逻辑揉入复杂的业务逻辑,问题的排查可能就没那么简单了。
那我们看下如何分析这个问题。
- 运行程序(程序会暂停在system(“pause”))
- 安装windbg,使用“附加”功能
- 在windbg中输入g,让程序继续执行
- 在dump.exe按任意键,重现崩溃路径
- 崩溃发生,windbg发现异常并中断
- 在windbg中输入.dump /f C:/dump.dmp,其中.dump是dump生成命令,/f是生成全信息dump,生成的dump文件会很大,C:/dump.dmp是路径
- 将dump.exe符号文件拷贝到你希望的保存目录,我的目录是F:\TmpSymbol
- 用!analyze –v分析dump文件
- ctrl+P打开windbg代码目录(工程根目录)
- Ctrl+S打开windbg符号设置框,设置符号文件路径,并勾选reload
这个流程非常适合于分析的场景是:
- 没有做通过异常方式做保护的程序(否则windbg挂载后会一直陷入中断,非常烦人。或者程序发现自己被调试,就直接退出了……)
- VS不便分析的dump
- 不破坏用户环境(windbg是个非常小巧独立的程序,试想如果我们给客户装个庞大的VS再去调试是非常难以接受的,且会破坏用户的环境)
使用windbg抓取崩溃文件和分析的过程的更多相关文章
- WinDbg抓取dmp文件
应用程序发生异常时抓取dmp: adplus.vbs -crash -pn w3wp.exe -y srv*c:\symbols*http://msdl.microsoft.com/download/ ...
- WinDbg抓取程序报错dump文件的方法
程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...
- Windbg抓取程序崩溃的dmp文件的方法
Windbg抓取程序崩溃的dmp文件的方法 一. 简介 windbg是在windows平台下,强大的用户态和内核态调试工具.相比较于Visual Studio,它是一个轻量级的调试工具, ...
- 抓取Dump文件的方法和工具介绍
一.Windows系统的任务管理器里抓dump 启动任务管理器,选中某个进程,右键,弹出菜单"创建转储文件" 注意事项: 当你在64位Windows系统上抓32位进程的dmup文件 ...
- 如何抓取崩溃的log日志
4.手机录屏工具的推荐 Andriod:录屏大师,易录屏等等. iOS:AirPlayer,iTools. 5.如何抓取崩溃的log日志? android闪退获取日志方法: 1.下载adb工具包 2. ...
- 下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片 将图片的二进制字节字符串在HTML页面以图片形式输出 asp.net 文件 操作方法
下载远程(第三方服务器)文件.图片,保存到本地(服务器)的方法.保存抓取远程文件.图片 将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 ...
- WinDbg-如何抓取dump文件
这要分两种情况:第一种情况:如果是Vista或者是Windows2008操作系统就是一个简单的事情,在任务管理器中,切换到"进程"选项卡,右键点击你想要创建dump文件的进程,然后 ...
- Android--iOS抓取崩溃日志
android闪退获取日志方法: 1.下载adb工具包 2.注意事项 请确保电脑上只连接了一台手机设备(最好只连接一条USB线),同时确保手机已开启USB调试模式(可通过手机助手查看连接状态) 3.A ...
- 抓取崩溃的log日志
1.下载adb工具包 也就是解锁软件,如果要解锁的话,需确认有fastboot 安装jdk.sdk 2.注意事项 请确保电脑上只连接了一台手机设备(最好只连接一条USB线),同时确保手机已开启USB调 ...
随机推荐
- 集合框架的类和接口均在java.util包中。 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。
集合框架的类和接口均在java.util包中. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换.
- redis实现发布(订阅)消息
redis实现发布(订阅)消息 什么是redis的发布订阅(pub/sub)? Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能.基于事件的系统中,Pub/S ...
- JasperReports+iReport在eclipse中的使用(转)
一.介绍 1)它可以PDF,HTML,XML等多种形式产生报表或动态报表,在新版本还支持CSV,XLS,RTF等格式的报表: 2)它按预定义的XML文档来组织数据,来源多(如:关系数据库,Java容器 ...
- 每天一个linux命令-wc命令
语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也给出所有指定文件的总统计数.字是由空格字符区分开的最大字符串. 该命令各选 ...
- android Apk打包过程概述_android是如何打包apk的
流程概述:1.打包资源文件,生成R.java文件2.处理aidl文件,生成相应java 文件3.编译工程源代码,生成相应class 文件4.转换所有class文件,生成classes.dex文件5.打 ...
- Spring data jpa Specification查询关于日期的范围搜索
代码: 时间格式化类型: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat s ...
- confluence知识管理、团队协作软件
Confluence搭建 参见 https://confluence.atlassian.com/display/CONF54/Installing+the+Confluence+EAR-WAR+Ed ...
- [leetcode]Insert Interval @ Python
原题地址:https://oj.leetcode.com/problems/insert-interval/ 题意: Given a set of non-overlapping intervals, ...
- [leetcode]Pascal's Triangle @ Python
原题地址:https://oj.leetcode.com/problems/pascals-triangle/ 题意: Given numRows, generate the first numRow ...
- asp.net网站发布
1.iis里面新建一个网站,目录可以新建(例如:F:\dotNetWeb),还可以创建子文件夹如:F:\dotNetWeb\my,网站路径是可以自己设置的,也可以使用IIS默认的网站. 2.vs201 ...