Cách gỡ lỗi tập lệnh Ruby [đã đóng]


153

Tôi đã sao chép mã Ruby sau từ Internet và thực hiện một vài thay đổi nhưng nó không hoạt động.

Tôi có thể làm gì để tự gỡ lỗi chương trình?


1
Bỏ phiếu để mở lại. OP rõ ràng muốn gỡ lỗi bước giống như GDB.
Ciro Santilli 郝海东 冠状 病 事件

Câu trả lời:


145

Sử dụng Pry ( GitHub ).

Cài đặt qua:

$ gem install pry
$ pry

Sau đó thêm:

require 'pry'; binding.pry

vào chương trình của bạn.

Tính đến pry0.12.2 Tuy nhiên, có những lệnh không chuyển hướng như next, breakvv Một số đá quý khác bổ sung cung cấp này, xem ví dụ pry-byedebug.


10
Tôi cũng khuyên bạn nên sử dụng Pry (chắc chắn là một công cụ thay đổi cuộc sống!) .. Sau khi cài đặt và được yêu cầu trong chương trình của bạn, việc thiết lập một điểm dừng cũng dễ như viết binding.pry. Nó cũng đi kèm với hoàn thành màu sắc, tra cứu tài liệu và khả năng tự động chỉnh sửa và tải lại một phương thức ..
Andrea Fiore

5
Trang chủ của Pry có sẵn ở đây: pryrepl.org .
Shadowbq

4
Pry/ byebuglà tuyệt vời, nhưng không phải là bước đầu tiên của bạn khi gỡ lỗi. Trong hầu hết các trường hợp, đưa ra một ngoại lệ với raise object.inspectsẽ giải quyết vấn đề của bạn nhanh hơn là mở một phiên irb. Tôi khuyên bạn chỉ nên sử dụng trình gỡ lỗi giao diện điều khiển một khi các giải pháp đơn giản hơn như đưa ra một ngoại lệ không thể giải quyết vấn đề của bạn.
Kelsey Hannan

3
Có cách nào để mã một bước với pry? Tôi không thể tìm ra cách để làm điều đó; và đó là những gì tôi mong đợi của một trình sửa lỗi.
jpetazzo

2
@jpetazzo có, bằng cách gõ 'next'
marcbest

114
  1. Trong Ruby:

    ruby -rdebug myscript.rb 

    sau đó,

    • b <line>: đặt điểm dừng
    • n(ext)hoặc s(tep)c(ontinue)
    • p(uts) Để trưng bày

    (như gỡ lỗi perl)

  2. Trong Rails: Khởi chạy máy chủ với

    script/server --debugger

    và thêm debuggervào mã.


7
-rdebug là rác. Và không rõ ràng. Sử dụng Pry (xem câu trả lời khác).
Snowcrash

3
@SnowCrash - Tại sao bạn nói đó -r debuglà rác?
sid smith

8
với -rdebug: không cần thay đổi tệp nguồn để gỡ lỗi
Germanlinux

2
Đối với ứng dụng Ruby / Rails mới, Pry là câu trả lời đúng. Nhưng tôi đã dành hơn một giờ để cố gắng tìm một phiên bản Pry cổ để chạy trên ứng dụng Rails 2.2 với một phiên bản cụ thể facetstrong các yêu cầu đá quý, và đã không thành công. Đối với các ứng dụng Rails cổ ruby-debugthì hơi khó chịu nhưng hoàn thành công việc.
Abe Voelker

56

Như lan can khuyến cáo: sử dụng pry! Tôi chỉ có thể đồng ý về điều này.

pry là một thay thế tốt hơn nhiều so với irb.

Bạn cần phải thêm

require 'pry'

vào tệp nguồn của bạn và sau đó chèn một điểm dừng trong mã nguồn của bạn bằng cách thêm

binding.pry

tại nơi bạn muốn xem xét mọi thứ (điều này giống như kích hoạt một điểm dừng trong môi trường IDE cổ điển)

Khi chương trình của bạn đạt

binding.pry

, bạn sẽ được ném ngay vào trò chơi thay thế, với tất cả bối cảnh chương trình của bạn ngay để bạn có thể khám phá mọi thứ xung quanh, điều tra tất cả các đối tượng, thay đổi trạng thái và thậm chí thay đổi mã khi đang di chuyển.

