本教程中,我們將展示如何自動分析沒有除錯符號的 OpenResty 和 Nginx 應用。即使在所有除錯資訊缺失的情況下,它也能透過機器學習演算法自動對可執行檔案進行分析,重建除錯符號,並透過動態追蹤進行深入和全面的分析。OpenResty XRay 擁有從被 strip 過的可執行檔案中生成除錯符號的超能力,因此即使缺失除錯符號,也能獲得 C 函式和 Lua 函式的原始檔、原始碼行相關資訊。

問題:應用缺失除錯符號

ps 檢視目標程序,確認可執行檔案路徑(示例為使用者自己用原始碼編譯的 OpenResty)。

ps 檢視程序與可執行路徑

對主程式執行 file:輸出表明二進位制已被 strip,沒有任何除錯符號或符號表。也找不到該程式對應的除錯符號安裝包。

主程式 file 輸出:已 strip

對程序載入的 LuaJIT 動態連結庫同樣執行 file,可見 LuaJIT 檔案的除錯符號也是缺失的。

LuaJIT 庫 file 輸出

自動分析與重建除錯符號

在瀏覽器開啟 OpenResty XRay 控制檯,進入 Guided Analysis,按嚮導選擇要分析的問題型別、目標應用與 worker 程序,語言級別保持 LuaC/C++ 同時選中後開始分析。控制檯入口與嚮導頁如下(具體選項組合見影片)。

Guided Analysis 嚮導

分析開始後,XRay 會檢測缺失的除錯符號並 自動發起符號重建;重建完成後,會像平常一樣並行執行各類分析器。

符號重建任務進行中

結束取樣後,介面會生成彙總報告;下文只摘 CPU 與記憶體兩處讀法。

分析完成後的報告入口

CPU:火焰圖與 Lua 熱路徑

在報告的 CPU 部分,可先展開 Lua 熱點,再從關聯的 C 側火焰圖檢視函式名;在已重建符號的前提下,火焰圖能細化到 C 原始檔名與行號

C 火焰圖中的原始檔與行號

C 火焰圖中的原始檔與行號

Lua 側會給出佔用 CPU 最多的呼叫路徑:本例中 close 函式被 generate 函式呼叫。generate 是一個 Lua 函式,被定義在 Lua 原始檔 lua/report.lua 中。lua/invoice.lua 檔案中定義的 generate_monthly_report 呼叫了前面那個 generate 函式。

Lua 熱路徑與原始檔定位

將滑鼠懸停在報告中的 generate 節點上,提示裡會給出 完整源路徑與行號(如第 11 行);用編輯器開啟對應檔案即可對照業務邏輯(本例中 generate 涉及查庫與生成報告)。

Lua 熱路徑與原始檔定位

在原始碼中對照報告給出的行號

在原始碼中對照報告給出的行號

記憶體:GC 引用路徑一覽

在記憶體相關小節中,Lua 層 GC 物件引用路徑中,很大一部分的記憶體被 LuaJIT 垃圾收集器尚未釋放的死亡 Lua 物件佔用。

Lua GC 引用路徑與已載入模組

放大 registry -> ._LOADED 等路徑後,可以看到在這條資料引用路徑下,table 是當前 Lua 應用已載入的所有 Lua 模組的資料結構。顯然,這些載入的 Lua 模組也佔了很多的記憶體。

Lua GC 引用路徑與已載入模組

Lua GC 引用路徑與已載入模組

全自動分析與報告

除單次 Guided Analysis 外,XRay 也可對線上程序持續產出洞察。切換到 Insights 即可按日、按周檢視自動報告,適合長期觀察;互動式嚮導更適合開發與演示場景。

Insights 中的週期報告

關於 OpenResty XRay

OpenResty XRay 是一個動態追蹤產品,它可以自動分析執行中的應用,以解決效能問題、行為問題和安全漏洞,並提供可行的建議。在底層實現上,OpenResty XRay 由我們的 Y 語言驅動,可以在不同環境下支援多種不同的執行時,如 Stap+、eBPF+、GDB 和 ODB。

關於作者

章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。

章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴, 是 “邊緣計算“、”動態追蹤 “和 “機器程式設計 “的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,並編寫過 60 多個開源軟體庫。

關注我們

如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

我們提供了英文版原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!