13.windbg-!runaway、~、|(控制进程、线程切换)
来源:互联网 发布:粘土动画制作软件 编辑:程序博客网 时间:2024/04/28 15:55
!runaway
!runaway命令显示每个线程消费的时间
Bit 0 (0x1) 让调试器显示每个线程消耗的用户模式时间(user time),默认不加就是0x1
- Bit 1 (0x2) 显示每个线程消耗的内核时间(kernel time)。
- Bit 2 (0x4) 显示每个线程从创建开始经历了多少时间。
- 就是三者的组合:1 2 3 4 5 6 7
0:002> !runaway User Mode Time Thread Time 0:890 0 days 0:00:00.031 2:a00 0 days 0:00:00.000 1:1174 0 days 0:00:00.0000:002> !runaway 1 User Mode Time Thread Time 0:890 0 days 0:00:00.031 2:a00 0 days 0:00:00.000 1:1174 0 days 0:00:00.0000:002> !runaway 2 Kernel Mode Time Thread Time 0:890 0 days 0:00:00.062 2:a00 0 days 0:00:00.000 1:1174 0 days 0:00:00.0000:002> !runaway 3 User Mode Time Thread Time 0:890 0 days 0:00:00.031 2:a00 0 days 0:00:00.000 1:1174 0 days 0:00:00.000 Kernel Mode Time Thread Time 0:890 0 days 0:00:00.062 2:a00 0 days 0:00:00.000 1:1174 0 days 0:00:00.0000:002> !runaway 4 Elapsed Time Thread Time 0:890 0 days 0:38:34.825 1:1174 0 days 0:38:34.793 2:a00 0 days 0:38:24.5280:002> !runaway 7 User Mode Time Thread Time 0:890 0 days 0:00:00.031 2:a00 0 days 0:00:00.000 1:1174 0 days 0:00:00.000 Kernel Mode Time Thread Time 0:890 0 days 0:00:00.062 2:a00 0 days 0:00:00.000 1:1174 0 days 0:00:00.000 Elapsed Time Thread Time 0:890 0 days 0:38:41.825 1:1174 0 days 0:38:41.793 2:a00 0 days 0:38:31.528
该扩展命令可以用来快速找出哪些线程循环失去控制消耗了太多CPU时间。输出中以调试器的内部线程号和16进制线程ID来标识每个线程。还会显示调试器ID,当然,主要用于分析dump文件
~ (Thread Status)
波形符(~) 命令显示指定线程或当前进程中的所有线程的信息
0:002> ~ 0 Id: 433c.4154 Suspend: 1 Teb: 7efdd000 Unfrozen 1 Id: 433c.33e4 Suspend: 1 Teb: 7efda000 Unfrozen. 2 Id: 433c.c50 Suspend: 1 Teb: 7efd7000 Unfrozen0:002> ~* ///<显示线程和入口函数 0 Id: 433c.4154 Suspend: 1 Teb: 7efdd000 Unfrozen Start: test1!ILT+120(_wmainCRTStartup) (00a6107d) Priority: 0 Priority class: 32 Affinity: f 1 Id: 433c.33e4 Suspend: 1 Teb: 7efda000 Unfrozen Start: test1!ILT+35(?ThreadProcYAKPAXZ) (00a61028) Priority: 0 Priority class: 32 Affinity: f. 2 Id: 433c.c50 Suspend: 1 Teb: 7efd7000 Unfrozen Start: ntdll!DbgUiRemoteBreakin (77e6fb5a) Priority: 0 Priority class: 32 Affinity: f0:002> ~0 0 Id: 433c.4154 Suspend: 1 Teb: 7efdd000 Unfrozen Start: test1!ILT+120(_wmainCRTStartup) (00a6107d) Priority: 0 Priority class: 32 Affinity: f0:002> ~0s ///<切换线程eax=00000000 ebx=0044f5e4 ecx=00000006 edx=00000000 esi=00000003 edi=71b16740eip=76c07cb0 esp=0044f494 ebp=0044f51c iopl=0 nv up ei pl zr na pe nc
我们可以发现,~和~*还是有点区别的,~*会把入口函数和优先级都打印出来
//暂停、恢复线程----------------------------------------------------------------------------------------------------
0 Id: 433c.4154 Suspend: 1 Teb: 7efdd000 Unfrozen意思是0号线程,进程ID为433c,线程ID为4154,暂停数为1,未冻结状态,每个线程都包含了一个暂停计数(Suspend Count),以及一个冻结/解冻(Frozen/Unfrozen)的状态。
暂停计数由Windows内核使用的值,可以通过SuspendThread和ResumeThread这两个系统函数来控制的,核心编程里说一个线程创建时,暂停次数为1,
当线程完全初始化后,系统就要查看CREATE_SUSPEND标志是否已经传递给CreateThread。如果该标志没有传递,系统便将线程的暂停计数递减为0,
该线程可以调度到一个进程中
也可以用~<tid>n增加暂停计数,用~<tid>m减少暂停计数,如下:
0:001> ~1n0:001> ~1. 1 Id: 433c.33e4 Suspend: 2 Teb: 7efda000 Unfrozen Start: test1!ILT+35(?ThreadProcYAKPAXZ) (00a61028) Priority: 0 Priority class: 32 Affinity: f0:001> g
此时g运行,会发现1号线程被暂停了,必须使用~1m来恢复冻结状态是调试器的状态,在window操作系统中是不支持这个概念,对于每个被冻结的线程,调试器将记住这个状态,并且在调试事件被处理之前增加线程的挂起计数,当调试事件被处理完毕时,挂起计数将被递减,对应的命令为:
冻结~<tid>f
解冻~<tid>u
冻结命令数量必须和解冻命令数量相等
| (Process Status)
这个在多进程切换时比较有效:先模拟一个多进程调试:
windbg先打开test1
再附加到test2上:
0:002> | ///< <span style="font-family: 'Courier New', Courier, mono;">查看总进程列表,目前只有一个</span>. 0id: 433ccreatename: test1.exe0:002> .attach 0n7860 ///< 附加test2Attach will occur on next execution0:002> g ///< 运行*** wait with pending attachSymbol search path is: srv*Executable search path is: ModLoad: 00300000 0031b000 D:\windbg\test2\Debug\test2.exeModLoad: 77dd0000 77f50000 C:\Windows\SysWOW64\ntdll.dlleax=7efda000 ebx=00000000 ecx=00000000 edx=77e6fb5a esi=00000000 edi=00000000eip=77de000c esp=0079fe54 ebp=0079fe80 iopl=0 nv up ei pl zr na pe nccs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246ntdll!DbgBreakPoint:77de000c cc int 31:004> |<span style="white-space:pre"></span> ///< 再次查看总进程列表,目前已有两个 0id: 433ccreatename: test1.exe. 1id: 1eb4attachname: D:\windbg\test2\Debug\test2.exe
和线程切换相同:使用:1:004> |0s
切换回0号进程
- 13.windbg-!runaway、~、|(控制进程、线程切换)
- windbg的!runaway命令
- 66.windbg-.process切换进程(内核)
- windbg-.process切换进程
- windbg调试命令7(!runaway、~)
- windbg调试命令7(!runaway、~)
- 切换进程 切换线程
- 线程上下文切换与进程上下文切换
- windbg调试内核函数线程间切换问题
- windbg调试内核函数线程间切换问题
- WinDBG 技巧:显示进程/线程环境参数(!peb 和 !teb 命令)
- Linux进程线程学习笔记:进程控制
- 多线程切换以及线程进程之间关系
- 多线程切换以及线程进程之间关系
- 进程、线程 :系统资源 与 上下文切换
- 65.windbg-!process显示进程(内核)
- 操作系统之进程与线程3——内核级线程及切换(未完成)
- 线程上下文切换和进程上下文切换的区别
- 使用VC6.0实现窗口的任意分割(2)
- perl exec管道和子进程
- Debug 和 Release区别
- Invalidate()与UpdateAllViews
- 0欧电阻作用
- 13.windbg-!runaway、~、|(控制进程、线程切换)
- OSCache简介
- mysql explain详解
- TTL和COMS
- Nginx + https + 免费SSL证书配置指南
- SQL中char、varchar、text和nchar、nvarchar、ntext的区别
- CMOS与TTL电路的区别
- OnInitUpdate、OnUpdate、OnDraw与OnPaint!
- Spring MVC 入门