ruby-debug 0.9.3 → 0.10.0
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.
- data/AUTHORS +1 -0
- data/CHANGES +41 -0
- data/ChangeLog +0 -0
- data/README +27 -13
- data/Rakefile +220 -0
- data/bin/rdebug +116 -42
- data/cli/ruby-debug.rb +33 -3
- data/cli/ruby-debug/command.rb +49 -12
- data/cli/ruby-debug/commands/breakpoints.rb +47 -64
- data/cli/ruby-debug/commands/control.rb +41 -13
- data/cli/ruby-debug/commands/display.rb +35 -18
- data/cli/ruby-debug/commands/enable.rb +159 -0
- data/cli/ruby-debug/commands/eval.rb +78 -4
- data/cli/ruby-debug/commands/frame.rb +67 -42
- data/cli/ruby-debug/commands/help.rb +21 -17
- data/cli/ruby-debug/commands/info.rb +210 -0
- data/cli/ruby-debug/commands/irb.rb +9 -1
- data/cli/ruby-debug/commands/list.rb +11 -8
- data/cli/ruby-debug/commands/method.rb +12 -23
- data/cli/ruby-debug/commands/script.rb +14 -9
- data/cli/ruby-debug/commands/settings.rb +174 -39
- data/cli/ruby-debug/commands/show.rb +193 -0
- data/cli/ruby-debug/commands/stepping.rb +15 -10
- data/cli/ruby-debug/commands/threads.rb +55 -56
- data/cli/ruby-debug/commands/variables.rb +27 -27
- data/cli/ruby-debug/helper.rb +134 -0
- data/cli/ruby-debug/interface.rb +46 -15
- data/cli/ruby-debug/processor.rb +156 -25
- data/doc/rdebug.1 +236 -0
- data/runner.sh +7 -0
- data/test/breakpoints.cmd +43 -0
- data/test/breakpoints.right +94 -0
- data/test/display.cmd +18 -0
- data/test/display.right +37 -0
- data/test/frame.cmd +21 -0
- data/test/frame.right +45 -0
- data/test/gcd.rb +18 -0
- data/test/help.cmd +12 -0
- data/test/help.right +4 -0
- data/test/helper.rb +87 -0
- data/test/info-var-bug.rb +45 -0
- data/test/info-var.cmd +23 -0
- data/test/info-var.right +47 -0
- data/test/info.cmd +12 -0
- data/test/info.right +35 -0
- data/test/quit.cmd +9 -0
- data/test/quit.right +22 -0
- data/test/setshow.cmd +44 -0
- data/test/setshow.right +73 -0
- data/test/stepping.cmd +17 -0
- data/test/stepping.right +40 -0
- data/test/tdebug.rb +196 -0
- data/test/test-breakpoints.rb +28 -0
- data/test/test-columnize.rb +46 -0
- data/test/test-display.rb +26 -0
- data/test/test-frame.rb +27 -0
- data/test/test-help.rb +44 -0
- data/test/test-info-var.rb +33 -0
- data/test/test-info.rb +28 -0
- data/test/test-quit.rb +28 -0
- data/test/test-ruby-debug-base.rb +76 -0
- data/test/test-setshow.rb +24 -0
- data/test/test-stepping.rb +26 -0
- metadata +63 -22
data/AUTHORS
CHANGED
data/CHANGES
CHANGED
@@ -1,3 +1,44 @@
|
|
1
|
+
0.10.0
|
2
|
+
- '-r' option can be used to require additional libraries.
|
3
|
+
- --noquit option added to stay in debugger when the program exits
|
4
|
+
- gdb-like --annotate option added. Can be used by front-ends to get information
|
5
|
+
without polling
|
6
|
+
- Fixed 'var const' command. Issue #10847.
|
7
|
+
- Using pretty-print for all var commands.
|
8
|
+
- Better error reporting for commands that require a numeric argument.
|
9
|
+
- Fixed Kernel#binding_n method
|
10
|
+
- Add option -d ($DEBUG = true) and --verbose. Make -v work like ruby.
|
11
|
+
- Remove debugger messages caused when warnings are turned on.
|
12
|
+
- "info" and "show" commands added. "set" made more like gdb's
|
13
|
+
set. subcommands can be abbreviated and are case insensitive.
|
14
|
+
- restart program if it terminates normally and we've got a tty and
|
15
|
+
we stop on the first statement.
|
16
|
+
- help is in tidy column format. method lists are shown that way as well.
|
17
|
+
the "width" setting ("set/show width") is used for the line width
|
18
|
+
- stack traces now show parameter names and types. "info args" lists just
|
19
|
+
the parameters (with the most recent values, not the values at call time).
|
20
|
+
- post-mortem "exit" bug fixed.
|
21
|
+
- More Emacs-friendly: rdebug-track.el will track location inside an Emacs
|
22
|
+
shell. Emacs position information is shown in breakpoints and catchpoints
|
23
|
+
similar to gdba. Commands to position in another window a unit test traceback
|
24
|
+
or ruby traceback. Much more work invisioned for Emacs.
|
25
|
+
- INCOMPATIBLE CHANGE: "break" now sets a breakpoint on the current line
|
26
|
+
(same as gdb). Use "info break" for a list of breakpoints.
|
27
|
+
- INCOMPATIBLE CHANGE: "script" command removed. Use "source" command instead
|
28
|
+
(same as gdb).
|
29
|
+
- Run .rdebugrc on Debugger.start. Look for a file in the current directory and
|
30
|
+
run that instead the one in $HOME if that exists. Again, inspired and compatible
|
31
|
+
with gdb.
|
32
|
+
- Changes compatible with Ruby 1.9. NOTE: this debugger will NOT work with
|
33
|
+
Ruby 1.9
|
34
|
+
- leaving irb shows position same as entering debugger; "list" position
|
35
|
+
is also cleared when leaving irb
|
36
|
+
- help "foo" gives message "Undefined command "foo" rather than a list
|
37
|
+
of help commands. (Message test is gdb's)
|
38
|
+
- Add set linetrace+ - similar step+ for linetrace
|
39
|
+
- Start unit tests.
|
40
|
+
- Start a reference guide.
|
41
|
+
|
1
42
|
0.9.3
|
2
43
|
- Fixed if..elsif..end stepping.
|
3
44
|
- From irb session Ctrl-C or 'cont' command continues execution without showing the debugger prompt.
|
data/ChangeLog
ADDED
File without changes
|
data/README
CHANGED
@@ -9,9 +9,10 @@ The faster execution speed is achieved by utilizing a new hook Ruby C API.
|
|
9
9
|
|
10
10
|
ruby-debug requires Ruby 1.8.4 or higher.
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
Unless you get the packages as a binary (Microsoft Windows binaries
|
13
|
+
are sometimes available), you'll need a C compiler and Ruby
|
14
|
+
development headers, and a Make program so the extension in
|
15
|
+
ruby-debug-base can be compiled when it is installed.
|
15
16
|
|
16
17
|
== Install
|
17
18
|
|
@@ -19,6 +20,18 @@ ruby-debug is provided as a RubyGem. To install:
|
|
19
20
|
|
20
21
|
<tt>gem install ruby-debug</tt>
|
21
22
|
|
23
|
+
This should also pull in <tt>ruby-debug-base</tt> as a dependency.
|
24
|
+
|
25
|
+
For Emacs support and the Reference Manual, get
|
26
|
+
<tt>ruby-debug-extra</tt>. This is not a RubyGem, you'll need a Make
|
27
|
+
program and a POSIX shell. With this installed, run:
|
28
|
+
|
29
|
+
<pre>
|
30
|
+
sh ./configure
|
31
|
+
make
|
32
|
+
make install
|
33
|
+
</pre>
|
34
|
+
|
22
35
|
== Usage
|
23
36
|
|
24
37
|
There are two ways of running ruby-debug.
|
@@ -34,9 +47,9 @@ to set up your breakpoints.
|
|
34
47
|
=== ruby-debug API
|
35
48
|
|
36
49
|
The second way is to use the ruby-debug API to interrupt your
|
37
|
-
code execution at
|
50
|
+
code execution at run time.
|
38
51
|
|
39
|
-
require 'ruby-debug'
|
52
|
+
require 'ruby-debug' ; Debugger.start
|
40
53
|
...
|
41
54
|
def your_method
|
42
55
|
...
|
@@ -49,14 +62,15 @@ and you will be able to inspect and step through your code.
|
|
49
62
|
|
50
63
|
== Performance
|
51
64
|
|
52
|
-
The debug.rb script that comes with the standard library uses
|
53
|
-
Kernel#set_trace_func API.
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
of the
|
58
|
-
|
59
|
-
the
|
65
|
+
The debug.rb script that comes with the standard Ruby library uses
|
66
|
+
Kernel#set_trace_func API. Implementing the debugger in pure Ruby has
|
67
|
+
a negative impact on the speed of your program execution. This is
|
68
|
+
because the Ruby interpreter creates a Binding object each trace call,
|
69
|
+
even though it is not being used most of the time. ruby-debug moves
|
70
|
+
most of the functionality for Binding access and for breakpoint
|
71
|
+
testing to a native extension. Because this code is in C and because
|
72
|
+
and can be selectively enabled or disabled, the overhead in running
|
73
|
+
your program can be minimized.
|
60
74
|
|
61
75
|
== License
|
62
76
|
|
data/Rakefile
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
# -*- Ruby -*-
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'rake/rdoctask'
|
6
|
+
require 'rake/testtask'
|
7
|
+
|
8
|
+
SO_NAME = "ruby_debug.so"
|
9
|
+
|
10
|
+
# ------- Default Package ----------
|
11
|
+
RUBY_DEBUG_VERSION = open("ext/ruby_debug.c"){|f| f.grep(/^#define DEBUG_VERSION/).first[/"(.+)"/,1]}
|
12
|
+
|
13
|
+
COMMON_FILES = FileList[
|
14
|
+
'AUTHORS',
|
15
|
+
'CHANGES',
|
16
|
+
'LICENSE',
|
17
|
+
'README',
|
18
|
+
'Rakefile',
|
19
|
+
]
|
20
|
+
|
21
|
+
CLI_TEST_FILE_LIST = 'test/**/*test-*.rb'
|
22
|
+
CLI_FILES = COMMON_FILES + FileList[
|
23
|
+
"cli/**/*",
|
24
|
+
'ChangeLog',
|
25
|
+
'bin/*',
|
26
|
+
'doc/rdebug.1',
|
27
|
+
'test/**/*.cmd',
|
28
|
+
'test/**/*.right',
|
29
|
+
'test/**/gcd.rb',
|
30
|
+
'test/**/helper.rb',
|
31
|
+
'test/**/info-var-bug.rb',
|
32
|
+
'test/**/tdebug.rb',
|
33
|
+
'test/**/test-*.cmd',
|
34
|
+
'runner.sh',
|
35
|
+
CLI_TEST_FILE_LIST,
|
36
|
+
]
|
37
|
+
|
38
|
+
BASE_TEST_FILE_LIST = 'test/test-ruby-debug-base.rb'
|
39
|
+
BASE_FILES = COMMON_FILES + FileList[
|
40
|
+
'lib/**/*',
|
41
|
+
'ext/ChangeLog',
|
42
|
+
'ext/ruby_debug.c',
|
43
|
+
'ext/extconf.rb',
|
44
|
+
'ext/win32/*',
|
45
|
+
BASE_TEST_FILE_LIST,
|
46
|
+
]
|
47
|
+
|
48
|
+
desc "Test everything."
|
49
|
+
test_task = task :test => :lib do
|
50
|
+
Rake::TestTask.new(:test) do |t|
|
51
|
+
t.libs << ['./ext', './lib', './cli']
|
52
|
+
t.pattern = CLI_TEST_FILE_LIST
|
53
|
+
t.verbose = true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
desc "Test everything - same as test."
|
58
|
+
task :check => :test
|
59
|
+
|
60
|
+
desc "Create the core ruby-debug shared library extension"
|
61
|
+
task :lib do
|
62
|
+
Dir.chdir("ext") do
|
63
|
+
system("#{Gem.ruby} extconf.rb && make")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
desc "Compile Emacs code"
|
68
|
+
task :emacs => "emacs/rdebug.elc"
|
69
|
+
file "emacs/rdebug.elc" => ["emacs/elisp-comp", "emacs/rdebug.el"] do
|
70
|
+
Dir.chdir("emacs") do
|
71
|
+
system("./elisp-comp ./rdebug.el")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
desc "Create a GNU-style ChangeLog via svn2cl"
|
76
|
+
task :ChangeLog do
|
77
|
+
system("svn2cl --authors=svn2cl_usermap svn://rubyforge.org/var/svn/ruby-debug/trunk")
|
78
|
+
system("svn2cl --authors=svn2cl_usermap svn://rubyforge.org/var/svn/ruby-debug/trunk/ext -o ext/ChangeLog")
|
79
|
+
system("svn2cl --authors=svn2cl_usermap svn://rubyforge.org/var/svn/ruby-debug/trunk/lib -o lib/ChangeLog")
|
80
|
+
end
|
81
|
+
|
82
|
+
# Base GEM Specification
|
83
|
+
base_spec = Gem::Specification.new do |spec|
|
84
|
+
spec.name = "ruby-debug-base"
|
85
|
+
|
86
|
+
spec.homepage = "http://rubyforge.org/projects/ruby-debug/"
|
87
|
+
spec.summary = "Fast Ruby debugger - core component"
|
88
|
+
spec.description = <<-EOF
|
89
|
+
ruby-debug is a fast implementation of the standard Ruby debugger debug.rb.
|
90
|
+
It is implemented by utilizing a new Ruby C API hook. The core component
|
91
|
+
provides support that front-ends can build on. It provides breakpoint
|
92
|
+
handling, bindings for stack frames among other things.
|
93
|
+
EOF
|
94
|
+
|
95
|
+
spec.version = RUBY_DEBUG_VERSION
|
96
|
+
|
97
|
+
spec.author = "Kent Sibilev"
|
98
|
+
spec.email = "ksibilev@yahoo.com"
|
99
|
+
spec.platform = Gem::Platform::RUBY
|
100
|
+
spec.require_path = "lib"
|
101
|
+
spec.extensions = ["ext/extconf.rb"]
|
102
|
+
spec.autorequire = "ruby-debug-base"
|
103
|
+
spec.files = BASE_FILES.to_a
|
104
|
+
|
105
|
+
spec.required_ruby_version = '>= 1.8.2'
|
106
|
+
spec.date = Time.now
|
107
|
+
spec.rubyforge_project = 'ruby-debug'
|
108
|
+
|
109
|
+
spec.test_files = FileList[BASE_TEST_FILE_LIST]
|
110
|
+
|
111
|
+
# rdoc
|
112
|
+
spec.has_rdoc = true
|
113
|
+
spec.extra_rdoc_files = ['README', 'ext/ruby_debug.c']
|
114
|
+
end
|
115
|
+
|
116
|
+
cli_spec = Gem::Specification.new do |spec|
|
117
|
+
spec.name = "ruby-debug"
|
118
|
+
|
119
|
+
spec.homepage = "http://rubyforge.org/projects/ruby-debug/"
|
120
|
+
spec.summary = "Command line interface (CLI) for ruby-debug-base"
|
121
|
+
spec.description = <<-EOF
|
122
|
+
A generic command line interface for ruby-debug.
|
123
|
+
EOF
|
124
|
+
|
125
|
+
spec.version = RUBY_DEBUG_VERSION
|
126
|
+
|
127
|
+
spec.author = "Kent Sibilev"
|
128
|
+
spec.email = "ksibilev@yahoo.com"
|
129
|
+
spec.platform = Gem::Platform::RUBY
|
130
|
+
spec.require_path = "cli"
|
131
|
+
spec.bindir = "bin"
|
132
|
+
spec.executables = ["rdebug"]
|
133
|
+
spec.autorequire = "ruby-debug"
|
134
|
+
spec.files = CLI_FILES.to_a
|
135
|
+
|
136
|
+
spec.required_ruby_version = '>= 1.8.2'
|
137
|
+
spec.date = Time.now
|
138
|
+
spec.rubyforge_project = 'ruby-debug'
|
139
|
+
spec.add_dependency('ruby-debug-base', RUBY_DEBUG_VERSION)
|
140
|
+
|
141
|
+
# FIXME: work out operational logistics for this
|
142
|
+
# spec.test_files = FileList[CLI_TEST_FILE_LIST]
|
143
|
+
|
144
|
+
# rdoc
|
145
|
+
spec.has_rdoc = true
|
146
|
+
spec.extra_rdoc_files = ['README']
|
147
|
+
end
|
148
|
+
|
149
|
+
# Rake task to build the default package
|
150
|
+
Rake::GemPackageTask.new(base_spec) do |pkg|
|
151
|
+
pkg.need_tar = true
|
152
|
+
end
|
153
|
+
Rake::GemPackageTask.new(cli_spec) do |pkg|
|
154
|
+
pkg.need_tar = true
|
155
|
+
end
|
156
|
+
|
157
|
+
task :default => [:package]
|
158
|
+
|
159
|
+
# Windows specification
|
160
|
+
win_spec = base_spec.clone
|
161
|
+
win_spec.extensions = []
|
162
|
+
win_spec.platform = Gem::Platform::WIN32
|
163
|
+
win_spec.files += ["lib/#{SO_NAME}"]
|
164
|
+
|
165
|
+
desc "Create Windows Gem"
|
166
|
+
task :win32_gem do
|
167
|
+
# Copy the win32 extension the top level directory
|
168
|
+
current_dir = File.expand_path(File.dirname(__FILE__))
|
169
|
+
source = File.join(current_dir, "ext", "win32", SO_NAME)
|
170
|
+
target = File.join(current_dir, "lib", SO_NAME)
|
171
|
+
cp(source, target)
|
172
|
+
|
173
|
+
# Create the gem, then move it to pkg
|
174
|
+
Gem::Builder.new(win_spec).build
|
175
|
+
gem_file = "#{win_spec.name}-#{win_spec.version}-#{win_spec.platform}.gem"
|
176
|
+
mv(gem_file, "pkg/#{gem_file}")
|
177
|
+
|
178
|
+
# Remove win extension fro top level directory
|
179
|
+
rm(target)
|
180
|
+
end
|
181
|
+
|
182
|
+
desc "Publish ruby-debug to RubyForge."
|
183
|
+
task :publish do
|
184
|
+
require 'rake/contrib/sshpublisher'
|
185
|
+
|
186
|
+
# Get ruby-debug path
|
187
|
+
ruby_debug_path = File.expand_path(File.dirname(__FILE__))
|
188
|
+
|
189
|
+
publisher = Rake::SshDirPublisher.new("kent@rubyforge.org",
|
190
|
+
"/var/www/gforge-projects/ruby-debug", ruby_debug_path)
|
191
|
+
end
|
192
|
+
|
193
|
+
desc "Remove built files"
|
194
|
+
task :clean do
|
195
|
+
cd "ext" do
|
196
|
+
if File.exists?("Makefile")
|
197
|
+
sh "make clean"
|
198
|
+
rm "Makefile"
|
199
|
+
end
|
200
|
+
derived_files = Dir.glob(".o") + Dir.glob("*.so")
|
201
|
+
rm derived_files unless derived_files.empty?
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
# --------- RDoc Documentation ------
|
206
|
+
desc "Generate rdoc documentation"
|
207
|
+
Rake::RDocTask.new("rdoc") do |rdoc|
|
208
|
+
rdoc.rdoc_dir = 'doc'
|
209
|
+
rdoc.title = "ruby-debug"
|
210
|
+
# Show source inline with line numbers
|
211
|
+
rdoc.options << "--inline-source" << "--line-numbers"
|
212
|
+
# Make the readme file the start page for the generated html
|
213
|
+
rdoc.options << '--main' << 'README'
|
214
|
+
rdoc.rdoc_files.include('bin/**/*',
|
215
|
+
'lib/**/*.rb',
|
216
|
+
'ext/**/ruby_debug.c',
|
217
|
+
'README',
|
218
|
+
'LICENSE')
|
219
|
+
end
|
220
|
+
|
data/bin/rdebug
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# -*- Ruby -*-
|
2
3
|
|
3
4
|
require 'rubygems'
|
4
5
|
require 'optparse'
|
@@ -6,75 +7,124 @@ require "ostruct"
|
|
6
7
|
require 'ruby-debug'
|
7
8
|
|
8
9
|
options = OpenStruct.new(
|
9
|
-
'
|
10
|
+
'annotate' => Debugger.annotate,
|
10
11
|
'client' => false,
|
11
|
-
'
|
12
|
+
'control' => true,
|
13
|
+
'cport' => Debugger::PORT + 1,
|
14
|
+
'frame_bind' => false,
|
12
15
|
'host' => nil,
|
16
|
+
'no-quit' => false,
|
17
|
+
'no-stop' => false,
|
18
|
+
'nx' => false,
|
13
19
|
'port' => Debugger::PORT,
|
14
|
-
'cport' => Debugger::PORT + 1,
|
15
|
-
'control' => true,
|
16
|
-
'wait' => false,
|
17
|
-
'nostop' => false,
|
18
20
|
'post_mortem' => false,
|
19
21
|
'script' => nil,
|
22
|
+
'server' => false,
|
20
23
|
'tracing' => false,
|
21
|
-
'
|
24
|
+
'verbose_long'=> false,
|
25
|
+
'wait' => false
|
22
26
|
)
|
23
27
|
|
28
|
+
program = File.basename($0)
|
24
29
|
opts = OptionParser.new do |opts|
|
25
30
|
opts.banner = <<EOB
|
26
|
-
|
27
|
-
Usage:
|
31
|
+
#{program} #{Debugger::VERSION}
|
32
|
+
Usage: #{program} [options] <script.rb> -- <script.rb parameters>
|
28
33
|
EOB
|
29
34
|
opts.separator ""
|
30
35
|
opts.separator "Options:"
|
31
|
-
opts.on("-
|
32
|
-
|
33
|
-
|
34
|
-
opts.on("-
|
35
|
-
|
36
|
-
|
37
|
-
opts.on("--
|
38
|
-
|
39
|
-
|
40
|
-
opts.on("-
|
36
|
+
opts.on("-A", "--annotate LEVEL", Integer, "Set annotation level") do
|
37
|
+
|Debugger::annotate|
|
38
|
+
end
|
39
|
+
opts.on("-c", "--client", "Connect to remote debugger") do
|
40
|
+
options.client = true
|
41
|
+
end
|
42
|
+
opts.on("--cport PORT", Integer, "Port used for control commands") do
|
43
|
+
|options.cport|
|
44
|
+
end
|
45
|
+
opts.on("-d", "--debug", "Set $DEBUG=true") {$DEBUG = true}
|
46
|
+
opts.on("--emacs", "Activates emacs mode") {ENV['EMACS'] = '1'}
|
47
|
+
opts.on("-h", "--host HOST", "Host name used for remote debugging") do
|
48
|
+
|options.host|
|
49
|
+
end
|
41
50
|
opts.on("-I", "--include PATH", String, "Add PATH to $LOAD_PATH") do |path|
|
42
51
|
$LOAD_PATH.unshift(path)
|
43
52
|
end
|
44
|
-
opts.on("--
|
53
|
+
opts.on("--keep-frame-binding", "Keep frame bindings") do
|
54
|
+
options.frame_bind = true
|
55
|
+
end
|
56
|
+
opts.on("-m", "--post-mortem", "Activate post-mortem mode") do
|
57
|
+
options.post_mortem = true
|
58
|
+
end
|
59
|
+
opts.on("--no-control", "Do not automatically start control thread") do
|
60
|
+
options.control = false
|
61
|
+
end
|
62
|
+
opts.on("--no-quit", "Do not quit when script finishes") do
|
63
|
+
options.noquit = true
|
64
|
+
end
|
65
|
+
opts.on("-n", "--no-stop", "Do not stop when script is loaded") do
|
66
|
+
options.nostop = true
|
67
|
+
end
|
68
|
+
opts.on("-nx", "Not run debugger initialization files (e.g. .rdebugrc") do
|
69
|
+
options.nx = true
|
70
|
+
end
|
71
|
+
opts.on("-p", "--port PORT", Integer, "Port used for remote debugging") do
|
72
|
+
|options.port|
|
73
|
+
end
|
74
|
+
opts.on("-r", "--require SCRIPT", String,
|
75
|
+
"Require the library, before executing your script") do |name|
|
76
|
+
if name == 'debug'
|
77
|
+
puts "ruby-debug is not compatible with Ruby's 'debug' library. This option is ignored."
|
78
|
+
else
|
79
|
+
require name
|
80
|
+
end
|
81
|
+
end
|
82
|
+
opts.on("--script FILE", String, "Name of the script file to run") do
|
83
|
+
|options.script|
|
45
84
|
unless File.exists?(options.script)
|
46
85
|
puts "Script file '#{options.script}' is not found"
|
47
86
|
exit
|
48
87
|
end
|
49
88
|
end
|
50
|
-
opts.on("-
|
51
|
-
|
52
|
-
if options.debug_module != 'debug'
|
53
|
-
puts "Use '-r' option only with 'debug' (You supplied '#{options.debug_module}'). " +
|
54
|
-
"This option is ignored."
|
55
|
-
end
|
89
|
+
opts.on("-s", "--server", "Listen for remote connections") do
|
90
|
+
options.server = true
|
56
91
|
end
|
57
|
-
opts.on("
|
58
|
-
|
92
|
+
opts.on("-w", "--wait", "Wait for a client connection, implies -s option") do
|
93
|
+
options.wait = true
|
94
|
+
end
|
95
|
+
opts.on("-x", "--trace", "Turn on line tracing") {options.tracing = true}
|
59
96
|
opts.separator ""
|
60
97
|
opts.separator "Common options:"
|
61
98
|
opts.on_tail("--help", "Show this message") do
|
62
99
|
puts opts
|
63
100
|
exit
|
64
101
|
end
|
65
|
-
opts.on_tail("
|
102
|
+
opts.on_tail("--version",
|
103
|
+
"Print the version") do
|
66
104
|
puts "ruby-debug #{Debugger::VERSION}"
|
67
105
|
exit
|
68
106
|
end
|
107
|
+
opts.on("--verbose", "Turn on verbose mode") do
|
108
|
+
$VERBOSE = true
|
109
|
+
options.verbose_long = true
|
110
|
+
end
|
111
|
+
opts.on_tail("-v",
|
112
|
+
"Print version number, then turn on verbose mode") do
|
113
|
+
puts "ruby-debug #{Debugger::VERSION}"
|
114
|
+
$VERBOSE = true
|
115
|
+
end
|
69
116
|
end
|
70
117
|
|
71
118
|
begin
|
72
|
-
Debugger::ARGV
|
119
|
+
if not defined? Debugger::ARGV
|
120
|
+
Debugger::ARGV = ARGV.clone
|
121
|
+
end
|
73
122
|
rdebug_path = File.expand_path($0)
|
74
123
|
if RUBY_PLATFORM =~ /mswin/
|
75
124
|
rdebug_path += ".cmd" unless rdebug_path =~ /\.cmd$/i
|
76
125
|
end
|
77
126
|
Debugger::RDEBUG_SCRIPT = rdebug_path
|
127
|
+
Debugger::INITIAL_DIR = Dir.pwd
|
78
128
|
opts.parse! ARGV
|
79
129
|
rescue StandardError => e
|
80
130
|
puts opts
|
@@ -87,12 +137,13 @@ if options.client
|
|
87
137
|
Debugger.start_client(options.host, options.port)
|
88
138
|
else
|
89
139
|
if ARGV.empty?
|
140
|
+
exit if $VERBOSE and not options.verbose_long
|
90
141
|
puts opts
|
91
142
|
puts
|
92
143
|
puts "Must specify a script to run"
|
93
144
|
exit(-1)
|
94
145
|
end
|
95
|
-
|
146
|
+
|
96
147
|
# save script name
|
97
148
|
Debugger::PROG_SCRIPT = ARGV.shift
|
98
149
|
|
@@ -103,16 +154,12 @@ else
|
|
103
154
|
Debugger.wait_connection = options.wait
|
104
155
|
Debugger.keep_frame_binding = options.frame_bind
|
105
156
|
|
106
|
-
load_initrc = lambda do
|
107
|
-
script_file = "#{ENV["HOME"] || ENV["HOMEPATH" || "."]}/.rdebugrc"
|
108
|
-
Debugger.run_script script_file, StringIO.new if File.exists?(script_file)
|
109
|
-
end
|
110
|
-
|
111
157
|
if options.server
|
112
158
|
# start remote mode
|
113
|
-
Debugger.start_remote(options.host, [options.port, options.cport],
|
159
|
+
Debugger.start_remote(options.host, [options.port, options.cport],
|
160
|
+
options.post_mortem) do
|
114
161
|
# load initrc script
|
115
|
-
|
162
|
+
Debugger.run_init_script(StringIO.new) unless options.nx
|
116
163
|
end
|
117
164
|
# load script
|
118
165
|
Debugger.debug_load Debugger::PROG_SCRIPT, !options.nostop
|
@@ -122,8 +169,8 @@ else
|
|
122
169
|
# start control thread
|
123
170
|
Debugger.start_control(options.host, options.cport) if options.control
|
124
171
|
|
125
|
-
# load initrc script
|
126
|
-
|
172
|
+
# load initrc script (e.g. .rdebugrc)
|
173
|
+
Debugger.run_init_script(StringIO.new) unless options.nx
|
127
174
|
|
128
175
|
# run startup script if specified
|
129
176
|
if options.script
|
@@ -132,7 +179,34 @@ else
|
|
132
179
|
# activate post-mortem
|
133
180
|
Debugger.post_mortem if options.post_mortem
|
134
181
|
Debugger.tracing = options.nostop = true if options.tracing
|
135
|
-
|
136
|
-
|
182
|
+
|
183
|
+
# Make sure Ruby script syntax checks okay.
|
184
|
+
# Otherwise we get a load message that looks like rdebug has
|
185
|
+
# a problem.
|
186
|
+
output = `ruby -c #{Debugger::PROG_SCRIPT} 2>&1`
|
187
|
+
if $?.exitstatus != 0 and RUBY_PLATFORM !~ /mswin/
|
188
|
+
puts output
|
189
|
+
exit $?.exitstatus
|
190
|
+
end
|
191
|
+
if options.noquit
|
192
|
+
Debugger.stop if Debugger.started?
|
193
|
+
while true do
|
194
|
+
begin
|
195
|
+
Debugger.debug_load Debugger::PROG_SCRIPT, !options.nostop
|
196
|
+
rescue
|
197
|
+
print $!.backtrace.map{|l| "\t#{l}"}.join("\n"), "\n"
|
198
|
+
print "Uncaught exception: #{$!}\n"
|
199
|
+
end
|
200
|
+
# FIXME: add status for whether we are interactive or not.
|
201
|
+
# if STDIN.tty? and !options.nostop
|
202
|
+
if !options.nostop
|
203
|
+
print "The program has finished and will be restarted.\n"
|
204
|
+
else
|
205
|
+
break
|
206
|
+
end
|
207
|
+
end
|
208
|
+
else
|
209
|
+
Debugger.debug_load Debugger::PROG_SCRIPT, !options.nostop
|
210
|
+
end
|
137
211
|
end
|
138
212
|
end
|