Posts Ruby 使用 Byebug 進行 Debug
Post
Cancel

Ruby 使用 Byebug 進行 Debug

我是wells,擔任過室內配線的國手,征服了電氣領域後,現在正跨大版圖到資訊界。

簡介

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

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

使用方式

  1. 安裝 Byebug
    1
    
    gem install byebug
    
  2. .rb 檔案最上方加入以下內容:
    1
    
    require "byebug"
    
  3. 埋入中斷點
  4. 開始執行
    • 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 後面加判斷式

1
2
3
4
5
require "byebug"
10.times.each do |i|
    byebug if i == 3
    puts i
end

輸出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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) 

參考連結

This post is licensed under CC BY 4.0 by the author.

Ruby 使用 Double Splat Operator 修飾參數

Kamigo 搭配 Devise 實作會員功能