Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách gỡ lỗi và sửa các chương trình Ruby của bạn

Tần suất chương trình của bạn thực hiện chính xác những gì bạn muốn trong lần đầu tiên?

Nhiều khi các chương trình của chúng tôi không hoạt động như chúng tôi mong đợi, vì vậy chúng tôi phải sử dụng nghệ thuật gỡ lỗi ruby ​​ để giúp chúng tôi tìm ra lý do.

Bạn có thể quen với thông báo lỗi sau:

undefined method 'some_method' for nil:NilClass

Điều này có nghĩa là một giá trị nil được quản lý để tìm thấy nó trong mã của chúng tôi.

Sử dụng các kỹ thuật được thảo luận trong bài viết này, bạn sẽ học cách đối phó với vấn đề này và các vấn đề tương tự!

Hiểu lỗi &dấu vết ngăn xếp

Khi bạn nhận được lỗi từ trình thông dịch Ruby hoặc chương trình của bạn không hoạt động như những gì nó nên làm thì đã đến lúc bạn phải đội mũ gỡ lỗi của mình.

Nếu vấn đề là chương trình của bạn bị lỗi, điều quan trọng là phải chú ý đến thông báo lỗi , thường sẽ chứa manh mối về những gì đang xảy ra.

Đây là một ví dụ :

def method1
  method2
end

def method2
  puts invalid_variable
end

method1

Chạy mã này sẽ cho bạn lỗi sau:

/tmp/stack.rb:6:in 'method2': undefined local variable or method 'invalid_variable' for main:Object (NameError)
    from /tmp/stack.rb:2:in 'method1'
    from /tmp/stack.rb:9:in '
'

Đây là những gì được gọi là dấu vết ngăn xếp.

Hãy cùng nhau phân tích!

Chúng tôi bắt đầu với dòng ở trên cùng.

Đây là nơi xảy ra lỗi thực sự, nhưng không có nghĩa là tình trạng lỗi bắt nguồn ở đây.

Tuy nhiên, đó là một điểm tốt để bắt đầu cuộc điều tra của chúng tôi.

Đây là thỏa thuận :

