windbg 调试 r3 死循环

来源:互联网 发布:淘宝网中老年秋装外套 编辑:程序博客网 时间:2024/05/17 22:16

 

       这两天调试一程序,发现xp上cpu占用达到100%, win7上占用一直持续达到25%,程序没有挂,我猜想可能是存在死循环了,只好用windbg调调,附加进程断下来以后:

 

 

> ~ *kv   //查看所以线程栈

重点查看了下各线程模块的调用,仔细检查后竟然没发现什么问题.

 

> !runaway // !runaway命令查看各个线程的消耗程度。

 User Mode Time
  Thread       Time
   5:17c       0 days 0:02:47.373
   6:530       0 days 0:00:01.154
   4:188       0 days 0:00:01.123
   0:72c       0 days 0:00:00.031
   7:678       0 days 0:00:00.000
   3:738       0 days 0:00:00.000
   2:74c       0 days 0:00:00.000
   1:700       0 days 0:00:00.000

这个很明显,5:17c明显消耗cpu过多,如果差别不是很明显可以记录一下,让他连续运行断开后的!runaway结果各线程占用cpu的差值也会得到消耗cpu过多的线程我这个很明显就是5:17c线程有问题。

 

>~5 s //切换到17c线程空间

 

0:005> kv //查看线程栈
Child-SP          RetAddr           : Args to Child                                                           : Call Site
00000000`012ae238 00000000`7386bff7 : 00000000`01d4e628 00000000`01d4e640 00000000`737e2450 00000000`012aec40 : ntdll!ZwCreateFile+0xa
00000000`012ae240 00000000`7385cf87 : 00000000`01d4e628 00000000`00000000 00000000`00000000 00000000`00000060 : wow64!whNtCreateFile+0x10f
00000000`012ae310 00000000`737e2776 : 00000000`769d72cf 00000000`00000023 00000000`00000246 00000000`01d4dc18 : wow64!Wow64SystemServiceEx+0xd7
00000000`012aebd0 00000000`7385d07e : 00000000`00000000 00000000`737e1920 00000000`00000000 00000000`00000000 : wow64cpu!TurboDispatchJumpAddressEnd+0x2d
00000000`012aec90 00000000`7385c549 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : wow64!RunCpuSimulation+0xa
00000000`012aece0 00000000`77cde707 : 00000000`00000000 00000000`7efdf000 00000000`7ef91000 00000000`00000000 : wow64!Wow64LdrpInitialize+0x429
00000000`012af230 00000000`77c8c32e : 00000000`012af2f0 00000000`00000000 00000000`7efdf000 00000000`00000000 : ntdll! ?? ::FNODOBFM::`string'+0x29364
00000000`012af2a0 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe

 

上面的结果竟然看不出什么来~到这儿就很纠结了,不知道怎么下手了,先查看一下17c线程的详细信息

> ~ 5 
.  5  Id: 728.17c Suspend: 1 Teb: 7ef91000 Unfrozen
      Start: GetInfo!ILT+1410(?ProcMonThreadProcYGKPAXZ) (01354587)
      Priority: 15  Priority class: 32  Affinity: f

里面找到这个死循环的起始线程(?ProcMonThreadProcYGKPAXZ) (01354587)然后去找代码代相关代码,发现这个线程的调用代码实在是太多、太杂,一行行排太费时..到这作就有点痛苦了,要是他能像od一样下模块内存访问断点多好,可以直接断在我们模块的程序代码的执行处,或者查看指令执行跟踪也不错,也能定位到死循环位置。

另外不知道为什么挂到线程空间里面竟然没有显示完整的线程栈? 也没有异常发生,要是知道的同学告知下!

 

后来纠结了一点时间,一直按kv发泄,在想问为什么会这样,突然脑子里面想到,即然是在线程程空间里面了,那就f10单步执行呗,总能执行到我们的模块吧,接着就f10一直单步,确实回到了我们模块,最终定位到死循环。

 

找到位置就好了,接着就开始修复.....

 

 

 

 

 

 

0 0
原创粉丝点击