debugger 1.0.1 → 1.1.0

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.
@@ -1,3 +1,8 @@
1
+ ## 1.1.0
2
+ * Point to new debugger-ruby_core_source API
3
+ * General cleanup
4
+ * fix rdebug version
5
+
1
6
  ## 1.0.1
2
7
  * Fix ruby-debug not being loaded from debugger.rb
3
8
 
data/README.md CHANGED
@@ -14,15 +14,15 @@ For Windows install instructions, see OLD\_README.
14
14
 
15
15
  ## Usage
16
16
 
17
- To use in your Rails app, drop in your Gemfile:
18
-
19
- gem 'debugger'
20
-
21
17
  Wherever you need a debugger, simply:
22
18
  ```ruby
23
19
  require 'debugger'; debugger
24
20
  ```
25
21
 
22
+ To use in your Rails app, drop in your Gemfile:
23
+
24
+ gem 'debugger'
25
+
26
26
  ## Reason for Fork
27
27
 
28
28
  * ruby-debug19 maintainer isn't maintaining:
@@ -37,16 +37,20 @@ require 'debugger'; debugger
37
37
 
38
38
  ## What's different from ruby-debug19
39
39
 
40
- * Works on 1.9.2 and 1.9.3
41
- * 1.9.2 points to ruby-debug-base19-0.11.25 headers
42
- * 1.9.3 points to ruby-debug-base19-0.11.26 headers
43
- * Install painlessly for rvm and rbenv rubies i.e. no compiler flags needed
44
- * Tests are up on travis-ci
45
- * The gem name matches the module namespace, Debugger, and main required file, debugger.
46
- * Rake tasks have been updated
47
- * ruby-debug-base19 and ruby-debug19 are released as one gem
48
- * No downloading ruby source during install - was behavior of old ruby_core_source dependency
49
- * Fix LocalJumpError caused by using proc in extconf.rb
40
+ * Major
41
+ * Works on 1.9.2 and 1.9.3
42
+ * 1.9.2 points to ruby-debug-base19-0.11.25 headers
43
+ * 1.9.3 points to ruby-debug-base19-0.11.26 headers
44
+ * Install painlessly for rvm and rbenv rubies i.e. no compiler flags needed
45
+ * No downloading ruby source during install - was behavior of old ruby_core_source dependency
46
+ * Fix LocalJumpError caused by using proc in extconf.rb
47
+ * Passing tests are up on travis-ci
48
+ * Minor
49
+ * The gem name matches the module namespace, Debugger, and main required file, debugger.
50
+ * ruby-debug-base19 and ruby-debug19 are released as one gem
51
+ * Rake tasks have been updated
52
+ * No more $LOAD_PATH manipulation or runtime code outside of lib
53
+ * man page available via gem-man
50
54
 
51
55
  ## Issues
