zoukankan      html  css  js  c++  java
  • Windbg是windows平台上强大的调试器

    基础调试命令 - .dump/.dumpcap/.writemem/!runaway

    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
    复制代码


     

    希望以上内容对您有所帮助

     
     
  • 相关阅读:
    Python中matplotlib模块的简单使用
    Python中numpy模块的简单使用
    TensorFlow入门(矩阵基础)
    TensorFlow入门(常量变量及其基本运算)
    计算机视觉入门
    菜得一P!
    Hdu2097 Sky数
    Hdu2099 整除的尾数
    Hdu2098 分拆素数和
    Linux下用Bash语言实现简单排序的功能
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3188868.html
Copyright © 2011-2022 走看看