debugger 1.0.0.rc1

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 (261) hide show
  1. data/AUTHORS +10 -0
  2. data/CHANGES +334 -0
  3. data/ChangeLog +5655 -0
  4. data/INSTALL.SVN +154 -0
  5. data/LICENSE +23 -0
  6. data/Makefile.am +14 -0
  7. data/OLD_README +122 -0
  8. data/README.md +10 -0
  9. data/Rakefile +266 -0
  10. data/autogen.sh +4 -0
  11. data/bin/rdebug +398 -0
  12. data/cli/ruby-debug.rb +173 -0
  13. data/cli/ruby-debug/command.rb +228 -0
  14. data/cli/ruby-debug/commands/breakpoints.rb +153 -0
  15. data/cli/ruby-debug/commands/catchpoint.rb +55 -0
  16. data/cli/ruby-debug/commands/condition.rb +49 -0
  17. data/cli/ruby-debug/commands/continue.rb +38 -0
  18. data/cli/ruby-debug/commands/control.rb +107 -0
  19. data/cli/ruby-debug/commands/display.rb +120 -0
  20. data/cli/ruby-debug/commands/edit.rb +48 -0
  21. data/cli/ruby-debug/commands/enable.rb +202 -0
  22. data/cli/ruby-debug/commands/eval.rb +176 -0
  23. data/cli/ruby-debug/commands/finish.rb +42 -0
  24. data/cli/ruby-debug/commands/frame.rb +301 -0
  25. data/cli/ruby-debug/commands/help.rb +56 -0
  26. data/cli/ruby-debug/commands/info.rb +467 -0
  27. data/cli/ruby-debug/commands/irb.rb +123 -0
  28. data/cli/ruby-debug/commands/jump.rb +66 -0
  29. data/cli/ruby-debug/commands/kill.rb +51 -0
  30. data/cli/ruby-debug/commands/list.rb +94 -0
  31. data/cli/ruby-debug/commands/method.rb +84 -0
  32. data/cli/ruby-debug/commands/quit.rb +39 -0
  33. data/cli/ruby-debug/commands/reload.rb +40 -0
  34. data/cli/ruby-debug/commands/save.rb +90 -0
  35. data/cli/ruby-debug/commands/set.rb +221 -0
  36. data/cli/ruby-debug/commands/show.rb +247 -0
  37. data/cli/ruby-debug/commands/skip.rb +35 -0
  38. data/cli/ruby-debug/commands/source.rb +36 -0
  39. data/cli/ruby-debug/commands/stepping.rb +81 -0
  40. data/cli/ruby-debug/commands/threads.rb +189 -0
  41. data/cli/ruby-debug/commands/tmate.rb +36 -0
  42. data/cli/ruby-debug/commands/trace.rb +57 -0
  43. data/cli/ruby-debug/commands/variables.rb +199 -0
  44. data/cli/ruby-debug/debugger.rb +5 -0
  45. data/cli/ruby-debug/helper.rb +69 -0
  46. data/cli/ruby-debug/interface.rb +232 -0
  47. data/cli/ruby-debug/processor.rb +474 -0
  48. data/configure.ac +12 -0
  49. data/debugger.gemspec +24 -0
  50. data/doc/.cvsignore +42 -0
  51. data/doc/Makefile.am +63 -0
  52. data/doc/emacs-notes.txt +38 -0
  53. data/doc/hanoi.rb +35 -0
  54. data/doc/primes.rb +28 -0
  55. data/doc/rdebug-emacs.texi +1030 -0
  56. data/doc/rdebug.1 +241 -0
  57. data/doc/ruby-debug.texi +3791 -0
  58. data/doc/test-tri2.rb +18 -0
  59. data/doc/tri3.rb +8 -0
  60. data/doc/triangle.rb +12 -0
  61. data/emacs/Makefile.am +130 -0
  62. data/emacs/rdebug-annotate.el +385 -0
  63. data/emacs/rdebug-breaks.el +407 -0
  64. data/emacs/rdebug-cmd.el +92 -0
  65. data/emacs/rdebug-core.el +502 -0
  66. data/emacs/rdebug-dbg.el +62 -0
  67. data/emacs/rdebug-error.el +79 -0
  68. data/emacs/rdebug-fns.el +111 -0
  69. data/emacs/rdebug-frames.el +230 -0
  70. data/emacs/rdebug-gud.el +242 -0
  71. data/emacs/rdebug-help.el +104 -0
  72. data/emacs/rdebug-info.el +83 -0
  73. data/emacs/rdebug-layouts.el +180 -0
  74. data/emacs/rdebug-locring.el +118 -0
  75. data/emacs/rdebug-output.el +106 -0
  76. data/emacs/rdebug-regexp.el +118 -0
  77. data/emacs/rdebug-secondary.el +260 -0
  78. data/emacs/rdebug-shortkey.el +175 -0
  79. data/emacs/rdebug-source.el +568 -0
  80. data/emacs/rdebug-track.el +392 -0
  81. data/emacs/rdebug-varbuf.el +150 -0
  82. data/emacs/rdebug-vars.el +125 -0
  83. data/emacs/rdebug-watch.el +132 -0
  84. data/emacs/rdebug.el +326 -0
  85. data/emacs/test/elk-test.el +242 -0
  86. data/emacs/test/test-annotate.el +103 -0
  87. data/emacs/test/test-cmd.el +116 -0
  88. data/emacs/test/test-core.el +104 -0
  89. data/emacs/test/test-fns.el +65 -0
  90. data/emacs/test/test-frames.el +62 -0
  91. data/emacs/test/test-gud.el +35 -0
  92. data/emacs/test/test-indent.el +58 -0
  93. data/emacs/test/test-regexp.el +144 -0
  94. data/emacs/test/test-shortkey.el +61 -0
  95. data/ext/ruby_debug/breakpoint.c +586 -0
  96. data/ext/ruby_debug/extconf.rb +49 -0
  97. data/ext/ruby_debug/ruby_debug.c +2624 -0
  98. data/ext/ruby_debug/ruby_debug.h +148 -0
  99. data/lib/ChangeLog +1065 -0
  100. data/lib/debugger.rb +7 -0
  101. data/lib/debugger/version.rb +3 -0
  102. data/lib/ruby-debug-base.rb +304 -0
  103. data/rdbg.rb +33 -0
  104. data/runner.sh +7 -0
  105. data/svn2cl_usermap +3 -0
  106. data/test/.cvsignore +1 -0
  107. data/test/base/base.rb +74 -0
  108. data/test/base/binding.rb +31 -0
  109. data/test/base/catchpoint.rb +26 -0
  110. data/test/base/load.rb +40 -0
  111. data/test/bp_loop_issue.rb +3 -0
  112. data/test/classes.rb +11 -0
  113. data/test/cli/commands/catchpoint_test.rb +36 -0
  114. data/test/cli/commands/unit/regexp.rb +42 -0
  115. data/test/config.yaml +8 -0
  116. data/test/data/annotate.cmd +29 -0
  117. data/test/data/annotate.right +139 -0
  118. data/test/data/break_bad.cmd +18 -0
  119. data/test/data/break_bad.right +28 -0
  120. data/test/data/break_loop_bug.cmd +5 -0
  121. data/test/data/break_loop_bug.right +15 -0
  122. data/test/data/breakpoints.cmd +38 -0
  123. data/test/data/breakpoints.right +98 -0
  124. data/test/data/catch.cmd +20 -0
  125. data/test/data/catch.right +49 -0
  126. data/test/data/catch2.cmd +19 -0
  127. data/test/data/catch2.right +65 -0
  128. data/test/data/catch3.cmd +11 -0
  129. data/test/data/catch3.right +37 -0
  130. data/test/data/condition.cmd +28 -0
  131. data/test/data/condition.right +65 -0
  132. data/test/data/ctrl.cmd +23 -0
  133. data/test/data/ctrl.right +70 -0
  134. data/test/data/display.cmd +24 -0
  135. data/test/data/display.right +44 -0
  136. data/test/data/dollar-0.right +2 -0
  137. data/test/data/dollar-0a.right +2 -0
  138. data/test/data/dollar-0b.right +2 -0
  139. data/test/data/edit.cmd +12 -0
  140. data/test/data/edit.right +19 -0
  141. data/test/data/emacs_basic.cmd +43 -0
  142. data/test/data/emacs_basic.right +106 -0
  143. data/test/data/enable.cmd +20 -0
  144. data/test/data/enable.right +36 -0
  145. data/test/data/finish.cmd +16 -0
  146. data/test/data/finish.right +31 -0
  147. data/test/data/frame.cmd +26 -0
  148. data/test/data/frame.right +55 -0
  149. data/test/data/help.cmd +20 -0
  150. data/test/data/help.right +21 -0
  151. data/test/data/history.right +7 -0
  152. data/test/data/info-thread.cmd +13 -0
  153. data/test/data/info-thread.right +37 -0
  154. data/test/data/info-var-bug2.cmd +5 -0
  155. data/test/data/info-var-bug2.right +10 -0
  156. data/test/data/info-var.cmd +23 -0
  157. data/test/data/info-var.right +52 -0
  158. data/test/data/info.cmd +21 -0
  159. data/test/data/info.right +65 -0
  160. data/test/data/jump.cmd +16 -0
  161. data/test/data/jump.right +56 -0
  162. data/test/data/jump2.cmd +16 -0
  163. data/test/data/jump2.right +44 -0
  164. data/test/data/linetrace.cmd +6 -0
  165. data/test/data/linetrace.right +23 -0
  166. data/test/data/list.cmd +19 -0
  167. data/test/data/list.right +127 -0
  168. data/test/data/method.cmd +10 -0
  169. data/test/data/method.right +21 -0
  170. data/test/data/methodsig.cmd +10 -0
  171. data/test/data/methodsig.right +20 -0
  172. data/test/data/next.cmd +22 -0
  173. data/test/data/next.right +61 -0
  174. data/test/data/noquit.right +1 -0
  175. data/test/data/output.cmd +6 -0
  176. data/test/data/output.right +31 -0
  177. data/test/data/pm-bug.cmd +7 -0
  178. data/test/data/pm-bug.right +12 -0
  179. data/test/data/post-mortem-next.cmd +8 -0
  180. data/test/data/post-mortem-next.right +14 -0
  181. data/test/data/post-mortem-osx.right +31 -0
  182. data/test/data/post-mortem.cmd +13 -0
  183. data/test/data/post-mortem.right +32 -0
  184. data/test/data/quit.cmd +6 -0
  185. data/test/data/quit.right +0 -0
  186. data/test/data/raise.cmd +11 -0
  187. data/test/data/raise.right +23 -0
  188. data/test/data/save.cmd +34 -0
  189. data/test/data/save.right +59 -0
  190. data/test/data/scope-var.cmd +42 -0
  191. data/test/data/scope-var.right +587 -0
  192. data/test/data/setshow.cmd +56 -0
  193. data/test/data/setshow.right +98 -0
  194. data/test/data/source.cmd +5 -0
  195. data/test/data/source.right +15 -0
  196. data/test/data/stepping.cmd +21 -0
  197. data/test/data/stepping.right +50 -0
  198. data/test/data/test-init-cygwin.right +7 -0
  199. data/test/data/test-init-osx.right +4 -0
  200. data/test/data/test-init.right +5 -0
  201. data/test/data/trace.right +14 -0
  202. data/test/dollar-0.rb +5 -0
  203. data/test/gcd-dbg-nox.rb +31 -0
  204. data/test/gcd-dbg.rb +30 -0
  205. data/test/gcd.rb +18 -0
  206. data/test/helper.rb +144 -0
  207. data/test/info-var-bug.rb +47 -0
  208. data/test/info-var-bug2.rb +2 -0
  209. data/test/jump.rb +14 -0
  210. data/test/jump2.rb +27 -0
  211. data/test/next.rb +18 -0
  212. data/test/null.rb +1 -0
  213. data/test/output.rb +2 -0
  214. data/test/pm-base.rb +22 -0
  215. data/test/pm-bug.rb +3 -0
  216. data/test/pm-catch.rb +12 -0
  217. data/test/pm-catch2.rb +27 -0
  218. data/test/pm-catch3.rb +47 -0
  219. data/test/pm.rb +11 -0
  220. data/test/raise.rb +3 -0
  221. data/test/rdebug-save.1 +7 -0
  222. data/test/runall +12 -0
  223. data/test/scope-var.rb +29 -0
  224. data/test/tdebug.rb +248 -0
  225. data/test/test-annotate.rb +25 -0
  226. data/test/test-break-bad.rb +37 -0
  227. data/test/test-breakpoints.rb +25 -0
  228. data/test/test-catch.rb +25 -0
  229. data/test/test-catch2.rb +25 -0
  230. data/test/test-catch3.rb +25 -0
  231. data/test/test-condition.rb +25 -0
  232. data/test/test-ctrl.rb +55 -0
  233. data/test/test-display.rb +26 -0
  234. data/test/test-dollar-0.rb +40 -0
  235. data/test/test-edit.rb +26 -0
  236. data/test/test-emacs-basic.rb +26 -0
  237. data/test/test-enable.rb +25 -0
  238. data/test/test-finish.rb +34 -0
  239. data/test/test-frame.rb +34 -0
  240. data/test/test-help.rb +60 -0
  241. data/test/test-hist.rb +68 -0
  242. data/test/test-info-thread.rb +32 -0
  243. data/test/test-info-var.rb +47 -0
  244. data/test/test-info.rb +26 -0
  245. data/test/test-init.rb +44 -0
  246. data/test/test-jump.rb +35 -0
  247. data/test/test-list.rb +25 -0
  248. data/test/test-method.rb +34 -0
  249. data/test/test-next.rb +25 -0
  250. data/test/test-output.rb +26 -0
  251. data/test/test-quit.rb +30 -0
  252. data/test/test-raise.rb +25 -0
  253. data/test/test-save.rb +31 -0
  254. data/test/test-scope-var.rb +25 -0
  255. data/test/test-setshow.rb +25 -0
  256. data/test/test-source.rb +25 -0
  257. data/test/test-stepping.rb +26 -0
  258. data/test/test-trace.rb +47 -0
  259. data/test/thread1.rb +26 -0
  260. data/test/trunc-call.rb +31 -0
  261. metadata +364 -0
