ruby-debug 0.10.1 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/CHANGES +7 -0
  2. data/ChangeLog +315 -278
  3. data/Rakefile +6 -6
  4. data/bin/rdebug +7 -3
  5. data/cli/ruby-debug.rb +2 -2
  6. data/cli/ruby-debug/commands/breakpoints.rb +15 -15
  7. data/cli/ruby-debug/commands/catchpoint.rb +18 -6
  8. data/cli/ruby-debug/commands/continue.rb +12 -6
  9. data/cli/ruby-debug/commands/info.rb +3 -3
  10. data/cli/ruby-debug/commands/irb.rb +2 -2
  11. data/cli/ruby-debug/commands/list.rb +1 -1
  12. data/cli/ruby-debug/commands/method.rb +44 -2
  13. data/cli/ruby-debug/commands/save.rb +16 -6
  14. data/cli/ruby-debug/commands/set.rb +11 -8
  15. data/cli/ruby-debug/commands/show.rb +28 -24
  16. data/cli/ruby-debug/commands/trace.rb +35 -11
  17. data/cli/ruby-debug/commands/variables.rb +47 -4
  18. data/cli/ruby-debug/interface.rb +28 -8
  19. data/cli/ruby-debug/processor.rb +6 -4
  20. data/rdbg.rb +0 -0
  21. data/test/base/base.rb +0 -0
  22. data/test/base/binding.rb +0 -0
  23. data/test/base/catchpoint.rb +0 -0
  24. data/test/bp_loop_issue.rb +3 -0
  25. data/test/classes.rb +11 -0
  26. data/test/cli/commands/catchpoint_test.rb +35 -0
  27. data/test/data/break_loop_bug.cmd +5 -0
  28. data/test/data/break_loop_bug.right +15 -0
  29. data/test/data/breakpoints.cmd +1 -1
  30. data/test/data/breakpoints.right +8 -12
  31. data/test/data/catch.cmd +17 -0
  32. data/test/data/catch.right +37 -0
  33. data/test/data/emacs_basic.right +2 -7
  34. data/test/data/frame.cmd +3 -0
  35. data/test/data/frame.right +4 -0
  36. data/test/data/method.cmd +10 -0
  37. data/test/data/method.right +21 -0
  38. data/test/data/methodsig.cmd +10 -0
  39. data/test/data/methodsig.right +20 -0
  40. data/test/data/output.right +0 -10
  41. data/test/data/quit.right +0 -9
  42. data/test/data/raise.right +1 -1
  43. data/test/data/save.cmd +33 -0
  44. data/test/data/save.right +59 -0
  45. data/test/data/setshow.cmd +13 -0
  46. data/test/data/setshow.right +25 -0
  47. data/test/dollar-0.rb +0 -0
  48. data/test/gcd-dbg.rb +0 -0
  49. data/test/helper.rb +24 -2
  50. data/test/pm-base.rb +0 -0
  51. data/test/pm.rb +0 -0
  52. data/test/raise.rb +0 -0
  53. data/test/tdebug.rb +5 -6
  54. data/test/test-annotate.rb +0 -0
  55. data/test/test-break-bad.rb +11 -0
  56. data/test/test-breakpoints.rb +0 -0
  57. data/test/test-catch.rb +25 -0
  58. data/test/test-condition.rb +0 -0
  59. data/test/test-ctrl.rb +0 -0
  60. data/test/test-display.rb +0 -0
  61. data/test/test-dollar-0.rb +0 -0
  62. data/test/test-edit.rb +0 -0
  63. data/test/test-emacs-basic.rb +2 -2
  64. data/test/test-enable.rb +0 -0
  65. data/test/test-finish.rb +0 -0
  66. data/test/test-frame.rb +11 -3
  67. data/test/test-help.rb +0 -0
  68. data/test/test-hist.rb +0 -0
  69. data/test/test-info-thread.rb +0 -0
  70. data/test/test-info-var.rb +0 -0
  71. data/test/test-info.rb +0 -0
  72. data/test/test-init.rb +3 -1
  73. data/test/test-list.rb +0 -0
  74. data/test/test-method.rb +34 -0
  75. data/test/test-output.rb +0 -0
  76. data/test/test-pm.rb +0 -0
  77. data/test/test-quit.rb +0 -0
  78. data/test/test-raise.rb +0 -0
  79. data/test/test-save.rb +25 -0
  80. data/test/test-setshow.rb +0 -0
  81. data/test/test-source.rb +0 -0
  82. data/test/test-stepping.rb +0 -0
  83. data/test/test-trace.rb +0 -0
  84. metadata +178 -155
  85. data/cli/ruby-debug/commands/disassemble.RB +0 -38
  86. data/test/except-bug2.rb +0 -7
