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

posted on 2013-07-13 12:06  微软互联网开发支持  阅读(3957)  评论(2编辑  收藏  举报