App下載

發(fā)現(xiàn)VSCode的一個(gè)bug,微軟工程師竟然凌晨回復(fù)...

猿友 2020-10-10 14:44:55 瀏覽數(shù) (3969)
反饋

最近遇到一個(gè)有意思的bug,是關(guān)于VSCode編輯器插件的,趕項(xiàng)目時(shí)間非常緊,說(shuō)實(shí)話在這時(shí)平常用的順手的IDE出問(wèn)題非常影響心情。「這就像是你開(kāi)在高速路上,吃著火鍋唱著歌,突然輪胎爆了,你說(shuō)氣不氣人」。

不過(guò)在找bug和推動(dòng)修復(fù)bug的過(guò)程有點(diǎn)意思,「通過(guò)一系列嘗試最終定位和復(fù)現(xiàn)了bug,并且給這個(gè)項(xiàng)目的微軟官方倉(cāng)庫(kù)提了issue,最終在最新版本得到了修復(fù),把這個(gè)有趣的過(guò)程分享給大家」。

「也給大家演示一下如何通過(guò)提 issue 的方式參與到開(kāi)源項(xiàng)目中」,當(dāng)然,參與開(kāi)源項(xiàng)目的方式有多種,「你可以給項(xiàng)目貢獻(xiàn)源碼,甚至作為大使幫助推廣項(xiàng)目,找到項(xiàng)目的bug進(jìn)而提issue也是一種參與方式」,總之先參與進(jìn)來(lái),才能發(fā)現(xiàn)開(kāi)源的樂(lè)趣!

詭異的報(bào)錯(cuò)

上周,又是一個(gè)在公司的夜晚,好像和平常沒(méi)啥區(qū)別,檸檬哥在加班ing,飛快的敲打著自己的機(jī)械鍵盤(pán),熟練的用 VSCode 瀏覽著項(xiàng)目源碼,順手按下F12+Shift 想看看這個(gè)函數(shù)在哪些地方被引用了,詭異的事情發(fā)生了,這VSCode它竟然不聽(tīng)使喚了,查不出引用的結(jié)果了,并且終端提示如下錯(cuò)誤:

快速信息操作失敗: FE: 'Compiler exited with error - No IL available'
快速信息操作失敗: FE: 'Compiler exited with error - No IL available'

一開(kāi)始我以為是單個(gè)工程解析問(wèn)題,「不慌,問(wèn)題不大」

后來(lái)?yè)Q了個(gè)工程嘗試,「不論我如何的反復(fù)摩擦我潔白的鍵盤(pán)帽,始終不能出來(lái)查找引用的結(jié)果界面」,這時(shí)才發(fā)現(xiàn),粗大事了。工欲善其事必先利其器,雖然進(jìn)度有點(diǎn)趕,還是停下來(lái)康康是誰(shuí)在搗鬼?

如果不能查找引用的話,那會(huì)對(duì)編碼和閱讀源碼帶來(lái)很大的不便,「這個(gè)功能算的上是IDE的基礎(chǔ)功能了,如果連這功能都廢了,那我要你這VSCode有何用」?如果不能修復(fù)的話我估計(jì)要跑拋棄它,用回 Visual Studio 或 CLion。

但是VSCode遠(yuǎn)程開(kāi)發(fā)是真的香,并且已經(jīng)習(xí)慣了VSCode操作,在放棄之前還想掙扎下,看還能不能搶救?不過(guò)如果實(shí)在不行,也沒(méi)時(shí)間死磕,項(xiàng)目還要繼續(xù),大不了換個(gè) IDE 繼續(xù)玩,甚至都想好了以面再也不說(shuō)VSCode香了。

一起來(lái)找bug呀

雖然這個(gè)插件不是我寫(xiě)的,但我按照一般程序員排查bug的思路,通過(guò)下面幾個(gè)步驟一步步來(lái)找到問(wèn)題原因,最終并推動(dòng)官方的版本更新來(lái)修復(fù),一起來(lái)看看吧。

軟件問(wèn)題?

「首先,來(lái)看看是不是VSCode版本升級(jí)導(dǎo)致的問(wèn)題」。按下面的操作,我檢查 VSCode 的版本信息。

查看版本

仔細(xì)核對(duì)版本號(hào)和官網(wǎng)的區(qū)別,對(duì)比問(wèn)題出現(xiàn)的時(shí)間前后都沒(méi)有升級(jí)過(guò)新版本。

OK,「應(yīng)該不是 VSCode 版本升級(jí)導(dǎo)致的問(wèn)題」

VSCode版本確認(rèn)

