byebug 2.3.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/README.md +3 -11
  4. data/Rakefile +10 -3
  5. data/bin/byebug +16 -2
  6. data/byebug.gemspec +1 -0
  7. data/ext/byebug/byebug.c +0 -54
  8. data/ext/byebug/byebug.h +3 -4
  9. data/ext/byebug/extconf.rb +1 -1
  10. data/lib/byebug.rb +15 -42
  11. data/lib/byebug/command.rb +12 -28
  12. data/lib/byebug/commands/breakpoints.rb +2 -0
  13. data/lib/byebug/commands/catchpoint.rb +1 -1
  14. data/lib/byebug/commands/condition.rb +1 -0
  15. data/lib/byebug/commands/display.rb +6 -0
  16. data/lib/byebug/commands/frame.rb +10 -3
  17. data/lib/byebug/commands/info.rb +5 -3
  18. data/lib/byebug/commands/reload.rb +1 -0
  19. data/lib/byebug/commands/set.rb +5 -1
  20. data/lib/byebug/commands/threads.rb +5 -4
  21. data/lib/byebug/commands/trace.rb +5 -5
  22. data/lib/byebug/context.rb +3 -3
  23. data/lib/byebug/interface.rb +3 -187
  24. data/lib/byebug/interfaces/local_interface.rb +88 -0
  25. data/lib/byebug/interfaces/remote_interface.rb +55 -0
  26. data/lib/byebug/interfaces/script_interface.rb +45 -0
  27. data/lib/byebug/processor.rb +15 -13
  28. data/lib/byebug/version.rb +1 -1
  29. data/test/breakpoints_test.rb +23 -25
  30. data/test/conditions_test.rb +6 -8
  31. data/test/continue_test.rb +4 -6
  32. data/test/debugger_alias_test.rb +5 -0
  33. data/test/display_test.rb +9 -11
  34. data/test/edit_test.rb +0 -2
  35. data/test/eval_test.rb +1 -3
  36. data/test/finish_test.rb +12 -12
  37. data/test/frame_test.rb +38 -40
  38. data/test/help_test.rb +1 -3
  39. data/test/info_test.rb +12 -14
  40. data/test/kill_test.rb +0 -2
  41. data/test/list_test.rb +1 -3
  42. data/test/method_test.rb +0 -2
  43. data/test/post_mortem_test.rb +77 -96
  44. data/test/quit_test.rb +0 -2
  45. data/test/reload_test.rb +0 -2
  46. data/test/repl_test.rb +3 -5
  47. data/test/restart_test.rb +0 -2
  48. data/test/save_test.rb +1 -3
  49. data/test/set_test.rb +3 -5
  50. data/test/show_test.rb +0 -2
  51. data/test/source_test.rb +0 -2
  52. data/test/stepping_test.rb +17 -19
  53. data/test/support/test_dsl.rb +21 -13
  54. data/test/test_helper.rb +23 -1
  55. data/test/thread_test.rb +19 -21
  56. data/test/trace_test.rb +12 -14
  57. data/test/variables_test.rb +6 -6
  58. metadata +22 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a787d2a2fe1495951f6d362e0f95dde1f3950dd8
4
- data.tar.gz: 4c188b52f8f94ee320f2401f90006cbfb5ad65cb
3
+ metadata.gz: 6a40151455c8ac55d4a9ef4c78744ab3b84aa31c
4
+ data.tar.gz: c29114c8ea62f89f2e323d734fc75d2e611f7cb0
5
5
  SHA512:
6
- metadata.gz: 4130241116b86b89c3a6e9f422ce80bdd37b18b327f82542d34781c24ddfd414dc1dd92f4aa200ef84360036b37cc0ce223998444ee1b62fd209350cd2a73560
7
- data.tar.gz: d24a84f9ebaf2b0ed2ea0d3265a6f2387f46e95ee43bc381fa4227f5dc0ade510da11e904754ed8cabaf42b8e39b7da6f498e6afaeb7c676166c2180fe590736
6
+ metadata.gz: 8aba52de48ca4f73cb7f433a9a2b3c602d3fb345ccc32bdfc1ff9ebe5353f414c354f53d6490d0f13c852ff9837128285a1b876f80104abbec0ed6eff3b52465
7
+ data.tar.gz: 89d9717c9be932067b9405b5e2dd51f7d08a5e7857887b010206256cacffdd7663b3da1c90badafe903b87a5ccaa759534b21b7eae90182ac2e7d0c9ca7d05d5
@@ -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
- * Stopping execution using the word `debugger` doesn't work anymore unless you
51
- explicitly alias it. Similarly, the startup configuration file is now called
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
- * Very actively mantained.
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(:test) do |t|
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.exists?(options.restart_script)
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.exists?(options.script)
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
@@ -29,4 +29,5 @@ Gem::Specification.new do |s|
29
29
  s.add_development_dependency 'rake', '~> 10.1.0'
30
30
  s.add_development_dependency 'rake-compiler', '~> 0.9.1'
31
31
  s.add_development_dependency 'mocha', '~> 0.14.0'
32
+ s.add_development_dependency 'minitest', '~> 5.0.8'
32
33
  end
@@ -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);
@@ -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 CTX_FL_SKIPPED (1<<6) /* skip all events */
14
- #define CTX_FL_SUSPEND (1<<7) /* thread currently suspended */
15
- #define CTX_FL_TRACING (1<<8) /* call at_tracing method */
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))
@@ -10,7 +10,7 @@ end
10
10
  if RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc/
11
11
  $CFLAGS ||= ''
12
12
  $CFLAGS += ' -Wall -Werror -Wno-unused-parameter'
13
- $CFLAGS += ' -gdwarf-2 -g3' if ENV['debug']
13
+ $CFLAGS += ' -gdwarf-2 -g3 -O0' if ENV['debug']
14
14
  end
15
15
 
16
16
  dir_config("ruby")
@@ -1,4 +1,4 @@
1
- require_relative 'byebug.so'
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.exists?(cwd_script)
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.exists?(home_script) and cwd_script != home_script
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. There are two ways of using it:
155
+ # Activates the post-mortem mode.
156
156
  #
157
- # == Global post-mortem mode
158
- # By calling Byebug.post_mortem method without a block, you install an
159
- # at_exit hook that intercepts any exception not handled by your script
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 block_given?
178
- old_post_mortem = self.post_mortem?
179
- begin
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 || !exp.__bb_context || !exp.__bb_context.calced_stack_size
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
@@ -23,12 +23,16 @@ module Byebug
23
23
  @commands ||= []
24
24
  end
25
25
 
26
- DEF_OPTIONS = { allow_in_control: false,
27
- allow_in_post_mortem: true ,
28
- event: true ,
29
- always_run: 0 ,
30
- unknown: false,
31
- need_context: false } unless defined?(DEF_OPTIONS)
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.exists? File.join(d, command) }
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("Thread.current.backtrace_locations", b)
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 "Catch exception #{@match[1]}.\n"
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"
@@ -1,6 +1,7 @@
1
1
  module Byebug
2
2
 
3
3
  class ConditionCommand < Command
4
+ self.allow_in_post_mortem = false
4
5
 
5
6
  def regexp
6
7
  /^\s* cond(?:ition)? (?:\s+(\d+)(?:\s+(.*))?)? \s*$/x
@@ -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