Văn bản Mô tả
/ tmp / stack.rb :6 Số tệp và dòng
trong ` method2 Tên phương pháp
biến cục bộ không xác định hoặc phương thức ‘ không hợp lệ_variable Thông báo lỗi
main: Đối tượng Tên lớp
(NameError) Tên ngoại lệ

Như bạn có thể thấy, lỗi không đáng sợ khi được chia nhỏ theo cách này.

Nhân tiện, bạn có thể tìm thấy danh sách các trường hợp ngoại lệ tại đây.

Bây giờ :

Mỗi dòng trong dấu vết ngăn xếp bên dưới dòng đầu tiên cho bạn biết mã đến đây như thế nào.

Về cơ bản, đó là một chuỗi phương pháp, nếu bạn tiếp tục đi xuống, cuối cùng bạn sẽ tìm thấy phương pháp chính cho ứng dụng của mình.

Đây là thuật toán chung để xử lý dấu vết ngăn xếp :

  1. Đọc dòng trên cùng của dấu vết ngăn xếp
  2. Nếu tệp là một phần của dự án của bạn:hãy mở tệp lỗi trên số dòng được chỉ định. Nếu không, hãy tiếp tục theo dõi ngăn xếp cho đến khi bạn tìm thấy tham chiếu đầu tiên đến tệp mà bạn nhận ra
  3. Xem liệu có điều gì hiển nhiên xảy ra với bạn và khắc phục nó hay không (tìm kiếm những điều được đề cập trong thông báo lỗi)
  4. Nếu điều đó không hiệu quả thì bạn sẽ cần tìm thêm thông tin, chẳng hạn như giá trị của các biến bị ảnh hưởng.

Gỡ lỗi Ruby

Kỹ thuật gỡ lỗi cơ bản nhất (không nhất thiết có nghĩa là xấu) mà bạn có thể quen thuộc chỉ là kết xuất các giá trị của các biến bị nghi ngờ.

Trong Ruby, bạn có thể làm điều đó bằng cách sử dụng put hoặc p .

Sử dụng p tương đương với việc nói đặt variable.inspect và rất hữu ích khi nhìn vào các đối tượng.

Ví dụ :

Book = Struct.new(:title)

def find_book(title)
  books = []
  books << Book.new('Eloquent Ruby')

  books.find { |b| b.title == title }
end

book = find_book('Eloquent Ruby')
p book # This will print our book object

book = find_book('POODR')
p book # This will print nil

book.name # Guess what happens next!

Đào sâu hơn với Pry

Khi bạn có nhiều biến cần kiểm tra, việc thêm puts mọi nơi có thể không thực tế lắm.

Trong trường hợp đó, bạn nên thử tìm hiểu kỹ.

Sử dụng pry bạn có thể làm cho mã của mình dừng lại ở một dòng mã cụ thể (còn được gọi là điểm ngắt) và nó sẽ đưa bạn vào một môi trường giống như irb, nơi bạn có thể đánh giá mã ruby ​​trong ngữ cảnh dự án của mình hoặc thực thi một trong nhiều hữu ích pry lệnh.

Sử dụng pry thực sự dễ dàng :

Tất cả những gì bạn phải làm là thả binding.pry nơi bạn muốn cài đặt một điểm ngắt pry.

Bạn cũng sẽ cần yêu cầu pry trong dự án của mình (yêu cầu 'pry').

Nếu bạn chỉ muốn làm điều đó tạm thời thì bạn có thể gọi tập lệnh ruby ​​của mình như sau:

ruby -rpry app.rb

Điều đó sẽ không hữu ích lắm đối với ứng dụng rails, vì vậy bạn có thể muốn thêm pry vào Gemfile của mình.

Điều tôi muốn làm là có một macro / đoạn mã trên trình chỉnh sửa của tôi đã bao gồm yêu cầu ở cùng một dòng với điểm ngắt, vì vậy khi tôi xóa nó, tôi sẽ xóa cả hai thứ.

Đây là những gì bạn sẽ thấy khi bạn bị bỏ qua trong một phiên sơ lược:

Cách gỡ lỗi và sửa các chương trình Ruby của bạn

Nếu bạn muốn thoát hoàn toàn phiên pry, bạn có thể nhập thoát! , nếu bạn thực hiện thoát thường xuyên nó chạy chương trình của bạn cho đến điểm ngắt tiếp theo.

Sức mạnh của sự tọc mạch không kết thúc ở đây. Ví dụ:bạn có thể sử dụng ls để xem các phương thức và biến cá thể mà một đối tượng có quyền truy cập.

Cách gỡ lỗi và sửa các chương trình Ruby của bạn

Đừng quên chạy trợ giúp lệnh để có được danh sách tất cả các tính năng!

Một trình gỡ lỗi Ruby khác:Byebug

Byebug có thể hoạt động như một sự thay thế pry hoặc như một trình gỡ lỗi giống gdb cho Ruby.

Nếu bạn muốn sử dụng nó cho cái trước thì bạn chỉ cần thả byebug thay vì binding.pry nơi bạn muốn mã của mình dừng lại. Một trong những nhược điểm của việc sử dụng Byebug over pry là nó không cung cấp tính năng đánh dấu cú pháp.

Hãy xem cách bạn có thể đặt các điểm ngắt và gỡ lỗi mã bên trong byebug!

Thông thường, bạn sẽ gọi lệnh trợ giúp, nhưng trong trường hợp này, nó thiếu một chút thông tin:

Cách gỡ lỗi và sửa các chương trình Ruby của bạn

Vì vậy, bạn sẽ phải tham khảo tài liệu.

Bạn có thể xem cách sử dụng lệnh break và một số dòng mà bạn có thể đặt các điểm ngắt của mình.

Để nhận danh sách các điểm ngắt, bạn có thể sử dụng điểm ngắt thông tin .

Khi các điểm ngắt của bạn được thiết lập, bạn có thể di chuyển qua quá trình thực thi chương trình bằng các lệnh sau:

  • bước (nâng cao một hướng dẫn, bước vào các cuộc gọi phương thức)
  • tiếp theo (trước một hướng dẫn, không nhận được các phương pháp bên trong)
  • tiếp tục (chạy cho đến khi kết thúc hoặc điểm ngắt tiếp theo)

Nếu bạn nhập enter mà không có bất kỳ lệnh nào, nó chỉ lặp lại lệnh cuối cùng, điều này rất hữu ích khi xem qua mã của bạn.

Khi tất cả những thứ khác không thành công

Hãy nhớ nghỉ ngơi khi bạn đã dành nhiều thời gian và không thể nhìn thấy giải pháp, khi bạn trở lại với đôi mắt tươi tắn, bạn sẽ nhận ra giải pháp đang ở phía trước của bạn. Bạn cũng có thể thử giải thích vấn đề với người khác.

Đôi khi bạn không chắc vấn đề nằm ở đâu, khi điều này xảy ra, bạn vẫn có nhiều lựa chọn.

Ví dụ:bạn có thể muốn nhận xét các khối mã để thử và cô lập vấn đề.

Nếu sự cố biến mất thì bạn có thể bỏ ghi chú một phần của mã mà bạn vừa nhận xét.

Đây là một giải pháp công nghệ rất thấp, nhưng nó có thể là chính xác những gì bạn cần.

Nếu bạn đã đến mức này và dường như không có gì có thể giúp ích được :

Đã đến lúc rút súng lớn.

Dưới đây là một số công cụ hệ thống mà bạn thường thấy hữu ích.

Một trong những công cụ này là Wireshark, cho phép bạn kiểm tra lưu lượng mạng.

Nếu bạn đang xử lý lưu lượng được mã hóa SSL, một proxy mitm (Người đàn ông ở giữa) như mitmproxy có thể giúp bạn.

Bạn cũng có thể thử uốn xoăn để bắt đầu các kết nối HTTP từ thiết bị đầu cuối của bạn, điều này có thể giúp bạn gỡ lỗi các phản hồi của máy chủ không hợp lệ.

Một công cụ hữu ích khác để làm quen là strace (chỉ dành cho linux).

Strace sẽ hiển thị cho bạn tất cả các lệnh gọi hệ thống mà ứng dụng của bạn đang thực hiện.

Bạn có thể lọc các cuộc gọi hệ thống cụ thể bằng cách sử dụng tùy chọn -e. Một giải pháp thay thế hiện đại hơn cho strace là sysdig.

Cảnh báo! Bạn có thể muốn tránh sử dụng lỗi trong sản xuất vì nó làm suy giảm nghiêm trọng hiệu suất của hệ thống đang thử nghiệm.

Cuối cùng, nếu bạn đang giải quyết một vấn đề có vẻ như nó đến từ một viên ngọc bên ngoài nào đó, một bước rõ ràng là kiểm tra mã nguồn của viên đá quý.

Bạn có thể sử dụng đá quý mở lệnh để mở mã nguồn trên trình chỉnh sửa đã định cấu hình của bạn.

Kết luận

Ngay cả khi gỡ lỗi không phải là hoạt động thú vị nhất từ ​​trước đến nay, vẫn có rất nhiều công cụ và kỹ thuật có thể giúp bạn dễ dàng hơn, hãy sử dụng chúng để giúp bạn.

Hãy chia sẻ bài đăng này nếu bạn thích nó để ppl có thể học hỏi thêm! 🙂

Xin cảm ơn.