@@ -0,0 +1,47 @@
1
+ class Lousy_inspect
2
+ attr_accessor :var
3
+ def inspect # An unhelpful inspect
4
+ throw "Foo" # Raises an exception
5
+ end
6
+ def initialize
7
+ @var = 'initialized'
8
+ end
9
+ end
10
+ class Lousy_inspect_and_to_s
11
+ attr_accessor :var
12
+ def inspect # An unhelpful inspect
13
+ throw "Foo" # Raises an exception
14
+ end
15
+ def to_s # An unhelpful to_s
16
+ throw "bar" # Raises an exception
17
+ end
18
+ def initialize
19
+ @var = 'initialized' # Something to inspect
20
+ end
21
+ end
22
+
23
+ # Something that will be passed objects with
24
+ # bad inspect or to_s methods
25
+ class UnsuspectingClass
26
+ @@Const = 'A constant'
27
+ @@var = 'a class variable'
28
+ def initialize(a)
29
+ @a = a # "info locals" will try to use
30
+ # inspect or to_s here
31
+ @b = 5
32
+ end
33
+ end
34
+ def test_Lousy_inspect
35
+ x = Lousy_inspect.new
36
+ x
37
+ end
38
+ def test_lousy_inspect_and_to_s
39
+ x = Lousy_inspect_and_to_s.new
40
+ x
41
+ end
42
+ x = test_Lousy_inspect
43
+ y = test_lousy_inspect_and_to_s
44
+ UnsuspectingClass.new(10)
45
+ UnsuspectingClass.new(x)
46
+ UnsuspectingClass.new(y)
47
+ y = 2
@@ -0,0 +1,2 @@
1
+ s = '<%= PRODUCT[:name] %>'
2
+ y = 0
@@ -0,0 +1,14 @@
1
+ def foo
2
+ j = 0
3
+ [1,2,3,4,5].each { |i|
4
+ j = i
5
+ [10,11,12].each { |k|
6
+ j = j + k
7
+ puts j
8
+ }
9
+ }
10
+ puts j
11
+ end
12
+
13
+ foo
14
+ puts "done"
@@ -0,0 +1,27 @@
1
+ def foo3(arg)
2
+ arg = arg + 3
3
+ puts arg
4
+ arg = arg/0 if arg > 10
5
+ rescue
6
+ puts "r3"
7
+ end
8
+
9
+ def foo2(arg)
10
+ arg = arg + 2
11
+ foo3(arg)
12
+ puts arg
13
+ rescue
14
+ puts "r2"
15
+ end
16
+
17
+ def foo1(arg)
18
+ arg = arg + 1
19
+ foo2(arg)
20
+ puts arg
21
+ rescue
22
+ puts "r1"
23
+ end
24
+
25
+ foo1(0)
26
+ foo2(10)
27
+ puts "done"
@@ -0,0 +1,18 @@
1
+ def foo
2
+ a = 1
3
+ puts "Stop here"
4
+ b = 2
5
+ end
6
+
7
+ a = 1
8
+ if a == 1
9
+ a += 2
10
+ puts a
11
+ end
12
+ foo
13
+ b = 2
14
+ b += 2
15
+ puts "one"
16
+ c = 4
17
+ puts "two"
18
+
@@ -0,0 +1 @@
1
+ # Nothing here. Move along.
@@ -0,0 +1,2 @@
1
+ puts "one"
2
+ puts "two"
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ # Test post-mortem handling using only ruby-debug-base.
3
+ src_dir = File.dirname(__FILE__)
4
+ %w(ext lib cli).each do |dir|
5
+ $:.unshift File.join(src_dir, '..', dir)
6
+ end
7
+ require 'ruby-debug-base'
8
+
9
+ class CommandProcessor
10
+ def at_line(context, file, line)
11
+ puts 'file: %s, line: %s' % [ File.basename(file), line ]
12
+ exit!
13
+ end
14
+ end
15
+
16
+ Debugger.start(:post_mortem => true)
17
+ Debugger.handler = CommandProcessor.new
18
+ def zero_div
19
+ 1/0
20
+ end
21
+ zero_div
22
+
@@ -0,0 +1,3 @@
1
+ a = 1
2
+ @x = 2
3
+ raise
@@ -0,0 +1,12 @@
1
+ #!/ursr/bin/env ruby
2
+ # Test Debugger.catchpoint and post-mortem handling
3
+ def zero_div
4
+ x = 5
5
+ 1/0
6
+ x = 6
7
+ end
8
+ x = 2
9
+ puts zero_div
10
+ raise RuntimeError
11
+ x = 3
12
+
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # Test Debugger.catchpoint
3
+ def bar(arg)
4
+ puts "bar begin"
5
+ 1/0 if arg
6
+ raise ZeroDivisionError
7
+ puts "bar end"
8
+ end
9
+
10
+ def foo
11
+ puts "foo begin"
12
+ yield 1
13
+ puts "foo end"
14
+ rescue ZeroDivisionError
15
+ puts "rescue"
16
+ end
17
+
18
+ def zero_div(arg)
19
+ x = 5
20
+ foo { |i| bar(i) }
21
+ x + arg
22
+ rescue ZeroDivisionError
23
+ "zero_div rescue"
24
+ end
25
+
26
+ puts zero_div(10)
27
+ puts "done"
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+ # Test catching uncaught exceptions
3
+ def get_exception(arg)
4
+ result = case arg
5
+ when 0 then LoadError
6
+ when 1 then ZeroDivisionError
7
+ when 2 then NoMethodError
8
+ else RuntimeError
9
+ end
10
+ return result
11
+ end
12
+
13
+ def bar(arg)
14
+ $var = $var + "bar begin:"
15
+ 1/0 if arg
16
+ if false
17
+ raise LoadError
18
+ end
19
+ $var = $var + "bar end:"
20
+ end
21
+
22
+ def foo(arg)
23
+ $var = $var + "foo begin:"
24
+ yield arg
25
+ $var = $var + "foo end:"
26
+ rescue get_exception(0), NameError
27
+ $var = $var + "foo rescue:"
28
+ ensure
29
+ $var = $var + "foo ensure:"
30
+ end
31
+
32
+ def zero_div(arg)
33
+ x = 5
34
+ foo(arg) { |i| bar(i) }
35
+ x + arg
36
+ rescue get_exception(arg)
37
+ $var = $var + "zero_div rescue:"
38
+ return "divide by zero"
39
+ end
40
+
41
+ $var = "start1:"
42
+ puts zero_div(1)
43
+ puts $var
44
+ $var = "start2:"
45
+ puts zero_div(2)
46
+ puts $var
47
+ puts "done"
@@ -0,0 +1,11 @@
1
+ #!/ursr/bin/env ruby
2
+ # Test Debugger.catchpoint and post-mortem handling
3
+ def zero_div
4
+ x = 5
5
+ 1/0
6
+ end
7
+ x = 2
8
+ zero_div
9
+ raise RuntimeError
10
+ x = 3
11
+
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ raise "abc"
@@ -0,0 +1,7 @@
1
+ break gcd.rb:10
2
+ break gcd.rb:12 if a > b
3
+ set autoeval on
4
+ set basename off
5
+ set debuggertesting off
6
+ set autolist off
7
+ set autoirb off
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ #-*- Ruby -*-
3
+ debug_opt = '-d ' if $DEBUG or 'd' == ARGV[0]
4
+ for file in Dir.glob("test-*.rb") do
5
+ puts "=" * 50
6
+ puts "== running #{file}..."
7
+ system("ruby #{file}");
8
+ end
9
+ if ARGV[0] == "really"
10
+ system("(cd test && ruby #{debug_opt}runall)")
11
+ system("(cd examples && ruby #{debug_opt}runall)")
12
+ end
@@ -0,0 +1,29 @@
1
+ require 'ruby_debug'
2
+ def scope1(arg1, arg2)
3
+ s1_var1 = 123
4
+ s1_var2 = "scope1"
5
+ scope2
6
+ end
7
+
8
+ def scope2
9
+ s2_var1 = 456
10
+ s2_var2 = "scope2"
11
+ 0.upto(5) do |i|
12
+ j = i * 10
13
+ scope3
14
+ end
15
+ end
16
+
17
+ def scope3
18
+ s3_var1 = 789
19
+ s3_var2 = "scope3"
20
+ puts eval("s3_var1", Debugger.current_context.frame_binding(0))
21
+ puts eval("i", Debugger.current_context.frame_binding(1))
22
+ puts eval("j", Debugger.current_context.frame_binding(1))
23
+ puts eval("s2_var1", Debugger.current_context.frame_binding(2))
24
+ puts eval("s1_var1", Debugger.current_context.frame_binding(3))
25
+ puts eval("s0_var1", Debugger.current_context.frame_binding(4))
26
+ end
27
+
28
+ s0_var1 = 1357;
29
+ scope1(111, 222)
@@ -0,0 +1,248 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- Ruby -*-
3
+ # This is a hacked down copy of rdebug which can be used for testing
4
+ # FIXME: use the real rdebug script - DRY.
5
+
6
+ require 'stringio'
7
+ require 'rubygems'
8
+ require 'optparse'
9
+ require "ostruct"
10
+
11
+ TOP_SRC_DIR = File.join(File.dirname(__FILE__), "..") unless
12
+ defined?(TOP_SRC_DIR)
13
+
14
+ $:.unshift File.join(TOP_SRC_DIR, "ext")
15
+ $:.unshift File.join(TOP_SRC_DIR, "lib")
16
+ $:.unshift File.join(TOP_SRC_DIR, "cli")
17
+
18
+ def debug_program(options)
19
+ # Make sure Ruby script syntax checks okay.
20
+ # Otherwise we get a load message that looks like rdebug has
21
+ # a problem.
22
+ output = `ruby -c "#{Debugger::PROG_SCRIPT}" 2>&1`
23
+ if $?.exitstatus != 0 and RUBY_PLATFORM !~ /mswin/
24
+ puts output
25
+ exit $?.exitstatus
26
+ end
27
+ print "\032\032starting\n" if Debugger.annotate and Debugger.annotate > 2
28
+ unless options.no_rewrite_program
29
+ # Set $0 so things like __FILE == $0 work.
30
+ # A more reliable way to do this is to put $0 = __FILE__ *after*
31
+ # loading the script to be debugged. For this, adding a debug hook
32
+ # for the first time and then switching to the debug hook that's
33
+ # normally used would be helpful. Doing this would also help other
34
+ # first-time initializations such as reloading debugger state
35
+ # after a restart.
36
+
37
+ # However This is just a little more than I want to take on right
38
+ # now, so I think I'll stick with the slightly hacky approach.
39
+ $RDEBUG_0 = $0
40
+
41
+ # cygwin does some sort of funky truncation on $0 ./abcdef => ./ab
42
+ # probably something to do with 3-letter extension truncation.
43
+ # The hacky workaround is to do slice assignment. Ugh.
44
+ d0 = if '.' == File.dirname(Debugger::PROG_SCRIPT) and
45
+ Debugger::PROG_SCRIPT[0..0] != '.'
46
+ File.join('.', Debugger::PROG_SCRIPT)
47
+ else
48
+ Debugger::PROG_SCRIPT
49
+ end
50
+ if $0.frozen?
51
+ $0 = d0
52
+ else
53
+ $0[0..-1] = d0
54
+ end
55
+ end
56
+
57
+ # Record where we are we can know if the call stack has been
58
+ # truncated or not.
59
+ Debugger.start_sentinal=caller(0)[1]
60
+
61
+ bt = Debugger.debug_load(Debugger::PROG_SCRIPT, !options.nostop, false)
62
+ if bt
63
+ if options.post_mortem
64
+ Debugger.handle_post_mortem(bt)
65
+ else
66
+ print bt.backtrace.map{|l| "\t#{l}"}.join("\n"), "\n"
67
+ print "Uncaught exception: #{bt}\n"
68
+ end
69
+ end
70
+ end
71
+
72
+ options = OpenStruct.new(
73
+ 'annotate' => false,
74
+ 'emacs' => false,
75
+ 'no-quit' => false,
76
+ 'no-stop' => false,
77
+ 'nx' => false,
78
+ 'post_mortem' => false,
79
+ 'script' => nil,
80
+ 'tracing' => false,
81
+ 'verbose_long'=> false,
82
+ 'wait' => false
83
+ )
84
+
85
+ require "ruby-debug"
86
+
87
+ program = File.basename($0)
88
+ opts = OptionParser.new do |opts|
89
+ opts.banner = <<EOB
90
+ #{program} #{Debugger::VERSION}
91
+ Usage: #{program} [options] <script.rb> -- <script.rb parameters>
92
+ EOB
93
+ opts.separator ""
94
+ opts.separator "Options:"
95
+ opts.on("-A", "--annotate LEVEL", Integer, "Set annotation level") do |s|
96
+ Debugger.annotate = s
97
+ end
98
+ opts.on("-d", "--debug", "Set $DEBUG=true") {$DEBUG = true}
99
+ opts.on("--emacs-basic", "Activates basic Emacs mode") do
100
+ ENV['EMACS'] = '1'
101
+ options.emacs = true
102
+ end
103
+ opts.on("-m", "--post-mortem", "Activate post-mortem mode") do
104
+ options.post_mortem = true
105
+ end
106
+ opts.on("--no-control", "Do not automatically start control thread") do
107
+ options.control = false
108
+ end
109
+ opts.on("--no-quit", "Do not quit when script finishes") do
110
+ options.noquit = true
111
+ end
112
+ opts.on("--no-stop", "Do not stop when script is loaded") do
113
+ options.nostop = true
114
+ end
115
+ opts.on("-nx", "Not run debugger initialization files (e.g. .rdebugrc") do
116
+ options.nx = true
117
+ end
118
+ opts.on("-I", "--include PATH", String, "Add PATH to $LOAD_PATH") do |path|
119
+ $LOAD_PATH.unshift(path)
120
+ end
121
+ opts.on("-r", "--require SCRIPT", String,
122
+ "Require the library, before executing your script") do |name|
123
+ if name == 'debug'
124
+ puts "ruby-debug is not compatible with Ruby's 'debug' library. This option is ignored."
125
+ else
126
+ require name
127
+ end
128
+ end
129
+ opts.on("--script FILE", String, "Name of the script file to run") do |s|
130
+ options.script = s
131
+ unless File.exists?(options.script)
132
+ puts "Script file '#{options.script}' is not found"
133
+ exit
134
+ end
135
+ end
136
+ opts.on("-x", "--trace", "Turn on line tracing") {options.tracing = true}
137
+ ENV['EMACS'] = nil unless options.emacs
138
+ opts.separator ""
139
+ opts.separator "Common options:"
140
+ opts.on_tail("--help", "Show this message") do
141
+ puts opts
142
+ exit
143
+ end
144
+ opts.on_tail("--version",
145
+ "Print the version") do
146
+ puts "ruby-debug #{Debugger::VERSION}"
147
+ exit
148
+ end
149
+ opts.on("--verbose", "Turn on verbose mode") do
150
+ $VERBOSE = true
151
+ options.verbose_long = true
152
+ end
153
+ opts.on_tail("-v",
154
+ "Print version number, then turn on verbose mode") do
155
+ puts "ruby-debug #{Debugger::VERSION}"
156
+ $VERBOSE = true
157
+ end
158
+ end
159
+
160
+ begin
161
+ if not defined? Debugger::ARGV
162
+ Debugger::ARGV = ARGV.clone
163
+ end
164
+ rdebug_path = File.expand_path($0)
165
+ if RUBY_PLATFORM =~ /mswin/
166
+ rdebug_path += '.cmd' unless rdebug_path =~ /\.cmd$/i
167
+ end
168
+ Debugger::RDEBUG_SCRIPT = rdebug_path
169
+ Debugger::RDEBUG_FILE = __FILE__
170
+ Debugger::INITIAL_DIR = Dir.pwd
171
+ opts.parse! ARGV
172
+ rescue StandardError => e
173
+ puts opts
174
+ puts
175
+ puts e.message
176
+ exit(-1)
177
+ end
178
+
179
+ if ARGV.empty?
180
+ exit if $VERBOSE and not options.verbose_long
181
+ puts opts
182
+ puts
183
+ puts 'Must specify a script to run'
184
+ exit(-1)
185
+ end
186
+
187
+ # save script name
188
+ Debugger::PROG_SCRIPT = ARGV.shift
189
+
190
+ # install interruption handler
191
+ trap('INT') { Debugger.interrupt_last }
192
+
193
+ # set options
194
+ Debugger.wait_connection = false
195
+
196
+ # Add Debugger trace hook.
197
+ Debugger.start
198
+
199
+ # start control thread
200
+ Debugger.start_control(options.host, options.cport) if options.control
201
+
202
+ # activate post-mortem
203
+ Debugger.post_mortem if options.post_mortem
204
+
205
+ # Set up an interface to read commands from a debugger script file.
206
+ if options.script
207
+ Debugger.interface = Debugger::ScriptInterface.new(options.script,
208
+ STDOUT, true)
209
+ end
210
+ options.nostop = true if options.tracing
211
+ Debugger.tracing = options.tracing
212
+
213
+ # Make sure Ruby script syntax checks okay.
214
+ # Otherwise we get a load message that looks like rdebug has
215
+ # a problem.
216
+ output = `ruby -c #{Debugger::PROG_SCRIPT} 2>&1`
217
+ if $?.exitstatus != 0 and RUBY_PLATFORM !~ /mswin/
218
+ puts output
219
+ exit $?.exitstatus
220
+ end
221
+
222
+ # load initrc script (e.g. .rdebugrc)
223
+ Debugger.run_init_script(StringIO.new) unless options.nx
224
+
225
+ # run startup script if specified
226
+ if options.script
227
+ Debugger.run_script(options.script)
228
+ end
229
+ # activate post-mortem
230
+ Debugger.post_mortem if options.post_mortem
231
+ options.stop = false if options.tracing
232
+ Debugger.tracing = options.tracing
233
+
234
+ if options.noquit
235
+ if Debugger.started?
236
+ until Debugger.stop do end
237
+ end
238
+ debug_program(options)
239
+ print "The program finished.\n" unless
240
+ Debugger.annotate.to_i > 1 # annotate has its own way
241
+ interface = Debugger::LocalInterface.new
242
+ # Not sure if ControlCommandProcessor is really the right
243
+ # thing to use. CommandProcessor requires a state.
244
+ processor = Debugger::ControlCommandProcessor.new(interface)
245
+ processor.process_commands
246
+ else
247
+ debug_program(options)
248
+ end