Tôi tin rằng bạn không thể thay đổi mã của phương thức mà bạn hiện đang sử dụng, vì vậy bạn có thể buồn thay đổi dòng tiếp theo sẽ được thực thi. Nhưng mã ruby ​​tốt có xu hướng là một dòng duy nhất ;-)


30

Gỡ rối bằng cách tăng trường hợp ngoại lệ xa dễ dàng hơn so với nheo mắt quaprintbáo cáo nhật ký, và cho hầu hết các lỗi, nó thường nhanh hơn nhiều so với mở ra một debugger IRB nhưpryhaybyebug. Những công cụ đó không phải luôn luôn là bước đầu tiên của bạn.


Gỡ lỗi Ruby / Rails nhanh chóng:

1. Phương pháp nhanh: Tăng Exceptionsau đó và.inspect kết quả của nó

Cách nhanh nhất để gỡ lỗi mã Ruby (đặc biệt là Rails) là raisengoại lệ dọc theo đường dẫn thực thi mã của bạn trong khi gọi .inspectphương thức hoặc đối tượng (ví dụ foo):

raise foo.inspect

Trong đoạn mã trên, raisegây nên một Exceptiontạm dừng thực hiện mã của bạn , và trả về một thông báo lỗi thuận tiện chứa .inspectthông tin về các đối tượng / phương pháp (ví dụ:foo ) trên dòng mà bạn đang cố gắng để gỡ lỗi.

Kỹ thuật này rất hữu ích để kiểm tra nhanh một đối tượng hoặc phương thức ( ví dụ như vậy nil? ) Và để xác nhận ngay lập tức liệu một dòng mã thậm chí có được thực thi hay không trong một bối cảnh cụ thể.

2. Dự phòng: Sử dụng trình gỡ lỗi IRB nhưbyebug hoặcpry

Chỉ sau khi bạn có thông tin về trạng thái của luồng thực thi mã của mình, bạn mới nên xem xét chuyển sang trình gỡ lỗi ruby ​​gem irb pryhoặc byebugnơi bạn có thể tìm hiểu sâu hơn về trạng thái của các đối tượng trong đường dẫn thực thi của mình.


Tư vấn chung cho người mới bắt đầu

Khi bạn đang cố gắng gỡ lỗi một vấn đề, lời khuyên tốt là luôn luôn: Đọc Thông báo lỗi! @ # $ Ing (RTFM)

Điều đó có nghĩa là đọc các thông báo lỗi một cách cẩn thậnhoàn toàn trước khi hành động để bạn hiểu những gì nó đang cố nói với bạn. Khi bạn gỡ lỗi, hãy hỏi các câu hỏi tinh thần sau, theo thứ tự này , khi đọc thông báo lỗi:

  1. Có gì lớp làm tài liệu tham khảo lỗi? (tức là tôi có đúng lớp đối tượng hay là đối tượng của tôi nil? )
  2. Có gì phương pháp làm tài liệu tham khảo lỗi? (tức là một kiểu của chúng trong phương thức; tôi có thể gọi phương thức này trên loại / lớp đối tượng này không? )
  3. Cuối cùng, bằng cách sử dụng những gì tôi có thể suy ra từ hai câu hỏi cuối cùng của mình, tôi nên điều tra những dòng mã nào? (hãy nhớ: dòng mã cuối cùng trong theo dõi ngăn xếp không nhất thiết là vấn đề nằm ở đâu.)

Trong ngăn xếp theo dõi, đặc biệt chú ý đến các dòng mã xuất phát từ dự án của bạn (ví dụ: các dòng bắt đầu bằng app/...nếu bạn đang sử dụng Rails). 99% thời gian xảy ra sự cố với mã của riêng bạn.


Để minh họa tại sao việc diễn giải theo thứ tự này lại quan trọng ...

Ví dụ: thông báo lỗi Ruby gây nhầm lẫn cho nhiều người mới bắt đầu:

Bạn thực thi mã mà tại một số điểm thực thi như vậy:

@foo = Foo.new

...

@foo.bar

và bạn nhận được một lỗi thông báo:

undefined method "bar" for Nil:nilClass

Người mới bắt đầu thấy lỗi này và nghĩ rằng vấn đề là phương pháp barnày không được xác định . Nó không thể. Trong lỗi này, phần thực sự quan trọng là:

for Nil:nilClass

