WINDBG常用方法
前言:windbg大家都很熟悉,它是做windows系统客户端测试的QA人员很应该掌握的定位程序崩溃原因的工具,
网上也有很多资料,但是真正适合QA阅读和实用的资料不多,我把我认为最重要最应该掌握的结合以前的使用经验分享一下:
基础篇
1、 打开windbg,打开dmp文件,File——〉open crash dump(其实有更方便的方法,后面会说)
2、 设置符号下载路径和加载路径,File——〉symbol file path,输入srv*d:\symbolslocal*http://msdl.microsoft.com/download/symbols,中间这个路径可以随意设置,如果有其他符号路径,比如产品的模块PDB,加分号分隔即可。
符号是可以定位到具体函数,甚至具体错在哪一行代码的。在分析过程中只要dmp中牵涉到相关的微软模块的pdb都会被下载和加载。网上也有“集合版”的pdb,可以自行搜索,但是符号对应模块的版本不一定适合。
3、 弹出一个workspace的对话框,选什么都无所谓,yes、no都一样,不需要关注
4、 打开dump以后可以看到命令行窗口,如下图打开一个IE的dump文件:

5、 上图最下方的输入窗口就是用来输入调试命令的
6、 第一条命令: !analyze –v,回车,这条命令是万金油,可以自动分析大概是谁导致的崩溃,那么它执行后要关注什么内容?看下图

7、 上图应该怎么看?从下往上看!这里面就是崩溃时内存里面的模块的执行过程。注意看“Following XXX”,字面意思是接下来的段可以错了,程序在这里崩溃了的意思,因为是从下往上走的,所以“Following XXX”上方的内容就是崩溃后的东西,而“Following XXX”下方的内容就是导致崩溃的“原因”,越接近“Following XXX”的越代表有可能是导致崩溃的直接模块,但是这不一定。如果抓到的dmp时机太迟,会出现堆栈破坏的情景,那么“Following XXX”得到的内容可能就是错误的了,那么这个dmp意义就不大,当然QA可以不关注这个,要关注的是如何让自己抓dmp的时机更及时。
8、 第二条命令:kb,回车,这条命令是上面的补充,用来显示当前线程call stack(调用栈)的内容,它可以查看更详细的内存信息,更好的定位崩溃原因,比如上图内容看不到360相关的东西,是不是说这个崩溃和360没关系呢?不一定!看kb的内容

9、 记住从下往上看!上图可以看到是IE调用了safemon.dll的函数后才开始创建dmp的,是不是有理由怀疑这个崩溃和网盾有关了?提BUG吧!
10、 可惜我们只看到和网盾有关,但是具体是网盾什么函数、什么参数导致的都看不到,如何看?这时就看出符号文件的重要性了!
Ps:还有一个命令是~*kb ,它用来显示dump中所有线程的call stack, 一般用到它说明这个dump已经比较难看了,可以从命令结果中搜索KiUserExceptionDispatcher等关键字,一般可以认为存在KiUserExceptionDispatcher的线程就是导致崩溃的线程。

高级篇
1、 设置DMP类型文件关联用windbg打开
a) cmd到windbg目录运行windbg –IA
2、 手动抓DMP的方法:
a) 如果程序崩溃后没有DMP文件生成可采取下面方法转存DUM。
b) 当程序崩溃还没有退出的时候,开启WINDEBUGGER程序,在FILE——执行attach to a process——选择崩溃的进程。
c) 再执行.dump /ma C:\testdump.dmp(如果没有/ma,dump大小比较小)
3、自动抓DMP的方法:
a) cmd到windbg目录运行 windbg -IS
b) 进行导致崩溃的操作
c) 即可抓到dmp,执行.dump /ma C:\testdump.dmp
4、 使用windbg调起进程调试
a) 开启WINDEBUGGER程序,在FILE——执行Open Executable——选择要进行调试的进程文件
b) 当进程没有自保护或者没有反调试时,在input框输入g,回车,即可打开进程,此时如果进程发生崩溃,会被立即捕捉到。这种方法拿到的dmp比第二种更好。

