byebug 4.0.5 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +72 -34
- data/CONTRIBUTING.md +26 -31
- data/README.md +3 -3
- data/lib/byebug/breakpoint.rb +2 -1
- data/lib/byebug/command.rb +27 -49
- data/lib/byebug/commands/break.rb +21 -15
- data/lib/byebug/commands/catch.rb +9 -15
- data/lib/byebug/commands/condition.rb +12 -15
- data/lib/byebug/commands/continue.rb +8 -11
- data/lib/byebug/commands/delete.rb +9 -12
- data/lib/byebug/commands/disable.rb +32 -0
- data/lib/byebug/commands/disable/breakpoints.rb +38 -0
- data/lib/byebug/commands/disable/display.rb +39 -0
- data/lib/byebug/commands/display.rb +18 -51
- data/lib/byebug/commands/down.rb +39 -0
- data/lib/byebug/commands/edit.rb +8 -14
- data/lib/byebug/commands/enable.rb +25 -0
- data/lib/byebug/commands/enable/breakpoints.rb +38 -0
- data/lib/byebug/commands/enable/display.rb +39 -0
- data/lib/byebug/commands/eval.rb +10 -192
- data/lib/byebug/commands/finish.rb +11 -12
- data/lib/byebug/commands/frame.rb +17 -182
- data/lib/byebug/commands/help.rb +18 -18
- data/lib/byebug/commands/history.rb +9 -10
- data/lib/byebug/commands/info.rb +17 -190
- data/lib/byebug/commands/info/args.rb +39 -0
- data/lib/byebug/commands/info/breakpoints.rb +59 -0
- data/lib/byebug/commands/info/catch.rb +39 -0
- data/lib/byebug/commands/info/display.rb +42 -0
- data/lib/byebug/commands/info/file.rb +81 -0
- data/lib/byebug/commands/info/line.rb +31 -0
- data/lib/byebug/commands/info/program.rb +51 -0
- data/lib/byebug/commands/interrupt.rb +5 -9
- data/lib/byebug/commands/irb.rb +5 -9
- data/lib/byebug/commands/kill.rb +6 -12
- data/lib/byebug/commands/list.rb +47 -19
- data/lib/byebug/commands/method.rb +8 -14
- data/lib/byebug/commands/next.rb +36 -0
- data/lib/byebug/commands/pp.rb +41 -0
- data/lib/byebug/commands/pry.rb +5 -9
- data/lib/byebug/commands/ps.rb +44 -0
- data/lib/byebug/commands/putl.rb +43 -0
- data/lib/byebug/commands/quit.rb +8 -12
- data/lib/byebug/commands/restart.rb +6 -12
- data/lib/byebug/commands/save.rb +30 -39
- data/lib/byebug/commands/set.rb +19 -21
- data/lib/byebug/commands/show.rb +10 -16
- data/lib/byebug/commands/source.rb +6 -12
- data/lib/byebug/commands/step.rb +36 -0
- data/lib/byebug/commands/thread.rb +13 -130
- data/lib/byebug/commands/thread/current.rb +35 -0
- data/lib/byebug/commands/thread/list.rb +41 -0
- data/lib/byebug/commands/thread/resume.rb +45 -0
- data/lib/byebug/commands/thread/stop.rb +41 -0
- data/lib/byebug/commands/thread/switch.rb +43 -0
- data/lib/byebug/commands/tracevar.rb +8 -14
- data/lib/byebug/commands/undisplay.rb +12 -15
- data/lib/byebug/commands/untracevar.rb +5 -11
- data/lib/byebug/commands/up.rb +39 -0
- data/lib/byebug/commands/var.rb +15 -94
- data/lib/byebug/commands/var/all.rb +37 -0
- data/lib/byebug/commands/var/const.rb +38 -0
- data/lib/byebug/commands/var/global.rb +33 -0
- data/lib/byebug/commands/var/instance.rb +35 -0
- data/lib/byebug/commands/var/local.rb +35 -0
- data/lib/byebug/commands/where.rb +47 -0
- data/lib/byebug/core.rb +10 -0
- data/lib/byebug/helpers/eval.rb +47 -0
- data/lib/byebug/helpers/file.rb +46 -0
- data/lib/byebug/helpers/frame.rb +76 -0
- data/lib/byebug/helpers/parse.rb +74 -0
- data/lib/byebug/helpers/string.rb +24 -0
- data/lib/byebug/helpers/thread.rb +53 -0
- data/lib/byebug/helpers/toggle.rb +56 -0
- data/lib/byebug/helpers/var.rb +45 -0
- data/lib/byebug/history.rb +2 -4
- data/lib/byebug/interface.rb +5 -3
- data/lib/byebug/interfaces/local_interface.rb +3 -1
- data/lib/byebug/interfaces/remote_interface.rb +3 -1
- data/lib/byebug/interfaces/test_interface.rb +6 -2
- data/lib/byebug/printers/plain.rb +1 -1
- data/lib/byebug/processors/command_processor.rb +9 -11
- data/lib/byebug/processors/control_command_processor.rb +1 -1
- data/lib/byebug/remote.rb +3 -0
- data/lib/byebug/runner.rb +5 -3
- data/lib/byebug/setting.rb +2 -18
- data/lib/byebug/settings/savefile.rb +21 -0
- data/lib/byebug/states/regular_state.rb +15 -6
- data/lib/byebug/subcommand_list.rb +33 -0
- data/lib/byebug/subcommands.rb +53 -0
- data/lib/byebug/version.rb +1 -1
- metadata +45 -6
- data/lib/byebug/commands/enable_disable.rb +0 -132
- data/lib/byebug/commands/stepping.rb +0 -75
- data/lib/byebug/helper.rb +0 -131
@@ -21,18 +21,12 @@ module Byebug
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
def description
|
30
|
-
prettify <<-EOD
|
31
|
-
untr[acevar] <variable>
|
24
|
+
def description
|
25
|
+
<<-EOD
|
26
|
+
untr[acevar] <variable>
|
32
27
|
|
33
|
-
|
34
|
-
|
35
|
-
end
|
28
|
+
Stop tracing global variable <variable>.
|
29
|
+
EOD
|
36
30
|
end
|
37
31
|
end
|
38
32
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
require 'byebug/command'
|
5
|
+
require 'byebug/helpers/frame'
|
6
|
+
require 'byebug/helpers/parse'
|
7
|
+
|
8
|
+
module Byebug
|
9
|
+
#
|
10
|
+
# Move the current frame up in the backtrace.
|
11
|
+
#
|
12
|
+
class UpCommand < Command
|
13
|
+
include Helpers::FrameHelper
|
14
|
+
include Helpers::ParseHelper
|
15
|
+
|
16
|
+
def regexp
|
17
|
+
/^\s* u(?:p)? (?:\s+(\S+))? \s*$/x
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute
|
21
|
+
pos, err = parse_steps(@match[1], 'Up')
|
22
|
+
return errmsg(err) unless pos
|
23
|
+
|
24
|
+
adjust_frame(pos, false)
|
25
|
+
|
26
|
+
ListCommand.new(@state).execute if Setting[:autolist]
|
27
|
+
end
|
28
|
+
|
29
|
+
def description
|
30
|
+
<<-EOD
|
31
|
+
up[ count]
|
32
|
+
|
33
|
+
Move to a higher frame in the stack trace.
|
34
|
+
|
35
|
+
Use the "bt" command to find out where you want to go.
|
36
|
+
EOD
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/byebug/commands/var.rb
CHANGED
@@ -1,107 +1,28 @@
|
|
1
|
-
require 'byebug/
|
1
|
+
require 'byebug/subcommands'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
def var_list(ary, b = get_binding)
|
9
|
-
vars = ary.sort.map do |v|
|
10
|
-
s = begin
|
11
|
-
b.eval(v.to_s).inspect
|
12
|
-
rescue
|
13
|
-
begin
|
14
|
-
b.eval(v.to_s).to_s
|
15
|
-
rescue
|
16
|
-
'*Error in evaluation*'
|
17
|
-
end
|
18
|
-
end
|
19
|
-
[v, s]
|
20
|
-
end
|
21
|
-
puts prv(vars)
|
22
|
-
end
|
23
|
-
|
24
|
-
def var_global(_str = nil)
|
25
|
-
globals = global_variables.reject do |v|
|
26
|
-
[:$IGNORECASE, :$=, :$KCODE, :$-K, :$binding].include?(v)
|
27
|
-
end
|
28
|
-
|
29
|
-
var_list(globals)
|
30
|
-
end
|
31
|
-
|
32
|
-
def var_instance(str)
|
33
|
-
obj = bb_warning_eval(str || 'self')
|
34
|
-
var_list(obj.instance_variables, obj.instance_eval { binding })
|
35
|
-
end
|
36
|
-
|
37
|
-
def var_constant(str)
|
38
|
-
str ||= 'self.class'
|
39
|
-
obj = bb_warning_eval(str)
|
40
|
-
is_mod = obj.is_a?(Module)
|
41
|
-
return errmsg(pr('variable.errors.not_module', object: str)) unless is_mod
|
42
|
-
|
43
|
-
constants = bb_eval("#{str}.constants")
|
44
|
-
puts prv(constants.sort.map { |c| [c, obj.const_get(c)] })
|
45
|
-
end
|
46
|
-
|
47
|
-
def var_local(_str = nil)
|
48
|
-
_self = @state.context.frame_self(@state.frame)
|
49
|
-
locals = @state.context.frame_locals
|
50
|
-
puts prv(locals.keys.sort.map { |k| [k, locals[k]] })
|
51
|
-
end
|
52
|
-
|
53
|
-
def var_all(_str = nil)
|
54
|
-
var_global
|
55
|
-
var_instance('self')
|
56
|
-
var_local
|
57
|
-
end
|
58
|
-
end
|
3
|
+
require 'byebug/commands/var/all'
|
4
|
+
require 'byebug/commands/var/const'
|
5
|
+
require 'byebug/commands/var/instance'
|
6
|
+
require 'byebug/commands/var/local'
|
7
|
+
require 'byebug/commands/var/global'
|
59
8
|
|
9
|
+
module Byebug
|
60
10
|
#
|
61
|
-
#
|
11
|
+
# Shows variables and its values
|
62
12
|
#
|
63
13
|
class VarCommand < Command
|
64
|
-
include
|
65
|
-
|
66
|
-
Subcommands = [
|
67
|
-
['constant', 2, 'Show constants of an object'],
|
68
|
-
['global', 1, 'Show global variables'],
|
69
|
-
['instance', 1, 'Show instance variables of self or a specific object'],
|
70
|
-
['local', 1, 'Show local variables in current scope'],
|
71
|
-
['all', 1, 'Shows local, global and instance variables of self']
|
72
|
-
].map do |name, min, help|
|
73
|
-
Subcmd.new(name, min, help)
|
74
|
-
end
|
14
|
+
include Subcommands
|
75
15
|
|
76
16
|
def regexp
|
77
|
-
/^\s* v(?:ar)? (
|
78
|
-
end
|
79
|
-
|
80
|
-
def execute
|
81
|
-
return puts(self.class.help) unless @match[1]
|
82
|
-
|
83
|
-
subcmd = Command.find(Subcommands, @match[1])
|
84
|
-
return errmsg("Unknown var command #{@match[1]}\n") unless subcmd
|
85
|
-
|
86
|
-
if @state.context
|
87
|
-
send("var_#{subcmd.name}", @match[2])
|
88
|
-
else
|
89
|
-
errmsg "'var #{subcmd.name}' not available without a context.\n"
|
90
|
-
end
|
17
|
+
/^\s* v(?:ar)? (?:\s+ (.+))? \s*$/x
|
91
18
|
end
|
92
19
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
end
|
97
|
-
|
98
|
-
def description
|
99
|
-
prettify <<-EOD
|
100
|
-
[v]ar
|
20
|
+
def description
|
21
|
+
<<-EOD
|
22
|
+
[v]ar <subcommand>
|
101
23
|
|
102
|
-
|
103
|
-
|
104
|
-
end
|
24
|
+
Shows variables and its values.
|
25
|
+
EOD
|
105
26
|
end
|
106
27
|
end
|
107
28
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'byebug/helpers/var'
|
2
|
+
|
3
|
+
module Byebug
|
4
|
+
#
|
5
|
+
# Reopens the +var+ command to define the +all+ subcommand
|
6
|
+
#
|
7
|
+
class VarCommand < Command
|
8
|
+
#
|
9
|
+
# Shows global, instance and local variables
|
10
|
+
#
|
11
|
+
class AllSubcommand < Command
|
12
|
+
include Helpers::VarHelper
|
13
|
+
|
14
|
+
def regexp
|
15
|
+
/^\s* a(?:ll)? \s*$/x
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute
|
19
|
+
var_global
|
20
|
+
var_instance('self')
|
21
|
+
var_local
|
22
|
+
end
|
23
|
+
|
24
|
+
def short_description
|
25
|
+
'Shows local, global and instance variables of self.'
|
26
|
+
end
|
27
|
+
|
28
|
+
def description
|
29
|
+
<<-EOD
|
30
|
+
v[ar] a[ll]
|
31
|
+
|
32
|
+
#{short_description}
|
33
|
+
EOD
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Byebug
|
2
|
+
#
|
3
|
+
# Reopens the +var+ command to define the +const+ subcommand
|
4
|
+
#
|
5
|
+
class VarCommand < Command
|
6
|
+
#
|
7
|
+
# Shows constants
|
8
|
+
#
|
9
|
+
class ConstSubcommand < Command
|
10
|
+
def regexp
|
11
|
+
/^\s* c(?:onst)? (?:\s+ (.+))? \s*$/x
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute
|
15
|
+
str_obj = @match[1] || 'self.class'
|
16
|
+
obj = bb_warning_eval(str_obj)
|
17
|
+
unless obj.is_a?(Module)
|
18
|
+
return errmsg(pr('variable.errors.not_module', object: str_obj))
|
19
|
+
end
|
20
|
+
|
21
|
+
constants = bb_eval("#{str_obj}.constants")
|
22
|
+
puts prv(constants.sort.map { |c| [c, obj.const_get(c)] }, 'constant')
|
23
|
+
end
|
24
|
+
|
25
|
+
def short_description
|
26
|
+
'Shows constants of an object.'
|
27
|
+
end
|
28
|
+
|
29
|
+
def description
|
30
|
+
<<-EOD
|
31
|
+
v[ar] c[onstant]
|
32
|
+
|
33
|
+
#{short_description}
|
34
|
+
EOD
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Byebug
|
2
|
+
#
|
3
|
+
# Reopens the +var+ command to define the +global+ subcommand
|
4
|
+
#
|
5
|
+
class VarCommand < Command
|
6
|
+
#
|
7
|
+
# Shows global variables
|
8
|
+
#
|
9
|
+
class GlobalSubcommand < Command
|
10
|
+
include Helpers::VarHelper
|
11
|
+
|
12
|
+
def regexp
|
13
|
+
/^\s* g(?:lobal)? \s*$/x
|
14
|
+
end
|
15
|
+
|
16
|
+
def execute
|
17
|
+
var_global
|
18
|
+
end
|
19
|
+
|
20
|
+
def short_description
|
21
|
+
'Shows global variables.'
|
22
|
+
end
|
23
|
+
|
24
|
+
def description
|
25
|
+
<<-EOD
|
26
|
+
v[ar] g[lobal]
|
27
|
+
|
28
|
+
#{short_description}
|
29
|
+
EOD
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'byebug/helpers/var'
|
2
|
+
|
3
|
+
module Byebug
|
4
|
+
#
|
5
|
+
# Reopens the +var+ command to define the +instance+ subcommand
|
6
|
+
#
|
7
|
+
class VarCommand < Command
|
8
|
+
#
|
9
|
+
# Shows instance variables
|
10
|
+
#
|
11
|
+
class InstanceSubcommand < Command
|
12
|
+
include Helpers::VarHelper
|
13
|
+
|
14
|
+
def regexp
|
15
|
+
/^\s* i(?:nstance)? (?:\s+ (.+))? \s*$/x
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute
|
19
|
+
var_instance(@match[1])
|
20
|
+
end
|
21
|
+
|
22
|
+
def short_description
|
23
|
+
'Shows instance variables of self or a specific object.'
|
24
|
+
end
|
25
|
+
|
26
|
+
def description
|
27
|
+
<<-EOD
|
28
|
+
v[ar] i[nstance][ <object>]
|
29
|
+
|
30
|
+
#{short_description}
|
31
|
+
EOD
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'byebug/helpers/var'
|
2
|
+
|
3
|
+
module Byebug
|
4
|
+
#
|
5
|
+
# Reopens the +var+ command to define the +local+ subcommand
|
6
|
+
#
|
7
|
+
class VarCommand < Command
|
8
|
+
#
|
9
|
+
# Shows local variables in current scope
|
10
|
+
#
|
11
|
+
class LocalSubcommand < Command
|
12
|
+
include Helpers::VarHelper
|
13
|
+
|
14
|
+
def regexp
|
15
|
+
/^\s* l(?:ocal)? \s*$/x
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute
|
19
|
+
var_local
|
20
|
+
end
|
21
|
+
|
22
|
+
def short_description
|
23
|
+
'Shows local variables in current scope.'
|
24
|
+
end
|
25
|
+
|
26
|
+
def description
|
27
|
+
<<-EOD
|
28
|
+
v[ar] l[ocal]
|
29
|
+
|
30
|
+
#{short_description}
|
31
|
+
EOD
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
require 'byebug/command'
|
5
|
+
require 'byebug/helpers/frame'
|
6
|
+
|
7
|
+
module Byebug
|
8
|
+
#
|
9
|
+
# Show current backtrace.
|
10
|
+
#
|
11
|
+
class WhereCommand < Command
|
12
|
+
include Helpers::FrameHelper
|
13
|
+
|
14
|
+
def regexp
|
15
|
+
/^\s* (?:w(?:here)?|bt|backtrace) \s*$/x
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute
|
19
|
+
print_backtrace
|
20
|
+
end
|
21
|
+
|
22
|
+
def description
|
23
|
+
<<-EOD
|
24
|
+
w[here]|bt|backtrace
|
25
|
+
|
26
|
+
Display stack frames.
|
27
|
+
|
28
|
+
Print the entire stack frame. Each frame is numbered; the most recent
|
29
|
+
frame is 0. A frame number can be referred to in the "frame" command.
|
30
|
+
"up" and "down" add or subtract respectively to frame numbers shown.
|
31
|
+
The position of the current frame is marked with -->. C-frames hang
|
32
|
+
from their most immediate Ruby frame to indicate that they are not
|
33
|
+
navigable.
|
34
|
+
EOD
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def print_backtrace
|
40
|
+
bt = prc('frame.line', (0...@state.context.stack_size)) do |_, index|
|
41
|
+
get_pr_arguments(index)
|
42
|
+
end
|
43
|
+
|
44
|
+
print(bt)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/byebug/core.rb
CHANGED
@@ -55,6 +55,16 @@ module Byebug
|
|
55
55
|
run_script(cwd_rc) if File.exist?(cwd_rc) && cwd_rc != home_rc
|
56
56
|
end
|
57
57
|
|
58
|
+
#
|
59
|
+
# A Byebug command is a class defined right under the Byebug module and
|
60
|
+
# named <something>Command
|
61
|
+
#
|
62
|
+
def commands
|
63
|
+
const_list = constants.map { |const| const_get(const, false) }
|
64
|
+
|
65
|
+
const_list.select { |c| c.is_a?(Class) && c.name =~ /[a-z]Command$/ }
|
66
|
+
end
|
67
|
+
|
58
68
|
private
|
59
69
|
|
60
70
|
#
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Byebug
|
2
|
+
module Helpers
|
3
|
+
#
|
4
|
+
# Utilities used by the eval command
|
5
|
+
#
|
6
|
+
module EvalHelper
|
7
|
+
#
|
8
|
+
# Run block temporarily ignoring all TracePoint events.
|
9
|
+
#
|
10
|
+
# Used to evaluate stuff within Byebug's prompt. Otherwise, any code
|
11
|
+
# creating new threads won't be properly evaluated because new threads
|
12
|
+
# will get blocked by byebug's main thread.
|
13
|
+
#
|
14
|
+
def allowing_other_threads
|
15
|
+
Byebug.unlock
|
16
|
+
res = yield
|
17
|
+
Byebug.lock
|
18
|
+
res
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
# Get current binding and yield it to the given block
|
23
|
+
#
|
24
|
+
def run_with_binding
|
25
|
+
binding = get_binding
|
26
|
+
yield binding
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Evaluate +expression+ using +binding+
|
31
|
+
#
|
32
|
+
# @param binding [Binding] Context where to evaluate the expression
|
33
|
+
# @param expression [String] Expression to evaluation
|
34
|
+
# @param stack_on_error [Boolean] Whether to show a stack trace on error.
|
35
|
+
#
|
36
|
+
def eval_with_setting(binding, expression, stack_on_error)
|
37
|
+
allowing_other_threads do
|
38
|
+
if stack_on_error
|
39
|
+
bb_eval(expression, binding)
|
40
|
+
else
|
41
|
+
bb_warning_eval(expression, binding)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|