byebug 2.3.1 → 2.4.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 +15 -0
- data/README.md +3 -11
- data/Rakefile +10 -3
- data/bin/byebug +16 -2
- data/byebug.gemspec +1 -0
- data/ext/byebug/byebug.c +0 -54
- data/ext/byebug/byebug.h +3 -4
- data/ext/byebug/extconf.rb +1 -1
- data/lib/byebug.rb +15 -42
- data/lib/byebug/command.rb +12 -28
- data/lib/byebug/commands/breakpoints.rb +2 -0
- data/lib/byebug/commands/catchpoint.rb +1 -1
- data/lib/byebug/commands/condition.rb +1 -0
- data/lib/byebug/commands/display.rb +6 -0
- data/lib/byebug/commands/frame.rb +10 -3
- data/lib/byebug/commands/info.rb +5 -3
- data/lib/byebug/commands/reload.rb +1 -0
- data/lib/byebug/commands/set.rb +5 -1
- data/lib/byebug/commands/threads.rb +5 -4
- data/lib/byebug/commands/trace.rb +5 -5
- data/lib/byebug/context.rb +3 -3
- data/lib/byebug/interface.rb +3 -187
- data/lib/byebug/interfaces/local_interface.rb +88 -0
- data/lib/byebug/interfaces/remote_interface.rb +55 -0
- data/lib/byebug/interfaces/script_interface.rb +45 -0
- data/lib/byebug/processor.rb +15 -13
- data/lib/byebug/version.rb +1 -1
- data/test/breakpoints_test.rb +23 -25
- data/test/conditions_test.rb +6 -8
- data/test/continue_test.rb +4 -6
- data/test/debugger_alias_test.rb +5 -0
- data/test/display_test.rb +9 -11
- data/test/edit_test.rb +0 -2
- data/test/eval_test.rb +1 -3
- data/test/finish_test.rb +12 -12
- data/test/frame_test.rb +38 -40
- data/test/help_test.rb +1 -3
- data/test/info_test.rb +12 -14
- data/test/kill_test.rb +0 -2
- data/test/list_test.rb +1 -3
- data/test/method_test.rb +0 -2
- data/test/post_mortem_test.rb +77 -96
- data/test/quit_test.rb +0 -2
- data/test/reload_test.rb +0 -2
- data/test/repl_test.rb +3 -5
- data/test/restart_test.rb +0 -2
- data/test/save_test.rb +1 -3
- data/test/set_test.rb +3 -5
- data/test/show_test.rb +0 -2
- data/test/source_test.rb +0 -2
- data/test/stepping_test.rb +17 -19
- data/test/support/test_dsl.rb +21 -13
- data/test/test_helper.rb +23 -1
- data/test/thread_test.rb +19 -21
- data/test/trace_test.rb +12 -14
- data/test/variables_test.rb +6 -6
- metadata +22 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a40151455c8ac55d4a9ef4c78744ab3b84aa31c
|
4
|
+
data.tar.gz: c29114c8ea62f89f2e323d734fc75d2e611f7cb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8aba52de48ca4f73cb7f433a9a2b3c602d3fb345ccc32bdfc1ff9ebe5353f414c354f53d6490d0f13c852ff9837128285a1b876f80104abbec0ed6eff3b52465
|
7
|
+
data.tar.gz: 89d9717c9be932067b9405b5e2dd51f7d08a5e7857887b010206256cacffdd7663b3da1c90badafe903b87a5ccaa759534b21b7eae90182ac2e7d0c9ca7d05d5
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
# 2.4.0
|
2
|
+
|
3
|
+
* Use `require` instead of `require_relative` for loading byebug's extension
|
4
|
+
library (thanks @nobu)
|
5
|
+
* Adds back `debugger` as an alias to `byebug` (thanks @wallace)
|
6
|
+
* Adds -R option to byebug's binary to specify server's hostname:port for remote
|
7
|
+
debugging (thanks @mrkn)
|
8
|
+
* Fixes `thread list` showing too many threads
|
9
|
+
* Change in tracing global variables. Use `trace variable foo` instead of `trace
|
10
|
+
variable $foo`
|
11
|
+
* Fix setting post mortem mode with `set post_mortem`. Now this is the only
|
12
|
+
post mortem functionality available as specifying `Byebug.post_mortem` with a
|
13
|
+
block has been removed in this version.
|
14
|
+
|
15
|
+
|
1
16
|
# 2.3.1
|
2
17
|
|
3
18
|
* Fixes bug preventing users from deleting breakpoints
|
data/README.md
CHANGED
@@ -25,11 +25,6 @@ effects of one bug and go on to learn about another.
|
|
25
25
|
|
26
26
|
$ gem install byebug
|
27
27
|
|
28
|
-
**Please upgrade your ruby to 2.0.0-p247 or higher** - a bug in ruby core was
|
29
|
-
directly affecting byebug and a fix for it has been released with this
|
30
|
-
patchlevel (see [#5](https://github.com/deivid-rodriguez/byebug/issues/5) for
|
31
|
-
more information)
|
32
|
-
|
33
28
|
|
34
29
|
## Usage
|
35
30
|
|
@@ -47,11 +42,8 @@ Former [debugger](https://github.com/cldwalker/debugger) or
|
|
47
42
|
* Some gems (rails, rspec) implement debugging flags (-d, --debugger) that early
|
48
43
|
require and start the debugger. These flags are a performance penalty and Byebug
|
49
44
|
doesn't need them anymore so my recommendation is not to use them.
|
50
|
-
*
|
51
|
-
|
52
|
-
`.byebugrc` instead of `.rdebugrc`.
|
53
|
-
* `autoreload`, `autoeval` and `autolist` are default options in Byebug so you
|
54
|
-
no longer need to set them in the startup file.
|
45
|
+
* The startup configuration file is now called `.byebugrc` instead of
|
46
|
+
`.rdebugrc`.
|
55
47
|
|
56
48
|
|
57
49
|
## What's different from debugger
|
@@ -61,7 +53,7 @@ no longer need to set them in the startup file.
|
|
61
53
|
* Fixes all of debugger's open bugs in its issue tracker and provides some
|
62
54
|
enhancements, such as a markdown guide or the fact that `byebug` can now be
|
63
55
|
placed at the end of a block or method call.
|
64
|
-
*
|
56
|
+
* Actively mantained.
|
65
57
|
* Editor agnostic: no external editor built-in support.
|
66
58
|
* Pry command is built-in. No need of external gem like debugger-pry.
|
67
59
|
|
data/Rakefile
CHANGED
@@ -6,12 +6,19 @@ Rake::ExtensionTask.new('byebug')
|
|
6
6
|
|
7
7
|
SO_NAME = "byebug.so"
|
8
8
|
|
9
|
+
# Override default rake tests loader
|
10
|
+
class Rake::TestTask
|
11
|
+
def rake_loader
|
12
|
+
'test/test_helper.rb'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
9
16
|
desc "Run MiniTest suite"
|
10
17
|
task :test do
|
11
|
-
Rake::TestTask.new
|
12
|
-
t.test_files = FileList["test/*_test.rb"]
|
13
|
-
t.warning = true
|
18
|
+
Rake::TestTask.new do |t|
|
14
19
|
t.verbose = true
|
20
|
+
t.warning = true
|
21
|
+
t.pattern = 'test/*_test.rb'
|
15
22
|
end
|
16
23
|
end
|
17
24
|
|
data/bin/byebug
CHANGED
@@ -93,6 +93,7 @@ options = OpenStruct.new(
|
|
93
93
|
'quit' => true,
|
94
94
|
'restart_script' => nil,
|
95
95
|
'script' => nil,
|
96
|
+
'server' => nil,
|
96
97
|
'stop' => true,
|
97
98
|
'tracing' => false,
|
98
99
|
)
|
@@ -126,11 +127,18 @@ EOB
|
|
126
127
|
else
|
127
128
|
require name
|
128
129
|
end }
|
130
|
+
opts.on('-R', '--remote HOST[:PORT]', String, 'Specify byebug server spec') {
|
131
|
+
|server| host, port = server.split(':', 2)
|
132
|
+
host = 'localhost' if host.empty?
|
133
|
+
port = nil if port && port.empty?
|
134
|
+
port &&= port.to_i
|
135
|
+
options.server = [host, port].compact
|
136
|
+
}
|
129
137
|
opts.on('--restart-script FILE', String,
|
130
138
|
'Name of the script file to run. Erased after read') do
|
131
139
|
|restart_script|
|
132
140
|
options.restart_script = restart_script
|
133
|
-
unless File.
|
141
|
+
unless File.exist?(options.restart_script)
|
134
142
|
puts "Script file '#{options.restart_script}' is not found"
|
135
143
|
exit
|
136
144
|
end
|
@@ -138,7 +146,7 @@ EOB
|
|
138
146
|
opts.on('--script FILE', String, 'Name of the script file to run') do
|
139
147
|
|script|
|
140
148
|
options.script = script
|
141
|
-
unless File.
|
149
|
+
unless File.exist?(options.script)
|
142
150
|
puts "Script file '#{options.script}' is not found"
|
143
151
|
exit
|
144
152
|
end
|
@@ -191,6 +199,12 @@ rescue StandardError => e
|
|
191
199
|
exit(-1)
|
192
200
|
end
|
193
201
|
|
202
|
+
if options.server
|
203
|
+
puts "Connecting to byebug server #{options.server.join(':')}"
|
204
|
+
Byebug.start_client(*options.server)
|
205
|
+
exit
|
206
|
+
end
|
207
|
+
|
194
208
|
if ARGV.empty?
|
195
209
|
puts opts
|
196
210
|
puts
|
data/byebug.gemspec
CHANGED
data/ext/byebug/byebug.c
CHANGED
@@ -649,59 +649,6 @@ bb_set_verbose(VALUE self, VALUE value)
|
|
649
649
|
return value;
|
650
650
|
}
|
651
651
|
|
652
|
-
static VALUE
|
653
|
-
set_current_skipped_status(VALUE status)
|
654
|
-
{
|
655
|
-
VALUE context;
|
656
|
-
debug_context_t *dc;
|
657
|
-
|
658
|
-
context = bb_current_context(mByebug);
|
659
|
-
Data_Get_Struct(context, debug_context_t, dc);
|
660
|
-
|
661
|
-
if (status)
|
662
|
-
CTX_FL_SET(dc, CTX_FL_SKIPPED);
|
663
|
-
else
|
664
|
-
CTX_FL_UNSET(dc, CTX_FL_SKIPPED);
|
665
|
-
|
666
|
-
return Qnil;
|
667
|
-
}
|
668
|
-
|
669
|
-
static VALUE
|
670
|
-
debug_at_exit_c(VALUE proc)
|
671
|
-
{
|
672
|
-
return rb_funcall(proc, rb_intern("call"), 0);
|
673
|
-
}
|
674
|
-
|
675
|
-
static void
|
676
|
-
debug_at_exit_i(VALUE proc)
|
677
|
-
{
|
678
|
-
if (IS_STARTED)
|
679
|
-
{
|
680
|
-
set_current_skipped_status(Qtrue);
|
681
|
-
rb_ensure(debug_at_exit_c, proc, set_current_skipped_status, Qfalse);
|
682
|
-
}
|
683
|
-
else
|
684
|
-
debug_at_exit_c(proc);
|
685
|
-
}
|
686
|
-
|
687
|
-
/*
|
688
|
-
* call-seq:
|
689
|
-
* Byebug.debug_at_exit { block } -> proc
|
690
|
-
*
|
691
|
-
* Register <tt>at_exit</tt> hook which is escaped from byebug.
|
692
|
-
*/
|
693
|
-
static VALUE
|
694
|
-
bb_at_exit(VALUE self)
|
695
|
-
{
|
696
|
-
VALUE proc;
|
697
|
-
|
698
|
-
if (!rb_block_given_p()) rb_raise(rb_eArgError, "called without a block");
|
699
|
-
|
700
|
-
proc = rb_block_proc();
|
701
|
-
rb_set_end_proc(debug_at_exit_i, proc);
|
702
|
-
return proc;
|
703
|
-
}
|
704
|
-
|
705
652
|
/*
|
706
653
|
* call-seq:
|
707
654
|
* Byebug.tracing -> bool
|
@@ -810,7 +757,6 @@ Init_byebug()
|
|
810
757
|
rb_define_module_function(mByebug, "catchpoints" , bb_catchpoints , 0);
|
811
758
|
rb_define_module_function(mByebug, "contexts" , bb_contexts , 0);
|
812
759
|
rb_define_module_function(mByebug, "current_context", bb_current_context, 0);
|
813
|
-
rb_define_module_function(mByebug, "debug_at_exit" , bb_at_exit , 0);
|
814
760
|
rb_define_module_function(mByebug, "debug_load" , bb_load , -1);
|
815
761
|
rb_define_module_function(mByebug, "post_mortem?" , bb_post_mortem , 0);
|
816
762
|
rb_define_module_function(mByebug, "post_mortem=" , bb_set_post_mortem, 1);
|
data/ext/byebug/byebug.h
CHANGED
@@ -10,10 +10,9 @@
|
|
10
10
|
#define CTX_FL_ENABLE_BKPT (1<<3) /* cab check for breakpoints */
|
11
11
|
#define CTX_FL_FORCE_MOVE (1<<4) /* don't stop unless we've changed line */
|
12
12
|
#define CTX_FL_IGNORE (1<<5) /* this context belongs to ignored thread */
|
13
|
-
#define
|
14
|
-
#define
|
15
|
-
#define
|
16
|
-
#define CTX_FL_WAS_RUNNING (1<<9) /* thread was previously running */
|
13
|
+
#define CTX_FL_SUSPEND (1<<6) /* thread currently suspended */
|
14
|
+
#define CTX_FL_TRACING (1<<7) /* call at_tracing method */
|
15
|
+
#define CTX_FL_WAS_RUNNING (1<<8) /* thread was previously running */
|
17
16
|
|
18
17
|
/* macro functions */
|
19
18
|
#define CTX_FL_TEST(c,f) ((c)->flags & (f))
|
data/ext/byebug/extconf.rb
CHANGED
data/lib/byebug.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require 'byebug.so'
|
2
2
|
require_relative 'byebug/version'
|
3
3
|
require_relative 'byebug/context'
|
4
4
|
require_relative 'byebug/processor'
|
@@ -134,10 +134,10 @@ module Byebug
|
|
134
134
|
#
|
135
135
|
def run_init_script(out = handler.interface)
|
136
136
|
cwd_script = File.expand_path(File.join(".", INITFILE))
|
137
|
-
run_script(cwd_script, out) if File.
|
137
|
+
run_script(cwd_script, out) if File.exist?(cwd_script)
|
138
138
|
|
139
139
|
home_script = File.expand_path(File.join(ENV['HOME'].to_s, INITFILE))
|
140
|
-
if File.
|
140
|
+
if File.exist?(home_script) and cwd_script != home_script
|
141
141
|
run_script(home_script, out)
|
142
142
|
end
|
143
143
|
end
|
@@ -152,53 +152,24 @@ module Byebug
|
|
152
152
|
end
|
153
153
|
|
154
154
|
#
|
155
|
-
# Activates the post-mortem mode.
|
155
|
+
# Activates the post-mortem mode.
|
156
156
|
#
|
157
|
-
#
|
158
|
-
#
|
159
|
-
#
|
160
|
-
# and enables post-mortem mode.
|
157
|
+
# By calling Byebug.post_mortem method, you install an at_exit hook that
|
158
|
+
# intercepts any exception not handled by your script and enables
|
159
|
+
# post-mortem mode.
|
161
160
|
#
|
162
|
-
# == Local post-mortem mode
|
163
|
-
#
|
164
|
-
# If you know that a particular block of code raises an exception you can
|
165
|
-
# enable post-mortem mode by wrapping this block with Byebug.post_mortem,
|
166
|
-
# e.g.
|
167
|
-
#
|
168
|
-
# def offender
|
169
|
-
# raise 'error'
|
170
|
-
# end
|
171
|
-
# Byebug.post_mortem do
|
172
|
-
# ...
|
173
|
-
# offender
|
174
|
-
# ...
|
175
|
-
# end
|
176
161
|
def post_mortem
|
177
|
-
if
|
178
|
-
|
179
|
-
|
180
|
-
self.post_mortem = true
|
181
|
-
yield
|
182
|
-
rescue Exception => exp
|
183
|
-
handle_post_mortem(exp)
|
184
|
-
raise
|
185
|
-
ensure
|
186
|
-
self.post_mortem = old_post_mortem
|
187
|
-
end
|
188
|
-
else
|
189
|
-
return if self.post_mortem?
|
190
|
-
self.post_mortem = true
|
191
|
-
debug_at_exit do
|
192
|
-
handle_post_mortem($!) if post_mortem?
|
193
|
-
end
|
194
|
-
end
|
162
|
+
return if self.post_mortem?
|
163
|
+
at_exit { handle_post_mortem($!) if post_mortem? }
|
164
|
+
self.post_mortem = true
|
195
165
|
end
|
196
166
|
|
197
167
|
def handle_post_mortem(exp)
|
198
|
-
return if !exp
|
168
|
+
return if !exp
|
169
|
+
Byebug.last_exception = exp
|
170
|
+
return if !exp.__bb_context || !exp.__bb_context.calced_stack_size
|
199
171
|
orig_tracing = Byebug.tracing?
|
200
172
|
Byebug.tracing = false
|
201
|
-
Byebug.last_exception = exp
|
202
173
|
handler.at_line(exp.__bb_context, exp.__bb_file, exp.__bb_line)
|
203
174
|
ensure
|
204
175
|
Byebug.tracing = orig_tracing
|
@@ -224,4 +195,6 @@ module Kernel
|
|
224
195
|
end
|
225
196
|
Byebug.current_context.step_into steps_into if steps_into >= 0
|
226
197
|
end
|
198
|
+
|
199
|
+
alias_method :debugger, :byebug
|
227
200
|
end
|
data/lib/byebug/command.rb
CHANGED
@@ -23,12 +23,16 @@ module Byebug
|
|
23
23
|
@commands ||= []
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
attr_accessor :allow_in_control, :unknown, :need_context
|
27
|
+
attr_writer :allow_in_post_mortem, :always_run
|
28
|
+
|
29
|
+
def allow_in_post_mortem
|
30
|
+
@allow_in_post_mortem ||= !defined?(@allow_in_post_mortem) ? true : false
|
31
|
+
end
|
32
|
+
|
33
|
+
def always_run
|
34
|
+
@always_run ||= 0
|
35
|
+
end
|
32
36
|
|
33
37
|
def help(args)
|
34
38
|
if args && args[1]
|
@@ -73,9 +77,6 @@ module Byebug
|
|
73
77
|
end
|
74
78
|
|
75
79
|
def inherited(klass)
|
76
|
-
DEF_OPTIONS.each do |o, v|
|
77
|
-
klass.options[o] = v if klass.options[o].nil?
|
78
|
-
end
|
79
80
|
commands << klass
|
80
81
|
end
|
81
82
|
|
@@ -86,22 +87,6 @@ module Byebug
|
|
86
87
|
|name| Byebug.const_get(name) }.each { |mod| include mod }
|
87
88
|
end
|
88
89
|
|
89
|
-
def method_missing(meth, *args, &block)
|
90
|
-
if meth.to_s =~ /^(.+?)=$/
|
91
|
-
options[$1.intern] = args.first
|
92
|
-
else
|
93
|
-
if options.has_key?(meth)
|
94
|
-
options[meth]
|
95
|
-
else
|
96
|
-
super
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def options
|
102
|
-
@options ||= {}
|
103
|
-
end
|
104
|
-
|
105
90
|
def settings_map
|
106
91
|
@@settings_map ||= {}
|
107
92
|
end
|
@@ -143,7 +128,7 @@ module Byebug
|
|
143
128
|
|
144
129
|
def command_exists?(command)
|
145
130
|
ENV['PATH'].split(File::PATH_SEPARATOR).any? {
|
146
|
-
|d| File.
|
131
|
+
|d| File.exist? File.join(d, command) }
|
147
132
|
end
|
148
133
|
|
149
134
|
def terminal_width
|
@@ -155,7 +140,6 @@ module Byebug
|
|
155
140
|
nil
|
156
141
|
end
|
157
142
|
end
|
158
|
-
|
159
143
|
end
|
160
144
|
|
161
145
|
# Register default settings
|
@@ -193,7 +177,7 @@ module Byebug
|
|
193
177
|
begin
|
194
178
|
eval(str, b)
|
195
179
|
rescue StandardError, ScriptError => e
|
196
|
-
at = eval(
|
180
|
+
at = eval('Thread.current.backtrace_locations(1)', b)
|
197
181
|
print "#{at.shift}: #{e.class} Exception(#{e.message})\n"
|
198
182
|
for i in at
|
199
183
|
print "\tfrom #{i}\n"
|
@@ -2,6 +2,7 @@ module Byebug
|
|
2
2
|
|
3
3
|
# Implements byebug "break" command.
|
4
4
|
class BreakCommand < Command
|
5
|
+
self.allow_in_post_mortem = false
|
5
6
|
self.allow_in_control = true
|
6
7
|
|
7
8
|
def regexp
|
@@ -97,6 +98,7 @@ module Byebug
|
|
97
98
|
|
98
99
|
# Implements byebug "delete" command.
|
99
100
|
class DeleteCommand < Command
|
101
|
+
self.allow_in_post_mortem = false
|
100
102
|
self.allow_in_control = true
|
101
103
|
|
102
104
|
def regexp
|
@@ -19,7 +19,7 @@ module Byebug
|
|
19
19
|
print "Warning #{@match[1]} is not known to be a Class\n" unless
|
20
20
|
bb_eval "#{@match[1]}.is_a?(Class)", get_binding
|
21
21
|
Byebug.add_catchpoint @match[1]
|
22
|
-
print "
|
22
|
+
print "Catching exception #{@match[1]}.\n"
|
23
23
|
end
|
24
24
|
elsif @match[2] != 'off'
|
25
25
|
errmsg "Off expected. Got #{@match[2]}\n"
|
@@ -22,6 +22,8 @@ module Byebug
|
|
22
22
|
end
|
23
23
|
|
24
24
|
class AddDisplayCommand < Command
|
25
|
+
self.allow_in_post_mortem = false
|
26
|
+
|
25
27
|
def regexp
|
26
28
|
/^\s* disp(?:lay)? \s+ (.+) \s*$/x
|
27
29
|
end
|
@@ -45,6 +47,8 @@ module Byebug
|
|
45
47
|
end
|
46
48
|
|
47
49
|
class DisplayCommand < Command
|
50
|
+
self.allow_in_post_mortem = false
|
51
|
+
|
48
52
|
def self.always_run
|
49
53
|
2
|
50
54
|
end
|
@@ -69,6 +73,8 @@ module Byebug
|
|
69
73
|
end
|
70
74
|
|
71
75
|
class DeleteDisplayCommand < Command
|
76
|
+
self.allow_in_post_mortem = false
|
77
|
+
|
72
78
|
def regexp
|
73
79
|
/^\s* undisp(?:lay)? (?:\s+(\S+))? \s*$/x
|
74
80
|
end
|