2010-11-08 33 views
23

Tôi chạy Ubuntu 10.10. Tôi chỉ muốn gỡ lỗi một tập lệnh đơn giản. Sau khi dành nửa ngày cố gắng tìm ra cách mà có thể được thực hiện tôi bỏ cuộc. Tôi phải làm gì đây?Làm thế nào để gỡ lỗi mã ruby?

Tôi đã cài đặt ruby-dev từ kho Ubuntu
Tôi chạy sudo gem install ruby-debugsudo gem install ruby-debug-ide

Tôi đã thử một vài cách khác nhau để làm cho công việc này. Tôi đã thử require 'ruby-debug' và sau đó đặt debugger ở đâu đó trong mã. Nhưng Ruby sẽ không tìm thấy ruby-debug.
Tôi đã thử thiết lập vim-ruby-debugger, sẽ mất độ tuổi để thực thi :Rdebugger myScript.rb và sẽ cho phép tôi đặt điểm ngắt, nhưng dường như không có cách nào để thực thi mã của tôi bằng trình gỡ lỗi đó.
Và tôi đã cố gắng sử dụng NetBeans mà chỉ đơn giản là bị rơi mỗi khi tôi thiết lập dự án và nhấp vào bất cứ điều gì.

Vì vậy, cộng đồng thân yêu: Phải có cách để gỡ lỗi Ruby. Không phải Rails. Không có gì lạ mắt. Chỉ một số kịch bản CLI. Xin hãy giúp tôi hoặc tôi mất đi những gì còn lại của sự tỉnh táo của tôi.

Chỉnh sửa: thư mục gem exec không nằm trong đường dẫn của tôi. Vì vậy, ít nhất rdebug dường như làm việc ngay bây giờ.

+0

Câu hỏi liên quan, mặc dù tập trung hơn vào gỡ lỗi printf: http://stackoverflow.com/questions/3955688/how-do-i-debug-ruby-scripts –

Trả lời

19

Gỡ lỗi Ruby là 1,8+ và ruby-debug19 là 1,9+.

ruby-debug rất dễ học và rất hữu ích. Bạn có thể yêu cầu ứng dụng chạy cho đến khi một điều kiện nhất định tồn tại, sau đó ngắt nó, làm cho nó dễ dàng định vị các giá trị nil, hoặc các điều kiện khác xảy ra không thường xuyên.

Từ việc sử dụng dòng lệnh rdebug appname và bạn sẽ kết thúc tại lời nhắc trình gỡ lỗi. Nếu bạn muốn chạy đến dòng 100 và dừng bạn có thể nhập c 100 và trình gỡ lỗi sẽ đặt điểm ngắt tạm thời, chương trình sẽ chạy sau đó dừng ở đó nếu nó nằm trong đường dẫn thực thi. Khi nó dừng điểm tạm thời sẽ bị xóa. Nếu bạn luôn muốn dừng ở dòng 100, bạn có thể làm b 100 rồi c và trình gỡ lỗi sẽ đặt điểm ngắt cố định, tiếp tục, sau đó dừng lại khi đạt đến điểm ngắt. Bạn có thể xóa các điểm ngắt, đặt các điểm ngắt có điều kiện xảy ra khi các điều kiện nhất định áp dụng, v.v. Bạn có thể nhập n để chuyển sang lệnh tiếp theo bỏ qua các cuộc gọi chương trình con hoặc s để bước vào chúng. Có các lệnh để hiển thị nội dung của các biến theo nhiều cách khác nhau, vì vậy hãy đọc qua các tài liệu.

Từ bên trong rdebug bạn có thể thả vào một trình bao IRB với các biến của bạn đã được điền để bạn có thể poke vào mọi thứ để xem điều gì xảy ra. Từ bên trong, bạn có thể kiểm tra hoặc thiết lập các giá trị, giúp điều chỉnh những gì nếu điều chỉnh. Nếu bạn làm điều đó từ bên trong rdebug bạn có thể tiếp tục chương trình với (các) giá trị được thay đổi và xem nó hoạt động như thế nào.

IRB có vị trí của nó, và nó tuyệt vời để thử mọi thứ, nhưng nó không thay thế cho trình gỡ rối, cũng giống như trình gỡ rối có thể thực hiện một số thứ IRB-ish, nhưng sẽ không thay thế nó. Cả hai công cụ là một sự kết hợp tốt và đánh bại các heck ra khỏi dựa vào báo cáo in hoặc bán phá giá vào một tập tin đăng nhập.


