Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

WinDbg

帖子发起人: 井底之蛙   发起时间: 2009-05-06 16:15 下午   回复: 6

Print Search
帖子排序:    
   2009-05-06, 16:15 下午
better0332 离线,最后访问时间: 2009/6/29 13:20:47 井底之蛙

发帖数前75位
注册: 2008-12-03
发 贴: 15
多CPU下的调试
Reply Quote
我想问一下,用windbg调试多CPU的机器时,当系统被断下时,那些CPU的状态。一个在无限等待WinDBG的回复,其它的都在运行其它程序吗?
IP 地址: 已记录   报告
   2009-05-06, 17:35 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 多CPU下的调试
Reply Quote

双机调试,如果系统被断下,所有核“凝固”。

下面是我机器的输出:

1: kd> ln KiProcessorBlock
(8055c580)   nt!KiProcessorBlock   |  (8055c600)   nt!KiFreezeFlag
Exact matches:
    nt!KiProcessorBlock = <no type information>

1: kd> dd KiProcessorBlock
8055c580  ffdff120 f78b2120 00000000 00000000
8055c590  00000000 00000000 00000000 00000000
8055c5a0  00000000 00000000 00000000 00000000

1: kd> dt nt!_KPRCB 0xffdff120
   +0x000 MinorVersion     : 1
   +0x002 MajorVersion     : 1
   +0x004 CurrentThread    : 0x8055be40 _KTHREAD
   +0x008 NextThread       : (null)
   +0x00c IdleThread       : 0x8055be40 _KTHREAD
   +0x010 Number           : 0 ''
   +0x011 Reserved         : 0 ''
   +0x012 BuildType        : 0
   +0x014 SetMember        : 1
   +0x018 CpuType          : 6 ''
   +0x019 CpuID            : 1 ''
   ......

1: kd> dt nt!_KPRCB f78b2120
   +0x000 MinorVersion     : 1
   +0x002 MajorVersion     : 1
   +0x004 CurrentThread    : 0x816aa830 _KTHREAD
   +0x008 NextThread       : (null)
   +0x00c IdleThread       : 0xf78b4e20 _KTHREAD
   +0x010 Number           : 1 ''
   +0x011 Reserved         : 0 ''
   +0x012 BuildType        : 0
   +0x014 SetMember        : 2
   +0x018 CpuType          : 6 ''
   +0x019 CpuID            : 1 ''
   ......

1: kd> !thread 0x8055be40
THREAD 8055be40  Cid 0.0  Teb: 00000000  Win32Thread: 00000001 RUNNING
IRP List:
unable to get IRP object
Not impersonating
Owning Process 8055c0a0
Wait Start TickCount    0             Elapsed Ticks: 6561
Context Switch Count    16922    NoStackSwap
UserTime                  9:03:58.0187
KernelTime                9:03:53.0812
Start Address 0x00000000
Stack Init 80551700 Current 8055144c Base 0 Limit 8054e700 Call 1
Priority 16 BasePriority 97 PriorityDecrement 0 DecrementCount 8
Kernel stack not resident.

ChildEBP RetAddr  Args to Child
80551450 80545d2c 00000000 0000000e 00000000 intelppm!AcpiC1Idle+0x12
80551454 00000000 0000000e 00000000 00000000 nt!KiIdleLoop+0x10

1: kd> !thread 0x816aa830
THREAD 816aa830  Cid 0.816aaa14  Teb: 7ffde000  Win32Thread: 00000003 RUNNING
Waiting for reply to LPC MessageId 816aaa2c:
Pending LPC Reply Message:
    816aaa2c: [816aaa2c,816aaa2c]
IRP List:
unable to get IRP object
Not impersonating
Owning Process 816686e8
Wait Start TickCount    -144696204 
Context Switch Count    844                   LargeStack
UserTime                 15:49:57.0937
KernelTime               15:49:53.0562
PerfCounter             1
Start Address 0x816837cc
Stack Init f5c93000 Current f5c92b7c Base 0 Limit f5c8f000 Call 3
Priority 15 BasePriority -96 PriorityDecrement 0 DecrementCount 25
Kernel stack not resident.

ChildEBP RetAddr  Args to Child
f5c92998 8052b6f1 00000001 f5c92d64 017ed514 nt!RtlpBreakWithStatusInstruction
f5c92be4 8052b878 8052b858 ffffffff 00000000 nt!vDbgPrintExWithPrefix+0x10f
f5c92c00 f58537f4 f58536d0 81794118 f5c92d64 nt!DbgPrint+0x1a
f5c92c34 f5b89c00 00000029 f5c92d2c f5c92c4c Basic!HookFunction41+0xb4
f5c92c68 f5b8ce8a 00000029 f5c92d2c f5c92c98 hookport!HpCallHookPortItem+0x70
f5c92d48 8054160c 00000000 00000000 017ed52c hookport!ProxyNtUserFindWindowEx+0x4a
f5c92d48 7c92eb94 00000000 00000000 017ed52c nt!KiFastCallEntry+0xfc
017ed4f4 77d1fce8 77d3f23a 00000000 00000000 ntdll!KiFastSystemCallRet
017ed53c 77d3f25a 00000000 00000000 773aff24 +0x77d1fce8
017ed558 77417d14 773aff24 00000000 017edd40 +0x77d3f25a
017ed950 77418ab8 00000001 017ed968 00010102 +0x77417d14
017edd24 00411cb1 00000001 017edd40 00d550d8 +0x77418ab8
017edd28 00000000 017edd40 00d550d8 000e00e3 +0x411cb1


