2011-12-17 77 views
30

由於在紅寶石寶石中可能有很多ghost方法,我認爲研究ruby寶石的內部機制並不是一個好主意,靜態讀取其源代碼。有沒有辦法將第三方gem的源文件附加到正在運行的ruby進程進行調試,以便我可以設置中斷點並查看事件如何動態工作?
順便說一句,我試着導航到RubyMine中第三方gem的源文件,方法是點擊'require'語句的上下文菜單「Go To-> Implementations」或第三方gem的其他符號(例如,require 'watir'),但沒有成功。動態類型語言(如Ruby)的IDE無法通過符號導航正常嗎?在ruby中調試第三方gems的最佳方法

回答

37

我很想知道,如果有更好的方式來做到這一點,但它是如何我通常做的是:

  1. 添加紅寶石調試寶石到您的Gemfile(或者,如果你是紅寶石debug19在Ruby 1.9.2上)
  2. 通過做bundle show gemname找到寶石。我在Mac上,所以我通常將其傳送給pbcopy,以便將其複製到剪貼板。 bundle show rails | pbcopy
  3. 在您喜歡的編輯器中打開gem目錄。 mvim /path/to/gem/directory
  4. 導航到要放置斷點*的文件和行,並在有問題的行上面插入debugger
  5. 刷新頁面,運行測試,或做任何你會獲得寶石文件來執行
  6. 當執行在調試器停止時,你可以檢查變量(p variable_name),並通過與ruby debugger commands線動線。

*知道往哪裏放斷點可以利用代碼的一些瞭解,但你應該在LIB/gemname.rb

+3

感謝。這很好。 FWIW,我用[Pry](https:// ruby​​gems。org/gems/pry)而不是ruby-debug,這也起作用。 – 2015-05-11 17:03:17

+1

如果他們使用相同的Gem,會在同一臺機器上中斷其他應用程序嗎? – flyingL123 2015-09-25 05:42:13

+0

@ flyingL123,我想如果它們在調試模式下作爲你的應用運行,它會打斷他人。 – parzival 2017-05-11 15:35:34

0

在這種改變的代碼在運行時,像Ruby語言,是很難準確預測100%的符號,方法等的起源

我處理很多需要的源代碼分析第三方寶石和我發現這個任務的最佳工具是Netbeas +它是Ruby和Rails插件。

  • 允許在從屬寶石源代碼良好的導航(不像其他的替代品)
  • 視覺斷點和調試實際工作(在跟蹤和所有)**

**它有一些小問題與方法調用產生的代碼塊(如每個{}),但我學會了處理這些

我通常做的是設置斷點並在運行時分析代碼。

9

我會避免編輯寶石文件,在目前接受的答案建議開始。相反,將debugger命令放入其中一個應用程序文件中,並使用break命令在gem中設置斷點。我使用rvmgemset所以這裏是我如何做到這一點:

break /Users/chris/.rvm/gems/rub[email protected]<gemset>/gems/<gem_name>-<gem-version>/<path_to_file>:<line_number>

+0

如果他們使用相同的Gem,接受的答案是否會干擾同一臺機器上的其他應用程序?如果是這樣,這個解決方案似乎可以避免這個問題。 – flyingL123 2015-09-25 05:43:16

+2

是的。這就是整個問題。除非你沒有選擇,否則我會避免不惜一切代價編輯Gem文件,除非你願意分叉它們 – 2015-11-07 16:31:47

相關問題