Windbg是windows平台上强大的调试器,它相对于其他常见的IDE集成的调试器有几个重要的优势,

  1. Windbg可以做内核态调试
  2. Windbg可以脱离源代码进行调试
  3. Windbg可以用来分析dump文件
  4. Windbg支持丰富的调试扩展

以下是一些windbg安装和使用相关的文档,

接下来我们会通过一系列的文章介绍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的更多相关文章

  1. 基础调试命令 - wt (watch and trace)

    本文介绍windbg动态调试过程中一个非常有用的命令,wt的用法. wt命令 wt命令之所以称为wt是因为它是watch and trace的简称,即用来观察和跟踪的命令.这个命令一般用在动态调试而不 ...

  2. 基础调试命令 - u/ub/uf

    在调试过程中难免会遇到需要反编译代码来分析逻辑的时候,在windbg中,需要反编译代码就要用到u/ub/uf这三个命令.本文这里分别介绍这三个命令各自的用途. 以下是一个quick sort的实例代码 ...

  3. gdb常用的调试命令

    首先将源代码编译.链接生成debug版本的可执行文件,然后通过‘gdb  debug版本的可执行文件名’进入调试模式. a) 单进程.单线程基础调试命令 l    显示main函数所在的文件的源代码 ...

  4. WinDBG 调试命令大全

    转载收藏于:http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html  #调试命令窗口 ++++++++++++++++++++++++ ...

  5. Windbg调试命令详解

    作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...

  6. WinDbg调试命令汇总

    一. 1. !address eax 查看对应内存页的属性 2. vertarget 显示当前进程的大致信息 3 !peb 显示process Environment Block 4. lmvm 可以 ...

  7. Windbg调试命令详解(3)

    3 进程与线程 既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 3.1 进程命令 进程命令包括这些内容:显示进程 ...

  8. gdb各种调试命令和技巧

    陈皓:用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台 ...

  9. GDB调试命令小结

    1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...

随机推荐

  1. XAF学习笔记之-多表头设计

    空闲之余,看了下全英文的DEV 的XAF帮助文档,一半的英文我认识他,一半的英文他认识我,反正拆开成26个字母我全认识 不那么啰嗦了,先看效果 如何做:分以下几步 第一步:打开这个文件,这个文件就是X ...

  2. [php-src]Php扩展的内存泄漏处理思路

    内容均以php5.6.14为例. 一. 封装函数时产生 memory leaks. [weichen@localhost www]$ php .php [,] [Tue Jul :: ] Script ...

  3. TCP/IP协议和HTTP协议 浩哥指教

    TCP和IP在HTTP协议的上层,HTTP算是应用层,IP协议建立的是电脑跟电脑之间的联系,具体过程是,物理上,通过网线,解析MAC地址,到达路由,路由告诉数据将要去哪里,对方电脑通过NDS解析,解析 ...

  4. HTML5新增的属性

    关于html5新增的属性: HTML5现在已经不是SGML的子集,主要是增加了关于图像,位置,存储,多任务等功能. 绘画CANVAS; 用于播放媒体的video和audio元素: 本地离线存储loca ...

  5. 设计模型MVC和JavaBean

    六.设计模型1和设计模型2(MVC)1.模型1:JSP+JavaBean2.模型2:MVC M:Model模型 JavaBean V:视图 JSP C:控制器 Servlet 七.模型1开发一个简单的 ...

  6. Sql日期时间格式转换

    sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...

  7. Http请求中Content-Type讲解以及在Spring MVC中的应用

    引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...

  8. 开博了,hello world

    hello  world     hello  world    hello  world     hello  world   hello  world     hello  world    he ...

  9. c#下调用dll动态链接库[转]

    C# 调用传统的 API 动态链接库,是.NET开发经常被讨论的问题. 比如有这么一个动态链接库(delphi 语言): library DelphiDLL; uses SysUtils, Class ...

  10. lua 自己编译源文件

    ,下载源代码 http://www.lua.org/download.html 直接下载source ,vs2010新建win32项目 应用程序设置中设成静态库 ,将.c(除去lua.c)和.h文件加 ...