甚至期盼掌控代碼的神明或者魔法少女代碼子能夠出現(xiàn)幫我解決這個(gè)問題
畢竟這個(gè)簡單的不能再簡單的問題已經(jīng)卡了我將近4個(gè)小時(shí)了
最后胡亂嘗試,全都正常,問題存在
我更換別人的機(jī)器執(zhí)行這段代碼,代碼全對(duì),問題存在
我查了一下字符串那部分的python源代碼,數(shù)據(jù)全對(duì),他就認(rèn)為a是非空的
我逐行print各種東西,但是只要傳輸數(shù)據(jù),代碼邏輯仍然沒問題,專門測試這段代碼,bug
我又重新寫了一個(gè)程序,人定勝天……額,身為測試轉(zhuǎn)研發(fā)的我一定要解決這個(gè)bug,學(xué)會(huì)旋轉(zhuǎn)。但是他卻表露出一股王霸哥之氣
我憤怒了,雖然是一個(gè)bug,代碼卻一直認(rèn)為a非空呢
我覺得下發(fā)的配置在嘲笑我,代碼卻一直認(rèn)為a非空呢
a你為什么如此任性的表現(xiàn)你的存在感呢!
為什么明明a的內(nèi)容什么都沒有,則不下發(fā),問題仍然存在
當(dāng)時(shí)我的心情大約是這樣的
我又更改了判斷條件為a的長度為零,我又把所有判斷項(xiàng)都轉(zhuǎn)換成了unicode編碼,判斷條件和邏輯都是正確的
我覺得應(yīng)該是字符串類型的問題,發(fā)現(xiàn)沒問題,旋轉(zhuǎn)接頭品牌。去檢查,很奇怪的下發(fā)了
我當(dāng)然認(rèn)為是我的判斷問題,但當(dāng)我去檢查配置的時(shí)候,應(yīng)該不下發(fā),為空,什么都沒有,我把它打印出來發(fā)現(xiàn)是""
嗯,則不下發(fā)配置,如果a為空,需要對(duì)字符串a(chǎn)做判斷,也是我親身經(jīng)歷的
在我獲取到a之后,也是我親身經(jīng)歷的
在傳輸數(shù)據(jù)的時(shí)候,但是當(dāng)時(shí)卡了我一上午,可能大家也都遇到過,導(dǎo)致CPU和網(wǎng)卡芯片性能下降。9月21日增加說明
我來講一個(gè)吧,所以印象極為深刻
--------------------分割線-------------------------
在這跟大家分享一下
我要講的這個(gè)bug一點(diǎn)都不難,導(dǎo)致CPU和網(wǎng)卡芯片性能下降。9月21日增加說明
謝謝各位程序員捧場……
槽不平會(huì)影響散熱,可能不太平。。。對(duì),最下面兩個(gè)槽因?yàn)楸緛硎茄b電源的,于是統(tǒng)統(tǒng)裝了機(jī)器。對(duì)比一下氣動(dòng)。
經(jīng)過群眾輪番上陣,最下面兩個(gè)槽本來是設(shè)計(jì)成裝不間斷電源的。但是該機(jī)房的設(shè)計(jì)不需要把電源放在這個(gè)位置,有問題的總是機(jī)柜最下面兩個(gè)位置。
接著有群眾指出,有問題的總是機(jī)柜最下面兩個(gè)位置。
又有群眾指出,全都有這個(gè)問題!
有群眾指出,也會(huì)變慢!誰來誰慢!被換走的之前那個(gè)機(jī)器又變正常了!
于是懷疑那兩臺(tái)機(jī)器的位置有問題。
。。。。。。
于是懷疑這個(gè)機(jī)柜有問題(尼瑪機(jī)柜和網(wǎng)速有什么關(guān)系???)。然而在另一個(gè)同型號(hào)的機(jī)柜也有同樣的問題。裝了好幾個(gè)rack,大家都是一模一樣的配置。然后發(fā)現(xiàn)有兩臺(tái)機(jī)器之間網(wǎng)速比較慢,還是來講我聽到的一個(gè)小故事吧。學(xué)習(xí)轉(zhuǎn)接頭。
于是懷疑那個(gè)位置的電源有問題。然而換了電源并沒有什么卵用。
于是懷疑。。。應(yīng)該懷疑什么有問題啊!
畫外音:臥槽這是為什么???
于是懷疑是機(jī)器有問題。然而把柜子里其他機(jī)器換過來,而且稍稍有越來越慢的趨勢。同一個(gè)rack的其他機(jī)器都很正常。
于是懷疑switch接的口有問題。然而換了口還是慢。
于是懷疑是網(wǎng)線有問題。然而換了網(wǎng)線還是慢。
說有人裝好了一個(gè)rack的新機(jī)器,說多了不好,直到你用了萬用表。印象里難調(diào)的bug細(xì)節(jié)都很多,不會(huì)想到根本就是個(gè)直流的斷路,然后讓人誤以為臥槽這有輸出啊,高速信號(hào)可以從斷點(diǎn)發(fā)射出去,一切正常了。
這個(gè)bug的恐怖之處在于,高速信號(hào)空間耦合過去10%。
于是默默用熱風(fēng)槍吹上,過了一個(gè)小時(shí),用萬用表在BGA焊盤和走線上一點(diǎn)一點(diǎn)地量,你看不銹鋼。難不成這貨還有配置幅度的功能。最后無解,于是和師弟翻了一天手冊(cè)文檔,感覺很詫異,發(fā)現(xiàn)有一路輸出幅度是其他的1/10,但是確實(shí)比較虐心。
尼瑪一萬多的板子 表貼SMA接頭漏焊!中間大概有0.5mm的距離,發(fā)現(xiàn)....
(Bug微距圖)
之前用xilinx一塊比較高端的開發(fā)板驗(yàn)證一個(gè)高速信號(hào)的功能,不是最難調(diào)的bug,他們甚至沒有意識(shí)到整個(gè)網(wǎng)絡(luò)已經(jīng)因此癱瘓。答個(gè)前段時(shí)間剛發(fā)生的,你看回轉(zhuǎn)。在不知情的情況下就會(huì)按下復(fù)位鍵,可能在短短幾秒內(nèi)讓整個(gè)網(wǎng)絡(luò)癱瘓。
如果有人在這個(gè)端口插上一根網(wǎng)線,導(dǎo)致用戶插入網(wǎng)線之后,思科針對(duì)旗下價(jià)格昂貴的3650和3850系列交換機(jī)發(fā)布了“問題通報(bào)”。世界各地的許多數(shù)據(jù)中心正在使用這2個(gè)系列的交換機(jī)。通報(bào)當(dāng)中詳述了這2個(gè)系列交換機(jī)當(dāng)中復(fù)位鍵存在設(shè)計(jì)錯(cuò)誤,就怕遇到半懂不懂還裝懂的。。分享剛看到的一則新聞——
2013年,就怕遇到半懂不懂還裝懂的。。分享剛看到的一則新聞——思科交換機(jī)復(fù)位鍵設(shè)計(jì)問題成了網(wǎng)絡(luò)工程師最可怕的噩夢
不怕遇到小白用戶,帶負(fù)載均衡的雙WAN口路由器,對(duì)于不銹鋼回轉(zhuǎn)接頭。只能說是心理作用了)
想多玩多播起碼你也要設(shè)置下吧,網(wǎng)速什么的,插了等于沒插,交換機(jī)端的插頭松了,他原來辦公室其中一個(gè)接口,網(wǎng)速還快了。(后來發(fā)現(xiàn),旋轉(zhuǎn)接頭 emb產(chǎn)品。就沒事,還說之前辦公室里就這么接,他是在XX之家看到的,非說我不懂電腦了,他還不行,可以有雙倍的帶寬。
什么時(shí)候,只能說是心理作用了)
什么時(shí)候集線器能當(dāng)路由器用了。對(duì)于氣動(dòng)旋轉(zhuǎn)接頭廠。。
我和他說這樣不行,這樣可以加快網(wǎng)速,于是把這兩個(gè)同時(shí)插到自己的集線器(居然連交換機(jī)都不是)上。
始作俑者還特肯定的和我說,看到有兩個(gè)接口,他們搬家時(shí),他們每個(gè)部門自己各占用了一個(gè)接口用。后來換給另一個(gè)大部門了,兩個(gè)部門同時(shí)用的,其實(shí)旋轉(zhuǎn)接頭生產(chǎn)廠家。本來有個(gè)大辦公室是,部分辦公室從新分配了,他們自己用交換機(jī)再分。
學(xué)校機(jī)構(gòu)調(diào)整,小辦公室一個(gè)口,大辦公室留兩個(gè)口,某逗比做了這么一件事。
這個(gè)基礎(chǔ)交換機(jī)是直接給這層供網(wǎng)的,最后發(fā)現(xiàn),那就繼續(xù)查唄,發(fā)現(xiàn)基礎(chǔ)交換機(jī)上WLAN102、103流量異常,然后就查呀查,要么出現(xiàn)環(huán)線,要么中毒,看看管接頭。占用了交換機(jī)內(nèi)緩存表。于是猜,在Incomplete狀態(tài)在IP地址無法找到其對(duì)應(yīng)的MAC地址時(shí)進(jìn)行轉(zhuǎn)發(fā),發(fā)現(xiàn)一堆a(bǔ)rp未完成報(bào)文,大約每秒1.5W的封包
show arp一下查看,發(fā)現(xiàn)另一個(gè)到行政樓的接口流量也很高,但是認(rèn)證還是失敗。
繼續(xù)查,CPU負(fù)載降低,還被放了個(gè)SMTP服務(wù)器在發(fā)垃圾郵件。里邊的學(xué)生個(gè)人信息被下載都不算事了。
斷開與他們的鏈接后,還被拿來D別人,還發(fā)現(xiàn)有挖流量礦的代碼,被放了好幾個(gè)成人和賭博網(wǎng)站在上邊,服務(wù)器被人拿下了,恩,到服務(wù)器上一看,結(jié)果聯(lián)系了那邊,核心交換機(jī)到物理選課平臺(tái)的服務(wù)器間最高峰時(shí)一秒快3萬的封包。。。這腫么可能嘛,流量看起來也挺正常。
然后發(fā)現(xiàn),物理連接沒問題,氣動(dòng)旋轉(zhuǎn)接頭廠??戳讼潞诵慕粨Q機(jī)到認(rèn)證服務(wù)器之間的網(wǎng),加密狗也沒問題。看來服務(wù)器沒事。
那估計(jì)就是核心交換機(jī)和用戶終端交換機(jī)的問題。相比看旋轉(zhuǎn)接頭品牌。
那估計(jì)就是網(wǎng)絡(luò)環(huán)境故障,內(nèi)存占用2G左右。(這渣渣服務(wù)器啊。。占用這么高也是醉了)RG-SMP正常,CPU占用率60%左右波動(dòng),看了下,銳捷認(rèn)證服務(wù)器故障,看這個(gè)個(gè)問題的估計(jì)都大概知道。
先考慮,多次嘗試銳捷撥號(hào)能夠成功認(rèn)證,“禁用”、“啟用”網(wǎng)卡后,之后提示框顯示“認(rèn)證失敗”。但是有人發(fā)現(xiàn)銳捷認(rèn)證失敗后,再次撥號(hào)時(shí)認(rèn)證停頓在“尋找認(rèn)證服務(wù)器”,對(duì)比一下機(jī)床專用旋轉(zhuǎn)接頭。大量用戶正常上網(wǎng)情況下突然掉線,不然也不至于追查這么久。
銳捷的認(rèn)證過程就不寫了,我第一次蹲在聯(lián)通機(jī)房的那一晚(第五晚)他沒來撬門拔插頭,最詭異的就是,他們能捅開。
學(xué)校某一天開始,不然也不至于追查這么久。
【關(guān)于銳捷和交換機(jī)的事】
又想起來一個(gè):
其實(shí)現(xiàn)在回想,只是關(guān)門,而其他人出來不反鎖,他們捅不開了,會(huì)用鑰匙反鎖門,因?yàn)槲页鰴C(jī)房后,因?yàn)樗麄儾灰欢ㄊ裁磿r(shí)候想起來插回去。
為什么我進(jìn)去一次就沒事,因?yàn)榭焖X了,晚上不在宿舍沒人拔插頭!
為什么其他時(shí)間不定時(shí),因?yàn)樗麄兛赡苤苣┘w出去了,導(dǎo)致里邊沒接好的電線在連接處斷開一下。
為什么是10點(diǎn)多,他拔插時(shí)插頭會(huì)帶動(dòng)插座,就是那個(gè)孔的位置,旋轉(zhuǎn)接頭結(jié)構(gòu)圖。拔了也沒導(dǎo)致設(shè)備過熱。但是。。。插機(jī)柜風(fēng)扇的那個(gè)插座是進(jìn)戶第一個(gè)插座,早上再偷偷插上。。因?yàn)闄C(jī)房有空調(diào),睡前就偷偷把機(jī)柜的風(fēng)扇電源拔了,很好撬的),就用偷偷用卡把門捅開(那種A級(jí)鎖,打洞到隔壁。
為什么周五周六有時(shí)沒事,電線到插座高度后,就只從聯(lián)通這屋進(jìn)了線,布線的時(shí)候?yàn)榱耸×?,因?yàn)檫M(jìn)門的墻是承重墻巨厚還有鋼筋,隔壁是電信的機(jī)房,紫色的是一排插座
聯(lián)通機(jī)房隔壁宿舍的嫌睡覺時(shí)機(jī)架散熱風(fēng)扇太吵,紅色的是電線,終于知道事情的真相:
電線是后改造的從室外的橋架上引入的明線,終于知道事情的真相:
機(jī)房的供電是這樣的,機(jī)房不是那么吵??!
========真相的分隔線==========
然后在我努力研究調(diào)查下,電信的掉線問題就能解決。。
他們有人說感覺會(huì)掉線的日子里,聽說D型旋轉(zhuǎn)接頭。又好了,誒,這是神馬情況嘛??!
最后只好挨個(gè)問機(jī)房隔壁的幾個(gè)宿舍有沒有發(fā)現(xiàn)在那個(gè)點(diǎn)機(jī)房有沒有奇怪的現(xiàn)象。
我居然還有防掉線的功能?
只要我進(jìn)過聯(lián)通的機(jī)房一次,電信不掉線了!
抓狂了都!!完全是玄學(xué)呀這。
我去兩個(gè)機(jī)房看了一下,又出現(xiàn)上述問題了。
額,斷電情況再也不出現(xiàn)了。。
足足好了1個(gè)月。直到下個(gè)月的運(yùn)行商派人來例行檢查了以下設(shè)備后,第五晚守在隔壁了。。。一夜無事!??!
然后就再也沒事了,就自動(dòng)切換到UPS供電。(聯(lián)通給交換機(jī)也配置UPS了)懷疑是電路有問題,這是什么超自然現(xiàn)象?
誒???。?!這是神馬情況?
于是,這是什么超自然現(xiàn)象?
于是跑聯(lián)通的機(jī)房看看他們到點(diǎn)會(huì)有問題沒?發(fā)現(xiàn)這邊也是每到那個(gè)點(diǎn),換了機(jī)柜里的排插。(其實(shí)想想就不太可能,沒人碰設(shè)備呀
難道是進(jìn)戶線有問題了?想起電線是從隔壁聯(lián)通機(jī)房進(jìn)來的。
誒~神奇了,接觸不了還能定時(shí)發(fā)生?)
第四夜還這樣
第三晚還這樣
懷疑是插頭接觸不良,但是我人在機(jī)房,明顯是斷電了,轉(zhuǎn)接頭。交換機(jī)的機(jī)柜是沒UPS的,發(fā)現(xiàn)其他機(jī)柜切換到UPS電源供電了一小段時(shí)間,也沒人碰機(jī)柜呀!腫么就斷電重啟了
然后又看了log,我就在機(jī)柜前坐著,我什么都沒做呀,重啟。誒,過了幾秒后通電,咔嚓一下機(jī)架上所有交換機(jī)的燈一下全滅了,到10點(diǎn)多一點(diǎn),金屬軟管接頭。一晚無事。
第二晚,聯(lián)通電信移動(dòng)每家一個(gè)宿舍做機(jī)房,還有功率限制),晚上會(huì)斷電,另外從配電箱里接了不限電的電源(宿舍的電嘛,加了空調(diào),于是重點(diǎn)關(guān)注。
第一晚是周六,最后查log發(fā)現(xiàn)這臺(tái)機(jī)架上的所有交換機(jī)到那個(gè)時(shí)候都會(huì)重啟一下,人再多也不至于丟包到集體下線,但是客戶端允許部分掉包,后來發(fā)現(xiàn)發(fā)現(xiàn)雖然到5000多人后會(huì)有部分心跳包沒回應(yīng),集體被下線,相比看管接頭。導(dǎo)致心跳包中斷,晚上上線人太多就卡死,當(dāng)時(shí)以為是認(rèn)證服務(wù)器配置太low,累成汪還被罵。。。)
機(jī)房是5號(hào)宿舍樓1樓的一間宿舍改造的,工資那么低,那幫老師就管收錢和發(fā)錢,學(xué)校其實(shí)真的維護(hù)設(shè)備的都是我們這幫兼職的學(xué)生,問候?qū)W校網(wǎng)管家人的。電線旋轉(zhuǎn)接頭。(心塞呀,各種投訴抱怨,但發(fā)現(xiàn)最常掉線的時(shí)間是晚上10點(diǎn)多,時(shí)間不固定,經(jīng)常大面積集體掉線,有段時(shí)間學(xué)校宿舍電信的網(wǎng)絡(luò),又想起來一個(gè)。品牌。
白天去看了下機(jī)房設(shè)備硬件一切正常,累!剛看其他人的回答,還是手機(jī)打的,淚?。?/p>
很簡單,更加重了我們排錯(cuò)的難度,所以越界需要的次數(shù)不是恒定,比如啟動(dòng)時(shí)間就不太一樣,照這樣哪個(gè)機(jī)器能點(diǎn)亮才怪呢!又因?yàn)槊看蜗到y(tǒng)寫的信息不一樣,就如同當(dāng)年CIH破壞系統(tǒng)的方法一模一樣,把人家好端端的代碼給寫的亂七八糟,誤寫到了人家代碼區(qū),導(dǎo)致寫很多次后終于越界,這哥們算錯(cuò)了存儲(chǔ)區(qū)域的地址,我們后來發(fā)現(xiàn),比如你想用硬盤還是光驅(qū)啟動(dòng)等等。同時(shí)系統(tǒng)每次啟動(dòng)也都會(huì)自己寫一點(diǎn)沒什么鳥用的信息進(jìn)來。
第一次寫這么長的回答,讓大家可以保存一些東西,然后代碼里有專門寫flash的函數(shù),哪里放設(shè)置等等,哪里是code,里面會(huì)規(guī)劃好,也就是用程序可編程。bios大小是8MB,H型旋轉(zhuǎn)接頭。但是現(xiàn)代的系統(tǒng)已經(jīng)逐漸棄用這個(gè)東西。我們現(xiàn)在的bios芯片都是可擦寫的,傳統(tǒng)上用來存bios設(shè)置,我們終于發(fā)現(xiàn)了問題的原因:
問題就出在這個(gè)寫flash的函數(shù)上,再否定。。。。。的過程后,再驗(yàn)證,再猜測,被否定,驗(yàn)證,以及猜測,經(jīng)過了無數(shù)次的重啟與燒錄bios,根本沒心情做任何事!
大家可能還記得電腦主板上有個(gè)CMOS,實(shí)在是茶飯不思,幾乎每時(shí)每刻都在想著這個(gè)bug,壓根沒有頭緒。那段時(shí)間,沒什么疑點(diǎn),是個(gè)很普通的平臺(tái)硬件初始化程序,跑飛了!去看疑似跑飛的DXE Driver,我不知道蒸汽管道旋轉(zhuǎn)接頭。突然就像心臟驟停一樣,到了DXE階段的某個(gè)環(huán)節(jié),反復(fù)燒錄bios 哭??!簡直不是人過的日子!
就這樣差不多過了倆禮拜,我們都在不停的看debug info,重復(fù)上述過程。記憶中整整一個(gè)禮拜,又或者有了新的思路,或者發(fā)現(xiàn)這里沒有問題,再上電運(yùn)行看看打出來的到底是啥。如果有疑問,再重新燒錄,然后花上半個(gè)小時(shí)rebuild bios,在需要的地方加入調(diào)試語句,就得重新寫代碼,系統(tǒng)的情況如何。這類似原始的printf打印。如果要看一個(gè)變量的值或者驗(yàn)證一下我們的判斷,然后我們根據(jù)這些信息判斷執(zhí)行到哪里了,就是系統(tǒng)啟動(dòng)的時(shí)候會(huì)通過port 80把一些重要信息打出來,于是只能吃灰了
最后發(fā)現(xiàn)系統(tǒng)可以成功的跑過PEI,但是因?yàn)闆]有買新一代處理器的適配器,用著用著就掛了。。。我們公司當(dāng)時(shí)有倆,還不太穩(wěn)定,這個(gè)適配器又是一萬美金好像,而且每一代CPU都要換一個(gè)插座上的適配器,液壓回轉(zhuǎn)接頭。所以價(jià)格巨貴巨貴!一套系統(tǒng)價(jià)格幾萬美金,因?yàn)槟繕?biāo)客戶少,這個(gè)東西說白了就是商品化的ITP,但是當(dāng)時(shí)被Chipset team霸占著做porting用;另一個(gè)工具就是American Arium(這家鳥公司不知道現(xiàn)在還活著不),給了我們兩個(gè),當(dāng)時(shí)我們公司與I公司的關(guān)系尚處蜜月期,一般不給外面人用,這個(gè)是人家公司自己的,一個(gè)是Intel自己內(nèi)部用的ITP,更沒法加個(gè)斷點(diǎn)。。。當(dāng)時(shí)可以用來調(diào)試BIOS的工具有兩個(gè),壓根沒法對(duì)代碼做step into/over,甚至連匯編級(jí)別的單步調(diào)試工具也沒有,我們當(dāng)時(shí)沒有source level的debug tool,再去用這些工具加編譯器來生成最后的ROM文件
于是我們唯一的調(diào)試手段就是serial debug,構(gòu)建項(xiàng)目的時(shí)候先編譯這些工具,光是用來參與build過程的工具就有十幾個(gè)。而且這些工具都是自己寫的,幾千個(gè)源文件,大概2%的匯編與98%的C,因?yàn)楫?dāng)時(shí)我們的版本將近300萬行源代碼,而且一旦出現(xiàn)問題就只能重新刷BIOS
并且更加惱人的是,看看旋轉(zhuǎn)。我們自己測試也是這樣,經(jīng)驗(yàn)判斷系統(tǒng)壓根還沒有boot OS就跑飛了,就和當(dāng)年的CIH病毒發(fā)作一模一樣,沒有任何輸出,現(xiàn)象就是開機(jī)黑屏,至少得保障人家用個(gè)倆三年沒事吧。
這個(gè)bug非常難調(diào),看看重啟幾百上千次后情況如何。原因是客戶買了電腦每天用,就是安裝好操作系統(tǒng)后反復(fù)不停的重啟機(jī)器,客戶是長城電腦。有一回我們的新版本發(fā)布給他們后進(jìn)行系統(tǒng)重啟測試,我仍然滿臉都是淚水啊!
結(jié)果我們的新版本重啟到一百多次的時(shí)候掛了,雖然很多很多年了,還有一小部分使用INT 10H來寫屏。看看中心回轉(zhuǎn)接頭。那么我們的bios就必須包含這些可能有些用戶一輩子也用不上的服務(wù)。代碼量刷刷的就上去了。
當(dāng)年做x86 BIOS,據(jù)說直到Windows 7的安裝程序,其實(shí)氣動(dòng)回轉(zhuǎn)接頭。還包括比如INT 10H的屏幕服務(wù),除了我們上面談及的鍵盤問題,還要包含大量的歷史兼容性代碼,bios的代碼非常復(fù)雜,這已經(jīng)遠(yuǎn)遠(yuǎn)超出本文的初衷。所以一句話,我們就不展開講了,涉及x86處理器最神秘的SMM模式,具體的實(shí)現(xiàn)過程異常復(fù)雜,打開這個(gè)選項(xiàng)你才可以在DOS下使用usb鍵盤。當(dāng)然,默認(rèn)值就是Enable,一般叫做legacy USB Support,所有的現(xiàn)代bios里會(huì)有一個(gè)設(shè)置項(xiàng),寫入內(nèi)部的60/64端口的緩沖區(qū)。旋轉(zhuǎn)接頭廠。大家也許會(huì)發(fā)現(xiàn),然后再中斷系統(tǒng),一邊將其轉(zhuǎn)換成那些古老軟件能夠識(shí)別的鍵盤編碼,現(xiàn)代bios模擬了一個(gè)PS/2鍵盤:現(xiàn)代bios一邊讀取來自USB鍵盤的信息,以現(xiàn)在的角度看,bios會(huì)做很多處理,所謂的歷史兼容性根本無從談起!所以我們偉大的bios這個(gè)時(shí)候就扮演了救世主的角色了,異型旋轉(zhuǎn)接頭。那些過去年代的軟件壓根不會(huì)認(rèn)識(shí)新的鍵盤,而且這個(gè)新接口的鍵盤采用的編碼與過去PS/2接口的編碼完全不一樣!那么如果不做任何處理的情況下,基于這個(gè)新玩意兒的鍵盤根本不會(huì)接到60/64端口上,后來人們發(fā)明了一個(gè)叫做USB的新玩意兒,現(xiàn)代的計(jì)算機(jī)壓根沒有8042這塊芯片!更要命的是,大家是否知道,還必須讓DOS或者運(yùn)行在DOS之上的應(yīng)用程序可以無差別的運(yùn)行在現(xiàn)代的計(jì)算機(jī)之上 - 可是,所以現(xiàn)在的每一臺(tái)計(jì)算機(jī)還必須可以安裝DOS,由于歷史兼容性原則,這一切是很美好的。那個(gè)時(shí)代的操作系統(tǒng)DOS就是這樣來訪問鍵盤的?,F(xiàn)在讓我們回到更加美好的現(xiàn)代,在幾十年前那個(gè)時(shí)代,然后那個(gè)時(shí)代的匯編BIOS則提供了INT 9H中斷來為應(yīng)用程序提供鍵盤服務(wù),那個(gè)時(shí)代的開發(fā)者通過讀寫60H以及64H端口來訪問鍵盤,用來控制諸如鍵盤這樣的外設(shè),電線。那個(gè)年代的電腦主板上都有一個(gè)叫做8042的芯片,我們暫時(shí)穿越到幾十年前,這就是一個(gè)很要命的問題了。原因很簡單,這是完全符合邏輯的一件事情。但是對(duì)于bios開發(fā)者而言,然后再接上去你會(huì)發(fā)現(xiàn)這個(gè)古董級(jí)的硬件仍然可以使用。是的!對(duì)于我們用戶而言,那么買一個(gè)轉(zhuǎn)換頭,假如你的主板已經(jīng)沒有PS/2接口了,然后把它接到現(xiàn)代的主板上,如果你現(xiàn)在找一個(gè)古董級(jí)的PS/2接口的鍵盤,但是個(gè)人電腦有一個(gè)非常非常重要的原則就是兼容性。具體到鍵盤上,支持一個(gè)usb鍵盤那不是太簡單的事情么?的確是這樣,大家可能會(huì)簡單的認(rèn)為,就是對(duì)于usb鍵盤的支持,而bios作為最核心的系統(tǒng)固件承擔(dān)了太多的歷史兼容性的責(zé)任。舉個(gè)例子,甚至自己的圖形環(huán)境。這樣的系統(tǒng)的代碼量自然不會(huì)小。
每次想起這個(gè)bug,還有一小部分使用INT 10H來寫屏。那么我們的bios就必須包含這些可能有些用戶一輩子也用不上的服務(wù)。代碼量刷刷的就上去了。
--------------------------
其次是因?yàn)閤86系統(tǒng)的歷史包袱非常非常嚴(yán)重,液壓旋轉(zhuǎn)接頭。自己的app,自己的drivers,有自己的shell,目前的BIOS都是基于UEFI的新一代BIOS。這類系統(tǒng)本身就具備十分強(qiáng)大的功能。完全可以視作一個(gè)小型的操作系統(tǒng),事實(shí)上這個(gè)行業(yè)的知識(shí)刷新速度看起來非???。所以我這里說的其實(shí)還是基于我當(dāng)年的知識(shí)構(gòu)成。旋轉(zhuǎn)。
首先,所以我對(duì)于目前的最新情況并不了解,并且之后的日子我并沒有持續(xù)的去跟蹤最新的技術(shù)趨勢,我首先要申明一下由于我2010年就已經(jīng)離開BIOS行業(yè)了,要那么多代碼干什么?我想我有必要在這里做一些簡單的說明。
在說明之前,甚至有一位朋友提到BIOS就是個(gè)boot loader,然后對(duì)著被砸了20多次的手機(jī)淚流滿面.....2015年8月23更新
評(píng)論里有幾位朋友對(duì)于我提到的BIOS有上百萬行源代碼表示不可能,屏幕旋轉(zhuǎn)方向發(fā)生了改變,原來是當(dāng)手機(jī)被狠狠砸一下的時(shí)候,進(jìn)行真機(jī)調(diào)試( 每次調(diào)試就要砸一下我的手機(jī)....請(qǐng)自行腦補(bǔ)我的表情)
14、用3分鐘修復(fù)了此問題,于是拿過來我的手機(jī),未重現(xiàn),崩潰重現(xiàn)
13、最后發(fā)現(xiàn),崩潰重現(xiàn)
12、開發(fā)同事狠狠的砸了一下他自己的測試機(jī),只是個(gè)簡單的渲染。
11、現(xiàn)場演示狠狠的砸了一下我的手機(jī),只要用力把手機(jī)往桌子上砸一下,我重現(xiàn)出了這個(gè)BUG,崩潰
10、開發(fā)同事匪夷所思的表示沒有調(diào)用過陀螺儀之類的 API,再次扔到桌子上,崩潰
9、給開發(fā)的同事講,把手機(jī)扔到桌子上,未崩潰
8、重新把手機(jī)拿起來,氣動(dòng)旋轉(zhuǎn)接頭廠。崩潰
7、驚愕......
6、心情暴躁,觀察5分鐘,同時(shí)緊握著手中的手機(jī)繼續(xù)盯著屏幕,思索自己剛才到底做了什么,小心翼翼的重新打開 App,崩潰。
5、嚇一跳之后,然后在把手機(jī)拿起來的一瞬間,想舒服的后仰坐在工位上繼續(xù)重現(xiàn),于是把手機(jī)拿起來,有些不舒服,未崩潰
4、由于長時(shí)間彎腰盯著桌子上的手機(jī),反復(fù)在前臺(tái) / 后臺(tái)切換,于是重新打開 App,接完后 App 崩潰
3、意識(shí)到可能是 Android 生命周期問題導(dǎo)致的,觀察5分鐘,打開 App,還不會(huì)根據(jù) C++ 的 dumpstack 去檢查是哪個(gè)模塊的問題。所以我決定先嘗試重現(xiàn)一下這個(gè)問題。不銹鋼回轉(zhuǎn)接頭。
2、5分鐘的時(shí)候接了個(gè)電話,當(dāng)時(shí)我由于經(jīng)驗(yàn)不足,crash日志大概描述的是 C++ 掛掉了,就是游戲整個(gè) App 會(huì)不時(shí)崩潰掉,我發(fā)現(xiàn)一個(gè)現(xiàn)象,可以理解為他就是一個(gè) Android GLSurfaceView 渲染器。
1、把手機(jī)放在桌子上,還不會(huì)根據(jù) C++ 的 dumpstack 去檢查是哪個(gè)模塊的問題。所以我決定先嘗試重現(xiàn)一下這個(gè)問題。
重現(xiàn)步驟:
當(dāng)我從開發(fā)工程師手中拿到第一個(gè)新鮮出爐熱乎的開發(fā)版的時(shí)候,去年做 Android 開發(fā)的時(shí)候遇到一個(gè)極其搞笑的 BUG ,乃軟件狗一只,我一抓速度叫來了我們的射頻工程師 靠 你看 這個(gè)輻射怎么變成了對(duì)稱的雙乳峰?不應(yīng)該是正態(tài)的單峰嗎? 我們一起測量了很久……后來 他不小心被電到 說:你這里沒接地?怎么感覺有110V左右的交流電?
當(dāng)時(shí)我們?cè)谧?Egret Runtime 的第一個(gè)版本,我一抓速度叫來了我們的射頻工程師 靠 你看 這個(gè)輻射怎么變成了對(duì)稱的雙乳峰?不應(yīng)該是正態(tài)的單峰嗎? 我們一起測量了很久……后來 他不小心被電到 說:你這里沒接地?怎么感覺有110V左右的交流電?
答主不如樓上這些硬件大牛,它已經(jīng)面對(duì)了所有其他人員……
評(píng)論區(qū)的 你們夠了 欺負(fù)我一個(gè)弱電的插不上話嗎?怒答??!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
尼瑪 萬用表一量 真是110V ,第一次知道原來有些工程師人體可以做萬用表…
另外一個(gè)bug 用頻譜儀抓晶振輻射 ,但又在超時(shí)的允許范圍,什么也不做,但只有我有環(huán)境抓到關(guān)鍵log………兩天兩夜終于抓到了這個(gè)bug
這不是關(guān)鍵 最最關(guān)鍵的是這個(gè)bug至今還躲著我,協(xié)議合法………
也就是一個(gè)手機(jī)的小概率隨機(jī)錯(cuò)誤會(huì)誘發(fā)我們的bug。
而我們的二逼芯片 居然只有在這個(gè)情況下才會(huì)出現(xiàn)一包數(shù)據(jù)呢包頭標(biāo)志位錯(cuò)誤。
這貨怎么出現(xiàn)的呢? 就是那些個(gè)二逼手機(jī) 有小概率出現(xiàn)藍(lán)牙發(fā)呆一秒左右,除了我大家都測試到過,一直沒重現(xiàn)。最后階段 幾個(gè)人輪番測試這個(gè)bug ,幾輪迭代測試都顯示部分手機(jī)藍(lán)牙都一定概率丟包……但我拿那些手機(jī)做了非常多測試 也包括和測試員的一模一樣的測試環(huán)境,算一個(gè)比較熬人的… 最近產(chǎn)品驗(yàn)收測試階段,搞定了。不算最難的 ,但是好歹能啟動(dòng)了。轉(zhuǎn)接頭。
再后來我們把VR的驅(qū)動(dòng)改了個(gè)底朝天,去restore的方法來做。這樣就跳過了每條規(guī)則初始化的時(shí)間。雖然還是需要幾個(gè)小時(shí)再啟動(dòng),我們?yōu)槊總€(gè)VR開個(gè)進(jìn)程不就行了?我們?yōu)樽约旱穆斆鞑胖歉袆?dòng)不以。
什么再后來?
于是只好想辦法把iptables寫個(gè)driver集成到erlang里面去,一個(gè)進(jìn)程寫不動(dòng),這可不是鬧著玩的。聽說轉(zhuǎn)接頭。
內(nèi)核掛了
linux內(nèi)核掛了。
iptables掛了。再然后
我們?yōu)閹装賯€(gè)VR開了幾百個(gè)gen_server進(jìn)程大家一起努力往linux里面寫。
事實(shí)證明我們too young too simple
知道了原因以為好修了,極有可能導(dǎo)致生產(chǎn)事故的,數(shù)據(jù)錯(cuò)誤那可是重大失責(zé),那就是SCADA系統(tǒng)有問題呀,設(shè)備沒問題,不會(huì)吧,我心里咯噔一下,控制中心回復(fù):現(xiàn)場自行決定。
第四夜還這樣
現(xiàn)場指示一切正常,要求重啟設(shè)備,趕緊請(qǐng)示控制中心,時(shí)間不等人,不試怎么知道,信與不信已經(jīng)不重要了,你確定是設(shè)備的問題不是你們的問題,從未出現(xiàn)過這種問題,項(xiàng)目上用了這么多,這種進(jìn)口設(shè)備,他們半信半疑,把我的發(fā)現(xiàn)與想法告訴了他們,我趕緊上前,應(yīng)對(duì)著各種質(zhì)詢與責(zé)難,經(jīng)理憋紅了臉,站場的主要負(fù)責(zé)人已經(jīng)把經(jīng)理給圍住了,液壓油回轉(zhuǎn)接頭。這才發(fā)現(xiàn), 我轉(zhuǎn)身正要往控制室跑,
看看球體轉(zhuǎn)動(dòng)接頭
電線旋轉(zhuǎn)接頭