for Nil:nilClasscó nghĩa @foolà Nil! @fookhông phải là một Foobiến thể! Bạn có một đối tượng đó là Nil. Khi bạn thấy lỗi này, nó chỉ đơn giản là ruby ​​cố gắng nói với bạn rằng phương thức barnày không tồn tại cho các đối tượng của lớp Nil. (duh! vì chúng tôi đang cố gắng sử dụng một phương thức cho một đối tượng của lớp Fookhông Nil).

Thật không may, do cách lỗi này được viết ( undefined method "bar" for Nil:nilClass) nó dễ dàng bị lừa vào suy nghĩ lỗi này đã làm với barđược undefined. Khi không đọc kỹ, lỗi này khiến người mới bắt đầu nhầm lẫn đi sâu vào chi tiết của barphương pháp trênFoo , hoàn toàn thiếu một phần lỗi cho thấy đối tượng thuộc lớp sai (trong trường hợp này là: không). Đó là một lỗi dễ dàng tránh được bằng cách đọc toàn bộ thông báo lỗi.

Tóm lược:

Luôn đọc kỹ toàn bộ thông báo lỗi trước khi bắt đầu gỡ lỗi. Điều đó có nghĩa là: Luôn kiểm tra loại lớp của một đối tượng trong thông báo lỗi trước , sau đó là các phương thức của nó , trước khi bạn bắt đầu điều tra vào bất kỳ stacktrace hoặc dòng mã nào mà bạn nghĩ rằng lỗi có thể xảy ra. 5 giây đó có thể giúp bạn tiết kiệm 5 giờ thất vọng.

tl; dr: Đừng nheo mắt khi in nhật ký: thay thế ngoại lệ hoặc sử dụng trình gỡ lỗi irb. Tránh lỗ thỏ bằng cách đọc lỗi cẩn thận trước khi gỡ lỗi.


3
Mặc dù tôi đồng ý với bạn rằng đọc nhật ký in là tẻ nhạt, tôi nghĩ rằng không nên sử dụng trình gỡ lỗi ở nơi đầu tiên là lời khuyên rất tồi. Thêm một điểm dừng và kích hoạt nó chính xác là cùng một nỗ lực như đưa ra một ngoại lệ nhưng nó cung cấp cho bạn cái nhìn đầy đủ về trạng thái hiện tại của ứng dụng. Nếu có thêm câu hỏi nào là kết quả của việc kiểm tra trạng thái không rõ ràng, bạn có thể tương tác đi sâu vào thay vì thêm một ngoại lệ khác và khởi động lại ứng dụng.
Patrick R.

2
@PatrickR. Theo kinh nghiệm của tôi, trình gỡ lỗi IRB không phải là bước đầu tiên tốt khi bạn vẫn đang cố gắng đi sâu vào chính xác nơi xảy ra sự cố trong mã của bạn. Việc thêm và xóa nhiều điểm dừng IRB mất nhiều thời gian hơn so với việc thêm ngoại lệ và không đưa ra câu trả lời chắc chắn về luồng kiểm soát mã của bạn theo cách mà người mới bắt đầu có thể loại trừ các giả định xấu. Điểm dừng IRB cũng dễ quên, gây nhầm lẫn khi yêu cầu treo. Nếu bạn biết chính xác vấn đề đang ở đâu và cần gỡ lỗi trạng thái của nó, thì chắc chắn, hãy bắt đầu với trình gỡ lỗi IRB. Nhưng thường thì điều đó không đúng.
Kelsey Hannan

1
Hừ! Đọc các thông báo lỗi có hữu ích cho Ruby, nhưng các ngôn ngữ kịch bản khác? Tôi không thể đổ lỗi cho OP thậm chí không làm phiền.
kayleeFrye_onDeck

1
Phản ứng ban đầu của tôi tương tự như @PatrickR., Nhưng dù sao tôi cũng đã thử điều này. Cuối cùng, tôi thấy đây là một lời khuyên tồi, hoặc có thể trong ánh sáng tốt nhất, lời khuyên phù hợp với trường hợp sử dụng khác với tôi. Cụ thể, trong trường hợp (a) không sử dụng Rails và (b) có kết quả sai nhưng không có lỗi hoặc ngoại lệ nào được nêu ra, tức là mã tính một số, đó chỉ là số sai. Cố gắng lặp đi lặp lại đoán nơi tạo ra một chương trình có thể thực hiện sự cố là một chiến lược, nhưng sẽ hiệu quả hơn vì tôi phải tiếp tục khởi động lại và chạy lại. Mỗi chu kỳ có thời gian khởi động riêng bị lãng phí.
Gạch

