zoukankan      html  css  js  c++  java
  • windbg命令学习3

    3、进程与线程:

    既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息。调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺。

     

    3.1. 进程命令

    进程命令包括以下:显示进程列表、进程环境块、设置进程环境。

    多个命令可显示进程列表,但一般只能在特定情况下使用,它们是:|、.tlist、!process和!dml_proc

    • |  [进程号]

      请注意这里的定语:被调试进程列表。大多数情况下调试器中只有一个被调试进程,但可以通过.attach或者.create命令同时挂载或创建多个调试对象。当同时对多个进程调试时,进程号是从0开始的整数。下图中显示了两个被调试的进程。

    • .tlist [选项] [模块名]

          .tlist命令显示当前系统中的进程列表,他是目前唯一可在用户模式下显示系统当前进程列表的命令。它有两个可选项:-v显示进程详细信息,-c只显示当前进程信息。

      内核模式下同样可以使用.tlist,但更好的命令是!process。!process在内核模式下显示进程列表,和指定进程的详细信息,也能显示进程中的线程和调用栈内容

     

    3.2.线程命令

    命令“~”能够进行线程相关的操作。不带任何参数的情况下,它列出当前调试进程的线程。下图是计算器进程某时刻的线程列表:

    ||0:0:001> ~
    #  0  Id: f78.374 Suspend: 0 Teb: 000007ff`fffdc000 Unfrozen
    .  1  Id: f78.fb0 Suspend: 0 Teb: 000007ff`fffda000 Unfrozen
       2  Id: f78.a4c Suspend: 0 Teb: 000007ff`fffd8000 Unfrozen
       3  Id: f78.22c8 Suspend: 0 Teb: 000007ff`fff9a000 Unfrozen
       4  Id: f78.2658 Suspend: 0 Teb: 000007ff`fffd4000 Unfrozen
       5  Id: f78.cbc Suspend: 0 Teb: 000007ff`fff96000 Unfrozen
       6  Id: f78.21ec Suspend: 0 Teb: 000007ff`fffd6000 Unfrozen
    使用此命令可进行的线程操作包括:线程切换、线程环境、线程时间等

    线程遍历

    仍然是~命令。它除了能够作为线程列表命令外,还可用来对线程进行遍历,并执行指定命令。只需借助通配符“*”即可。如:

    • ~*k
    显示所有线程栈信息(此命令意指:对所有线程执行k指令)。下图中,当前进程共包含两个线程,显示了这两个线程各自的栈信息:

    其他有用的遍历指令包括:

    
    
    • ~*r

    显示线程寄存器信息。

    • ~*e
    
    

    上面的e是execute(执行)的缩写,后可跟一个或多个Windbg命令。它遍历线程并对每个线程执行指定命令,如:

    
    
    • ~*e  k;r
    
    

    此命令意为:在所用线程环境中(~*),分别执行(e)栈指令(k)和寄存器指令(r)。

    
    

    线程时间

    在软件调试的时候,若发现某线程占用执行时间过多,就需要当心是否有问题。线程执行时间的多少,其实就是占用CPU执行工作的时间多少。某线程占用越多,此长彼消,则系统中其它线程占用CPU的时间就越少。

    线程的时间信息包括三个方面:自创建之初到现在的总消耗时间、用户模式执行时间、内核模式执行时间。需注意的是,消耗时间一定会远远大于用户时间+内核时间,多出来的是大量空闲时间(为Idle进程占用)。使用下面的命令查看线程时间:

    
    
    • .ttime
    • !runaway 7
    
    

    在!runaway命令中加入标志值7,将显示线程的全部三种时间值。

    
    

    这两个命令的区别之处是,.ttime只能显示当前线程的时间信息,!runaway能显示当前进程的所有线程时间。下图是这两个命令的使用情况:

    0:009> .ttime
    Created: Wed Aug  7 16:47:29.011 2013 (UTC + 8:00)
    Kernel:  0 days 0:00:00.031
    User:    0 days 0:00:00.046
    0:009> !runaway 7
     User Mode Time
      Thread       Time
       2:604       0 days 0:00:51.729
       4:600       0 days 0:00:47.159
       0:4f4       0 days 0:00:00.031
       3:61c       0 days 0:00:00.000
       1:5e0       0 days 0:00:00.000
     Kernel Mode Time
      Thread       Time
       4:600       0 days 0:13:45.073
       2:604       0 days 0:08:44.100
       3:61c       0 days 0:00:00.000
       1:5e0       0 days 0:00:00.000
       0:4f4       0 days 0:00:00.000
     Elapsed Time
      Thread       Time
       0:4f4       16 days 0:14:02.254
       4:600       16 days 0:14:02.207
       3:61c       16 days 0:14:02.207
       2:604       16 days 0:14:02.207
       1:5e0       16 days 0:14:02.207

                对上二图进行对比,能看出两个命令之间的功能差异。

     

     

  • 相关阅读:
    数据库连接字符串
    搭建消息队列
    Linux---江湖
    Bundle压缩JS和CSS
    DDD分层架构之仓储
    UI控件库
    图解Http协议 url长度限制
    JAVA jdbc(数据库连接池)学习笔记(转)
    领域驱动设计(DDD)部分核心概念的个人理解(转)
    怎样的中奖算法能让人信服(转)
  • 原文地址:https://www.cnblogs.com/yu2000/p/4086519.html
Copyright © 2011-2022 走看看