5、 设置Global Flags,自动attach进程。Global Flags(简称gflags),设置它之后,目标进程启动时会立即被attach,主要用于调试一些系统进程,或“有依赖的”进程,这些进程不能直接由方法4打开,只能由其他进程调用,而调用用立即崩溃,所以也不能用方法2。这个方法同时可以设置很多检查项。


WINDBG常用方法的更多相关文章
- WinDbg分析Dump常用方法和命令
记录下自己使用WinDbg分析Dump时常用的一些方法和命令 !analyze -v //找出出错的堆 .exrc //找到程序崩溃的位置 !heap //打印出错函数的局部位置 !for_each_ ...
- windbg .net 程序的死锁检测 常用方法(个人备份笔记)
//死锁检测 .load sosex.dll :> !dlk :> !mk -a The mk command displays a call stack of the currently ...
- 用windbg+sos找出程序中谁占用内存过高,谁占用CPU过高(转载)
原文地址: http://www.cnblogs.com/Lawson/archive/2011/01/23/1942692.html 很早看到windbg+sos方面的知识,一直没仔细学习,也许因为 ...
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
摘要 : NetExt中有两个比较常用的命令可以用来分析heap上面的对象. 一个是!wheap, 另外一个是!windex. !wheap 这个命令可以用于打印出heap structure信息. ...
- Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
摘要 : 本章节介绍NetExt常用的命令. 并且对SOS进行一些对比. NetExt的帮助 要想玩好NetExt, 入门就得看帮助. 看NetExt的帮助可以调用!whelp 命令. 这样hi列举出 ...
- Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍
摘要 : 在使用WINDBG做debugging的时候,需要一个好的工具帮助进行数据分析. 最常见的extension包括SOS, PSSCOR. NetExt则是另外一种提供了丰富命令功能的deb ...
- 前端开发:Javascript中的数组,常用方法解析
前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...
- Jquery元素选取、常用方法
一:常用的选择器:(李昌辉) 基本选择器 $("#myDiv") //匹配唯一的具有此id值的元素 $("div") //匹配指定名称的所有元素 $(" ...
随机推荐
- 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)
版权声明:本文由张宁原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/126547001488207964 来源:腾云阁 ht ...
- Java 中数据库连接池的比较
见 原文,现阶段建议使用 https://github.com/brettwooldridge/HikariCP
- 蒜厂年会|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)
样例输入: 3 1 -2 1 样例输出: 2 方法一: 将环形数组拆分成为普通数组,(通过搬运复制数据到尾部),再求前缀和,找出最大前缀和.因为枚举了每一个起点,所以最大连续和也一定出现在前缀和中.. ...
- vue前后分离---数据模拟
最近为在做CRM的前期工作,忙里偷闲写了个关于数据模拟方面的东西 主要是现在博客中满天都再说前后分离,但是还没有几个实际操作的---让许多新手{-_-} 方法一: 启动一个express静态服务器-- ...
- Python学习之旅(九)
Python基础知识(8):集合 集合:由不同元素组成,无序的,不重复的序列 补充知识:可变类型:列表.字典:不可变类型:数字.字符串.元组 使用大括号{}或set()方法定义集合 se=set(&q ...
- Oracle的基本查询知识
基本语法 SELECT [DISTINCT] {*, column [alias],...} FROM table;参数说明SELECT 标识出所需的数据列.函数.常量和表达式.Distinct 删除 ...
- 实体框架—Entity Framework
简称EF,是微软以ADO.NET为基础所发展出来的对象关系对应(ORM)解决方案. EF就是用来处理数据的,与数据库打交道.但是底层还是用到了ADO.NET的那一套东西. 为什么叫对象关系对应解决方案 ...
- scrollview嵌套tableview
之前写过一次,忘记了, 用的通知 FS
- Elasticsearch学习笔记(二)Search API 与 Query DSL
一. Search API eg: GET /mall/product/_search?q=name:productName&sort=price desc 特点:search的请求参数都是以 ...
- SpringBoot-@RequestParam
Request参数 在访问各种各样网站时,经常会发现网站的URL的最后一部分形如:?xxxx=yyyy&zzzz=wwww.这就是HTTP协议中的Request参数,它有什么用呢?先来看一个例 ...