20
  1. In ra các biến bất cứ khi nào có thể. (Điều này được gọi là gỡ lỗi printf) Bạn có thể làm điều này bằng cách chạy

    STDERR.puts x.inspect

    hoặc là

    STDERR.puts "Variable x is #{x.inspect}"

    Nếu bạn muốn làm điều này dễ dàng hơn để gõ, thì bạn có thể muốn sử dụng đá quý mẫu mực .

  2. Bật cảnh báo. Nếu bạn đang chạy rubythì hãy chạy nó bằng công -wtắc (ví dụ ruby -w script.rb). Nếu bạn đang chạy nó từ irb và bạn đang sử dụng phiên bản ruby ​​trước 1.9.2, hãy nhập $VERBOSE = truevào đầu phiên của bạn. Nếu bạn viết sai một biến đối tượng, một khi cảnh báo được bật, bạn sẽ nhận được

    cảnh báo: biến @valeusthể hiện không được khởi tạo

  3. Hiểu khái niệm về một nhị phân (trích dẫn sau đây là từ Thực tiễn của Nhà phát triển Agile )

    Chia không gian vấn đề thành một nửa và xem một nửa có chứa vấn đề. Sau đó chia nửa đó một lần nữa và lặp lại.

  4. Nếu bạn thành công với một nhị phân, bạn có thể thấy rằng có một dòng duy nhất không làm những gì bạn mong đợi. Ví dụ

    [1, 2, 3].include?([1,2])

    đưa ra một giá trị false, mặc dù bạn nghĩ rằng nó sẽ trở lại true. Trong trường hợp đó, bạn có thể muốn xem tài liệu. Các trang web cho tài liệu bao gồm ruby-doc.org hoặc APIdock . Trong trường hợp sau, bạn sẽ gõ include?bên cạnh kính lúp gần góc trên cùng bên phải, chọn include?cái có Arraybên dưới nó (nếu bạn không biết lớp nào [1, 2, 3], hãy nhập [1, 2, 3].classirb) và bạn có bao gồm không? (Mảng) , mô tả những gì nó làm.

    Tuy nhiên, nếu tài liệu không có ích, bạn có nhiều khả năng nhận được câu trả lời tốt nếu bạn có thể đặt câu hỏi về cách một dòng cụ thể không làm những gì cần làm, thay vì tại sao toàn bộ tập lệnh không làm gì nó nên


7

xóa tất cả mọi thứ

Chào mừng đến năm 2017 ^ _ ^

Được rồi, vì vậy nếu bạn không phản đối việc dùng thử IDE mới, bạn có thể làm miễn phí những điều sau đây .

Hướng dẫn nhanh

  1. Cài đặt vscode
  2. Cài đặt Ruby Dev Kit nếu bạn chưa có
  3. Cài đặt các phần mở rộng Ruby, ruby-linter và ruby-rubocop cho vscode
  4. Cài đặt thủ công bất cứ thứ gì đá quý rubyide / vscode-ruby chỉ định , nếu cần
  5. Cấu hình của bạn launch.jsonđể sử dụng "cwd" "program" các lĩnh vực sử dụng{workspaceRoot} vĩ mô
  6. Thêm một trường được gọi "showDebuggerOutput"và đặt nó thànhtrue
  7. Kích hoạt điểm dừng ở mọi nơi trong tùy chọn Gỡ lỗi của bạn như "debug.allowBreakpointsEverywhere": true

Hướng dẫn chi tiết

  1. Tải xuống Visual Studio Code aka vscode; Điều này không giống với Visual Studio . Đó là miễn phí, trọng lượng nhẹ, và thường được xem xét tích cực.
  2. Cài đặt Bộ công cụ Ruby Dev; bạn nên làm theo hướng dẫn tại repo của họ tại đây: https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
  3. Tiếp theo, bạn có thể cài đặt các tiện ích mở rộng thông qua trình duyệt web hoặc bên trong IDE; cái này ở bên trong IDE. Nếu bạn chọn cái khác, bạn có thể vào đây . Điều hướng đến phần mở rộng của vscode; bạn có thể làm điều này theo một số cách, nhưng phương pháp chứng minh trong tương lai nhất có thể sẽ được nhấn F1và gõ ra extcho đến khi một tùy chọn có tên là Tiện ích mở rộng: Cài đặt tiện ích mở rộng có sẵn. Các lựa chọn thay thế là CtrlShiftxvà từ thanh menu trên cùng,View->Extensions
  4. Tiếp theo bạn sẽ muốn các tiện ích mở rộng sau; những thứ này không cần thiết 100%, nhưng tôi sẽ cho phép bạn quyết định nên giữ gì sau khi bạn đã sửa một số:
    • Hồng ngọc; tác giả mở rộng Bành Lv
    • ruby-rubocop; tác giả mở rộng misogi
    • ruby-linter; tác giả mở rộng Cody Hoover
  5. Trong thư mục ruby ​​script của bạn, chúng tôi sẽ tạo một thư mục thông qua dòng lệnh được gọi .vscodevà trong đó chúng tôi sẽ có một tệp được gọi làlaunch.json nơi chúng tôi sẽ lưu trữ một số tùy chọn cấu hình.
    • launch.json nội dung

