byebug 1.0.3 → 1.1.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 +5 -0
- data/README.md +13 -11
- data/Rakefile +0 -6
- data/bin/byebug +83 -136
- data/ext/byebug/byebug.c +182 -96
- data/ext/byebug/byebug.h +5 -7
- data/ext/byebug/context.c +52 -40
- data/lib/byebug.rb +81 -81
- data/lib/byebug/command.rb +18 -35
- data/lib/byebug/commands/control.rb +1 -1
- data/lib/byebug/commands/display.rb +0 -2
- data/lib/byebug/commands/enable.rb +4 -16
- data/lib/byebug/commands/eval.rb +5 -3
- data/lib/byebug/commands/frame.rb +68 -69
- data/lib/byebug/commands/help.rb +2 -1
- data/lib/byebug/commands/info.rb +43 -42
- data/lib/byebug/commands/method.rb +4 -3
- data/lib/byebug/commands/set.rb +10 -19
- data/lib/byebug/commands/show.rb +6 -13
- data/lib/byebug/interface.rb +1 -1
- data/lib/byebug/processor.rb +14 -17
- data/lib/byebug/version.rb +1 -2
- data/old_doc/byebug.texi +576 -847
- data/test/breakpoints_test.rb +0 -1
- data/test/conditions_test.rb +35 -33
- data/test/display_test.rb +14 -13
- data/test/edit_test.rb +28 -25
- data/test/eval_test.rb +0 -2
- data/test/finish_test.rb +4 -3
- data/test/frame_test.rb +20 -21
- data/test/help_test.rb +26 -23
- data/test/info_test.rb +105 -108
- data/test/irb_test.rb +26 -25
- data/test/kill_test.rb +19 -19
- data/test/list_test.rb +140 -156
- data/test/method_test.rb +21 -22
- data/test/post_mortem_test.rb +2 -5
- data/test/quit_test.rb +16 -17
- data/test/reload_test.rb +2 -2
- data/test/restart_test.rb +0 -1
- data/test/save_test.rb +31 -32
- data/test/set_test.rb +50 -47
- data/test/show_test.rb +67 -66
- data/test/source_test.rb +31 -34
- data/test/stepping_test.rb +32 -34
- data/test/support/test_dsl.rb +1 -1
- data/test/trace_test.rb +1 -2
- data/test/variables_test.rb +36 -34
- metadata +2 -4
- data/lib/byebug/commands/tmate.rb +0 -36
- data/test/tmate_test.rb +0 -44
@@ -1,7 +1,6 @@
|
|
1
1
|
module Byebug
|
2
2
|
|
3
3
|
module DisplayFunctions
|
4
|
-
|
5
4
|
def display_expression(exp)
|
6
5
|
print "%s = %s\n", exp, debug_silent_eval(exp).to_s
|
7
6
|
end
|
@@ -79,7 +78,6 @@ module Byebug
|
|
79
78
|
end
|
80
79
|
|
81
80
|
class DeleteDisplayCommand < Command
|
82
|
-
|
83
81
|
def regexp
|
84
82
|
/^\s* undisp(?:lay)? \s* (?:(\S+))?$/x
|
85
83
|
end
|
@@ -105,17 +105,11 @@ module Byebug
|
|
105
105
|
end
|
106
106
|
|
107
107
|
# general help
|
108
|
-
|
108
|
+
str = %{
|
109
109
|
Enable some things.
|
110
110
|
This is used to cancel the effect of the "disable" command.
|
111
|
-
--
|
112
|
-
List of enable subcommands:
|
113
|
-
--
|
114
111
|
}
|
115
|
-
|
116
|
-
s += "enable #{subcmd.name} -- #{subcmd.short_help}\n"
|
117
|
-
end
|
118
|
-
return s
|
112
|
+
str += format_subcmds(Subcommands)
|
119
113
|
end
|
120
114
|
end
|
121
115
|
end
|
@@ -179,19 +173,13 @@ module Byebug
|
|
179
173
|
end
|
180
174
|
|
181
175
|
# general help
|
182
|
-
|
176
|
+
str = %{
|
183
177
|
Disable some things.
|
184
178
|
|
185
179
|
A disabled item is not forgotten, but has no effect until reenabled.
|
186
180
|
Use the "enable" command to have it take effect again.
|
187
|
-
--
|
188
|
-
List of disable subcommands:
|
189
|
-
--
|
190
181
|
}
|
191
|
-
|
192
|
-
s += "disable #{subcmd.name} -- #{subcmd.short_help}\n"
|
193
|
-
end
|
194
|
-
return s
|
182
|
+
str += format_subcmds(Subcommads)
|
195
183
|
end
|
196
184
|
end
|
197
185
|
end
|
data/lib/byebug/commands/eval.rb
CHANGED
@@ -34,7 +34,7 @@ module Byebug
|
|
34
34
|
end
|
35
35
|
|
36
36
|
# Set default value
|
37
|
-
Command.settings[:autoeval] =
|
37
|
+
Command.settings[:autoeval] = true
|
38
38
|
|
39
39
|
def match(input)
|
40
40
|
@input = input
|
@@ -104,6 +104,7 @@ module Byebug
|
|
104
104
|
end
|
105
105
|
|
106
106
|
class PutLCommand < Command
|
107
|
+
include Columnize
|
107
108
|
self.allow_in_control = true
|
108
109
|
|
109
110
|
def regexp
|
@@ -116,7 +117,7 @@ module Byebug
|
|
116
117
|
vals = debug_eval(@match.post_match, b)
|
117
118
|
if vals.is_a?(Array)
|
118
119
|
vals = vals.map{|item| item.to_s}
|
119
|
-
print "#{columnize(vals,
|
120
|
+
print "#{columnize(vals, Command.settings[:width])}\n"
|
120
121
|
else
|
121
122
|
PP.pp(vals, out)
|
122
123
|
print out.string
|
@@ -140,6 +141,7 @@ module Byebug
|
|
140
141
|
end
|
141
142
|
|
142
143
|
class PSCommand < Command
|
144
|
+
include Columnize
|
143
145
|
self.allow_in_control = true
|
144
146
|
|
145
147
|
include EvalFunctions
|
@@ -154,7 +156,7 @@ module Byebug
|
|
154
156
|
vals = debug_eval(@match.post_match, b)
|
155
157
|
if vals.is_a?(Array)
|
156
158
|
vals = vals.map{|item| item.to_s}
|
157
|
-
print "#{columnize(vals.sort!,
|
159
|
+
print "#{columnize(vals.sort!, Command.settings[:width])}\n"
|
158
160
|
else
|
159
161
|
PP.pp(vals, out)
|
160
162
|
print out.string
|
@@ -22,6 +22,7 @@ module Byebug
|
|
22
22
|
errmsg "Adjusting would put us beyond the newest (innermost) frame.\n"
|
23
23
|
return
|
24
24
|
end
|
25
|
+
|
25
26
|
if @state.frame_pos != abs_frame_pos then
|
26
27
|
@state.previous_line = nil
|
27
28
|
@state.frame_pos = abs_frame_pos
|
@@ -30,66 +31,60 @@ module Byebug
|
|
30
31
|
@state.file = context.frame_file(@state.frame_pos)
|
31
32
|
@state.line = context.frame_line(@state.frame_pos)
|
32
33
|
|
33
|
-
print_frame(@state.frame_pos,
|
34
|
+
print_frame(@state.frame_pos, false)
|
34
35
|
end
|
35
36
|
|
36
37
|
def get_frame_call(prefix, pos, context)
|
37
38
|
id = context.frame_method(pos)
|
39
|
+
return "<main>" unless id
|
40
|
+
|
38
41
|
klass = context.frame_class(pos)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
klass = locals[name].class
|
58
|
-
if klass.inspect.size > 20+3
|
59
|
-
klass = klass.inspect[0..20]+"..."
|
60
|
-
end
|
61
|
-
call_str += "%s#%s, " % [name, klass]
|
62
|
-
when :tracked
|
63
|
-
if arg_info && arg_info.size > i
|
64
|
-
call_str += "#{name}: #{arg_info[i].inspect}, "
|
65
|
-
else
|
66
|
-
call_str += "%s, " % name
|
67
|
-
end
|
42
|
+
if Command.settings[:callstyle] != :short && klass
|
43
|
+
call_str = "#{klass}.#{id.id2name}"
|
44
|
+
else
|
45
|
+
call_str = "#{id.id2name}"
|
46
|
+
end
|
47
|
+
|
48
|
+
args = context.frame_args(pos)
|
49
|
+
locals = context.frame_locals(pos)
|
50
|
+
if args.any?
|
51
|
+
call_str += "("
|
52
|
+
args.each_with_index do |name, i|
|
53
|
+
case Command.settings[:callstyle]
|
54
|
+
when :short
|
55
|
+
call_str += "#{name}, "
|
56
|
+
when :last
|
57
|
+
klass = locals[name].class
|
58
|
+
if klass.inspect.size > 20 + 3
|
59
|
+
klass = klass.inspect[0..20] + "..."
|
68
60
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
61
|
+
call_str += "#{name}##{klass}, "
|
62
|
+
when :tracked
|
63
|
+
arg_info = context.frame_args_info(pos)
|
64
|
+
if arg_info && arg_info.size > i
|
65
|
+
call_str += "#{name}: #{arg_info[i].inspect}, "
|
66
|
+
else
|
67
|
+
call_str += "#{name}, "
|
73
68
|
end
|
74
69
|
end
|
75
|
-
call_str[
|
70
|
+
if call_str.size > Command.settings[:width] - prefix.size
|
71
|
+
# Strip off trailing ', ' if any but add stuff for later trunc
|
72
|
+
call_str[-2..-1] = ",...XX"
|
73
|
+
break
|
74
|
+
end
|
76
75
|
end
|
76
|
+
call_str[-2..-1] = ")" # Strip off trailing ', ' if any
|
77
77
|
end
|
78
78
|
return call_str
|
79
79
|
end
|
80
80
|
|
81
81
|
def print_backtrace
|
82
82
|
(0...@state.context.stack_size).each do |idx|
|
83
|
-
if idx == @state.frame_pos
|
84
|
-
print "--> "
|
85
|
-
else
|
86
|
-
print " "
|
87
|
-
end
|
88
83
|
print_frame(idx)
|
89
84
|
end
|
90
85
|
end
|
91
86
|
|
92
|
-
def print_frame(pos,
|
87
|
+
def print_frame(pos, mark_current = true, context = @state.context)
|
93
88
|
file = context.frame_file(pos)
|
94
89
|
line = context.frame_line(pos)
|
95
90
|
klass = context.frame_class(pos)
|
@@ -102,17 +97,22 @@ module Byebug
|
|
102
97
|
end
|
103
98
|
end
|
104
99
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
unless call_str.empty?
|
110
|
-
print "#{call_str} "
|
111
|
-
if call_str.size + frame_num.size + file_line.size > self.class.settings[:width]
|
112
|
-
print "\n "
|
113
|
-
end
|
100
|
+
if mark_current
|
101
|
+
frame_str = (pos == @state.frame_pos) ? "--> " : " "
|
102
|
+
else
|
103
|
+
frame_str = ""
|
114
104
|
end
|
115
|
-
|
105
|
+
|
106
|
+
frame_str += sprintf "#%-2d ", pos
|
107
|
+
frame_str += get_frame_call(frame_str, pos, context)
|
108
|
+
file_line = "at #{CommandProcessor.canonic_file(file)}:#{line}"
|
109
|
+
if frame_str.size + file_line.size + 1 > Command.settings[:width]
|
110
|
+
frame_str += "\n #{file_line}\n"
|
111
|
+
else
|
112
|
+
frame_str += " #{file_line}\n"
|
113
|
+
end
|
114
|
+
|
115
|
+
print frame_str
|
116
116
|
#if ENV['EMACS'] && adjust
|
117
117
|
# fmt = (Byebug.annotate.to_i > 1 ?
|
118
118
|
# "\032\032source %s:%d\n" : "\032\032%s:%d\n")
|
@@ -183,13 +183,13 @@ module Byebug
|
|
183
183
|
|
184
184
|
def help(cmd)
|
185
185
|
s = if cmd == 'where'
|
186
|
-
|
186
|
+
%{
|
187
187
|
w[here]\tdisplay stack frames
|
188
|
-
|
188
|
+
}
|
189
189
|
else
|
190
|
-
|
190
|
+
%{
|
191
191
|
bt|backtrace\t\talias for where - display stack frames
|
192
|
-
|
192
|
+
}
|
193
193
|
end
|
194
194
|
s += %{
|
195
195
|
Print the entire stack frame. Each frame is numbered, the most
|
@@ -197,7 +197,7 @@ module Byebug
|
|
197
197
|
command; "up" and "down" add or subtract respectively to frame
|
198
198
|
numbers shown. The position of the current frame is marked with
|
199
199
|
-->.
|
200
|
-
|
200
|
+
}
|
201
201
|
end
|
202
202
|
end
|
203
203
|
end
|
@@ -226,7 +226,7 @@ module Byebug
|
|
226
226
|
end
|
227
227
|
end
|
228
228
|
|
229
|
-
class DownCommand < Command
|
229
|
+
class DownCommand < Command
|
230
230
|
def regexp
|
231
231
|
/^\s* down (?:\s+(.*))? .*$/x
|
232
232
|
end
|
@@ -250,7 +250,7 @@ module Byebug
|
|
250
250
|
end
|
251
251
|
end
|
252
252
|
|
253
|
-
class FrameCommand < Command
|
253
|
+
class FrameCommand < Command
|
254
254
|
def regexp
|
255
255
|
/ ^\s*
|
256
256
|
f(?:rame)?
|
@@ -273,9 +273,9 @@ module Byebug
|
|
273
273
|
# return
|
274
274
|
# end
|
275
275
|
#else
|
276
|
-
|
276
|
+
# context = @state.context
|
277
277
|
#end
|
278
|
-
adjust_frame(pos, true
|
278
|
+
adjust_frame(pos, true)
|
279
279
|
end
|
280
280
|
|
281
281
|
class << self
|
@@ -286,17 +286,16 @@ module Byebug
|
|
286
286
|
def help(cmd)
|
287
287
|
%{
|
288
288
|
f[rame] [frame-number [thread thread-number]]
|
289
|
-
Move the current frame to the specified frame number, or the
|
290
|
-
0 if no frame-number has been given.
|
291
289
|
|
292
|
-
|
293
|
-
|
294
|
-
|
290
|
+
Move the current frame to the specified frame number, or the 0 if no
|
291
|
+
frame-number has been given.
|
292
|
+
|
293
|
+
A negative number indicates position from the other end, so "frame -1"
|
294
|
+
moves to the oldest frame, and "frame 0" moves to the newest frame.
|
295
295
|
|
296
|
-
Without an argument, the command prints the current stack
|
297
|
-
|
298
|
-
|
299
|
-
things.
|
296
|
+
Without an argument, the command prints the current stack frame. Since
|
297
|
+
the current position is redisplayed, it may trigger a resyncronization
|
298
|
+
if there is a front end also watching over things.
|
300
299
|
|
301
300
|
If a thread number is given then we set the context for evaluating
|
302
301
|
expressions to that frame of that thread.
|
data/lib/byebug/commands/help.rb
CHANGED
@@ -2,6 +2,7 @@ module Byebug
|
|
2
2
|
|
3
3
|
# Implements byebug "help" command.
|
4
4
|
class HelpCommand < Command
|
5
|
+
include Columnize
|
5
6
|
self.allow_in_control = true
|
6
7
|
|
7
8
|
def regexp
|
@@ -34,7 +35,7 @@ module Byebug
|
|
34
35
|
print "Available commands:\n"
|
35
36
|
cmds = @state.commands.map{ |cmd| cmd.help_command }
|
36
37
|
cmds = cmds.flatten.uniq.sort
|
37
|
-
print columnize(cmds,
|
38
|
+
print columnize(cmds, Command.settings[:width])
|
38
39
|
end
|
39
40
|
end
|
40
41
|
print "\n"
|
data/lib/byebug/commands/info.rb
CHANGED
@@ -18,7 +18,9 @@ module Byebug
|
|
18
18
|
|
19
19
|
# Implements byebug "info" command.
|
20
20
|
class InfoCommand < Command
|
21
|
+
include Columnize
|
21
22
|
self.allow_in_control = true
|
23
|
+
|
22
24
|
Subcommands =
|
23
25
|
[
|
24
26
|
['args', 1, 'Argument variables of current stack frame'],
|
@@ -74,20 +76,20 @@ module Byebug
|
|
74
76
|
SubcmdStruct.new(name, min, short_help, long_help)
|
75
77
|
end unless defined?(InfoFileSubcommands)
|
76
78
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
79
|
+
InfoThreadSubcommands =
|
80
|
+
[
|
81
|
+
['terse', 1, 'summary information'],
|
82
|
+
['verbose', 1, 'summary information and stack frame info'],
|
83
|
+
].map do |name, min, short_help, long_help|
|
84
|
+
SubcmdStruct.new(name, min, short_help, long_help)
|
85
|
+
end unless defined?(InfoThreadSubcommands)
|
84
86
|
|
85
87
|
def regexp
|
86
88
|
/^\s* i(?:nfo)? (?:\s+(.*))?$/ix
|
87
89
|
end
|
88
90
|
|
89
91
|
def execute
|
90
|
-
return
|
92
|
+
return print format_subcmds(Subcommands) unless @match[1]
|
91
93
|
|
92
94
|
args = @match[1].split(/[ \t]+/)
|
93
95
|
param = args.shift
|
@@ -166,28 +168,33 @@ module Byebug
|
|
166
168
|
print " - #{path}"
|
167
169
|
end
|
168
170
|
end
|
171
|
+
private :info_file_path
|
169
172
|
|
170
173
|
def info_file_lines(file)
|
171
174
|
lines = LineCache.size(file)
|
172
175
|
print "\t %d lines\n", lines if lines
|
173
176
|
end
|
177
|
+
private :info_file_lines
|
174
178
|
|
175
179
|
def info_file_breakpoints(file)
|
176
180
|
breakpoints = LineCache.trace_line_numbers(file)
|
177
181
|
if breakpoints
|
178
182
|
print "\tbreakpoint line numbers:\n"
|
179
|
-
print columnize(breakpoints.to_a.sort,
|
183
|
+
print columnize(breakpoints.to_a.sort, Command.settings[:width])
|
180
184
|
end
|
181
185
|
end
|
186
|
+
private :info_file_breakpoints
|
182
187
|
|
183
188
|
def info_file_mtime(file)
|
184
189
|
stat = LineCache.stat(file)
|
185
190
|
print "\t%s\n", stat.mtime if stat
|
186
191
|
end
|
192
|
+
private :info_file_mtime
|
187
193
|
|
188
194
|
def info_file_sha1(file)
|
189
195
|
print "\t%s\n", LineCache.sha1(file)
|
190
196
|
end
|
197
|
+
private :info_file_sha1
|
191
198
|
|
192
199
|
def info_file(*args)
|
193
200
|
return info_files unless args[0]
|
@@ -270,29 +277,30 @@ module Byebug
|
|
270
277
|
end
|
271
278
|
end
|
272
279
|
|
273
|
-
def
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
print("
|
281
|
-
|
282
|
-
|
280
|
+
def info_stop_reason(stop_reason)
|
281
|
+
case stop_reason
|
282
|
+
when :step
|
283
|
+
print "It stopped after stepping, next'ing or initial start.\n"
|
284
|
+
when :breakpoint
|
285
|
+
print("It stopped at a breakpoint.\n")
|
286
|
+
when :catchpoint
|
287
|
+
print("It stopped at a catchpoint.\n")
|
288
|
+
else
|
289
|
+
print "unknown reason: %s\n" % @state.context.stop_reason.to_s
|
283
290
|
end
|
291
|
+
end
|
292
|
+
private :info_stop_reason
|
293
|
+
|
294
|
+
def info_program(*args)
|
295
|
+
return print "The program being debugged is not being run.\n" if
|
296
|
+
not @state.context
|
297
|
+
|
298
|
+
return print "The program crashed.\n" + Byebug.last_exception ?
|
299
|
+
"Exception: #{Byebug.last_exception.inspect}" : "" + "\n" if
|
300
|
+
@state.context.dead?
|
284
301
|
|
285
302
|
print "Program stopped. "
|
286
|
-
|
287
|
-
when :step
|
288
|
-
print "It stopped after stepping, next'ing or initial start.\n"
|
289
|
-
when :breakpoint
|
290
|
-
print("It stopped at a breakpoint.\n")
|
291
|
-
when :catchpoint
|
292
|
-
print("It stopped at a catchpoint.\n")
|
293
|
-
else
|
294
|
-
print "unknown reason: %s\n" % @state.context.stop_reason.to_s
|
295
|
-
end
|
303
|
+
info_stop_reason @state.context.stop_reason
|
296
304
|
end
|
297
305
|
|
298
306
|
def info_stack(*args)
|
@@ -330,7 +338,7 @@ module Byebug
|
|
330
338
|
if verbose and not c.ignored?
|
331
339
|
(0...c.stack_size).each do |idx|
|
332
340
|
print "\t"
|
333
|
-
print_frame(idx,
|
341
|
+
print_frame(idx, true, c)
|
334
342
|
end
|
335
343
|
end
|
336
344
|
end
|
@@ -349,7 +357,7 @@ module Byebug
|
|
349
357
|
if verbose and not c.ignored?
|
350
358
|
(0...c.stack_size).each do |idx|
|
351
359
|
print "\t"
|
352
|
-
print_frame(idx,
|
360
|
+
print_frame(idx, true, c)
|
353
361
|
end
|
354
362
|
end
|
355
363
|
end
|
@@ -407,24 +415,17 @@ module Byebug
|
|
407
415
|
return str += "\nInvalid \"file\" attribute \"#{args[2]}\"." \
|
408
416
|
unless subsubcmd
|
409
417
|
|
410
|
-
str += "\n" + subsubcmd.short_help + '.'
|
418
|
+
return str += "\n" + subsubcmd.short_help + '.'
|
411
419
|
else
|
412
|
-
str += "\n" + subcmd.long_help if subcmd.long_help
|
420
|
+
return str += "\n" + subcmd.long_help if subcmd.long_help
|
413
421
|
end
|
414
|
-
return str
|
415
422
|
end
|
416
423
|
|
417
424
|
# general help
|
418
|
-
|
425
|
+
str = %{
|
419
426
|
Generic command for showing things about the program being debugged.
|
420
|
-
--
|
421
|
-
List of info subcommands:
|
422
|
-
--
|
423
427
|
}
|
424
|
-
|
425
|
-
s += "info #{subcmd.name} -- #{subcmd.short_help}\n"
|
426
|
-
end
|
427
|
-
return s
|
428
|
+
str += format_subcmds(Subcommands)
|
428
429
|
end
|
429
430
|
end
|
430
431
|
end
|