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. MySQL创建一个具有root权限的用户

    grant all privileges on *.* to 'user'@'host' identified by 'password' WITH GRANT OPTION MAX_QUERIES_ ...

  2. c语言打印空心菱形

    ***算法:把菱形的中心看成坐标的原点(,),由此可以知道,如果|x| + |y| <= n;则打印输出"*"号,否则打印输出" " int mai(){ ...

  3. max min 与 min max 的差别

    在求解最优化问题时,遇到一个对偶问题的转换:对于形如 的问题,可以转换为求解 即原问题的对偶问题.而在一般情况下: 对于这个为题的说明我参照http://math.stackexchange.com/ ...

  4. OpenCV 学习之路(1)

    OpenCV的第一个代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #i ...

  5. UnicodeEncodeError: 'ascii' codec can't encode characters in position问题的解决办法

    今天刚开始用ulipad写python代码 代码如下 #! /usr/bin/env python#coding=utf-8a = int(raw_input('请输入一个数:'))if a<1 ...

  6. 使用jailkit chroot更改ssh用户根目录

    安装jailkit cd /tmp    wget http://olivier.sessink.nl/jailkit/jailkit-2.16.tar.gz    tar xzf jailkit-2 ...

  7. Git很好的教程

    本文地址:http://www.cnblogs.com/yhLinux/p/4067064.html 很好的Git教程,作为初学者,跟着作者的教程走了一遍之后,基本熟悉了Git的常用操作,此教程简洁明 ...

  8. jboss 7 启动问题

    19:30:50,176 INFO [org.jboss.modules] JBoss Modules version 1.1.1.GA19:30:50,458 INFO [org.jboss.msc ...

  9. Mini projects #3 ---- Stopwatch: The Game

    课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...

  10. middleware - bodyparser

    express4之前,bodyparser是express下的一个对象. express4把bodyparser分离出来. 本文中的实例基于以下的这个请求 $.ajax({ url: '/save', ...