rb8-trepanning 0.1.3

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.
Files changed (274) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGES +34 -0
  3. data/ChangeLog +875 -0
  4. data/README.textile +59 -0
  5. data/Rakefile +215 -0
  6. data/app/.gitignore +1 -0
  7. data/app/cmd_parse.kpeg +241 -0
  8. data/app/cmd_parse.rb +212 -0
  9. data/app/cmd_parser.rb +1948 -0
  10. data/app/complete.rb +79 -0
  11. data/app/default.rb +90 -0
  12. data/app/display.rb +148 -0
  13. data/app/eventbuffer.rb +147 -0
  14. data/app/frame.rb +166 -0
  15. data/app/irb.rb +114 -0
  16. data/app/options.rb +200 -0
  17. data/app/run.rb +74 -0
  18. data/app/util.rb +65 -0
  19. data/bin/.gitignore +1 -0
  20. data/bin/trepan8 +115 -0
  21. data/data/.gitignore +1 -0
  22. data/data/irbrc +41 -0
  23. data/interface/.gitignore +1 -0
  24. data/interface/base_intf.rb +109 -0
  25. data/interface/client.rb +82 -0
  26. data/interface/comcodes.rb +20 -0
  27. data/interface/script.rb +110 -0
  28. data/interface/server.rb +147 -0
  29. data/interface/user.rb +165 -0
  30. data/io/base_io.rb +148 -0
  31. data/io/input.rb +158 -0
  32. data/io/null_output.rb +46 -0
  33. data/io/string_array.rb +156 -0
  34. data/io/tcpclient.rb +129 -0
  35. data/io/tcpfns.rb +33 -0
  36. data/io/tcpserver.rb +141 -0
  37. data/lib/debugger.rb +8 -0
  38. data/lib/trepanning.rb +283 -0
  39. data/processor/.gitignore +1 -0
  40. data/processor/command-ruby-debug/breakpoints.rb +155 -0
  41. data/processor/command-ruby-debug/catchpoint.rb +55 -0
  42. data/processor/command-ruby-debug/condition.rb +49 -0
  43. data/processor/command-ruby-debug/control.rb +31 -0
  44. data/processor/command-ruby-debug/display.rb +120 -0
  45. data/processor/command-ruby-debug/enable.rb +202 -0
  46. data/processor/command-ruby-debug/frame.rb +199 -0
  47. data/processor/command-ruby-debug/help.rb +63 -0
  48. data/processor/command-ruby-debug/info.rb +359 -0
  49. data/processor/command-ruby-debug/method.rb +84 -0
  50. data/processor/command-ruby-debug/reload.rb +40 -0
  51. data/processor/command-ruby-debug/save.rb +90 -0
  52. data/processor/command-ruby-debug/set.rb +237 -0
  53. data/processor/command-ruby-debug/show.rb +251 -0
  54. data/processor/command-ruby-debug/source.rb +36 -0
  55. data/processor/command-ruby-debug/threads.rb +189 -0
  56. data/processor/command-ruby-debug/trace.rb +57 -0
  57. data/processor/command-ruby-debug/variables.rb +199 -0
  58. data/processor/command.rb +270 -0
  59. data/processor/command/.gitignore +1 -0
  60. data/processor/command/alias.rb +54 -0
  61. data/processor/command/backtrace.rb +123 -0
  62. data/processor/command/base/cmd.rb +177 -0
  63. data/processor/command/base/subcmd.rb +230 -0
  64. data/processor/command/base/submgr.rb +188 -0
  65. data/processor/command/base/subsubcmd.rb +128 -0
  66. data/processor/command/base/subsubmgr.rb +199 -0
  67. data/processor/command/break.rb +114 -0
  68. data/processor/command/catch.rb +71 -0
  69. data/processor/command/complete.rb +39 -0
  70. data/processor/command/continue.rb +57 -0
  71. data/processor/command/directory.rb +50 -0
  72. data/processor/command/disable.rb +85 -0
  73. data/processor/command/display.rb +78 -0
  74. data/processor/command/down.rb +54 -0
  75. data/processor/command/edit.rb +79 -0
  76. data/processor/command/enable.rb +48 -0
  77. data/processor/command/eval.rb +90 -0
  78. data/processor/command/exit.rb +66 -0
  79. data/processor/command/finish.rb +59 -0
  80. data/processor/command/frame.rb +97 -0
  81. data/processor/command/help.rb +230 -0
  82. data/processor/command/help/.gitignore +1 -0
  83. data/processor/command/help/README +10 -0
  84. data/processor/command/help/command.txt +58 -0
  85. data/processor/command/help/examples.txt +16 -0
  86. data/processor/command/help/filename.txt +40 -0
  87. data/processor/command/help/location.txt +37 -0
  88. data/processor/command/help/suffixes.txt +17 -0
  89. data/processor/command/info.rb +28 -0
  90. data/processor/command/info_subcmd/.gitignore +1 -0
  91. data/processor/command/info_subcmd/args.rb +39 -0
  92. data/processor/command/info_subcmd/breakpoints.rb +80 -0
  93. data/processor/command/info_subcmd/catch.rb +36 -0
  94. data/processor/command/info_subcmd/files.rb +39 -0
  95. data/processor/command/info_subcmd/globals.rb +64 -0
  96. data/processor/command/info_subcmd/line.rb +30 -0
  97. data/processor/command/info_subcmd/locals.rb +69 -0
  98. data/processor/command/info_subcmd/macro.rb +62 -0
  99. data/processor/command/info_subcmd/program.rb +51 -0
  100. data/processor/command/info_subcmd/ruby.rb +57 -0
  101. data/processor/command/info_subcmd/source.rb +74 -0
  102. data/processor/command/info_subcmd/stack.rb +25 -0
  103. data/processor/command/info_subcmd/threads.rb +75 -0
  104. data/processor/command/kill.rb +78 -0
  105. data/processor/command/list.rb +117 -0
  106. data/processor/command/macro.rb +68 -0
  107. data/processor/command/next.rb +79 -0
  108. data/processor/command/parsetree.rb +56 -0
  109. data/processor/command/pp.rb +40 -0
  110. data/processor/command/pr.rb +37 -0
  111. data/processor/command/ps.rb +40 -0
  112. data/processor/command/restart.rb +86 -0
  113. data/processor/command/save.rb +58 -0
  114. data/processor/command/set.rb +47 -0
  115. data/processor/command/set_subcmd/.gitignore +1 -0
  116. data/processor/command/set_subcmd/abbrev.rb +25 -0
  117. data/processor/command/set_subcmd/auto.rb +27 -0
  118. data/processor/command/set_subcmd/auto_subcmd/.gitignore +1 -0
  119. data/processor/command/set_subcmd/auto_subcmd/eval.rb +53 -0
  120. data/processor/command/set_subcmd/auto_subcmd/irb.rb +33 -0
  121. data/processor/command/set_subcmd/auto_subcmd/list.rb +33 -0
  122. data/processor/command/set_subcmd/basename.rb +25 -0
  123. data/processor/command/set_subcmd/callstyle.rb +46 -0
  124. data/processor/command/set_subcmd/confirm.rb +24 -0
  125. data/processor/command/set_subcmd/debug.rb +47 -0
  126. data/processor/command/set_subcmd/different.rb +61 -0
  127. data/processor/command/set_subcmd/highlight.rb +43 -0
  128. data/processor/command/set_subcmd/max.rb +26 -0
  129. data/processor/command/set_subcmd/max_subcmd/list.rb +49 -0
  130. data/processor/command/set_subcmd/max_subcmd/stack.rb +50 -0
  131. data/processor/command/set_subcmd/max_subcmd/string.rb +76 -0
  132. data/processor/command/set_subcmd/max_subcmd/width.rb +49 -0
  133. data/processor/command/set_subcmd/reload.rb +42 -0
  134. data/processor/command/set_subcmd/timer.rb +58 -0
  135. data/processor/command/set_subcmd/trace.rb +37 -0
  136. data/processor/command/set_subcmd/trace_subcmd/buffer.rb +42 -0
  137. data/processor/command/set_subcmd/trace_subcmd/print.rb +41 -0
  138. data/processor/command/shell.rb +139 -0
  139. data/processor/command/show.rb +39 -0
  140. data/processor/command/show_subcmd/.gitignore +1 -0
  141. data/processor/command/show_subcmd/abbrev.rb +20 -0
  142. data/processor/command/show_subcmd/alias.rb +46 -0
  143. data/processor/command/show_subcmd/args.rb +34 -0
  144. data/processor/command/show_subcmd/auto.rb +28 -0
  145. data/processor/command/show_subcmd/auto_subcmd/eval.rb +27 -0
  146. data/processor/command/show_subcmd/auto_subcmd/irb.rb +23 -0
  147. data/processor/command/show_subcmd/auto_subcmd/list.rb +22 -0
  148. data/processor/command/show_subcmd/basename.rb +20 -0
  149. data/processor/command/show_subcmd/callstyle.rb +22 -0
  150. data/processor/command/show_subcmd/confirm.rb +18 -0
  151. data/processor/command/show_subcmd/debug.rb +26 -0
  152. data/processor/command/show_subcmd/debug_subcmd/dbgr.rb +21 -0
  153. data/processor/command/show_subcmd/debug_subcmd/skip.rb +22 -0
  154. data/processor/command/show_subcmd/debug_subcmd/step.rb +22 -0
  155. data/processor/command/show_subcmd/different.rb +26 -0
  156. data/processor/command/show_subcmd/directories.rb +22 -0
  157. data/processor/command/show_subcmd/highlight.rb +24 -0
  158. data/processor/command/show_subcmd/max.rb +27 -0
  159. data/processor/command/show_subcmd/max_subcmd/list.rb +38 -0
  160. data/processor/command/show_subcmd/max_subcmd/stack.rb +36 -0
  161. data/processor/command/show_subcmd/max_subcmd/string.rb +42 -0
  162. data/processor/command/show_subcmd/max_subcmd/width.rb +37 -0
  163. data/processor/command/show_subcmd/reload.rb +18 -0
  164. data/processor/command/show_subcmd/timer.rb +18 -0
  165. data/processor/command/show_subcmd/trace.rb +29 -0
  166. data/processor/command/show_subcmd/trace_subcmd/buffer.rb +65 -0
  167. data/processor/command/show_subcmd/trace_subcmd/print.rb +23 -0
  168. data/processor/command/show_subcmd/version.rb +23 -0
  169. data/processor/command/source.rb +134 -0
  170. data/processor/command/step.rb +81 -0
  171. data/processor/command/tbreak.rb +19 -0
  172. data/processor/command/unalias.rb +44 -0
  173. data/processor/command/undisplay.rb +59 -0
  174. data/processor/command/up.rb +72 -0
  175. data/processor/default.rb +56 -0
  176. data/processor/display.rb +17 -0
  177. data/processor/eval.rb +113 -0
  178. data/processor/eventbuf.rb +105 -0
  179. data/processor/frame.rb +172 -0
  180. data/processor/help.rb +92 -0
  181. data/processor/helper.rb +76 -0
  182. data/processor/hook.rb +134 -0
  183. data/processor/load_cmds.rb +258 -0
  184. data/processor/location.rb +174 -0
  185. data/processor/main.rb +455 -0
  186. data/processor/mock.rb +136 -0
  187. data/processor/msg.rb +61 -0
  188. data/processor/processor.rb +674 -0
  189. data/processor/running.rb +168 -0
  190. data/processor/stepping.rb +18 -0
  191. data/processor/subcmd.rb +161 -0
  192. data/processor/validate.rb +355 -0
  193. data/processor/virtual.rb +34 -0
  194. data/test/data/.gitignore +1 -0
  195. data/test/data/break_bad.cmd +19 -0
  196. data/test/data/break_bad.right +29 -0
  197. data/test/data/break_loop_bug.cmd +5 -0
  198. data/test/data/break_loop_bug.right +15 -0
  199. data/test/data/dollar-0.right +2 -0
  200. data/test/data/dollar-0a.right +2 -0
  201. data/test/data/dollar-0b.right +2 -0
  202. data/test/data/edit.cmd +14 -0
  203. data/test/data/edit.right +24 -0
  204. data/test/data/file-with-space.cmd +6 -0
  205. data/test/data/file-with-space.right +4 -0
  206. data/test/data/printvar.cmd +17 -0
  207. data/test/data/printvar.right +31 -0
  208. data/test/data/raise.cmd +11 -0
  209. data/test/data/raise.right +19 -0
  210. data/test/data/source.cmd +5 -0
  211. data/test/data/source.right +18 -0
  212. data/test/data/stepping-1.9.right +50 -0
  213. data/test/data/stepping.cmd +21 -0
  214. data/test/data/stepping.right +48 -0
  215. data/test/data/trepan8-save.1 +6 -0
  216. data/test/example/bp_loop_issue.rb +3 -0
  217. data/test/example/break-bug.rb +7 -0
  218. data/test/example/brkpt-class-bug.rb +8 -0
  219. data/test/example/classes.rb +11 -0
  220. data/test/example/dollar-0.rb +5 -0
  221. data/test/example/except-bug1.rb +4 -0
  222. data/test/example/except-bug2.rb +7 -0
  223. data/test/example/file with space.rb +1 -0
  224. data/test/example/gcd.rb +18 -0
  225. data/test/example/info-var-bug.rb +47 -0
  226. data/test/example/info-var-bug2.rb +2 -0
  227. data/test/example/null.rb +1 -0
  228. data/test/example/pm-bug.rb +3 -0
  229. data/test/example/pm.rb +11 -0
  230. data/test/example/raise.rb +3 -0
  231. data/test/integration/.gitignore +4 -0
  232. data/test/integration/config.yaml +8 -0
  233. data/test/integration/helper.rb +154 -0
  234. data/test/integration/test-break_bad.rb +26 -0
  235. data/test/integration/test-dollar-0.rb +31 -0
  236. data/test/integration/test-edit.rb +17 -0
  237. data/test/integration/test-file-with-space.rb +26 -0
  238. data/test/integration/test-printvar.rb +17 -0
  239. data/test/integration/test-raise.rb +21 -0
  240. data/test/integration/test-source.rb +16 -0
  241. data/test/integration/test-stepping.rb +24 -0
  242. data/test/unit/.gitignore +1 -0
  243. data/test/unit/cmd-helper.rb +52 -0
  244. data/test/unit/mock-helper.rb +12 -0
  245. data/test/unit/test-app-cmd_parse.rb +97 -0
  246. data/test/unit/test-app-cmd_parser.rb +23 -0
  247. data/test/unit/test-app-complete.rb +39 -0
  248. data/test/unit/test-app-frame.rb +32 -0
  249. data/test/unit/test-app-options.rb +92 -0
  250. data/test/unit/test-app-run.rb +14 -0
  251. data/test/unit/test-app-util.rb +44 -0
  252. data/test/unit/test-base-cmd.rb +45 -0
  253. data/test/unit/test-base-subcmd.rb +57 -0
  254. data/test/unit/test-base-submgr.rb +23 -0
  255. data/test/unit/test-base-subsubcmd.rb +17 -0
  256. data/test/unit/test-cmd-alias.rb +48 -0
  257. data/test/unit/test-cmd-exit.rb +27 -0
  258. data/test/unit/test-cmd-help.rb +104 -0
  259. data/test/unit/test-cmd-kill.rb +46 -0
  260. data/test/unit/test-cmd-source.rb +34 -0
  261. data/test/unit/test-completion.rb +42 -0
  262. data/test/unit/test-intf-user.rb +46 -0
  263. data/test/unit/test-io-input.rb +27 -0
  264. data/test/unit/test-io-tcp.rb +33 -0
  265. data/test/unit/test-io-tcpclient.rb +54 -0
  266. data/test/unit/test-io-tcpfns.rb +17 -0
  267. data/test/unit/test-io-tcpserver.rb +50 -0
  268. data/test/unit/test-proc-eval.rb +36 -0
  269. data/test/unit/test-proc-hook.rb +30 -0
  270. data/test/unit/test-proc-load_cmds.rb +50 -0
  271. data/test/unit/test-proc-location.rb +79 -0
  272. data/test/unit/test-subcmd-help.rb +44 -0
  273. data/trepan8.gemspec +52 -0
  274. metadata +391 -0
