0x0 背景介绍
* 在调试器中看阿里的软件兵团(转载)
https://xnerv.wang/debugging-alibaba-softwares/
* 在调试器里看百度云管家
https://blog.csdn.net/lispython/article/details/80123698
原作者都是 @张银奎 老师,上述引用的博客链接均非出自 @张银奎,特此说明。
0x1 问题现象
* 软件版本:Windows 版 V4.7.0.2
* 系统环境:DELL Optiplex 7050 台式机 / 32G / SSD / Windows 10 Enterprise 22H2 / Intel(R) HD Graphics 630 / Dell E2216HV 显示屏
* ToDesk.exe V4.7.0.2:SHA1 EA3E349371F0FBEFAFBAF2A21F17FF32BD7DFECF
^ 以下细节描述均基于该二进制文件 ^
* 问题 1:缺页中断高居不下
Page Fault Delta 太高,导致一段时间后总缺页数远超其他进程。
* 问题 2:偶现“内存不足”的弹窗提示,需重启 explorer.exe 进程拯救桌面。
论坛内有其他类似反馈,本人在使用过程中也是间隔若干时间后会遇到一次。表象就是 explorer.exe 假死,桌面 GUI 渲染出问题,无法点击和正常使用,需重启 explorer.exe 进程恢复。
0x2 问题分析
针对上述问题 1,给出我的一部分排查结果,供参考。
* 问题 1:缺页中断高居不下
根据「背景介绍」一节中给出的参考方法,借助 Windows Performance Toolkit 及 Page Fault Monitor 工具,可以看到同样出在 CreateToolhelp32Snapshot/Process32Next 系列函数上。
Page Fault Monitor
Windows Performance Analyzer
对 KERNEL32!CreateToolhelp32Snapshot 下断点,近几次命中时的栈帧/位置均为 0x7FF6ECD1CF73
- bp kernel32!CreateToolhelp32Snapshot ".echo ***hit***; r @rip; r @$t1=@$t1+1; kv 3; .if (@$t1>10) {} .else {gc;}"
复制代码
对应位置处,待匹配的 lstrcmpiW 所对应的进程名是 ToDesk.exe
- bp kernelbase!lstrcmpiW ".echo ***hit***; r $t1=@$t1+1; du @rdx; .if (@$t1>10) {} .else {gc;}"
复制代码
至于影响,引用 @张银奎 老师文章里的几段话:
为何选择Page faults来衡量软件对功耗的影响?虽然今天的计算机都配备了比较多的物理内存,但仍离不开虚拟内存技术,把暂时不用的数据放在外存中,当CPU访问这样的数据时,会报告缺页异常,让操作系统的内存管理器将数据从外存中读到物理内存,这个操作通常被称为Page In。物理内存是以页为单位来管理的,因此每次Page In的数据至少是一个页,通常为4KB。访问外存意味着系统总线和硬盘等存储设备的运作,在时间和功耗方面都是较大的开销,因此,Page faults常成为系统调优的一个重要指标。
-- 「在调试器中看阿里的软件兵团」
至于优化:
一年多之前,我曾写过一篇《在调试器里看阿里的软件兵团》,批评了支付宝客户端软件中的性能问题,文章发表后,很高兴看到阿里的同行不断改进,今天已经不再有当时的问题了(图1中还可以看到淘宝的TBSecSvc进程,排名已经比较靠后)。不知百度的同行看过此文有何感想?作为一款客户端软件,能帮助用户管家是好想法,但是管家毕竟是仆人,有事时应该尽心给主人办事,没事时应该安安静静休息,不要肆意挥霍主人家的东西。 -- 「在调试器里看百度云管家」
期待后续版本能减少这种情况的发生。
* 问题 2:偶现“内存不足”的弹窗提示
原本以为是自己电脑环境的特例情况,没想到论坛上有类似的反馈,相比问题 1 我更关心问题 2 的成因及解决办法。这个问题由于“偶现”的缘故暂时还没找到稳定的排查方式,待后续如果有新的发现时再更新至此。
Stay tuned!
|