Re: 如何在surface上面开启内核调试选项呢

Windows内核调试

如何在surface上面开启内核调试选项呢


悬崖遛马 2015-01-23, 14:02 下午
雷老师以及各位大侠,
 
    最近在替换项目中的一个属性控件,功能差不多了,桌面上运行也没有大的问题, 拿到surface上面测试时发现某种case下程序挂死。

    首先从树上进行操作后会呼叫出一个窗体(MDI),进行操作后会从该窗体唤起另一个进程。这个唤起新进程的动作时而就会挂死。

    经过反复测试,发现如果使用鼠标以及触摸屏操作均没有问题,只是如果使用surface的触摸笔操作时就会出现问题。

    抓取dump发现主程序hang在
   

     0018e6f8 7505ea7f 00000002 0018e8a4 00000001 ntdll_77570000!ZwWaitForMultipleObjects+0xc (FPO: [5,0,0])
      184 0018e87c 7520c2a0 0018e854 0018e8a4 00000000 KERNELBASE!WaitForMultipleObjectsEx+0xdc (FPO: [SEH])
       58 0018e8d4 75e3c1db 00000000 0018e92c 000003e8 user32!MsgWaitForMultipleObjectsEx+0x159 (FPO: [Non-Fpo])
       38 0018e90c 75e3b438 0018e92c 00000001 0018e930 combase!CCliModalLoop::BlockFn+0x101 (FPO: [Non-Fpo]) (CONV: thiscall) [d:\blue_gdr\com\combase\dcomrem\callctrl.cxx @ 1571]
       28 0018e934 75f04e2f ffffffff 0065716c 0018ebdc combase!ClassicSTAThreadDispatchCrossApartmentCall+0x133 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\blue_gdr\com\combase\dcomrem\chancont.cxx @ 276]
      150 0018ea84 75e3c6ac 006bfd34 0018ebdc 0018ebc4 combase!CRpcChannelBuffer::SendReceive2+0x631 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\blue_gdr\com\combase\dcomrem\channelb.cxx @ 4796]
       c0 0018eb44 75e03b8f 006bfd34 0018ebdc 0018ebc4 combase!ClassicSTAThreadSendReceive+0x209 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\blue_gdr\com\combase\dcomrem\callctrl.cxx @ 696]
       5c 0018eba0 75f014a5 006bfd34 0018ebdc 0018ebc4 combase!CCtxComChnl::SendReceive+0xf9 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\blue_gdr\com\combase\dcomrem\ctxchnl.cxx @ 790]
       18 0018ebb8 75d5470c 0069e854 0018ec08 75dcef05 combase!NdrExtpProxySendReceive+0x42 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\blue_gdr\com\combase\ndr\ndrole\proxy.cxx @ 2017]
        c 0018ebc4 75dcef05 682c951a 0018f0d4 0018f038 rpcrt4!NdrpProxySendReceive+0xe (FPO: [0,0,0])
      440 0018f004 75f01a1e 02256448 02255316 0018f038 rpcrt4!NdrClientCall2+0x2d6 (FPO: [SEH])
       1c 0018f020 75e03a83 0000001c 0000000e 0018f0f0 combase!ObjectStublessClient+0x6b (FPO: [Non-Fpo]) (CONV: stdcall) [d:\blue_gdr\com\combase\ndr\ndrole\i386\stblsclt.cxx @ 215]
       10 0018f030 051cae1c 0069e854 00000000 073fdbb8 combase!ObjectStubless+0xf [d:\blue_gdr\com\combase\ndr\ndrole\i386\stubless.asm @ 171]      

      网上找相应案例可能是由于新的控件为STA模型,而没有进行pumpmessage导致新的弹出窗体消息无法被处理,最终导致挂死。

那么问题来了,
     1. surface pen 与普通手指触摸不同,肯定有自己的驱动,我需要调试下我呼叫新程序时发生了什么?
     2. 在surface上安装windbg,尝试启用内核调试选项失败,被告知由于“该值受安全引导策略保护,无法进行修改或删除",所以 bcdedit -debug on 运行失败
    
     请问,如何才能在surfaces上进行调试呢?

     还有请各位帮忙分析下以上问题可能出现在什么地方,

不胜感激

Re: 如何在surface上面开启内核调试选项呢


格蠹老雷 2015-01-23, 16:14 下午
感觉这样的问题,调试用户态就够了,贴出来的栈回溯(0号线程的??)不完整,看不出RPC的发起者;建议还是仔细分析用户态的dump

Re: 如何在surface上面开启内核调试选项呢


悬崖遛马 2015-01-26, 09:41 上午
当时因为只有用surface的笔操作的时候才有问题,用手触摸屏幕和鼠标操作都正常

回头多看看用户态栈,

多谢雷老师

Powered by Community Server Powered by CnForums.Net