byebug 0.0.1
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.
- data/.gitignore +10 -0
- data/.travis.yml +8 -0
- data/AUTHORS +10 -0
- data/CHANGELOG.md +2 -0
- data/CONTRIBUTING.md +1 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +5 -0
- data/Rakefile +28 -0
- data/bin/byebug +395 -0
- data/byebug.gemspec +29 -0
- data/doc/hanoi.rb +35 -0
- data/doc/primes.rb +28 -0
- data/doc/rdebug-emacs.texi +1030 -0
- data/doc/test-tri2.rb +18 -0
- data/doc/tri3.rb +8 -0
- data/doc/triangle.rb +12 -0
- data/ext/byebug/breakpoint.c +476 -0
- data/ext/byebug/byebug.c +512 -0
- data/ext/byebug/byebug.h +131 -0
- data/ext/byebug/context.c +424 -0
- data/ext/byebug/extconf.rb +21 -0
- data/ext/byebug/locker.c +53 -0
- data/lib/byebug.rb +404 -0
- data/lib/byebug/command.rb +232 -0
- data/lib/byebug/commands/breakpoints.rb +153 -0
- data/lib/byebug/commands/catchpoint.rb +56 -0
- data/lib/byebug/commands/condition.rb +49 -0
- data/lib/byebug/commands/continue.rb +38 -0
- data/lib/byebug/commands/control.rb +110 -0
- data/lib/byebug/commands/display.rb +122 -0
- data/lib/byebug/commands/edit.rb +48 -0
- data/lib/byebug/commands/enable.rb +202 -0
- data/lib/byebug/commands/eval.rb +176 -0
- data/lib/byebug/commands/finish.rb +43 -0
- data/lib/byebug/commands/frame.rb +303 -0
- data/lib/byebug/commands/help.rb +56 -0
- data/lib/byebug/commands/info.rb +462 -0
- data/lib/byebug/commands/irb.rb +123 -0
- data/lib/byebug/commands/jump.rb +66 -0
- data/lib/byebug/commands/kill.rb +51 -0
- data/lib/byebug/commands/list.rb +94 -0
- data/lib/byebug/commands/method.rb +84 -0
- data/lib/byebug/commands/quit.rb +39 -0
- data/lib/byebug/commands/reload.rb +40 -0
- data/lib/byebug/commands/save.rb +90 -0
- data/lib/byebug/commands/set.rb +210 -0
- data/lib/byebug/commands/show.rb +246 -0
- data/lib/byebug/commands/skip.rb +35 -0
- data/lib/byebug/commands/source.rb +36 -0
- data/lib/byebug/commands/stepping.rb +83 -0
- data/lib/byebug/commands/threads.rb +189 -0
- data/lib/byebug/commands/tmate.rb +36 -0
- data/lib/byebug/commands/trace.rb +56 -0
- data/lib/byebug/commands/variables.rb +199 -0
- data/lib/byebug/context.rb +58 -0
- data/lib/byebug/helper.rb +69 -0
- data/lib/byebug/interface.rb +223 -0
- data/lib/byebug/processor.rb +468 -0
- data/lib/byebug/version.rb +3 -0
- data/man/rdebug.1 +241 -0
- data/test/breakpoints_test.rb +357 -0
- data/test/conditions_test.rb +77 -0
- data/test/continue_test.rb +44 -0
- data/test/display_test.rb +141 -0
- data/test/edit_test.rb +56 -0
- data/test/eval_test.rb +92 -0
- data/test/examples/breakpoint1.rb +15 -0
- data/test/examples/breakpoint2.rb +7 -0
- data/test/examples/conditions.rb +4 -0
- data/test/examples/continue.rb +4 -0
- data/test/examples/display.rb +5 -0
- data/test/examples/edit.rb +3 -0
- data/test/examples/edit2.rb +3 -0
- data/test/examples/eval.rb +4 -0
- data/test/examples/finish.rb +20 -0
- data/test/examples/frame.rb +20 -0
- data/test/examples/frame_threads.rb +31 -0
- data/test/examples/help.rb +2 -0
- data/test/examples/info.rb +38 -0
- data/test/examples/info2.rb +3 -0
- data/test/examples/info_threads.rb +48 -0
- data/test/examples/irb.rb +6 -0
- data/test/examples/jump.rb +14 -0
- data/test/examples/kill.rb +2 -0
- data/test/examples/list.rb +12 -0
- data/test/examples/method.rb +15 -0
- data/test/examples/post_mortem.rb +19 -0
- data/test/examples/quit.rb +2 -0
- data/test/examples/reload.rb +6 -0
- data/test/examples/restart.rb +6 -0
- data/test/examples/save.rb +3 -0
- data/test/examples/set.rb +3 -0
- data/test/examples/set_annotate.rb +12 -0
- data/test/examples/settings.rb +1 -0
- data/test/examples/show.rb +2 -0
- data/test/examples/source.rb +3 -0
- data/test/examples/stepping.rb +21 -0
- data/test/examples/thread.rb +32 -0
- data/test/examples/tmate.rb +10 -0
- data/test/examples/trace.rb +7 -0
- data/test/examples/trace_threads.rb +20 -0
- data/test/examples/variables.rb +26 -0
- data/test/finish_test.rb +48 -0
- data/test/frame_test.rb +143 -0
- data/test/help_test.rb +50 -0
- data/test/info_test.rb +313 -0
- data/test/irb_test.rb +81 -0
- data/test/jump_test.rb +70 -0
- data/test/kill_test.rb +48 -0
- data/test/list_test.rb +145 -0
- data/test/method_test.rb +70 -0
- data/test/post_mortem_test.rb +27 -0
- data/test/quit_test.rb +56 -0
- data/test/reload_test.rb +44 -0
- data/test/restart_test.rb +164 -0
- data/test/save_test.rb +92 -0
- data/test/set_test.rb +177 -0
- data/test/show_test.rb +293 -0
- data/test/source_test.rb +45 -0
- data/test/stepping_test.rb +130 -0
- data/test/support/breakpoint.rb +13 -0
- data/test/support/context.rb +14 -0
- data/test/support/matchers.rb +67 -0
- data/test/support/mocha_extensions.rb +72 -0
- data/test/support/processor.rb +7 -0
- data/test/support/test_dsl.rb +206 -0
- data/test/support/test_interface.rb +68 -0
- data/test/test_helper.rb +10 -0
- data/test/tmate_test.rb +44 -0
- data/test/trace_test.rb +159 -0
- data/test/variables_test.rb +119 -0
- metadata +265 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
module Byebug
|
2
|
+
# Implements byebug "reload" command.
|
3
|
+
class ReloadCommand < Command
|
4
|
+
self.allow_in_control = true
|
5
|
+
|
6
|
+
register_setting_get(:reload_source_on_change) do
|
7
|
+
Byebug.reload_source_on_change
|
8
|
+
end
|
9
|
+
register_setting_set(:reload_source_on_change) do |value|
|
10
|
+
Byebug.reload_source_on_change = value
|
11
|
+
end
|
12
|
+
|
13
|
+
def regexp
|
14
|
+
/^\s*r(?:eload)?$/
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute
|
18
|
+
Byebug.source_reload
|
19
|
+
print "Source code is reloaded. Automatic reloading is #{source_reloading}.\n"
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def source_reloading
|
25
|
+
Byebug.reload_source_on_change ? 'on' : 'off'
|
26
|
+
end
|
27
|
+
|
28
|
+
class << self
|
29
|
+
def help_command
|
30
|
+
'reload'
|
31
|
+
end
|
32
|
+
|
33
|
+
def help(cmd)
|
34
|
+
%{
|
35
|
+
r[eload]\tforces source code reloading
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Byebug
|
2
|
+
module SaveFunctions # :nodoc:
|
3
|
+
|
4
|
+
# Create a temporary file to write in if file is nil
|
5
|
+
def open_save
|
6
|
+
require "tempfile"
|
7
|
+
file = Tempfile.new("rdebug-save")
|
8
|
+
# We want close to not unlink, so redefine.
|
9
|
+
def file.close
|
10
|
+
@tmpfile.close if @tmpfile
|
11
|
+
end
|
12
|
+
return file
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class SaveCommand < Command # :nodoc:
|
17
|
+
self.allow_in_control = true
|
18
|
+
|
19
|
+
def save_breakpoints(file)
|
20
|
+
Byebug.breakpoints.each do |b|
|
21
|
+
file.puts "break #{b.source}:#{b.pos}#{" if #{b.expr}" if b.expr}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def save_catchpoints(file)
|
26
|
+
Byebug.catchpoints.keys.each do |c|
|
27
|
+
file.puts "catch #{c}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def save_displays(file)
|
32
|
+
for d in @state.display
|
33
|
+
if d[0]
|
34
|
+
file.puts "display #{d[1]}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def save_settings(file)
|
40
|
+
# FIXME put routine in set
|
41
|
+
%w(autoeval basename byebugtesting).each do |setting|
|
42
|
+
on_off = show_onoff(Command.settings[setting.to_sym])
|
43
|
+
file.puts "set #{setting} #{on_off}"
|
44
|
+
end
|
45
|
+
%w(autolist autoirb).each do |setting|
|
46
|
+
on_off = show_onoff(Command.settings[setting.to_sym] > 0)
|
47
|
+
file.puts "set #{setting} #{on_off}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def regexp
|
52
|
+
/^\s* sa(?:ve)?
|
53
|
+
(?:\s+(.+))?
|
54
|
+
\s*$/ix
|
55
|
+
end
|
56
|
+
|
57
|
+
def execute
|
58
|
+
if not @match[1] or @match[1].strip.empty?
|
59
|
+
file = open_save()
|
60
|
+
else
|
61
|
+
file = open(@match[1], 'w')
|
62
|
+
end
|
63
|
+
save_breakpoints(file)
|
64
|
+
save_catchpoints(file)
|
65
|
+
# save_displays(file)
|
66
|
+
save_settings(file)
|
67
|
+
print "Saved to '#{file.path}'\n"
|
68
|
+
if @state and @state.interface
|
69
|
+
@state.interface.restart_file = file.path
|
70
|
+
end
|
71
|
+
file.close
|
72
|
+
end
|
73
|
+
|
74
|
+
class << self
|
75
|
+
def help_command
|
76
|
+
'save'
|
77
|
+
end
|
78
|
+
|
79
|
+
def help(cmd)
|
80
|
+
%{
|
81
|
+
save [FILE]
|
82
|
+
Saves current byebug state to FILE as a script file.
|
83
|
+
This includes breakpoints, catchpoints, display expressions and some settings.
|
84
|
+
If no filename is given, we will fabricate one.
|
85
|
+
|
86
|
+
Use the 'source' command in another debug session to restore them.}
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,210 @@
|
|
1
|
+
module Byebug
|
2
|
+
# Implements byebug "set" command.
|
3
|
+
class SetCommand < Command
|
4
|
+
SubcmdStruct2=Struct.new(:name, :min, :is_bool, :short_help,
|
5
|
+
:long_help) unless defined?(SubcmdStruct2)
|
6
|
+
Subcommands =
|
7
|
+
[
|
8
|
+
['annotate', 2, false, "Set annotation level",
|
9
|
+
"0 == normal
|
10
|
+
2 == output annotated suitably for use by programs that control byebug."],
|
11
|
+
['args', 2, false,
|
12
|
+
"Set argument list to give program being debugged when it is started",
|
13
|
+
"Follow this command with any number of args, to be passed to the program."],
|
14
|
+
['autoeval', 4, true, "Evaluate every unrecognized command"],
|
15
|
+
['autolist', 4, true, "Execute 'list' command on every breakpoint"],
|
16
|
+
['autoirb', 4, true, "Invoke IRB on every stop"],
|
17
|
+
['autoreload', 4, true, "Reload source code when changed"],
|
18
|
+
['basename', 1, true, "Report file basename only showing file names"],
|
19
|
+
['callstyle', 2, false, "Set how you want call parameters displayed"],
|
20
|
+
['byebugtesting', 8, false, "Used when testing the byebug"],
|
21
|
+
['forcestep', 2, true,
|
22
|
+
"Make sure 'next/step' commands always move to a new line"],
|
23
|
+
['fullpath', 2, true, "Display full file names in frames"],
|
24
|
+
['history', 2, false,
|
25
|
+
"Generic command for setting command history parameters",
|
26
|
+
"set history filename -- Set the filename in which to record the command history
|
27
|
+
set history save -- Set saving of the history record on exit
|
28
|
+
set history size -- Set the size of the command history"],
|
29
|
+
['linetrace+', 10, true,
|
30
|
+
"Set line execution tracing to show different lines"],
|
31
|
+
['linetrace', 3, true, "Set line execution tracing"],
|
32
|
+
['listsize', 3, false, "Set number of source lines to list by default"],
|
33
|
+
['trace', 1, true, "Display stack trace when 'eval' raises exception"],
|
34
|
+
['width', 1, false,
|
35
|
+
"Number of characters the byebug thinks are in a line"]
|
36
|
+
].map do |name, min, is_bool, short_help, long_help|
|
37
|
+
SubcmdStruct2.new(name, min, is_bool, short_help, long_help)
|
38
|
+
end unless defined?(Subcommands)
|
39
|
+
|
40
|
+
self.allow_in_control = true
|
41
|
+
|
42
|
+
def regexp
|
43
|
+
/^set (?: \s+ (.*) )?$/ix
|
44
|
+
end
|
45
|
+
|
46
|
+
def execute
|
47
|
+
if not @match[1]
|
48
|
+
print "\"set\" must be followed by the name of an set command:\n"
|
49
|
+
print "List of set subcommands:\n\n"
|
50
|
+
for subcmd in Subcommands do
|
51
|
+
print "set #{subcmd.name} -- #{subcmd.short_help}\n"
|
52
|
+
end
|
53
|
+
else
|
54
|
+
args = @match[1].split(/[ \t]+/)
|
55
|
+
subcmd = args.shift
|
56
|
+
subcmd.downcase!
|
57
|
+
if subcmd =~ /^no/i
|
58
|
+
set_on = false
|
59
|
+
subcmd = subcmd[2..-1]
|
60
|
+
else
|
61
|
+
set_on = true
|
62
|
+
end
|
63
|
+
for try_subcmd in Subcommands do
|
64
|
+
if (subcmd.size >= try_subcmd.min) and
|
65
|
+
(try_subcmd.name[0..subcmd.size-1] == subcmd)
|
66
|
+
begin
|
67
|
+
if try_subcmd.is_bool
|
68
|
+
if args.size > 0
|
69
|
+
set_on = get_onoff(args[0])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
case try_subcmd.name
|
73
|
+
when /^annotate$/
|
74
|
+
level = get_int(args[0], "Set annotate", 0, 3, 0)
|
75
|
+
if level
|
76
|
+
Byebug.annotate = level
|
77
|
+
else
|
78
|
+
return
|
79
|
+
end
|
80
|
+
if defined?(Byebug::RDEBUG_SCRIPT)
|
81
|
+
# rdebug was called initially. 1st arg is script name.
|
82
|
+
Command.settings[:argv][1..-1] = args
|
83
|
+
else
|
84
|
+
# rdebug wasn't called initially. 1st arg is not script name.
|
85
|
+
Command.settings[:argv] = args
|
86
|
+
end
|
87
|
+
when /^args$/
|
88
|
+
Command.settings[:argv][1..-1] = args
|
89
|
+
when /^autolist$/
|
90
|
+
Command.settings[:autolist] = (set_on ? 1 : 0)
|
91
|
+
when /^autoeval$/
|
92
|
+
Command.settings[:autoeval] = set_on
|
93
|
+
when /^basename$/
|
94
|
+
Command.settings[:basename] = set_on
|
95
|
+
when /^callstyle$/
|
96
|
+
if args[0]
|
97
|
+
arg = args[0].downcase.to_sym
|
98
|
+
case arg
|
99
|
+
when :short, :last
|
100
|
+
Command.settings[:callstyle] = arg
|
101
|
+
print "%s\n" % show_setting(try_subcmd.name)
|
102
|
+
return
|
103
|
+
end
|
104
|
+
end
|
105
|
+
print "Invalid call style #{arg}. Should be one of: " +
|
106
|
+
"'short' or 'last'.\n"
|
107
|
+
when /^trace$/
|
108
|
+
Command.settings[:stack_trace_on_error] = set_on
|
109
|
+
when /^fullpath$/
|
110
|
+
Command.settings[:full_path] = set_on
|
111
|
+
when /^autoreload$/
|
112
|
+
Command.settings[:reload_source_on_change] = set_on
|
113
|
+
when /^autoirb$/
|
114
|
+
Command.settings[:autoirb] = (set_on ? 1 : 0)
|
115
|
+
when /^byebugtesting$/
|
116
|
+
Command.settings[:byebugtesting] = set_on
|
117
|
+
if set_on
|
118
|
+
Command.settings[:basename] = true
|
119
|
+
end
|
120
|
+
when /^forcestep$/
|
121
|
+
self.class.settings[:force_stepping] = set_on
|
122
|
+
when /^history$/
|
123
|
+
if 2 == args.size
|
124
|
+
interface = @state.interface
|
125
|
+
case args[0]
|
126
|
+
when /^save$/
|
127
|
+
interface.history_save = get_onoff(args[1])
|
128
|
+
when /^size$/
|
129
|
+
interface.history_length = get_int(args[1],
|
130
|
+
"Set history size")
|
131
|
+
when /^filename$/
|
132
|
+
interface.histfile = File.join(ENV["HOME"]||ENV["HOMEPATH"]||".", args[1])
|
133
|
+
else
|
134
|
+
print "Invalid history parameter #{args[0]}. Should be 'filename', 'save' or 'size'.\n"
|
135
|
+
end
|
136
|
+
else
|
137
|
+
print "Need two parameters for 'set history'; got #{args.size}.\n"
|
138
|
+
return
|
139
|
+
end
|
140
|
+
when /^linetrace\+$/
|
141
|
+
self.class.settings[:tracing_plus] = set_on
|
142
|
+
when /^linetrace$/
|
143
|
+
Command.settings[:tracing] = set_on
|
144
|
+
when /^listsize$/
|
145
|
+
listsize = get_int(args[0], "Set listsize", 1, nil, 10)
|
146
|
+
if listsize
|
147
|
+
self.class.settings[:listsize] = listsize
|
148
|
+
else
|
149
|
+
return
|
150
|
+
end
|
151
|
+
when /^width$/
|
152
|
+
width = get_int(args[0], "Set width", 10, nil, 80)
|
153
|
+
if width
|
154
|
+
self.class.settings[:width] = width
|
155
|
+
ENV['COLUMNS'] = width.to_s
|
156
|
+
else
|
157
|
+
return
|
158
|
+
end
|
159
|
+
else
|
160
|
+
print "Unknown setting #{@match[1]}.\n"
|
161
|
+
return
|
162
|
+
end
|
163
|
+
print "%s\n" % show_setting(try_subcmd.name)
|
164
|
+
return
|
165
|
+
rescue RuntimeError
|
166
|
+
return
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
print "Unknown set command #{subcmd}\n"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
class << self
|
175
|
+
def help_command
|
176
|
+
"set"
|
177
|
+
end
|
178
|
+
|
179
|
+
def help(args)
|
180
|
+
if args[1]
|
181
|
+
s = args[1]
|
182
|
+
subcmd = Subcommands.find do |try_subcmd|
|
183
|
+
(s.size >= try_subcmd.min) and
|
184
|
+
(try_subcmd.name[0..s.size-1] == s)
|
185
|
+
end
|
186
|
+
if subcmd
|
187
|
+
str = subcmd.short_help + '.'
|
188
|
+
str += "\n" + subcmd.long_help if subcmd.long_help
|
189
|
+
return str
|
190
|
+
else
|
191
|
+
return "Invalid 'set' subcommand '#{args[1]}'."
|
192
|
+
end
|
193
|
+
end
|
194
|
+
s = %{
|
195
|
+
Modifies parts of byebug environment. Boolean values take
|
196
|
+
on, off, 1 or 0.
|
197
|
+
You can see these environment settings with the \"show\" command.
|
198
|
+
|
199
|
+
--
|
200
|
+
List of set subcommands:
|
201
|
+
--
|
202
|
+
}
|
203
|
+
for subcmd in Subcommands do
|
204
|
+
s += "set #{subcmd.name} -- #{subcmd.short_help}\n"
|
205
|
+
end
|
206
|
+
return s
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
@@ -0,0 +1,246 @@
|
|
1
|
+
module Byebug
|
2
|
+
# Mix-in module to showing settings
|
3
|
+
module ShowFunctions # :nodoc:
|
4
|
+
def show_setting(setting_name)
|
5
|
+
case setting_name
|
6
|
+
when /^annotate$/
|
7
|
+
Byebug.annotate ||= 0
|
8
|
+
return ("Annotation level is #{Byebug.annotate}")
|
9
|
+
when /^args$/
|
10
|
+
if Command.settings[:argv] and Command.settings[:argv].size > 0
|
11
|
+
if defined?(Byebug::RDEBUG_SCRIPT)
|
12
|
+
# rdebug was called initially. 1st arg is script name.
|
13
|
+
args = Command.settings[:argv][1..-1].join(' ')
|
14
|
+
else
|
15
|
+
# rdebug wasn't called initially. 1st arg is not script name.
|
16
|
+
args = Command.settings[:argv].join(' ')
|
17
|
+
end
|
18
|
+
else
|
19
|
+
args = ''
|
20
|
+
end
|
21
|
+
return "Argument list to give program being debugged when it is started is \"#{args}\"."
|
22
|
+
when /^autolist$/
|
23
|
+
on_off = Command.settings[:autolist] > 0
|
24
|
+
return "autolist is #{show_onoff(on_off)}."
|
25
|
+
when /^autoeval$/
|
26
|
+
on_off = Command.settings[:autoeval]
|
27
|
+
return "autoeval is #{show_onoff(on_off)}."
|
28
|
+
when /^autoreload$/
|
29
|
+
on_off = Command.settings[:reload_source_on_change]
|
30
|
+
return "autoreload is #{show_onoff(on_off)}."
|
31
|
+
when /^autoirb$/
|
32
|
+
on_off = Command.settings[:autoirb] > 0
|
33
|
+
return "autoirb is #{show_onoff(on_off)}."
|
34
|
+
when /^basename$/
|
35
|
+
on_off = Command.settings[:basename]
|
36
|
+
return "basename is #{show_onoff(on_off)}."
|
37
|
+
when /^callstyle$/
|
38
|
+
style = Command.settings[:callstyle]
|
39
|
+
return "Frame call-display style is #{style}."
|
40
|
+
when /^commands(:?\s+(\d+))?$/
|
41
|
+
if @state.interface.readline_support?
|
42
|
+
s = '';
|
43
|
+
args = @match[1].split
|
44
|
+
if args[1]
|
45
|
+
first_line = args[1].to_i - 4
|
46
|
+
last_line = first_line + 10 - 1
|
47
|
+
if first_line > Readline::HISTORY.length
|
48
|
+
first_line = last_line = Readline::HISTORY.length
|
49
|
+
elsif first_line <= 0
|
50
|
+
first_line = 1
|
51
|
+
end
|
52
|
+
if last_line > Readline::HISTORY.length
|
53
|
+
last_line = Readline::HISTORY.length
|
54
|
+
end
|
55
|
+
i = first_line
|
56
|
+
commands = Readline::HISTORY.to_a[first_line..last_line]
|
57
|
+
else
|
58
|
+
if Readline::HISTORY.length > 10
|
59
|
+
commands = Readline::HISTORY.to_a[-10..-1]
|
60
|
+
i = Readline::HISTORY.length - 10
|
61
|
+
else
|
62
|
+
commands = Readline::HISTORY.to_a
|
63
|
+
i = 1
|
64
|
+
end
|
65
|
+
end
|
66
|
+
commands.each do |cmd|
|
67
|
+
s += ("%5d %s\n" % [i, cmd])
|
68
|
+
i += 1
|
69
|
+
end
|
70
|
+
else
|
71
|
+
s='No readline support'
|
72
|
+
end
|
73
|
+
return s
|
74
|
+
when /^byebugtesting$/
|
75
|
+
on_off = Command.settings[:byebugtesting]
|
76
|
+
return "Currently testing the byebug is #{show_onoff(on_off)}."
|
77
|
+
when /^forcestep$/
|
78
|
+
on_off = self.class.settings[:force_stepping]
|
79
|
+
return "force-stepping is #{show_onoff(on_off)}."
|
80
|
+
when /^fullpath$/
|
81
|
+
on_off = Command.settings[:full_path]
|
82
|
+
return "Displaying frame's full file names is #{show_onoff(on_off)}."
|
83
|
+
when /^history(:?\s+(filename|save|size))?$/
|
84
|
+
args = @match[1].split
|
85
|
+
interface = @state.interface
|
86
|
+
if args[1]
|
87
|
+
show_save = show_size = show_filename = false
|
88
|
+
prefix = false
|
89
|
+
if args[1] == "save"
|
90
|
+
show_save = true
|
91
|
+
elsif args[1] == "size"
|
92
|
+
show_size = true
|
93
|
+
elsif args[1] == "filename"
|
94
|
+
show_filename = true
|
95
|
+
end
|
96
|
+
else
|
97
|
+
show_save = show_size = show_filename = true
|
98
|
+
prefix = true
|
99
|
+
end
|
100
|
+
s = []
|
101
|
+
if show_filename
|
102
|
+
msg = (prefix ? "filename: " : "") +
|
103
|
+
"The filename in which to record the command history is " +
|
104
|
+
"#{interface.histfile.inspect}"
|
105
|
+
s << msg
|
106
|
+
end
|
107
|
+
if show_save
|
108
|
+
msg = (prefix ? "save: " : "") +
|
109
|
+
"Saving of history save is #{show_onoff(interface.history_save)}."
|
110
|
+
s << msg
|
111
|
+
end
|
112
|
+
if show_size
|
113
|
+
msg = (prefix ? "size: " : "") +
|
114
|
+
"Byebug history size is #{interface.history_length}"
|
115
|
+
s << msg
|
116
|
+
end
|
117
|
+
return s.join("\n")
|
118
|
+
when /^linetrace$/
|
119
|
+
on_off = Command.settings[:tracing]
|
120
|
+
return "line tracing is #{show_onoff(on_off)}."
|
121
|
+
when /^linetrace\+$/
|
122
|
+
on_off = Command.settings[:tracing_plus]
|
123
|
+
if on_off
|
124
|
+
return "line tracing style is different consecutive lines."
|
125
|
+
else
|
126
|
+
return "line tracing style is every line."
|
127
|
+
end
|
128
|
+
when /^listsize$/
|
129
|
+
listlines = Command.settings[:listsize]
|
130
|
+
return "Number of source lines to list by default is #{listlines}."
|
131
|
+
when /^port$/
|
132
|
+
return "server port is #{Byebug::PORT}."
|
133
|
+
when /^trace$/
|
134
|
+
on_off = Command.settings[:stack_trace_on_error]
|
135
|
+
return "Displaying stack trace is #{show_onoff(on_off)}."
|
136
|
+
when /^version$/
|
137
|
+
return "byebug #{Byebug::VERSION}"
|
138
|
+
when /^width$/
|
139
|
+
return "width is #{self.class.settings[:width]}."
|
140
|
+
else
|
141
|
+
return "Unknown show subcommand #{setting_name}."
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Implements byebug "show" command.
|
147
|
+
class ShowCommand < Command
|
148
|
+
|
149
|
+
Subcommands =
|
150
|
+
[
|
151
|
+
['annotate', 2, "Show annotation level",
|
152
|
+
"0 == normal; 2 == output annotated suitably for use by programs that control
|
153
|
+
byebug."],
|
154
|
+
['args', 2,
|
155
|
+
"Show argument list to give program being debugged when it is started",
|
156
|
+
"Follow this command with any number of args, to be passed to the program."],
|
157
|
+
['autoeval', 4, "Show if unrecognized command are evaluated"],
|
158
|
+
['autolist', 4, "Show if 'list' commands is run on breakpoints"],
|
159
|
+
['autoirb', 4, "Show if IRB is invoked on byebug stops"],
|
160
|
+
['autoreload', 4, "Show if source code is reloaded when changed"],
|
161
|
+
['basename', 1, "Show if basename used in reporting files"],
|
162
|
+
['callstyle', 2, "Show paramater style used showing call frames"],
|
163
|
+
['commands', 2, "Show the history of commands you typed",
|
164
|
+
"You can supply a command number to start with."],
|
165
|
+
['forcestep', 1, "Show if sure 'next/step' forces move to a new line"],
|
166
|
+
['fullpath', 2, "Show if full file names are displayed in frames"],
|
167
|
+
['history', 2, "Generic command for showing command history parameters",
|
168
|
+
"show history filename -- Show the filename in which to record the command history
|
169
|
+
show history save -- Show saving of the history record on exit
|
170
|
+
show history size -- Show the size of the command history"],
|
171
|
+
['keep-frame-bindings', 1, "Save frame binding on each call"],
|
172
|
+
['linetrace', 3, "Show line execution tracing"],
|
173
|
+
['linetrace+', 10,
|
174
|
+
"Show if consecutive lines should be different are shown in tracing"],
|
175
|
+
['listsize', 3, "Show number of source lines to list by default"],
|
176
|
+
['port', 3, "Show server port"],
|
177
|
+
['post-mortem', 3,
|
178
|
+
"Show whether we go into post-mortem debugging on an uncaught exception"],
|
179
|
+
['trace', 1,
|
180
|
+
"Show if a stack trace is displayed when 'eval' raises exception"],
|
181
|
+
['version', 1, "Show byebug's version"],
|
182
|
+
['width', 1, "Show the number of characters byebug thinks are in a line"]
|
183
|
+
].map do |name, min, short_help, long_help|
|
184
|
+
SubcmdStruct.new(name, min, short_help, long_help)
|
185
|
+
end unless defined?(Subcommands)
|
186
|
+
|
187
|
+
self.allow_in_control = true
|
188
|
+
|
189
|
+
def regexp
|
190
|
+
/^show (?: \s+ (.+) )?$/xi
|
191
|
+
end
|
192
|
+
|
193
|
+
def execute
|
194
|
+
if not @match[1]
|
195
|
+
print "\"show\" must be followed by the name of an show command:\n"
|
196
|
+
print "List of show subcommands:\n\n"
|
197
|
+
for subcmd in Subcommands do
|
198
|
+
print "show #{subcmd.name} -- #{subcmd.short_help}\n"
|
199
|
+
end
|
200
|
+
else
|
201
|
+
args = @match[1].split(/[ \t]+/)
|
202
|
+
param = args.shift
|
203
|
+
subcmd = find(Subcommands, param)
|
204
|
+
if subcmd
|
205
|
+
print "%s\n" % show_setting(subcmd.name)
|
206
|
+
else
|
207
|
+
print "Unknown show command #{param}\n"
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
class << self
|
213
|
+
def help_command
|
214
|
+
"show"
|
215
|
+
end
|
216
|
+
|
217
|
+
def help(args)
|
218
|
+
if args[1]
|
219
|
+
s = args[1]
|
220
|
+
subcmd = Subcommands.find do |try_subcmd|
|
221
|
+
(s.size >= try_subcmd.min) and
|
222
|
+
(try_subcmd.name[0..s.size-1] == s)
|
223
|
+
end
|
224
|
+
if subcmd
|
225
|
+
str = subcmd.short_help + '.'
|
226
|
+
str += "\n" + subcmd.long_help if subcmd.long_help
|
227
|
+
return str
|
228
|
+
else
|
229
|
+
return "Invalid 'show' subcommand '#{args[1]}'."
|
230
|
+
end
|
231
|
+
end
|
232
|
+
s = "
|
233
|
+
Generic command for showing things about the byebug.
|
234
|
+
|
235
|
+
--
|
236
|
+
List of show subcommands:
|
237
|
+
--
|
238
|
+
"
|
239
|
+
for subcmd in Subcommands do
|
240
|
+
s += "show #{subcmd.name} -- #{subcmd.short_help}\n"
|
241
|
+
end
|
242
|
+
return s
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|