byebug 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. data/.gitignore +10 -0
  2. data/.travis.yml +8 -0
  3. data/AUTHORS +10 -0
  4. data/CHANGELOG.md +2 -0
  5. data/CONTRIBUTING.md +1 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE +20 -0
  8. data/README.md +5 -0
  9. data/Rakefile +28 -0
  10. data/bin/byebug +395 -0
  11. data/byebug.gemspec +29 -0
  12. data/doc/hanoi.rb +35 -0
  13. data/doc/primes.rb +28 -0
  14. data/doc/rdebug-emacs.texi +1030 -0
  15. data/doc/test-tri2.rb +18 -0
  16. data/doc/tri3.rb +8 -0
  17. data/doc/triangle.rb +12 -0
  18. data/ext/byebug/breakpoint.c +476 -0
  19. data/ext/byebug/byebug.c +512 -0
  20. data/ext/byebug/byebug.h +131 -0
  21. data/ext/byebug/context.c +424 -0
  22. data/ext/byebug/extconf.rb +21 -0
  23. data/ext/byebug/locker.c +53 -0
  24. data/lib/byebug.rb +404 -0
  25. data/lib/byebug/command.rb +232 -0
  26. data/lib/byebug/commands/breakpoints.rb +153 -0
  27. data/lib/byebug/commands/catchpoint.rb +56 -0
  28. data/lib/byebug/commands/condition.rb +49 -0
  29. data/lib/byebug/commands/continue.rb +38 -0
  30. data/lib/byebug/commands/control.rb +110 -0
  31. data/lib/byebug/commands/display.rb +122 -0
  32. data/lib/byebug/commands/edit.rb +48 -0
  33. data/lib/byebug/commands/enable.rb +202 -0
  34. data/lib/byebug/commands/eval.rb +176 -0
  35. data/lib/byebug/commands/finish.rb +43 -0
  36. data/lib/byebug/commands/frame.rb +303 -0
  37. data/lib/byebug/commands/help.rb +56 -0
  38. data/lib/byebug/commands/info.rb +462 -0
  39. data/lib/byebug/commands/irb.rb +123 -0
  40. data/lib/byebug/commands/jump.rb +66 -0
  41. data/lib/byebug/commands/kill.rb +51 -0
  42. data/lib/byebug/commands/list.rb +94 -0
  43. data/lib/byebug/commands/method.rb +84 -0
  44. data/lib/byebug/commands/quit.rb +39 -0
  45. data/lib/byebug/commands/reload.rb +40 -0
  46. data/lib/byebug/commands/save.rb +90 -0
  47. data/lib/byebug/commands/set.rb +210 -0
  48. data/lib/byebug/commands/show.rb +246 -0
  49. data/lib/byebug/commands/skip.rb +35 -0
  50. data/lib/byebug/commands/source.rb +36 -0
  51. data/lib/byebug/commands/stepping.rb +83 -0
  52. data/lib/byebug/commands/threads.rb +189 -0
  53. data/lib/byebug/commands/tmate.rb +36 -0
  54. data/lib/byebug/commands/trace.rb +56 -0
  55. data/lib/byebug/commands/variables.rb +199 -0
  56. data/lib/byebug/context.rb +58 -0
  57. data/lib/byebug/helper.rb +69 -0
  58. data/lib/byebug/interface.rb +223 -0
  59. data/lib/byebug/processor.rb +468 -0
  60. data/lib/byebug/version.rb +3 -0
  61. data/man/rdebug.1 +241 -0
  62. data/test/breakpoints_test.rb +357 -0
  63. data/test/conditions_test.rb +77 -0
  64. data/test/continue_test.rb +44 -0
  65. data/test/display_test.rb +141 -0
  66. data/test/edit_test.rb +56 -0
  67. data/test/eval_test.rb +92 -0
  68. data/test/examples/breakpoint1.rb +15 -0
  69. data/test/examples/breakpoint2.rb +7 -0
  70. data/test/examples/conditions.rb +4 -0
  71. data/test/examples/continue.rb +4 -0
  72. data/test/examples/display.rb +5 -0
  73. data/test/examples/edit.rb +3 -0
  74. data/test/examples/edit2.rb +3 -0
  75. data/test/examples/eval.rb +4 -0
  76. data/test/examples/finish.rb +20 -0
  77. data/test/examples/frame.rb +20 -0
  78. data/test/examples/frame_threads.rb +31 -0
  79. data/test/examples/help.rb +2 -0
  80. data/test/examples/info.rb +38 -0
  81. data/test/examples/info2.rb +3 -0
  82. data/test/examples/info_threads.rb +48 -0
  83. data/test/examples/irb.rb +6 -0
  84. data/test/examples/jump.rb +14 -0
  85. data/test/examples/kill.rb +2 -0
  86. data/test/examples/list.rb +12 -0
  87. data/test/examples/method.rb +15 -0
  88. data/test/examples/post_mortem.rb +19 -0
  89. data/test/examples/quit.rb +2 -0
  90. data/test/examples/reload.rb +6 -0
  91. data/test/examples/restart.rb +6 -0
  92. data/test/examples/save.rb +3 -0
  93. data/test/examples/set.rb +3 -0
  94. data/test/examples/set_annotate.rb +12 -0
  95. data/test/examples/settings.rb +1 -0
  96. data/test/examples/show.rb +2 -0
  97. data/test/examples/source.rb +3 -0
  98. data/test/examples/stepping.rb +21 -0
  99. data/test/examples/thread.rb +32 -0
  100. data/test/examples/tmate.rb +10 -0
  101. data/test/examples/trace.rb +7 -0
  102. data/test/examples/trace_threads.rb +20 -0
  103. data/test/examples/variables.rb +26 -0
  104. data/test/finish_test.rb +48 -0
  105. data/test/frame_test.rb +143 -0
  106. data/test/help_test.rb +50 -0
  107. data/test/info_test.rb +313 -0
  108. data/test/irb_test.rb +81 -0
  109. data/test/jump_test.rb +70 -0
  110. data/test/kill_test.rb +48 -0
  111. data/test/list_test.rb +145 -0
  112. data/test/method_test.rb +70 -0
  113. data/test/post_mortem_test.rb +27 -0
  114. data/test/quit_test.rb +56 -0
  115. data/test/reload_test.rb +44 -0
  116. data/test/restart_test.rb +164 -0
  117. data/test/save_test.rb +92 -0
  118. data/test/set_test.rb +177 -0
  119. data/test/show_test.rb +293 -0
  120. data/test/source_test.rb +45 -0
  121. data/test/stepping_test.rb +130 -0
  122. data/test/support/breakpoint.rb +13 -0
  123. data/test/support/context.rb +14 -0
  124. data/test/support/matchers.rb +67 -0
  125. data/test/support/mocha_extensions.rb +72 -0
  126. data/test/support/processor.rb +7 -0
  127. data/test/support/test_dsl.rb +206 -0
  128. data/test/support/test_interface.rb +68 -0
  129. data/test/test_helper.rb +10 -0
  130. data/test/tmate_test.rb +44 -0
  131. data/test/trace_test.rb +159 -0
  132. data/test/variables_test.rb +119 -0
  133. metadata +265 -0
