byebug 5.0.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -1
- data/CONTRIBUTING.md +35 -13
- data/GUIDE.md +256 -198
- data/README.md +5 -11
- data/ext/byebug/byebug.c +5 -43
- data/ext/byebug/byebug.h +6 -1
- data/ext/byebug/context.c +4 -5
- data/lib/byebug/command.rb +64 -64
- data/lib/byebug/command_list.rb +32 -0
- data/lib/byebug/commands.rb +37 -0
- data/lib/byebug/commands/break.rb +45 -37
- data/lib/byebug/commands/catch.rb +52 -28
- data/lib/byebug/commands/condition.rb +19 -13
- data/lib/byebug/commands/continue.rb +15 -11
- data/lib/byebug/commands/delete.rb +18 -12
- data/lib/byebug/commands/disable.rb +9 -10
- data/lib/byebug/commands/disable/breakpoints.rb +13 -11
- data/lib/byebug/commands/disable/display.rb +13 -11
- data/lib/byebug/commands/display.rb +32 -24
- data/lib/byebug/commands/down.rb +18 -14
- data/lib/byebug/commands/edit.rb +42 -26
- data/lib/byebug/commands/enable.rb +9 -3
- data/lib/byebug/commands/enable/breakpoints.rb +13 -11
- data/lib/byebug/commands/enable/display.rb +13 -11
- data/lib/byebug/commands/finish.rb +23 -14
- data/lib/byebug/commands/frame.rb +21 -18
- data/lib/byebug/commands/help.rb +39 -16
- data/lib/byebug/commands/history.rb +16 -10
- data/lib/byebug/commands/info.rb +8 -5
- data/lib/byebug/commands/info/breakpoints.rb +16 -14
- data/lib/byebug/commands/info/display.rb +18 -18
- data/lib/byebug/commands/info/file.rb +22 -22
- data/lib/byebug/commands/info/line.rb +13 -11
- data/lib/byebug/commands/info/program.rb +13 -17
- data/lib/byebug/commands/interrupt.rb +13 -11
- data/lib/byebug/commands/irb.rb +16 -10
- data/lib/byebug/commands/kill.rb +19 -13
- data/lib/byebug/commands/list.rb +35 -24
- data/lib/byebug/commands/method.rb +25 -15
- data/lib/byebug/commands/next.rb +15 -13
- data/lib/byebug/commands/pry.rb +18 -11
- data/lib/byebug/commands/ps.rb +21 -23
- data/lib/byebug/commands/quit.rb +17 -11
- data/lib/byebug/commands/restart.rb +28 -24
- data/lib/byebug/commands/save.rb +23 -15
- data/lib/byebug/commands/set.rb +26 -19
- data/lib/byebug/commands/show.rb +20 -14
- data/lib/byebug/commands/source.rb +15 -14
- data/lib/byebug/commands/step.rb +15 -13
- data/lib/byebug/commands/thread.rb +8 -4
- data/lib/byebug/commands/thread/current.rb +11 -11
- data/lib/byebug/commands/thread/list.rb +14 -14
- data/lib/byebug/commands/thread/resume.rb +14 -14
- data/lib/byebug/commands/thread/stop.rb +14 -14
- data/lib/byebug/commands/thread/switch.rb +15 -14
- data/lib/byebug/commands/tracevar.rb +20 -16
- data/lib/byebug/commands/undisplay.rb +22 -18
- data/lib/byebug/commands/untracevar.rb +13 -11
- data/lib/byebug/commands/up.rb +18 -14
- data/lib/byebug/commands/var.rb +10 -3
- data/lib/byebug/commands/var/all.rb +15 -13
- data/lib/byebug/commands/var/args.rb +37 -0
- data/lib/byebug/commands/var/const.rb +25 -14
- data/lib/byebug/commands/var/global.rb +13 -11
- data/lib/byebug/commands/var/instance.rb +13 -11
- data/lib/byebug/commands/var/local.rb +13 -11
- data/lib/byebug/commands/where.rb +15 -11
- data/lib/byebug/context.rb +71 -73
- data/lib/byebug/core.rb +45 -26
- data/lib/byebug/errors.rb +27 -0
- data/lib/byebug/frame.rb +181 -0
- data/lib/byebug/helpers/eval.rb +67 -26
- data/lib/byebug/helpers/file.rb +18 -3
- data/lib/byebug/helpers/frame.rb +36 -39
- data/lib/byebug/helpers/parse.rb +15 -13
- data/lib/byebug/helpers/path.rb +21 -0
- data/lib/byebug/helpers/reflection.rb +17 -0
- data/lib/byebug/helpers/thread.rb +20 -14
- data/lib/byebug/helpers/toggle.rb +10 -5
- data/lib/byebug/helpers/var.rb +36 -15
- data/lib/byebug/interface.rb +27 -9
- data/lib/byebug/option_setter.rb +93 -0
- data/lib/byebug/printers/base.rb +3 -0
- data/lib/byebug/printers/plain.rb +4 -14
- data/lib/byebug/printers/texts/base.yml +2 -7
- data/lib/byebug/processors/command_processor.rb +101 -102
- data/lib/byebug/processors/control_processor.rb +20 -0
- data/lib/byebug/processors/post_mortem_processor.rb +16 -0
- data/lib/byebug/processors/script_processor.rb +49 -0
- data/lib/byebug/remote.rb +13 -7
- data/lib/byebug/runner.rb +39 -65
- data/lib/byebug/setting.rb +4 -1
- data/lib/byebug/settings/post_mortem.rb +0 -16
- data/lib/byebug/settings/savefile.rb +1 -4
- data/lib/byebug/subcommands.rb +27 -29
- data/lib/byebug/version.rb +4 -1
- metadata +14 -29
- data/lib/byebug/commands/eval.rb +0 -43
- data/lib/byebug/commands/info/args.rb +0 -39
- data/lib/byebug/commands/info/catch.rb +0 -39
- data/lib/byebug/commands/pp.rb +0 -41
- data/lib/byebug/commands/putl.rb +0 -43
- data/lib/byebug/processor.rb +0 -43
- data/lib/byebug/processors/control_command_processor.rb +0 -48
- data/lib/byebug/settings/verbose.rb +0 -20
- data/lib/byebug/state.rb +0 -12
- data/lib/byebug/states/control_state.rb +0 -26
- data/lib/byebug/states/regular_state.rb +0 -187
- data/lib/byebug/subcommand_list.rb +0 -33
@@ -5,14 +5,28 @@ module Byebug
|
|
5
5
|
# Show (and possibily stop) at every line that changes a global variable.
|
6
6
|
#
|
7
7
|
class TracevarCommand < Command
|
8
|
-
self.
|
9
|
-
|
10
|
-
def regexp
|
8
|
+
def self.regexp
|
11
9
|
/^\s* tr(?:acevar)? (?: \s+ (\S+))? # (variable-name)?
|
12
10
|
(?: \s+ (stop|nostop))?
|
13
11
|
\s*$/x
|
14
12
|
end
|
15
13
|
|
14
|
+
def self.description
|
15
|
+
<<-EOD
|
16
|
+
tr[acevar] <variable> [[no]stop]
|
17
|
+
|
18
|
+
#{short_description}
|
19
|
+
|
20
|
+
If "stop" is specified, execution will stop every time the variable
|
21
|
+
changes its value. If nothing or "nostop" is specified, execution won't
|
22
|
+
stop, changes will just be logged in byebug's output.
|
23
|
+
EOD
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.short_description
|
27
|
+
'Enables tracing of a global variable'
|
28
|
+
end
|
29
|
+
|
16
30
|
def execute
|
17
31
|
var = @match[1]
|
18
32
|
return errmsg(pr('trace.errors.needs_global_variable')) unless var
|
@@ -30,22 +44,12 @@ module Byebug
|
|
30
44
|
puts pr('trace.messages.success', var: var)
|
31
45
|
end
|
32
46
|
|
47
|
+
private
|
48
|
+
|
33
49
|
def on_change(name, value, stop)
|
34
50
|
puts pr('trace.messages.on_change', name: name, value: value)
|
35
51
|
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def description
|
40
|
-
<<-EOD
|
41
|
-
tr[acevar] <variable> [[no]stop]
|
42
|
-
|
43
|
-
Start tracing variable <variable>.
|
44
|
-
|
45
|
-
If "stop" is specified, execution will stop every time the variable
|
46
|
-
changes its value. If nothing or "nostop" is specified, execution won't
|
47
|
-
stop, changes will just be logged in byebug's output.
|
48
|
-
EOD
|
52
|
+
context.step_out(1, false) if stop
|
49
53
|
end
|
50
54
|
end
|
51
55
|
end
|
@@ -8,39 +8,43 @@ module Byebug
|
|
8
8
|
class UndisplayCommand < Command
|
9
9
|
include Helpers::ParseHelper
|
10
10
|
|
11
|
-
self.allow_in_post_mortem =
|
11
|
+
self.allow_in_post_mortem = true
|
12
12
|
|
13
|
-
def regexp
|
13
|
+
def self.regexp
|
14
14
|
/^\s* undisp(?:lay)? (?:\s+(\S+))? \s*$/x
|
15
15
|
end
|
16
16
|
|
17
|
+
def self.description
|
18
|
+
<<-EOD
|
19
|
+
undisp[lay][ nnn]
|
20
|
+
|
21
|
+
#{short_description}
|
22
|
+
|
23
|
+
Arguments are the code numbers of the expressions to stop displaying. No
|
24
|
+
argument means cancel all automatic-display expressions. Type "info
|
25
|
+
display" to see the current list of code numbers.
|
26
|
+
EOD
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.short_description
|
30
|
+
'Stops displaying all or some expressions when program stops'
|
31
|
+
end
|
32
|
+
|
17
33
|
def execute
|
18
34
|
if @match[1]
|
19
|
-
pos, err = get_int(@match[1], 'Undisplay', 1,
|
35
|
+
pos, err = get_int(@match[1], 'Undisplay', 1, Byebug.displays.size)
|
20
36
|
return errmsg(err) unless err.nil?
|
21
37
|
|
22
|
-
unless
|
38
|
+
unless Byebug.displays[pos - 1]
|
23
39
|
return errmsg(pr('display.errors.undefined', expr: pos))
|
24
40
|
end
|
25
41
|
|
26
|
-
|
42
|
+
Byebug.displays[pos - 1][0] = nil
|
27
43
|
else
|
28
44
|
return unless confirm(pr('display.confirmations.clear_all'))
|
29
45
|
|
30
|
-
|
46
|
+
Byebug.displays.each { |d| d[0] = false }
|
31
47
|
end
|
32
48
|
end
|
33
|
-
|
34
|
-
def description
|
35
|
-
<<-EOD
|
36
|
-
undisp[lay][ nnn]
|
37
|
-
|
38
|
-
Cancel some expressions to be displayed when program stops. Arguments
|
39
|
-
are the code numbers of the expressions to stop displaying. No argument
|
40
|
-
means cancel all automatic-display expressions. "delete display" has the
|
41
|
-
same effect as this command. Do "info display" to see the current list
|
42
|
-
of code numbers.
|
43
|
-
EOD
|
44
|
-
end
|
45
49
|
end
|
46
50
|
end
|
@@ -5,12 +5,22 @@ module Byebug
|
|
5
5
|
# Stop tracing a global variable.
|
6
6
|
#
|
7
7
|
class UntracevarCommand < Command
|
8
|
-
self.
|
9
|
-
|
10
|
-
def regexp
|
8
|
+
def self.regexp
|
11
9
|
/^\s* untr(?:acevar)? (?:\s+ (\S+))? \s*$/x
|
12
10
|
end
|
13
11
|
|
12
|
+
def self.description
|
13
|
+
<<-EOD
|
14
|
+
untr[acevar] <variable>
|
15
|
+
|
16
|
+
#{short_description}
|
17
|
+
EOD
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.short_description
|
21
|
+
'Stops tracing a global variable'
|
22
|
+
end
|
23
|
+
|
14
24
|
def execute
|
15
25
|
var = @match[1]
|
16
26
|
if global_variables.include?(:"#{var}")
|
@@ -20,13 +30,5 @@ module Byebug
|
|
20
30
|
errmsg pr('trace.errors.not_global', var: var)
|
21
31
|
end
|
22
32
|
end
|
23
|
-
|
24
|
-
def description
|
25
|
-
<<-EOD
|
26
|
-
untr[acevar] <variable>
|
27
|
-
|
28
|
-
Stop tracing global variable <variable>.
|
29
|
-
EOD
|
30
|
-
end
|
31
33
|
end
|
32
34
|
end
|
data/lib/byebug/commands/up.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require 'pathname'
|
4
2
|
require 'byebug/command'
|
5
3
|
require 'byebug/helpers/frame'
|
@@ -13,27 +11,33 @@ module Byebug
|
|
13
11
|
include Helpers::FrameHelper
|
14
12
|
include Helpers::ParseHelper
|
15
13
|
|
16
|
-
|
17
|
-
/^\s* u(?:p)? (?:\s+(\S+))? \s*$/x
|
18
|
-
end
|
14
|
+
self.allow_in_post_mortem = true
|
19
15
|
|
20
|
-
def
|
21
|
-
|
22
|
-
return errmsg(err) unless pos
|
23
|
-
|
24
|
-
adjust_frame(pos, false)
|
25
|
-
|
26
|
-
ListCommand.new(@state).execute if Setting[:autolist]
|
16
|
+
def self.regexp
|
17
|
+
/^\s* u(?:p)? (?:\s+(\S+))? \s*$/x
|
27
18
|
end
|
28
19
|
|
29
|
-
def description
|
20
|
+
def self.description
|
30
21
|
<<-EOD
|
31
22
|
up[ count]
|
32
23
|
|
33
|
-
|
24
|
+
#{short_description}
|
34
25
|
|
35
26
|
Use the "bt" command to find out where you want to go.
|
36
27
|
EOD
|
37
28
|
end
|
29
|
+
|
30
|
+
def self.short_description
|
31
|
+
'Moves to a higher frame in the stack trace'
|
32
|
+
end
|
33
|
+
|
34
|
+
def execute
|
35
|
+
pos, err = parse_steps(@match[1], 'Up')
|
36
|
+
return errmsg(err) unless pos
|
37
|
+
|
38
|
+
jump_frames(pos)
|
39
|
+
|
40
|
+
ListCommand.new(processor).execute if Setting[:autolist]
|
41
|
+
end
|
38
42
|
end
|
39
43
|
end
|
data/lib/byebug/commands/var.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'byebug/subcommands'
|
2
2
|
|
3
3
|
require 'byebug/commands/var/all'
|
4
|
+
require 'byebug/commands/var/args'
|
4
5
|
require 'byebug/commands/var/const'
|
5
6
|
require 'byebug/commands/var/instance'
|
6
7
|
require 'byebug/commands/var/local'
|
@@ -13,16 +14,22 @@ module Byebug
|
|
13
14
|
class VarCommand < Command
|
14
15
|
include Subcommands
|
15
16
|
|
16
|
-
|
17
|
+
self.allow_in_post_mortem = true
|
18
|
+
|
19
|
+
def self.regexp
|
17
20
|
/^\s* v(?:ar)? (?:\s+ (.+))? \s*$/x
|
18
21
|
end
|
19
22
|
|
20
|
-
def description
|
23
|
+
def self.description
|
21
24
|
<<-EOD
|
22
25
|
[v]ar <subcommand>
|
23
26
|
|
24
|
-
|
27
|
+
#{short_description}
|
25
28
|
EOD
|
26
29
|
end
|
30
|
+
|
31
|
+
def self.short_description
|
32
|
+
'Shows variables and its values'
|
33
|
+
end
|
27
34
|
end
|
28
35
|
end
|
@@ -8,30 +8,32 @@ module Byebug
|
|
8
8
|
#
|
9
9
|
# Shows global, instance and local variables
|
10
10
|
#
|
11
|
-
class
|
11
|
+
class AllCommand < Command
|
12
12
|
include Helpers::VarHelper
|
13
13
|
|
14
|
-
|
15
|
-
/^\s* a(?:ll)? \s*$/x
|
16
|
-
end
|
17
|
-
|
18
|
-
def execute
|
19
|
-
var_global
|
20
|
-
var_instance('self')
|
21
|
-
var_local
|
22
|
-
end
|
14
|
+
self.allow_in_post_mortem = true
|
23
15
|
|
24
|
-
def
|
25
|
-
|
16
|
+
def self.regexp
|
17
|
+
/^\s* a(?:ll)? \s*$/x
|
26
18
|
end
|
27
19
|
|
28
|
-
def description
|
20
|
+
def self.description
|
29
21
|
<<-EOD
|
30
22
|
v[ar] a[ll]
|
31
23
|
|
32
24
|
#{short_description}
|
33
25
|
EOD
|
34
26
|
end
|
27
|
+
|
28
|
+
def self.short_description
|
29
|
+
'Shows local, global and instance variables of self.'
|
30
|
+
end
|
31
|
+
|
32
|
+
def execute
|
33
|
+
var_global
|
34
|
+
var_instance('self')
|
35
|
+
var_local
|
36
|
+
end
|
35
37
|
end
|
36
38
|
end
|
37
39
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'byebug/helpers/var'
|
2
|
+
|
3
|
+
module Byebug
|
4
|
+
#
|
5
|
+
# Reopens the +var+ command to define the +args+ subcommand
|
6
|
+
#
|
7
|
+
class VarCommand < Command
|
8
|
+
#
|
9
|
+
# Information about arguments of the current method/block
|
10
|
+
#
|
11
|
+
class ArgsCommand < Command
|
12
|
+
include Helpers::VarHelper
|
13
|
+
|
14
|
+
self.allow_in_post_mortem = true
|
15
|
+
|
16
|
+
def self.regexp
|
17
|
+
/^\s* a(?:rgs)? \s*$/x
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.description
|
21
|
+
<<-EOD
|
22
|
+
v[ar] a[args]
|
23
|
+
|
24
|
+
#{short_description}
|
25
|
+
EOD
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.short_description
|
29
|
+
'Information about arguments of the current scope'
|
30
|
+
end
|
31
|
+
|
32
|
+
def execute
|
33
|
+
var_args
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'byebug/helpers/eval'
|
2
|
+
|
1
3
|
module Byebug
|
2
4
|
#
|
3
5
|
# Reopens the +var+ command to define the +const+ subcommand
|
@@ -6,32 +8,41 @@ module Byebug
|
|
6
8
|
#
|
7
9
|
# Shows constants
|
8
10
|
#
|
9
|
-
class
|
10
|
-
|
11
|
+
class ConstCommand < Command
|
12
|
+
include Helpers::EvalHelper
|
13
|
+
|
14
|
+
self.allow_in_post_mortem = true
|
15
|
+
|
16
|
+
def self.regexp
|
11
17
|
/^\s* c(?:onst)? (?:\s+ (.+))? \s*$/x
|
12
18
|
end
|
13
19
|
|
20
|
+
def self.description
|
21
|
+
<<-EOD
|
22
|
+
v[ar] c[onstant]
|
23
|
+
|
24
|
+
#{short_description}
|
25
|
+
EOD
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.short_description
|
29
|
+
'Shows constants of an object.'
|
30
|
+
end
|
31
|
+
|
14
32
|
def execute
|
15
|
-
|
16
|
-
obj = bb_warning_eval(str_obj)
|
33
|
+
obj = single_thread_eval(str_obj)
|
17
34
|
unless obj.is_a?(Module)
|
18
35
|
return errmsg(pr('variable.errors.not_module', object: str_obj))
|
19
36
|
end
|
20
37
|
|
21
|
-
constants =
|
38
|
+
constants = single_thread_eval("#{str_obj}.constants")
|
22
39
|
puts prv(constants.sort.map { |c| [c, obj.const_get(c)] }, 'constant')
|
23
40
|
end
|
24
41
|
|
25
|
-
|
26
|
-
'Shows constants of an object.'
|
27
|
-
end
|
28
|
-
|
29
|
-
def description
|
30
|
-
<<-EOD
|
31
|
-
v[ar] c[onstant]
|
42
|
+
private
|
32
43
|
|
33
|
-
|
34
|
-
|
44
|
+
def str_obj
|
45
|
+
@str_obj ||= @match[1] || 'self.class'
|
35
46
|
end
|
36
47
|
end
|
37
48
|
end
|
@@ -6,28 +6,30 @@ module Byebug
|
|
6
6
|
#
|
7
7
|
# Shows global variables
|
8
8
|
#
|
9
|
-
class
|
9
|
+
class GlobalCommand < Command
|
10
10
|
include Helpers::VarHelper
|
11
11
|
|
12
|
-
|
13
|
-
/^\s* g(?:lobal)? \s*$/x
|
14
|
-
end
|
15
|
-
|
16
|
-
def execute
|
17
|
-
var_global
|
18
|
-
end
|
12
|
+
self.allow_in_post_mortem = true
|
19
13
|
|
20
|
-
def
|
21
|
-
|
14
|
+
def self.regexp
|
15
|
+
/^\s* g(?:lobal)? \s*$/x
|
22
16
|
end
|
23
17
|
|
24
|
-
def description
|
18
|
+
def self.description
|
25
19
|
<<-EOD
|
26
20
|
v[ar] g[lobal]
|
27
21
|
|
28
22
|
#{short_description}
|
29
23
|
EOD
|
30
24
|
end
|
25
|
+
|
26
|
+
def self.short_description
|
27
|
+
'Shows global variables.'
|
28
|
+
end
|
29
|
+
|
30
|
+
def execute
|
31
|
+
var_global
|
32
|
+
end
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
@@ -8,28 +8,30 @@ module Byebug
|
|
8
8
|
#
|
9
9
|
# Shows instance variables
|
10
10
|
#
|
11
|
-
class
|
11
|
+
class InstanceCommand < Command
|
12
12
|
include Helpers::VarHelper
|
13
13
|
|
14
|
-
|
15
|
-
/^\s* i(?:nstance)? (?:\s+ (.+))? \s*$/x
|
16
|
-
end
|
17
|
-
|
18
|
-
def execute
|
19
|
-
var_instance(@match[1])
|
20
|
-
end
|
14
|
+
self.allow_in_post_mortem = true
|
21
15
|
|
22
|
-
def
|
23
|
-
|
16
|
+
def self.regexp
|
17
|
+
/^\s* i(?:nstance)? (?:\s+ (.+))? \s*$/x
|
24
18
|
end
|
25
19
|
|
26
|
-
def description
|
20
|
+
def self.description
|
27
21
|
<<-EOD
|
28
22
|
v[ar] i[nstance][ <object>]
|
29
23
|
|
30
24
|
#{short_description}
|
31
25
|
EOD
|
32
26
|
end
|
27
|
+
|
28
|
+
def self.short_description
|
29
|
+
'Shows instance variables of self or a specific object.'
|
30
|
+
end
|
31
|
+
|
32
|
+
def execute
|
33
|
+
var_instance(@match[1])
|
34
|
+
end
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|