1
1
class DEBUGGER__
2
+ begin
3
+ require 'readline'
4
+ def readline ( prompt )
5
+ Readline ::readline ( prompt , true )
6
+ end
7
+ rescue LoadError
8
+ def readline ( prompt )
9
+ STDOUT . print prompt
10
+ STDOUT . flush
11
+ line = STDIN . gets
12
+ line . chomp!
13
+ line
14
+ end
15
+ USE_READLINE = false
16
+ end
17
+
2
18
trap ( "INT" ) { DEBUGGER__ ::CONTEXT . interrupt }
3
19
$DEBUG = true
4
20
def initialize
5
21
@break_points = [ ]
22
+ @display = [ ]
6
23
@stop_next = 1
7
24
@frames = [ nil ]
8
25
@last_file = nil
@@ -42,10 +59,8 @@ def debug_command(file, line, id, binding)
42
59
line_at ( binding_file , binding_line )
43
60
end
44
61
@frames [ 0 ] = binding
45
- STDOUT . print "(rdb:-) "
46
- STDOUT . flush
47
- while input = STDIN . gets
48
- input . chop!
62
+ display_expressions ( binding )
63
+ while input = readline ( "(rdb:-) " )
49
64
if input == ""
50
65
input = DEBUG_LAST_CMD [ 0 ]
51
66
else
@@ -55,55 +70,98 @@ def debug_command(file, line, id, binding)
55
70
case input
56
71
when /^b(?:reak)?\s +((?:[^:\n ]+:)?.+)/
57
72
pos = $1
58
- if pos . index ":"
73
+ if pos . index ( ":" )
59
74
file , pos = pos . split ( ":" )
60
75
end
61
76
file = File . basename ( file )
62
77
if pos =~ /^\d +$/
63
78
pname = pos
64
- pos = Integer ( pos )
79
+ pos = pos . to_i
65
80
else
66
81
pname = pos = pos . intern . id2name
67
82
end
83
+ @break_points . push [ true , 0 , file , pos ]
68
84
STDOUT . printf "Set breakpoint %d at %s:%s\n " , @break_points . size , file ,
69
85
pname
70
- @break_points . push [ file , pos ]
71
86
72
- when /^b(?:reak)?$/ , /^i(?:nfo) b(?:reak)?$/
73
- n = 0
74
- for f , p in @break_points
75
- STDOUT . printf "%d %s:%s\n " , n , f , p
87
+ when /^wat(?:ch)?\s +((?:[^:\n ]+:)?.+)$/
88
+ exp = $1
89
+ @break_points . push [ true , 1 , exp ]
90
+ STDOUT . printf "Set watchpoint %d\n " , @break_points . size , exp
91
+
92
+ when /^b(?:reak)?$/ , /^info b(?:reak)?$/
93
+ n = 1
94
+ STDOUT . print "breakpoints:\n "
95
+ for b in @break_points
96
+ if b [ 0 ] and ( b [ 1 ] == 0 )
97
+ STDOUT . printf " %d %s:%s\n " , n , b [ 2 ] , b [ 3 ]
98
+ end
76
99
n += 1
77
100
end
101
+ n = 1
102
+ STDOUT . print "\n "
103
+ STDOUT . print "watchpoints:\n "
104
+ for b in @break_points
105
+ if b [ 0 ] and ( b [ 1 ] == 1 )
106
+ STDOUT . printf " %d %s\n " , n , b [ 2 ]
107
+ end
108
+ n += 1
109
+ end
110
+ STDOUT . print "\n "
78
111
79
112
when /^del(?:ete)?(?:\s +(\d +))?$/
80
113
pos = $1
81
114
unless pos
82
115
STDOUT . print "clear all breakpoints? (y/n) "
83
116
STDOUT . flush
84
- input = STDIN . gets . chop!
117
+ input = readline
85
118
if input == "y"
86
- for n in @break_points . indexes
87
- @break_points [ n ] = nil
119
+ for b in @break_points
120
+ b [ 0 ] = false
88
121
end
89
122
end
90
123
else
91
- pos = Integer ( pos )
92
- if @break_points [ pos ]
93
- bp = @break_points [ pos ]
94
- STDOUT . printf "Clear breakpoint %d at %s:%s\n " , pos , bp [ 0 ] , bp [ 1 ]
95
- @break_points [ pos ] = nil
124
+ pos = pos . to_i
125
+ if @break_points [ pos -1 ]
126
+ @break_points [ pos -1 ] [ 0 ] = false
96
127
else
97
128
STDOUT . printf "Breakpoint %d is not defined\n " , pos
98
129
end
99
130
end
100
131
101
- when /^c(?:ont)?$/
132
+ when /^disp(?:lay)?\s +(.+)$/
133
+ exp = $1
134
+ @display . push . push [ true , exp ]
135
+ STDOUT . printf " %d: %s = %s\n " , @display . size , exp ,
136
+ debug_eval ( exp , binding ) . to_s
137
+
138
+ when /^disp(?:lay)?$/ , /^info disp(?:lay)?$/
139
+ display_expressions ( binding )
140
+
141
+ when /^undisp(?:lay)?(?:\s +(\d +))?$/
142
+ pos = $1
143
+ unless pos
144
+ input = readline ( "clear all expressions? (y/n) " )
145
+ if input == "y"
146
+ for d in @display
147
+ d [ 0 ] = false
148
+ end
149
+ end
150
+ else
151
+ pos = pos . to_i
152
+ if @display [ pos -1 ]
153
+ @display [ pos -1 ] [ 0 ] = false
154
+ else
155
+ STDOUT . printf "display expression %d is not defined\n " , pos
156
+ end
157
+ end
158
+
159
+ when /^co(?:nt)?$/
102
160
return
103
161
104
162
when /^s(?:tep)?\s *(\d +)?$/
105
163
if $1
106
- lev = Integer ( $1 )
164
+ lev = $1 . to_i
107
165
else
108
166
lev = 1
109
167
end
@@ -112,7 +170,7 @@ def debug_command(file, line, id, binding)
112
170
113
171
when /^n(?:ext)?\s *(\d +)?$/
114
172
if $1
115
- lev = Integer ( $1 )
173
+ lev = $1 . to_i
116
174
else
117
175
lev = 1
118
176
end
@@ -122,16 +180,16 @@ def debug_command(file, line, id, binding)
122
180
123
181
when /^w(?:here)?$/ , /^f(?:rame)?$/
124
182
at = caller ( 0 )
125
- 0 . upto ( @frames . size - 1 ) do |n |
126
- if ( frame_pos == n )
183
+ 0 . upto ( @frames . size - 1 ) do |n |
184
+ if frame_pos == n
127
185
STDOUT . printf "--> #%d %s\n " , n , at [ -( @frames . size - n ) ]
128
186
else
129
187
STDOUT . printf " #%d %s\n " , n , at [ -( @frames . size - n ) ]
130
188
end
131
189
end
132
190
133
191
when /^l(?:ist)?(?:\s +(.+))?$/
134
- if ! $1
192
+ if not $1
135
193
b = previus_line ? previus_line + 10 : binding_line - 5
136
194
e = b + 9
137
195
elsif $1 == '-'
@@ -140,10 +198,10 @@ def debug_command(file, line, id, binding)
140
198
else
141
199
b , e = $1. split ( /[-,]/ )
142
200
if e
143
- b = Integer ( b )
144
- e = Integer ( e )
201
+ b = b . to_i
202
+ e = e . to_i
145
203
else
146
- b = Integer ( b ) - 5
204
+ b = b . to_i - 5
147
205
e = b + 9
148
206
end
149
207
end
@@ -154,7 +212,7 @@ def debug_command(file, line, id, binding)
154
212
n = 0
155
213
b . upto ( e ) do |n |
156
214
if n > 0 && lines [ n -1 ]
157
- if ( n == binding_line )
215
+ if n == binding_line
158
216
STDOUT . printf "=> %d %s\n " , n , lines [ n -1 ] . chomp
159
217
else
160
218
STDOUT . printf " %d %s\n " , n , lines [ n -1 ] . chomp
@@ -168,7 +226,7 @@ def debug_command(file, line, id, binding)
168
226
when /^up\s *(\d +)?$/
169
227
previus_line = nil
170
228
if $1
171
- lev = Integer ( $1 )
229
+ lev = $1 . to_i
172
230
else
173
231
lev = 1
174
232
end
@@ -184,7 +242,7 @@ def debug_command(file, line, id, binding)
184
242
when /^down\s *(\d +)?$/
185
243
previus_line = nil
186
244
if $1
187
- lev = Integer ( $1 )
245
+ lev = $1 . to_i
188
246
else
189
247
lev = 1
190
248
end
@@ -203,26 +261,32 @@ def debug_command(file, line, id, binding)
203
261
return
204
262
205
263
when /^q(?:uit)?$/
206
- STDOUT . print "really quit? (y/n) "
207
- STDOUT . flush
208
- input = STDIN . gets . chop!
264
+ input = readline ( "really quit? (y/n) " )
209
265
exit if input == "y"
210
266
211
267
when /^p\s +/
212
268
p debug_eval ( $', binding )
213
269
214
270
else
215
271
v = debug_eval ( input , binding )
216
- p v unless v == nil
272
+ p v unless ( v == nil )
217
273
end
218
- STDOUT . print "(rdb:-) "
219
- STDOUT . flush
220
274
end
221
275
end
222
276
277
+ def display_expressions ( binding )
278
+ n = 1
279
+ for d in @display
280
+ if d [ 0 ]
281
+ STDOUT . printf "%d: %s = %s\n " , n , d [ 1 ] , debug_eval ( d [ 1 ] , binding ) . to_s
282
+ end
283
+ n += 1
284
+ end
285
+ end
286
+
223
287
def frame_info ( pos = 0 )
224
288
info = caller ( 0 ) [ -( @frames . size - pos ) ]
225
- info . sub ( /:in `.*'$/ , '' ) =~ /^(.*):(\d +)$/ #`
289
+ info . sub ( /:in `.*'$/ , "" ) =~ /^(.*):(\d +)$/ #`
226
290
[ info , $1, $2. to_i ]
227
291
end
228
292
@@ -259,11 +323,20 @@ def debug_funcname(id)
259
323
260
324
def check_break_points ( file , pos , binding , id )
261
325
file = File . basename ( file )
262
- if @break_points . include? [ file , pos ]
263
- index = @break_points . index ( [ file , pos ] )
264
- STDOUT . printf "Breakpoint %d, %s at %s:%s\n " ,
265
- index , debug_funcname ( id ) , file , pos
266
- return true
326
+ n = 1
327
+ for b in @break_points
328
+ if b [ 0 ]
329
+ if b [ 1 ] == 0 and b [ 2 ] == file and b [ 3 ] == pos
330
+ STDOUT . printf "breakpoint %d, %s at %s:%s\n " , n , debug_funcname ( id ) ,
331
+ file , pos
332
+ return true
333
+ elsif b [ 1 ] == 1 and debug_eval ( b [ 2 ] , binding )
334
+ STDOUT . printf "watchpoint %d, %s at %s:%s\n " , n , debug_funcname ( id ) ,
335
+ file , pos
336
+ return true
337
+ end
338
+ end
339
+ n += 1
267
340
end
268
341
return false
269
342
end
0 commit comments