軟體計數器模式 rr:記錄和重放除錯現可在雲虛擬機器和容器中使用

BigGo Editorial Team
軟體計數器模式 rr:記錄和重放除錯現可在雲虛擬機器和容器中使用

記錄和重放除錯是一種強大的技術,允許開發者捕獲程式執行過程並精確重放,使追蹤難以發現的錯誤變得更加容易。然而,這一領域最流行的開源工具 rr 有一個顯著的限制:它需要訪問 CPU 硬體效能計數器,而這些計數器在雲虛擬機器和容器環境中通常是被停用的。一項新的突破旨在改變這一狀況。

軟體計數器模式使 rr 適用於更多環境

rr 偵錯程式已被修改為無需訪問 CPU 硬體效能計數器即可執行,使其可以在通常限制此類訪問的雲虛擬機器和容器中使用。這個新變體,稱為軟體計數器模式 rr,使用輕量級動態和靜態插樁來跟蹤程式執行,而不是依賴硬體計數器。這一發展使記錄和重放除錯適用於更多環境,潛在地解決了使用者使用 rr 面臨的最大障礙之一。

「我曾非常努力地嘗試讓 rr 為我工作,甚至專門購買了一臺單獨的電腦來使用它...但它總是持續失敗,所以我基本上放棄了它。像這樣的工具絕對是一個福音。」

這一修改解決了記錄/重放系統中的一個基本挑戰:跟蹤程式執行進度以確保準確重放。傳統的 rr 使用硬體效能計數器(如計算 CPU 分支指令)來衡量這一進度,而軟體計數器模式 rr 透過程式碼插樁實現了相同的目標。

權衡和當前限制

雖然這一突破擴充套件了 rr 的可用性,但它也帶來了一些權衡。根據開發者的說法,由於動態和靜態插樁的開銷,軟體計數器模式比使用硬體計數器要慢。這種方法也可能使記錄/重放過程變得更加脆弱。

目前,僅 x86-64 支援已公開發布,儘管開發者提到內部已有 aarch64 支援。另一個限制是軟體計數器模式 rr 目前僅在具有強大 debuginfod 支援的最新 Linux 發行版上執行,包括 Fedora 40/41、Debian Unstable 和 Ubuntu 24.10。

儘管有這些限制,社群反應熱烈,許多使用者急於嘗試在原始工具失效的環境中可以工作的 rr 版本。隨著越來越多的開發工作轉向基於雲的環境,在雲虛擬機器中使用記錄/重放除錯的能力可能特別有價值。

軟體計數器模式 rr 的主要侷限性

  • 效能:由於儀器化開銷,比使用硬體計數器的 rr 慢
  • 脆弱性:動態和靜態儀器化可能使記錄/重放更加脆弱
  • 平臺支援:目前公開版本僅支援 x86-64 架構
  • 發行版要求:僅在具有強大 debuginfod 支援的最新 Linux 發行版上執行:
    • Fedora 40/41
    • Debian Unstable
    • Ubuntu 24.10
  • 與原始 rr 共享的侷限性:不支援 io_uring

未來前景和整合

目前還沒有將軟體計數器模式合併回主要 rr 專案的明確計劃。開發者指出,這一修改透過動態/靜態插樁引入了一種顯著不同的計時方法,這與 rr 的傳統方法相比是一個重大變化。

開發者鼓勵使用者嘗試該軟體並報告他們的體驗,表明有了足夠的積極反饋,可以為上游整合提出更有力的理由。一些使用者還詢問了與生態系統中其他工具的相容性,例如 Pernosco(一個基於 rr 構建的除錯平臺),這可能需要技術修改以支援軟計時記錄。

值得注意的是,原始 rr 的某些限制在軟體計數器模式中仍然存在。例如,由於 rr 與核心/使用者空間邊界互動的基本架構挑戰,io_uring 支援仍然缺失。

對於有興趣嘗試軟體計數器模式 rr 的開發者,程式碼可在 https://github.com/sidkshatriya/rr.soft 獲取,同時還有關於其工作原理以及如何構建和執行的詳細文件。

參考:Bringing Record and Replay everywhere