这就是两个核上的“当前线程”,某线程调用栈上居然还有 MJ 同学的 hookport ... 呵呵


IP 地址: 已记录   报告
   2009-05-07, 00:11 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 多CPU下的调试
Reply Quote
这个问题问得很好,说明楼主思考的很深入。王宇的回答是真正的"simple answer",可以简单那么理解,但是实际上与事实不符^_^。肯定有一个核要工作来和调试器对话,这个核就是提示符提示的那个核。其它核处于所谓的冻结状态,在那里一直循环,一边等待解冻,同时还要时刻准备着变成冻结别人的FreezeOwner——也就是当在WinDBG中切换当前CPU时,“冻着”的要恢复出来,刚才活动的要“冻”起来......

IP 地址: 已记录   报告
   2009-05-07, 09:23 上午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 多CPU下的调试
Reply Quote
嘿嘿 我那个回答是简单了些 :P
IP 地址: 已记录   报告
   2009-05-07, 10:56 上午
better0332 离线,最后访问时间: 2009/6/29 13:20:47 井底之蛙

发帖数前75位
注册: 2008-12-03
发 贴: 15
Re: 多CPU下的调试
Reply Quote
谢谢了,但不知道其它cpu为什么会被冻住,是线程切换时像自旋锁一样‘旋’住了吗?
IP 地址: 已记录   报告
   2009-05-07, 12:30 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 多CPU下的调试
Reply Quote
处于冻结状态的CPU是在KiFreezeTargetExecution函数中执行,因为会反复执行pause指令,可以认为是处于比较省电的状态,关键的汇编代码如下:
 
nt!KiFreezeTargetExecution+0x145:
818dbeb1 and  dword ptr [esi+18F4h],0FFFFFFDFh
818dbeb8 mov  eax,dword ptr [nt!KiFreezeOwner (81928d34)]
818dbebd or   dword ptr [eax+18F4h],20h
818dbec4 pause
818dbec6 mov  eax,dword ptr [esi+18F4h]
818dbecc and  al,0Fh
818dbece cmp  al,2
818dbed0 je   nt!KiFreezeTargetExecution+0xf1 (818dbe5d)
相当于:
while( (Prcb->IpiFrozen & 0xF) == FROZEN /*0x2/* )
{
      if(Prcb->IpiFrozen&0x20)
      {
          <将当前处理器切换为活动处理器>
      }
     _pause
}
使用WinDBG的!ipi命令可以看各个CPU的状态:
 
0: kd> !ipi
IPI State for Processor 0
    TargetSet             0  PacketBarrier         0  IpiFrozen      24 [Active] [Freeze Owner]
    IpiFrame       818f1ca4  SignalDone     00000000  RequestSummary 0
    Packet State      Stale                           WorkerRoutine  nt!KiFlushProcessWriteBuffersTarget
    Parameter[0]   00000000  Parameter[1]   00000000  Parameter[2]   00000000
IPI State for Processor 1
    TargetSet             0  PacketBarrier         0  IpiFrozen      2 [Frozen]
    IpiFrame       83c04ca4  SignalDone     00000000  RequestSummary 0
    Packet State      Stale                           WorkerRoutine  nt!KiFlushProcessWriteBuffersTarget
    Parameter[0]   00000000  Parameter[1]   00000000  Parameter[2]   00000000
IPI State for Processor 2
    TargetSet             0  PacketBarrier         0  IpiFrozen      2 [Frozen]
    IpiFrame       83c49ca4  SignalDone     00000000  RequestSummary 0
    Packet State      Stale                           WorkerRoutine  nt!KiFlushTargetProcessTb
    Parameter[0]   00000000  Parameter[1]   00000000  Parameter[2]   00000000
IPI State for Processor 3
    TargetSet             0  PacketBarrier         0  IpiFrozen      2 [Frozen]
    IpiFrame       847b4ca4  SignalDone     00000000  RequestSummary 0
    Packet State      Stale                           WorkerRoutine  nt!KiFlushTargetSingleTb
    Parameter[0]   00000000  Parameter[1]   a0351000  Parameter[2]   00000000

IP 地址: 已记录   报告
   2009-05-08, 18:18 下午
better0332 离线,最后访问时间: 2009/6/29 13:20:47 井底之蛙

发帖数前75位
注册: 2008-12-03
发 贴: 15
Re: 多CPU下的调试
Reply Quote
谢谢Raymond老师,受益匪浅……
IP 地址: 已记录   报告
高端调试 » 软件调试 » WinDbg » 多CPU下的调试

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.