什麼是 Valgrind?我什麼時候應該使用它來調試比特幣核心而不是使用 gdb、lldb、pdb 等?
我正在觀看 Fabian Jahr在 Bitcoin Edge Dev++ 2019 上關於調試比特幣核心的演講。他在最後簡要提到了 Valgrind。它是什麼,什麼時候應該在 gdb、lldb、pdb 等上使用它?
如果您觀看 Fabian 的展示文稿(或閱讀成績單),您會看到他說您可以使用 Valgrind 進行記憶體洩漏檢查,並且可以與 lldb 類似地使用它。
valgrind --leak-check=yes src/bitcoind -regtest
Fabian 的文件中有一個關於調試比特幣的部分,其中包含有關如何在 MacOS 上安裝 Valgrind 並執行它的說明。
安裝 Valgrind:
brew install --HEAD https://raw.githubusercontent.com/sowson/valgrind/master/valgrind.rb
使用 Valgrind 執行 bitcoind:
sudo valgrind src/bitcoind -regtest
Valgrind 也已作為標誌添加到PR #17633中 Core 中的功能測試,因此您可以執行:
test/functional/test_runner.py --valgrind
該
--valgrind
標誌被記錄為 Valgrind 記憶體錯誤檢測器,並且您應該期望在需要 Valgrind 3.14 或更高版本時至少會減速 10 倍。在 PR 中,實用的 Swift 聲明:
Valgrind 下的正常功能測試會擷取我們在歷史上看到的許多未初始化的讀取。
另一個很棒的資源是關於在 Valgrind 下執行單元測試的 Bitcoin Core PR 審查俱樂部會議(由 Jon Atack 主持)。在該會話的註釋中,它描述了:
Valgrind 是一個調試和分析工具套件,可以使程序更快、更正確。它最受歡迎的工具 Memcheck 可以檢測 C 和 C++ 程序中常見的與記憶體相關的錯誤,這些錯誤可能導致崩潰和不可預測的行為。這是一個教程。Memcheck 並不完美:典型的減速是 3-10 倍,記憶體使用是 2 倍,它可能會產生誤報(有抑制這些的機制;請參閱 Bitcoin Core 中的valgrind.supp文件),並且它目前沒有檢測到輸出-對靜態分配的數組或堆棧上的數組進行範圍外的讀取或寫入。