格友有个Windows上的性能问题请求帮忙,我让他使用WPT(Windows Performance Toolkit)捕捉现场情况,然后把ETL文件发给我。
睡过午觉,看外面仍在下雨。坐到电脑前,想起了格友的ETL文件。搜索wpa.exe(WPA是Windows Performance Analyzer的简称),搜到几个结果,都是以前安装的。
不支持该请求
启动wpa,选择etl文件,加载过程中,WPA报告下面这样的错误(Trace processing failed)。点击确定后就退出了。
错误对话框中有个提示:不支持该请求。根据经验,多半是我的WPA太老了。
安装新版本
上微软官网,下载SDK安装程序,选择安装Windows Performance Toolkit,很快就安装好了新版本。
新版本装好后,启动wpa,界面果然和以前不一样,布局更漂亮了,右侧还多了个“欢迎使用的新的启动器!”。有更新代表着在进步,看来微软还是有人在坚持做Windows的(^_^)。
新的界面的下方还多了个进度条,在显示一些操作的名字,比如loading plugin xxx。正当我一边欣赏WPA的新界面,一边为微软同行坚持改进Windows感动的时候, WPA弹出一个对话框,对话框的标题赫然写着:致命的异常。这个致命异常仿佛像一盆冷水泼到我的头顶,让我的情绪瞬间扭转了180度。
我睁大眼睛,仔细看对话框。读上面的信息:检测到不可恢复的错误:无法加载perfcore.dll。
然后询问是否通过“反馈通道”发通知?但是无论选“是”还是“否”,结果都是WPA残忍退出了。
根据多年的经验,新的WPA崩溃了。欸,怎么这么不稳定呢?一启动就崩溃了,还没等我打开文件。这软件测试过么?这质量还能代表微软的水平么?
换个机器再试
对于这样的崩溃,可能是因为我本子上的windows太老了,它多次要自动升级,都被我拒绝了。
为此,我特意把安装程序复制到一个新的本子上,重复上面的步骤,结果还是同样的症状,致命的异常,崩溃。
上调试器
怎么办呢?就此放弃了么?
看一眼窗外,雨还在下。转回头,从大脑皮层深处钻出了沉睡许久的一句话,又土又歪:下雨天打孩子,闲着也是闲着。
对的,闲着也是闲着,上调试器。
再次启动wpa.exe,异常对话框出现后点击“否”,经典的JIT调试机制开始工作(详见《软件调试》卷2),名为“选择实时调试程序”的对话框弹出。
点击JIT调试对话框的确定按钮,VS IDE被启动,接管崩溃的WPA。我估计VS要忙一会,就切到微信界面,看了几条消息。
过了大约一分钟,当我切回VS时,我再次被眼前的一幕感动了。
VS不仅显示出了完美的调用栈,还把出问题的源代码呈现出来。这个源文件看起来是自动从大洋彼岸下载的。我特意“打开所在的文件夹”,看了一眼刚刚下载好的文件,对它说:“你好啊,美国来的客人,上海欢迎你!”
浏览崩溃现场的源代码,确实是在加载库文件,库文件的路径是通过两个变量动态拼接起来的。
string text = Path.Combine(XPerfProcessingSource.XPerfAddInDirectory, FileName);intPtr = NativeMethods.LoadLibrary(text);if (intPtr == IntPtr.Zero){ throw new FileNotFoundException("Unable to load " + FileName, text);}
更难得的是,把鼠标移到变量上,立刻显示出了变量的值,XPerfProcessingSource.XPerfAddInDirectory的值确实是我安装WPT的路径。
而FileName的值就是错误对话框里提到的perfcore.dll。
如此看来就是因为我的WPT目录缺少文件啊。
使用文件搜索工具搜索,的确没有。
这时,我想到新下载的WPT安装包有很多个安装文件,我刚才安装的是WPTx64 (DesktoEditions)-x64_en_us.msi。我尝试双击另一个安装包:WPTx64(OnecoreUAP)-x64_en-us.msi。
安装好之后,再搜perfcore.dll,果然有了。
再次运行wpa,问题消失了。
回过头来看,这个非常明显和让人撇嘴的崩溃是和安装程序有关的。对于这个问题,一上调试器就水落石出了。这个问题再次证明了调试技术的重要性,应格友们的提议,《全栈调试实战营之二线拍案惊奇》正在招募中,希望深耕调试技术的小伙伴请点击链接查看详情。
(写文章很辛苦,恳请各位读者点击“在看”,欢迎转发)
*************************************************
正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生
扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物
也欢迎关注格友公众号