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)
y
7. 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)
y
8. 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)
y
9. 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0

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)
y
7 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 t
8

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)
y
7, 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ơn

Trong 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)
y
7 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)
y
0

Đượ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)
y
1

Ố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)
y
00 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)
y
3

Ở 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)
y
01 (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)
y
02, 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)
y
03 đượ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)
y
04(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)
y
05 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)
y
08 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)
y
09. 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)
y
08, đ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)
y
11. 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)
y
12 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)
y
13. 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)
y
12 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)
y
08 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) y7

Trong 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)
y
17 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)
y
18. 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)
y
19, 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)
y
7 đặ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)
y
31 để 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)
y
32 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)
y
8

$ 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)
y
7

$ 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)
y
35

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ác

Nế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)
y
37 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)
y
38, dòng 9-28 ở trên

Không có giá trị tham số trong ngăn xếp cuộc gọi

Trong 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ại

Hã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)
y
7, 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ồng

Byebug 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

  • Nhân viên tìm kiếm các nhiệm vụ để hoàn thành. Nếu có nhiệm vụ, nó làm việc chăm chỉ để hoàn thành chúng. Nếu không thì anh ấy đã nghỉ ngơi nhanh chó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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
0

  • Mặt khác, người quản lý ngồi đó cả ngày và thỉnh thoảng kiểm tra xem có kết quả nào để khoe khô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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
8

Còn tiếp

  • Các ví dụ phức tạp hơn với các đối tượng, in đẹp và irb
  • Theo dõi dòng và theo dõi không tương tác
  • Gỡ lỗi sau khi chết

Ra vào

bắt đầu byebug

Có 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)
y
7, 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)
y
7 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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úp

Nó 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)
y
7 in một số trợ giúp cơ bản và thoát

-v. --phiên bản

Nó 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)
y
7 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ẫ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)
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ết

Nế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át

Giữ 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)
y
7 sau khi chương trình của bạn kết thúc bình thường

--no-stop

Thô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)
y
7 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 lib

Yê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ết

Bậ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)
y
7

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

Tạm biệt các tùy chọn mặc định

Byebug 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ệnh

Tệ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)
y
7 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)
y
7, 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)
y
7 thực hiện như sau

  • Xử lý các tùy chọn dòng lệnh và toán hạng. Đọc tệp init trong thư mục hiện tại của bạn, nếu có, sau đó kiểm tra thư mục chính của bạn. Thư mục chính là thư mục có tên trong biến môi trườ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)
    41 hoặ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)
    42. Do đó, bạn có thể có nhiều hơn một tệp init, một tệp chung trong thư mục chính của bạn và một tệp khác, dành riêng cho chương trình bạn đang gỡ lỗi, trong thư mục nơi bạn 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)
    y
    7

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)
y
7, 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ạn

Chạ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)
y
7 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)
y
7

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)
y
7is 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)
y
7 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 t
81

Khởi động lại tạm biệt

Bạ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ừ xa

Có 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 t
82

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)
y
7 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 t
83

Tham khảo lệnh byebug

Cú pháp lệnh

Thô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 t
84

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ệnh

Trong 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)
y
7 đ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)
y
9. 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)
y
7 đư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úp

Khi đã ở 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)
y
7, 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 t
85

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 t
86

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 t
87

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

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

Lệnh điều khiển. thoát, khởi động lại, nguồn

Từ 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)
y
7, 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
7 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ồn

Bạ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)
y
7 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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ày

Nế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)
y
7 đá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)
y
0

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)
y
1

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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
7 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
03 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)
y
03 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
7. 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)
y
7 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)
y
7, 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)
y
08 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)
y
09 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)
y
08 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)
y
7 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)
y
11

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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
7, 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
2

biến in. var

Byebug có thể in nhiều thông tin khác nhau về các biến. Như 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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    32. Hiển thị các hằng 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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    33. Về cơ bản, đây là danh sách các biến và giá trị của chúng trong
    (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    34
  • (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    35. Hiển thị các biến thể hiện 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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    33. Về cơ bản đây là danh sách
    (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    37
  • (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    38. Hiển thị instance_variables 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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    39
  • (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    40. Hiển thị các biến cục bộ
  • (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    41. Hiển thị các biến toàn cầ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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    42. Hiển thị các biến cục bộ, toàn cầu và thể hiện và lớp 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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    39
  • (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    44. Hiển thị các phương pháp 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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    33. Về cơ bản, điều này giống như chạy
    (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    46
  • (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    47. Hiển thị các phương thức của lớp hoặc mô-đun
    (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    48. Về cơ bản, điều này giống như chạy
    (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    49

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)
y
7 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)
y
7 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
7 để 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
3

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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
7 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
4

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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
5

Dấu vết ngăn xếp

Khi 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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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) y04

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)
y
04, đượ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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)  # hit enter

[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) eval tri
nil
(byebug) step

[2, 11] in /path/to/triangle.rb
    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
   11:
(byebug) eval tri
0
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)
y
6

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) # hit enter [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) eval tri nil (byebug) step [2, 11] in /path/to/triangle.rb 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 11: (byebug) eval tri 081, (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) # hit enter [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) eval tri nil (byebug) step [2, 11] in /path/to/triangle.rb 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 11: (byebug) eval tri 082 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) # hit enter [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) eval tri nil (byebug) step [2, 11] in /path/to/triangle.rb 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 11: (byebug) eval tri 083

  • (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    96. Di chuyển khung
    (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
    08 lên ngăn xếp, về phía khung ngoài cùng (số khung cao hơn, khung đã tồn tại lâu 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)
    y
    08 mặc định là 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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    99. Di chuyển khung
    (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
    08 xuống ngăn xếp, về phía khung trong cùng (số khung thấp hơn, khung được tạo gần đây 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)
    y
    08 mặc định là một

  • #
    # 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
    802. Cho phép bạn di chuyển đến một khung tù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)
    y
    08 là số khung ngăn xếp hoặc 0 nếu không có số khung nào được cung cấp.
    #
    # 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
    804 sẽ hiển thị khung ngăn xếp hiện tại và gần đây nhất. Nếu một số âm được đưa ra, thì việc đếm sẽ được thực hiện từ đầu kia của khung ngăn xếp, do đó,
    #
    # 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
    805 hiển thị khung ngăn xếp ngoài cùng, gần đây nhất. Không có đối số,
    (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)  # hit enter
    
    [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) eval tri
    nil
    (byebug) step
    
    [2, 11] in /path/to/triangle.rb
        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
       11:
    (byebug) eval tri
    0
    83 in khung ngăn xếp hiện tại