{ "version": "0.2.0", "configurations": [ { "name": "Debug Local File", "type":"Ruby", "request": "launch", "cwd": "${workspaceRoot}", "program": "{workspaceRoot}/../script_name.rb", "args": [], "showDebuggerOutput": true } ] }

  1. Thực hiện theo các hướng dẫn từ các tác giả mở rộng để cài đặt đá quý thủ công. Nó nằm ở đây bây giờ: https://github.com/rubyide/vscode-ruby#install-ruby-dependencies
  2. Bạn có thể muốn có khả năng đặt các điểm dừng bất cứ nơi nào bạn muốn; không bật tùy chọn này có thể gây nhầm lẫn. Để làm điều này, chúng tôi sẽ đi đến thanh menu trên cùng và chọn File->Preferences->Settings(hoặc Ctrl,) và cuộn cho đến khi bạn đạt đến Debugphần. Mở rộng nó và tìm một trường có tên "debug.allowBreakpointsEverywhere"- chọn trường đó và nhấp vào biểu tượng trông giống bút chì và đặt nó vào true.

Sau khi thực hiện tất cả những thứ thú vị đó, bạn sẽ có thể đặt các điểm dừng và gỡ lỗi trong một menu tương tự như vào giữa năm 2017 và một chủ đề tối hơn: nhập mô tả hình ảnh ở đâyvới tất cả các nội dung thú vị như ngăn xếp cuộc gọi, trình xem biến, v.v.

PITA lớn nhất là 1) cài đặt các yêu cầu trước và 2) Ghi nhớ để định cấu hình .vscode\launch.jsontệp. Chỉ số 2 mới nên thêm bất kỳ hành lý nào vào các dự án trong tương lai và bạn chỉ có thể sao chép một cấu hình đủ chung chung như cấu hình được liệt kê ở trên. Có lẽ có một vị trí cấu hình chung hơn, nhưng tôi không biết trên đỉnh đầu của mình.


Bây giờ là năm 2018, nhưng thật không may, bạn vẫn không thể gỡ lỗi một bài kiểm tra đơn vị bằng cách sử dụng các plugin bạn đã liệt kê ở đây, Khá buồn.
MonsieurDart

1
@MonsieurDart Khi tôi viết bài này, nó có nghĩa là để gỡ lỗi cơ bản cho các tập lệnh ruby. Tôi không quen thuộc với bất cứ điều gì cụ thể về các bài kiểm tra đơn vị. Nếu câu trả lời này không chính xác hoặc lỗi thời, vui lòng cho tôi biết những gì cần chú ý và bất kỳ thông tin nào có thể giúp tăng tốc quá trình đó.
kayleeFrye_onDeck

Xin chào @kayleeFrye_onDeck! Phản hồi của bạn rất tuyệt, tôi hoàn toàn dành cho bạn điều đó. Nhưng, lần trước tôi đã kiểm tra plugin Ruby của Lv Lv cho VSC, nó không thể đặt các điểm dừng trong một bài kiểm tra đơn vị (hoặc bất kỳ bài kiểm tra nào khác). Đó là một trong những hạn chế được biết đến của plugin. Tôi nghĩ mọi người cần biết điều này trước khi thử cấu hình VSC của họ: cần nhiều thời gian và, đối với nhiều người, chạy thử nghiệm là cách số một để viết và gỡ lỗi mã. 😊
MonsieurDart

6

Tôi thực sự khuyên bạn nên video này, để chọn công cụ thích hợp tại thời điểm này để gỡ lỗi mã của chúng tôi.

