2010-11-08 136 views
23

我運行Ubuntu 10.10。我只想調試一個簡單的腳本。花了半天的時間試圖找出如何做到這一點,我放棄了。我該怎麼做?如何調試ruby代碼?

我從Ubuntu庫
我跑sudo gem install ruby-debugsudo gem install ruby-debug-ide

我嘗試了幾種不同的方法來完成這項工作安裝ruby-dev。我試過require 'ruby-debug',然後在代碼的某處設置debugger。但Ruby不會找到ruby-debug
我試圖設置vim-ruby-debugger,這將需要年齡執行:Rdebugger myScript.rb,並允許我設置斷點,但似乎沒有辦法使用該調試器執行我的代碼。
我試圖使用NetBeans,每次設置項目並單擊任何內容時都會崩潰。

所以,親愛的社區:必須有一種方法來調試Ruby。不是Rails。沒有什麼花哨。只是一些CLI腳本。請幫助我,否則我會失去理智。

編輯: gem exec dir不在我的路徑中。所以,至少rdebug現在似乎工作。

+0

相關的問題,雖然更側重於printf調試:http://stackoverflow.com/questions/3955688/how-do-i-debug-ruby-scripts – 2010-11-08 22:18:15

回答

19

Ruby-debug用於1.8+,ruby-debug19用於1.9+。

ruby​​-debug很容易學習,非常有用。您可以告訴應用程序運行,直到存在特定條件,然後讓它中斷,這樣可以很容易找到零值或偶爾出現的其他條件。

從命令行使用rdebug appname,您將最終進入調試器提示符。如果要運行到第100行,並停止輸入c 100,並且調試器將設置臨時中斷點,則程序將運行,如果它位於執行路徑中,則停在此處。一旦停止,臨時斷點將被清除。如果你總是想在第100行停下來,你可以做b 100然後c和調試器將設置一個永久的斷點,繼續,然後停止時,達到斷點。您可以清除斷點,設置在某些條件適用時發生的條件錯誤等。您可以鍵入n以跳至子程序調用跳過的下一條指令,或跳至s。有些命令以各種方式顯示變量的內容,因此請閱讀文檔。

從rdebug裏面,你可以放入一個IRB shell中,你的變量已經被填充了,所以你可以捅一下看看會發生什麼。從裏面你可以檢查或設置值,幫助進行假設調整。如果你在rdebug中這樣做,你可以用改變後的值繼續程序,看看它是如何工作的。但是它不是替代調試器,就像調試器可以做一些IRB-ISH的事情一樣,但不會替代IRB-ISH的事情。這兩種工具都是一個很好的組合,並且可以根據打印語句或轉儲到日誌文件來打敗他們。


Pry已經成爲IRB的一個偉大的組合和debugger,是非常值得研究。

+0

由於習慣使用圖形化調試器,ruby-debug起初使用起來有些尷尬,但最終證明它非常實用,並且確實發現了我的錯誤。謝謝你的提示! – bastibe 2010-11-09 08:26:39

+3

圖形調試器很漂亮,但它們提供的功能必須在較低的級別上存在,否則它們將不會顯示任何內容。我花了很多時間在命令行上,忘記了IDE中漂亮的佈局。儘管如此,我仍然依靠命令行調試器向我展示真正隱藏在變量中的內容;我對我應該做什麼有我的看法,但有時候翻譯人員不同意我的看法,而且直到我告訴它不同之後,它纔會獲勝。 :-) – 2010-11-09 16:22:52

+0

