当前位置: 首页 > news >正文

平邑网站制作买高端品牌网站

平邑网站制作,买高端品牌网站,曲靖模板网站建设,做网站用电脑自带的一#xff1a;背景 1. 讲故事 在分析旅程中#xff0c;总会有几例控制台的意外卡死导致的生产事故#xff0c;有经验的朋友都知道#xff0c;控制台卡死一般是动了 快速编辑窗口 的缘故#xff0c;截图如下#xff1a; 虽然知道缘由#xff0c;但一直没有时间探究底层…一背景 1. 讲故事 在分析旅程中总会有几例控制台的意外卡死导致的生产事故有经验的朋友都知道控制台卡死一般是动了 快速编辑窗口 的缘故截图如下 虽然知道缘由但一直没有时间探究底层原理市面上也没有对这块的底层原理介绍昨天花了点时间简单探究了下算是记录分享吧。 二几个疑问解答 1. 界面为什么会卡死 相信有很多朋友会有这么一个疑问控制台程序明明没有 message loop 机制为什么还能响应 窗口事件 呢 说实话这是一个好问题其实 Console 之所以能响应 窗口事件是因为它开了一个配套的 conhost 窗口子进程用它来承接 UI 事件为了方便阐述上一段定时向控制台输出的测试代码。 static void Main(string[] args){for (int i 0; i int.MaxValue; i){Console.WriteLine($i{i});Thread.Sleep(1000);}} 将程序跑起来再用 process explorer 观察进程树即可。 接下来用 windbg 附加到 conshost 进程上观察下有没有 GetMessageW。 0:005 ~* k0 Id: 3ec8.2c20 Suspend: 1 Teb: 000000d292014000 Unfrozen# Child-SP RetAddr Call Site 00 000000d2922ff798 00007fffa3e45746 ntdll!NtWaitForSingleObject0x14 01 000000d2922ff7a0 00007fffa60b5bf1 KERNELBASE!DeviceIoControl0x86 02 000000d2922ff810 00007ff69087a790 KERNEL32!DeviceIoControlImplementation0x81 03 000000d2922ff860 00007fffa60b7614 conhost!ConsoleIoThread0xd0 04 000000d2922ff9e0 00007fffa66a26a1 KERNEL32!BaseThreadInitThunk0x14 05 000000d2922ffa10 0000000000000000 ntdll!RtlUserThreadStart0x21 ...2 Id: 3ec8.1b70 Suspend: 1 Teb: 000000d29201c000 Unfrozen# Child-SP RetAddr Call Site 00 000000d29227f858 00007fffa4891b9e win32u!NtUserGetMessage0x14 01 000000d29227f860 00007ff6908735c5 user32!GetMessageW0x2e 02 000000d29227f8c0 00007fffa60b7614 conhost!ConsoleInputThreadProcWin320x75 03 000000d29227f920 00007fffa66a26a1 KERNEL32!BaseThreadInitThunk0x14 04 000000d29227f950 0000000000000000 ntdll!RtlUserThreadStart0x21 ... 2. 进程间如何通讯 这个问题再细化一点就是Client 端通过 Console.WriteLine($i{i}); 写入的内容是如何被 Server 端的conhost!ConsoleIoThread 方法接收到的。 熟悉 Windows 编程的朋友都知道Console.WriteLine 的底层调用逻辑是 ntdll!NtWriteFile - nt!IopSynchronousServiceTail 前者是用户态进入到内核态的网关函数后者是用户将irp丢到线程的请求包队列后进入休眠(KeWaitForSingleObject)直到驱动提取并处理完之后唤醒。 说了这么多怎么去验证呢 客户端下断点 0: kd !process 0 0 ConsoleApp2.exe PROCESS ffffe001b5e51840SessionId: 1 Cid: 0e8c Peb: 7ff7ab226000 ParentCid: 09d4DirBase: 18079000 ObjectTable: ffffc00036965200 HandleCount: Data Not AccessibleImage: ConsoleApp2.exe0: kd bp /p ffffe001b5e51840 nt!IopSynchronousServiceTail 0: kd g Breakpoint 0 hit nt!IopSynchronousServiceTail: fffff802a94f3410 48895c2420 mov qword ptr [rsp20h],rbx 3: kd k# Child-SP RetAddr Call Site 00 ffffd000f6477988 fffff802a94f2e80 nt!IopSynchronousServiceTail 01 ffffd000f6477990 fffff802a916db63 nt!NtWriteFile0x680 02 ffffd000f6477a90 00007ffc2fed38aa nt!KiSystemServiceCopyEnd0x13 03 0000009f0743dbd8 00007ffc2cd1d478 ntdll!NtWriteFile0xa 04 0000009f0743dbe0 0000000000000005 0x00007ffc2cd1d478 05 0000009f0743dbe8 0000009f0743dcf0 0x5 06 0000009f0743dbf0 0000009f0978c9b8 0x0000009f0743dcf0 07 0000009f0743dbf8 00007ffc2986e442 0x0000009f0978c9b8 08 0000009f0743dc00 0000009f0743dc30 0x00007ffc2986e442 09 0000009f0743dc08 0000009f0743de00 0x0000009f0743dc30 0a 0000009f0743dc10 0000000000000005 0x0000009f0743de00 0b 0000009f0743dc18 0000000000000000 0x53: kd tc nt!IopSynchronousServiceTail0x70: fffff802a94f3480 e8ebf1b5ff call nt!IopQueueThreadIrp (fffff802a9052670) 服务端下断点 conhost端的提取逻辑是在 conhost!ConsoleIoThread 方法中它的内部调用的是 kernelbase!DeviceIoControl 函数这个方法挺有意思可以直接给驱动程序下达命令方法签名如下 BOOL DeviceIoControl(HANDLE hDevice,DWORD dwIoControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned,LPOVERLAPPED lpOverlapped ); 提取完了之后会通过 conhost!DoWriteConsole 向控制台输出接下来可以下个断点验证下。 0:000 bp conhost!DoWriteConsole 0:000 g Breakpoint 0 hit conhost!DoWriteConsole: 00007ff690876ec0 48895c2410 mov qword ptr [rsp10h],rbx ss:00000095d627f7380000000000000000 0:000 r rax000000000000000c rbx00000095d627f7b0 rcx000002370df76cc0 rdx00000095d627f768 rsi00000095d627f7c0 rdi00000095d627f7f0 rip00007ff690876ec0 rsp00000095d627f728 rbp00000095d627f8f9r8000002370bedf010 r900000095d627f7b0 r10000002370df76cc0 r11000002370e0c9d00 r1200000095d627f970 r13000002370bedf010 r14000002370bedf010 r150000000000000000 iopl0 nv up ei pl zr na po nc cs0033 ss002b ds002b es002b fs0053 gs002b efl00000246 conhost!DoWriteConsole: 00007ff690876ec0 48895c2410 mov qword ptr [rsp10h],rbx ss:00000095d627f7380000000000000000 0:000 du 000002370df76cc0 000002370df76cc0 i18.. 可以看到果然有一个 i18这里要提醒一下要想看方法的顺序逻辑可以借助 perfview。 3. 为什么快捷编辑之后就卡死 conhost 的源码不是公开的不过可以感官上推测出来。 快速编辑窗口 被用户启用后 GetMessage 会感知到这个自定义的 MSG 消息。 这个消息的逻辑会让 server 处理Client消息的流程一直处于等待中导致 Client 的 IopSynchronousServiceTail 不能被唤醒导致一直处于阻塞中类似 Task 的完成状态一直不被设置。 接下来可以验证下 快速编辑窗口 的处理消息码是多少只要在控制台点一下鼠标。参考脚本如下 0:004 bp win32u!NtUserGetMessage dp ebp-30 L2 ; g 0:004 g 00000095d61ffae0 0000000000130e6e 0000000000000404 00000095d61ffae0 0000000000130e6e 0000000000000404 00000095d61ffae0 0000000000130e6e 0000000000000201 00000095d61ffae0 0000000000130e6e 0000000000000405 00000095d61ffae0 0000000000130e6e 0000000000000202 00000095d61ffae0 0000000000130e6e 0000000000000200 从 chaggpt 中对每个消息码的介绍可以看到会有一个 405 的自定义消息这个就是和 快速编辑窗口 有关的。 三总结 这篇就是我个人对窗口卡死的推测和记录高级调试不易如果大家感兴趣欢迎补充细节。
http://www.w-s-a.com/news/682948/

