Joyent如何對(duì)Node代碼進(jìn)行調(diào)試
譯文Node.js與JavaScript各自為用戶(hù)帶來(lái)強(qiáng)大的功能與性能表現(xiàn),但二者卻又擁有自己獨(dú)特的使用成本。首先,JavaScript是一款相對(duì)較新的通用型編程語(yǔ)言;其二,Node.js堆棧所采用的錯(cuò)誤報(bào)告與調(diào)試方式相當(dāng)特殊。
當(dāng)我最近與Node.js項(xiàng)目負(fù)責(zé)人Timothy J. Fontaine探討這些問(wèn)題時(shí),他表示Joyent——以及其它一些Node.js用戶(hù)——在處理過(guò)程中采用的辦法值得我們借鑒。
“Node.js使用JavaScript并具備動(dòng)態(tài)特性,”他表示,“因此當(dāng)大家遇到問(wèn)題時(shí),很難準(zhǔn)確把握到底是哪里鬧出了毛病。在傳統(tǒng)應(yīng)用程序當(dāng)中,一旦出現(xiàn)崩潰狀況、我們能夠找到與之相關(guān)的核心文件與符號(hào)。然而在Node.js JavaScript的V8引擎當(dāng)中,如果進(jìn)程卡死、我們根本沒(méi)有足夠的信息來(lái)弄清到底是哪一步處理過(guò)程引發(fā)了故障——這是因?yàn)槿縅avaScript信息都已經(jīng)不復(fù)存在。作為僅有的途徑,大家只能通過(guò)添加更多日志記錄或者搜索現(xiàn)有日志來(lái)摸索問(wèn)題發(fā)生的原因。”
作為***知名度的Node.js部署問(wèn)題的受害者,沃爾瑪對(duì)此表示有話要說(shuō)。據(jù)稱(chēng)經(jīng)過(guò)調(diào)查,沃爾瑪方面竟然發(fā)現(xiàn)Node.js就是導(dǎo)致內(nèi)存泄露的罪魁禍?zhǔn)祝贿^(guò)Fontaine認(rèn)為這樣的情況只能算是極端性個(gè)例。他同時(shí)解釋稱(chēng),在大多數(shù)情況下、決定事態(tài)的關(guān)鍵因素在于Node.js與JavaScript的實(shí)際使用方法以及環(huán)境開(kāi)發(fā)人員對(duì)二者的熟悉程度。
“在Node.js的眾多特性當(dāng)中,最難以把握的就是它的異步本質(zhì),”Fontaine指出。“大量?jī)?nèi)容同時(shí)處于運(yùn)行當(dāng)中,相比之下PHP、Python以及Ruby的調(diào)試對(duì)象則只有單一進(jìn)程或者每個(gè)請(qǐng)求中的單一線程。因此對(duì)于JavaScript而言,即使是對(duì)堆棧進(jìn)行全盤(pán)追蹤都不足以達(dá)成調(diào)試目標(biāo)。”
為此,Joyent公司認(rèn)為大多數(shù)由Node.js部署所引發(fā)的問(wèn)題都屬于意料之外的突發(fā)事件以及應(yīng)用程序錯(cuò)誤,而且這一切在部署流程的早期階段中并不容易發(fā)現(xiàn)。
“Node設(shè)計(jì)思路所帶來(lái)的一大副產(chǎn)品在于,”Fontaine解釋道,“JavaScript是一種動(dòng)態(tài)語(yǔ)言,因此我們并不能從編譯器當(dāng)中獲取靜態(tài)運(yùn)行狀態(tài)。這一點(diǎn)既有積極的效果、也會(huì)引發(fā)消極影響,具體取決于大家的實(shí)際開(kāi)發(fā)方式。其實(shí)我們?cè)庥龅拇蟛糠止收嫌美紝儆诤芷胀ǖ膽?yīng)用程序漏洞,只不過(guò)我們很難重新構(gòu)建運(yùn)行歷史、從而再現(xiàn)曾經(jīng)引發(fā)的問(wèn)題。
為了解決調(diào)試過(guò)程中面臨的這一阻礙,Joyent公司將其自家SmartOS作為開(kāi)發(fā)平臺(tái)。SmartOS屬于OpenSloaris系統(tǒng)的一個(gè)分支,其DTrace技術(shù)成為該平臺(tái)的***特色(除了其他開(kāi)發(fā)人員之外,Joyent公司CTO Brian Cantrill也參與了該技術(shù)的開(kāi)發(fā)工作)。DTrace能夠在幾乎不影響性能表現(xiàn)的前提下對(duì)應(yīng)用程序的執(zhí)行過(guò)程進(jìn)行追蹤與概括,F(xiàn)ontaine與其他不少技術(shù)從業(yè)者都將其視為檢查Node.js運(yùn)行代碼的理想手段。
“大家可以在代碼運(yùn)行過(guò)程中查看JavaScript堆棧幀,”Fontaine解釋道。“在其它環(huán)境下,我們沒(méi)有辦法從這個(gè)層面進(jìn)行檢查。在其它平臺(tái)上,我們必須配合特殊標(biāo)來(lái)運(yùn)行Node、從而獲取額外調(diào)試信息,而這會(huì)給性能帶來(lái)負(fù)面影響。”
“Joyent之所以能夠繼續(xù)延續(xù)這種處理方式,是因?yàn)槲覀兙帉?xiě)了相關(guān)工具以幫助自身處理此類(lèi)問(wèn)題。此外,我們還積極與其他用戶(hù)接觸、將這些技術(shù)成果用于幫助他人。”
SmartOS本身是一款基于CDDL許可的免費(fèi)系統(tǒng),但大多數(shù)人顯然希望能在自己已經(jīng)在使用的系統(tǒng)平臺(tái)上獲得理想的調(diào)試工具——而隨著Node.js向著更完善的1.0版本邁進(jìn),Joyent方面可能也正在進(jìn)一步作出探索。
英文原文:http://www.infoworld.com/t/open-source-software/how-joyent-debugs-node-code-242287