https://www.youtube.com/watch?v=GwgF8GcynV0

Cá nhân, tôi nhấn mạnh hai chủ đề lớn trong video này.

  • Pry là tuyệt vời cho dữ liệu gỡ lỗi, "pry là một nhà thám hiểm dữ liệu" (sic)
  • Trình gỡ lỗi dường như tốt hơn để gỡ lỗi từng bước.

Đó là hai xu của tôi!


6

Tất cả các câu trả lời khác đã đưa ra hầu hết mọi thứ ... Chỉ cần thêm một chút.

Nếu bạn muốn một số trình gỡ lỗi giống IDE hơn (không phải CLI) và không sợ sử dụng Vim làm trình chỉnh sửa, tôi khuyên bạn nên sử dụng plugin Vim Ruby Debugger cho nó.

Tài liệu của nó khá đơn giản, vì vậy hãy theo liên kết và xem. Nói tóm lại, nó cho phép bạn đặt điểm dừng ở dòng hiện tại trong trình chỉnh sửa, xem các biến cục bộ trong cửa sổ tiện lợi khi tạm dừng, chuyển qua / vào - gần như tất cả các tính năng gỡ lỗi thông thường.

Đối với tôi, thật thú vị khi sử dụng trình gỡ lỗi vim này để gỡ lỗi một ứng dụng Rails, mặc dù khả năng logger phong phú của Rails gần như loại bỏ sự cần thiết của nó.


6

Tôi mới phát hiện ra viên ngọc này (biến Pry thành trình gỡ lỗi cho MRI Ruby 2.0+)

https://github.com/deivid-rodriguez/pry-byebug

Cài đặt với:

gem install pry-byebug

sau đó sử dụng chính xác like pry, đánh dấu dòng bạn muốn ngắt tại:

require 'pry'; binding.pry

Không giống như vani nâng lên tuy nhiên, đá quý này có một số GDB như chuyển hướng các lệnh quan trọng như next, stepbreak:

break SomeClass#run            # Break at the start of `SomeClass#run`.
break Foo#bar if baz?          # Break at `Foo#bar` only if `baz?`.
break app/models/user.rb:15    # Break at line 15 in user.rb.
break 14                       # Break at line 14 in the current file.

5
  1. Bạn có thể in các biến của mình trên đường đi
  2. Bật -wcờ (cảnh báo)
  3. Sử dụng một công cụ như ruby-debug

2
Tôi sẽ thêm đó irblà một nơi khởi đầu tuyệt vời. Hãy thử sử dụng irb với khối nhỏ nghi vấn. Tôi yêu ruby-debug (ruby-debug19 cho Ruby 1.9+) vì nó giúp dễ dàng dừng chương trình đang chạy, kiểm tra các biến, thả vào irb, sau đó tiếp tục chạy.
Tin Man

5

Để dễ dàng gỡ lỗi tập lệnh shell Ruby, chỉ cần thay đổi dòng đầu tiên từ:

#!/usr/bin/env ruby

đến:

#!/usr/bin/env ruby -rdebug

Sau đó, mỗi khi bảng điều khiển trình gỡ lỗi được hiển thị, bạn có thể chọn:

  • ccho Tiếp tục (đến Ngoại lệ tiếp theo, điểm dừng hoặc dòng với debugger:),
  • n cho dòng tiếp theo,
  • w/ wheređể hiển thị khung / ngăn xếp cuộc gọi,
  • l để hiển thị mã hiện tại,
  • cat để hiển thị các điểm bắt.
  • h để được trợ giúp thêm.

Xem thêm: Gỡ lỗi với ruby-debug , Phím tắt cho đá quý ruby-debug .


Trong trường hợp tập lệnh chỉ bị treo và bạn cần quay lại, hãy thử sử dụng lldb/ gdblike:

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

và sau đó kiểm tra quá trình của bạn.

Thay thế lldbbằng gdbnếu hoạt động tốt hơn. Tiền tố sudođể gỡ lỗi quá trình không sở hữu.


1
ruby-debug trông khá hẹn hò. Repo git cho ruby-debug chỉ có một cam kết trong năm nay - nó có còn được duy trì tích cực không?
Andrew Grimm

Nó dường như cũng được đóng gói với ruby, thật tuyệt khi bạn đang ở trong tình trạng khó khăn. Câu trả lời chính xác!
Nhân giống

5

