Proposal: reverse continue
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 30/100
Rechercherichtung
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.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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
- Vorherrschende Sprache
- Ruby
- Sterne
- 1.3k
- Forks
- 146
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus ruby/debug
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 68/100
-
Support exceptionOptions in setExceptionBreakpoints to catch arbitrary exception classes via DAP Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 55/100
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 45/100
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 52/100
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
-
bug
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
riscv/riscv-unified-db#2626 ·
-
Component: GLib
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
-
ds-drift
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
we-promise/sure#3693 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
simp/pupmod-simp-simp#395 ·