ruby-debug 0.10.1 → 0.10.2
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.
- data/CHANGES +7 -0
- data/ChangeLog +315 -278
- data/Rakefile +6 -6
- data/bin/rdebug +7 -3
- data/cli/ruby-debug.rb +2 -2
- data/cli/ruby-debug/commands/breakpoints.rb +15 -15
- data/cli/ruby-debug/commands/catchpoint.rb +18 -6
- data/cli/ruby-debug/commands/continue.rb +12 -6
- data/cli/ruby-debug/commands/info.rb +3 -3
- data/cli/ruby-debug/commands/irb.rb +2 -2
- data/cli/ruby-debug/commands/list.rb +1 -1
- data/cli/ruby-debug/commands/method.rb +44 -2
- data/cli/ruby-debug/commands/save.rb +16 -6
- data/cli/ruby-debug/commands/set.rb +11 -8
- data/cli/ruby-debug/commands/show.rb +28 -24
- data/cli/ruby-debug/commands/trace.rb +35 -11
- data/cli/ruby-debug/commands/variables.rb +47 -4
- data/cli/ruby-debug/interface.rb +28 -8
- data/cli/ruby-debug/processor.rb +6 -4
- data/rdbg.rb +0 -0
- data/test/base/base.rb +0 -0
- data/test/base/binding.rb +0 -0
- data/test/base/catchpoint.rb +0 -0
- data/test/bp_loop_issue.rb +3 -0
- data/test/classes.rb +11 -0
- data/test/cli/commands/catchpoint_test.rb +35 -0
- data/test/data/break_loop_bug.cmd +5 -0
- data/test/data/break_loop_bug.right +15 -0
- data/test/data/breakpoints.cmd +1 -1
- data/test/data/breakpoints.right +8 -12
- data/test/data/catch.cmd +17 -0
- data/test/data/catch.right +37 -0
- data/test/data/emacs_basic.right +2 -7
- data/test/data/frame.cmd +3 -0
- data/test/data/frame.right +4 -0
- data/test/data/method.cmd +10 -0
- data/test/data/method.right +21 -0
- data/test/data/methodsig.cmd +10 -0
- data/test/data/methodsig.right +20 -0
- data/test/data/output.right +0 -10
- data/test/data/quit.right +0 -9
- data/test/data/raise.right +1 -1
- data/test/data/save.cmd +33 -0
- data/test/data/save.right +59 -0
- data/test/data/setshow.cmd +13 -0
- data/test/data/setshow.right +25 -0
- data/test/dollar-0.rb +0 -0
- data/test/gcd-dbg.rb +0 -0
- data/test/helper.rb +24 -2
- data/test/pm-base.rb +0 -0
- data/test/pm.rb +0 -0
- data/test/raise.rb +0 -0
- data/test/tdebug.rb +5 -6
- data/test/test-annotate.rb +0 -0
- data/test/test-break-bad.rb +11 -0
- data/test/test-breakpoints.rb +0 -0
- data/test/test-catch.rb +25 -0
- data/test/test-condition.rb +0 -0
- data/test/test-ctrl.rb +0 -0
- data/test/test-display.rb +0 -0
- data/test/test-dollar-0.rb +0 -0
- data/test/test-edit.rb +0 -0
- data/test/test-emacs-basic.rb +2 -2
- data/test/test-enable.rb +0 -0
- data/test/test-finish.rb +0 -0
- data/test/test-frame.rb +11 -3
- data/test/test-help.rb +0 -0
- data/test/test-hist.rb +0 -0
- data/test/test-info-thread.rb +0 -0
- data/test/test-info-var.rb +0 -0
- data/test/test-info.rb +0 -0
- data/test/test-init.rb +3 -1
- data/test/test-list.rb +0 -0
- data/test/test-method.rb +34 -0
- data/test/test-output.rb +0 -0
- data/test/test-pm.rb +0 -0
- data/test/test-quit.rb +0 -0
- data/test/test-raise.rb +0 -0
- data/test/test-save.rb +25 -0
- data/test/test-setshow.rb +0 -0
- data/test/test-source.rb +0 -0
- data/test/test-stepping.rb +0 -0
- data/test/test-trace.rb +0 -0
- metadata +178 -155
- data/cli/ruby-debug/commands/disassemble.RB +0 -38
- data/test/except-bug2.rb +0 -7
@@ -1,19 +1,42 @@
|
|
1
1
|
module Debugger
|
2
2
|
class TraceCommand < Command # :nodoc:
|
3
3
|
def regexp
|
4
|
-
/^\s*tr(?:ace)?(
|
4
|
+
/^\s* tr(?:ace)? (?: \s+ (\S+)) # on |off | var(iable)
|
5
|
+
(?: \s+ (\S+))? # (all | variable-name)?
|
6
|
+
(?: \s+ (\S+))? \s* # (stop | nostop)?
|
7
|
+
$/ix
|
5
8
|
end
|
6
9
|
|
7
10
|
def execute
|
8
|
-
if @match[
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
if @match[1] =~ /on|off/
|
12
|
+
onoff = 'on' == @match[1]
|
13
|
+
if @match[2]
|
14
|
+
Debugger.current_context.tracing = onoff
|
15
|
+
print "Tracing %s all threads.\n" % (onoff ? 'on' : 'off')
|
16
|
+
else
|
17
|
+
Debugger.tracing = onoff
|
18
|
+
print "Tracing %s on current thread.\n" % (onoff ? 'on' : 'off')
|
19
|
+
end
|
20
|
+
elsif @match[1] =~ /var(?:iable)?/
|
21
|
+
varname=@match[2]
|
22
|
+
if debug_eval("defined?(#{varname})")
|
23
|
+
if @match[3] && @match[3] !~ /(:?no)?stop/
|
24
|
+
errmsg("expecting 'stop' or 'nostop'; got %s\n" % @match[3])
|
25
|
+
else
|
26
|
+
dbg_cmd = if @match[3] && (@match[3] !~ /nostop/)
|
27
|
+
'debugger' else '' end
|
28
|
+
end
|
29
|
+
eval("
|
30
|
+
trace_var(:#{varname}) do |val|
|
31
|
+
print \"traced variable #{varname} has value \#{val}\n\"
|
32
|
+
#{dbg_cmd}
|
33
|
+
end")
|
34
|
+
else
|
35
|
+
errmsg "#{varname} is not a global variable.\n"
|
36
|
+
end
|
37
|
+
else
|
38
|
+
errmsg("expecting 'on', 'off', 'var' or 'variable'; got: %s\n" %
|
39
|
+
@match[1])
|
17
40
|
end
|
18
41
|
end
|
19
42
|
|
@@ -26,8 +49,9 @@ module Debugger
|
|
26
49
|
%{
|
27
50
|
tr[ace] (on|off)\tset trace mode of current thread
|
28
51
|
tr[ace] (on|off) all\tset trace mode of all threads
|
52
|
+
tr[ace] var(iable) VARNAME [stop|nostop]\tset trace variable on VARNAME
|
29
53
|
}
|
30
54
|
end
|
31
55
|
end
|
32
56
|
end
|
33
|
-
end
|
57
|
+
end
|
@@ -24,14 +24,15 @@ module Debugger
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
# Implements the debugger 'var class' command.
|
28
|
+
class VarClassVarCommand < Command
|
28
29
|
def regexp
|
29
30
|
/^\s*v(?:ar)?\s+cl(?:ass)?/
|
30
31
|
end
|
31
32
|
|
32
33
|
def execute
|
33
34
|
unless @state.context
|
34
|
-
|
35
|
+
errmsg "can't get class variables here.\n"
|
35
36
|
return
|
36
37
|
end
|
37
38
|
var_class_self
|
@@ -107,7 +108,7 @@ module Debugger
|
|
107
108
|
|
108
109
|
class VarInstanceCommand < Command # :nodoc:
|
109
110
|
def regexp
|
110
|
-
/^\s*v(?:ar)?\s+
|
111
|
+
/^\s*v(?:ar)?\s+ins(?:tance)?\s*/
|
111
112
|
end
|
112
113
|
|
113
114
|
def execute
|
@@ -128,7 +129,8 @@ module Debugger
|
|
128
129
|
end
|
129
130
|
end
|
130
131
|
|
131
|
-
|
132
|
+
# Implements the debugger 'var local' command.
|
133
|
+
class VarLocalCommand < Command
|
132
134
|
def regexp
|
133
135
|
/^\s*v(?:ar)?\s+l(?:ocal)?\s*$/
|
134
136
|
end
|
@@ -153,4 +155,45 @@ module Debugger
|
|
153
155
|
end
|
154
156
|
end
|
155
157
|
end
|
158
|
+
|
159
|
+
# Implements the debugger 'var inherit' command.
|
160
|
+
begin
|
161
|
+
require 'classtree'
|
162
|
+
have_classtree = true
|
163
|
+
rescue LoadError
|
164
|
+
have_classtree = false
|
165
|
+
end
|
166
|
+
|
167
|
+
class VarInheritCommand < Command
|
168
|
+
def regexp
|
169
|
+
/^\s*v(?:ar)?\s+ct\s*/
|
170
|
+
end
|
171
|
+
|
172
|
+
def execute
|
173
|
+
unless @state.context
|
174
|
+
errmsg "can't get object inheritance.\n"
|
175
|
+
return
|
176
|
+
end
|
177
|
+
puts @match.post_match
|
178
|
+
obj = debug_eval("#{@match.post_match}.classtree")
|
179
|
+
if obj
|
180
|
+
print obj
|
181
|
+
else
|
182
|
+
errmsg "Trouble getting object #{@match.post_match}\n"
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
class << self
|
187
|
+
def help_command
|
188
|
+
'var'
|
189
|
+
end
|
190
|
+
|
191
|
+
def help(cmd)
|
192
|
+
%{
|
193
|
+
v[ar] ct\t\t\tshow class heirarchy of object
|
194
|
+
}
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end if have_classtree
|
198
|
+
|
156
199
|
end
|
data/cli/ruby-debug/interface.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
module Debugger
|
2
2
|
class Interface # :nodoc:
|
3
|
+
attr_writer :have_readline # true if Readline is available
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@have_readline = false
|
7
|
+
end
|
3
8
|
|
4
9
|
# Common routine for reporting debugger error messages.
|
5
10
|
# Derived classed may want to override this to capture output.
|
@@ -38,6 +43,7 @@ module Debugger
|
|
38
43
|
def initialize()
|
39
44
|
super
|
40
45
|
@command_queue = []
|
46
|
+
@have_readline = false
|
41
47
|
@history_save = true
|
42
48
|
# take gdb's default
|
43
49
|
@history_length = ENV["HISTSIZE"] ? ENV["HISTSIZE"].to_i : 256
|
@@ -77,10 +83,15 @@ module Debugger
|
|
77
83
|
end
|
78
84
|
end
|
79
85
|
|
86
|
+
def readline_support?(msg)
|
87
|
+
@have_readline
|
88
|
+
end
|
89
|
+
|
80
90
|
private
|
81
91
|
begin
|
82
92
|
require 'readline'
|
83
93
|
class << Debugger
|
94
|
+
@have_readline = true
|
84
95
|
define_method(:save_history) do
|
85
96
|
iface = self.handler.interface
|
86
97
|
iface.histfile ||= File.join(ENV["HOME"]||ENV["HOMEPATH"]||".",
|
@@ -114,7 +125,7 @@ module Debugger
|
|
114
125
|
end
|
115
126
|
end
|
116
127
|
|
117
|
-
class RemoteInterface # :nodoc:
|
128
|
+
class RemoteInterface < Interface # :nodoc:
|
118
129
|
attr_accessor :command_queue
|
119
130
|
attr_accessor :histfile
|
120
131
|
attr_accessor :history_save
|
@@ -137,6 +148,15 @@ module Debugger
|
|
137
148
|
@restart_file = nil
|
138
149
|
end
|
139
150
|
|
151
|
+
def close
|
152
|
+
@socket.close
|
153
|
+
rescue Exception
|
154
|
+
end
|
155
|
+
|
156
|
+
def confirm(prompt)
|
157
|
+
send_command "CONFIRM #{prompt}"
|
158
|
+
end
|
159
|
+
|
140
160
|
def finalize
|
141
161
|
end
|
142
162
|
|
@@ -144,19 +164,14 @@ module Debugger
|
|
144
164
|
send_command "PROMPT #{prompt}"
|
145
165
|
end
|
146
166
|
|
147
|
-
def
|
148
|
-
|
167
|
+
def readline_support?
|
168
|
+
false
|
149
169
|
end
|
150
170
|
|
151
171
|
def print(*args)
|
152
172
|
@socket.printf(*args)
|
153
173
|
end
|
154
174
|
|
155
|
-
def close
|
156
|
-
@socket.close
|
157
|
-
rescue Exception
|
158
|
-
end
|
159
|
-
|
160
175
|
private
|
161
176
|
|
162
177
|
def send_command(msg)
|
@@ -172,6 +187,7 @@ module Debugger
|
|
172
187
|
attr_accessor :histfile
|
173
188
|
attr_accessor :history_save
|
174
189
|
attr_accessor :history_length
|
190
|
+
attr_accessor :restart_file
|
175
191
|
def initialize(file, out, verbose=false)
|
176
192
|
super()
|
177
193
|
@command_queue = []
|
@@ -197,6 +213,10 @@ module Debugger
|
|
197
213
|
result.chomp!
|
198
214
|
end
|
199
215
|
|
216
|
+
def readline_support?
|
217
|
+
false
|
218
|
+
end
|
219
|
+
|
200
220
|
def confirm(prompt)
|
201
221
|
'y'
|
202
222
|
end
|
data/cli/ruby-debug/processor.rb
CHANGED
@@ -267,6 +267,7 @@ module Debugger
|
|
267
267
|
def one_cmd(commands, context, input)
|
268
268
|
if cmd = commands.find{ |c| c.match(input) }
|
269
269
|
if context.dead? && cmd.class.need_context
|
270
|
+
p cmd
|
270
271
|
print "Command is unavailable\n"
|
271
272
|
else
|
272
273
|
cmd.execute
|
@@ -276,7 +277,7 @@ module Debugger
|
|
276
277
|
if unknown_cmd
|
277
278
|
unknown_cmd.execute
|
278
279
|
else
|
279
|
-
|
280
|
+
errmsg "Unknown command: \"#{input}\". Try \"help\".\n"
|
280
281
|
end
|
281
282
|
end
|
282
283
|
end
|
@@ -393,7 +394,7 @@ module Debugger
|
|
393
394
|
@debugger_context_was_dead = true # Assume we haven't started.
|
394
395
|
end
|
395
396
|
|
396
|
-
def process_commands
|
397
|
+
def process_commands(verbose=false)
|
397
398
|
control_cmds = Command.commands.select do |cmd|
|
398
399
|
cmd.allow_in_control
|
399
400
|
end
|
@@ -409,11 +410,12 @@ module Debugger
|
|
409
410
|
end
|
410
411
|
|
411
412
|
while input = @interface.read_command(prompt(nil))
|
413
|
+
print "+#{input}" if verbose
|
412
414
|
catch(:debug_error) do
|
413
415
|
if cmd = commands.find{|c| c.match(input) }
|
414
416
|
cmd.execute
|
415
417
|
else
|
416
|
-
|
418
|
+
errmsg "Unknown command\n"
|
417
419
|
end
|
418
420
|
end
|
419
421
|
end
|
@@ -462,7 +464,7 @@ module Debugger
|
|
462
464
|
end
|
463
465
|
|
464
466
|
def file
|
465
|
-
|
467
|
+
errmsg "No filename given.\n"
|
466
468
|
throw :debug_error
|
467
469
|
end
|
468
470
|
end # State
|
data/rdbg.rb
CHANGED
File without changes
|
data/test/base/base.rb
CHANGED
File without changes
|
data/test/base/binding.rb
CHANGED
File without changes
|
data/test/base/catchpoint.rb
CHANGED
File without changes
|
data/test/classes.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
BASE_DIR = File.join(File.dirname(__FILE__), '..', '..', '..')
|
6
|
+
|
7
|
+
%w(ext lib cli).each do |dir|
|
8
|
+
$: << File.join(BASE_DIR, dir)
|
9
|
+
end
|
10
|
+
|
11
|
+
require File.join(BASE_DIR, 'cli', 'ruby-debug')
|
12
|
+
|
13
|
+
class TestCatchCommand < Test::Unit::TestCase
|
14
|
+
|
15
|
+
class MockState
|
16
|
+
attr_accessor :message
|
17
|
+
def context; end
|
18
|
+
def confirm(msg); true end
|
19
|
+
def print(*args)
|
20
|
+
@message = *args
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# regression test for bug #20156
|
25
|
+
def test_catch_does_not_blow_up
|
26
|
+
state = MockState.new
|
27
|
+
catch_cmd = Debugger::CatchCommand.new(state)
|
28
|
+
assert(catch_cmd.match('catch off'))
|
29
|
+
catch(:debug_error) do
|
30
|
+
catch_cmd.execute
|
31
|
+
end
|
32
|
+
assert_equal(nil, state.message)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
bp_loop_issue.rb:1
|
2
|
+
1.upto(2) {
|
3
|
+
# set debuggertesting on
|
4
|
+
Currently testing the debugger is on.
|
5
|
+
# break 2
|
6
|
+
Breakpoint 1 file ./bp_loop_issue.rb, line 2
|
7
|
+
# cont
|
8
|
+
Breakpoint 1 at bp_loop_issue.rb:2
|
9
|
+
bp_loop_issue.rb:2
|
10
|
+
sleep 0.01
|
11
|
+
# cont
|
12
|
+
Breakpoint 1 at bp_loop_issue.rb:2
|
13
|
+
bp_loop_issue.rb:2
|
14
|
+
sleep 0.01
|
15
|
+
# cont
|
data/test/data/breakpoints.cmd
CHANGED
data/test/data/breakpoints.right
CHANGED
@@ -41,18 +41,17 @@ return nil if a <= 0
|
|
41
41
|
#1 at line gcd.rb:18
|
42
42
|
# info program
|
43
43
|
Program stopped. It stopped at a breakpoint.
|
44
|
-
# c
|
45
|
-
Breakpoint
|
46
|
-
gcd.rb:
|
47
|
-
|
44
|
+
# c 6
|
45
|
+
Breakpoint 2 at gcd.rb:10
|
46
|
+
gcd.rb:10
|
47
|
+
return nil if a <= 0
|
48
48
|
# info break
|
49
49
|
Num Enb What
|
50
50
|
1 y at gcd.rb:6
|
51
51
|
breakpoint already hit 1 time
|
52
52
|
2 y at gcd.rb:10
|
53
|
-
breakpoint already hit
|
53
|
+
breakpoint already hit 2 times
|
54
54
|
3 y at Object:gcd
|
55
|
-
breakpoint already hit 1 time
|
56
55
|
# break foo
|
57
56
|
*** Invalid breakpoint location: foo.
|
58
57
|
# info break
|
@@ -60,26 +59,23 @@ Num Enb What
|
|
60
59
|
1 y at gcd.rb:6
|
61
60
|
breakpoint already hit 1 time
|
62
61
|
2 y at gcd.rb:10
|
63
|
-
breakpoint already hit
|
62
|
+
breakpoint already hit 2 times
|
64
63
|
3 y at Object:gcd
|
65
|
-
breakpoint already hit 1 time
|
66
64
|
# disable 1
|
67
65
|
# info break
|
68
66
|
Num Enb What
|
69
67
|
1 n at gcd.rb:6
|
70
68
|
breakpoint already hit 1 time
|
71
69
|
2 y at gcd.rb:10
|
72
|
-
breakpoint already hit
|
70
|
+
breakpoint already hit 2 times
|
73
71
|
3 y at Object:gcd
|
74
|
-
breakpoint already hit 1 time
|
75
72
|
# delete 1
|
76
73
|
# # We should see breakpoint 2 but not 1
|
77
74
|
# info break
|
78
75
|
Num Enb What
|
79
76
|
2 y at gcd.rb:10
|
80
|
-
breakpoint already hit
|
77
|
+
breakpoint already hit 2 times
|
81
78
|
3 y at Object:gcd
|
82
|
-
breakpoint already hit 1 time
|
83
79
|
# # We should still be able to access 2
|
84
80
|
# disable 2
|
85
81
|
# disable bar
|
data/test/data/catch.cmd
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# ***************************************************
|
2
|
+
# Test catch
|
3
|
+
# ***************************************************
|
4
|
+
set debuggertesting on
|
5
|
+
set autoeval off
|
6
|
+
set basename on
|
7
|
+
info catch
|
8
|
+
catch ZeroDivisionError off
|
9
|
+
catch ZeroDivisionError off afdasdf
|
10
|
+
catch ZeroDivisionError
|
11
|
+
info catch
|
12
|
+
catch ZeroDivisionError off
|
13
|
+
info catch
|
14
|
+
catch ZeroDivisionError
|
15
|
+
c
|
16
|
+
where
|
17
|
+
quit
|