![565a831c0bb010b7c3aeec97013c0536.png](https://i-blog.csdnimg.cn/blog_migrate/d0e6cb93143ba4c1cc192be5a667104b.jpeg)
柠檬哥整理了50本计算机相关的电子书,微信搜索公众号「后端技术学堂」,回复「1024」既可获取,回复「进群」拉你进读者技术交流群。
最近遇到一个有意思的bug,是关于VSCode编辑器插件的,最近赶项目时间非常紧,说实话在这时平常用的顺手的IDE出问题非常影响心情。「这就像是你开在高速路上,吃着火锅唱着歌,突然轮胎爆了,你说气不气人」。
不过在找bug和推动修复bug的过程有点意思,「通过一系列尝试最终定位和复现了bug,并且给这个项目的微软官方仓库提了issue,最终在最新版本得到了修复,把这个有趣的过程分享给大家」。
「也给大家演示一下如何通过提 issue 的方式参与到开源项目中」,当然,参与开源项目的方式有多种,「你可以给项目贡献源码,甚至作为大使帮助推广项目,找到项目的bug进而提issue也是一种参与方式」,总之先参与进来,才能发现开源的乐趣!
诡异的报错
上周,又是一个在公司的夜晚,好像和平常没啥区别,柠檬哥在加班ing,飞快的敲打着自己的机械键盘,熟练的用 VSCode 浏览着项目源码,顺手按下F12+Shift 想看看这个函数在哪些地方被引用了,诡异的事情发生了,这VSCode它竟然不听使唤了,查不出引用的结果了,并且终端提示如下错误:
快速信息操作失败: FE: 'Compiler exited with error - No IL available'快速信息操作失败: FE: 'Compiler exited with error - No IL available'
一开始我以为是单个工程解析问题,「不慌,问题不大」。
后来换了个工程尝试,「不论我如何的反复摩擦我洁白的键盘帽,始终不能出来查找引用的结果界面」,这时才发现,粗大事了。工欲善其事必先利其器,虽然进度有点赶,还是停下来康康是谁在捣鬼?
![dac9ffc053396a72efe15be12c6ebbe5.png](https://i-blog.csdnimg.cn/blog_migrate/f95e8601d6b5c6bf664ac0171d6cdf99.jpeg)
「老读者应该知道我的开发环境都是远程开发环境,之前我写过几篇介绍如何用VSCode搭建远程开发」,以及配置开发环境的文章,可以说是VSCode重度爱好者,感兴趣我是怎么远程开发的可以了解下历史文章:
[手把手教你配置vscode远程开发工具]
[干货:用好VSCode这13款插件和8个快捷键,工作效率提升10倍]
继续前面说的,如果不能查找引用的话,那会对编码和阅读源码带来很大的不便,「这个功能算的上是IDE的基础功能了,如果连这功能都废了,那我要你这VSCode有何用」?如果不能修复的话我估计要跑抛弃它,用回 Visual Studio 或 CLion。
但是VSCode远程开发是真的香,并且已经习惯了VSCode操作,在放弃之前还想挣扎下,看还能不能抢救?不过如果实在不行,也没时间死磕,项目还要继续,大不了换个 IDE 继续玩,甚至都想好了以面再也不说VSCode香了。
![4121f2bc2e42b84bc425ab43696a38ca.gif](https://i-blog.csdnimg.cn/blog_migrate/66712aef461f0029d9dde69af93be3a0.gif)
一起来找bug呀
虽然这个插件不是我写的,但我按照一般程序员排查bug的思路,通过下面几个步骤一步步来找到问题原因,最终并推动官方的版本更新来修复,一起来看看吧。
软件问题?
「首先,来看看是不是VSCode版本升级导致的问题」。按下面的操作,我检查 VSCode 的版本信息。
![c1f105e11b6f2ba16ed5228223ba0c01.png](https://i-blog.csdnimg.cn/blog_migrate/ed566a729583dc6328de941efc25fd2c.jpeg)
查看版本
仔细核对版本号和官网的区别,对比问题出现的时间前后都没有升级过新版本。
OK,「应该不是 VSCode 版本升级导致的问题」。
![b07dff1d0fac16b68a1d2222174cac94.png](https://i-blog.csdnimg.cn/blog_migrate/27d05bc743d771c365ce165050d90321.jpeg)
VSCode版本确认
配置问题?
既然不是 VSCode 升级版本导致的问题,那就奇了怪了,白天还好好的晚上突然咋就不行了呢?难道这插件也不想加班了?我陷入了沉思,不过马上灵机一动,「会不会小心改了C++环境配置文件出了问题」?
「这里有个知识点记下,要考」。VSCode中有一个叫c_cpp_properties.json的配置文件,这个文件主要用于配置C/C++工程的基础信息,比如:「预定义宏、指定编译器路径、预定义头文件搜索路径等」。
{ "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**", "/lemon/handsome/thirdparty/**", "/lemon/smart/inc/**" ], "defines": [], "compilerPath": "/usr/bin/gcc", "cStandard": "c11", "cppStandard": "c++14", "intelliSenseMode": "gcc-x64" } ], "version": 4}
机智如我,肯定是这个工程的include 搜索路径配置的有问题,才导致查找引用失败了,赶紧去检查一眼配置文件,于是熟练的敲下Ctrl+Shift+P 「查找所有命令和配置」(「敲黑板!这个命令很常用,背下来」),输入关键字c++ Edit 果然匹配到了配置文件,打开就是上面的配置文件。
![fd0628f1a78f98ffaa38c3b0d017d66e.png](https://i-blog.csdnimg.cn/blog_migrate/e316189e4a4589c12d9fc0d9477718de.jpeg)
cpp_json
但是看起来文件路径好像是对的,不管了,死马当活马医,先全部删除重新配置一遍看看效果,一顿操作之后兴奋的检查有没有用,然并卵,还是那个该死的提示FE: 'Compiler exited with error - No IL available',心态有点崩。
![c7ca5c7521ddeb3bb8a3db2018dba238.png](https://i-blog.csdnimg.cn/blog_migrate/b44d823c81386efd65e993a2588c6ef3.jpeg)
环境问题?
发现这个问题确实有点诡异,走到这一步,「我几乎可以断定是Linux开发环境出了问题,但是不确定是我的机器环境问题还是 Linux下 VSCode 本身问题,那怎么办呢?先来证明是Linux下才出的问题吧」!
我就尝试不开远程开发模式,把远程Linux机器上的工程直接拉到宿主机本地文件夹,然后用VSCode打开宿主机上的本地工程,「它竟然工作的很好,完全没有出现什么错误提示,到这,已经完全可以确定这个bug只在Linux环境下出现了」。
「夜已深,起来喝杯水,看了下时间,加班班车快到末班了。」
![1e2aa47ad7bcb99c3a1b43d264b842a3.png](https://i-blog.csdnimg.cn/blog_migrate/48d3f22857f7c4f7cfd57c855e6b5ebf.jpeg)
事已至此,看来真的要关掉远程开发,在本地重新配置所有工程了,表面上还是劝自己再找找原因,没事,问题不大。
插件问题?
喝完水,我坐下来继续想,「会不会是C++扩展出了问题呢?大家都知道VSCode只能说是一个编辑器,能够让他变身C++ IDE完全是有背后的C++插件或者叫扩展的支持」。
就是下面黑黑的这货,它是VSCode能够支持C++开发背后的男人,众所周知VSCode是微软亲儿子,看看这个插件作者Microsoft 看来也是微软自家人开发的插件,发布之前肯定是经过严格测试的,问题不大。
![29589ce5bb0c5501d9212df1cf3af7cb.png](https://i-blog.csdnimg.cn/blog_migrate/5a57a22c95eadde2fd9aaab571b55d30.jpeg)
C++扩展
不过现在谁也不能相信,即使是微软自家的插件也不能信任了,假装冷静分析一波。
![1583940bb8b8612c1c9c528abb106b29.png](https://i-blog.csdnimg.cn/blog_migrate/0a677147b0e77148719a8c4d05fe0bdf.jpeg)
经过严谨的思考(然而并没有),最终决定拿出程序员必杀技:「重启试试,卸载重装」。
点击卸载,卸载完成,点击安装,重装完成,重启加载,一气呵成。
兴奋的搓小手手,准备再次见证奇迹,WTF,问题依旧没能解决,实话告诉大家,做到这个份上,柠檬哥可以说是已经非常的绝望了。
![9578866cb85479bcc535e86cf2daf7e1.png](https://i-blog.csdnimg.cn/blog_migrate/1171cbead551917de1ec79aa3deac3e5.jpeg)
正道的光
真相只有一个
不管了先回去睡一觉,梦里啥都有,没准第二天白天又有了新思路。
果然第二天我又有了新想法,虽然卸载重装插件没用,但我们程序员还有最后一招:「回退版本」!
是时候表演真正的技术了,「资深程序员肯定懂的,常在河边站哪有不湿鞋,版本发布出问题,赶紧回退保命是常规操作」。
![2bd814b3f867939050614f358fa5e85d.png](https://i-blog.csdnimg.cn/blog_migrate/28da75c2c760b96f8aec209b10a52561.jpeg)
那我们就有理由怀疑:「微软在发布这个插件最新版本的的时候把一个重要特性搞掉了」。但是这东西发都发出去了,也不是服务端后台服务说回退就能回退的,这个插件如果真是bug也只能等下一个版本修复,还是我们自己来操作回退吧。
找到插件,按下面方法来执行回退操作:
![106d1db3e059e950d983a2692a81522b.png](https://i-blog.csdnimg.cn/blog_migrate/425d853987429ad0b9880fd19e829a33.jpeg)
安装低版本
柠檬当时回退的时候还没有出最新的修复版本,装的是有问题的1.0.0版本的插件,「看这个版本号应该是个较大改动的大版本,出问题也正常」。
关键是「可以看到这个版本的发布时间点刚好是我发现bug的时间」,这回感觉离真相越来越近了,至少在时间上是吻合的有底气了点,那有理由怀疑是这个插件出了问题,回退到上一个稳定版本0.29.0
![09cd69fea28a2fefe3f3f40378d0809c.png](https://i-blog.csdnimg.cn/blog_migrate/4394f583fffbbb16814c52581ff3a984.jpeg)
选择插件安装版本
「这次奇迹真的出现了,「查找引用功能」它回来了」!而且也没有出现FE: 'Compiler exited with error - No IL available'的报错提示,为了进一步确认自己的判断,我又把插件升级到1.0.0版本(稳了),果然又出现了刚才的问题。
「至此,这个bug算是定位成功,并且可复现验证,暂时的解决方法是回退到上一个稳定版本」。
离线安装
另外提醒一下,公司其他同学也遇到这个问题,我在帮其他同学解决这个问题的时候,发现有些人直接升级可能会有网络问题,导致在线升级不了,报错:
![2723b5f79a64b5183d9376faba287ba4.png](https://i-blog.csdnimg.cn/blog_migrate/e011efe5c4333ea0925f7f5a91d57834.jpeg)
自动升级下载失败
这时候可以去上面我发的官网下载离线版本插件安装包,下完之后,按照下面的操作升级即可,效果和在线升级一样。
![a76b5305afb93619fb496294f3e71682.png](https://i-blog.csdnimg.cn/blog_migrate/f89a5d2c282190a46473523259099764.jpeg)
离线安装插件步骤
注意了,由于一些众所周知的原因,「如果你打不开官网或者下载速度很慢,可以加文末我个人微信,备注「下载插件」我发给你已经下载好的插件」。
推动版本更新
提issue报bug
这就完了吗?当然不是。「费了我这么大功夫找出来的bug,不要再浪费其他人时间了,所以我决定去微软这个插件的官方仓库去给他们提 issue」,这里给不了解 Github 开源项目的同学科普下什么是issue ? 「上课了,看黑板」!
❝
Github项目的 issue 用于团队协作管理,可以把将要实现的 feature 或者要修复的 bug 通过提 issue的形式记录下来,所以我们如果发现开源项目的bug,可以通过给开源项目提issue的形式报告这个bug,提醒项目团队修复跟进。
❞
这里给出微软官方C/C++ 插件的github仓库地址:https://github.com/microsoft/vscode-cpptools
我去写下了下面这个issue ,虽然是英文描述的,大家应该都能看得懂我就不逐字翻译了,计算机相关的英文来回就那么几个单词,看多了就会写,大意就是描述了我遇到的bug和问题出现时的环境配置信息,方便他们定位和复现问题。
issue 标题: C/C++ Extension 1.0.0 some feature Not working When using in Remote-SSH remote development #6176
![ec8c2b5f4f2164c6e35e249d00da3ba4.png](https://i-blog.csdnimg.cn/blog_migrate/df36326359b0d4b103ac7cfe07410cd5.jpeg)
issue描述
并且详细描述了我遇到的问题,其实经过上面一顿操作,柠檬肯定是他们这个版本有问题,「但还要友好沟通推进问题尽快解决才是目的,写代码的何苦为难写代码的」,没有直接说他们有问题,而是委婉的问了下 I wonder if there is a problem with this latest Extension ? 哈哈
完美解决
我提issue的时候是中午吃饭的时候12点左右,那时美国那边应该还是凌晨,我想肯定没这么快有回复了,国外程序员小哥都还在睡觉呢,怎么也得早上上班才能看到之后回复,「但是万万没想到在下午5点左右就收到了回复,果然神速」。
![ca4efd9f1e327be8f12b17492f7c0aa7.png](https://i-blog.csdnimg.cn/blog_migrate/de3d34076543ad73936997238fa0652a.jpeg)
issue交流
「不过,等等,好像哪里有点不对劲」,注意上面图中具体时间已经没显示了,只是显示一个 2 days ago,在我看到消息通知的时候有点诧异处理这么神速,好奇去翻开处理issue老哥的 github 主页介绍。
回复的这位是微软VS Code C++ Extension的软件开发工程师,然后定位是美国的Redmod, WA ,特意去查了当时的美国时间是05:03,这位老哥是在凌晨5点钟处理的这个bug。。。「这也太优秀了吧,果然大佬们都是半夜写代码不用睡觉的,看到凌晨五点的太阳我信了」。
![68019d8dda687d1ba48eb0fe34d4c83f.png](https://i-blog.csdnimg.cn/blog_migrate/6763e63f00ce8fff1bcaa0c2338f7faf.jpeg)
复盘一下
「到了这里,这个bug从出现在我的机子上,到定位查找,最终修复算是完美的解决」。这里附上官方的版本链接:https://github.com/microsoft/vscode-cpptools/releases ,里面有提到本次修复的bug。
![1b8b7f64c108e1cfc3bcb050ccd69488.png](https://i-blog.csdnimg.cn/blog_migrate/733929e955b5f444020d0bce3b044816.jpeg)
版本更新
按照最新的1.0.0 版本发布说明,「如果你使用 Linux/MAC 版本的VSCode 或者像我这样用远程开发的方式从宿主机使用Linux版本,可能会遇到我文中说的bug」,我是在0.29.0自动升级到1.0.0发现的bug,于是给1.0.0版本报了个issue,微软官方在1.0.1版本修复了上述的bug,「一张图看清时间线」。
![dd33081256b4301fcefb847bed15640a.png](https://i-blog.csdnimg.cn/blog_migrate/3f0a62ec742a3e28996cd59d61d51bbc.jpeg)
柠檬在这里建议:「正在使用0.29.0版本插件的同学不升也没啥大问题,但如果你用的是1.0.0版本,那就要注意了,这个版本在本文描述的场景下是有问题的,还是及时升级到最新版本为好」。
我是lemon,热爱技术,也爱生活,坚持分享输出,让自己和读者都有收获!关注我来跟我一起变强吧。
如果觉得文章写的还行,对你有所帮助,动动手指「点赞」或给「转发」是对我持续创作的最大支持。
![6ae43d756a372d5c774492d82d7e77fa.gif](https://i-blog.csdnimg.cn/blog_migrate/2a0ea6eb41354d36e0135d41b8d12378.gif)
文章每周持续更新,可以微信搜索公众号「 后端技术学堂 」提前看,点击下方了解更多查看原文,我们下期见!
![ffa44ddf2358f5383bdcbea0c65ddd8d.png](https://i-blog.csdnimg.cn/blog_migrate/8fde3cd4261ac47c6b3d406906c45aad.jpeg)