Kể từ Ruby 2.4.0, việc bắt đầu phiên IRB REPL ở giữa bất kỳ chương trình Ruby nào cũng dễ dàng hơn. Đặt các dòng này tại điểm trong chương trình mà bạn muốn gỡ lỗi:

require 'irb'
binding.irb

Bạn có thể chạy mã Ruby và in ra các biến cục bộ. Nhập Ctrl + D hoặc quitđể kết thúc REPL và để chương trình Ruby tiếp tục chạy.

Bạn cũng có thể sử dụng putspin ra các giá trị từ chương trình của mình khi chương trình đang chạy.


4

Nếu bạn đang sử dụng RubyMine , việc gỡ lỗi các tập lệnh ruby ​​rất đơn giản và dễ hiểu.

Giả sử bạn có tập lệnh Ruby hello_world.rb

1. Đặt điểm dừng

Đặt điểm dừng ở dòng 6 như bên dưới.

nhập mô tả hình ảnh ở đây

2. Bắt đầu gỡ lỗi

Bây giờ bạn có thể bắt đầu trình gỡ lỗi để chạy tập lệnh:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

3. Kiểm tra các biến, v.v.

Sau đó, khi thực thi đạt đến điểm dừng, bạn sẽ có thể kiểm tra các biến, v.v.

nhập mô tả hình ảnh ở đây

Thông tin thêm để bạn tham khảo

  1. Nếu bạn muốn sử dụng RubyMine để gỡ lỗi từ xa , bạn có thể làm như vậy.
  2. Nếu bạn muốn sử dụng RubyMine để gỡ lỗi đường ray từ xa chạy bên trong docker , thì điều này cũng đơn giản.

Chúng ta có cách nào để gỡ lỗi các thư viện bên ngoài trong RubyMine không?
Am33d

2

gỡ lỗi printf

Luôn luôn có một cuộc tranh cãi xung quanh các kỹ thuật sửa lỗi, một số người thích gỡ lỗi bằng các câu lệnh in, một số khác thích đào sâu với trình gỡ lỗi.

Tôi khuyên bạn nên thử cả hai cách tiếp cận.

Trên thực tế, một trong những người đàn ông Unix cũ gần đây đã nói rằng, gỡ lỗi printf là một cách nhanh hơn để đi với anh ta ở một số điểm.

Nhưng nếu bạn là người mới trong một số công việc và cần phải hiểu một loạt mã lớn, thì thực sự rất hữu ích khi bước qua đó, đặt một số điểm dừng ở đây và ở đó, cùng với cách nó hoạt động.

Nó sẽ cung cấp cho bạn một số hiểu biết làm thế nào mã được dệt.

Nếu bạn chưa quen với một số phần mềm người khác, nó có thể giúp bạn bước qua đó.

Bạn sẽ nhanh chóng tìm ra nếu họ sắp xếp nó một cách thông minh, hoặc nếu đó chỉ là một đống cứt.


đây chắc chắn là câu trả lời hay nhất ,,, nó phụ thuộc
menriquez


1

Mẹ của tất cả các trình sửa lỗi là màn hình in cũ đơn giản. Hầu hết thời gian, có lẽ bạn chỉ muốn kiểm tra một số đối tượng đơn giản, một cách nhanh chóng và dễ dàng là như thế này:

@result = fetch_result

p "--------------------------"
p @result

Điều này sẽ in ra nội dung của @result thành STDOUT với một dòng ở phía trước để dễ nhận biết.

Phần thưởng nếu bạn sử dụng khung có khả năng tự động tải / tải lại như Rails, bạn thậm chí sẽ không cần phải khởi động lại ứng dụng của mình. (Trừ khi mã bạn đang gỡ lỗi không được tải lại do cài đặt cụ thể của khung)

Tôi thấy điều này hoạt động cho 90% trường hợp sử dụng cho tôi. Bạn cũng có thể sử dụng ruby-debug, nhưng tôi thấy nó quá mức cần thiết.


1

Có nhiều trình gỡ lỗi với các tính năng khác nhau, dựa trên đó bạn đưa ra lựa chọn. Ưu tiên của tôi đã được thỏa mãn với động tác pry đó là:

  • thông tin nhanh chóng dễ hiểu về cách sử dụng
  • các bước trực quan (như dễ dàng bước vào các khối)
  • "lùi lại" (pry-di chuyển một phần thỏa mãn nhu cầu)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.