data/Rakefile CHANGED
@@ -20,7 +20,7 @@ COMMON_FILES = FileList[
20
20
  'Rakefile',
21
21
  ]
22
22
 
23
- CLI_TEST_FILE_LIST = 'test/test-*.rb'
23
+ CLI_TEST_FILE_LIST = FileList['test/test-*.rb', 'test/cli/**/*_test.rb']
24
24
  CLI_FILES = COMMON_FILES + FileList[
25
25
  "cli/**/*",
26
26
  'ChangeLog',
@@ -30,7 +30,7 @@ CLI_FILES = COMMON_FILES + FileList[
30
30
  'test/**/data/*.right',
31
31
  'test/**/*.rb',
32
32
  'rdbg.rb',
33
- CLI_TEST_FILE_LIST,
33
+ CLI_TEST_FILE_LIST
34
34
  ]
35
35
 
36
36
  BASE_TEST_FILE_LIST = %w(
@@ -48,16 +48,16 @@ BASE_FILES = COMMON_FILES + FileList[
48
48
  ]
49
49
 
50
50
  desc "Test everything."
51
- test_task = task :test => [:lib, :test_base] do
51
+ task :test => :test_base do
52
52
  Rake::TestTask.new(:test) do |t|
53
53
  t.libs << ['./ext', './lib', './cli']
54
- t.pattern = CLI_TEST_FILE_LIST
54
+ t.test_files = CLI_TEST_FILE_LIST
55
55
  t.verbose = true
56
56
  end
57
57
  end
58
58
 
59
59
  desc "Test ruby-debug-base."
60
- test_task = task :test_base => :lib do
60
+ task :test_base => :lib do
61
61
  Rake::TestTask.new(:test_base) do |t|
62
62
  t.libs << ['./ext', './lib']
63
63
  t.test_files = FileList[BASE_TEST_FILE_LIST]
@@ -198,7 +198,7 @@ task :publish do
198
198
  # Get ruby-debug path.
199
199
  ruby_debug_path = File.expand_path(File.dirname(__FILE__))
200
200
 
201
- publisher = Rake::SshDirPublisher.new("kent@rubyforge.org",
201
+ Rake::SshDirPublisher.new("kent@rubyforge.org",
202
202
  "/var/www/gforge-projects/ruby-debug", ruby_debug_path)
203
203
  end
204
204
 
data/bin/rdebug CHANGED
@@ -38,9 +38,13 @@ def debug_program(options)
38
38
  else
39
39
  Debugger::PROG_SCRIPT
40
40
  end
41
- $0[0..-1] = d0
41
+ if $0.frozen?
42
+ $0 = d0
43
+ else
44
+ $0[0..-1] = d0
45
+ end
42
46
  end
43
- bt = Debugger.debug_load(Debugger::PROG_SCRIPT, options.stop)
47
+ bt = Debugger.debug_load(Debugger::PROG_SCRIPT, options.stop, false)
44
48
  if bt
45
49
  if options.post_mortem
46
50
  Debugger.handle_post_mortem(bt)
@@ -281,7 +285,7 @@ else
281
285
  end
282
286
  debug_program(options)
283
287
  else
284
- # activate debugger
288
+ # Set up trace hook for debugger
285
289
  Debugger.start
286
290
  # start control thread
287
291
  Debugger.start_control(options.host, options.cport) if options.control
data/cli/ruby-debug.rb CHANGED
@@ -138,10 +138,10 @@ module Debugger
138
138
  #
139
139
  # Runs a script file
140
140
  #
141
- def run_script(file, out = handler.interface)
141
+ def run_script(file, out = handler.interface, verbose=false)
142
142
  interface = ScriptInterface.new(File.expand_path(file), out)
143
143
  processor = ControlCommandProcessor.new(interface)
144
- processor.process_commands
144
+ processor.process_commands(verbose)
145
145
  end
146
146
  end
147
147
  end
@@ -1,5 +1,7 @@
1
1
  module Debugger
2
- class AddBreakpoint < Command # :nodoc:
2
+
3
+ # Implements debugger "break" command.
4
+ class AddBreakpoint < Command
3
5
  self.allow_in_control = true
4
6
 
5
7
  def regexp
@@ -60,19 +62,16 @@ module Debugger
60
62
 
61
63
  if line =~ /^\d+$/
62
64
  line = line.to_i
63
- unless LineCache.cache(brkpt_filename,
64
- Command.settings[:reload_source_on_change])
65
- errmsg("No source file named %s\n", file)
66
- return
67
- end
68
- last_line = LineCache.size(brkpt_filename)
69
- if line > last_line
70
- errmsg("There are only %d lines in file \"%s\".\n", last_line, file)
71
- return
72
- end
73
- unless LineCache.trace_line_numbers(brkpt_filename).member?(line)
74
- errmsg("Line %d is not a stopping point in file \"%s\".\n", line, file)
75
- return
65
+ if LineCache.cache(brkpt_filename, Command.settings[:reload_source_on_change])
66
+ last_line = LineCache.size(brkpt_filename)
67
+ if line > last_line
68
+ errmsg("There are only %d lines in file \"%s\".\n", last_line, file)
69
+ return
70
+ end
71
+ unless LineCache.trace_line_numbers(brkpt_filename).member?(line)
72
+ errmsg("Line %d is not a stopping point in file \"%s\".\n", line, file)
73
+ return
74
+ end
76
75
  end
77
76
  unless @state.context
78
77
  errmsg "We are not in a state we can add breakpoints.\n"
@@ -106,7 +105,8 @@ module Debugger
106
105
  end
107
106
  end
108
107
 
109
- class DeleteBreakpointCommand < Command # :nodoc:
108
+ # Implements debugger "delete" command.
109
+ class DeleteBreakpointCommand < Command
110
110
  self.allow_in_control = true
111
111
 
112
112
  def regexp
@@ -3,14 +3,21 @@ module Debugger
3
3
  self.allow_in_control = true
4
4
 
5
5
  def regexp
6
- /^\s* cat(?:ch)? (?:\s+(.+))? $/x
6
+ /^\s* cat(?:ch)?
7
+ (?:\s+ (\S+))?
8
+ (?:\s+ (off))? \s* $/ix
7
9
  end
8
10
 
9
11
  def execute
10
- if excn = @match[1]
11
- if excn == 'off'
12
- Debugger.catchpoint = nil
13
- print "Clear catchpoint.\n"
12
+ excn = @match[1]
13
+ if not excn
14
+ # No args given.
15
+ info_catch
16
+ elsif not @match[2]
17
+ # One arg given.
18
+ if 'off' == excn
19
+ Debugger.catchpoints.clear if
20
+ confirm("Delete all catchpoints? (y or n) ")
14
21
  else
15
22
  binding = @state.context ? get_binding : TOPLEVEL_BINDING
16
23
  unless debug_eval("#{excn}.is_a?(Class)", binding)
@@ -19,8 +26,13 @@ module Debugger
19
26
  Debugger.add_catchpoint(excn)
20
27
  print "Catch exception %s.\n", excn
21
28
  end
29
+ elsif @match[2] != 'off'
30
+ errmsg "Off expected. Got %s\n", @match[2]
31
+ elsif Debugger.catchpoints.member?(excn)
32
+ Debugger.catchpoints.delete(excn)
33
+ print "Catch for exception %s removed.\n", excn
22
34
  else
23
- info_catch
35
+ errmsg "Catch for exception %s not found.\n", excn
24
36
  end
25
37
  end
26
38
 
@@ -1,18 +1,24 @@
1
1
  module Debugger
2
+
2
3
  # Implements debugger "continue" command.
3
4
  class ContinueCommand < Command
4
- self.allow_in_post_mortem = false
5
- self.need_context = true
5
+ self.allow_in_post_mortem = true
6
+ self.need_context = false
6
7
  def regexp
7
8
  /^\s* c(?:ont(?:inue)?)? (?:\s+(.*))? $/x
8
9
  end
9
10
 
10
11
  def execute
11
12
  if @match[1] && !@state.context.dead?
12
- file = File.expand_path(@state.file)
13
- line = get_int(@match[1], "Continue", 0, nil, 0)
14
- return unless line
15
- @state.context.set_breakpoint(file, line)
13
+ filename = File.expand_path(@state.file)
14
+ line_number = get_int(@match[1], "Continue", 0, nil, 0)
15
+ return unless line_number
16
+ unless LineCache.trace_line_numbers(filename).member?(line_number)
17
+ errmsg("Line %d is not a stopping point in file \"%s\".\n",
18
+ line_number, filename)
19
+ return
20
+ end
21
+ @state.context.set_breakpoint(filename, line_number)
16
22
  end
17
23
  @state.proceed
18
24
  end
@@ -5,15 +5,15 @@ module Debugger
5
5
  print "No frame selected.\n"
6
6
  return
7
7
  end
8
- if Debugger.catchpoints.empty?
9
- print "No exceptions set to be caught.\n"
10
- else
8
+ if Debugger.catchpoints and not Debugger.catchpoints.empty?
11
9
  # FIXME: show whether Exception is valid or not
12
10
  # print "Exception: is_a?(Class)\n"
13
11
  Debugger.catchpoints.each do |exception, hits|
14
12
  # print "#{exception}: #{exception.is_a?(Class)}\n"
15
13
  print "#{exception}\n"
16
14
  end
15
+ else
16
+ print "No exceptions set to be caught.\n"
17
17
  end
18
18
  end
19
19
  end
@@ -34,8 +34,8 @@ end
34
34
 
35
35
  module Debugger
36
36
 
37
- # Implements debugger "help" command.
38
- class IRBCommand < Command # :nodoc:
37
+ # Implements debugger "irb" command.
38
+ class IRBCommand < Command
39
39
 
40
40
  register_setting_get(:autoirb) do
41
41
  IRBCommand.always_run
@@ -72,8 +72,8 @@ module Debugger
72
72
  print "[%d, %d] in %s\n", b, e, file
73
73
  lines = LineCache::getlines(file,
74
74
  Command.settings[:reload_source_on_change])
75
- return @state.previous_line if b >= lines.size
76
75
  if lines
76
+ return @state.previous_line if b >= lines.size
77
77
  e = lines.size if lines.size < e
78
78
  [b, 1].max.upto(e) do |n|
79
79
  if n > 0 && lines[n-1]
@@ -1,5 +1,46 @@
1
1
  module Debugger
2
- class MethodCommand < Command # :nodoc:
2
+
3
+ begin
4
+ require 'methodsig'
5
+ have_methodsig = true
6
+ rescue LoadError
7
+ have_methodsig = false
8
+ end
9
+
10
+ # Implements the debugger 'method sig' command.
11
+ class MethodSigCommand < Command
12
+ def regexp
13
+ /^\s*m(?:ethod)?\s+sig(?:nature)?\s+(\S+)\s*$/
14
+ end
15
+
16
+ def execute
17
+ obj = debug_eval('method(:%s)' % @match[1])
18
+ if obj.is_a?(Method)
19
+ begin
20
+ print "%s\n", obj.signature.to_s
21
+ rescue
22
+ errmsg("Can't get signature for '#{@match[1]}'\n")
23
+ end
24
+ else
25
+ errmsg("Can't make method out of '#{@match[1]}'\n")
26
+ end
27
+ end
28
+
29
+ class << self
30
+ def help_command
31
+ 'method'
32
+ end
33
+
34
+ def help(cmd)
35
+ %{
36
+ m[ethod] sig[nature] <obj>\tshow the signature of a method
37
+ }
38
+ end
39
+ end
40
+ end if have_methodsig
41
+
42
+ # Implements the debugger 'method' command.
43
+ class MethodCommand < Command
3
44
  def regexp
4
45
  /^\s*m(?:ethod)?\s+((iv)|(i(:?nstance\s+)?)\s+)?/
5
46
  end
@@ -33,10 +74,11 @@ module Debugger
33
74
  def help(cmd)
34
75
  %{
35
76
  m[ethod] i[nstance] <obj>\tshow methods of object
36
- m[ethod] iv <obj>\tshow instance variables of object
77
+ m[ethod] iv <obj>\t\tshow instance variables of object
37
78
  m[ethod] <class|module>\t\tshow instance methods of class or module
38
79
  }
39
80
  end
40
81
  end
41
82
  end
83
+
42
84
  end
@@ -20,7 +20,12 @@ module Debugger
20
20
  Debugger.breakpoints.each do |b|
21
21
  file.puts "break #{b.source}:#{b.pos}#{" if #{b.expr}" if b.expr}"
22
22
  end
23
- file.puts "catch #{Debugger.catchpoint}" if Debugger.catchpoint
23
+ end
24
+
25
+ def save_catchpoints(file)
26
+ Debugger.catchpoints.keys.each do |c|
27
+ file.puts "catch #{c}"
28
+ end
24
29
  end
25
30
 
26
31
  def save_displays(file)
@@ -44,7 +49,9 @@ module Debugger
44
49
  end
45
50
 
46
51
  def regexp
47
- /^\s*sa(?:ve)?(?:\s+(.+))?$/
52
+ /^\s* sa(?:ve)?
53
+ (?:\s+(.+))?
54
+ \s*$/ix
48
55
  end
49
56
 
50
57
  def execute
@@ -54,6 +61,7 @@ module Debugger
54
61
  file = open(@match[1], 'w')
55
62
  end
56
63
  save_breakpoints(file)
64
+ save_catchpoints(file)
57
65
  # save_displays(file)
58
66
  save_settings(file)
59
67
  print "Saved to '#{file.path}'\n"
@@ -70,10 +78,12 @@ module Debugger
70
78
 
71
79
  def help(cmd)
72
80
  %{
73
- save FILE\tsaves current debugger state to FILE as a script file.
74
- This includes breakpoints, catchpoint, display expressions and some
75
- settings.
76
- }
81
+ save [FILE]
82
+ Saves current debugger state to FILE as a script file.
83
+ This includes breakpoints, catchpoints, display expressions and some settings.
84
+ If no filename is given, we will fabricate one.
85
+
86
+ Use the 'source' command in another debug session to restore them.}
77
87
  end
78
88
  end
79
89
  end
@@ -110,15 +110,18 @@ set history size -- Set the size of the command history"],
110
110
  when /^basename$/
111
111
  Command.settings[:basename] = set_on
112
112
  when /^callstyle$/
113
- arg = args[0].downcase.to_sym
114
- case arg
115
- when :short, :last, :tracked
116
- Command.settings[:callstyle] = arg
117
- Debugger.track_frame_args = arg == :tracked ? true : false
118
- else
119
- print "Invalid call style #{arg}. Should be one of: " +
120
- "'short', 'last', or 'tracked'.\n"
113
+ if args[0]
114
+ arg = args[0].downcase.to_sym
115
+ case arg
116
+ when :short, :last, :tracked
117
+ Command.settings[:callstyle] = arg
118
+ Debugger.track_frame_args = arg == :tracked ? true : false
119
+ print "%s\n" % show_setting(try_subcmd.name)
120
+ return
121
+ end
121
122
  end
123
+ print "Invalid call style #{arg}. Should be one of: " +
124
+ "'short', 'last', or 'tracked'.\n"
122
125
  when /^trace$/
123
126
  Command.settings[:stack_trace_on_error] = set_on
124
127
  when /^fullpath$/
@@ -38,33 +38,37 @@ module Debugger
38
38
  style = Command.settings[:callstyle]
39
39
  return "Frame call-display style is #{style}."
40
40
  when /^commands(:?\s+(\d+))?$/
41
- s = '';
42
- args = @match[1].split
43
- if args[1]
44
- first_line = args[1].to_i - 4
45
- last_line = first_line + 10 - 1
46
- if first_line > Readline::HISTORY.length
47
- first_line = last_line = Readline::HISTORY.length
48
- elsif first_line <= 0
49
- first_line = 1
41
+ if @state.interface.readline_support?
42
+ s = '';
43
+ args = @match[1].split
44
+ if args[1]
45
+ first_line = args[1].to_i - 4
46
+ last_line = first_line + 10 - 1
47
+ if first_line > Readline::HISTORY.length
48
+ first_line = last_line = Readline::HISTORY.length
49
+ elsif first_line <= 0
50
+ first_line = 1
51
+ end
52
+ if last_line > Readline::HISTORY.length
53
+ last_line = Readline::HISTORY.length
54
+ end
55
+ i = first_line
56
+ commands = Readline::HISTORY.to_a[first_line..last_line]
57
+ else
58
+ if Readline::HISTORY.length > 10
59
+ commands = Readline::HISTORY.to_a[-10..-1]
60
+ i = Readline::HISTORY.length - 10
61
+ else
62
+ commands = Readline::HISTORY.to_a
63
+ i = 1
64
+ end
50
65
  end
51
- if last_line > Readline::HISTORY.length
52
- last_line = Readline::HISTORY.length
66
+ commands.each do |cmd|
67
+ s += ("%5d %s\n" % [i, cmd])
68
+ i += 1
53
69
  end
54
- i = first_line
55
- commands = Readline::HISTORY.to_a[first_line..last_line]
56
70
  else
57
- if Readline::HISTORY.length > 10
58
- commands = Readline::HISTORY.to_a[-10..-1]
59
- i = Readline::HISTORY.length - 10
60
- else
61
- commands = Readline::HISTORY.to_a
62
- i = 1
63
- end
64
- end
65
- commands.each do |cmd|
66
- s += ("%5d %s\n" % [i, cmd])
67
- i += 1
71
+ s='No readline suport'
68
72
  end
69
73
  return s
70
74
  when /^debuggertesting$/