Pry đã nổi lên như một sự kết hợp tuyệt vời của IRB và debugger, và cũng có giá trị điều tra.

+0

Được sử dụng để sử dụng trình gỡ rối đồ họa, gỡ lỗi ruby ​​là loại khó xử khi sử dụng lúc đầu nhưng nó tỏ ra khá thực tế vào cuối và chắc chắn tìm thấy lỗi của tôi. Cảm ơn vì tiền hỗ trợ! – bastibe

+3

Trình gỡ rối đồ họa khá, nhưng chức năng mà chúng cung cấp phải tồn tại ở mức thấp hơn, dưới đồ họa nếu không chúng sẽ không có gì để trình bày. Tôi dành rất nhiều thời gian ở dòng lệnh mà tôi quên đi những bố trí đẹp trong IDE. Tuy nhiên, tôi dựa vào trình gỡ rối dòng lệnh để chỉ cho tôi những gì thực sự ẩn trong một biến; Tôi có ý kiến ​​của tôi về những gì nó nên được nhưng đôi khi các thông dịch viên không đồng ý với tôi - và nó luôn luôn thắng cho đến khi tôi nói với nó khác nhau. :-) –

+0

vui lòng thanh toán [pry-byebug] (https://github.com/deivid-rodriguez/pry-byebug), có vẻ là tiêu chuẩn ngay bây giờ. – Hassek

4

Trình gỡ lỗi tốt nhất mà tôi từng sử dụng cho Ruby là trình xây dựng được cài sẵn trong Netbeans. Bạn phải cài đặt gem debugger ruby ​​nhanh từ Netbeans (tôi không chắc gem đó thực sự là gì, nhưng Netbeans sẽ nhắc bạn làm điều đó). Tôi thấy rằng nó hoạt động tốt hơn nhiều nếu bạn chuyển Netbeans ra khỏi built-in JRuby 1.4 để cài đặt Ruby mặc định của hệ thống của bạn. Ngoài ra còn có viên đá quý breakpoint đáng để xem và sử dụng thư viện tích hợp sẵn của Ruby logger từ khi bắt đầu phát triển của bạn cũng hữu ích. Chúc may mắn!

+1

Netbeans chỉ đơn giản là rơi mỗi khi tôi muốn chạy nó. Nếu nhu cầu gỡ lỗi của tôi sẽ vượt quá những gì ruby-debug đã cung cấp, tôi chắc chắn sẽ kiểm tra xem nó ra, mặc dù. – bastibe

2

Sử dụng IRB. Nó là một vỏ Ruby tương tác. Khi xảy ra lỗi, nó sẽ cung cấp một dấu vết với số dòng để bạn có thể biết phần nào của mã của bạn đã sai. Bạn có thể load các tệp nguồn của mình và chạy các phương thức riêng lẻ để xem chúng có hoạt động đúng hay không. IRB cung cấp đầu ra hữu ích - khi bạn nhập một số mã, nó sẽ đánh giá biểu thức và sau đó in giá trị trả về bằng cách sử dụng .inspect.

+0

Pry hiệu quả hơn là IRB. Nó cho phép rất nhiều linh hoạt hơn và cộng đồng của nó đang phát triển (và cũng tương tác với cộng đồng của IRB). – jackyalcine

12

pry là tốt hơn so với IRB. Sau đây là lấy từ README của nó.

Pry là giải pháp thay thế mạnh mẽ cho vỏ IRB chuẩn cho Ruby. Nó được viết từ đầu để cung cấp một số tính năng tiên tiến, bao gồm:

  • duyệt Source code (bao gồm cả nguồn C lõi với viên ngọc nâng lên-doc)
  • Documentation duyệt
  • sống giúp đỡ hệ thống
  • Phương pháp mở trong trình chỉnh sửa (phương pháp chỉnh sửa Phương thức lớp #)
  • Đánh dấu cú pháp
  • Tích hợp trình bao (bắt đầu trình chỉnh sửa, chạy git và cào từ bên trong Pr y)
  • hội nhập Gist
  • Navigation trên toàn tiểu bang (cd, ls và bạn bè)
  • Runtime gọi (sử dụng Pry như một nhà phát triển
  • hỗ trợ đối tượng Exotic console hoặc debugger) (trường hợp BasicObject, IClasses, ...)
  • Một hệ thống chỉ huy mạnh mẽ và linh hoạt
  • Khả năng xem và lịch sử phát lại

  • Nhiều lệnh thuận tiện lấy cảm hứng từ IPython, Smalltalk và oth er REPLs nâng cao

  • Một số lượng lớn các plugin cung cấp các phiên từ xa, chức năng gỡ lỗi đầy đủ và hơn thế nữa.

Pry cũng nhằm mục đích không chỉ thay thế IRB; nó là một nỗ lực để đưa chương trình điều khiển REPL đến ngôn ngữ Ruby. Nó hiện không mạnh bằng các công cụ như SLIME cho lisp, nhưng đó là hướng chung mà Pry đang hướng tới.

Pry cũng khá linh hoạt và cho phép tùy biến người dùng quan trọng để đặt nó đọc từ bất kỳ đối tượng nào có phương pháp readline và ghi vào bất kỳ đối tượng nào có phương thức đặt - nhiều khía cạnh khác của Pry cũng có thể định cấu hình một lựa chọn tốt để triển khai các trình bao tùy chỉnh.

+0

Tôi đồng ý, tôi không có thời gian tốt để cài đặt ruby-debug cho ruby ​​1.9.3. Pry làm việc ra khỏi hộp & rất dễ sử dụng. – Nosh

+0

Mega-upvote tại đây. Rất giống với pdb.set_trace của python() - Tôi đang tìm kiếm một cái gì đó tương tự. Làm việc ra khỏi hộp trong 1.9.3 như đã nêu bởi Nosh. – Koobz

+0

"pry là tốt hơn so với IRB": Điều này đúng cho đến khi [Pry.debugger] (https://github.com/nixme/pry-debugger) xuất hiện vào giữa năm 2012. –

7
  1. Trong Ruby:

    ruby ​​-rdebug myscript.rb sau đó,

    • b: đưa break-điểm
    • và n (ext) hoặc s (tep) và c (ontinue)
    • p (uts) để hiển thị
  2. Trong Rails: Khởi động máy chủ với

    • script/server --debugger

      và thêm debugger trong các mã.

1

Bạn có thể xem Cheat tờ chạy

gem install cheat 
    cheat rdebug 

này sẽ hiển thị các lệnh hữu ích để sử dụng rdebug.

1

Hãy thử mặc định của Ruby Debugger bằng cách:

ruby -r debug filename[, ...] 

Hoặc nếu nó CLI kịch bản, chỉ cần thay đổi dòng đầu tiên của nó từ:

#!/usr/bin/env ruby 

tới:

#!/usr/bin/env ruby -rdebug 

và kịch bản sẽ dừng lại trên mỗi Ngoại lệ.

Hoặc kiểm tra các mẫu sau đây kịch bản:

#!/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 

Bạn có thể gỡ lỗi nó như hình dưới đây:

# 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! 

Nguồn: Ruby Debugger


Hoặc sử dụng lldb/gdb. Xem bên dưới ví dụ đơn giản để in kịch bản backtrace vào foreground:

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

Thay lldb với gdb nếu làm việc tốt hơn. Tiền tố với sudo để gỡ lỗi quy trình không thuộc sở hữu.

+0

Ý tưởng là gì. Sử dụng trình gỡ rối tích hợp sẵn. Ai có thể nghĩ. Dù sao, nó làm việc cho tôi. Đã được ruby-gỡ lỗi cuộn vào lệnh ruby ​​như trình gỡ lỗi mặc định này, hoặc là điều này một cái gì đó khác biệt? – labyrinth

+0

Không có ý tưởng, tôi thậm chí không phải nhà phát triển Ruby, nhưng tôi đã phải gỡ lỗi một số mã tại một số điểm mà không được biết đến với tôi. – kenorb

0

Gỡ lỗi Ruby có một lịch sử khó khăn, được rải rác bằng các công cụ chỉ hỗ trợ một phiên bản MRI cụ thể. Rất may, từ 2.0 trở đi, bạn có thể sử dụng byebug.

Sử dụng dòng lệnh đơn giản: chạy byebug <your script>.Bạn cũng có thể chỉnh sửa tệp của mình và thả cuộc gọi hàm byebug ở bất cứ nơi nào bạn muốn khởi chạy gỡ lỗi.

Các vấn đề liên quan