52
56
  Please report them [on github](http://github.com/cldwalker/debugger/issues).
@@ -65,4 +69,3 @@ Let's keep this working for the ruby community!
65
69
 
66
70
  * Fix test/test-*.rb
67
71
  * Work with others willing to tackle jruby, rubinius or windows support
68
- * Clean up (merge) lib + cli as separate runtime paths for ruby-debug-base19 and ruby-debug19
data/bin/rdebug CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  #=== Summary
4
4
  #
5
- #A command-line front-end to the Ruby debugger, <tt>ruby-debug</tt>, the
5
+ #A command-line front-end to the Ruby debugger, <tt>debugger</tt>, the
6
6
  #Fast Ruby Debugger.
7
7
  #
8
8
  #Command invocation:
@@ -104,7 +104,7 @@
104
104
 
105
105
  require 'optparse'
106
106
  require 'ostruct'
107
- require 'ruby-debug'
107
+ require 'debugger'
108
108
 
109
109
  def debug_program(options)
110
110
  # Make sure Ruby script syntax checks okay.
@@ -225,7 +225,7 @@ EOB
225
225
  opts.on('-r', '--require SCRIPT', String,
226
226
  'Require the library, before executing your script') do |name|
227
227
  if name == 'debug'
228
- puts "ruby-debug is not compatible with Ruby's 'debug' library. This option is ignored."
228
+ puts "debugger is not compatible with Ruby's 'debug' library. This option is ignored."
229
229
  else
230
230
  require name
231
231
  end
@@ -262,7 +262,7 @@ EOB
262
262
  end
263
263
  opts.on_tail('--version',
264
264
  'Print the version') do
265
- puts "ruby-debug #{Debugger::VERSION}"
265
+ puts "debugger #{Debugger::VERSION}"
266
266
  exit
267
267
  end
268
268
  opts.on('--verbose', 'Turn on verbose mode') do
@@ -271,7 +271,7 @@ EOB
271
271
  end
272
272
  opts.on_tail('-v',
273
273
  'Print version number, then turn on verbose mode') do
274
- puts "ruby-debug #{Debugger::VERSION}"
274
+ puts "debugger #{Debugger::VERSION}"
275
275
  $VERBOSE = true
276
276
  end
277
277
  end
@@ -20,8 +20,8 @@ handling, bindings for stack frames among other things.
20
20
  s.extensions << "ext/ruby_debug/extconf.rb"
21
21
  s.executables = ["rdebug"]
22
22
  s.add_dependency "columnize", ">= 0.3.1"
23
- s.add_dependency "debugger-ruby_core_source"
24
- s.add_dependency "debugger-linecache"
23
+ s.add_dependency "debugger-ruby_core_source", '~> 1.1'
24
+ s.add_dependency "debugger-linecache", '~> 1.1'
25
25
  s.add_development_dependency 'rake', '~> 0.9.2.2'
26
26
  s.add_development_dependency 'rake-compiler', '~> 0.8.0'
27
27
  end
@@ -10,7 +10,7 @@ elsif bindir =~ %r{(^.*/\.rvm/rubies)/([^/]+)/bin$}
10
10
  end
11
11
 
12
12
  require "mkmf"
13
- require "ruby_core_source"
13
+ require "debugger/ruby_core_source"
14
14
  require 'fileutils'
15
15
 
16
16
  if RUBY_VERSION < "1.9"
@@ -55,7 +55,7 @@ current_dir = File.dirname(__FILE__)
55
55
  end
56
56
 
57
57
  dir_config("ruby")
58
- if !Ruby_core_source::create_makefile_with_core(hdrs, "ruby_debug")
58
+ if !Debugger::RubyCoreSource.create_makefile_with_core(hdrs, "ruby_debug")
59
59
  STDERR.print("Makefile creation failed\n")
60
60
  STDERR.print("*************************************************************\n\n")
61
61
  STDERR.print(" NOTE: If your headers were not found, try passing\n")
@@ -1,5 +1,5 @@
1
1
  module Debugger
2
2
  # TODO: remove version from C ext
3
3
  send :remove_const, :VERSION if const_defined? :VERSION
4
- VERSION = '1.0.1'
4
+ VERSION = '1.1.0'
5
5
  end
@@ -3,11 +3,11 @@ require 'stringio'
3
3
  require 'socket'
4
4
  require 'thread'
5
5
  require 'ruby-debug-base'
6
- require_relative 'ruby-debug/processor'
6
+ require 'ruby-debug/processor'
7
7
 
8
8
  module Debugger
9
9
  self.handler = CommandProcessor.new
10
-
10
+
11
11
  # the port number used for remote debugging
12
12
  PORT = 8989 unless defined?(PORT)
13
13
 
@@ -16,31 +16,31 @@ module Debugger
16
16
  if RUBY_PLATFORM =~ /mswin/
17
17
  # Of course MS Windows has to be different
18
18
  INITFILE = 'rdebug.ini'
19
- HOME_DIR = (ENV['HOME'] ||
19
+ HOME_DIR = (ENV['HOME'] ||
20
20
  ENV['HOMEDRIVE'].to_s + ENV['HOMEPATH'].to_s).to_s
21
21
  else
22
22
  INITFILE = '.rdebugrc'
23
23
  HOME_DIR = ENV['HOME'].to_s
24
24
  end
25
25
  end
26
-
26
+
27
27
  class << self
28
28
  # gdb-style annotation mode. Used in GNU Emacs interface
29
29
  attr_accessor :annotate
30
30
 
31
- # in remote mode, wait for the remote connection
31
+ # in remote mode, wait for the remote connection
32
32
  attr_accessor :wait_connection
33
33
 
34
34
  # If set, a string to look for in caller() and is used to see
35
35
  # if the call stack is truncated.
36
- attr_accessor :start_sentinal
37
-
36
+ attr_accessor :start_sentinal
37
+
38
38
  attr_reader :thread, :control_thread
39
39
 
40
40
  def interface=(value) # :nodoc:
41
41
  handler.interface = value
42
42
  end
43
-
43
+
44
44
  #
45
45
  # Starts a remote debugger.
46
46
  #
@@ -57,12 +57,12 @@ module Debugger
57
57
  end
58
58
 
59
59
  start_control(host, ctrl_port)
60
-
60
+
61
61
  yield if block_given?
62
-
62
+
63
63
  mutex = Mutex.new
64
64
  proceed = ConditionVariable.new
65
-
65
+
66
66
  @thread = DebugThread.new do
67
67
  server = TCPServer.new(host, cmd_port)
68
68
  while (session = server.accept)
@@ -77,11 +77,11 @@ module Debugger
77
77
  if wait_connection
78
78
  mutex.synchronize do
79
79
  proceed.wait(mutex)
80
- end
80
+ end
81
81
  end
82
82
  end
83
83
  alias start_server start_remote
84
-
84
+
85
85
  def start_control(host = nil, ctrl_port = PORT + 1) # :nodoc:
86
86
  return if defined?(@control_thread) && @control_thread
87
87
  @control_thread = DebugThread.new do
@@ -93,7 +93,7 @@ module Debugger
93
93
  end
94
94
  end
95
95
  end
96
-
96
+
97
97
  #
98
98
  # Connects to the remote debugger
99
99
  #
@@ -102,10 +102,10 @@ module Debugger
102
102
  interface = Debugger::LocalInterface.new
103
103
  socket = TCPSocket.new(host, port)
104
104
  puts "Connected."
105
-
105
+
106
106
  catch(:exit) do
107
107
  while (line = socket.gets)
108
- case line
108
+ case line
109
109
  when /^PROMPT (.*)$/
110
110
  input = interface.read_command($1)
111
111
  throw :exit unless input
@@ -121,7 +121,7 @@ module Debugger
121
121
  end
122
122
  socket.close
123
123
  end
124
-
124
+
125
125
  # Runs normal debugger initialization scripts
126
126
  # Reads and executes the commands from init file (if any) in the
127
127
  # current working directory. This is only done if the current
@@ -134,7 +134,7 @@ module Debugger
134
134
  run_script(cwd_script_file, out) if File.exists?(cwd_script_file)
135
135
 
136
136
  home_script_file = File.expand_path(File.join(HOME_DIR, INITFILE))
137
- run_script(home_script_file, out) if File.exists?(home_script_file) and
137
+ run_script(home_script_file, out) if File.exists?(home_script_file) and
138
138
  cwd_script_file != home_script_file
139
139
  end
140
140
 
@@ -1,5 +1,5 @@
1
1
  require 'columnize'
2
- require_relative 'helper'
2
+ require 'ruby-debug/helper'
3
3
 
4
4
  module Debugger
5
5
  RUBY_DEBUG_DIR = File.expand_path(File.dirname(__FILE__)) unless
@@ -1,5 +1,5 @@
1
- require_relative 'interface'
2
- require_relative 'command'
1
+ require 'ruby-debug/interface'
2
+ require 'ruby-debug/command'
3
3
 
4
4
  module Debugger
5
5
 
@@ -11,12 +11,12 @@ module Debugger
11
11
  def afmt(msg, newline="\n")
12
12
  "\032\032#{msg}#{newline}"
13
13
  end
14
-
14
+
15
15
  def aprint(msg)
16
16
  print afmt(msg) if Debugger.annotate.to_i > 2
17
17
  end
18
18
 
19
- # FIXME: use delegate?
19
+ # FIXME: use delegate?
20
20
  def errmsg(*args)
21
21
  @interface.errmsg(*args)
22
22
  end
@@ -30,7 +30,7 @@ module Debugger
30
30
  def print(*args)
31
31
  @interface.print(*args)
32
32
  end
33
-
33
+
34
34
  end
35
35
 
36
36
  class CommandProcessor < Processor # :nodoc:
@@ -38,12 +38,12 @@ module Debugger
38
38
 
39
39
  # FIXME: get from Command regexp method.
40
40
  @@Show_breakpoints_postcmd = [
41
- /^\s*b(?:reak)?/,
41
+ /^\s*b(?:reak)?/,
42
42
  /^\s* cond(?:ition)? (?:\s+(\d+)\s*(.*))?$/ix,
43
43
  /^\s*del(?:ete)?(?:\s+(.*))?$/ix,
44
44
  /^\s* dis(?:able)? (?:\s+(.*))?$/ix,
45
45
  /^\s* en(?:able)? (?:\s+(.*))?$/ix,
46
- # "tbreak", "clear",
46
+ # "tbreak", "clear",
47
47
  ]
48
48
  @@Show_annotations_run = [
49
49
  /^\s*c(?:ont(?:inue)?)?(?:\s+(.*))?$/,
@@ -57,11 +57,11 @@ module Debugger
57
57
  /^\s* f(?:rame)? (?:\s+ (.*))? \s*$/x,
58
58
  /^\s* u(?:p)? (?:\s+(.*))?$/x
59
59
  ]
60
-
60
+
61
61
  def initialize(interface = LocalInterface.new)
62
62
  @interface = interface
63
63
  @display = []
64
-
64
+
65
65
  @mutex = Mutex.new
66
66
  @last_cmd = nil
67
67
  @last_file = nil # Filename the last time we stopped
@@ -70,22 +70,22 @@ module Debugger
70
70
  @debugger_displays_were_empty = true # No display 1st time
71
71
  @debugger_context_was_dead = true # Assume we haven't started.
72
72
  end
73
-
73
+
74
74
  def interface=(interface)
75
75
  @mutex.synchronize do
76
76
  @interface.close if @interface
77
77
  @interface = interface
78
78
  end
79
79
  end
80
-
80
+
81
81
  require 'pathname' # For cleanpath
82
-
83
- # Regularize file name.
84
- # This is also used as a common funnel place if basename is
85
- # desired or if we are working remotely and want to change the
82
+
83
+ # Regularize file name.
84
+ # This is also used as a common funnel place if basename is
85
+ # desired or if we are working remotely and want to change the
86
86
  # basename. Or we are eliding filenames.
87
87
  def self.canonic_file(filename)
88
- # For now we want resolved filenames
88
+ # For now we want resolved filenames
89
89
  if Command.settings[:basename]
90
90
  File.basename(filename)
91
91
  else
@@ -95,7 +95,7 @@ module Debugger
95
95
  end
96
96
 
97
97
  def self.print_location_and_text(file, line)
98
- file_line = "%s:%s\n%s" % [canonic_file(file), line,
98
+ file_line = "%s:%s\n%s" % [canonic_file(file), line,
99
99
  Debugger.line_at(file, line)]
100
100
  # FIXME: use annotations routines
101
101
  if Debugger.annotate.to_i > 2
@@ -105,7 +105,7 @@ module Debugger
105
105
  end
106
106
  print file_line
107
107
  end
108
-
108
+
109
109
  def self.protect(mname)
110
110
  alias_method "__#{mname}", mname
111
111
  module_eval %{
@@ -124,7 +124,7 @@ module Debugger
124
124
  end
125
125
  }
126
126
  end
127
-
127
+
128
128
  def at_breakpoint(context, breakpoint)
129
129
  aprint 'stopped' if Debugger.annotate.to_i > 2
130
130
  n = Debugger.breakpoints.index(breakpoint) + 1
@@ -136,7 +136,7 @@ module Debugger
136
136
  print "Breakpoint %d at %s:%s\n", n, file, line
137
137
  end
138
138
  protect :at_breakpoint
139
-
139
+
140
140
  def at_catchpoint(context, excpt)
141
141
  aprint 'stopped' if Debugger.annotate.to_i > 2
142
142
  file = CommandProcessor.canonic_file(context.frame_file(0))
@@ -152,13 +152,13 @@ module Debugger
152
152
  end
153
153
  end
154
154
  protect :at_catchpoint
155
-
155
+
156
156
  def at_tracing(context, file, line)
157
- return if defined?(Debugger::RDEBUG_FILE) &&
157
+ return if defined?(Debugger::RDEBUG_FILE) &&
158
158
  Debugger::RDEBUG_FILE == file # Don't trace ourself
159
159
  @last_file = CommandProcessor.canonic_file(file)
160
160
  file = CommandProcessor.canonic_file(file)
161
- unless file == @last_file and @last_line == line and
161
+ unless file == @last_file and @last_line == line and
162
162
  Command.settings[:tracing_plus]
163
163
  print "Tracing(%d):%s:%s %s",
164
164
  context.thnum, file, line, Debugger.line_at(file, line)
@@ -173,18 +173,18 @@ module Debugger
173
173
  process_commands(context, file, line)
174
174
  end
175
175
  protect :at_line
176
-
176
+
177
177
  def at_return(context, file, line)
178
178
  context.stop_frame = -1
179
179
  process_commands(context, file, line)
180
180
  end
181
-
181
+
182
182
  private
183
183
 
184
184
  # The prompt shown before reading a command.
185
185
  def prompt(context)
186
186
  p = '(rdb:%s) ' % (context.dead? ? 'post-mortem' : context.thnum)
187
- p = afmt("pre-prompt")+p+"\n"+afmt("prompt") if
187
+ p = afmt("pre-prompt")+p+"\n"+afmt("prompt") if
188
188
  Debugger.annotate.to_i > 2
189
189
  return p
190
190
  end
@@ -197,7 +197,7 @@ module Debugger
197
197
  event_cmds = Command.commands.select{|cmd| cmd.event }
198
198
 
199
199
  # Remove some commands in post-mortem
200
- event_cmds = event_cmds.find_all do |cmd|
200
+ event_cmds = event_cmds.find_all do |cmd|
201
201
  cmd.allow_in_post_mortem
202
202
  end if context.dead?
203
203
 
@@ -211,11 +211,11 @@ module Debugger
211
211
  s.commands = event_cmds
212
212
  end
213
213
  @interface.state = state if @interface.respond_to?('state=')
214
-
214
+
215
215
  # Bind commands to the current state.
216
216
  commands = event_cmds.map{|cmd| cmd.new(state)}
217
217
 
218
- commands.select do |cmd|
218
+ commands.select do |cmd|
219
219
  cmd.class.always_run >= run_level
220
220
  end.each {|cmd| cmd.execute}
221
221
  return state, commands
@@ -240,10 +240,10 @@ module Debugger
240
240
  m
241
241
  end
242
242
  end
243
-
243
+
244
244
  preloop(commands, context)
245
245
  CommandProcessor.print_location_and_text(file, line)
246
- while !state.proceed?
246
+ while !state.proceed?
247
247
  input = if @interface.command_queue.empty?
248
248
  @interface.read_command(prompt(context))
249
249
  else
@@ -265,7 +265,7 @@ module Debugger
265
265
  end
266
266
  postloop(commands, context)
267
267
  end # process_commands
268
-
268
+
269
269
  def one_cmd(commands, context, input)
270
270
  if cmd = commands.find{ |c| c.match(input) }
271
271
  if context.dead? && cmd.class.need_context
@@ -283,14 +283,14 @@ module Debugger
283
283
  end
284
284
  end
285
285
  end
286
-
286
+
287
287
  def preloop(commands, context)
288
288
  aprint('stopped') if Debugger.annotate.to_i > 2
289
289
  if context.dead?
290
290
  unless @debugger_context_was_dead
291
291
  if Debugger.annotate.to_i > 2
292
- aprint('exited')
293
- print "The program finished.\n"
292
+ aprint('exited')
293
+ print "The program finished.\n"
294
294
  end
295
295
  @debugger_context_was_dead = true
296
296
  end
@@ -307,7 +307,7 @@ module Debugger
307
307
  context.dead?
308
308
  end
309
309
  end
310
-
310
+
311
311
  def postcmd(commands, context, cmd)
312
312
  if Debugger.annotate.to_i > 0
313
313
  cmd = @last_cmd unless cmd
@@ -315,7 +315,7 @@ module Debugger
315
315
  @@Show_breakpoints_postcmd.find{|pat| cmd =~ pat}
316
316
  display_annotations(commands, context)
317
317
  if @@Show_annotations_postcmd.find{|pat| cmd =~ pat}
318
- annotation('stack', commands, context, "where") if
318
+ annotation('stack', commands, context, "where") if
319
319
  context.stack_size > 0
320
320
  annotation('variables', commands, context, "info variables") unless
321
321
  context.dead?
@@ -340,14 +340,14 @@ module Debugger
340
340
 
341
341
  def breakpoint_annotations(commands, context)
342
342
  unless Debugger.breakpoints.empty? and @debugger_breakpoints_were_empty
343
- annotation('breakpoints', commands, context, "info breakpoints")
343
+ annotation('breakpoints', commands, context, "info breakpoints")
344
344
  @debugger_breakpoints_were_empty = Debugger.breakpoints.empty?
345
345
  end
346
346
  end
347
347
 
348
348
  def display_annotations(commands, context)
349
349
  return if display.empty?
350
- # have_display = display.find{|d| d[0]}
350
+ # have_display = display.find{|d| d[0]}
351
351
  # return unless have_display and @debugger_displays_were_empty
352
352
  # @debugger_displays_were_empty = have_display
353
353
  annotation('display', commands, context, "display")
@@ -366,7 +366,7 @@ module Debugger
366
366
  yield self
367
367
  end
368
368
 
369
- # FIXME: use delegate?
369
+ # FIXME: use delegate?
370
370
  def errmsg(*args)
371
371
  @interface.errmsg(*args)
372
372
  end
@@ -388,25 +388,25 @@ module Debugger
388
388
  end
389
389
  end
390
390
  end
391
-
391
+
392
392
  class ControlCommandProcessor < Processor # :nodoc:
393
393
  def initialize(interface)
394
394
  super()
395
395
  @interface = interface
396
396
  @debugger_context_was_dead = true # Assume we haven't started.
397
397
  end
398
-
398
+
399
399
  def process_commands(verbose=false)
400
- control_cmds = Command.commands.select do |cmd|
401
- cmd.allow_in_control
400
+ control_cmds = Command.commands.select do |cmd|
401
+ cmd.allow_in_control
402
402
  end
403
403
  state = State.new(@interface, control_cmds)
404
404
  commands = control_cmds.map{|cmd| cmd.new(state) }
405
405
 
406
406
  unless @debugger_context_was_dead
407
407
  if Debugger.annotate.to_i > 2
408
- aprint 'exited'
409
- print "The program finished.\n"
408
+ aprint 'exited'
409
+ print "The program finished.\n"
410
410
  end
411
411
  @debugger_context_was_dead = true
412
412
  end
@@ -433,34 +433,34 @@ module Debugger
433
433
  # Note: have an unused 'context' parameter to match the local interface.
434
434
  def prompt(context)
435
435
  p = '(rdb:ctrl) '
436
- p = afmt("pre-prompt")+p+"\n"+afmt("prompt") if
436
+ p = afmt("pre-prompt")+p+"\n"+afmt("prompt") if
437
437
  Debugger.annotate.to_i > 2
438
438
  return p
439
439
  end
440
440
 
441
441
  class State # :nodoc:
442
442
  attr_reader :commands, :interface
443
-
443
+
444
444
  def initialize(interface, commands)
445
445
  @interface = interface
446
446
  @commands = commands
447
447
  end
448
-
448
+
449
449
  def proceed
450
450
  end
451
-
451
+
452
452
  def errmsg(*args)
453
453
  @interface.print(*args)
454
454
  end
455
-
455
+
456
456
  def print(*args)
457
457
  @interface.print(*args)
458
458
  end
459
-
459
+
460
460
  def confirm(*args)
461
461
  'y'
462
462
  end
463
-
463
+
464
464
  def context
465
465
  nil
466
466
  end