基础调试命令 - .dump/.dumpcap/.writemem/!runaway
Windbg是windows平台上强大的调试器,它相对于其他常见的IDE集成的调试器有几个重要的优势,
- Windbg可以做内核态调试
- Windbg可以脱离源代码进行调试
- Windbg可以用来分析dump文件
- Windbg支持丰富的调试扩展
以下是一些windbg安装和使用相关的文档,
- Installing and Configuring WinDbg (Windows Debug Tools)
- Windbg Tutorials
- Debugging Using Windbg (msdn)
- Windbg (wikipedia)
接下来我们会通过一系列的文章介绍windbg常用的调试命令的应用场景和基本用法,本文作为开始主要介绍命令.dump,.dumpcap,.writemem和!runaway的用法。
.dump命令
.dump命令可以帮助我们从一个运行的程序创建一个dump(扩展名.dmp)文件,然后将该文件拿到其他机器上进行分析。这在已经投入使用的生产环境中的程序调试非常有用,因为我们要在保证生产环境中的程序不受调试行为影响。
如果你运行.dump /?可以看到该命令提供了很多选项,一般情况下我们需要有关该被调试进程的所有信息,可以通过以下命令来创建dump文件。
0:000> .dump /ma c:\userdump.dmp
这个命令创建的dump包含了该进程的内存数据,句柄数据,未加载模块数据,线程时间信息。最终可以将生成的dmp文件转移到调试机上,该调试机上只要同样安装了windbg就可以进行相应的调试分析。
.dumpcab命令
多数情况下通过dump调试需要生产环境中运行模块对应版本的调试数据库文件(扩展名.pdb),如果涉及到微软开发的模块如.ntdll,user32.dll等,可以通过配置微软的symbol服务器来加载相应的symbol文件,但是如果涉及到的模块为其他开发方,并且该模块对应的symbol文件存在于生产环境或者其他环境中,那么我们可以将dump在该环境中通过windbg打开,配置好这些私有的symbol路径,然后运行.dumpcab命令将dump文件以及symbol文件一起打包,然后再拿到调试机上进行调试。
微软的symbol服务器路径配置
SRV*your local symbol folder*http://msdl.microsoft.com/download/symbols
.dumpcab命令需要在打开dump文件时运行,
0:000> .dumpcab -a fulldump
Creating a cab file can take a VERY VERY long time
.Ctrl-C can only interrupt the command after a file has been added to the cab.
Adding C:\dump.dmp - added
Adding c:\fibo.pdb - added
Wrote fulldump
打开该cab文件可以看到里面包含了dump文件以及对应的private symbol
接下来我们就可以在调试机上调试问题了。
.writemem命令
.writemem命令允许我们将内存或dump中的内容存成文件。这个命令经常用在我们希望通过其他工具来查看dump中加载的文件,比如我们想通过反汇编工具查看某些模块代码,或者希望打开内存中加载的文件查看其中的具体内容。
例如以下实例中,通过lm命令列出内存中加载的模块列表,然后通过.writemem命令将其中的模块存成文件。
0:000> lm
start end module name
010a0000 01124000 fibo C (private pdb symbols)
75270000 753a0000 kernel32 (deferred)
754a0000 75546000 KERNELBASE (deferred)
774a0000 775f7000 ntdll (export symbols) ntdll.dll
0:000> ? 01124000-010a0000
Evaluate expression: 540672 = 00084000
0:000> .writemem c:\fibo.exe 010a0000 L 00084000
Writing 84000 bytes........................................................................................................................................................................................................................................................................
0:000> .writemem c:\fibo.exe 010a0000 (01124000-0x1)
Writing 84000 bytes........................................................................................................................................................................................................................................................................
.writemem可以通过以上两种方式存储文件,第一种是指定起始地址和长度,第二种是指定其实和终止地址。
!runaway命令
!runaway是一个用来查看各个线程在用户态和内核态占用cpu时钟信息的命令,经常应用在查看高CPU使用率问题中,以下是runaway命令的输出实例,我们可以看到线程2:12a0占用CPU最长时间,当我们遇到高CPU使用率问题的时候,可以通过隔段时间抓取多组dump的方式然后查看各个线程在不同dump中runaway输出信息,从而找出占用cpu最多的线程。
0:026> !runaway
User Mode Time
Thread Time
2:12a0 0 days 0:04:26.668
10:24fc 0 days 0:00:04.711
15:25b8 0 days 0:00:03.010
9:888 0 days 0:00:02.870
14:25b4 0 days 0:00:01.185
8:1c9c 0 days 0:00:00.639
11:1350 0 days 0:00:00.624
13:9d0 0 days 0:00:00.483
7:2758 0 days 0:00:00.327
1:27f4 0 days 0:00:00.296
3:26b0 0 days 0:00:00.109
21:740 0 days 0:00:00.062
17:cd0 0 days 0:00:00.031
24:158 0 days 0:00:00.015
0:1de0 0 days 0:00:00.015
26:25c8 0 days 0:00:00.000
25:2f0 0 days 0:00:00.000
23:b08 0 days 0:00:00.000
22:2584 0 days 0:00:00.000
20:26c0 0 days 0:00:00.000
19:1a78 0 days 0:00:00.000
18:1228 0 days 0:00:00.000
16:1c34 0 days 0:00:00.000
12:724 0 days 0:00:00.000
6:17b0 0 days 0:00:00.000
5:fb8 0 days 0:00:00.000
4:277c 0 days 0:00:00.000
如果你希望看到内核态对应的cpu使用率,可以加上相应的flag如下,
0:028> !runaway ff
User Mode Time
Thread Time
2:12a0 0 days 0:04:46.230
10:24fc 0 days 0:00:04.711
15:25b8 0 days 0:00:03.088
9:888 0 days 0:00:03.057
14:25b4 0 days 0:00:01.248
8:1c9c 0 days 0:00:00.639
11:1350 0 days 0:00:00.624
13:9d0 0 days 0:00:00.483
7:2758 0 days 0:00:00.343
1:27f4 0 days 0:00:00.296
3:26b0 0 days 0:00:00.109
21:740 0 days 0:00:00.078
23:158 0 days 0:00:00.062
17:cd0 0 days 0:00:00.031
27:274c 0 days 0:00:00.015
0:1de0 0 days 0:00:00.015
28:2124 0 days 0:00:00.000
26:f98 0 days 0:00:00.000
25:15c 0 days 0:00:00.000
24:2f0 0 days 0:00:00.000
22:2584 0 days 0:00:00.000
20:26c0 0 days 0:00:00.000
19:1a78 0 days 0:00:00.000
18:1228 0 days 0:00:00.000
16:1c34 0 days 0:00:00.000
12:724 0 days 0:00:00.000
6:17b0 0 days 0:00:00.000
5:fb8 0 days 0:00:00.000
4:277c 0 days 0:00:00.000
Kernel Mode Time
Thread Time
2:12a0 0 days 0:01:04.615
15:25b8 0 days 0:00:04.165
14:25b4 0 days 0:00:01.716
13:9d0 0 days 0:00:00.390
8:1c9c 0 days 0:00:00.280
11:1350 0 days 0:00:00.171
10:24fc 0 days 0:00:00.156
7:2758 0 days 0:00:00.156
3:26b0 0 days 0:00:00.140
23:158 0 days 0:00:00.046
9:888 0 days 0:00:00.046
1:27f4 0 days 0:00:00.046
21:740 0 days 0:00:00.031
19:1a78 0 days 0:00:00.031
24:2f0 0 days 0:00:00.015
17:cd0 0 days 0:00:00.015
0:1de0 0 days 0:00:00.015
28:2124 0 days 0:00:00.000
27:274c 0 days 0:00:00.000
26:f98 0 days 0:00:00.000
25:15c 0 days 0:00:00.000
22:2584 0 days 0:00:00.000
20:26c0 0 days 0:00:00.000
18:1228 0 days 0:00:00.000
16:1c34 0 days 0:00:00.000
12:724 0 days 0:00:00.000
6:17b0 0 days 0:00:00.000
5:fb8 0 days 0:00:00.000
4:277c 0 days 0:00:00.000
希望以上内容对您有所帮助
Aaron Zhang
基础调试命令 - .dump/.dumpcap/.writemem/!runaway的更多相关文章
- 基础调试命令 - wt (watch and trace)
本文介绍windbg动态调试过程中一个非常有用的命令,wt的用法. wt命令 wt命令之所以称为wt是因为它是watch and trace的简称,即用来观察和跟踪的命令.这个命令一般用在动态调试而不 ...
- 基础调试命令 - u/ub/uf
在调试过程中难免会遇到需要反编译代码来分析逻辑的时候,在windbg中,需要反编译代码就要用到u/ub/uf这三个命令.本文这里分别介绍这三个命令各自的用途. 以下是一个quick sort的实例代码 ...
- gdb常用的调试命令
首先将源代码编译.链接生成debug版本的可执行文件,然后通过‘gdb debug版本的可执行文件名’进入调试模式. a) 单进程.单线程基础调试命令 l 显示main函数所在的文件的源代码 ...
- WinDBG 调试命令大全
转载收藏于:http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html #调试命令窗口 ++++++++++++++++++++++++ ...
- Windbg调试命令详解
作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...
- WinDbg调试命令汇总
一. 1. !address eax 查看对应内存页的属性 2. vertarget 显示当前进程的大致信息 3 !peb 显示process Environment Block 4. lmvm 可以 ...
- Windbg调试命令详解(3)
3 进程与线程 既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 3.1 进程命令 进程命令包括这些内容:显示进程 ...
- gdb各种调试命令和技巧
陈皓:用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台 ...
- GDB调试命令小结
1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...
随机推荐
- 122. Best Time to Buy and Sell Stock(二) leetcode解题笔记
122. Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price ...
- ngnix 502 bad gateway 的解决办法之空间满了
网站一直运行都很正常,但某天登录后台却出现502 bad gateway,上网搜索都是一大堆解决办法,没可操作性.网站难道出现安全问题?这个应该很少概率.最后排查发现空间满了. 使用命令:df -hl ...
- 如何用VB.Net创建一个三层的数据库应用程序
[b]1.[/b][b]概论:[/b] 本文将介绍如何创建一个三层应用程序,并且将介绍如何创建一个Web Service服务. ADO.NET创建Windows三层结构应用程序的体系架构如下图所示: ...
- linux下搭建nagios
配置环境:1)CentOS 6.5 作为监控主机,IP:10.0.0.30(根据自己公司需要改变) 2)客户机: windows server 2008R2 , windows 7, windows ...
- 启动tomcat时遇到的问题
1.当启动Tomcat时,出现了如下信息: The APR based Apache Tomcat Native library which allows optimal performance in ...
- Oracle case when的用法
select xm,sex,(case sex when '男' then '1' when '女' then '2' end ) as xb, birthdayfrom student
- maven 搜索不到想从本地仓库依赖的jar包--重建本地maven仓库索引
问题:有时候本地仓库有相关的jar包,但是在pom.xml中利用工具搜索不到 菜单栏设置显示Maven Respositorise视图:Windows--Show View--Other.. (对 ...
- ASP.NET Web服务调用发生错误,错误代码404
现象: iOS端使用ASIHTTP连接Web服务时,得到的数据是一个错误代码为404的页面,错误信息(web.config添加<customErrors mode="Off" ...
- Firebird数据库的Select语句
select first 10 skip 8 * from t_data //跳过前8行不要,取10行,即取第9行到18行共10行 select first 10 * from t_data ...
- 好玩儿的Game
1. 种类: 威佐夫游戏, Bash游戏, Nim游戏, 等. 2. 理论: 胜态一定可以通过某种策略走向必败态; 而必败态采取任何策略都将走向胜态. 用图论的话来说, 因为必败态只能走向胜态, 所以 ...