配置問(wèn)題?

既然不是 VSCode 升級(jí)版本導(dǎo)致的問(wèn)題,那就奇了怪了,白天還好好的晚上突然咋就不行了呢?難道這插件也不想加班了?我陷入了沉思,不過(guò)馬上靈機(jī)一動(dòng),「會(huì)不會(huì)小心改了C++環(huán)境配置文件出了問(wèn)題」?

「這里有個(gè)知識(shí)點(diǎn)記下,要考」。VSCode中有一個(gè)叫c_cpp_properties.json的配置文件,這個(gè)文件主要用于配置C/C++工程的基礎(chǔ)信息,比如:「預(yù)定義宏、指定編譯器路徑、預(yù)定義頭文件搜索路徑等」。

{
    "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
}

機(jī)智如我,肯定是這個(gè)工程的include 搜索路徑配置的有問(wèn)題,才導(dǎo)致查找引用失敗了,趕緊去檢查一眼配置文件,于是熟練的敲下Ctrl+Shift+P 「查找所有命令和配置」「敲黑板!這個(gè)命令很常用,背下來(lái)」),輸入關(guān)鍵字c++ Edit 果然匹配到了配置文件,打開(kāi)就是上面的配置文件。

cpp_json

但是看起來(lái)文件路徑好像是對(duì)的,不管了,死馬當(dāng)活馬醫(yī),先全部刪除重新配置一遍看看效果,一頓操作之后興奮的檢查有沒(méi)有用,然并卵,還是那個(gè)該死的提示FE: 'Compiler exited with error - No IL available',心態(tài)有點(diǎn)崩。

環(huán)境問(wèn)題?

發(fā)現(xiàn)這個(gè)問(wèn)題確實(shí)有點(diǎn)詭異,走到這一步,「我?guī)缀蹩梢詳喽ㄊ荓inux開(kāi)發(fā)環(huán)境出了問(wèn)題,但是不確定是我的機(jī)器環(huán)境問(wèn)題還是 Linux下 VSCode 本身問(wèn)題,那怎么辦呢?先來(lái)證明是Linux下才出的問(wèn)題吧」

我就嘗試不開(kāi)遠(yuǎn)程開(kāi)發(fā)模式,把遠(yuǎn)程Linux機(jī)器上的工程直接拉到宿主機(jī)本地文件夾,然后用VSCode打開(kāi)宿主機(jī)上的本地工程,「它竟然工作的很好,完全沒(méi)有出現(xiàn)什么錯(cuò)誤提示,到這,已經(jīng)完全可以確定這個(gè)bug只在Linux環(huán)境下出現(xiàn)了」

「夜已深,起來(lái)喝杯水,看了下時(shí)間,加班班車(chē)快到末班了?!?/strong>

事已至此,看來(lái)真的要關(guān)掉遠(yuǎn)程開(kāi)發(fā),在本地重新配置所有工程了,表面上還是勸自己再找找原因,沒(méi)事,問(wèn)題不大。

插件問(wèn)題?

喝完水,我坐下來(lái)繼續(xù)想,「會(huì)不會(huì)是C++擴(kuò)展出了問(wèn)題呢?大家都知道VSCode只能說(shuō)是一個(gè)編輯器,能夠讓他變身C++ IDE完全是有背后的C++插件或者叫擴(kuò)展的支持」。

就是下面黑黑的這貨,它是VSCode能夠支持C++開(kāi)發(fā)背后的男人,眾所周知VSCode是微軟親兒子,看看這個(gè)插件作者Microsoft 看來(lái)也是微軟自家人開(kāi)發(fā)的插件,發(fā)布之前肯定是經(jīng)過(guò)嚴(yán)格測(cè)試的,問(wèn)題不大。

C++擴(kuò)展

不過(guò)現(xiàn)在誰(shuí)也不能相信,即使是微軟自家的插件也不能信任了,假裝冷靜分析一波。

經(jīng)過(guò)嚴(yán)謹(jǐn)?shù)乃伎迹ㄈ欢](méi)有),最終決定拿出程序員必殺技:「重啟試試,卸載重裝」。

點(diǎn)擊卸載,卸載完成,點(diǎn)擊安裝,重裝完成,重啟加載,一氣呵成。

興奮的搓小手手,準(zhǔn)備再次見(jiàn)證奇跡,WTF,問(wèn)題依舊沒(méi)能解決,實(shí)話告訴大家,做到這個(gè)份上,檸檬哥可以說(shuō)是已經(jīng)非常的絕望了。

正道的光

真相只有一個(gè)

