Ruby 使用 Byebug 進行 Debug

簡介

Byebug 是 Ruby 很出名的除錯工具,以 Gem 的方式加入進 Ruby 的專案中,其擁有其他除錯工具的相同功能,如:

  • 步進:程式一行一行執行。
  • 暫停:程式停止在指定處。
  • 交互式編輯環境(REPL):在程式停止的該處進行操作。
  • 追蹤:追蹤變數的值在不同行的差異。

使用方式

  1. 安裝 Byebug
gem install byebug
  1. .rb 檔案最上方加入以下內容:
require "byebug"
  1. 埋入中斷點
  2. 開始執行
    • ruby xxx.rb 執行到 byebug 的地方後進入 byebug 模式
    • byebug xxx.rb 自第一行開始進入 byebug 模式

Byebug 操作指令

說明相關指令

指令別名範例說明
helphh列出全部指令的說明
help cmdh cmd-aliash n列出 next 這個指令的說明

執行下一步相關指令

指令別名範例說明
nextnn在同一個區塊或方法中往下執行 1 行
 n 3在同一個區塊或方法中往下執行 3 行
stepss進入區塊或是方法執行 1 行
 s 3進入區塊或是方法執行 3 行
continuecc執行到下一個斷點或是程式結束
 c 43執行到第 43 行(或是在下一個斷點停止)
continue!c!c!執行到程式結束(遇到斷點也不會停止)
finishfinfin執行所有 frame 中的程式(完成由 step 進入的程式碼)

斷點相關指令

指令別名範例說明
info breakpointsi bi b列出所有斷點的編號、啟用與否和放置位置
breakbb 33在目前檔案的第 33 行新增一個斷點
disable breakpointdis bdis b 2關閉編號 2 的斷點(如果沒指定編號則代表關閉所有斷點)
enable breakpoint en ben b 2開啟編號 2 的斷點(如果沒指定編號則代表開啟所有斷點)
deletedeldel 1刪除編號 1 的斷點(如果沒指定編號則代表刪除所有斷點)
conditioncondcond 3 i > 3為編號 3 的斷點新增 i > 3 的判斷式
 cond 3刪除編號 3 的斷點判斷式

監控相關指令

在程式每次被斷點中斷時都會呈現監控點上的程式碼回傳值。

指令別名範例說明
info display i di d列出所有監控的編號、啟用與否和其程式碼
displaydispdisp arg新增一個每次被斷點中斷時,都會呈現 arg 數值的監控點
 disp列出所有監控點的編號、程式碼和其回傳值
disable displaydis ddis d 2關閉編號 2 的監控點
enable display en den d 2開啟編號 2 的監控點
undisplayundispundisp 1停止顯示編號 2 的監控點(無指定編號則代表停止顯示所有監控點)

變數相關指令

指令別名範例說明
var argsv av a顯示當前方法的參數名稱和值
var localv lv l顯示當前範圍(區塊或是方法)的所有變數名稱和值
var instancev iv i顯示實例化物件中的變數名稱和值
 v i obj顯示 obj 這個實例化物件中的變數名稱和值
var constv cv c顯示所有的常數名稱和值
 v c Klass顯示 Klass 這個 class/module 裡常數名稱和值
var globalv gv g顯示所有的全域變數名稱和值
var allv allv all顯示所有的變數
evalevaleval i當變數為 byebug 關鍵字時,可以用這種方式取得值

追蹤和定位相關指令

指令別名範例說明
list=l=l=顯示目前執行位置的前 5 行和後 4 行程式碼
listll 8-20顯示第 8 行到第 20 行的程式碼
 l顯示往後 10 行的程式碼(再輸入一次 l 會在往後 10 行)
list-l-l-顯示往前 10 行的程式碼(再輸入一次 l 會在往前 10 行)
where or backtracew or btw顯示目前停止的位置其上下文(由誰呼叫等等)
 bt顯示目前停止的位置其上下文(由誰呼叫等等)
frameff 2往上 2 層查看進入點

操作相關指令

指令別名範例說明
editeded編輯當前執行的檔案
irbirbirb開啟 irb
quitqq離開 byebug
quit!q!q!強制離開 byebug
restartrestartrestart重新開始執行

使用範例

Byebug 後面加判斷式

require "byebug" 10.times.each do |i| byebug if i == 3 puts i end

輸出:

0 1 2 3 Return value is: nil [1, 6] in /Users/wells/project/test.rb 1: require "byebug" 2: 3: 10.times.each do |i| 4: puts i 5: byebug if i == 3 => 6: end (byebug)

參考連結