byebug 2.5.0 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/CHANGELOG.md +5 -0
- data/README.md +19 -13
- data/byebug.gemspec +7 -6
- data/ext/byebug/byebug.c +1 -1
- data/ext/byebug/byebug.h +1 -1
- data/lib/byebug.rb +3 -2
- data/lib/byebug/command_processor.rb +255 -0
- data/lib/byebug/commands/frame.rb +3 -3
- data/lib/byebug/context.rb +5 -5
- data/lib/byebug/control_command_processor.rb +79 -0
- data/lib/byebug/processor.rb +0 -321
- data/lib/byebug/version.rb +1 -1
- data/test/examples/stepping_raise_from_c_method.rb +3 -0
- data/test/examples/stepping_raise_from_ruby_method.rb +3 -0
- data/test/frame_test.rb +1 -1
- data/test/stepping_test.rb +53 -0
- data/test/test_helper.rb +8 -1
- metadata +51 -33
- data/logo.png +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0bd29ed7fa0a4c5e980c3f90ea5187a0723d1ea
|
4
|
+
data.tar.gz: 177807eb3c0b4b5bf8befb1e196457dc7fbd89ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 379441b4bb0d2ab10d3a547757f0c3921e2043cda11883c2449243d747bb17d5cc4c81093d6f476225801fe1d41494285bf5953f642458e581673f0bc77682c4
|
7
|
+
data.tar.gz: 9401628eaeae78d332c03bf97d2c2e61093b79cf7bb73b23fe3658130126f6ff3321eee3c4da141340f5e387a87f93b6b08f1f149bdd6aa0cc70a4fcd63e26f7
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
-
# Byebug
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# Byebug
|
2
|
+
[![Version][VersionBadge]][VersionURL]
|
3
|
+
[![Build][TravisBadge]][TravisURL]
|
4
|
+
[![Climate][CodeClimateBadge]][CodeClimateURL]
|
5
|
+
[![Dependencies][GemnasiumBadge]][GemnasiumURL]
|
6
|
+
[![Coverage][CoverallsBadge]][CoverallsURL]
|
7
|
+
[![Gittip][GittipBadge]][GittipURL]
|
5
8
|
|
6
9
|
_Debugging in Ruby 2_
|
7
10
|
|
@@ -148,14 +151,17 @@ software, specially:
|
|
148
151
|
* Koichi Sasada, author of the new C debugging API for Ruby.
|
149
152
|
* Dennis Ushakov, author of [debase](https://github.com/denofevil/debase), the
|
150
153
|
starting point of this.
|
151
|
-
* Logo by [Ivlichev Victor Petrovich](http://www.aha-soft.com/)
|
152
154
|
* @kevjames3 for testing, bug reports and the interest in the project.
|
153
155
|
|
154
|
-
[
|
155
|
-
[
|
156
|
-
[
|
157
|
-
[
|
158
|
-
[
|
159
|
-
[
|
160
|
-
[
|
161
|
-
[
|
156
|
+
[VersionBadge]: https://badge.fury.io/rb/byebug.png
|
157
|
+
[VersionURL]: http://badge.fury.io/rb/byebug
|
158
|
+
[TravisBadge]: https://travis-ci.org/deivid-rodriguez/byebug.png
|
159
|
+
[TravisURL]: http://travis-ci.org/deivid-rodriguez/byebug
|
160
|
+
[CodeClimateBadge]: https://codeclimate.com/github/deivid-rodriguez/byebug.png
|
161
|
+
[CodeClimateURL]: https://codeclimate.com/github/deivid-rodriguez/byebug
|
162
|
+
[GemnasiumBadge]: https://gemnasium.com/deivid-rodriguez/byebug.png
|
163
|
+
[GemnasiumURL]: https://gemnasium.com/deivid-rodriguez/byebug
|
164
|
+
[CoverallsBadge]: https://coveralls.io/repos/deivid-rodriguez/byebug/badge.png
|
165
|
+
[CoverallsURL]: https://coveralls.io/r/deivid-rodriguez/byebug
|
166
|
+
[GittipBadge]: http://img.shields.io/gittip/deivid-rodriguez.png
|
167
|
+
[GittipURL]: https://www.gittip.com/deivid-rodriguez
|
data/byebug.gemspec
CHANGED
@@ -23,11 +23,12 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.extra_rdoc_files = ['README.md']
|
24
24
|
s.extensions = ['ext/byebug/extconf.rb']
|
25
25
|
|
26
|
-
s.add_dependency
|
27
|
-
s.add_dependency
|
26
|
+
s.add_dependency 'columnize', '~> 0.3'
|
27
|
+
s.add_dependency 'debugger-linecache', '~> 1.2'
|
28
28
|
|
29
|
-
s.add_development_dependency 'rake', '~> 10.1
|
30
|
-
s.add_development_dependency 'rake-compiler', '~> 0.9
|
31
|
-
s.add_development_dependency 'mocha', '~>
|
32
|
-
s.add_development_dependency 'minitest', '~> 5.
|
29
|
+
s.add_development_dependency 'rake', '~> 10.1'
|
30
|
+
s.add_development_dependency 'rake-compiler', '~> 0.9'
|
31
|
+
s.add_development_dependency 'mocha', '~> 1.0'
|
32
|
+
s.add_development_dependency 'minitest', '~> 5.2'
|
33
|
+
s.add_development_dependency 'coveralls', '~> 0.7'
|
33
34
|
end
|
data/ext/byebug/byebug.c
CHANGED
data/ext/byebug/byebug.h
CHANGED
@@ -38,7 +38,7 @@ typedef struct {
|
|
38
38
|
int dest_frame;
|
39
39
|
int lines; /* # of lines in dest_frame before stopping */
|
40
40
|
int steps; /* # of steps before stopping */
|
41
|
-
int after_frame; /* stop
|
41
|
+
int after_frame; /* stop right after returning from this frame */
|
42
42
|
int before_frame; /* stop right before returning from this frame */
|
43
43
|
|
44
44
|
VALUE last_file;
|
data/lib/byebug.rb
CHANGED
@@ -2,6 +2,8 @@ require 'byebug/byebug'
|
|
2
2
|
require 'byebug/version'
|
3
3
|
require 'byebug/context'
|
4
4
|
require 'byebug/processor'
|
5
|
+
require 'byebug/command_processor'
|
6
|
+
require 'byebug/control_command_processor'
|
5
7
|
require 'byebug/remote'
|
6
8
|
require 'stringio'
|
7
9
|
require 'tracer'
|
@@ -10,8 +12,7 @@ require 'linecache19'
|
|
10
12
|
module Byebug
|
11
13
|
|
12
14
|
# List of files byebug will ignore while debugging
|
13
|
-
IGNORED_FILES = Dir
|
14
|
-
|f| File.expand_path(f) }
|
15
|
+
IGNORED_FILES = Dir.glob('**/*.rb').map { |f| File.expand_path(f) }
|
15
16
|
|
16
17
|
# Default options to Byebug.start
|
17
18
|
DEFAULT_START_SETTINGS = {
|
@@ -0,0 +1,255 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require_relative 'interface'
|
3
|
+
require_relative 'command'
|
4
|
+
|
5
|
+
module Byebug
|
6
|
+
|
7
|
+
class CommandProcessor < Processor
|
8
|
+
attr_reader :display
|
9
|
+
|
10
|
+
def initialize(interface = LocalInterface.new)
|
11
|
+
super(interface)
|
12
|
+
|
13
|
+
@display = []
|
14
|
+
@mutex = Mutex.new
|
15
|
+
@last_cmd = nil # To allow empty (just <RET>) commands
|
16
|
+
@last_file = nil # Filename the last time we stopped
|
17
|
+
@last_line = nil # Line number the last time we stopped
|
18
|
+
@context_was_dead = false # Assume we haven't started.
|
19
|
+
end
|
20
|
+
|
21
|
+
def interface=(interface)
|
22
|
+
@mutex.synchronize do
|
23
|
+
@interface.close if @interface
|
24
|
+
@interface = interface
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'pathname' # For cleanpath
|
29
|
+
|
30
|
+
#
|
31
|
+
# Regularize file name.
|
32
|
+
#
|
33
|
+
# This is also used as a common funnel place if basename is desired or if we
|
34
|
+
# are working remotely and want to change the basename. Or we are eliding
|
35
|
+
# filenames.
|
36
|
+
def self.canonic_file(filename)
|
37
|
+
return filename if ['(irb)', '-e'].include?(filename)
|
38
|
+
|
39
|
+
# For now we want resolved filenames
|
40
|
+
if Command.settings[:basename]
|
41
|
+
File.basename(filename)
|
42
|
+
else
|
43
|
+
Pathname.new(filename).cleanpath.to_s
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.protect(mname)
|
48
|
+
alias_method "__#{mname}", mname
|
49
|
+
module_eval <<-END, __FILE__, __LINE__+1
|
50
|
+
def #{mname}(*args)
|
51
|
+
@mutex.synchronize do
|
52
|
+
return unless @interface
|
53
|
+
__#{mname}(*args)
|
54
|
+
end
|
55
|
+
rescue IOError, Errno::EPIPE
|
56
|
+
self.interface = nil
|
57
|
+
rescue SignalException
|
58
|
+
raise
|
59
|
+
rescue Exception
|
60
|
+
print "INTERNAL ERROR!!! #\{$!\}\n" rescue nil
|
61
|
+
print $!.backtrace.map{|l| "\t#\{l\}"}.join("\n") rescue nil
|
62
|
+
end
|
63
|
+
END
|
64
|
+
end
|
65
|
+
|
66
|
+
def at_breakpoint(context, breakpoint)
|
67
|
+
n = Byebug.breakpoints.index(breakpoint) + 1
|
68
|
+
file = CommandProcessor.canonic_file(breakpoint.source)
|
69
|
+
line = breakpoint.pos
|
70
|
+
print "Stopped by breakpoint #{n} at #{file}:#{line}\n"
|
71
|
+
end
|
72
|
+
protect :at_breakpoint
|
73
|
+
|
74
|
+
def at_catchpoint(context, excpt)
|
75
|
+
file = CommandProcessor.canonic_file(context.frame_file(0))
|
76
|
+
line = context.frame_line(0)
|
77
|
+
print "Catchpoint at %s:%d: `%s' (%s)\n", file, line, excpt, excpt.class
|
78
|
+
end
|
79
|
+
protect :at_catchpoint
|
80
|
+
|
81
|
+
def at_tracing(context, file, line)
|
82
|
+
if file != @last_file || line != @last_line || Command.settings[:linetrace_plus]
|
83
|
+
@last_file, @last_line = file, line
|
84
|
+
print "Tracing: #{CommandProcessor.canonic_file(file)}:#{line} " \
|
85
|
+
"#{Byebug.line_at(file,line)}\n"
|
86
|
+
end
|
87
|
+
always_run(context, file, line, 2)
|
88
|
+
end
|
89
|
+
protect :at_tracing
|
90
|
+
|
91
|
+
def at_line(context, file, line)
|
92
|
+
Byebug.source_reload if Command.settings[:autoreload]
|
93
|
+
process_commands(context, file, line)
|
94
|
+
end
|
95
|
+
protect :at_line
|
96
|
+
|
97
|
+
def at_return(context, file, line)
|
98
|
+
process_commands(context, file, line)
|
99
|
+
end
|
100
|
+
protect :at_return
|
101
|
+
|
102
|
+
private
|
103
|
+
#
|
104
|
+
# Prompt shown before reading a command.
|
105
|
+
#
|
106
|
+
def prompt(context)
|
107
|
+
return "(byebug#{context.dead? ? ':post-mortem' : ''}) "
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# Run commands everytime.
|
112
|
+
#
|
113
|
+
# For example display commands or possibly the list or irb in an
|
114
|
+
# "autolist" or "autoirb".
|
115
|
+
#
|
116
|
+
# @return List of commands acceptable to run bound to the current state
|
117
|
+
#
|
118
|
+
def always_run(context, file, line, run_level)
|
119
|
+
cmds = Command.commands
|
120
|
+
|
121
|
+
# Remove some commands in post-mortem
|
122
|
+
cmds = cmds.find_all { |cmd| cmd.allow_in_post_mortem } if context.dead?
|
123
|
+
|
124
|
+
state = State.new(cmds, context, @display, file, @interface, line)
|
125
|
+
|
126
|
+
# Change default when in irb or code included in command line
|
127
|
+
Command.settings[:autolist] = 0 if ['(irb)', '-e'].include?(file)
|
128
|
+
|
129
|
+
# Bind commands to the current state.
|
130
|
+
commands = cmds.map { |cmd| cmd.new(state) }
|
131
|
+
|
132
|
+
commands.select { |cmd| cmd.class.always_run >= run_level }
|
133
|
+
.each { |cmd| cmd.execute }
|
134
|
+
|
135
|
+
return state, commands
|
136
|
+
end
|
137
|
+
|
138
|
+
#
|
139
|
+
# Splits a command line of the form "cmd1 ; cmd2 ; ... ; cmdN" into an
|
140
|
+
# array of commands: [cmd1, cmd2, ..., cmdN]
|
141
|
+
#
|
142
|
+
def split_commands(cmd_line)
|
143
|
+
cmd_line.split(/;/).inject([]) do |m, v|
|
144
|
+
if m.empty?
|
145
|
+
m << v
|
146
|
+
else
|
147
|
+
if m.last[-1] == ?\\
|
148
|
+
m.last[-1,1] = ''
|
149
|
+
m.last << ';' << v
|
150
|
+
else
|
151
|
+
m << v
|
152
|
+
end
|
153
|
+
end
|
154
|
+
m
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
#
|
159
|
+
# Handle byebug commands.
|
160
|
+
#
|
161
|
+
def process_commands(context, file, line)
|
162
|
+
state, commands = always_run(context, file, line, 1)
|
163
|
+
|
164
|
+
if Command.settings[:testing]
|
165
|
+
Thread.current.thread_variable_set('state', state)
|
166
|
+
else
|
167
|
+
Thread.current.thread_variable_set('state', nil)
|
168
|
+
end
|
169
|
+
|
170
|
+
preloop(commands, context)
|
171
|
+
print state.location if Command.settings[:autolist] == 0
|
172
|
+
|
173
|
+
while !state.proceed?
|
174
|
+
input = @interface.command_queue.empty? ?
|
175
|
+
@interface.read_command(prompt(context)) :
|
176
|
+
@interface.command_queue.shift
|
177
|
+
break unless input
|
178
|
+
catch(:debug_error) do
|
179
|
+
if input == ""
|
180
|
+
next unless @last_cmd
|
181
|
+
input = @last_cmd
|
182
|
+
else
|
183
|
+
@last_cmd = input
|
184
|
+
end
|
185
|
+
split_commands(input).each do |cmd|
|
186
|
+
one_cmd(commands, context, cmd)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
#
|
193
|
+
# Executes a single byebug command
|
194
|
+
#
|
195
|
+
def one_cmd(commands, context, input)
|
196
|
+
if cmd = commands.find { |c| c.match(input) }
|
197
|
+
if context.dead? && cmd.class.need_context
|
198
|
+
print "Command is unavailable\n"
|
199
|
+
else
|
200
|
+
cmd.execute
|
201
|
+
end
|
202
|
+
else
|
203
|
+
unknown_cmd = commands.find { |c| c.class.unknown }
|
204
|
+
if unknown_cmd
|
205
|
+
unknown_cmd.execute
|
206
|
+
else
|
207
|
+
errmsg "Unknown command: \"#{input}\". Try \"help\".\n"
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
#
|
213
|
+
# Tasks to do before processor loop
|
214
|
+
#
|
215
|
+
def preloop(commands, context)
|
216
|
+
@context_was_dead = true if context.dead? and not @context_was_dead
|
217
|
+
|
218
|
+
if @context_was_dead
|
219
|
+
print "The program finished.\n"
|
220
|
+
@context_was_dead = false
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
class State
|
225
|
+
attr_accessor :commands, :context, :display, :file, :frame_pos
|
226
|
+
attr_accessor :interface, :line, :previous_line
|
227
|
+
|
228
|
+
def initialize(commands, context, display, file, interface, line)
|
229
|
+
@commands, @context, @display = commands, context, display
|
230
|
+
@file, @interface, @line = file, interface, line
|
231
|
+
@frame_pos, @previous_line, @proceed = 0, nil, false
|
232
|
+
end
|
233
|
+
|
234
|
+
extend Forwardable
|
235
|
+
def_delegators :@interface, :errmsg, :print, :confirm
|
236
|
+
|
237
|
+
def proceed?
|
238
|
+
@proceed
|
239
|
+
end
|
240
|
+
|
241
|
+
def proceed
|
242
|
+
@proceed = true
|
243
|
+
end
|
244
|
+
|
245
|
+
def location
|
246
|
+
loc = "#{CommandProcessor.canonic_file(@file)} @ #{@line}\n"
|
247
|
+
loc += "#{Byebug.line_at(@file, @line)}\n" unless
|
248
|
+
['(irb)', '-e'].include? @file
|
249
|
+
loc
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
end # class CommandProcessor
|
254
|
+
|
255
|
+
end
|
@@ -168,11 +168,11 @@ module Byebug
|
|
168
168
|
def description
|
169
169
|
%{w[here]|bt|backtrace\tdisplay stack frames
|
170
170
|
|
171
|
-
Print the entire stack frame. Each frame is numbered
|
172
|
-
frame is 0.
|
171
|
+
Print the entire stack frame. Each frame is numbered; the most recent
|
172
|
+
frame is 0. A frame number can be referred to in the "frame" command;
|
173
173
|
"up" and "down" add or subtract respectively to frame numbers shown.
|
174
174
|
The position of the current frame is marked with -->. C-frames hang
|
175
|
-
from their most
|
175
|
+
from their most immediate Ruby frame to indicate that they are not
|
176
176
|
navigable}
|
177
177
|
end
|
178
178
|
end
|
data/lib/byebug/context.rb
CHANGED
@@ -6,7 +6,7 @@ module Byebug
|
|
6
6
|
def stack_size
|
7
7
|
if backtrace = Thread.current.backtrace_locations(0)
|
8
8
|
backtrace.drop_while { |l| !ignored(l.path) }
|
9
|
-
.drop_while { |l|
|
9
|
+
.drop_while { |l| ignored(l.path) }
|
10
10
|
.take_while { |l| !ignored(l.path) }
|
11
11
|
.size
|
12
12
|
else
|
@@ -16,7 +16,7 @@ module Byebug
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def real_stack_size
|
19
|
-
if backtrace = Thread.current.backtrace_locations(
|
19
|
+
if backtrace = Thread.current.backtrace_locations(0)
|
20
20
|
backtrace.size
|
21
21
|
end
|
22
22
|
end
|
@@ -75,15 +75,15 @@ module Byebug
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def at_tracing(file, line)
|
78
|
-
handler.at_tracing(self, file, line)
|
78
|
+
handler.at_tracing(self, file, line)
|
79
79
|
end
|
80
80
|
|
81
81
|
def at_line(file, line)
|
82
|
-
handler.at_line(self, file, line)
|
82
|
+
handler.at_line(self, file, line)
|
83
83
|
end
|
84
84
|
|
85
85
|
def at_return(file, line)
|
86
|
-
handler.at_return(self, file, line)
|
86
|
+
handler.at_return(self, file, line)
|
87
87
|
end
|
88
88
|
end
|
89
89
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require_relative 'interface'
|
3
|
+
require_relative 'command'
|
4
|
+
|
5
|
+
module Byebug
|
6
|
+
|
7
|
+
class ControlCommandProcessor < Processor
|
8
|
+
def initialize(interface)
|
9
|
+
super(interface)
|
10
|
+
@context_was_dead = false # Assume we haven't started.
|
11
|
+
end
|
12
|
+
|
13
|
+
def process_commands(verbose=false)
|
14
|
+
control_cmds = Command.commands.select do |cmd|
|
15
|
+
cmd.allow_in_control
|
16
|
+
end
|
17
|
+
state = State.new(@interface, control_cmds)
|
18
|
+
commands = control_cmds.map{|cmd| cmd.new(state) }
|
19
|
+
|
20
|
+
if @context_was_dead
|
21
|
+
print "The program finished.\n"
|
22
|
+
@context_was_dead = false
|
23
|
+
end
|
24
|
+
|
25
|
+
while input = @interface.read_command(prompt(nil))
|
26
|
+
print "+#{input}" if verbose
|
27
|
+
catch(:debug_error) do
|
28
|
+
if cmd = commands.find{|c| c.match(input) }
|
29
|
+
cmd.execute
|
30
|
+
else
|
31
|
+
errmsg "Unknown command\n"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
rescue IOError, Errno::EPIPE
|
36
|
+
rescue Exception
|
37
|
+
print "INTERNAL ERROR!!! #{$!}\n" rescue nil
|
38
|
+
print $!.backtrace.map{|l| "\t#{l}"}.join("\n") rescue nil
|
39
|
+
ensure
|
40
|
+
@interface.close
|
41
|
+
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# Prompt shown before reading a command.
|
45
|
+
#
|
46
|
+
def prompt(context)
|
47
|
+
return '(byebug:ctrl) '
|
48
|
+
end
|
49
|
+
|
50
|
+
class State
|
51
|
+
attr_reader :commands, :interface
|
52
|
+
|
53
|
+
def initialize(interface, commands)
|
54
|
+
@interface = interface
|
55
|
+
@commands = commands
|
56
|
+
end
|
57
|
+
|
58
|
+
def proceed
|
59
|
+
end
|
60
|
+
|
61
|
+
extend Forwardable
|
62
|
+
def_delegators :@interface, :errmsg, :print
|
63
|
+
|
64
|
+
def confirm(*args)
|
65
|
+
'y'
|
66
|
+
end
|
67
|
+
|
68
|
+
def context
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
|
72
|
+
def file
|
73
|
+
errmsg "No filename given.\n"
|
74
|
+
throw :debug_error
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/lib/byebug/processor.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
require_relative 'interface'
|
3
|
-
require_relative 'command'
|
4
3
|
|
5
4
|
module Byebug
|
6
5
|
|
@@ -16,324 +15,4 @@ module Byebug
|
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
|
-
class CommandProcessor < Processor
|
20
|
-
attr_reader :display
|
21
|
-
|
22
|
-
def initialize(interface = LocalInterface.new)
|
23
|
-
super(interface)
|
24
|
-
|
25
|
-
@display = []
|
26
|
-
@mutex = Mutex.new
|
27
|
-
@last_cmd = nil # To allow empty (just <RET>) commands
|
28
|
-
@last_file = nil # Filename the last time we stopped
|
29
|
-
@last_line = nil # Line number the last time we stopped
|
30
|
-
@context_was_dead = false # Assume we haven't started.
|
31
|
-
end
|
32
|
-
|
33
|
-
def interface=(interface)
|
34
|
-
@mutex.synchronize do
|
35
|
-
@interface.close if @interface
|
36
|
-
@interface = interface
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
require 'pathname' # For cleanpath
|
41
|
-
|
42
|
-
#
|
43
|
-
# Regularize file name.
|
44
|
-
#
|
45
|
-
# This is also used as a common funnel place if basename is desired or if we
|
46
|
-
# are working remotely and want to change the basename. Or we are eliding
|
47
|
-
# filenames.
|
48
|
-
def self.canonic_file(filename)
|
49
|
-
return filename if ['(irb)', '-e'].include?(filename)
|
50
|
-
|
51
|
-
# For now we want resolved filenames
|
52
|
-
if Command.settings[:basename]
|
53
|
-
File.basename(filename)
|
54
|
-
else
|
55
|
-
Pathname.new(filename).cleanpath.to_s
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.protect(mname)
|
60
|
-
alias_method "__#{mname}", mname
|
61
|
-
module_eval <<-END, __FILE__, __LINE__+1
|
62
|
-
def #{mname}(*args)
|
63
|
-
@mutex.synchronize do
|
64
|
-
return unless @interface
|
65
|
-
__#{mname}(*args)
|
66
|
-
end
|
67
|
-
rescue IOError, Errno::EPIPE
|
68
|
-
self.interface = nil
|
69
|
-
rescue SignalException
|
70
|
-
raise
|
71
|
-
rescue Exception
|
72
|
-
print "INTERNAL ERROR!!! #\{$!\}\n" rescue nil
|
73
|
-
print $!.backtrace.map{|l| "\t#\{l\}"}.join("\n") rescue nil
|
74
|
-
end
|
75
|
-
END
|
76
|
-
end
|
77
|
-
|
78
|
-
def at_breakpoint(context, breakpoint)
|
79
|
-
n = Byebug.breakpoints.index(breakpoint) + 1
|
80
|
-
file = CommandProcessor.canonic_file(breakpoint.source)
|
81
|
-
line = breakpoint.pos
|
82
|
-
print "Stopped by breakpoint #{n} at #{file}:#{line}\n"
|
83
|
-
end
|
84
|
-
protect :at_breakpoint
|
85
|
-
|
86
|
-
def at_catchpoint(context, excpt)
|
87
|
-
file = CommandProcessor.canonic_file(context.frame_file(0))
|
88
|
-
line = context.frame_line(0)
|
89
|
-
print "Catchpoint at %s:%d: `%s' (%s)\n", file, line, excpt, excpt.class
|
90
|
-
end
|
91
|
-
protect :at_catchpoint
|
92
|
-
|
93
|
-
def at_tracing(context, file, line)
|
94
|
-
if file != @last_file || line != @last_line || Command.settings[:linetrace_plus]
|
95
|
-
@last_file, @last_line = file, line
|
96
|
-
print "Tracing: #{CommandProcessor.canonic_file(file)}:#{line} " \
|
97
|
-
"#{Byebug.line_at(file,line)}\n"
|
98
|
-
end
|
99
|
-
always_run(context, file, line, 2)
|
100
|
-
end
|
101
|
-
protect :at_tracing
|
102
|
-
|
103
|
-
def at_line(context, file, line)
|
104
|
-
Byebug.source_reload if Command.settings[:autoreload]
|
105
|
-
process_commands(context, file, line)
|
106
|
-
end
|
107
|
-
protect :at_line
|
108
|
-
|
109
|
-
def at_return(context, file, line)
|
110
|
-
process_commands(context, file, line)
|
111
|
-
end
|
112
|
-
protect :at_return
|
113
|
-
|
114
|
-
private
|
115
|
-
#
|
116
|
-
# Prompt shown before reading a command.
|
117
|
-
#
|
118
|
-
def prompt(context)
|
119
|
-
return "(byebug#{context.dead? ? ':post-mortem' : ''}) "
|
120
|
-
end
|
121
|
-
|
122
|
-
#
|
123
|
-
# Run commands everytime.
|
124
|
-
#
|
125
|
-
# For example display commands or possibly the list or irb in an
|
126
|
-
# "autolist" or "autoirb".
|
127
|
-
#
|
128
|
-
# @return List of commands acceptable to run bound to the current state
|
129
|
-
#
|
130
|
-
def always_run(context, file, line, run_level)
|
131
|
-
cmds = Command.commands
|
132
|
-
|
133
|
-
# Remove some commands in post-mortem
|
134
|
-
cmds = cmds.find_all { |cmd| cmd.allow_in_post_mortem } if context.dead?
|
135
|
-
|
136
|
-
state = State.new(cmds, context, @display, file, @interface, line)
|
137
|
-
|
138
|
-
# Change default when in irb or code included in command line
|
139
|
-
Command.settings[:autolist] = 0 if ['(irb)', '-e'].include?(file)
|
140
|
-
|
141
|
-
# Bind commands to the current state.
|
142
|
-
commands = cmds.map { |cmd| cmd.new(state) }
|
143
|
-
|
144
|
-
commands.select { |cmd| cmd.class.always_run >= run_level }
|
145
|
-
.each { |cmd| cmd.execute }
|
146
|
-
|
147
|
-
return state, commands
|
148
|
-
end
|
149
|
-
|
150
|
-
#
|
151
|
-
# Splits a command line of the form "cmd1 ; cmd2 ; ... ; cmdN" into an
|
152
|
-
# array of commands: [cmd1, cmd2, ..., cmdN]
|
153
|
-
#
|
154
|
-
def split_commands(cmd_line)
|
155
|
-
cmd_line.split(/;/).inject([]) do |m, v|
|
156
|
-
if m.empty?
|
157
|
-
m << v
|
158
|
-
else
|
159
|
-
if m.last[-1] == ?\\
|
160
|
-
m.last[-1,1] = ''
|
161
|
-
m.last << ';' << v
|
162
|
-
else
|
163
|
-
m << v
|
164
|
-
end
|
165
|
-
end
|
166
|
-
m
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
#
|
171
|
-
# Handle byebug commands.
|
172
|
-
#
|
173
|
-
def process_commands(context, file, line)
|
174
|
-
state, commands = always_run(context, file, line, 1)
|
175
|
-
|
176
|
-
if Command.settings[:testing]
|
177
|
-
Thread.current.thread_variable_set('state', state)
|
178
|
-
else
|
179
|
-
Thread.current.thread_variable_set('state', nil)
|
180
|
-
end
|
181
|
-
|
182
|
-
preloop(commands, context)
|
183
|
-
print state.location if Command.settings[:autolist] == 0
|
184
|
-
|
185
|
-
while !state.proceed?
|
186
|
-
input = @interface.command_queue.empty? ?
|
187
|
-
@interface.read_command(prompt(context)) :
|
188
|
-
@interface.command_queue.shift
|
189
|
-
break unless input
|
190
|
-
catch(:debug_error) do
|
191
|
-
if input == ""
|
192
|
-
next unless @last_cmd
|
193
|
-
input = @last_cmd
|
194
|
-
else
|
195
|
-
@last_cmd = input
|
196
|
-
end
|
197
|
-
split_commands(input).each do |cmd|
|
198
|
-
one_cmd(commands, context, cmd)
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
#
|
205
|
-
# Executes a single byebug command
|
206
|
-
#
|
207
|
-
def one_cmd(commands, context, input)
|
208
|
-
if cmd = commands.find { |c| c.match(input) }
|
209
|
-
if context.dead? && cmd.class.need_context
|
210
|
-
print "Command is unavailable\n"
|
211
|
-
else
|
212
|
-
cmd.execute
|
213
|
-
end
|
214
|
-
else
|
215
|
-
unknown_cmd = commands.find { |c| c.class.unknown }
|
216
|
-
if unknown_cmd
|
217
|
-
unknown_cmd.execute
|
218
|
-
else
|
219
|
-
errmsg "Unknown command: \"#{input}\". Try \"help\".\n"
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
#
|
225
|
-
# Tasks to do before processor loop
|
226
|
-
#
|
227
|
-
def preloop(commands, context)
|
228
|
-
@context_was_dead = true if context.dead? and not @context_was_dead
|
229
|
-
|
230
|
-
if @context_was_dead
|
231
|
-
print "The program finished.\n"
|
232
|
-
@context_was_dead = false
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
|
-
class State
|
237
|
-
attr_accessor :commands, :context, :display, :file, :frame_pos
|
238
|
-
attr_accessor :interface, :line, :previous_line
|
239
|
-
|
240
|
-
def initialize(commands, context, display, file, interface, line)
|
241
|
-
@commands, @context, @display = commands, context, display
|
242
|
-
@file, @interface, @line = file, interface, line
|
243
|
-
@frame_pos, @previous_line, @proceed = 0, nil, false
|
244
|
-
end
|
245
|
-
|
246
|
-
extend Forwardable
|
247
|
-
def_delegators :@interface, :errmsg, :print, :confirm
|
248
|
-
|
249
|
-
def proceed?
|
250
|
-
@proceed
|
251
|
-
end
|
252
|
-
|
253
|
-
def proceed
|
254
|
-
@proceed = true
|
255
|
-
end
|
256
|
-
|
257
|
-
def location
|
258
|
-
loc = "#{CommandProcessor.canonic_file(@file)} @ #{@line}\n"
|
259
|
-
loc += "#{Byebug.line_at(@file, @line)}\n" unless
|
260
|
-
['(irb)', '-e'].include? @file
|
261
|
-
loc
|
262
|
-
end
|
263
|
-
end
|
264
|
-
|
265
|
-
end # class CommandProcessor
|
266
|
-
|
267
|
-
|
268
|
-
class ControlCommandProcessor < Processor
|
269
|
-
def initialize(interface)
|
270
|
-
super(interface)
|
271
|
-
@context_was_dead = false # Assume we haven't started.
|
272
|
-
end
|
273
|
-
|
274
|
-
def process_commands(verbose=false)
|
275
|
-
control_cmds = Command.commands.select do |cmd|
|
276
|
-
cmd.allow_in_control
|
277
|
-
end
|
278
|
-
state = State.new(@interface, control_cmds)
|
279
|
-
commands = control_cmds.map{|cmd| cmd.new(state) }
|
280
|
-
|
281
|
-
if @context_was_dead
|
282
|
-
print "The program finished.\n"
|
283
|
-
@context_was_dead = false
|
284
|
-
end
|
285
|
-
|
286
|
-
while input = @interface.read_command(prompt(nil))
|
287
|
-
print "+#{input}" if verbose
|
288
|
-
catch(:debug_error) do
|
289
|
-
if cmd = commands.find{|c| c.match(input) }
|
290
|
-
cmd.execute
|
291
|
-
else
|
292
|
-
errmsg "Unknown command\n"
|
293
|
-
end
|
294
|
-
end
|
295
|
-
end
|
296
|
-
rescue IOError, Errno::EPIPE
|
297
|
-
rescue Exception
|
298
|
-
print "INTERNAL ERROR!!! #{$!}\n" rescue nil
|
299
|
-
print $!.backtrace.map{|l| "\t#{l}"}.join("\n") rescue nil
|
300
|
-
ensure
|
301
|
-
@interface.close
|
302
|
-
end
|
303
|
-
|
304
|
-
#
|
305
|
-
# Prompt shown before reading a command.
|
306
|
-
#
|
307
|
-
def prompt(context)
|
308
|
-
return '(byebug:ctrl) '
|
309
|
-
end
|
310
|
-
|
311
|
-
class State
|
312
|
-
attr_reader :commands, :interface
|
313
|
-
|
314
|
-
def initialize(interface, commands)
|
315
|
-
@interface = interface
|
316
|
-
@commands = commands
|
317
|
-
end
|
318
|
-
|
319
|
-
def proceed
|
320
|
-
end
|
321
|
-
|
322
|
-
extend Forwardable
|
323
|
-
def_delegators :@interface, :errmsg, :print
|
324
|
-
|
325
|
-
def confirm(*args)
|
326
|
-
'y'
|
327
|
-
end
|
328
|
-
|
329
|
-
def context
|
330
|
-
nil
|
331
|
-
end
|
332
|
-
|
333
|
-
def file
|
334
|
-
errmsg "No filename given.\n"
|
335
|
-
throw :debug_error
|
336
|
-
end
|
337
|
-
end
|
338
|
-
end
|
339
18
|
end
|
data/lib/byebug/version.rb
CHANGED
data/test/frame_test.rb
CHANGED
@@ -86,7 +86,7 @@ class TestFrame < TestDsl::TestCase
|
|
86
86
|
|
87
87
|
it 'must set frame to the last one' do
|
88
88
|
enter 'frame -1'
|
89
|
-
debug_file('frame') { File.basename(state.file).must_equal '
|
89
|
+
debug_file('frame') { File.basename(state.file).must_equal 'minitest.rb' }
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'must not set frame if the frame number is too low' do
|
data/test/stepping_test.rb
CHANGED
@@ -15,7 +15,40 @@ class SteppingExample
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
class SteppingRaiseFromRubyMethodExample
|
19
|
+
def a
|
20
|
+
b
|
21
|
+
rescue
|
22
|
+
1
|
23
|
+
end
|
24
|
+
|
25
|
+
def b
|
26
|
+
c
|
27
|
+
end
|
28
|
+
|
29
|
+
def c
|
30
|
+
raise 'bang'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class SteppingRaiseFromCMethodExample
|
35
|
+
def a
|
36
|
+
b
|
37
|
+
rescue NameError
|
38
|
+
1
|
39
|
+
end
|
40
|
+
|
41
|
+
def b
|
42
|
+
c
|
43
|
+
end
|
44
|
+
|
45
|
+
def c
|
46
|
+
d
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
18
50
|
class TestStepping < TestDsl::TestCase
|
51
|
+
|
19
52
|
describe 'Next Command' do
|
20
53
|
|
21
54
|
describe 'method call behaviour' do
|
@@ -77,6 +110,26 @@ class TestStepping < TestDsl::TestCase
|
|
77
110
|
debug_file('stepping') { state.line.must_equal 8 }
|
78
111
|
end
|
79
112
|
end
|
113
|
+
|
114
|
+
describe 'raise/rescue behaviour' do
|
115
|
+
describe 'from c method' do
|
116
|
+
before { enter "break #{__FILE__}:36", 'cont' }
|
117
|
+
|
118
|
+
it 'must step over rescue' do
|
119
|
+
enter 'next'
|
120
|
+
debug_file('stepping_raise_from_c_method') { state.line.must_equal 38 }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe 'from ruby method' do
|
125
|
+
before { enter "break #{__FILE__}:20", 'cont' }
|
126
|
+
|
127
|
+
it 'must step over rescue' do
|
128
|
+
enter 'next'
|
129
|
+
debug_file('stepping_raise_from_ruby_method') { state.line.must_equal 22 }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
80
133
|
end
|
81
134
|
|
82
135
|
describe 'Step Command' do
|
data/test/test_helper.rb
CHANGED
@@ -1,7 +1,14 @@
|
|
1
|
+
if ENV['CI']
|
2
|
+
require 'coveralls'
|
3
|
+
Coveralls.wear! do
|
4
|
+
add_filter 'test'
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
1
8
|
require 'minitest'
|
2
9
|
require 'minitest/spec'
|
3
10
|
require 'pathname'
|
4
|
-
require 'mocha/
|
11
|
+
require 'mocha/mini_test'
|
5
12
|
require 'byebug'
|
6
13
|
|
7
14
|
Dir.glob(File.expand_path("../support/*.rb", __FILE__)).each { |f| require f }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: byebug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Rodriguez
|
@@ -10,92 +10,106 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2014-02-08 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: columnize
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - ~>
|
19
|
+
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.3
|
21
|
+
version: '0.3'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- - ~>
|
26
|
+
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: 0.3
|
28
|
+
version: '0.3'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: debugger-linecache
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - ~>
|
33
|
+
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: 1.2
|
35
|
+
version: '1.2'
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - ~>
|
40
|
+
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: 1.2
|
42
|
+
version: '1.2'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: rake
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - ~>
|
47
|
+
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 10.1
|
49
|
+
version: '10.1'
|
50
50
|
type: :development
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- - ~>
|
54
|
+
- - "~>"
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 10.1
|
56
|
+
version: '10.1'
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: rake-compiler
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
60
60
|
requirements:
|
61
|
-
- - ~>
|
61
|
+
- - "~>"
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 0.9
|
63
|
+
version: '0.9'
|
64
64
|
type: :development
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
|
-
- - ~>
|
68
|
+
- - "~>"
|
69
69
|
- !ruby/object:Gem::Version
|
70
|
-
version: 0.9
|
70
|
+
version: '0.9'
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: mocha
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
|
-
- - ~>
|
75
|
+
- - "~>"
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
77
|
+
version: '1.0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
80
|
version_requirements: !ruby/object:Gem::Requirement
|
81
81
|
requirements:
|
82
|
-
- - ~>
|
82
|
+
- - "~>"
|
83
83
|
- !ruby/object:Gem::Version
|
84
|
-
version:
|
84
|
+
version: '1.0'
|
85
85
|
- !ruby/object:Gem::Dependency
|
86
86
|
name: minitest
|
87
87
|
requirement: !ruby/object:Gem::Requirement
|
88
88
|
requirements:
|
89
|
-
- - ~>
|
89
|
+
- - "~>"
|
90
90
|
- !ruby/object:Gem::Version
|
91
|
-
version: 5.
|
91
|
+
version: '5.2'
|
92
92
|
type: :development
|
93
93
|
prerelease: false
|
94
94
|
version_requirements: !ruby/object:Gem::Requirement
|
95
95
|
requirements:
|
96
|
-
- - ~>
|
96
|
+
- - "~>"
|
97
97
|
- !ruby/object:Gem::Version
|
98
|
-
version: 5.
|
98
|
+
version: '5.2'
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: coveralls
|
101
|
+
requirement: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - "~>"
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0.7'
|
106
|
+
type: :development
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - "~>"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0.7'
|
99
113
|
description: |-
|
100
114
|
Byebug is a Ruby 2 debugger. It's implemented using the
|
101
115
|
Ruby 2 TracePoint C API for execution control and the Debug Inspector C API
|
@@ -111,8 +125,8 @@ extensions:
|
|
111
125
|
extra_rdoc_files:
|
112
126
|
- README.md
|
113
127
|
files:
|
114
|
-
- .gitignore
|
115
|
-
- .travis.yml
|
128
|
+
- ".gitignore"
|
129
|
+
- ".travis.yml"
|
116
130
|
- CHANGELOG.md
|
117
131
|
- CONTRIBUTING.md
|
118
132
|
- GUIDE.md
|
@@ -131,6 +145,7 @@ files:
|
|
131
145
|
- ext/byebug/threads.c
|
132
146
|
- lib/byebug.rb
|
133
147
|
- lib/byebug/command.rb
|
148
|
+
- lib/byebug/command_processor.rb
|
134
149
|
- lib/byebug/commands/breakpoints.rb
|
135
150
|
- lib/byebug/commands/catchpoint.rb
|
136
151
|
- lib/byebug/commands/condition.rb
|
@@ -160,6 +175,7 @@ files:
|
|
160
175
|
- lib/byebug/commands/trace.rb
|
161
176
|
- lib/byebug/commands/variables.rb
|
162
177
|
- lib/byebug/context.rb
|
178
|
+
- lib/byebug/control_command_processor.rb
|
163
179
|
- lib/byebug/helper.rb
|
164
180
|
- lib/byebug/interface.rb
|
165
181
|
- lib/byebug/interfaces/local_interface.rb
|
@@ -168,7 +184,6 @@ files:
|
|
168
184
|
- lib/byebug/processor.rb
|
169
185
|
- lib/byebug/remote.rb
|
170
186
|
- lib/byebug/version.rb
|
171
|
-
- logo.png
|
172
187
|
- test/breakpoints_test.rb
|
173
188
|
- test/conditions_test.rb
|
174
189
|
- test/continue_test.rb
|
@@ -207,6 +222,8 @@ files:
|
|
207
222
|
- test/examples/show.rb
|
208
223
|
- test/examples/source.rb
|
209
224
|
- test/examples/stepping.rb
|
225
|
+
- test/examples/stepping_raise_from_c_method.rb
|
226
|
+
- test/examples/stepping_raise_from_ruby_method.rb
|
210
227
|
- test/examples/test-triangle.rb
|
211
228
|
- test/examples/thread.rb
|
212
229
|
- test/examples/tmate.rb
|
@@ -250,17 +267,17 @@ require_paths:
|
|
250
267
|
- lib
|
251
268
|
required_ruby_version: !ruby/object:Gem::Requirement
|
252
269
|
requirements:
|
253
|
-
- -
|
270
|
+
- - ">="
|
254
271
|
- !ruby/object:Gem::Version
|
255
272
|
version: 2.0.0
|
256
273
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
257
274
|
requirements:
|
258
|
-
- -
|
275
|
+
- - ">="
|
259
276
|
- !ruby/object:Gem::Version
|
260
277
|
version: '0'
|
261
278
|
requirements: []
|
262
279
|
rubyforge_project:
|
263
|
-
rubygems_version: 2.1
|
280
|
+
rubygems_version: 2.2.1
|
264
281
|
signing_key:
|
265
282
|
specification_version: 4
|
266
283
|
summary: Ruby 2.0 fast debugger - base + cli
|
@@ -303,6 +320,8 @@ test_files:
|
|
303
320
|
- test/examples/show.rb
|
304
321
|
- test/examples/source.rb
|
305
322
|
- test/examples/stepping.rb
|
323
|
+
- test/examples/stepping_raise_from_c_method.rb
|
324
|
+
- test/examples/stepping_raise_from_ruby_method.rb
|
306
325
|
- test/examples/test-triangle.rb
|
307
326
|
- test/examples/thread.rb
|
308
327
|
- test/examples/tmate.rb
|
@@ -336,4 +355,3 @@ test_files:
|
|
336
355
|
- test/thread_test.rb
|
337
356
|
- test/trace_test.rb
|
338
357
|
- test/variables_test.rb
|
339
|
-
has_rdoc:
|
data/logo.png
DELETED
Binary file
|