不管了先回去睡一覺(jué),夢(mèng)里啥都有,沒(méi)準(zhǔn)第二天白天又有了新思路。

果然第二天我又有了新想法,雖然卸載重裝插件沒(méi)用,但我們程序員還有最后一招:「回退版本」!

是時(shí)候表演真正的技術(shù)了,「資深程序員肯定懂的,常在河邊站哪有不濕鞋,版本發(fā)布出問(wèn)題,趕緊回退保命是常規(guī)操作」。

那我們就有理由懷疑:「微軟在發(fā)布這個(gè)插件最新版本的的時(shí)候把一個(gè)重要特性搞掉了」。但是這東西發(fā)都發(fā)出去了,也不是服務(wù)端后臺(tái)服務(wù)說(shuō)回退就能回退的,這個(gè)插件如果真是bug也只能等下一個(gè)版本修復(fù),還是我們自己來(lái)操作回退吧。

找到插件,按下面方法來(lái)執(zhí)行回退操作:

安裝低版本

檸檬當(dāng)時(shí)回退的時(shí)候還沒(méi)有出最新的修復(fù)版本,裝的是有問(wèn)題的1.0.0版本的插件,「看這個(gè)版本號(hào)應(yīng)該是個(gè)較大改動(dòng)的大版本,出問(wèn)題也正?!?/strong>。

關(guān)鍵是「可以看到這個(gè)版本的發(fā)布時(shí)間點(diǎn)剛好是我發(fā)現(xiàn)bug的時(shí)間」,這回感覺(jué)離真相越來(lái)越近了,至少在時(shí)間上是吻合的有底氣了點(diǎn),那有理由懷疑是這個(gè)插件出了問(wèn)題,回退到上一個(gè)穩(wěn)定版本0.29.0

選擇插件安裝版本

「這次奇跡真的出現(xiàn)了,「查找引用功能」它回來(lái)了」!而且也沒(méi)有出現(xiàn)FE: 'Compiler exited with error - No IL available'的報(bào)錯(cuò)提示,為了進(jìn)一步確認(rèn)自己的判斷,我又把插件升級(jí)到1.0.0版本(穩(wěn)了),果然又出現(xiàn)了剛才的問(wèn)題。

「至此,這個(gè)bug算是定位成功,并且可復(fù)現(xiàn)驗(yàn)證,暫時(shí)的解決方法是回退到上一個(gè)穩(wěn)定版本」。

離線安裝

另外提醒一下,公司其他同學(xué)也遇到這個(gè)問(wèn)題,我在幫其他同學(xué)解決這個(gè)問(wèn)題的時(shí)候,發(fā)現(xiàn)有些人直接升級(jí)可能會(huì)有網(wǎng)絡(luò)問(wèn)題,導(dǎo)致在線升級(jí)不了,報(bào)錯(cuò):

自動(dòng)升級(jí)下載失敗

這時(shí)候可以去上面我發(fā)的官網(wǎng)下載離線版本插件安裝包,下完之后,按照下面的操作升級(jí)即可,效果和在線升級(jí)一樣。

離線安裝插件步驟

注意了,由于一些眾所周知的原因,「如果你打不開(kāi)官網(wǎng)或者下載速度很慢,可以加文末我個(gè)人微信,備注「下載插件」我發(fā)給你已經(jīng)下載好的插件」。

推動(dòng)版本更新

提issue報(bào)bug

這就完了嗎?當(dāng)然不是。「費(fèi)了我這么大功夫找出來(lái)的bug,不要再浪費(fèi)其他人時(shí)間了,所以我決定去微軟這個(gè)插件的官方倉(cāng)庫(kù)去給他們提 issue,這里給不了解 Github 開(kāi)源項(xiàng)目的同學(xué)科普下什么是issue ? 「上課了,看黑板」!

?Github項(xiàng)目的 issue 用于團(tuán)隊(duì)協(xié)作管理,可以把將要實(shí)現(xiàn)的 feature 或者要修復(fù)的 bug 通過(guò)提 issue的形式記錄下來(lái),所以我們?nèi)绻l(fā)現(xiàn)開(kāi)源項(xiàng)目的bug,可以通過(guò)給開(kāi)源項(xiàng)目提issue的形式報(bào)告這個(gè)bug,提醒項(xiàng)目團(tuán)隊(duì)修復(fù)跟進(jìn)。

這里給出微軟官方C/C++ 插件的github倉(cāng)庫(kù)地址:https://github.com/microsoft/vscode-cpptools

