跳至內容
GitHub 儲存庫 論壇 RSS 新聞提要

Bright 和 Manas 合作創建 Crystal 開發工具

Beta Ziliani
Manas.Tech + Bright

在最近的 Crystal 1.10 版本中,引入了兩個新的編譯器工具:crystal tool dependenciescrystal tool unreachable。同時,Crystal 團隊也發佈了 perf-tools,這是一個包含用於追蹤記憶體使用量和纖程的工具的 shard。在這篇文章中,我們將深入探討這些工具是如何產生的。

這些工具的開發是由網站安全智能漏洞利用工具製造商 Bright 贊助的。該漏洞利用工具的工作方式是搜尋端點,並以大量潛在的安全威脅攻擊它們。作為一個成熟的產品,它多年來有機地增長,需要特殊的工具來改進它。因此,Bright 請求 Manas 在兩個主要主題上提供協助:應用程式的重構和記憶體洩漏的追蹤。

重構

該應用程式具有兩個獨特的功能:發現端點和攻擊端點。從架構的角度來看,將它們分成兩個不同的應用程式是有意義的。這是一個主要的重構,需要識別原始碼樹的哪些部分屬於哪個應用程式。為了簡化這個過程,我們建立了 crystal tool dependencies,它顯示了 require 相依性的樹狀結構。透過 require 圖表,可以更容易地拆分應用程式。

此外,crystal tool dependencies 還有助於理解 require 順序引起的衝突。例如,如果兩個檔案 a.crb.cr 為一個類定義了相同的方法,則 Crystal 會使用最後被 require 的檔案中的定義。有了這個工具,我們就可以觀察 a.crb.cr 被 require 的順序,從而理解為什麼 Crystal 正在呼叫其中一個定義而不是另一個定義。

為了完成分離,我們需要識別每個 require 樹中無用的程式碼。為此,我們建立了 crystal tool unreachable 來顯示定義但從未呼叫的 defs

記憶體洩漏追蹤

在某些情況下,應用程式的記憶體消耗可能會無限增長,直到耗盡全域記憶體。為了檢查記憶體使用量並捕獲洩漏的纖程,我們建立了兩個工具,可在 perf-tools shard 中找到。第一個工具是 mem_prof,一旦匯入就會追蹤記憶體配置,允許列出每個位置或每個類型的記憶體配置。例如,可以追蹤是否有一個類別的實例正在持有大量數據。如果該實例在某個時間點後應該被垃圾回收以釋放記憶體,但它沒有被回收,那麼這可能會導致洩漏。

第二個工具是 fiber_trace,它列出了正在執行的纖程,以及它們的配置點和 yield 點 - 纖程將執行返回給排程器的地方。一個用例是追蹤纖程是否仍然存活,如果是,那麼它最後執行的操作是什麼。

這兩個工具共同幫助我們和 Bright 團隊修復了幾個洩漏問題。

結論

在大型生產應用程式上工作是一種豐富的經驗,而建立必要的工具幫助我們改進了編譯器及其生態系統。我們非常感謝 Bright 的支持。

如果您在 Crystal 應用程式方面遇到困難,歡迎與我們聯繫:crystal@manas.tech。Manas 可以幫助您解決難題,而解決方案最終可能會透過新的或改進的工具進一步豐富 Crystal 生態系統。