分析缺失除錯符號的 OpenResty/Nginx 應用(使用 OpenResty XRay)
本教程中,我們將展示如何自動分析沒有除錯符號的 OpenResty 和 Nginx 應用。即使在所有除錯資訊缺失的情況下,它也能透過機器學習演算法自動對可執行檔案進行分析,重建除錯符號,並透過動態追蹤進行深入和全面的分析。OpenResty XRay 擁有從被 strip 過的可執行檔案中生成除錯符號的超能力,因此即使缺失除錯符號,也能獲得 C 函式和 Lua 函式的原始檔、原始碼行相關資訊。
問題:應用缺失除錯符號
用 ps 檢視目標程序,確認可執行檔案路徑(示例為使用者自己用原始碼編譯的 OpenResty)。
對主程式執行 file:輸出表明二進位制已被 strip,沒有任何除錯符號或符號表。也找不到該程式對應的除錯符號安裝包。
對程序載入的 LuaJIT 動態連結庫同樣執行 file,可見 LuaJIT 檔案的除錯符號也是缺失的。
自動分析與重建除錯符號
在瀏覽器開啟 OpenResty XRay 控制檯,進入 Guided Analysis,按嚮導選擇要分析的問題型別、目標應用與 worker 程序,語言級別保持 Lua 與 C/C++ 同時選中後開始分析。控制檯入口與嚮導頁如下(具體選項組合見影片)。
分析開始後,XRay 會檢測缺失的除錯符號並 自動發起符號重建;重建完成後,會像平常一樣並行執行各類分析器。
結束取樣後,介面會生成彙總報告;下文只摘 CPU 與記憶體兩處讀法。
CPU:火焰圖與 Lua 熱路徑
在報告的 CPU 部分,可先展開 Lua 熱點,再從關聯的 C 側火焰圖檢視函式名;在已重建符號的前提下,火焰圖能細化到 C 原始檔名與行號。
Lua 側會給出佔用 CPU 最多的呼叫路徑:本例中 close 函式被 generate 函式呼叫。generate 是一個 Lua 函式,被定義在 Lua 原始檔 lua/report.lua 中。lua/invoice.lua 檔案中定義的 generate_monthly_report 呼叫了前面那個 generate 函式。
將滑鼠懸停在報告中的 generate 節點上,提示裡會給出 完整源路徑與行號(如第 11 行);用編輯器開啟對應檔案即可對照業務邏輯(本例中 generate 涉及查庫與生成報告)。
記憶體:GC 引用路徑一覽
在記憶體相關小節中,Lua 層 GC 物件引用路徑中,很大一部分的記憶體被 LuaJIT 垃圾收集器尚未釋放的死亡 Lua 物件佔用。
放大 registry -> ._LOADED 等路徑後,可以看到在這條資料引用路徑下,table 是當前 Lua 應用已載入的所有 Lua 模組的資料結構。顯然,這些載入的 Lua 模組也佔了很多的記憶體。
全自動分析與報告
除單次 Guided Analysis 外,XRay 也可對線上程序持續產出洞察。切換到 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、LuaJIT、GDB、SystemTap、LLVM、Perl 等,並編寫過 60 多個開源軟體庫。
關注我們
如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:
翻譯
我們提供了英文版原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!



