相关文章:

  • 深圳建网站三千网站安全代维
  • 西宁市精神文明建设网站装饰设计甲级资质
  • 做教育行业营销类型的网站徐州做网站多少钱
  • 临沂品牌网站制作企业网站建设搜集资料
  • wordpress注册验证码手机网站优化
  • 往建设厅网站上传东西做衣服的教程网站有哪些
  • 网上商城网站设计免费咨询口腔科医生回答在线
  • 南京网站c建设云世家 s浏览器
  • 如何做镜像别人网站wordpress菜单对齐修改
  • 长春网站建设net企业公示信息查询官网
  • 金鹏建设集团网站可在哪些网站做链接
  • 电子产品网站开发背景网站关键词优化方案
  • 建网站论坛wordpress提交数据库错误
  • 国内网站建设公司开源网站系统
  • 网站开发公司上大连网站建设流程图
  • 银川网站seo宁波网
  • 个人备案网站会影响吗网站添加 备案
  • 网站建设与电子商务的教案关于旅游网站建设的方案
  • 电子商务网站建设设计原则找做网站找那个平台做
  • 天津高端品牌网站建设韶关网站建设墨子
  • Wordpress多站点为什么注册不了2008iis搭建网站
  • 天津高端网站制作建网站的公司服务
  • 温州网站推广优化类似淘宝的网站怎么做的
  • 网站建设实训考试什么网站做玩具的比较多
  • 上海网站建设特点怎样给公司做一个网站做推广
  • 流量网站怎么做的济南优化排名公司
  • 保定网站制作套餐设计师导航网站大全
  • 惠州 商城网站建设石家庄新闻广播在线收听
  • 洪山网站建设域名购买之后怎么做网站
  • 北京网站建设公司服务哪家好wap是什么意思?