我去寫(xiě)下了下面這個(gè)issue ,雖然是英文描述的,大家應(yīng)該都能看得懂我就不逐字翻譯了,計(jì)算機(jī)相關(guān)的英文來(lái)回就那么幾個(gè)單詞,看多了就會(huì)寫(xiě),大意就是描述了我遇到的bug和問(wèn)題出現(xiàn)時(shí)的環(huán)境配置信息,方便他們定位和復(fù)現(xiàn)問(wèn)題。

issue 標(biāo)題:C/C++ Extension 1.0.0 some feature Not working When using in Remote-SSH remote development #6176

issue描述

并且詳細(xì)描述了我遇到的問(wèn)題,其實(shí)經(jīng)過(guò)上面一頓操作,檸檬肯定是他們這個(gè)版本有問(wèn)題,「但還要友好溝通推進(jìn)問(wèn)題盡快解決才是目的,寫(xiě)代碼的何苦為難寫(xiě)代碼的」,沒(méi)有直接說(shuō)他們有問(wèn)題,而是委婉的問(wèn)了下 I wonder if there is a problem with this latest Extension ? 哈哈

完美解決

我提issue的時(shí)候是中午吃飯的時(shí)候12點(diǎn)左右,那時(shí)美國(guó)那邊應(yīng)該還是凌晨,我想肯定沒(méi)這么快有回復(fù)了,國(guó)外程序員小哥都還在睡覺(jué)呢,怎么也得早上上班才能看到之后回復(fù),「但是萬(wàn)萬(wàn)沒(méi)想到在下午5點(diǎn)左右就收到了回復(fù),果然神速」

issue交流

「不過(guò),等等,好像哪里有點(diǎn)不對(duì)勁」,注意上面圖中具體時(shí)間已經(jīng)沒(méi)顯示了,只是顯示一個(gè) 2 days ago,在我看到消息通知的時(shí)候有點(diǎn)詫異處理這么神速,好奇去翻開(kāi)處理issue老哥的 github 主頁(yè)介紹。

回復(fù)的這位是微軟VS Code C++ Extension的軟件開(kāi)發(fā)工程師,然后定位是美國(guó)的Redmod, WA ,特意去查了當(dāng)時(shí)的美國(guó)時(shí)間是05:03,這位老哥是在凌晨5點(diǎn)鐘處理的這個(gè)bug。。。「這也太優(yōu)秀了吧,果然大佬們都是半夜寫(xiě)代碼不用睡覺(jué)的,看到凌晨五點(diǎn)的太陽(yáng)我信了」。

VS Code C++ Extension工程師

復(fù)盤(pán)一下

「到了這里,這個(gè)bug從出現(xiàn)在我的機(jī)子上,到定位查找,最終修復(fù)算是完美的解決」。這里附上官方的版本鏈接:https://github.com/microsoft/vscode-cpptools/releases ,里面有提到本次修復(fù)的bug。

版本更新

按照最新的1.0.1 版本發(fā)布說(shuō)明,「如果你使用 Linux/MAC 版本的VSCode 或者像我這樣用遠(yuǎn)程開(kāi)發(fā)的方式從宿主機(jī)使用Linux版本,可能會(huì)遇到我文中說(shuō)的bug」,我是在0.29.0自動(dòng)升級(jí)到1.0.0發(fā)現(xiàn)的bug,于是給1.0.0版本報(bào)了個(gè)issue,微軟官方在1.0.1版本修復(fù)了上述的bug,「一張圖看清時(shí)間線」

版本列表

檸檬在這里建議:正在使用0.29.0版本插件的同學(xué)不升也沒(méi)啥大問(wèn)題,但如果你用的是1.0.0版本,那就要注意了,這個(gè)版本在本文描述的場(chǎng)景下是有問(wèn)題的,還是及時(shí)升級(jí)到最新版本為好

其實(shí)今天這樣的場(chǎng)景也是程序員日常工作的真實(shí)寫(xiě)照,我們每天都在處理類(lèi)似的事情,奇奇怪怪的bug有一千種產(chǎn)生方式,要做的就是把他怎么產(chǎn)生的原因找出來(lái),從這個(gè)角度來(lái)說(shuō)程序員個(gè)個(gè)都是福爾摩斯

文章來(lái)源于公眾號(hào):后端技術(shù)學(xué)堂 ,作者:LemonCoder

以上就是W3Cschool編程獅關(guān)于發(fā)現(xiàn)VSCode的一個(gè)bug,微軟工程師竟然凌晨回復(fù)...的相關(guān)介紹了,希望對(duì)大家有所幫助。

0 人點(diǎn)贊