最近遇到一個(gè)有意思的bug,是關(guān)于VSCode編輯器插件的,趕項(xiàng)目時(shí)間非常緊,說實(shí)話在這時(shí)平常用的順手的IDE出問題非常影響心情?!高@就像是你開在高速路上,吃著火鍋唱著歌,突然輪胎爆了,你說氣不氣人」。
不過在找bug和推動修復(fù)bug的過程有點(diǎn)意思,「通過一系列嘗試最終定位和復(fù)現(xiàn)了bug,并且給這個(gè)項(xiàng)目的微軟官方倉庫提了issue,最終在最新版本得到了修復(fù),把這個(gè)有趣的過程分享給大家」。
「也給大家演示一下如何通過提 issue 的方式參與到開源項(xiàng)目中」,當(dāng)然,參與開源項(xiàng)目的方式有多種,「你可以給項(xiàng)目貢獻(xiàn)源碼,甚至作為大使幫助推廣項(xiàng)目,找到項(xiàng)目的bug進(jìn)而提issue也是一種參與方式」,總之先參與進(jìn)來,才能發(fā)現(xiàn)開源的樂趣!
詭異的報(bào)錯
上周,又是一個(gè)在公司的夜晚,好像和平常沒啥區(qū)別,檸檬哥在加班ing,飛快的敲打著自己的機(jī)械鍵盤,熟練的用 VSCode 瀏覽著項(xiàng)目源碼,順手按下F12+Shift
想看看這個(gè)函數(shù)在哪些地方被引用了,詭異的事情發(fā)生了,這VSCode它竟然不聽使喚了,查不出引用的結(jié)果了,并且終端提示如下錯誤:
快速信息操作失敗: FE: 'Compiler exited with error - No IL available'
快速信息操作失敗: FE: 'Compiler exited with error - No IL available'
一開始我以為是單個(gè)工程解析問題,「不慌,問題不大」。
后來換了個(gè)工程嘗試,「不論我如何的反復(fù)摩擦我潔白的鍵盤帽,始終不能出來查找引用的結(jié)果界面」,這時(shí)才發(fā)現(xiàn),粗大事了。工欲善其事必先利其器,雖然進(jìn)度有點(diǎn)趕,還是停下來康康是誰在搗鬼?
如果不能查找引用的話,那會對編碼和閱讀源碼帶來很大的不便,「這個(gè)功能算的上是IDE的基礎(chǔ)功能了,如果連這功能都廢了,那我要你這VSCode有何用」?如果不能修復(fù)的話我估計(jì)要跑拋棄它,用回 Visual Studio 或 CLion。
但是VSCode遠(yuǎn)程開發(fā)是真的香,并且已經(jīng)習(xí)慣了VSCode操作,在放棄之前還想掙扎下,看還能不能搶救?不過如果實(shí)在不行,也沒時(shí)間死磕,項(xiàng)目還要繼續(xù),大不了換個(gè) IDE 繼續(xù)玩,甚至都想好了以面再也不說VSCode香了。
一起來找bug呀
雖然這個(gè)插件不是我寫的,但我按照一般程序員排查bug的思路,通過下面幾個(gè)步驟一步步來找到問題原因,最終并推動官方的版本更新來修復(fù),一起來看看吧。
軟件問題?
「首先,來看看是不是VSCode版本升級導(dǎo)致的問題」。按下面的操作,我檢查 VSCode 的版本信息。
仔細(xì)核對版本號和官網(wǎng)的區(qū)別,對比問題出現(xiàn)的時(shí)間前后都沒有升級過新版本。
OK,「應(yīng)該不是 VSCode 版本升級導(dǎo)致的問題」。
配置問題?
既然不是 VSCode 升級版本導(dǎo)致的問題,那就奇了怪了,白天還好好的晚上突然咋就不行了呢?難道這插件也不想加班了?我陷入了沉思,不過馬上靈機(jī)一動,「會不會小心改了C++環(huán)境配置文件出了問題」?
「這里有個(gè)知識點(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
搜索路徑配置的有問題,才導(dǎo)致查找引用失敗了,趕緊去檢查一眼配置文件,于是熟練的敲下Ctrl+Shift+P
「查找所有命令和配置」(「敲黑板!這個(gè)命令很常用,背下來」),輸入關(guān)鍵字c++ Edit
果然匹配到了配置文件,打開就是上面的配置文件。
但是看起來文件路徑好像是對的,不管了,死馬當(dāng)活馬醫(yī),先全部刪除重新配置一遍看看效果,一頓操作之后興奮的檢查有沒有用,然并卵,還是那個(gè)該死的提示FE: 'Compiler exited with error - No IL available'
,心態(tài)有點(diǎn)崩。
環(huán)境問題?
發(fā)現(xiàn)這個(gè)問題確實(shí)有點(diǎn)詭異,走到這一步,「我?guī)缀蹩梢詳喽ㄊ荓inux開發(fā)環(huán)境出了問題,但是不確定是我的機(jī)器環(huán)境問題還是 Linux下 VSCode 本身問題,那怎么辦呢?先來證明是Linux下才出的問題吧」!
我就嘗試不開遠(yuǎn)程開發(fā)模式,把遠(yuǎn)程Linux機(jī)器上的工程直接拉到宿主機(jī)本地文件夾,然后用VSCode打開宿主機(jī)上的本地工程,「它竟然工作的很好,完全沒有出現(xiàn)什么錯誤提示,到這,已經(jīng)完全可以確定這個(gè)bug只在Linux環(huán)境下出現(xiàn)了」。
「夜已深,起來喝杯水,看了下時(shí)間,加班班車快到末班了?!?/strong>
事已至此,看來真的要關(guān)掉遠(yuǎn)程開發(fā),在本地重新配置所有工程了,表面上還是勸自己再找找原因,沒事,問題不大。
插件問題?
喝完水,我坐下來繼續(xù)想,「會不會是C++擴(kuò)展出了問題呢?大家都知道VSCode只能說是一個(gè)編輯器,能夠讓他變身C++ IDE完全是有背后的C++插件或者叫擴(kuò)展的支持」。
就是下面黑黑的這貨,它是VSCode能夠支持C++開發(fā)背后的男人,眾所周知VSCode是微軟親兒子,看看這個(gè)插件作者Microsoft
看來也是微軟自家人開發(fā)的插件,發(fā)布之前肯定是經(jīng)過嚴(yán)格測試的,問題不大。
不過現(xiàn)在誰也不能相信,即使是微軟自家的插件也不能信任了,假裝冷靜分析一波。
經(jīng)過嚴(yán)謹(jǐn)?shù)乃伎迹ㄈ欢]有),最終決定拿出程序員必殺技:「重啟試試,卸載重裝」。
點(diǎn)擊卸載,卸載完成,點(diǎn)擊安裝,重裝完成,重啟加載,一氣呵成。
興奮的搓小手手,準(zhǔn)備再次見證奇跡,WTF,問題依舊沒能解決,實(shí)話告訴大家,做到這個(gè)份上,檸檬哥可以說是已經(jīng)非常的絕望了。
正道的光
真相只有一個(gè)
不管了先回去睡一覺,夢里啥都有,沒準(zhǔn)第二天白天又有了新思路。
果然第二天我又有了新想法,雖然卸載重裝插件沒用,但我們程序員還有最后一招:「回退版本」!
是時(shí)候表演真正的技術(shù)了,「資深程序員肯定懂的,常在河邊站哪有不濕鞋,版本發(fā)布出問題,趕緊回退保命是常規(guī)操作」。
那我們就有理由懷疑:「微軟在發(fā)布這個(gè)插件最新版本的的時(shí)候把一個(gè)重要特性搞掉了」。但是這東西發(fā)都發(fā)出去了,也不是服務(wù)端后臺服務(wù)說回退就能回退的,這個(gè)插件如果真是bug也只能等下一個(gè)版本修復(fù),還是我們自己來操作回退吧。
找到插件,按下面方法來執(zhí)行回退操作:
檸檬當(dāng)時(shí)回退的時(shí)候還沒有出最新的修復(fù)版本,裝的是有問題的1.0.0版本的插件,「看這個(gè)版本號應(yīng)該是個(gè)較大改動的大版本,出問題也正?!?/strong>。
關(guān)鍵是「可以看到這個(gè)版本的發(fā)布時(shí)間點(diǎn)剛好是我發(fā)現(xiàn)bug的時(shí)間」,這回感覺離真相越來越近了,至少在時(shí)間上是吻合的有底氣了點(diǎn),那有理由懷疑是這個(gè)插件出了問題,回退到上一個(gè)穩(wěn)定版本0.29.0
「這次奇跡真的出現(xiàn)了,「查找引用功能」它回來了」!而且也沒有出現(xiàn)FE: 'Compiler exited with error - No IL available'
的報(bào)錯提示,為了進(jìn)一步確認(rèn)自己的判斷,我又把插件升級到1.0.0版本(穩(wěn)了),果然又出現(xiàn)了剛才的問題。
「至此,這個(gè)bug算是定位成功,并且可復(fù)現(xiàn)驗(yàn)證,暫時(shí)的解決方法是回退到上一個(gè)穩(wěn)定版本」。
離線安裝
另外提醒一下,公司其他同學(xué)也遇到這個(gè)問題,我在幫其他同學(xué)解決這個(gè)問題的時(shí)候,發(fā)現(xiàn)有些人直接升級可能會有網(wǎng)絡(luò)問題,導(dǎo)致在線升級不了,報(bào)錯:
這時(shí)候可以去上面我發(fā)的官網(wǎng)下載離線版本插件安裝包,下完之后,按照下面的操作升級即可,效果和在線升級一樣。
注意了,由于一些眾所周知的原因,「如果你打不開官網(wǎng)或者下載速度很慢,可以加文末我個(gè)人微信,備注「下載插件」我發(fā)給你已經(jīng)下載好的插件」。
推動版本更新
提issue報(bào)bug
這就完了嗎?當(dāng)然不是。「費(fèi)了我這么大功夫找出來的bug,不要再浪費(fèi)其他人時(shí)間了,所以我決定去微軟這個(gè)插件的官方倉庫去給他們提 issue
」,這里給不了解 Github 開源項(xiàng)目的同學(xué)科普下什么是issue
? 「上課了,看黑板」!
?Github項(xiàng)目的 issue 用于團(tuán)隊(duì)協(xié)作管理,可以把將要實(shí)現(xiàn)的 feature 或者要修復(fù)的 bug 通過提 issue的形式記錄下來,所以我們?nèi)绻l(fā)現(xiàn)開源項(xiàng)目的bug,可以通過給開源項(xiàng)目提issue的形式報(bào)告這個(gè)bug,提醒項(xiàng)目團(tuán)隊(duì)修復(fù)跟進(jìn)。
這里給出微軟官方C/C++ 插件的github倉庫地址:https://github.com/microsoft/vscode-cpptools
我去寫下了下面這個(gè)issue ,雖然是英文描述的,大家應(yīng)該都能看得懂我就不逐字翻譯了,計(jì)算機(jī)相關(guān)的英文來回就那么幾個(gè)單詞,看多了就會寫,大意就是描述了我遇到的bug和問題出現(xiàn)時(shí)的環(huán)境配置信息,方便他們定位和復(fù)現(xiàn)問題。
issue 標(biāo)題:C/C++ Extension 1.0.0 some feature Not working When using in Remote-SSH remote development #6176
并且詳細(xì)描述了我遇到的問題,其實(shí)經(jīng)過上面一頓操作,檸檬肯定是他們這個(gè)版本有問題,「但還要友好溝通推進(jìn)問題盡快解決才是目的,寫代碼的何苦為難寫代碼的」,沒有直接說他們有問題,而是委婉的問了下 I wonder if there is a problem with this latest Extension ?
哈哈
完美解決
我提issue的時(shí)候是中午吃飯的時(shí)候12點(diǎn)左右,那時(shí)美國那邊應(yīng)該還是凌晨,我想肯定沒這么快有回復(fù)了,國外程序員小哥都還在睡覺呢,怎么也得早上上班才能看到之后回復(fù),「但是萬萬沒想到在下午5點(diǎn)左右就收到了回復(fù),果然神速」。
「不過,等等,好像哪里有點(diǎn)不對勁」,注意上面圖中具體時(shí)間已經(jīng)沒顯示了,只是顯示一個(gè) 2 days ago
,在我看到消息通知的時(shí)候有點(diǎn)詫異處理這么神速,好奇去翻開處理issue老哥的 github 主頁介紹。
回復(fù)的這位是微軟VS Code C++ Extension
的軟件開發(fā)工程師,然后定位是美國的Redmod, WA
,特意去查了當(dāng)時(shí)的美國時(shí)間是05:03
,這位老哥是在凌晨5點(diǎn)鐘處理的這個(gè)bug。。。「這也太優(yōu)秀了吧,果然大佬們都是半夜寫代碼不用睡覺的,看到凌晨五點(diǎn)的太陽我信了」。
復(fù)盤一下
「到了這里,這個(gè)bug從出現(xiàn)在我的機(jī)子上,到定位查找,最終修復(fù)算是完美的解決」。這里附上官方的版本鏈接:https://github.com/microsoft/vscode-cpptools/releases ,里面有提到本次修復(fù)的bug。
按照最新的1.0.1 版本發(fā)布說明,「如果你使用 Linux/MAC 版本的VSCode 或者像我這樣用遠(yuǎn)程開發(fā)的方式從宿主機(jī)使用Linux版本,可能會遇到我文中說的bug」,我是在0.29.0自動升級到1.0.0發(fā)現(xiàn)的bug,于是給1.0.0版本報(bào)了個(gè)issue,微軟官方在1.0.1版本修復(fù)了上述的bug,「一張圖看清時(shí)間線」。
檸檬在這里建議:正在使用0.29.0版本插件的同學(xué)不升也沒啥大問題,但如果你用的是1.0.0版本,那就要注意了,這個(gè)版本在本文描述的場景下是有問題的,還是及時(shí)升級到最新版本為好。
其實(shí)今天這樣的場景也是程序員日常工作的真實(shí)寫照,我們每天都在處理類似的事情,奇奇怪怪的bug有一千種產(chǎn)生方式,要做的就是把他怎么產(chǎn)生的原因找出來,從這個(gè)角度來說程序員個(gè)個(gè)都是福爾摩斯。
文章來源于公眾號:后端技術(shù)學(xué)堂 ,作者:LemonCoder
以上就是W3Cschool編程獅
關(guān)于發(fā)現(xiàn)VSCode的一個(gè)bug,微軟工程師竟然凌晨回復(fù)...的相關(guān)介紹了,希望對大家有所幫助。