Dấu vết ngăn xếp C++
Một số lệnh là đủ để bắt đầu sử dụng (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7. Phiên sau đây minh họa các lệnh này. Lấy tệp mẫu sau Show
# # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t Hãy gỡ lỗi nó $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug) Chúng tôi hiện đang dừng trước dòng thực thi đầu tiên của chương trình. dòng 4 của (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y8. Nếu bạn đã quen với các ngôn ngữ ít động hơn và đã sử dụng trình gỡ lỗi cho các ngôn ngữ được biên dịch tĩnh hơn như C, C++ hoặc Java, thì có vẻ lạ khi bị dừng trước khi định nghĩa hàm nhưng trong Ruby dòng 4 được thực thi Lời nhắc của Byebug là (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y9. Nếu chương trình đã chết và bạn đang gỡ lỗi sau khi chết, thay vào đó, # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)0 được sử dụng. Nếu chương trình đã kết thúc bình thường và tùy chọn # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)1 đã được chỉ định trong dòng lệnh, thay vào đó, dấu nhắc sẽ là # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)2. Các lệnh có sẵn thay đổi tùy thuộc vào trạng thái của chương trình Byebug tự động liệt kê 10 dòng mã xoay quanh dòng hiện tại mỗi khi nó bị dừng. Dòng hiện tại được đánh dấu bằng # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)3. Nếu phạm vi sẽ tràn vào phần đầu hoặc phần cuối của tệp, byebug sẽ di chuyển nó tương ứng để chỉ các dòng mã thực tế được hiển thị Bây giờ chúng ta hãy bước qua chương trình (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug) Lệnh # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)4 đầu tiên chạy tập lệnh một đơn vị thực thi. Lệnh thứ hai chúng tôi đã nhập chỉ là nhấn phím quay lại. (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 nhớ lệnh cuối cùng bạn đã nhập là # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)4 và chạy lại lệnh đó Một cách để in các giá trị của biến là # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)7 (có nhiều cách khác). Khi chúng tôi nhìn vào giá trị của # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)8 lần đầu tiên, chúng tôi thấy nó là # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)9. Một lần nữa, chúng tôi bị dừng trước khi gán trên dòng 5 và biến này chưa được đặt trước đó. Tuy nhiên, sau khi ban hành một lệnh # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)4 khác, chúng tôi thấy rằng giá trị là 0 như mong đợi. Nếu mỗi lần dừng lại, chúng ta muốn xem giá trị của # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)8 để xem mọi thứ đang diễn ra như thế nào, thì có một cách tốt hơn bằng cách đặt biểu thức hiển thị # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t8 Bây giờ chúng ta hãy chạy chương trình cho đến ngay trước khi chúng ta quay lại từ chức năng. Chúng tôi sẽ muốn xem những dòng nào được chạy, vì vậy chúng tôi bật theo dõi dòng. Nếu chúng tôi không muốn toàn bộ đường dẫn được hiển thị khi theo dõi, chúng tôi có thể bật tên cơ sở (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y Càng xa càng tốt. Như bạn có thể thấy ở trên, để thoát khỏi (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7, người ta có thể ra lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)13 (hoặc viết tắt là $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)14). Nếu bạn muốn thoát mà không được nhắc, hãy thêm lệnh bằng dấu chấm than, e. g. , $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)15 Phiên mẫu thứ hai. Đào sâu hơnTrong phần này, chúng tôi sẽ giới thiệu các điểm dừng, ngăn xếp cuộc gọi và khởi động lại. Dưới đây chúng tôi sẽ gỡ lỗi một chương trình Ruby đơn giản để giải câu đố Towers of Hanoi cổ điển. Nó được tăng cường bởi nguyên nhân lập trình. một số xử lý tham số lệnh với kiểm tra lỗi # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c) Nhớ lại trong phần đầu tiên, người ta đã nói rằng trước khi $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)16 được chạy, phương thức mà nó đặt tên là không xác định. Hãy kiểm tra xem. Trước tiên, hãy xem chúng ta có thể gọi những phương thức riêng tư nào trước khi chạy $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)17 $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)1 $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)18 không phải là lệnh byebug mà là một tính năng của Ruby. Theo mặc định, khi (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 không hiểu một lệnh, nó sẽ đánh giá nó như thể đó là một lệnh Ruby. Bạn có thể sử dụng bất kỳ viên Ruby nào để kiểm tra trạng thái chương trình của mình tại nơi chương trình bị dừng Bây giờ hãy xem điều gì xảy ra sau khi bước (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y0 Được rồi, hãy tiếp tục và nói về các lập luận của chương trình (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y1 Ối. Chúng tôi quên chỉ định bất kỳ tham số nào cho chương trình này. Hãy thử lại lần nữa. Chúng ta có thể sử dụng lệnh (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y00 tại đây (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y3 Ở trên, chúng tôi đã thêm các lệnh mới. (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y01 (xem điểm dừng), cho biết dừng ngay trước khi dòng mã đó được chạy và (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y02, tiếp tục thực thi. Để loại bỏ một biểu thức hiển thị (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y03 được sử dụng. Nếu chúng tôi đưa ra một số hiển thị, thì biểu thức hiển thị đó sẽ bị xóa Chúng tôi cũng đã sử dụng một lệnh mới (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y04(xem backtrace) để hiển thị ngăn xếp cuộc gọi. Trong tình huống trên, bắt đầu từ dòng dưới cùng, chúng ta thấy chúng ta đã gọi phương thức ________ 305 từ dòng 28 của tệp ________ 306 và phương thức (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y05 tự gọi hai lần nữa ở dòng 5 Trong ngăn xếp cuộc gọi, chúng tôi hiển thị dấu khung hiện tại, số khung, phương thức được gọi, tên của các tham số, loại các tham số hiện có và vị trí dòng tệp. Hãy nhớ rằng có thể khi chương trình được gọi, các tham số có các loại khác nhau, vì các loại biến có thể thay đổi linh hoạt. Bạn có thể thay đổi kiểu hiển thị trong dấu vết (xem kiểu gọi) Bây giờ hãy di chuyển xung quanh ngăn xếp cuộc gọi $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)0 Lưu ý ở trên để lấy giá trị của biến (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y08 chúng ta phải sử dụng lệnh in như (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y09. Nếu chúng tôi chỉ nhập vào (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y08, điều đó sẽ được hiểu là lệnh byebug (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y11. Trong phạm vi hiện tại, biến (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y12 không được xác định. Tuy nhiên, tôi có thể thay đổi khung trên cùng bằng cách sử dụng lệnh (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y13. Lưu ý rằng bên trong khung #2, giá trị của (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y12 có thể được hiển thị. Cũng lưu ý rằng giá trị của biến (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y08 là khác nhau Gắn vào một chương trình đang chạy với (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7Trong các phiên trước, chúng tôi đã gọi byebug ngay từ đầu, nhưng có một phương thức hoạt động khác mà bạn có thể sử dụng. Nếu có nhiều mã cần được chạy trước phần bạn muốn kiểm tra, thì việc chạy byebug ngay từ đầu có thể không hiệu quả hoặc không thuận tiện. Trong phần này, chúng tôi sẽ trình bày cách nhập mã ở giữa chương trình của bạn, đồng thời tìm hiểu kỹ hơn về hoạt động của byebug. Chúng tôi cũng sẽ sử dụng thử nghiệm đơn vị. Sử dụng các bài kiểm tra đơn vị sẽ giảm đáng kể số lượng gỡ lỗi cần thiết, đồng thời, sẽ tăng chất lượng chương trình của bạn Những gì chúng tôi sẽ làm là lấy mã (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y17 từ phiên đầu tiên và viết bài kiểm tra đơn vị cho mã đó. Theo một nghĩa nào đó, chúng tôi đã viết một bài kiểm tra nhỏ cho chương trình, về cơ bản là dòng cuối cùng mà chúng tôi đã in giá trị của (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y18. Tuy nhiên, bài kiểm tra này không được tự động hóa. kỳ vọng là ai đó sẽ xem kết quả đầu ra và xác minh rằng những gì được in ra là những gì được mong đợi Trước khi chúng tôi có thể biến nó thành một thứ có thể là (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y19, chúng tôi có thể muốn xóa đầu ra đó. Tuy nhiên mình thích giữ nguyên dòng đó để khi xem file mình có ví dụ chạy nó. Do đó, chúng tôi sẽ chạy dòng này một cách có điều kiện nếu tệp đó được gọi trực tiếp, nhưng bỏ qua nó nếu không. GHI CHÚ. (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 đặt lại (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y31 để cố gắng làm cho những thứ như thế này hoạt động $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)1 Được rồi, giờ chúng ta đã sẵn sàng để viết bài kiểm tra đơn vị của mình và chúng ta sẽ sử dụng khung công tác (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y32 cho điều đó. Đây là mã kiểm tra, nó phải được đặt trong cùng thư mục với (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y8 $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)2 Giả sử chúng ta muốn dừng trước câu lệnh đầu tiên trong phương thức thử nghiệm của mình, chúng ta sẽ thêm vào như sau $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)3 Bây giờ chúng tôi chạy chương trình, yêu cầu (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)4 và chúng tôi thấy rằng chúng tôi bị dừng ở dòng 7 ngay trước khi khởi tạo danh sách (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y35 Bây giờ hãy xem chúng ta đang ở đâu $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)5 Chúng tôi nhận được kết quả tương tự như thể chúng tôi đã chạy byebug ngay từ đầu Gỡ lỗi kỳ lạ. Cách gỡ lỗi của Ruby có thể khác với các ngôn ngữ khácNếu bạn đã quen gỡ lỗi bằng các ngôn ngữ khác như C, C++, Perl, Java hoặc thậm chí Bash (xem bashdb), có thể có một số điều có vẻ hoặc cảm thấy hơi khác một chút và có thể khiến bạn bối rối. Một số trong những điều này không phải là sự kỳ lạ của trình gỡ lỗi mà là sự khác biệt trong cách Ruby hoạt động so với các ngôn ngữ khác. Bởi vì Ruby hoạt động hơi khác so với các ngôn ngữ khác, nên việc viết trình gỡ lỗi cũng phải khác một chút nếu nó hữu ích. Về mặt này, sử dụng Byebug có thể giúp bạn hiểu rõ hơn về Ruby Chúng tôi đã thấy một sự khác biệt như vậy. thực tế là chúng ta dừng lại ở các định nghĩa phương thức hoặc của $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)16 và đó là bởi vì đây thực tế là các câu lệnh có thể thực thi được. Trong các ngôn ngữ được biên dịch khác, điều này sẽ không xảy ra vì điều đó đã được thực hiện khi bạn biên dịch chương trình (hoặc trong Perl khi nó quét trong chương trình). Trong phần này, chúng ta sẽ xem xét một số thứ khác có thể khiến người dùng mới chuyển sang dùng Ruby, những người đã quen thuộc với các ngôn ngữ khác và gỡ lỗi trong đó Nhảy xung quanh trong các khối (bộ lặp)Khi gỡ lỗi các ngôn ngữ có coroutine như Python và Ruby, lệnh gọi phương thức có thể không nhất thiết phải chuyển đến câu lệnh đầu tiên sau tiêu đề phương thức. Có thể cuộc gọi sẽ tiếp tục sau một tuyên bố (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y37 từ cuộc gọi trước đó $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)6 $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)7 Vòng lặp giữa các dòng 31-34 được xen kẽ giữa các dòng của (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y38, dòng 9-28 ở trên Không có giá trị tham số trong ngăn xếp cuộc gọiTrong trình gỡ lỗi truyền thống, trong ngăn xếp cuộc gọi, bạn thường có thể thấy tên của các tham số và giá trị được truyền vào Ruby là một ngôn ngữ rất năng động và nó cố gắng hoạt động hiệu quả trong giới hạn của định nghĩa ngôn ngữ. Các giá trị thường không được lấy ra khỏi biến hoặc biểu thức và được đẩy vào ngăn xếp. Thay vào đó, một phạm vi mới được tạo và các tham số được cung cấp các giá trị ban đầu. Việc truyền tham số là theo tham chiếu chứ không phải theo giá trị như người ta nói Algol, C hoặc Perl. Trong quá trình thực hiện một phương thức, các giá trị tham số có thể thay đổi (và thường là như vậy). Trong thực tế, ngay cả lớp của đối tượng cũng có thể thay đổi Vì vậy, hiện tại, tên của tham số được hiển thị. Cài đặt kiểu cuộc gọi (callstyle) có thể được sử dụng để đặt xem tên được hiển thị hay tên và lớp hiện tại của đối tượng Các dòng bạn có thể dừng lạiHãy xem xét chương trình Ruby nhỏ sau đây $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)8 Điểm dừng mà Ruby ghi là hai dòng cuối cùng, dòng 5 và 6 Bên trong (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7, bạn có thể nhận được danh sách các dòng có thể dừng cho một tệp bằng cách sử dụng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)00 hỗ trợ luồngByebug hỗ trợ gỡ lỗi các chương trình Ruby sử dụng nhiều luồng Hãy xem xét chương trình mẫu sau $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)9 Lớp $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)01 mô phỏng một công ty thực. Công ty có một người quản lý và một nhân viên được đại diện bởi 2 chủ đề. họ làm việc đồng thời để đạt được các mục tiêu của công ty
(byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)0
(byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)1 Chúng tôi thực hiện một số tóm tắt dễ đọc trong mã. Nhiệm vụ của chúng tôi chỉ là một $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)02 các con số, kết quả của chúng tôi cũng vậy. Những gì người chủ của chúng tôi làm khi anh ấy làm việc là tính toán với những con số đó và những gì người quản lý làm với kết quả là in chúng ra màn hình Chúng tôi khởi tạo một công ty mới với một tác vụ ban đầu và sau khi chạy công ty đó, chúng tôi hy vọng kết quả sẽ được in trên màn hình, nhưng không phải vậy. Hãy gỡ lỗi chương trình mẫu của chúng tôi (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)2 Những gì chúng tôi đã làm ở đây chỉ là bắt đầu chương trình của chúng tôi và chuyển sang điểm chính ngay sau khi chủ đề ________ 203 và ________ 204 của chúng tôi được tạo. Sau đó, chúng tôi có thể kiểm tra xem các luồng có ở đó không bằng cách sử dụng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)05. Bây giờ chúng tôi muốn gỡ lỗi cả hai chủ đề này để kiểm tra xem điều gì đang xảy ra và tìm lỗi (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)3 Chúng tôi đã bắt đầu bằng cách gỡ lỗi chuỗi $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)03. Để làm được điều đó, chúng ta chuyển sang luồng đó bằng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)07. Số luồng là số được chỉ định bởi $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)05, chúng tôi biết đây là luồng công nhân của chúng tôi vì $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)05 chỉ định nơi luồng được xác định trong tệp (và vị trí hiện tại của nó nếu luồng hiện đang chạy) Sau đó, chúng tôi dừng luồng chính và luồng công nhân, sử dụng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)10. Chúng tôi làm điều này bởi vì chúng tôi muốn tập trung vào luồng nhân viên trước tiên và không muốn chương trình kết thúc trong khi chúng tôi đang gỡ lỗi. Lưu ý rằng các chuỗi đã dừng được đánh dấu bằng ký hiệu "$" trong khi chuỗi hiện tại được đánh dấu bằng ký hiệu "+" (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)4 Mọi thứ có vẻ ổn trong chủ đề này. Lần lặp đầu tiên, nhân viên sẽ thực hiện công việc của mình và sau đó, nó sẽ chỉ kiểm tra các nhiệm vụ mới và ngủ. Bây giờ hãy gỡ lỗi tác vụ của trình quản lý (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)5 Chúng tôi đã sử dụng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)11 để khởi động lại chuỗi của trình quản lý và sau đó chuyển sang chuỗi đó bằng cách sử dụng $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)12. Điều quan trọng là phải tiếp tục thực thi chuỗi trước khi chuyển sang chuỗi đó, nếu không chúng ta sẽ bị treo vì không thể chạy chuỗi đang ngủ Bây giờ chúng ta có thể điều tra vấn đề ở phía người sử dụng lao động (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)6 Bây giờ chúng ta có thể thấy vấn đề, biến $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)13 luôn trống. Nhân viên quên để lại kết quả trong boong của người quản lý của mình. Chúng tôi sửa nó bằng cách thay đổi dòng (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)7 trong phương thức $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)14 với dòng (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)8 Còn tiếp
Ra vàobắt đầu byebugCó một tập lệnh bao bọc có tên là (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7, về cơ bản, đá quý của $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)16 sau đó tải (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 trước khi đối số của nó (chương trình được gỡ lỗi) được bắt đầu. Nếu bạn không cần chuyển tùy chọn dấu gạch ngang cho chương trình của mình, điều này có thể gây nhầm lẫn với tùy chọn byebug, thì bạn không cần thêm $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)18. Để có danh sách ngắn gọn các tùy chọn và mô tả, hãy sử dụng tùy chọn $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)19 (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)9 Nhiều tùy chọn xuất hiện dưới dạng tên tùy chọn dài, chẳng hạn như $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)19 và tên tùy chọn có một chữ cái ngắn, chẳng hạn như $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)21. Danh sách các tùy chọn được trình bày chi tiết bên dưới -h. --Cứu giúpNó khiến (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 in một số trợ giúp cơ bản và thoát -v. --phiên bảnNó làm cho (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 in số phiên bản của nó và thoát -d. --debugĐặt $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)24 thành $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)25. Tương thích với cờ của Ruby -TÔI. --bao gồm đường dẫnThêm $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)26 vào đường dẫn tải. $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)26 có thể là một đường dẫn đơn hoặc danh sách đường dẫn được phân tách bằng dấu hai chấm -m. --sau khi chếtNếu chương trình của bạn đưa ra một ngoại lệ không bị phát hiện, bạn có thể nhập byebug để kiểm tra xem có lỗi gì không. Bạn cũng có thể muốn sử dụng tùy chọn này cùng với $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)28. Xem thêm Gỡ lỗi sau khi giết mổ --no-thoátGiữ bên trong (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 sau khi chương trình của bạn kết thúc bình thường --no-stopThông thường (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 dừng trước khi thực hiện câu lệnh đầu tiên. Thay vào đó, nếu bạn muốn nó bắt đầu chạy ban đầu và có thể ngắt nó sau khi thực thi, hãy sử dụng tùy chọn này -r. --require libYêu cầu thư viện trước khi thực thi tập lệnh. Tùy chọn này tương thích với Ruby's -t. --dấu vếtBật theo dõi dòng. Chạy $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)31 khá giống với chạy $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)32. Tuy nhiên, nếu tất cả những gì bạn muốn làm là lấy dấu vết của dòng, thì $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)33 rất có thể nhanh hơn (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t80 Tạm biệt các tùy chọn mặc địnhByebug có nhiều tùy chọn dòng lệnh,; . Ví dụ: một số người có thể muốn # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)1 là hành vi mặc định. Người ta có thể viết tập lệnh bao bọc hoặc đặt bí danh trình bao để xử lý việc này Tập tin lệnhTệp lệnh là một tệp gồm các dòng là (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 lệnh. Nhận xét (dòng bắt đầu bằng $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)37) cũng có thể được đưa vào. Một dòng trống trong tệp lệnh không làm gì cả; Khi bạn khởi động (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7, nó sẽ tự động thực thi các lệnh từ tệp init của nó, được gọi là $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)39. Trong khi khởi động, (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 thực hiện như sau
Bạn cũng có thể yêu cầu thực thi tệp lệnh bằng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)44 (xem Nguồn) Thoát byebugĐể thoát khỏi (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7, sử dụng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)13 (viết tắt là $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)14). Thông thường, nếu bạn đang trong phiên tương tác, lệnh này sẽ nhắc bạn có thực sự muốn thoát hay không. Nếu bạn muốn thoát mà không cần nhắc, hãy nhập $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)48 (viết tắt là $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)15) Một cách khác để chấm dứt byebug là sử dụng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)50. Điều này làm $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)51 mạnh mẽ hơn. Nó có thể được sử dụng trong trường hợp $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)13 không hoạt động (tôi chưa thấy chúng) Gọi byebug từ bên trong chương trình của bạnChạy một chương trình từ byebug sẽ thêm một chút chi phí hoạt động và làm chậm chương trình một chút. Hơn nữa, do cần thiết, trình gỡ lỗi thay đổi hoạt động của chương trình mà họ đang gỡ lỗi. Và điều này có thể dẫn đến sự khác biệt bất ngờ và không mong muốn. Nó đã xảy ra thường xuyên đến mức thuật ngữ Heisenbugs được đặt ra để mô tả tình huống sử dụng trình gỡ lỗi (trong số các khả năng khác) thay đổi hành vi của chương trình để lỗi không xuất hiện nữa Có một cách khác để truy cập byebug mà không gây thêm chi phí hoặc làm chậm máy cho đến khi bạn đạt đến điểm mà bạn muốn bắt đầu gỡ lỗi. Tuy nhiên, ở đây bạn phải thay đổi tập lệnh và thực hiện cuộc gọi rõ ràng tới byebug. Bởi vì byebug không liên quan trước cuộc gọi đầu tiên, nên không có chi phí hoạt động và tập lệnh sẽ chạy với tốc độ như thể không có byebug Để nhập byebug theo cách này, chỉ cần thả (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 vào bất kỳ dòng nào bạn muốn bắt đầu gỡ lỗi tại. Bạn cũng phải yêu cầu byebug bằng cách nào đó. Nếu sử dụng bundler, nó sẽ giải quyết vấn đề đó cho bạn, nếu không, bạn có thể sử dụng cờ $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)54 của ruby hoặc thêm $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)55 vào dòng trước lệnh gọi (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 Nếu tốc độ là yếu tố quan trọng, bạn có thể muốn bắt đầu và dừng điều này xung quanh một số đoạn mã nhất định, sử dụng $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)57 và $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)58. Ngoài ra, thay vì phát hành một $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)58 rõ ràng, bạn có thể thêm một khối vào $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)57 và bật gỡ lỗi cho khối đó. Nếu khối mã đưa ra một ngoại lệ chưa được phát hiện sẽ khiến khối đó kết thúc, thì $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)61 sẽ xảy ra. Xem tạm biệt. bắt đầu với một khối Khi (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7is chạy, $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)39 được đọc Bạn có thể muốn nhập byebug tại một số điểm trong chương trình có sự cố mà bạn muốn điều tra. Và vì (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 chỉ là một lệnh gọi phương thức nên có thể đặt nó trong một biểu thức điều kiện, chẳng hạn # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t81 Khởi động lại tạm biệtBạn có thể khởi động lại chương trình bằng cách sử dụng $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)65. Đây là một re-exec - tất cả trạng thái byebug bị mất. Nếu các đối số lệnh được thông qua, chúng được sử dụng. Mặt khác, các đối số chương trình từ lần gọi cuối cùng được sử dụng Bạn sẽ không thể khởi động lại chương trình của mình trong mọi trường hợp. Đầu tiên, chương trình lẽ ra phải được gọi ngay từ đầu thay vì được gọi từ bên trong chương trình của bạn hoặc được gọi do xử lý hậu kỳ Ngoài ra, vì điều này phụ thuộc vào lệnh gọi $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)66 của OS, nên lệnh này chỉ khả dụng nếu HĐH của bạn hỗ trợ $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)66 Gỡ lỗi các chương trình từ xaCó thể thiết lập gỡ lỗi để bạn có thể đưa ra các lệnh byebug từ bên ngoài quy trình chạy mã Ruby. Trên thực tế, bạn thậm chí có thể đang sử dụng một máy tính khác với máy tính đang chạy chương trình Ruby Để thiết lập gỡ lỗi từ xa, hãy thả phần sau vào đâu đó trước điểm trong chương trình mà bạn muốn gỡ lỗi (Trong Rails, $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)68 có thể là một ứng cử viên sáng giá) # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t82 Khi phần này được thực thi, bạn có thể kết nối với trình gỡ lỗi từ xa từ máy cục bộ của mình bằng cách chạy. $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)69 Tiếp theo, tại nơi thực thi chương trình được chạy ngay trước đoạn mã bạn muốn gỡ lỗi, hãy thêm lệnh gọi tới (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 như đã thực hiện mà không cần thực thi từ xa # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t83 Tham khảo lệnh byebugCú pháp lệnhThông thường một lệnh được đặt trên một dòng. Không có giới hạn về thời gian có thể. Nó bắt đầu bằng tên lệnh, theo sau là các đối số có ý nghĩa phụ thuộc vào tên lệnh. Ví dụ, lệnh # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)4 chấp nhận một đối số là số lần bước, như trong $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)72. Bạn cũng có thể sử dụng lệnh # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)4 không có đối số. Một số lệnh không cho phép bất kỳ đối số nào Có thể đặt nhiều lệnh trên một dòng bằng cách tách từng lệnh bằng dấu chấm phẩy $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)74. Bạn có thể vô hiệu hóa ý nghĩa của dấu chấm phẩy để phân tách các lệnh bằng cách thoát nó bằng dấu gạch chéo ngược Ví dụ: bạn có thể muốn nhập mã sau đây để tính số Fibonacci thứ 5 # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t84 Bạn cũng có thể cân nhắc sử dụng lệnh irb hoặc pry và sau đó bạn sẽ không phải thoát khỏi dấu chấm phẩy Một dòng trống làm đầu vào (chỉ cần gõ $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)75) có nghĩa là lặp lại lệnh trước đó Byebug sử dụng readline, xử lý chỉnh sửa dòng và truy xuất các lệnh trước đó. Ví dụ, mũi tên lên di chuyển đến lệnh byebug trước đó; . Lịch sử lệnh được lưu trong tệp $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)76. Một giới hạn được đặt trên kích thước lịch sử. Bạn có thể thấy điều này bằng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)77. Xem lịch sử cho các thông số lịch sử Đầu ra lệnhTrong giao diện dòng lệnh, khi (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 đang đợi đầu vào, nó sẽ hiển thị lời nhắc có dạng (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y9. Nếu chương trình đã kết thúc bình thường, lời nhắc sẽ là # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)2 và trong quá trình gỡ lỗi sau khi chết, nó sẽ là # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)0 Bất cứ khi nào (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 đưa ra thông báo lỗi, chẳng hạn như lệnh không hợp lệ hoặc vị trí vị trí không hợp lệ, nó thường sẽ mở đầu thông báo bằng $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)83 Lệnh trợ giúpKhi đã ở trong (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7, bạn luôn có thể hỏi thông tin về các lệnh của nó bằng cách sử dụng lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)85. Bạn có thể sử dụng $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)85 (viết tắt là $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)87) không có đối số để hiển thị danh sách ngắn các lớp lệnh đã đặt tên # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t85 Với tên lệnh, $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)85 hiển thị thông tin về cách sử dụng lệnh # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t86 Một số lệnh, cụ thể là $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)89, $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)90, $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)91, $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)92 và $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)93, có nhiều tham số phụ hoặc lệnh con. Khi bạn yêu cầu trợ giúp cho một trong các lệnh này, bạn sẽ nhận được trợ giúp cho tất cả các lệnh phụ mà lệnh đó cung cấp. Đôi khi, bạn có thể chỉ cần trợ giúp về một lệnh con và để thực hiện việc này, chỉ cần thực hiện theo lệnh có tên lệnh con của nó. Ví dụ: $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)94sẽ chỉ trợ giúp về lệnh $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)95. Hơn nữa, nó sẽ trợ giúp lâu hơn so với thông tin tóm tắt xuất hiện khi bạn yêu cầu trợ giúp. Bạn không cần liệt kê tên đầy đủ của lệnh con, chỉ cần đủ các chữ cái để làm cho lệnh con đó khác biệt với những lệnh khác là đủ. Ví dụ: $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)96 giống như $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)94 Một số ví dụ sau # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t87 # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t88 # # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n # def triangle(n) tri = 0 0.upto(n) { |i| tri += i } tri end t = triangle(3) puts t89 Lệnh điều khiển. thoát, khởi động lại, nguồnTừ bỏĐể thoát khỏi (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7, gõ $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)13 (viết tắt là $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)14). Thông thường, nếu bạn đang trong phiên tương tác, lệnh này sẽ nhắc bạn xác nhận rằng bạn thực sự muốn thoát. Nếu bạn muốn thoát mà không cần nhắc, hãy nhập $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)48 (viết tắt là $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)15) Khởi động lạiĐể khởi động lại chương trình, sử dụng lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)03. Đây là một re-exec - tất cả trạng thái (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 bị mất. Nếu các đối số lệnh được thông qua, chúng được sử dụng. Mặt khác, các đối số chương trình từ lần gọi cuối cùng được sử dụng Bạn sẽ không thể khởi động lại chương trình của mình trong mọi trường hợp. Đầu tiên, chương trình lẽ ra phải được gọi ngay từ đầu thay vì được gọi từ bên trong chương trình của bạn hoặc được gọi do xử lý hậu kỳ NguồnBạn có thể chạy các lệnh (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 bên trong một tệp, sử dụng lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)06. Các dòng trong một tệp lệnh được thực hiện tuần tự. Chúng không được in khi chúng được thực thi. Nếu có lỗi, quá trình thực thi sẽ chuyển sang lệnh tiếp theo trong tệp. Để biết thông tin về các tệp lệnh tự động chạy khi khởi động, hãy xem Tệp lệnh Hiển thị lệnh. hiển thị, không hiển thịTrưng bàyNếu bạn thấy rằng bạn muốn in giá trị của một biểu thức thường xuyên (để xem nó thay đổi như thế nào), bạn có thể muốn thêm nó vào danh sách hiển thị tự động* để (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 đánh giá nó mỗi khi chương trình của bạn dừng hoặc sau khi một dòng được in . Mỗi biểu thức được thêm vào danh sách được cung cấp một số để xác định nó; . Màn hình tự động trông như thế này (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y0 Màn hình này hiển thị số mục, biểu thức và giá trị hiện tại của chúng. Nếu biểu thức không được xác định hoặc không hợp lệ, biểu thức sẽ được in nhưng không có giá trị nào xuất hiện (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y1 Nếu bạn sử dụng (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)08 mà không có đối số, thì (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 sẽ hiển thị các giá trị hiện tại của các biểu thức trong danh sách, giống như nó được thực hiện khi chương trình của bạn dừng lại. Sử dụng (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)10 cũng có tác dụng tương tự Bỏ hiển thịĐể xóa một mục khỏi danh sách, hãy sử dụng (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y03 theo sau là số xác định biểu thức bạn muốn xóa. (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y03 không lặp lại nếu bạn nhấn $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)75 sau khi sử dụng nó (nếu không, bạn sẽ chỉ gặp lỗi Không có số hiển thị n) Bạn cũng có thể tạm thời tắt hoặc bật các biểu thức hiển thị để biểu thức sẽ không được in nhưng chúng cũng sẽ không bị quên, vì vậy bạn có thể chuyển đổi lại sau. Để làm điều đó, hãy sử dụng (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)14 hoặc (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)15 theo sau là số biểu thức Đánh giá các biểu thức. irb, cạyĐể kiểm tra và thay đổi dữ liệu trong tập lệnh của bạn, bạn chỉ cần đánh giá bất kỳ mã Ruby nào từ lời nhắc của (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7. Bất kỳ đầu vào nào không được nhận dạng dưới dạng lệnh sẽ được đánh giá, do đó, về cơ bản, (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 hoạt động như một REPL. Nếu bạn muốn đánh giá thứ gì đó xung đột với lệnh (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7, chỉ cần sử dụng lệnh # # Solves the classic Towers of Hanoi puzzle. # def hanoi(n, a, b, c) hanoi(n - 1, a, c, b) if n - 1 > 0 puts "Move disk #{a} to #{b}" hanoi(n - 1, c, b, a) if n - 1 > 0 end n_args = $ARGV.length raise("*** Need number of disks or no parameter") if n_args > 1 n = 3 if n_args > 0 begin n = $ARGV[0].to_i rescue ValueError raise("*** Expecting an integer, got: #{$ARGV[0]}") end end raise("*** Number of disks should be between 1 and 100") if n < 1 || n > 100 hanoi(n, :a, :b, :c)7 của Ruby. Ví dụ muốn in biến có tên là (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y08 thì gõ (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y09 vì chỉ cần gõ (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y08 sẽ thực hiện lệnh của (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 là (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y11 Cuối cùng, nếu bạn cần chức năng nâng cao hơn từ REPL's, bạn có thể nhập (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)25 hoặc (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)26 bằng lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)25 hoặc (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)26. Môi trường của ràng buộc sẽ được đặt thành trạng thái hiện tại trong chương trình. Khi bạn thoát khỏi thay thế và quay lại dấu nhắc lệnh của (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7, chúng tôi hiển thị vị trí tệp, dòng và văn bản của chương trình. Nếu bạn phát hành một (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)30 mà không có thông tin vị trí, thì vị trí mặc định được sử dụng là dòng hiện tại thay vì vị trí hiện tại có thể đã được cập nhật thông qua lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)30 trước đó (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y2 biến in. varByebug có thể in nhiều thông tin khác nhau về các biến. Như là
Kiểm tra tệp nguồn chương trình. danh sách(byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 có thể in các phần nguồn tập lệnh của bạn. Khi tập lệnh của bạn dừng lại, (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 sẽ tự động liệt kê mã nguồn xung quanh dòng nơi nó dừng dòng đó. Nó cũng làm điều đó khi bạn thay đổi khung ngăn xếp hiện tại. Ngầm định có một vị trí dòng mặc định. Mỗi khi một lệnh danh sách được chạy, vị trí ngầm định đó được cập nhật, do đó việc chạy một số lệnh danh sách liên tiếp sẽ hiển thị một khối văn bản chương trình liền kề Nếu bạn không cần bối cảnh mã được hiển thị mọi lúc, bạn có thể đưa ra lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)52. Giờ đây, bất cứ khi nào bạn muốn mã được liệt kê, bạn có thể đưa ra lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)30 hoặc tên viết tắt của nó là (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)54 một cách rõ ràng. Lưu ý rằng khi danh sách thứ hai được hiển thị, chúng tôi tiếp tục liệt kê từ nơi chúng tôi đã rời đi lần trước. Khi đạt đến phần đầu hoặc phần cuối của tệp, phạm vi dòng được hiển thị sẽ được điều chỉnh để "nó không bị tràn". Bạn có thể đặt tùy chọn (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)55 theo mặc định bằng cách thả (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)52 vào tệp khởi động của byebug $ byebug /path/to/triangle.rb [1, 10] in /path/to/triangle.rb 1: # 2: # The n'th triangle number: triangle(n) = n*(n+1)/2 = 1 + 2 + .. + n 3: # => 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end (byebug)39 Nếu bạn muốn đặt số dòng được in theo mặc định thay vì sử dụng số dòng ban đầu, 10, hãy sử dụng lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)58 ([listsize()). Để xem toàn bộ chương trình trong một lần, hãy cung cấp số dòng bắt đầu và kết thúc rõ ràng. Bạn có thể in các phần khác của tệp nguồn bằng cách đưa ra vị trí rõ ràng làm tham số cho lệnh danh sách Có một số cách để chỉ định phần nào của tệp bạn muốn in. (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)59 in các dòng được căn giữa xung quanh số dòng (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)60 trong tệp nguồn hiện tại. (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)54 in thêm dòng, sau dòng cuối cùng được in. (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)62 in các dòng ngay trước các dòng được in lần cuối. (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)63 in các dòng giữa bao gồm cả (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)60 và (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)65. (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)66 in các dòng tập trung xung quanh nơi tập lệnh bị dừng. Việc lặp lại lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)30 với (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)68 sẽ loại bỏ đối số, do đó, nó tương đương với việc chỉ gõ (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)30. Điều này hữu ích hơn là liệt kê lại các dòng giống nhau. Một ngoại lệ được thực hiện cho một đối số của (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)70. đối số đó được giữ nguyên trong lần lặp lại để mỗi lần lặp lại di chuyển lên trong tệp nguồn Chỉnh sửa tệp nguồn. chỉnh sửaĐể chỉnh sửa tệp nguồn, hãy sử dụng lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)71. Trình chỉnh sửa bạn chọn được gọi với dòng hiện tại được đặt thành dòng hoạt động trong chương trình. Ngoài ra, bạn có thể đưa ra thông số kỹ thuật của dòng để chỉ định phần nào của tệp bạn muốn chỉnh sửa Bạn có thể tùy chỉnh (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 để sử dụng bất kỳ trình chỉnh sửa nào bạn muốn bằng cách sử dụng biến môi trường (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)73. Hạn chế duy nhất là trình soạn thảo của bạn (chẳng hạn như (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)74) nhận ra cú pháp dòng lệnh sau (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y3 Giá trị số tùy chọn (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)75 chỉ định số dòng trong tệp mà bạn muốn bắt đầu chỉnh sửa. Ví dụ: để định cấu hình (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y7 sử dụng trình soạn thảo (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)77, bạn có thể sử dụng các lệnh này với trình bao (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)78 (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y4 hoặc trong vỏ (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)79, (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y5 Dấu vết ngăn xếpKhi tập lệnh của bạn đã dừng, một điều bạn có thể muốn biết là nó đã dừng ở đâu và một số ý tưởng về cách nó đến đó Mỗi khi tập lệnh của bạn gọi một phương thức hoặc nhập một khối, thông tin về hành động này sẽ được lưu lại. Thông tin này là cái mà chúng tôi gọi là khung ngăn xếp hoặc chỉ là khung. Tập hợp tất cả các khung tại một điểm nhất định trong quá trình thực thi chương trình được gọi là dấu vết ngăn xếp hoặc chỉ ngăn xếp. Mỗi khung chứa một số dòng và tên tệp nguồn mà dòng đề cập đến. Nếu khung là phần đầu của một phương thức thì nó cũng chứa tên phương thức Khi tập lệnh của bạn được bắt đầu, ngăn xếp chỉ có một khung, khung của phương thức (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)80. Đây được gọi là khung ban đầu hoặc khung ngoài cùng. Mỗi khi một phương thức được gọi, một khung mới sẽ được thêm vào dấu vết ngăn xếp. Mỗi khi một phương thức trả về, khung gọi phương thức đó sẽ bị xóa. Nếu một phương thức là đệ quy, có thể có nhiều khung cho cùng một phương thức. Khung dành cho phương thức thực thi đang thực sự diễn ra được gọi là khung trong cùng. Đây là khung được tạo gần đây nhất trong số tất cả các khung ngăn xếp vẫn còn tồn tại Mỗi khi trình gỡ lỗi dừng, một mục trong ngăn xếp được chọn làm khung hiện tại. Nhiều lệnh byebug đề cập ngầm đến khối đã chọn. Đặc biệt, bất cứ khi nào bạn yêu cầu Byebug liệt kê các dòng mà không đưa ra số dòng hoặc vị trí, giá trị sẽ được tìm thấy trong khung đã chọn. Có các lệnh đặc biệt để chọn bất kỳ khung hình nào bạn quan tâm, chẳng hạn như (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)81, (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)82 và (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)83 Sau khi chuyển đổi khung, khi bạn đưa ra lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)30 mà không có bất kỳ thông tin vị trí nào, vị trí được sử dụng là vị trí trong khung mà bạn vừa chuyển đổi, chứ không phải là vị trí đã được cập nhật thông qua lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)30 trước đó Byebug gán số cho tất cả các khung ngăn xếp hiện có, bắt đầu bằng 0 cho khung trong cùng, một cho khung đã gọi nó, v.v. Những con số này không thực sự tồn tại trong tập lệnh của bạn, chúng được Byebug chỉ định để cung cấp cho bạn cách chỉ định các khung ngăn xếp trong các lệnh In ngăn xếp. lệnh (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y04Lệnh (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y04, được đặt bí danh là (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)88 hoặc (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)89 in ngăn xếp cuộc gọi. , Nó hiển thị một dòng trên mỗi khung hình, cho nhiều khung hình, bắt đầu với địa điểm mà bạn dừng lại (khung số 0), theo sau là người gọi nó (khung hình một) và trên ngăn xếp. Mỗi khung được đánh số và có thể được tham chiếu trong lệnh (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)83. Vị trí của khung hiện tại được đánh dấu bằng (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)91 Đây là một số khung đặc biệt được tạo cho các phương thức được triển khai trong C. Một phương pháp như vậy là (byebug) step [5, 14] in /path/to/triangle.rb 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri 10: end 11: => 12: t = triangle(3) 13: puts t (byebug)92. Chúng được đánh dấu khác nhau trong ngăn xếp cuộc gọi để cho biết rằng chúng tôi không thể chuyển sang các khung đó. Điều này là do họ không có mã nguồn trong Ruby, vì vậy chúng tôi không thể gỡ lỗi cho họ bằng Byebug (byebug) set linetrace linetrace is on (byebug) set basename basename is on (byebug) finish 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 0 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 1 Tracing: triangle.rb:7 0.upto(n) { |i| tri += i } 1: tri = 3 Tracing: triangle.rb:9 tri 1: tri = 6 1: tri = 6 [4, 13] in /home/davidr/Proyectos/byebug/triangle.rb 4: def triangle(n) 5: tri = 0 6: 7: 0.upto(n) { |i| tri += i } 8: 9: tri => 10: end 11: 12: t = triangle(3) 13: puts t (byebug) quit Really quit? (y/n) y6 Chọn một khung. Lệnh (byebug) step
[5, 14] in /path/to/triangle.rb
5: tri = 0
6:
7: 0.upto(n) { |i| tri += i }
8:
9: tri
10: end
11:
=> 12: t = triangle(3)
13: puts t
(byebug) |