rbx-trepanning 0.0.1-universal-rubinius

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. data/ChangeLog +376 -0
  2. data/LICENSE +25 -0
  3. data/NEWS +2 -0
  4. data/README.textile +28 -0
  5. data/Rakefile +165 -0
  6. data/THANKS +14 -0
  7. data/app/breakpoint.rb +218 -0
  8. data/app/breakpoint.rbc +3564 -0
  9. data/app/brkptmgr.rb +138 -0
  10. data/app/brkptmgr.rbc +2827 -0
  11. data/app/default.rb +61 -0
  12. data/app/default.rbc +1011 -0
  13. data/app/display.rb +35 -0
  14. data/app/display.rbc +968 -0
  15. data/app/frame.rb +98 -0
  16. data/app/frame.rbc +1808 -0
  17. data/app/irb.rb +112 -0
  18. data/app/irb.rbc +2111 -0
  19. data/app/iseq.rb +95 -0
  20. data/app/iseq.rbc +1801 -0
  21. data/app/method.rb +173 -0
  22. data/app/method.rbc +2492 -0
  23. data/app/mock.rb +13 -0
  24. data/app/mock.rbc +398 -0
  25. data/app/options.rb +123 -0
  26. data/app/options.rbc +2183 -0
  27. data/app/run.rb +86 -0
  28. data/app/run.rbc +1244 -0
  29. data/app/util.rb +49 -0
  30. data/app/util.rbc +1144 -0
  31. data/app/validate.rb +30 -0
  32. data/app/validate.rbc +676 -0
  33. data/bin/trepan.compiled.rbc +1043 -0
  34. data/bin/trepanx +63 -0
  35. data/bin/trepanx.compiled.rbc +985 -0
  36. data/interface/base_intf.rb +95 -0
  37. data/interface/base_intf.rbc +1742 -0
  38. data/interface/script.rb +104 -0
  39. data/interface/script.rbc +1642 -0
  40. data/interface/user.rb +91 -0
  41. data/interface/user.rbc +1418 -0
  42. data/io/base_io.rb +94 -0
  43. data/io/base_io.rbc +1404 -0
  44. data/io/input.rb +112 -0
  45. data/io/input.rbc +1979 -0
  46. data/io/null_output.rb +42 -0
  47. data/io/null_output.rbc +730 -0
  48. data/io/string_array.rb +156 -0
  49. data/io/string_array.rbc +2466 -0
  50. data/lib/trepanning.rb +398 -0
  51. data/lib/trepanning.rbc +6661 -0
  52. data/processor/breakpoint.rb +161 -0
  53. data/processor/command/alias.rb +55 -0
  54. data/processor/command/backtrace.rb +46 -0
  55. data/processor/command/base/cmd.rb +124 -0
  56. data/processor/command/base/subcmd.rb +213 -0
  57. data/processor/command/base/submgr.rb +179 -0
  58. data/processor/command/base/subsubcmd.rb +103 -0
  59. data/processor/command/base/subsubmgr.rb +184 -0
  60. data/processor/command/break.rb +100 -0
  61. data/processor/command/continue.rb +82 -0
  62. data/processor/command/delete.rb +30 -0
  63. data/processor/command/directory.rb +43 -0
  64. data/processor/command/disassemble.rb +103 -0
  65. data/processor/command/down.rb +54 -0
  66. data/processor/command/eval.rb +31 -0
  67. data/processor/command/exit.rb +58 -0
  68. data/processor/command/finish.rb +78 -0
  69. data/processor/command/frame.rb +89 -0
  70. data/processor/command/help.rb +146 -0
  71. data/processor/command/info.rb +28 -0
  72. data/processor/command/info_subcmd/breakpoints.rb +75 -0
  73. data/processor/command/info_subcmd/file.rb +153 -0
  74. data/processor/command/info_subcmd/method.rb +71 -0
  75. data/processor/command/info_subcmd/program.rb +59 -0
  76. data/processor/command/info_subcmd/variables.rb +40 -0
  77. data/processor/command/irb.rb +96 -0
  78. data/processor/command/kill.rb +70 -0
  79. data/processor/command/list.rb +296 -0
  80. data/processor/command/next.rb +66 -0
  81. data/processor/command/nexti.rb +59 -0
  82. data/processor/command/pr.rb +38 -0
  83. data/processor/command/ps.rb +40 -0
  84. data/processor/command/restart.rb +60 -0
  85. data/processor/command/set.rb +47 -0
  86. data/processor/command/set_subcmd/auto.rb +28 -0
  87. data/processor/command/set_subcmd/auto_subcmd/dis.rb +33 -0
  88. data/processor/command/set_subcmd/auto_subcmd/eval.rb +54 -0
  89. data/processor/command/set_subcmd/auto_subcmd/irb.rb +34 -0
  90. data/processor/command/set_subcmd/auto_subcmd/list.rb +34 -0
  91. data/processor/command/set_subcmd/basename.rb +26 -0
  92. data/processor/command/set_subcmd/debug.rb +27 -0
  93. data/processor/command/set_subcmd/debug_subcmd/dbgr.rb +36 -0
  94. data/processor/command/set_subcmd/debug_subcmd/skip.rb +23 -0
  95. data/processor/command/set_subcmd/debug_subcmd/step.rb +23 -0
  96. data/processor/command/set_subcmd/different.rb +60 -0
  97. data/processor/command/set_subcmd/hidelevel.rb +63 -0
  98. data/processor/command/set_subcmd/kernelstep.rb +61 -0
  99. data/processor/command/set_subcmd/max.rb +29 -0
  100. data/processor/command/set_subcmd/max_subcmd/list.rb +49 -0
  101. data/processor/command/set_subcmd/max_subcmd/stack.rb +50 -0
  102. data/processor/command/set_subcmd/max_subcmd/string.rb +54 -0
  103. data/processor/command/set_subcmd/max_subcmd/width.rb +49 -0
  104. data/processor/command/set_subcmd/substitute.rb +25 -0
  105. data/processor/command/set_subcmd/substitute_subcmd/path.rb +56 -0
  106. data/processor/command/set_subcmd/trace.rb +37 -0
  107. data/processor/command/set_subcmd/trace_subcmd/print.rb +57 -0
  108. data/processor/command/show.rb +27 -0
  109. data/processor/command/show_subcmd/alias.rb +43 -0
  110. data/processor/command/show_subcmd/args.rb +26 -0
  111. data/processor/command/show_subcmd/auto.rb +28 -0
  112. data/processor/command/show_subcmd/auto_subcmd/dis.rb +37 -0
  113. data/processor/command/show_subcmd/auto_subcmd/eval.rb +28 -0
  114. data/processor/command/show_subcmd/auto_subcmd/irb.rb +23 -0
  115. data/processor/command/show_subcmd/auto_subcmd/list.rb +22 -0
  116. data/processor/command/show_subcmd/basename.rb +22 -0
  117. data/processor/command/show_subcmd/debug.rb +27 -0
  118. data/processor/command/show_subcmd/debug_subcmd/dbgr.rb +21 -0
  119. data/processor/command/show_subcmd/debug_subcmd/skip.rb +22 -0
  120. data/processor/command/show_subcmd/debug_subcmd/step.rb +22 -0
  121. data/processor/command/show_subcmd/different.rb +27 -0
  122. data/processor/command/show_subcmd/hidelevel.rb +42 -0
  123. data/processor/command/show_subcmd/kernelstep.rb +37 -0
  124. data/processor/command/show_subcmd/max.rb +30 -0
  125. data/processor/command/show_subcmd/max_subcmd/list.rb +38 -0
  126. data/processor/command/show_subcmd/max_subcmd/stack.rb +36 -0
  127. data/processor/command/show_subcmd/max_subcmd/string.rb +42 -0
  128. data/processor/command/show_subcmd/max_subcmd/width.rb +37 -0
  129. data/processor/command/show_subcmd/trace.rb +29 -0
  130. data/processor/command/show_subcmd/trace_subcmd/print.rb +38 -0
  131. data/processor/command/source.rb +83 -0
  132. data/processor/command/step.rb +41 -0
  133. data/processor/command/tbreak.rb +19 -0
  134. data/processor/command/unalias.rb +44 -0
  135. data/processor/command/up.rb +87 -0
  136. data/processor/default.rb +56 -0
  137. data/processor/disassemble.rb +32 -0
  138. data/processor/eval.rb +96 -0
  139. data/processor/frame.rb +211 -0
  140. data/processor/help.rb +72 -0
  141. data/processor/hook.rb +133 -0
  142. data/processor/load_cmds.rb +101 -0
  143. data/processor/location.rb +128 -0
  144. data/processor/main.rb +394 -0
  145. data/processor/mock.rb +137 -0
  146. data/processor/msg.rb +28 -0
  147. data/processor/running.rb +230 -0
  148. data/processor/stepping.rb +115 -0
  149. data/processor/subcmd.rb +160 -0
  150. data/processor/validate.rb +355 -0
  151. data/test/data/enable.right +36 -0
  152. data/test/data/fname-with-blank.cmd +6 -0
  153. data/test/data/fname-with-blank.right +1 -0
  154. data/test/data/quit-Xdebug.right +3 -0
  155. data/test/data/quit.cmd +5 -0
  156. data/test/data/quit.right +0 -0
  157. data/test/example/fname with blank.rb +1 -0
  158. data/test/example/gcd-xx.rb +18 -0
  159. data/test/example/gcd.rb +19 -0
  160. data/test/example/gcd1.rb +24 -0
  161. data/test/example/null.rb +1 -0
  162. data/test/example/thread1.rb +3 -0
  163. data/test/functional/fn_helper.rb +112 -0
  164. data/test/functional/test-break-name.rb +52 -0
  165. data/test/functional/test-break.rb +51 -0
  166. data/test/functional/test-finish.rb +70 -0
  167. data/test/functional/test-fn_helper.rb +43 -0
  168. data/test/functional/test-list.rb +55 -0
  169. data/test/functional/test-next-bug.rb +49 -0
  170. data/test/functional/test-next.rb +101 -0
  171. data/test/functional/test-step.rb +272 -0
  172. data/test/functional/test-step2.rb +35 -0
  173. data/test/functional/test-tbreak.rb +41 -0
  174. data/test/integration/file-diff.rb +89 -0
  175. data/test/integration/helper.rb +78 -0
  176. data/test/integration/test-fname-with-blank.rb +12 -0
  177. data/test/integration/test-quit.rb +25 -0
  178. data/test/unit/cmd-helper.rb +46 -0
  179. data/test/unit/test-app-brkpt.rb +30 -0
  180. data/test/unit/test-app-brkptmgr.rb +51 -0
  181. data/test/unit/test-app-iseq.rb +49 -0
  182. data/test/unit/test-app-method.rb +54 -0
  183. data/test/unit/test-app-options.rb +61 -0
  184. data/test/unit/test-app-run.rb +16 -0
  185. data/test/unit/test-app-util.rb +28 -0
  186. data/test/unit/test-app-validate.rb +18 -0
  187. data/test/unit/test-base-subcmd.rb +61 -0
  188. data/test/unit/test-bin-trepanx.rb +48 -0
  189. data/test/unit/test-cmd-alias.rb +49 -0
  190. data/test/unit/test-cmd-break.rb +23 -0
  191. data/test/unit/test-cmd-exit.rb +27 -0
  192. data/test/unit/test-cmd-help.rb +101 -0
  193. data/test/unit/test-cmd-kill.rb +48 -0
  194. data/test/unit/test-intf-user.rb +46 -0
  195. data/test/unit/test-io-input.rb +27 -0
  196. data/test/unit/test-proc-eval.rb +37 -0
  197. data/test/unit/test-proc-frame.rb +79 -0
  198. data/test/unit/test-proc-help.rb +16 -0
  199. data/test/unit/test-proc-hook.rb +30 -0
  200. data/test/unit/test-proc-load_cmds.rb +41 -0
  201. data/test/unit/test-proc-location.rb +48 -0
  202. data/test/unit/test-proc-main.rb +96 -0
  203. data/test/unit/test-proc-validate.rb +91 -0
  204. data/test/unit/test-subcmd-help.rb +51 -0
  205. metadata +337 -0
