花花小君 作品

第32章 長夜漫漫

    葉新晨首先盯上的是它的過程/函數聲明關鍵字proc。

    在這種語言裡,你聲明一個函數fun,格式就是

    proc fun(arg){

    #body

    }

    它看似一個關鍵字;但tcl裡一切都是字符串,因此這個proc實質上是個函數,它接受函數名、參數列表、函數體三個參數……

    葉新晨也是把系統的proc改名叫_sys_proc,自己寫了個proc;這樣當用戶聲明一個函數/過程時,他的聲明將以字符串格式先傳給他。

    這樣子的話葉新晨就可以做一些修改,把一些邏輯插進用戶編寫的代碼中,然後再把修改後的代碼傳給_sys_proc。

    通過這種方式,葉新晨就接管了tcl的一切;然後修改了它的異常/返回流程,識別出“用戶未捕捉的異常”。

    畢竟葉新晨是記錄了每個函數在某次被調用時、在調用鏈上所處的層級。尤其接近頂層尚未捕獲就會影響到當前測試用例、當前測試套甚至引起整個程序過早退出,這些都是要記錄的。

    現在,當程序出錯時,如果通過異常處理程序解決了問題、允許程序繼續執行了,那麼葉新晨就不做任何動作。

    但如果沒有處理異常、使得測試失敗甚至程序退出,那麼葉新晨就能在執行下一條語句之前把整個調用鏈打印出來——從函數調用關係到每個函數的局部變量內容、再到異常傳遞路徑,鉅細靡遺。

    這個設計相當於函數返回時會多執行幾條語句,把局部變量等信息保存在內存中;只要程序不崩潰,那麼這些信息就自動丟棄;而一旦程序要崩潰,它就會寫到磁盤文件中——葉新晨自己搞了個日誌滾動機制,專門記錄最近十次崩潰信息,並不會無限侵佔磁盤空間。

    通過這個東西,再付出微不可察的時間代價,葉新晨給所有tcl程序增加了core dump功能。

    這顯然是個重大利好。

    這就是為什麼他們為什麼願意花費十萬請葉新晨也幫忙做這個功能。

    不過畢竟剛剛完成了另一個懸賞,所以晚上的時候葉新晨也不會立刻扎進去,他要好好的休息一個晚上,也就是今天晚上他不想熬夜了。