@@ -0,0 +1,114 @@
1
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ require 'rubygems'; require 'require_relative'
3
+ require_relative './base/cmd'
4
+
5
+ class Trepan::Command::BreakCommand < Trepan::Command
6
+
7
+ ALIASES = %w(b)
8
+ CATEGORY = 'breakpoints'
9
+ NAME = File.basename(__FILE__, '.rb')
10
+ HELP = <<-HELP
11
+ #{NAME} LOCATION [ {if|unless} CONDITION ]
12
+
13
+ Set a breakpoint. In the second form where CONDITIOn is given, the
14
+ condition is evaluated in the context of the position. We stop only If
15
+ CONDITION evalutes to non-false/nil and the "if" form used, or it is
16
+ false and the "unless" form used.\
17
+
18
+ Examples:
19
+ #{NAME}
20
+ #{NAME} 10 # set breakpoint on line 10
21
+ #{NAME} 10 if 1 == a # like above but only if a is equal to 1
22
+ #{NAME} 10 unless 1 == a # like above but only if a is equal to 1
23
+ #{NAME} me.rb:10
24
+ #{NAME} Kernel.pp # Set a breakpoint at the beginning of Kernel.pp
25
+
26
+ See also condition, continue and "help location".
27
+ HELP
28
+ SHORT_HELP = 'Set a breakpoint at a point in a method'
29
+
30
+ # This method runs the command
31
+ def run(args, temp=false)
32
+
33
+ arg_str = args.size == 1 ? @proc.frame.line.to_s : @proc.cmd_argstr
34
+ cm, file, line, position_type, expr, negate =
35
+ @proc.breakpoint_position(arg_str, true)
36
+ if file.nil?
37
+ unless @proc.context
38
+ errmsg 'We are not in a state that has an associated file.'
39
+ return
40
+ end
41
+ file = @proc.frame.file
42
+ if line.nil?
43
+ # Set breakpoint at current line
44
+ line = @proc.frame.line
45
+ end
46
+ end
47
+
48
+ if line
49
+ if LineCache.cache(file, settings[:reload_source_on_change])
50
+ last_line = LineCache.size(file)
51
+ if line > last_line
52
+ errmsg("There are only %d lines in file \"%s\"." % [last_line,
53
+ @proc.canonic_file(file)])
54
+ return
55
+ end
56
+ unless LineCache.trace_line_numbers(file).member?(line)
57
+ errmsg('Line %d is not a stopping point in file "%s".' %
58
+ [line, @proc.canonic_file(file)])
59
+ return
60
+ end
61
+ else
62
+ errmsg('No source file named %s' % @proc.canonic_file(file))
63
+ return unless confirm('Set breakpoint anyway?', false)
64
+ end
65
+
66
+ unless @proc.context
67
+ errmsg 'We are not in a state we can add breakpoints.'
68
+ return
69
+ end
70
+
71
+ expr = "!(#{expr})" if negate
72
+ if temp
73
+ @proc.state.context.set_breakpoint(file, line, expr)
74
+ msg("Temporary breakpoint set at file %s, line %d" % [file, line])
75
+ else
76
+ b = Debugger.add_breakpoint file, line, expr
77
+ msg("Breakpoint %d file %s, line %d" %
78
+ [b.id, @proc.canonic_file(file), line])
79
+ end
80
+ # unless syntax_valid?(expr)
81
+ # errmsg("Expression \"#{expr}\" syntactically incorrect; breakpoint disabled.\n")
82
+ # b.enabled = false
83
+ # end
84
+ # else
85
+ # method = line.intern.id2name
86
+ # b = Debugger.add_breakpoint class_name, method, expr
87
+ # print "Breakpoint %d at %s::%s\n", b.id, class_name, method.to_s
88
+ end
89
+ end
90
+ end
91
+
92
+ if __FILE__ == $0
93
+ require_relative '../mock'
94
+ dbgr, cmd = MockDebugger::setup
95
+ # require_relative '../../lib/trepanning'
96
+ def run_cmd(cmd, args)
97
+ cmd.proc.instance_variable_set('@cmd_argstr', args[1..-1].join(' '))
98
+ cmd.run(args)
99
+ end
100
+
101
+ run_cmd(cmd, [cmd.name, 2])
102
+ # run_cmd(cmd, [cmd.name])
103
+ # run_cmd(cmd, [cmd.name, __LINE__.to_s])
104
+
105
+ # def foo
106
+ # 5
107
+ # end
108
+ # run_cmd(cmd, [cmd.name, 'foo', (__LINE__-2).to_s])
109
+ # run_cmd(cmd, [cmd.name, 'foo'])
110
+ # run_cmd(cmd, [cmd.name, "MockDebugger::setup"])
111
+ # require 'irb'
112
+ # run_cmd(cmd, [cmd.name, "IRB.start"])
113
+ # run_cmd(cmd, [cmd.name, 'foo93'])
114
+ end
@@ -0,0 +1,71 @@
1
+ # Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ require 'rubygems'; require 'require_relative'
3
+ require_relative 'base/cmd'
4
+ require_relative '../stepping'
5
+
6
+ class Trepan::Command::CatchCommand < Trepan::Command
7
+ unless defined?(HELP)
8
+ NAME = File.basename(__FILE__, '.rb')
9
+ HELP = <<-HELP
10
+ #{NAME} EXCEPTION-NAME
11
+ #{NAME} EXCEPTION-NAME off
12
+ #{NAME}
13
+ #{NAME} off
14
+
15
+ The first form intercepts EXCEPTION-NAME when.
16
+ The second form removes the debugger handling for EXCEPTION-NAME.
17
+ The third form is the the same as "info catch".
18
+ The last form deletes all debugger catchpoints.
19
+
20
+ Examples:
21
+ #{NAME} # same as "info catch"
22
+ #{NAME} ZeroDivisionError # Handle dividing by zero exceptions.
23
+ #{NAME} off # Turns off all debugger exception handling
24
+
25
+ See also "info catch" and post-mortem debugging.
26
+ HELP
27
+
28
+ ALIASES = %w()
29
+ CATEGORY = 'running'
30
+ MAX_ARGS = 2 # Need at most this many
31
+ NEED_RUNNING = true
32
+ SHORT_HELP = 'Catch exceptions'
33
+ end
34
+
35
+ # This is the method that runs the command
36
+ def run(args)
37
+ case args.size
38
+ when 1
39
+ @proc.commands['info'].run(%W(info catch))
40
+ when 2
41
+ exception = args[1]
42
+ if args[1] == 'off'
43
+ Debugger.catchpoints.clear if
44
+ confirm('Delete all catchpoints?', false)
45
+ else
46
+ unless @proc.debug_eval_no_errmsg("#{exception}.is_a?(Class)")
47
+ msg "Warning #{exception} is not known to be a Class"
48
+ end
49
+ Debugger.add_catchpoint(exception)
50
+ msg "Catch exception %s." % exception
51
+ end
52
+ when 3
53
+ exception = args[1]
54
+ if Debugger.catchpoints.member?(exception)
55
+ Debugger.catchpoints.delete(exception)
56
+ msg "Catch for exception %s removed." % exception
57
+ else
58
+ errmsg "Catch for exception %s not found." % exception
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ if __FILE__ == $0
65
+ require_relative '../mock'
66
+ dbgr, cmd = MockDebugger::setup
67
+ cmd.run([cmd.name])
68
+ cmd.run([cmd.name, 'ZeroDivisionError'])
69
+ cmd.run([cmd.name])
70
+ cmd.run([cmd.name, 'ZeroDivisionError', 'off'])
71
+ end
@@ -0,0 +1,39 @@
1
+ # Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ require 'rubygems'; require 'require_relative'
3
+ require_relative 'base/cmd'
4
+ require_relative '../load_cmds'
5
+ class Trepan::Command::CompleteCommand < Trepan::Command
6
+
7
+ unless defined?(HELP)
8
+ NAME = File.basename(__FILE__, '.rb')
9
+ HELP = <<-HELP
10
+ #{NAME} COMMAND-PREFIX
11
+
12
+ List the completions for the rest of the line as a command.
13
+ HELP
14
+ CATEGORY = 'support'
15
+ NEED_STACK = false
16
+ SHORT_HELP = 'List the completions for the rest of the line as a command'
17
+ end
18
+
19
+ # This method runs the command
20
+ def run(args) # :nodoc
21
+ last_arg = @proc.cmd_argstr.end_with?(' ') ? '' : args[-1]
22
+ @proc.complete(@proc.cmd_argstr, last_arg).each do |match|
23
+ msg match
24
+ end
25
+ end
26
+ end
27
+
28
+ if __FILE__ == $0
29
+ # Demo it.
30
+ require_relative '../mock'
31
+ dbgr, cmd = MockDebugger::setup
32
+ %w(k b bt).each do |prefix|
33
+ cmd.proc.instance_variable_set('@cmd_argstr', prefix)
34
+ cmd.run [cmd.name, prefix]
35
+ puts '=' * 40
36
+ end
37
+ cmd.run %w(#{cmd.name} fdafsasfda)
38
+ puts '=' * 40
39
+ end
@@ -0,0 +1,57 @@
1
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
2
+ require 'rubygems'; require 'require_relative'
3
+ require_relative 'base/cmd'
4
+ require_relative '../stepping'
5
+
6
+ class Trepan::Command::ContinueCommand < Trepan::Command
7
+ unless defined?(HELP)
8
+ NAME = File.basename(__FILE__, '.rb')
9
+ HELP = <<-HELP
10
+ #{NAME} [LOCATION]
11
+
12
+ Leave the debugger loop and continue execution. Subsequent entry to
13
+ the debugger however may occur via breakpoints or explicit calls, or
14
+ exceptions.
15
+
16
+ If a parameter is given, a temporary breakpoint is set at that position
17
+ before continuing.
18
+
19
+ Examples:
20
+ #{NAME}
21
+ #{NAME} 10 # continue to line 10
22
+
23
+ See also 'step', 'next', 'finish', 'nexti' commands and "help location".
24
+ HELP
25
+
26
+ ALIASES = %w(c cont)
27
+ CATEGORY = 'running'
28
+ MAX_ARGS = 1 # Need at most this many
29
+ NEED_RUNNING = true
30
+ SHORT_HELP = 'Continue execution of the debugged program'
31
+ end
32
+
33
+ # This is the method that runs the command
34
+ def run(args)
35
+
36
+ ## FIXME: DRY this code, tbreak and break.
37
+ unless args.size == 1
38
+ filename = @proc.frame.file
39
+ line_number = @proc.get_an_int(args[1])
40
+ return unless line_number
41
+ unless LineCache.trace_line_numbers(filename).member?(line_number)
42
+ errmsg("Line %d is not a stopping point in file \"%s\".\n" %
43
+ [line_number, filename])
44
+ return
45
+ end
46
+ @proc.state.context.set_breakpoint(filename, line_number)
47
+ end
48
+ @proc.continue
49
+ @proc.leave_cmd_loop = true
50
+ end
51
+ end
52
+
53
+ if __FILE__ == $0
54
+ require_relative '../mock'
55
+ dbgr, cmd = MockDebugger::setup
56
+ cmd.run([cmd.name])
57
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright (C) 2010 Rocky Bernstein <rockyb@rubyforge.net>
2
+ require 'rubygems'; require 'require_relative'
3
+ require_relative 'base/cmd'
4
+ class Trepan::Command::DirectoryCommand < Trepan::Command
5
+
6
+ unless defined?(HELP)
7
+ ALIASES = %w(dir)
8
+ CATEGORY = 'files'
9
+ MAX_ARGS = 1 # Need at most this many
10
+ NAME = File.basename(__FILE__, '.rb')
11
+ HELP = <<-HELP
12
+ #{NAME} [DIR]
13
+
14
+ Add directory DIR to beginning of search path for source files.
15
+ DIR can also be $cwd for the current working directory, or $cdir for the
16
+ directory in which the debugged file start.
17
+ With no argument, reset the search path to $cdir:$cwd, the default.
18
+
19
+ This command may be useful for debugging into Rubinius methods such as
20
+ kernel/common/module.rb if have the source code somewhere.
21
+
22
+ Examples:
23
+ #{NAME} # reset to $cdir:$cwd
24
+ HELP
25
+
26
+ SHORT_HELP =
27
+ 'Add directory DIR to beginning of search path for source files'
28
+ end
29
+
30
+ # This method runs the command
31
+ def run(args) # :nodoc
32
+ if args.size > 1
33
+ path = File.expand_path(args[1])
34
+ settings[:directory] = "#{path}:#{settings[:directory]}"
35
+ msg "Source directories searched: #{settings[:directory]}"
36
+ else
37
+ if confirm('Reintialize source path to empty?', false)
38
+ settings[:directory] = '$cdir:$cwd'
39
+ msg "Source directories searched: #{settings[:directory]}"
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ if __FILE__ == $0
46
+ require_relative '../mock'
47
+ dbgr, cmd = MockDebugger::setup
48
+ cmd.run([cmd.name])
49
+ cmd.run([cmd.name, '/tmp'])
50
+ end
@@ -0,0 +1,85 @@
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 '../breakpoint'
6
+ # require_relative '../../app/breakpoint'
7
+
8
+ # disable breakpoint command. The difference however is that the
9
+ # parameter to @proc.en_disable_breakpoint_by_number is different (set
10
+ # as ENABLE_PARM below).
11
+ #
12
+ # NOTE: The enable command subclasses this, so beware when changing!
13
+ class Trepan::Command::DisableCommand < Trepan::Command
14
+
15
+ # Silence already initialized constant .. warnings
16
+ old_verbose = $VERBOSE
17
+ $VERBOSE = nil
18
+ NAME = File.basename(__FILE__, '.rb')
19
+ HELP = <<-HELP
20
+ #{NAME} bpnumber [bpnumber ...]
21
+
22
+ Disables the breakpoints given as a space separated list of breakpoint
23
+ numbers. See also "info break" to get a list.
24
+ HELP
25
+
26
+ CATEGORY = 'breakpoints'
27
+ SHORT_HELP = 'Disable some breakpoints'
28
+
29
+ $VERBOSE = old_verbose
30
+
31
+ def initialize(proc)
32
+ super
33
+ @enable_parm = false # true if enable
34
+ end
35
+
36
+ def enable_disable_breakpoints(is_enable, args)
37
+ breakpoints = Debugger.breakpoints.sort_by{|b| b.id }
38
+ largest = breakpoints.inject(0) do |largest, b|
39
+ largest = b.id if b.id > largest
40
+ end
41
+ if 0 == largest
42
+ errmsg "No breakpoints have been set.\n"
43
+ return
44
+ end
45
+ args.each do |num_str|
46
+ pos = @proc.get_an_int(num_str)
47
+ return nil unless pos
48
+ breakpoints.each do |b|
49
+ if b.id == pos
50
+ enabled = ("Enable" == is_enable)
51
+ if enabled
52
+ unless syntax_valid?(b.expr)
53
+ errmsg("Expression \"#{b.expr}\" syntactically incorrect; breakpoint remains disabled.\n")
54
+ break
55
+ end
56
+ end
57
+ b.enabled = ("Enable" == is_enable)
58
+ break
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ def run(args)
65
+ if args.size == 1
66
+ errmsg('No breakpoint number given.')
67
+ return
68
+ end
69
+ enable_disable_breakpoints("Disable", args[1..-1])
70
+ end
71
+
72
+ end
73
+
74
+ if __FILE__ == $0
75
+ require_relative '../mock'
76
+ dbgr, cmd = MockDebugger::setup
77
+ cmd.run([cmd.name])
78
+ cmd.run([cmd.name, '1'])
79
+ cmds = cmd.proc.commands
80
+ puts "To be continued..."
81
+ #
82
+ # break_cmd = cmds['break']
83
+ # break_cmd.run(['break', cmdproc.frame.line])
84
+ # cmd.run([cmd.name, '1'])
85
+ end
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
+ require 'rubygems'; require 'require_relative'
4
+ require_relative 'base/cmd'
5
+
6
+ class Trepan::Command::DisplayCommand < Trepan::Command
7
+
8
+ unless defined?(HELP)
9
+ NAME = File.basename(__FILE__, '.rb')
10
+ HELP = <<-HELP
11
+ #{name} [format] EXP
12
+
13
+ Print value of expression EXP each time the program stops. FMT may be
14
+ used before EXP and may be one of 'c' for char, 'x' for hex, 'o' for
15
+ octal, 'f' for float or 's' for string.
16
+
17
+ For now, display expressions are only evaluated when in the same
18
+ instruction sequence as the frame that was in effect when the display
19
+ expression was set. This is a departure from gdb and we may allow for
20
+ more flexibility in the future to specify whether this should be the
21
+ case or not.
22
+
23
+ With no argument, evaluate and display all currently requested
24
+ auto-display expressions. Use "undisplay" to cancel display
25
+ requests previously made.
26
+ HELP
27
+
28
+ CATEGORY = 'data'
29
+ NEED_STACK = false
30
+ SHORT_HELP = 'Display expressions when entering debugger'
31
+ end
32
+
33
+ def run(args)
34
+
35
+ if args.size == 1
36
+ # Display anything active
37
+ @proc.run_eval_display
38
+ else
39
+ if %w(/c /x /o /f /s).member?(args[1])
40
+ if 2 == args.size
41
+ errmsg("Expecting an expression after the format")
42
+ return
43
+ end
44
+ format = args[1]
45
+ expr = args[2..-1].join(' ')
46
+ else
47
+ format = nil
48
+ expr = args[1..-1].join(' ')
49
+ end
50
+
51
+ dp = @proc.displays.add(@proc.frame, expr, format)
52
+ unless dp
53
+ errmsg('Error evaluating "%s" in the current frame' % expr)
54
+ return
55
+ end
56
+ msg(dp.to_s(@proc.frame))
57
+ @proc.cmdloop_prehooks.insert_if_new(5, *@proc.display_hook)
58
+ end
59
+ end
60
+ end
61
+
62
+ if __FILE__ == $0
63
+ # Demo it.
64
+ require_relative '../mock'
65
+ dbgr, cmd = MockDebugger::setup
66
+
67
+ def run_cmd(cmd, args)
68
+ cmd.run(args)
69
+ puts '==' * 10
70
+ end
71
+
72
+ # run_cmd(cmd, [cmd.name])
73
+ # run_cmd(cmd, [cmd.name, '/x', '10'])
74
+ # run_cmd(cmd, [cmd.name, 'd'])
75
+ # run_cmd(cmd, [cmd.name])
76
+ e = 5
77
+ run_cmd(cmd, [cmd.name, 'e'])
78
+ end