@@ -0,0 +1,10 @@
1
+ tmp
2
+ vendor/bundle
3
+
4
+ .rvmrc
5
+ .gdbinit
6
+ .gdb_history
7
+ .bundle
8
+ .tags
9
+
10
+ Gemfile.lock
@@ -0,0 +1,8 @@
1
+ before_script: rake compile
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - 2.0.0
6
+ matrix:
7
+ allow_failures:
8
+ - rvm: 2.0.0
data/AUTHORS ADDED
@@ -0,0 +1,10 @@
1
+ Author:
2
+ Kent Sibilev
3
+
4
+ Contributors:
5
+ Markus Barchfeld
6
+ R. Bernstein
7
+ Anders Lindgren
8
+
9
+ Contributor and maintainer:
10
+ Mark Moseley
@@ -0,0 +1,2 @@
1
+ ## 0.0.1
2
+ * Initial release
@@ -0,0 +1 @@
1
+ Thanks for trying out this project! [See here for contribution guidelines.](http://tagaholic.me/contributing.html)
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 David Rodríguez
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,5 @@
1
+ ## Description
2
+
3
+ Experimenting with github and ruby and mixing
4
+ [debugger](https://github.com/cldwalker/debugger) and
5
+ [debase](https://github.com/denofevil/debase) into a 2.0 compatible debugger.
@@ -0,0 +1,28 @@
1
+ # -*- Ruby -*-
2
+ require 'rake/testtask'
3
+ require 'rake/extensiontask'
4
+ require 'rubygems/package_task'
5
+
6
+ Rake::ExtensionTask.new('byebug')
7
+
8
+ SO_NAME = "byebug.so"
9
+
10
+ desc "Run MiniTest suite"
11
+ task :test do
12
+ Rake::TestTask.new(:test) do |t|
13
+ t.test_files = FileList["test/*_test.rb"]
14
+ t.verbose = true
15
+ end
16
+ end
17
+
18
+ desc "Test everything - same as test."
19
+ task :check => :test
20
+
21
+ base_spec = eval(File.read('byebug.gemspec'), binding, 'byebug.gemspec')
22
+
23
+ # Rake task to build the default package
24
+ Gem::PackageTask.new(base_spec) do |pkg|
25
+ pkg.need_tar = true
26
+ end
27
+
28
+ task :default => :test
@@ -0,0 +1,395 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #=== Summary
4
+ #
5
+ #A command-line front-end to <tt>byebug</tt>
6
+ #
7
+ #Command invocation:
8
+ #
9
+ # byebug [options] [--] [script-options] ruby-script-to-debug
10
+ # byebug [options] [script-options] [--client]
11
+ # byebug [--version | --help]
12
+ #
13
+ #=== Options
14
+ #
15
+ #<tt>-A | --annotate</tt> <i>level</i>::
16
+ # Set gdb-style annotation to <i>level</i>, a number. Additional
17
+ # information is output automatically when program state is
18
+ # changed. This can be used by front-ends such as GNU Emacs to post
19
+ # this updated information without having to poll for it.
20
+ #
21
+ #<tt>--client</tt>::
22
+ # Connect to a remote byebug. Used with another rdebug invocation
23
+ # using <tt>--server</tt>. See also <tt>--host</tt> and
24
+ # <tt>--cport</tt> options
25
+ #
26
+ #<tt>--cport=</tt><i>port</i>::
27
+ # Use port <i>port</i> for access to byebug control.
28
+ #
29
+ #<tt>-d | --debug</tt>::
30
+ # Set $DEBUG true.
31
+ #
32
+ #<tt>--emacs</tt>::
33
+ # Activates full GNU Emacs mode. Is the equivalent of setting the
34
+ # options <tt>--emacs-basic --annotate=3 --no-stop --no-control
35
+ # --post-mortem</tt>.
36
+ #
37
+ #<tt>--emacs-basic</tt>::
38
+ # Activates GNU Emacs mode. Byebug prompts are prefaced with two
39
+ # octal 032 characters.
40
+ #
41
+ #<tt>-h | --host=</tt><i>host</i>::
42
+ # Use host name <i>host</i> for remote debugging.
43
+ #
44
+ #<tt>-I | --include</tt> <i>path</i>
45
+ # Add <i>path</i> to <tt>$LOAD_PATH</tt>
46
+ #
47
+ #<tt>-m | --post-mortem</tt>::
48
+ # Activate post-mortem mode.
49
+ #
50
+ #<tt>--no-control</tt>::
51
+ # Do not automatically start control thread.
52
+ #
53
+ #<tt>--no-stop</tt>::
54
+ # Do not stop when script is loaded.
55
+ #
56
+ #<tt>-p | --port=PORT</tt>::
57
+ # Host name used for remote debugging.
58
+ #
59
+ #<tt>-r | --require</tt><i>script</i>::
60
+ # Require the library, before executing your script.
61
+ #
62
+ #<tt>--script</tt> <i>file</i>::
63
+ # Run byebug script file <i>file</i>
64
+ #
65
+ #<tt>-x | --trace</tt>::
66
+ # Show lines before executing them.
67
+ #
68
+ #<tt>--no-quit</tt>::
69
+ # Do not quit when script terminates. Instead rerun the
70
+ # program.
71
+ #
72
+ #<tt>--version</tt>::
73
+ # Show the version number and exit.
74
+ #
75
+ #<tt>--verbose</tt>::
76
+ # Turn on verbose mode.
77
+ #
78
+ #<tt>--v</tt>::
79
+ # Print the version number, then turn on verbose mode if
80
+ # a script name is given. If no script name is given
81
+ # just exit after printing the version number.
82
+ #
83
+ #<tt>--nx</tt>::
84
+ # Don’t execute commands found in any initialization
85
+ # files, e.g. <tt>.rdebugrc</tt>.
86
+ #
87
+ #<tt>--keep-frame-binding</tt>::
88
+ # Keep frame bindings.
89
+ #
90
+ #<tt>--script=</tt><i>file</i>::
91
+ # Name of the script file to run
92
+ #
93
+ #<tt>-s | --server</tt>::
94
+ # Listen for remote connections. Another rdebug session
95
+ # accesses using the <tt>--client</tt> option. See also the
96
+ # <tt>--host</tt>, <tt>--port</tt> and <tt>--cport</tt> options
97
+ #
98
+ #<tt>-w | --wait</tt>::
99
+ # Wait for a client connection; implies <tt>-s</tt> option.
100
+ #
101
+ #<tt>--help</tt>::
102
+ # Show invocation help and exit.
103
+
104
+ require 'optparse'
105
+ require 'ostruct'
106
+ require File.dirname(__FILE__) + "/../lib/byebug"
107
+
108
+ def debug_program(options)
109
+ # Make sure Ruby script syntax checks okay.
110
+ # Otherwise we get a load message that looks like rdebug has a problem.
111
+ output = `ruby -c "#{Byebug::PROG_SCRIPT}" 2>&1`
112
+ if $?.exitstatus != 0 and RUBY_PLATFORM !~ /mswin/
113
+ puts output
114
+ exit $?.exitstatus
115
+ end
116
+ print "\032\032starting\n" if Byebug.annotate and Byebug.annotate > 2
117
+
118
+ # Record where we are we can know if the call stack has been truncated or not.
119
+ Byebug.start_sentinal=caller(0)[1]
120
+
121
+ bt = Byebug.debug_load(Byebug::PROG_SCRIPT, options.stop)
122
+ if bt
123
+ print bt.backtrace.map{|l| "\t#{l}"}.join("\n"), "\n"
124
+ print "Uncaught exception: #{bt}\n"
125
+ end
126
+ end
127
+
128
+ # Do a shell-like path lookup for prog_script and return the results.
129
+ # If we can't find anything return prog_script.
130
+ def whence_file(prog_script)
131
+ if prog_script.index(File::SEPARATOR)
132
+ # Don't search since this name has path separator components
133
+ return prog_script
134
+ end
135
+ for dirname in ENV['PATH'].split(File::PATH_SEPARATOR) do
136
+ prog_script_try = File.join(dirname, prog_script)
137
+ return prog_script_try if File.exist?(prog_script_try)
138
+ end
139
+ # Failure
140
+ return prog_script
141
+ end
142
+
143
+ options = OpenStruct.new(
144
+ 'annotate' => Byebug.annotate,
145
+ 'client' => false,
146
+ 'control' => true,
147
+ 'cport' => Byebug::PORT + 1,
148
+ 'host' => nil,
149
+ 'quit' => true,
150
+ 'no_rewrite_program' => false,
151
+ 'stop' => true,
152
+ 'nx' => false,
153
+ 'port' => Byebug::PORT,
154
+ 'restart_script' => nil,
155
+ 'script' => nil,
156
+ 'server' => false,
157
+ 'tracing' => false,
158
+ 'verbose_long' => false,
159
+ 'wait' => false
160
+ )
161
+
162
+ def process_options(options)
163
+ program = File.basename($0)
164
+ opts = OptionParser.new do |opts|
165
+ opts.banner = <<EOB
166
+ #{program} #{Byebug::VERSION}
167
+ Usage: #{program} [options] <script.rb> -- <script.rb parameters>
168
+ EOB
169
+ opts.separator ""
170
+ opts.separator "Options:"
171
+ opts.on("-A", "--annotate LEVEL", Integer, "Set annotation level") do
172
+ |annotate|
173
+ Byebug.annotate = annotate
174
+ end
175
+ opts.on("-c", "--client", "Connect to remote byebug") do
176
+ options.client = true
177
+ end
178
+ opts.on("--cport PORT", Integer, "Port used for control commands") do
179
+ |cport|
180
+ options.cport = cport
181
+ end
182
+ opts.on("-d", "--debug", "Set $DEBUG=true") {$DEBUG = true}
183
+ opts.on("--emacs LEVEL", Integer,
184
+ "Activates full Emacs support at annotation level LEVEL") do
185
+ |level|
186
+ Byebug.annotate = level.to_i
187
+ ENV['EMACS'] = '1'
188
+ ENV['COLUMNS'] = '120' if ENV['COLUMNS'].to_i < 120
189
+ options.control = false
190
+ options.quit = false
191
+ end
192
+ opts.on('--emacs-basic', 'Activates basic Emacs mode') do
193
+ ENV['EMACS'] = '1'
194
+ end
195
+ opts.on('-h', '--host HOST', 'Host name used for remote debugging') do
196
+ |host|
197
+ options.host = host
198
+ end
199
+ opts.on('-I', '--include PATH', String, 'Add PATH to $LOAD_PATH') do |path|
200
+ $LOAD_PATH.unshift(path)
201
+ end
202
+ opts.on('--no-control', 'Do not automatically start control thread') do
203
+ options.control = false
204
+ end
205
+ opts.on('--no-quit', 'Do not quit when script finishes') do
206
+ options.quit = false
207
+ end
208
+ opts.on('--no-rewrite-program',
209
+ 'Do not set $0 to the program being debugged') do
210
+ options.no_rewrite_program = true
211
+ end
212
+ opts.on('--no-stop', 'Do not stop when script is loaded') do
213
+ options.stop = false
214
+ end
215
+ opts.on('-nx', 'Not run byebug initialization files (e.g. .rdebugrc') do
216
+ options.nx = true
217
+ end
218
+ opts.on('-p', '--port PORT', Integer, 'Port used for remote debugging') do
219
+ |port|
220
+ options.port = port
221
+ end
222
+ opts.on('-r', '--require SCRIPT', String,
223
+ 'Require the library, before executing your script') do |name|
224
+ if name == 'debug'
225
+ puts "byebug is not compatible with Ruby's 'debug' library. This option is ignored."
226
+ else
227
+ require name
228
+ end
229
+ end
230
+ opts.on('--restart-script FILE', String,
231
+ 'Name of the script file to run. Erased after read') do
232
+ |restart_script|
233
+ options.restart_script = restart_script
234
+ unless File.exists?(options.restart_script)
235
+ puts "Script file '#{options.restart_script}' is not found"
236
+ exit
237
+ end
238
+ end
239
+ opts.on('--script FILE', String, 'Name of the script file to run') do
240
+ |script|
241
+ options.script = script
242
+ unless File.exists?(options.script)
243
+ puts "Script file '#{options.script}' is not found"
244
+ exit
245
+ end
246
+ end
247
+ opts.on('-s', '--server', 'Listen for remote connections') do
248
+ options.server = true
249
+ end
250
+ opts.on('-w', '--wait', 'Wait for a client connection, implies -s option') do
251
+ options.wait = true
252
+ end
253
+ opts.on('-x', '--trace', 'Turn on line tracing') {options.tracing = true}
254
+ opts.separator ''
255
+ opts.separator 'Common options:'
256
+ opts.on_tail('--help', 'Show this message') do
257
+ puts opts
258
+ exit
259
+ end
260
+ opts.on_tail('--version',
261
+ 'Print the version') do
262
+ puts "byebug #{Byebug::VERSION}"
263
+ exit
264
+ end
265
+ opts.on('--verbose', 'Turn on verbose mode') do
266
+ $VERBOSE = true
267
+ options.verbose_long = true
268
+ end
269
+ opts.on_tail('-v',
270
+ 'Print version number, then turn on verbose mode') do
271
+ puts "byebug #{Byebug::VERSION}"
272
+ $VERBOSE = true
273
+ end
274
+ end
275
+ return opts
276
+ end
277
+
278
+ # What file is used for byebug startup commands.
279
+ unless defined?(OPTS_INITFILE)
280
+ if RUBY_PLATFORM =~ /mswin/
281
+ # Of course MS Windows has to be different
282
+ OPTS_INITFILE = 'rdbopt.ini'
283
+ HOME_DIR = (ENV['HOME'] ||
284
+ ENV['HOMEDRIVE'].to_s + ENV['HOMEPATH'].to_s).to_s
285
+ else
286
+ OPTS_INITFILE = '.rdboptrc'
287
+ HOME_DIR = ENV['HOME'].to_s
288
+ end
289
+ end
290
+ begin
291
+ initfile = File.join(HOME_DIR, OPTS_INITFILE)
292
+ eval(File.read(initfile)) if
293
+ File.exist?(initfile)
294
+ rescue
295
+ end
296
+
297
+ opts = process_options(options)
298
+ begin
299
+ if not defined? Byebug::ARGV
300
+ Byebug::ARGV = ARGV.clone
301
+ end
302
+ rdebug_path = File.expand_path($0)
303
+ if RUBY_PLATFORM =~ /mswin/
304
+ rdebug_path += '.cmd' unless rdebug_path =~ /\.cmd$/i
305
+ end
306
+ Byebug::RDEBUG_SCRIPT = rdebug_path
307
+ Byebug::RDEBUG_FILE = __FILE__
308
+ Byebug::INITIAL_DIR = Dir.pwd
309
+ opts.parse! ARGV
310
+ rescue StandardError => e
311
+ puts opts
312
+ puts
313
+ puts e.message
314
+ exit(-1)
315
+ end
316
+
317
+ if options.client
318
+ Byebug.start_client(options.host, options.port)
319
+ else
320
+ if ARGV.empty?
321
+ exit if $VERBOSE and not options.verbose_long
322
+ puts opts
323
+ puts
324
+ puts 'Must specify a script to run'
325
+ exit(-1)
326
+ end
327
+
328
+ # save script name
329
+ prog_script = ARGV.shift
330
+ prog_script = whence_file(prog_script) unless File.exist?(prog_script)
331
+ Byebug::PROG_SCRIPT = File.expand_path prog_script
332
+
333
+ # install interruption handler
334
+ trap('INT') { Byebug.interrupt_last }
335
+
336
+ # set options
337
+ Byebug.wait_connection = options.wait
338
+
339
+ if options.server
340
+ # start remote mode
341
+ Byebug.start_remote(options.host, [options.port, options.cport]) do
342
+ # load initrc script
343
+ Byebug.run_init_script(StringIO.new) unless options.nx
344
+ end
345
+ debug_program(options)
346
+ else
347
+ # Set up trace hook for byebug
348
+ Byebug.start
349
+
350
+ # start control thread
351
+ Byebug.start_control(options.host, options.cport) if options.control
352
+
353
+ # load initrc script (e.g. .rdebugrc)
354
+ Byebug.run_init_script(StringIO.new) unless options.nx
355
+
356
+ # run restore-settings startup script if specified
357
+ if options.restart_script
358
+ require 'fileutils'
359
+ Byebug.run_script(options.restart_script)
360
+ FileUtils.rm(options.restart_script)
361
+ end
362
+
363
+ # run startup script if specified
364
+ if options.script
365
+ Byebug.run_script(options.script)
366
+ end
367
+
368
+ options.stop = false if options.tracing
369
+ Byebug.current_context.tracing = options.tracing
370
+
371
+ if !options.quit
372
+ if Byebug.started?
373
+ until Byebug.stop do end
374
+ end
375
+ begin
376
+ debug_program(options)
377
+ rescue SyntaxError
378
+ puts $!.backtrace.map{|l| "\t#{l}"}.join("\n")
379
+ puts "Uncaught Syntax Error\n"
380
+ rescue
381
+ print $!.backtrace.map{|l| "\t#{l}"}.join("\n"), "\n"
382
+ print "Uncaught exception: #{$!}\n"
383
+ end
384
+ print "The program finished.\n" unless
385
+ Byebug.annotate.to_i > 1 # annotate has its own way
386
+ interface = Byebug::LocalInterface.new
387
+ # Not sure if ControlCommandProcessor is really the right
388
+ # thing to use. CommandProcessor requires a state.
389
+ processor = Byebug::ControlCommandProcessor.new(interface)
390
+ processor.process_commands
391
+ else
392
+ debug_program(options)
393
+ end
394
+ end
395
+ end