請結帳[pry-byebug](https://github.com/deivid-rodriguez/pry-byebug),現在似乎是常態。 – Hassek 2016-07-16 02:37:37

4

我曾經用過Ruby的最好的調試器是內建於Netbeans的調試器。你必須從Netbeans安裝快速的ruby調試器gem(我不確定它實際上是哪個gem,但是Netbeans會提示​​你這麼做)。我發現如果將Netbeans從內置的JRuby 1.4切換到系統的默認Ruby安裝,效果會更好。還有值得關注的breakpoint寶石,並且從開發開始使用Ruby內置庫logger也很有幫助。祝你好運!

+1

Netbeans簡單地崩潰,每次我想運行它。如果我的調試需求會超過ruby-debug所提供的,那麼我一定會檢查它。 – bastibe 2010-11-09 08:23:47

2

使用IRB。它是一個交互式的Ruby shell。當發生錯誤時,它會給出跟蹤行號的跟蹤,以便您可以確定代碼出錯的部分。您可以load您的源文件並運行單個方法以查看它們是否正常工作。 IRB提供有用的輸出 - 當您輸入一些代碼時,它將評估表達式,然後使用.inspect打印返回值。

+0

Pry比IRB更有效率。它允許更多的靈活性,並且它的社區正在增長(並且與IRB的社區進行互動)。 – jackyalcine 2014-03-29 19:02:14

12

pry與IRB相比更好。以下是從README獲取。

Pry是Ruby的標準IRB外殼的強大替代品。它是從頭開始編寫提供了許多先進的功能,包括:

  • 源代碼瀏覽(包括與撬DOC寶石核心的C源)
  • 文檔瀏覽
  • 在線幫助系統
  • 在編輯器打開方法(編輯方法類#方法)
  • 語法高亮
  • 命令外殼集成(編輯開始,運行git,並從內部鐠耙Y)
  • 要點整合
  • 導航周圍狀態(CD,LS和朋友)
  • 運行時調用(使用撬作爲一個開發者控制檯或調試器)
  • 異國對象的支持(BasicObject情況下,IClasses,... )
  • 一個強大且靈活的命令系統
  • 能夠查看和重放歷史由IPython的,Smalltalk和OTH啓發

  • 許多方便的命令呃先進的REPLs

  • 大量的插件,提供遠程會話,全面的調試功能,等等。

撬起的目的還在於爲比IRB替換更多;它試圖將REPL驅動的編程帶入Ruby語言。它目前還不如SLIME這樣的工具對Lisp來說功能強大,但這是Pry正在前進的大方向。

Pry也相當靈活,允許重要的用戶自定義,將其設置爲從任何具有readline方法的對象中讀取並寫入具有put方法的任何對象是很簡單的 - Pry的許多其他方面也是可配置的,實現自定義shell的不錯選擇。

+0

我同意,我沒有很好地爲ruby 1.9.3安裝ruby-debug。 Pry開箱即用,非常易於使用。 – Nosh 2012-07-07 12:51:20

+0

巨型upvote在這裏。非常類似於python的pdb.set_trace() - 我正在尋找類似的東西。正如Nosh所說的那樣,在1.9.3中開箱即用。 – Koobz 2012-12-06 19:12:34

+0

「pry與IRB相比更好」:直到[Pry.debugger](https://github.com/nixme/pry-debugger)出現在2012年中期之前,這是真實的。 – 2013-10-28 19:14:08

7
  1. 在Ruby:

    紅寶石-rdebug myscript.rb 然後,

    • B:把斷點
    • 和n(分機)或S(TEP) and c(ontinue)
    • p(uts)for display
  2. 在Rails:用

    • 腳本/服務器--debugger

      啓動服務器,並在代碼中添加調試器。

1

你可以看到小抄運行

gem install cheat 
    cheat rdebug 

這會顯示使用中,RDebug有用的命令。

1

嘗試默認Ruby調試或者通過:

ruby -r debug filename[, ...] 

或者,如果它的CLI腳本,只是改變了第一條來自:

#!/usr/bin/env ruby 

到:

#!/usr/bin/env ruby -rdebug 

和腳本將停止在每個例外。

或者檢查以下腳本示例:

#!/usr/bin/env ruby 
class Hello 
    def initialize(hello) 
     @hello = hello 
    end 
    def hello 
     @hello 
    end 
end 

salute = Hello.new("Hello, Mac!") 
puts salute.hello 

可以調試,如下所示:

# ruby -r debug hello.rb 
Debug.rb 
Emacs support available. 

hello.rb:3:class Hello 
(rdb:1) v l 
    salute => nil 
(rdb:1) b 10 
Set breakpoint 1 at hello.rb:10 
(rdb:1) c 
Hello, Mac! 

來源:Ruby Debugger


或者使用lldb/gdb。見簡單的例子,下面的打印腳本回溯到前臺:

echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby) 

gdb更換lldb如果工作得更好。用前綴sudo來調試非擁有的進程。

+0

什麼概念。使用內置的調試器。誰曾想到。無論如何,它爲我工作。是ruby-debug作爲默認調試器轉入ruby命令,還是這是不同的? – labyrinth 2015-12-11 12:22:39

+0

不知道,我甚至沒有Ruby開發人員,但我不得不在某些時候調試一些代碼,而這些代碼對我來說是未知的。 – kenorb 2015-12-11 12:39:54

0

Ruby調試有一個困難的歷史,充滿了只支持特定小版本MRI的工具。謝天謝地,從2.0開始,你可以使用byebug

命令行使用很簡單:運行byebug <your script>。您還可以編輯您的文件並將byebug函數調用放在要啓動調試的任何位置。