【GoAnalysis】大更新,Go 項目源碼褲衩子被脫光了
前提
上週,我發佈了 goanalysis 工具的首個版本,並得到了廣大用戶的積極反饋與支持。隨着關注度的增加,許多用戶表達了對如何有效利用該工具的興趣和疑問。
經過深入考量後,我決定對 goanalysis 進行重大升級以更好地滿足用戶需求。
本文旨在詳細介紹最新版 goanalysis 的功能特性及其使用方法,並引導大家訪問體驗網站。
主要功能包括:
-
運行時性能分析:提供應用程序在實際執行過程中性能指標的深度洞察。
-
靜態源代碼分析:通過掃描源代碼來識別潛在的問題或優化機會,無需實際運行程序即可完成。
啓動服務器
通過 goanalysis,啓動服務器:
goanalysis server
默認端口號設置爲 8000。請通過瀏覽器訪問地址 http://<IP 地址>:8000。在頁面上定位並點擊 “程序運行分析” 選項後,需將運行過程中生成的數據庫文件(DB 文件)路徑輸入至指定文本框內,隨後即可啓動分析流程。
運行時分析
在大多數編程語言中,函數被視爲最基本且首要的執行單元,所有的程序流程均通過函數來實現。Go 語言(Golang)同樣遵循這一原則。
爲了對指定的 Go 項目進行重寫,請首先將該項目複製到目標服務器上。接着,訪問相關網頁界面,在提供的插樁輸入框內填入該 Go 項目的目錄路徑。建議使用絕對路徑以確保準確無誤。完成路徑填寫後,點擊 “一鍵插樁” 按鈕,從而啓動整個項目的自動重寫過程。重寫操作結束後,您可以直接運行修改後的項目。具體步驟可參考附圖所示。
原理概述如下:goanalysis
工具將對目標項目的全部 Go 源文件執行抽象語法樹(AST)分析。在此過程中,它會在所有函數中插入含有functrace.Trace()
調用的defer
語句。當程序運行並進入這些被標記的函數時,當前函數的參數、所屬的 goroutine 以及調入點信息會被記錄下來,並存儲到 SQLite3 數據庫中。值得注意的是,此過程會產生一個本地數據庫文件,其命名格式爲trace_0.db
,每次新的運行都會創建一個新的數據庫文件,文件名中的數字序號會依次遞增,這些數據庫文件默認保存在程序的工作目錄下。
在對修改後的 Go 項目進行了充分測試之後,需將生成的所有本地數據庫文件複製到安裝有goanalysis
工具的服務器上,以便進行後續的數據分析或處理工作(未來計劃開發一個自動化上傳功能來簡化這一流程)。
也可以執行命令模式:
goanalysis rewrite -d <path>
請注意,當啓用重寫功能時,系統將默認過濾包含 “log” 和“context”關鍵字的內容。在啓動 Go 應用程序時,可以通過設置環境變量
IgnoreNames=log,context
來指定希望被過濾的關鍵字列表。這種方式允許用戶根據需求自定義忽略的標識符。
分析功能
運行時分析概覽
- 整體運行性能指標:
-
總計的 goroutine 數量;
-
函數平均執行時間;
-
最大調用深度。
- 熱點函數詳細分析:
-
執行時間分佈;
-
調用頻率統計。
- Goroutine 執行詳情列表:
-
堆棧信息展示:提供每個 goroutine 的完整調用堆棧視圖,包括函數調用鏈及其參數值;
-
調用關係可視化:自動生成各 goroutine 間的調用關係圖譜。
函數級深入查詢與分析
-
用戶可以指定任意感興趣的函數作爲查詢目標。系統將列出所有直接或間接調用了該目標函數的方法,並在下方界面中呈現結果。
-
示例輸出如下所示(此處可插入具體示意圖)。
以上內容旨在爲開發人員提供一套全面且直觀的應用程序運行狀態監控工具,以支持更高效的性能優化和故障排查工作。
使用場景
-
**在接手現有項目時,**如果具備編譯能力或能夠將已編譯的文件部署到開發及測試環境中,並在一段時間運行後獲取數據庫文件,那麼通過這種方式,**可以迅速識別出哪些代碼段是活躍且必要的,哪些則可能是冗餘或不再使用的。**此方法對於快速掌握項目的實際運作機制十分有效。
-
對於第三方庫源碼的理解,以 nsqd(一個用 Go 語言編寫的輕量級消息隊列服務)爲例,建議結合其官方提供的示例程序來進行學習。同時進行動態演示與靜態代碼分析,這樣不僅可以直觀地感受到該工具的強大功能,還能深入理解其實現細節和工作原理。這種方法有助於開發者更全面地掌握第三方組件的應用場景和技術特點。
靜態分析
若需全面瞭解所有函數間的調用關係,僅依賴運行時分析可能無法完全覆蓋。因此,推薦採用其他方法對整個代碼庫進行深入剖析。爲此,我們提供了一種靜態分析工具,能夠有效滿足這一需求。
請在輸入框中指定 Go 項目的路徑,然後啓動分析流程。分析過程結束後,系統將在下方的數據庫文件列表中自動生成一條新的記錄。您可以通過點擊該記錄來查看詳細的分析結果。
可以展示當前整個分析內容;
函數上下游分析
在輸入框中鍵入您感興趣的函數名稱,即可查看該函數的上游及下游調用關係,並展示其完整的調用鏈路。這種可視化呈現方式非常直觀且信息豐富。
使用場景
-
理解源代碼中函數間的相互依賴關係以及包之間的關聯結構。
-
在進行代碼修改時,能夠迅速評估當前變更的影響範圍。(對於後續 GitLab 中集成的代碼變動影響分析功能,我正在着手規劃。)
測試地址
尊敬的用戶,
您可以通過訪問以下公網地址體驗相關功能:http://175.178.49.104:8000/。
-
對於運行時分析功能,請在相應的輸入框內填寫路徑
/root/code/nsq/apps/nsqd/trace_0.db
。 -
靜態代碼分析部分,則建議使用路徑
/root/code/nsq/apps/nsqd
作爲輸入。
本項目的源碼託管於 GitHub,具體鏈接爲:https://github.com/toheart/goanalysis。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/-ZHT5TWMfVOdLP6alwzZAQ