Proposal: reverse continue
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 30/100
Línea de trabajo
Start by running the shown rdbg session with record on, the breakpoint, and continue back to understand the proposed reverse-debugging flow. The issue mentions no repository files or tests; done would be implementing and documenting a reverse-continue workflow that lands at the earlier state matching a breakpoint or condition.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Your proposal
Here's a simplistic piece of code:
# test.rb
def foo(a, b)
a.x = nil if b == 5
end
a = Struct.new(:x).new(10)
10.times do |i|
foo(a, i)
puts a.x + i
end
It has a bug and will crash when i is 5:
$ ruby test.rb
10
11
12
13
14
test.rb:9:in `block in <main>': undefined method `+' for nil (NoMethodError)
puts a.x + i
^
from <internal:numeric>:237:in `times'
from test.rb:9:in `<main>'
We can do this:
$ rdbg test.rb
[1, 10] in test.rb
=> 1| def foo(a, b)
2| a.x = nil if b == 5
3| end
4|
5| a = Struct.new(:x).new(10)
6|
7| 10.times do |i|
8| foo(a, i)
9| puts a.x + i
10| end
=>#0 <main> at test.rb:1
(rdbg) break 9 if: a.x == nil # command
#0 BP - Line /Users/loic.nageleisen/test.rb:9 (line) if: a.x == nil
(rdbg) record on # command
Recorder for #<Thread:0x000000010292b0c8 run>: on (0 records)
(rdbg) continue # command
10
11
12
13
14
[4, 10] in test.rb
4|
5| a = Struct.new(:x).new(10)
6|
7| 10.times do |i|
8| foo(a, i)
=> 9| puts a.x + i
10| end
=>#0 block {|i=5|} in <main> at test.rb:9
#1 Integer#times at <internal:numeric>:237
# and 1 frames (use `bt' command for all frames)
Stop by #0 BP - Line /Users/loic.nageleisen/test.rb:9 (line) if: a.x == nil
(rdbg) step back # command
[replay] [4, 10] in test.rb
[replay] 4|
[replay] 5| a = Struct.new(:x).new(10)
[replay] 6|
[replay] 7| 10.times do |i|
[replay] 8| foo(a, i)
[replay] => 9| puts a.x + i
[replay] 10| end
[replay] =>#0 block {|i=5|} in <main> at test.rb:9
[replay] #1 Integer#times at <internal:numeric>:237
[replay] # and 1 frames (use `bt' command for all frames)
(rdbg) step back # command
[replay] [1, 10] in test.rb
[replay] 1| def foo(a, b)
[replay] => 2| a.x = nil if b == 5
[replay] 3| end
[replay] 4|
[replay] 5| a = Struct.new(:x).new(10)
[replay] 6|
[replay] 7| 10.times do |i|
[replay] 8| foo(a, i)
[replay] 9| puts a.x + i
[replay] 10| end
[replay] =>#0 Object#foo(a=#<struct x=nil>, b=5) at test.rb:2
[replay] #1 block {|i=5|} in <main> at test.rb:8
[replay] # and 2 frames (use `bt' command for all frames)
(rdbg)
And there we find the line that caused our bug.
Sadly many a time the code is much more sizeable and complex, and it's not that easy to go back step by step.
I would like to propose possible usage:
break 9 if: a.x == nil
record on
continue
# <= breakpoint hit
break if: a.x != nil # or `break a.x=`
continue back # or `reverse continue`
# <= lands on line 3
break 9 if: a.x == nil
record on
continue
# <= breakpoint hit
watch a.x
continue back
# <= lands on line 3
break 9 if: a.x == nil
record on
continue
# <= breakpoint hit
step back until a.x != nil # or `reverse until a.x != nil`
# <= lands on line 3
Both would automate going from the issue occurence back until a specific condition is met.
Additional context
Inspired by rr's reverse-continue and watch -l
- Lenguaje dominante
- Ruby
- Estrellas
- 1.3k
- Forks
- 146
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de ruby/debug
-
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
-
Support exceptionOptions in setExceptionBreakpoints to catch arbitrary exception classes via DAP Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 45/100
-
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Todos los issues de ruby/debug
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
-
バグ
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
-
Version bump for OpenVox 9 Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
voxpupuli/puppet-epel#186 · 1 comentario ·
-
external_created_at is no longer used for the message timestamp since the new message UI (v4.4.0) AbiertoBug Frontend
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100