@@ -0,0 +1,296 @@
1
+ # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
2
+ # -*- coding: utf-8 -*-
3
+ require 'rubygems'
4
+ require 'require_relative'
5
+ require 'linecache'
6
+ require_relative 'base/cmd'
7
+
8
+ class Trepan::Command::ListCommand < Trepan::Command
9
+ unless defined?(HELP)
10
+ NAME = File.basename(__FILE__, '.rb')
11
+ HELP = <<-HELP
12
+ #{NAME}[>] [FIRST [NUM]]
13
+ #{NAME}[>] LOCATION [NUM]
14
+
15
+ #{NAME} source code.
16
+
17
+ Without arguments, prints lines centered around the current
18
+ line. If this is the first #{NAME} command issued since the debugger
19
+ command loop was entered, then the current line is the current
20
+ frame. If a subsequent #{NAME} command was issued with no intervening
21
+ frame changing, then that is start the line after we last one
22
+ previously shown.
23
+
24
+ If the command has a '>' suffix, then line centering is disabled and
25
+ listing begins at the specificed location.
26
+
27
+ The number of line to show is controled by the debugger listsize
28
+ setting. Use 'set listsize' or 'show listsize' to see or set the
29
+ value.
30
+
31
+ \"#{NAME} -\" shows lines before a previous listing.
32
+
33
+ A LOCATION is a either
34
+ - number, e.g. 5,
35
+ - a function, e.g. join or os.path.join
36
+ - a module, e.g. os or os.path
37
+ - a filename, colon, and a number, e.g. foo.rb:5,
38
+ - or a module name and a number, e.g,. os.path:5.
39
+ - a '.' for the current line number
40
+ - a '-' for the lines before the current line number
41
+
42
+ If the location form is used with a subsequent parameter, the
43
+ parameter is the starting line number. When there two numbers are
44
+ given, the last number value is treated as a stopping line unless it
45
+ is less than the start line, in which case it is taken to mean the
46
+ number of lines to list instead.
47
+
48
+ Wherever a number is expected, it does not need to be a constant --
49
+ just something that evaluates to a positive integer.
50
+
51
+ Some examples:
52
+
53
+ #{NAME} 5 # List centered around line 5
54
+ #{NAME} 4+1 # Same as above.
55
+ #{NAME} 5> # List starting at line 5
56
+ #{NAME} foo.rb:5 # List centered around line 5 of foo.rb
57
+ #{NAME} foo.rb 5 # Same as above.
58
+ #{NAME} foo.rb:5> # List starting around line 5 of foo.rb
59
+ #{NAME} foo.rb 5 6 # list lines 5 and 6 of foo.rb
60
+ #{NAME} foo.rb 5 2 # Same as above, since 2 < 5.
61
+ #{NAME} foo.rb:5 2 # Same as above
62
+ #{NAME} FileUtils.cp # List lines around the FileUtils.cp function.
63
+ #{NAME} . # List lines centered from where we currently are stopped
64
+ #{NAME} . 3 # List 3 lines starting from where we currently are stopped
65
+ # if . > 3. Otherwise we list from . to 3.
66
+ #{NAME} - # List lines previous to those just shown
67
+
68
+ HELP
69
+
70
+ ALIASES = %W(l #{NAME}> l>)
71
+ CATEGORY = 'files'
72
+ MAX_ARGS = 3
73
+ SHORT_HELP = 'List source code'
74
+ end
75
+
76
+ # If last is less than first, assume last is a count rather than an
77
+ # end line number.
78
+ def adjust_last(first, last)
79
+ last < first ? first + last - 1 : last
80
+ end
81
+
82
+ # What a f*cking mess. Necessitated I suppose because we want to
83
+ # allow somewhat flexible parsing with either module names, files or none
84
+ # and optional line counts or end-line numbers.
85
+
86
+ # Parses arguments for the "list" command and returns the tuple:
87
+ # filename, start, last
88
+ # or sets these to nil if there was some problem.
89
+ def parse_list_cmd(args, listsize, center_correction)
90
+
91
+ last = nil
92
+
93
+ if args.size > 0
94
+ if args[0] == '-'
95
+ return no_frame_msg unless @proc.line_no
96
+ first = [1, @proc.line_no - 2*listsize - 1].max
97
+ file = @proc.frame.file
98
+ elsif args[0] == '.'
99
+ return no_frame_msg unless @proc.line_no
100
+ if args.size == 2
101
+ opts = {
102
+ :msg_on_error =>
103
+ "#{NAME} command last or count parameter expected, " +
104
+ 'got: %s.' % args[2]
105
+ }
106
+ second = @proc.get_an_int(args[1], opts)
107
+ return nil, nil, nil unless second
108
+ first = @proc.frame.line
109
+ last = adjust_last(first, second)
110
+ else
111
+ first = [1, @proc.frame.line - center_correction].max
112
+ end
113
+
114
+ file = @proc.frame.file
115
+ else
116
+ modfunc, file, first = @proc.parse_position(args[0])
117
+ if first == nil and modfunc == nil
118
+ # error should have been shown previously
119
+ return nil, nil, nil
120
+ end
121
+ if args.size == 1
122
+ first = 1 if !first and modfunc
123
+ first = [1, first - center_correction].max
124
+ elsif args.size == 2 or (args.size == 3 and modfunc)
125
+ opts = {
126
+ :msg_on_error =>
127
+ "#{NAME} command starting line expected, got %s." % args[-1]
128
+ }
129
+ last = @proc.get_an_int(args[1], opts)
130
+ return nil, nil, nil unless last
131
+ if modfunc
132
+ if first
133
+ first = last
134
+ if args.size == 3 and modfunc
135
+ opts[:msg_on_error] =
136
+ ("#{NAME} command last or count parameter expected, " +
137
+ 'got: %s.' % args[2])
138
+ last = @proc.get_an_int(args[2], opts)
139
+ return nil, nil, nil unless last
140
+ end
141
+ end
142
+ end
143
+ last = adjust_last(first, last)
144
+ elsif not modfunc
145
+ errmsg('At most 2 parameters allowed when no module' +
146
+ ' name is found/given. Saw: %d parameters' % args.size)
147
+ return nil, nil, nil
148
+ else
149
+ errmsg(('At most 3 parameters allowed when a module' +
150
+ ' name is given. Saw: %d parameters') % args.size)
151
+ return nil, nil, nil
152
+ end
153
+ end
154
+ elsif !@proc.line_no and @proc.frame
155
+ first = [1, @proc.frame.line - center_correction].max
156
+ file = @proc.frame.file
157
+ else
158
+ first = [1, @proc.line_no - center_correction].max
159
+ file = @proc.frame.file
160
+ end
161
+ last = first + listsize - 1 unless last
162
+
163
+ if @proc.frame.eval?
164
+ script = @proc.frame.vm_location.static_scope.script
165
+ LineCache::cache(script)
166
+ else
167
+ LineCache::cache(file)
168
+ script = nil
169
+ end
170
+ return file, script, first, last
171
+ end
172
+
173
+ def no_frame_msg
174
+ errmsg("No Ruby program loaded.")
175
+ return nil, nil, nil
176
+ end
177
+
178
+ def run(args)
179
+ listsize = settings[:maxlist]
180
+ center_correction =
181
+ if args[0][-1..-1] == '>'
182
+ 0
183
+ else
184
+ (listsize-1) / 2
185
+ end
186
+
187
+ file, script, first, last =
188
+ parse_list_cmd(args[1..-1], listsize, center_correction)
189
+ frame = @proc.frame
190
+ return unless file
191
+
192
+ cached_item = script || file
193
+
194
+ # We now have range information. Do the listing.
195
+ max_line = LineCache::size(cached_item)
196
+
197
+ # FIXME: join with line_at of location.rb
198
+ unless max_line && file
199
+ # Try using search directories (set with command "directory")
200
+ if file[0..0] != File::SEPARATOR
201
+ try_filename = @proc.resolve_file_with_dir(file)
202
+ if try_filename &&
203
+ max_line = LineCache::size(try_filename)
204
+ LineCache::remap_file(file, try_filename)
205
+ end
206
+ end
207
+ end
208
+
209
+ unless max_line
210
+ errmsg('File "%s" not found.' % file)
211
+ return
212
+ end
213
+
214
+ if first > max_line
215
+ errmsg('Bad line range [%d...%d]; file "%s" has only %d lines' %
216
+ [first, last, file, max_line])
217
+ return
218
+ end
219
+
220
+ if last > max_line
221
+ # msg('End position changed to last line %d ' % max_line)
222
+ last = max_line
223
+ end
224
+
225
+ begin
226
+ first.upto(last).each do |lineno|
227
+ line = LineCache::getline(cached_item, lineno,
228
+ @proc.reload_on_change)
229
+ unless line
230
+ msg('[EOF]')
231
+ break
232
+ end
233
+ line.chomp!
234
+ s = '%3d' % lineno
235
+ s = s + ' ' if s.size < 4
236
+ s += (@proc.frame && lineno == @proc.frame.vm_location.line) ? '->' : ' '
237
+ # && container == frame.source_container)
238
+ msg(s + "\t" + line)
239
+ @proc.line_no = lineno
240
+ end
241
+ rescue => e
242
+ errmsg e.to_s if settings[:debugexcept]
243
+ end
244
+ end
245
+ end
246
+
247
+ if __FILE__ == $0
248
+ require_relative '../location'
249
+ require_relative '../mock'
250
+ require_relative '../frame'
251
+ dbgr, cmd = MockDebugger::setup
252
+ cmd.proc.send('frame_initialize')
253
+ LineCache::cache(__FILE__)
254
+ cmd.run([cmd.name])
255
+ cmd.run([cmd.name, __FILE__ + ':10'])
256
+
257
+ def run_cmd(cmd, args)
258
+ seps = '--' * 10
259
+ puts "%s %s %s" % [seps, args.join(' '), seps]
260
+ cmd.run(args)
261
+ end
262
+
263
+
264
+ load 'tmpdir.rb'
265
+ run_cmd(cmd, %W(#{cmd.name} tmpdir.rb 10))
266
+ run_cmd(cmd, %W(#{cmd.name} tmpdir.rb))
267
+
268
+ run_cmd(cmd, %W(cmd.name .))
269
+ run_cmd(cmd, %W(cmd.name 30))
270
+
271
+ # cmd.run(['list', '9+1'])
272
+
273
+ run_cmd(cmd, %W(cmd.name> 10))
274
+ run_cmd(cmd, %W(cmd.name 3000))
275
+ run_cmd(cmd, %W(cmd.name run_cmd))
276
+
277
+ p = Proc.new do
278
+ |x,y| x + y
279
+ end
280
+ run_cmd(cmd, %W(#{cmd.name} p))
281
+
282
+ # Function from a file found via an instruction sequence
283
+ run_cmd(cmd, %W(#{cmd.name} Columnize.columnize))
284
+
285
+ # Use Class/method name. 15 isn't in the function - should this be okay?
286
+ run_cmd(cmd, %W(#{cmd.name} Columnize.columnize 15))
287
+
288
+ # Start line and count, since 3 < 30
289
+ run_cmd(cmd, %W(#{cmd.name} Columnize.columnize 30 3))
290
+
291
+ # Start line finish line
292
+ run_cmd(cmd, %W(#{cmd.name} Columnize.columnize 40 50))
293
+
294
+ # Method name
295
+ run_cmd(cmd, %W(#{cmd.name} cmd.run))
296
+ end
@@ -0,0 +1,66 @@
1
+ require 'rubygems'; require 'require_relative'
2
+ require_relative 'base/cmd'
3
+ require_relative '../stepping'
4
+ require_relative '../../app/breakpoint'
5
+
6
+ class Trepan::Command::NextCommand < Trepan::Command
7
+
8
+ ALIASES = %w(n)
9
+ CATEGORY = 'running'
10
+ NAME = File.basename(__FILE__, '.rb')
11
+ HELP= <<-HELP
12
+ #{NAME} [NUM]
13
+
14
+ Attempt to continue execution and stop at the next line. If there is
15
+ a conditional branch between the current position and the next line,
16
+ execution is stopped within the conditional branch instead.
17
+
18
+ The optional argument is a number which specifies how many lines to
19
+ attempt to skip past before stopping execution.
20
+
21
+ If the current line is the last in a method, execution is stopped
22
+ at the current position of the caller.
23
+
24
+ See also 'step' and 'nexti'.
25
+ HELP
26
+ NEED_RUNNING = true
27
+ SHORT_HELP = 'Move to the next line or conditional branch'
28
+
29
+ def run(args)
30
+ if args.size == 1
31
+ step_count = 1
32
+ else
33
+ step_str = args[1]
34
+ opts = {
35
+ :msg_on_error =>
36
+ "The #{NAME} command argument must eval to an integer. Got: %s" %
37
+ step_str,
38
+ :min_value => 1
39
+ }
40
+ step_count = @proc.get_an_int(step_str, opts)
41
+ return unless step_count
42
+ end
43
+
44
+ @proc.step('next', step_count)
45
+ end
46
+
47
+ end
48
+
49
+ if __FILE__ == $0
50
+ require_relative '../mock'
51
+ dbgr, cmd = MockDebugger::setup
52
+ # [%w(n 5), %w(next 1+2), %w(n foo)].each do |c|
53
+ # dbgr.core.step_count = 0
54
+ # cmd.proc.leave_cmd_loop = false
55
+ # result = cmd.run(c)
56
+ # puts 'Run result: %s' % result
57
+ # puts 'step_count %d, leave_cmd_loop: %s' % [dbgr.core.step_count,
58
+ # cmd.proc.leave_cmd_loop]
59
+ # end
60
+ # [%w(n), %w(next+), %w(n-)].each do |c|
61
+ # dbgr.core.step_count = 0
62
+ # cmd.proc.leave_cmd_loop = false
63
+ # result = cmd.run(c)
64
+ # puts cmd.proc.different_pos
65
+ # end
66
+ end
@@ -0,0 +1,59 @@
1
+ require 'rubygems'; require 'require_relative'
2
+ require_relative 'base/cmd'
3
+ require_relative '../stepping'
4
+ require_relative '../../app/breakpoint'
5
+ require_relative '../../app/iseq'
6
+
7
+ class Trepan::Command::NextInstructionCommand < Trepan::Command
8
+ ALIASES = %w(ni)
9
+ CATEGORY = 'running'
10
+ HELP = <<-HELP
11
+ Continue but stop execution at the next bytecode instruction.
12
+
13
+ Does not step into send instructions.
14
+
15
+ See also 'continue', 'step', and 'next' commands.
16
+ HELP
17
+ NAME = File.basename(__FILE__, '.rb')
18
+ NEED_STACK = true
19
+ SHORT_HELP = 'Move to the next bytecode instruction'
20
+
21
+ def run(args)
22
+ if args.size == 1
23
+ step = 1
24
+ else
25
+ step_str = args[1]
26
+ opts = {
27
+ :msg_on_error =>
28
+ "The 'next' command argument must eval to an integer. Got: %s" %
29
+ step_str,
30
+ :min_value => 1
31
+ }
32
+ step = @proc.get_an_int(step_str, opts)
33
+ return unless step
34
+ end
35
+
36
+ exec = current_method
37
+ insn = Rubinius::InstructionSet[exec.iseq[@proc.frame.next_ip]]
38
+
39
+ next_ip = @proc.frame.next_ip + insn.width
40
+
41
+ if next_ip >= exec.iseq.size
42
+ @proc.step_to_parent
43
+ elsif Trepanning::ISeq.goto_op?(exec, @proc.frame.next_ip)
44
+ @proc.set_breakpoints_between(exec, @proc.frame.next_ip, next_ip)
45
+ else
46
+ line = exec.line_from_ip(next_ip)
47
+
48
+ bp = Trepanning::Breakpoint.for_ip(exec, next_ip, :event => 'vm-insn')
49
+ bp.scoped!(@proc.frame.scope)
50
+ bp.activate
51
+ end
52
+ @proc.continue('nexti')
53
+ end
54
+ end
55
+
56
+ if __FILE__ == $0
57
+ require_relative '../mock'
58
+ dbgr, cmd = MockDebugger::setup
59
+ end
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative 'base/cmd'
5
+ require_relative '../eval'
6
+ class Trepan::Command::PrCommand < Trepan::Command
7
+
8
+ unless defined?(HELP)
9
+ NAME = File.basename(__FILE__, '.rb')
10
+ HELP =
11
+ "#{NAME} EXPRESSION
12
+
13
+ Print the value of the EXPRESSION. Variables accessible are those of the
14
+ environment of the selected stack frame, plus globals.
15
+
16
+ If the length output string large, the first part of the value is
17
+ shown and ... indicates it has been truncated.
18
+
19
+ See 'set max string' to change the string truncation limit.
20
+ "
21
+
22
+ # ALIASES = %w(p)
23
+ CATEGORY = 'data'
24
+ SHORT_HELP = 'print expression truncating long output'
25
+ end
26
+
27
+ def run(args)
28
+ msg @proc.debug_eval(@proc.cmd_argstr, @proc.settings[:maxstring])
29
+ end
30
+ end
31
+
32
+ if __FILE__ == $0
33
+ require_relative '../mock'
34
+ dbgr, cmd = MockDebugger::setup
35
+ arg_str = '1 + 2'
36
+ cmd.proc.instance_variable_set('@cmd_argstr', arg_str)
37
+ cmd.run([cmd.name, arg_str])
38
+ end
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative 'base/cmd'
5
+ require_relative '../eval'
6
+ class Trepan::Command::PsCommand < Trepan::Command
7
+
8
+ unless defined?(HELP)
9
+ HELP =
10
+ "ps ARRAY
11
+
12
+ Print the value of the ARRAY in columns and sorted."
13
+
14
+ CATEGORY = 'data'
15
+ MIN_ARGS = 1 # Need least this many
16
+ NAME = File.basename(__FILE__, '.rb')
17
+ SHORT_HELP = 'Print array sorted and in columns'
18
+ end
19
+
20
+ def run(args)
21
+ array = @proc.debug_eval(@proc.cmd_argstr, @proc.settings[:maxstring])
22
+ # FIXME: should test for enumerable
23
+ if array.is_a?(Array)
24
+ msg columnize_commands(array.sort)
25
+ else
26
+ errmsg "ps: #{@proc.cmd_argstr} should evaluate an Array not #{array.class}"
27
+ end
28
+ end
29
+ end
30
+
31
+ if __FILE__ == $0
32
+ require_relative '../mock'
33
+ dbgr, cmd = MockDebugger::setup
34
+ arg_str = '(1..30).to_a'
35
+ cmd.proc.instance_variable_set('@cmd_argstr', arg_str)
36
+ cmd.run([cmd.name, arg_str])
37
+ arg_str = '1'
38
+ cmd.proc.instance_variable_set('@cmd_argstr', arg_str)
39
+ cmd.run([cmd.name, arg_str])
40
+ end
@@ -0,0 +1,60 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative 'base/cmd'
5
+ require_relative '../../app/run'
6
+ class Trepan::Command::RestartCommand < Trepan::Command
7
+
8
+ unless defined?(HELP)
9
+ NAME = File.basename(__FILE__, '.rb')
10
+ ALIASES = %w(R run)
11
+ HELP = <<-HELP
12
+ #{NAME}
13
+
14
+ Restart debugger and program via an exec call. All state is lost, and
15
+ new copy of the debugger is used.
16
+ HELP
17
+
18
+ CATEGORY = 'running'
19
+ MAX_ARGS = 0 # Need at most this many
20
+ SHORT_HELP = '(Hard) restart of program via exec()'
21
+ end
22
+
23
+ # This method runs the command
24
+ def run(args)
25
+
26
+ dbgr = @proc.dbgr
27
+ argv = dbgr.restart_argv
28
+ if argv and argv.size > 0
29
+ # unless File.executable?(argv[0])
30
+ # msg(["File #{argv[0]} not executable.",
31
+ # "Adding Ruby interpreter."])
32
+ # argv.unshift Trepanning::ruby_path
33
+ # end
34
+ @proc.run_cmd(%w(show args))
35
+ if not confirm('Restart (exec)?', false)
36
+ msg "Restart not confirmed"
37
+ else
38
+ msg 'Restarting...'
39
+ @proc.run_cmd(%w(save))
40
+ # FIXME: Run atexit finalize routines?
41
+ Dir.chdir(Rubinius::OS_STARTUP_DIR)
42
+ exec(*argv)
43
+ end
44
+ else
45
+ errmsg("No executable file and command options recorded.")
46
+ end
47
+ end
48
+ end
49
+
50
+ if __FILE__ == $0
51
+ exit if ARGV[-1] == 'exit'
52
+ require_relative '../mock'
53
+ dbgr, cmd = MockDebugger::setup
54
+ dbgr.restart_argv = []
55
+ cmd.run([cmd.name])
56
+ dbgr.restart_argv = Rubinius::OS_ARGV + ['exit']
57
+ # require_relative '../../debugger'
58
+ # Trepan.start
59
+ cmd.run([cmd.name])
60
+ end
@@ -0,0 +1,47 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative 'base/submgr'
5
+
6
+ class Trepan::Command::SetCommand < Trepan::SubcommandMgr
7
+ unless defined?(HELP)
8
+ HELP =
9
+ 'Modifies parts of the debugger environment.
10
+
11
+ You can give unique prefix of the name of a subcommand to get
12
+ information about just that subcommand.
13
+
14
+ Type "set" for a list of "set" subcommands and what they do.
15
+ Type "help set *" for just the list of "set" subcommands.
16
+
17
+ For compatability with older ruby-debug "set auto..." is the
18
+ same as "set auto ...". For example "set autolist" is the same
19
+ as "set auto list".
20
+ '
21
+
22
+ CATEGORY = 'support'
23
+ NAME = File.basename(__FILE__, '.rb')
24
+ NEED_STACK = false
25
+ SHORT_HELP = 'Modify parts of the debugger environment'
26
+ end
27
+
28
+ def run(args)
29
+ if args.size > 1
30
+ first = args[1].downcase
31
+ alen = 'auto'.size
32
+ args[1..1] = ['auto', first[alen..-1]] if
33
+ first.start_with?('auto') && first.size > alen
34
+ end
35
+ super
36
+ end
37
+
38
+ end
39
+
40
+ if __FILE__ == $0
41
+ require_relative '../mock'
42
+ dbgr, cmd = MockDebugger::setup
43
+ cmd.run([cmd.name])
44
+ cmd.run([cmd.name, 'autolist'])
45
+ cmd.run([cmd.name, 'autoeval', 'off'])
46
+ cmd.run([cmd.name, 'basename'])
47
+ end
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative '../base/subsubcmd'
5
+ require_relative '../base/subsubmgr'
6
+
7
+ class Trepan::SubSubcommand::SetAuto < Trepan::SubSubcommandMgr
8
+ unless defined?(HELP)
9
+ HELP = 'Set controls for things with some sort of "automatic" default behavior'
10
+ NAME = File.basename(__FILE__, '.rb')
11
+ PREFIX = %W(set #{NAME})
12
+ end
13
+ end
14
+
15
+ if __FILE__ == $0
16
+ require_relative '../../mock'
17
+ dbgr, cmd = MockDebugger::setup('set')
18
+ # cmds = dbgr.core.processor.commands
19
+ # set_cmd = cmds['set']
20
+ # command = Trepan::SubSubcommand::SetAuto.new(dbgr.core.processor,
21
+ # set_cmd)
22
+ # name = File.basename(__FILE__, '.rb')
23
+ # cmd_args = ['set', name]
24
+ # set_cmd.instance_variable_set('@last_args', cmd_args)
25
+ # # require_relative '../../../lib/trepanning'
26
+ # # Trepan.debug(:set_restart => true)
27
+ # command.run(cmd_args)
28
+ end
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative '../../base/subsubcmd'
5
+
6
+ class Trepan::Subcommand::SetAutoDis < Trepan::SetBoolSubSubcommand
7
+ unless defined?(HELP)
8
+ HELP = "Set to run a 'disassemble' command each time we enter the debugger"
9
+ MIN_ABBREV = 'd'.size
10
+ NAME = File.basename(__FILE__, '.rb')
11
+ PREFIX = %W(set auto #{NAME})
12
+ SHORT_HELP = "Set running a 'disassemble' command each time we enter the debugger"
13
+ end
14
+
15
+ def run(args)
16
+ super
17
+ if @proc.settings[:autodis]
18
+ @proc.cmdloop_prehooks.insert_if_new(10, *@proc.autodis_hook)
19
+ else
20
+ @proc.cmdloop_prehooks.delete_by_name('autodis')
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+ if __FILE__ == $0
27
+ # Demo it.
28
+ require_relative '../../../mock'
29
+ require_relative '../auto'
30
+ cmd = MockDebugger::subsub_setup(Trepan::SubSubcommand::SetAuto,
31
+ Trepan::SubSubcommand::SetAutoDis)
32
+ cmd.run([cmd.name, 'off'])
33
+ end