debugger2 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.travis.yml +3 -0
- data/AUTHORS +10 -0
- data/CHANGELOG.md +65 -0
- data/CONTRIBUTING.md +1 -0
- data/Gemfile +3 -0
- data/LICENSE +23 -0
- data/OLDER_CHANGELOG +334 -0
- data/OLD_CHANGELOG +5655 -0
- data/OLD_README +122 -0
- data/README.md +108 -0
- data/Rakefile +78 -0
- data/bin/rdebug +397 -0
- data/debugger2.gemspec +29 -0
- data/doc/.cvsignore +42 -0
- data/doc/Makefile.am +63 -0
- data/doc/emacs-notes.txt +38 -0
- data/doc/hanoi.rb +35 -0
- data/doc/primes.rb +28 -0
- data/doc/rdebug-emacs.texi +1030 -0
- data/doc/ruby-debug.texi +3791 -0
- data/doc/test-tri2.rb +18 -0
- data/doc/tri3.rb +8 -0
- data/doc/triangle.rb +12 -0
- data/emacs/Makefile.am +130 -0
- data/emacs/rdebug-annotate.el +385 -0
- data/emacs/rdebug-breaks.el +407 -0
- data/emacs/rdebug-cmd.el +92 -0
- data/emacs/rdebug-core.el +502 -0
- data/emacs/rdebug-dbg.el +62 -0
- data/emacs/rdebug-error.el +79 -0
- data/emacs/rdebug-fns.el +111 -0
- data/emacs/rdebug-frames.el +230 -0
- data/emacs/rdebug-gud.el +242 -0
- data/emacs/rdebug-help.el +104 -0
- data/emacs/rdebug-info.el +83 -0
- data/emacs/rdebug-layouts.el +180 -0
- data/emacs/rdebug-locring.el +118 -0
- data/emacs/rdebug-output.el +106 -0
- data/emacs/rdebug-regexp.el +118 -0
- data/emacs/rdebug-secondary.el +260 -0
- data/emacs/rdebug-shortkey.el +175 -0
- data/emacs/rdebug-source.el +568 -0
- data/emacs/rdebug-track.el +392 -0
- data/emacs/rdebug-varbuf.el +150 -0
- data/emacs/rdebug-vars.el +125 -0
- data/emacs/rdebug-watch.el +132 -0
- data/emacs/rdebug.el +326 -0
- data/emacs/test/elk-test.el +242 -0
- data/emacs/test/test-annotate.el +103 -0
- data/emacs/test/test-cmd.el +116 -0
- data/emacs/test/test-core.el +104 -0
- data/emacs/test/test-fns.el +65 -0
- data/emacs/test/test-frames.el +62 -0
- data/emacs/test/test-gud.el +35 -0
- data/emacs/test/test-indent.el +58 -0
- data/emacs/test/test-regexp.el +144 -0
- data/emacs/test/test-shortkey.el +61 -0
- data/ext/ruby_debug/breakpoint.c +630 -0
- data/ext/ruby_debug/extconf.rb +11 -0
- data/ext/ruby_debug/ruby_debug.c +2203 -0
- data/ext/ruby_debug/ruby_debug.h +151 -0
- data/lib/debugger.rb +5 -0
- data/lib/debugger/version.rb +5 -0
- data/lib/debugger2.rb +6 -0
- data/lib/ruby-debug-base.rb +307 -0
- data/lib/ruby-debug.rb +176 -0
- data/lib/ruby-debug/command.rb +227 -0
- data/lib/ruby-debug/commands/breakpoints.rb +153 -0
- data/lib/ruby-debug/commands/catchpoint.rb +55 -0
- data/lib/ruby-debug/commands/condition.rb +49 -0
- data/lib/ruby-debug/commands/continue.rb +38 -0
- data/lib/ruby-debug/commands/control.rb +107 -0
- data/lib/ruby-debug/commands/display.rb +120 -0
- data/lib/ruby-debug/commands/edit.rb +48 -0
- data/lib/ruby-debug/commands/enable.rb +202 -0
- data/lib/ruby-debug/commands/eval.rb +176 -0
- data/lib/ruby-debug/commands/finish.rb +42 -0
- data/lib/ruby-debug/commands/frame.rb +301 -0
- data/lib/ruby-debug/commands/help.rb +56 -0
- data/lib/ruby-debug/commands/info.rb +467 -0
- data/lib/ruby-debug/commands/irb.rb +123 -0
- data/lib/ruby-debug/commands/jump.rb +66 -0
- data/lib/ruby-debug/commands/kill.rb +51 -0
- data/lib/ruby-debug/commands/list.rb +94 -0
- data/lib/ruby-debug/commands/method.rb +84 -0
- data/lib/ruby-debug/commands/quit.rb +39 -0
- data/lib/ruby-debug/commands/reload.rb +40 -0
- data/lib/ruby-debug/commands/save.rb +90 -0
- data/lib/ruby-debug/commands/set.rb +223 -0
- data/lib/ruby-debug/commands/show.rb +247 -0
- data/lib/ruby-debug/commands/skip.rb +35 -0
- data/lib/ruby-debug/commands/source.rb +36 -0
- data/lib/ruby-debug/commands/stepping.rb +81 -0
- data/lib/ruby-debug/commands/threads.rb +189 -0
- data/lib/ruby-debug/commands/tmate.rb +36 -0
- data/lib/ruby-debug/commands/trace.rb +57 -0
- data/lib/ruby-debug/commands/variables.rb +199 -0
- data/lib/ruby-debug/debugger.rb +5 -0
- data/lib/ruby-debug/helper.rb +69 -0
- data/lib/ruby-debug/interface.rb +232 -0
- data/lib/ruby-debug/processor.rb +474 -0
- data/man/rdebug.1 +241 -0
- data/old_scripts/Makefile.am +14 -0
- data/old_scripts/README.md +2 -0
- data/old_scripts/autogen.sh +4 -0
- data/old_scripts/configure.ac +12 -0
- data/old_scripts/rdbg.rb +33 -0
- data/old_scripts/runner.sh +7 -0
- data/old_scripts/svn2cl_usermap +3 -0
- data/test/.cvsignore +1 -0
- data/test/breakpoints_test.rb +366 -0
- data/test/conditions_test.rb +77 -0
- data/test/continue_test.rb +28 -0
- data/test/display_test.rb +143 -0
- data/test/edit_test.rb +55 -0
- data/test/eval_test.rb +94 -0
- data/test/examples/breakpoint1.rb +15 -0
- data/test/examples/breakpoint2.rb +7 -0
- data/test/examples/conditions.rb +4 -0
- data/test/examples/continue.rb +4 -0
- data/test/examples/display.rb +5 -0
- data/test/examples/edit.rb +3 -0
- data/test/examples/edit2.rb +3 -0
- data/test/examples/eval.rb +4 -0
- data/test/examples/finish.rb +20 -0
- data/test/examples/frame.rb +31 -0
- data/test/examples/help.rb +2 -0
- data/test/examples/info.rb +48 -0
- data/test/examples/info2.rb +3 -0
- data/test/examples/irb.rb +6 -0
- data/test/examples/jump.rb +14 -0
- data/test/examples/kill.rb +2 -0
- data/test/examples/list.rb +12 -0
- data/test/examples/method.rb +15 -0
- data/test/examples/post_mortem.rb +19 -0
- data/test/examples/quit.rb +2 -0
- data/test/examples/reload.rb +6 -0
- data/test/examples/restart.rb +6 -0
- data/test/examples/save.rb +3 -0
- data/test/examples/set.rb +3 -0
- data/test/examples/set_annotate.rb +12 -0
- data/test/examples/settings.rb +1 -0
- data/test/examples/show.rb +2 -0
- data/test/examples/source.rb +3 -0
- data/test/examples/stepping.rb +21 -0
- data/test/examples/thread.rb +32 -0
- data/test/examples/tmate.rb +10 -0
- data/test/examples/trace.rb +7 -0
- data/test/examples/trace_threads.rb +20 -0
- data/test/examples/variables.rb +26 -0
- data/test/finish_test.rb +49 -0
- data/test/frame_test.rb +140 -0
- data/test/help_test.rb +51 -0
- data/test/info_test.rb +326 -0
- data/test/irb_test.rb +82 -0
- data/test/jump_test.rb +70 -0
- data/test/kill_test.rb +49 -0
- data/test/list_test.rb +147 -0
- data/test/method_test.rb +72 -0
- data/test/post_mortem_test.rb +25 -0
- data/test/quit_test.rb +56 -0
- data/test/reload_test.rb +47 -0
- data/test/restart_test.rb +145 -0
- data/test/save_test.rb +94 -0
- data/test/set_test.rb +183 -0
- data/test/show_test.rb +294 -0
- data/test/source_test.rb +46 -0
- data/test/stepping_test.rb +122 -0
- data/test/support/breakpoint.rb +12 -0
- data/test/support/context.rb +14 -0
- data/test/support/matchers.rb +67 -0
- data/test/support/mocha_extensions.rb +71 -0
- data/test/support/processor.rb +7 -0
- data/test/support/test_dsl.rb +206 -0
- data/test/support/test_interface.rb +66 -0
- data/test/test_helper.rb +9 -0
- data/test/thread_test.rb +124 -0
- data/test/tmate_test.rb +45 -0
- data/test/trace_test.rb +156 -0
- data/test/variables_test.rb +116 -0
- metadata +319 -0
data/OLD_README
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
*************************************************************
|
2
|
+
|
3
|
+
NOTE: For Ruby 1.9 installation instructions, please see:
|
4
|
+
|
5
|
+
http://wiki.github.com/mark-moseley/ruby-debug
|
6
|
+
|
7
|
+
*************************************************************
|
8
|
+
|
9
|
+
= ruby-debug
|
10
|
+
|
11
|
+
== Overview
|
12
|
+
|
13
|
+
ruby-debug is a fast implementation of the standard debugger debug.rb.
|
14
|
+
The faster execution speed is achieved by utilizing a new hook in the
|
15
|
+
Ruby C API.
|
16
|
+
|
17
|
+
== Requirements
|
18
|
+
|
19
|
+
ruby-debug requires Ruby 1.8.4 or higher.
|
20
|
+
|
21
|
+
Unless you get the packages as a binary (Microsoft Windows binaries
|
22
|
+
are sometimes available), you'll need a C compiler and Ruby
|
23
|
+
development headers, and a Make program so the extension in
|
24
|
+
ruby-debug-base can be compiled when it is installed.
|
25
|
+
|
26
|
+
To install on Microsoft Windows, unless you run under cygwin or mingw
|
27
|
+
you'll need Microsoft Visual C++ 6.0 also known as VC6.
|
28
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=16774&group_id=1900&atid=7436
|
29
|
+
suggests why.
|
30
|
+
|
31
|
+
|
32
|
+
== Install
|
33
|
+
|
34
|
+
ruby-debug is provided as a RubyGem. To install:
|
35
|
+
|
36
|
+
<tt>gem install ruby-debug</tt>
|
37
|
+
|
38
|
+
This should also pull in <tt>ruby-debug-base</tt> as a dependency.
|
39
|
+
|
40
|
+
(If you install ruby-debug-base explicitly, you can add in the <tt>--test</tt>
|
41
|
+
option after "install" to have the regression test run before
|
42
|
+
installing.)
|
43
|
+
|
44
|
+
For Emacs support and the Reference Manual, get
|
45
|
+
<tt>ruby-debug-extra</tt>. This is not a RubyGem, you'll need a Make
|
46
|
+
program and a POSIX shell. With this installed, run:
|
47
|
+
|
48
|
+
sh ./configure
|
49
|
+
make
|
50
|
+
make test # optional, but a good idea
|
51
|
+
sudo make install
|
52
|
+
|
53
|
+
|
54
|
+
==== Install on MS Windows
|
55
|
+
|
56
|
+
Compiling under cygwin or mingw works like it does on Unix.
|
57
|
+
|
58
|
+
* Have Microsoft Visual C++ 6.0 (VC6) installed - exactly that version.
|
59
|
+
|
60
|
+
* Set the appropriate environment variables.
|
61
|
+
|
62
|
+
* run `nmake'.
|
63
|
+
|
64
|
+
* Copy ruby_debug.so to `win32'.
|
65
|
+
|
66
|
+
* Go to the ruby_debug root.
|
67
|
+
|
68
|
+
* rake win32_gem
|
69
|
+
|
70
|
+
* The file is in named `rdebug-debug-base-0.10.0-mswin32.gem'.
|
71
|
+
|
72
|
+
== Usage
|
73
|
+
|
74
|
+
There are two ways of running ruby-debug.
|
75
|
+
|
76
|
+
=== rdebug executable:
|
77
|
+
|
78
|
+
$ rdebug <your-script>
|
79
|
+
|
80
|
+
When you start your script this way, the debugger will stop at
|
81
|
+
the first line of code in the script file. So you will be able
|
82
|
+
to set up your breakpoints.
|
83
|
+
|
84
|
+
=== ruby-debug API
|
85
|
+
|
86
|
+
The second way is to use the ruby-debug API to interrupt your
|
87
|
+
code execution at run time.
|
88
|
+
|
89
|
+
require 'ruby-debug' ; Debugger.start
|
90
|
+
...
|
91
|
+
def your_method
|
92
|
+
...
|
93
|
+
debugger
|
94
|
+
...
|
95
|
+
end
|
96
|
+
|
97
|
+
or
|
98
|
+
|
99
|
+
require 'ruby-debug' ;
|
100
|
+
Debugger.start do
|
101
|
+
...
|
102
|
+
debugger
|
103
|
+
end
|
104
|
+
|
105
|
+
When Kernel#debugger method is executed, the debugger is activated
|
106
|
+
and you will be able to inspect and step through your code.
|
107
|
+
|
108
|
+
== Performance
|
109
|
+
|
110
|
+
The <tt>debug.rb</tt> script that comes with the standard Ruby library uses
|
111
|
+
<tt>Kernel#set_trace_func</tt> API. Implementing the debugger in pure Ruby has
|
112
|
+
a negative impact on the speed of your program execution. This is
|
113
|
+
because the Ruby interpreter creates a Binding object each trace call,
|
114
|
+
even though it is not being used most of the time. ruby-debug moves
|
115
|
+
most of the functionality for Binding access and for breakpoint
|
116
|
+
testing to a native extension. Because this code is in C and because
|
117
|
+
and can be selectively enabled or disabled, the overhead in running
|
118
|
+
your program can be minimized.
|
119
|
+
|
120
|
+
== License
|
121
|
+
|
122
|
+
See LICENSE for license information.
|
data/README.md
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
## Description
|
2
|
+
|
3
|
+
debugger2 is a fork of [debugger] (https://github.com/cldwalker/debugger) for Ruby 2.0.
|
4
|
+
|
5
|
+
It uses only external C-APIs. Not of Ruby core sources.
|
6
|
+
|
7
|
+
(and debugger is a fork of ruby-debug(19) that works on 1.9.2 and 1.9.3 and installs easily for rvm/rbenv rubies :)
|
8
|
+
|
9
|
+
I want to merge original debugger if it has no problem. So debugger2 may be obsolete. Feel free to give us your comments.
|
10
|
+
|
11
|
+
## Install
|
12
|
+
|
13
|
+
First clone this repository:
|
14
|
+
|
15
|
+
```shell
|
16
|
+
git clone git@github.com:ko1/debugger2.git
|
17
|
+
```
|
18
|
+
|
19
|
+
Next, compile the extension:
|
20
|
+
|
21
|
+
```shell
|
22
|
+
rake compile
|
23
|
+
```
|
24
|
+
|
25
|
+
Build the gem package and install it:
|
26
|
+
|
27
|
+
```shell
|
28
|
+
gem build debugger2.gemspec
|
29
|
+
gem install debugger-1.0.0.gem
|
30
|
+
```
|
31
|
+
|
32
|
+
## Supported Rubies
|
33
|
+
|
34
|
+
Ruby 2.0.0 or later.
|
35
|
+
|
36
|
+
## Usage
|
37
|
+
|
38
|
+
Wherever you need a debugger, simply:
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
require 'debugger'; debugger
|
42
|
+
```
|
43
|
+
|
44
|
+
To use with bundler, drop in your Gemfile:
|
45
|
+
|
46
|
+
gem 'debugger2', :git => "git://github.com/ko1/debugger2.git"
|
47
|
+
|
48
|
+
### Configuration
|
49
|
+
|
50
|
+
At initialization time, debugger loads config files, executing their lines
|
51
|
+
as if they were actual commands a user has typed. config files are loaded
|
52
|
+
from two locations:
|
53
|
+
|
54
|
+
* ~/.rdebugrc (~/rdebug.ini for windows)
|
55
|
+
* $PWD/.rdebugrc ($PWD/rdebug.ini for windows)
|
56
|
+
|
57
|
+
Here's a common configuration (yeah, I should make this the default):
|
58
|
+
|
59
|
+
set autolist
|
60
|
+
set autoeval
|
61
|
+
set autoreload
|
62
|
+
|
63
|
+
To see debugger's current settings, use the `set` command.
|
64
|
+
|
65
|
+
### Using Commands
|
66
|
+
|
67
|
+
For a list of commands:
|
68
|
+
|
69
|
+
(rdb: 1) help
|
70
|
+
|
71
|
+
Most commands are described in rdebug's man page
|
72
|
+
|
73
|
+
$ gem install gem-man
|
74
|
+
$ man rdebug
|
75
|
+
|
76
|
+
### More documentation
|
77
|
+
|
78
|
+
I forked this project from <https://github.com/cldwalker/debugger>.
|
79
|
+
Maybe it can work same as `debugger'.
|
80
|
+
However, now don't support `post-motem' mode and `threading'.
|
81
|
+
|
82
|
+
Please give us your feedback.
|
83
|
+
|
84
|
+
## Reason for Fork
|
85
|
+
|
86
|
+
Ruby 2.0.0 has debugger support API. No need to install internal headers.
|
87
|
+
|
88
|
+
## Issues
|
89
|
+
Please report them [on github](http://github.com/ko1/debugger2/issues).
|
90
|
+
|
91
|
+
## Credits
|
92
|
+
|
93
|
+
All ruby's debugger programmers.
|
94
|
+
|
95
|
+
Quote from [original README.md] (https://github.com/cldwalker/debugger/blob/master/README.md).
|
96
|
+
|
97
|
+
* Thanks to the original authors: Kent Sibilev and Mark Moseley
|
98
|
+
* Thanks to astashov for bringing in a new and improved test suite and various bug fixes.
|
99
|
+
* Thanks to windwiny for porting to 2.0.0
|
100
|
+
* Contributors: ericpromislow, jnimety, adammck, hipe, FooBarWidget, aghull
|
101
|
+
* Fork started on awesome @relevance fridays!
|
102
|
+
|
103
|
+
And I want to say thank you to Asakusa.rb members. They tell me a lot of things, such as how to use github, and so on :).
|
104
|
+
|
105
|
+
## TODO
|
106
|
+
|
107
|
+
* Collect feedback.
|
108
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# -*- Ruby -*-
|
2
|
+
require 'rubygems/package_task'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/extensiontask'
|
5
|
+
|
6
|
+
Rake::ExtensionTask.new('ruby_debug')
|
7
|
+
|
8
|
+
SO_NAME = "ruby_debug.so"
|
9
|
+
|
10
|
+
desc "Run new MiniTest tests."
|
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
|
+
desc "Create the core ruby-debug shared library extension"
|
22
|
+
task :lib do
|
23
|
+
Dir.chdir("ext") do
|
24
|
+
system("#{Gem.ruby} extconf.rb && make")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Compile Emacs code"
|
29
|
+
task :emacs => "emacs/rdebug.elc"
|
30
|
+
file "emacs/rdebug.elc" => ["emacs/elisp-comp", "emacs/rdebug.el"] do
|
31
|
+
Dir.chdir("emacs") do
|
32
|
+
system("./elisp-comp ./rdebug.el")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
base_spec = eval(File.read('debugger2.gemspec'), binding, 'debugger2.gemspec')
|
37
|
+
# Rake task to build the default package
|
38
|
+
Gem::PackageTask.new(base_spec) do |pkg|
|
39
|
+
pkg.need_tar = true
|
40
|
+
end
|
41
|
+
|
42
|
+
# Windows specification
|
43
|
+
win_spec = base_spec.clone
|
44
|
+
win_spec.extensions = []
|
45
|
+
## win_spec.platform = Gem::Platform::WIN32 # deprecated
|
46
|
+
win_spec.platform = 'mswin32'
|
47
|
+
win_spec.files += ["lib/#{SO_NAME}"]
|
48
|
+
|
49
|
+
desc "Create Windows Gem"
|
50
|
+
task :win32_gem do
|
51
|
+
# Copy the win32 extension the top level directory
|
52
|
+
current_dir = File.expand_path(File.dirname(__FILE__))
|
53
|
+
source = File.join(current_dir, "ext", "win32", SO_NAME)
|
54
|
+
target = File.join(current_dir, "lib", SO_NAME)
|
55
|
+
cp(source, target)
|
56
|
+
|
57
|
+
# Create the gem, then move it to pkg.
|
58
|
+
Gem::Builder.new(win_spec).build
|
59
|
+
gem_file = "#{win_spec.name}-#{win_spec.version}-#{win_spec.platform}.gem"
|
60
|
+
mv(gem_file, "pkg/#{gem_file}")
|
61
|
+
|
62
|
+
# Remove win extension from top level directory.
|
63
|
+
rm(target)
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "Remove built files"
|
67
|
+
task :clean do
|
68
|
+
cd "ext" do
|
69
|
+
if File.exists?("Makefile")
|
70
|
+
sh "make clean"
|
71
|
+
rm "Makefile"
|
72
|
+
end
|
73
|
+
derived_files = Dir.glob(".o") + Dir.glob("*.so")
|
74
|
+
rm derived_files unless derived_files.empty?
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
task :default => :test
|
data/bin/rdebug
ADDED
@@ -0,0 +1,397 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#=== Summary
|
4
|
+
#
|
5
|
+
#A command-line front-end to the Ruby debugger, <tt>debugger</tt>, the
|
6
|
+
#Fast Ruby Debugger.
|
7
|
+
#
|
8
|
+
#Command invocation:
|
9
|
+
#
|
10
|
+
# rdebug [options] [--] [script-options] ruby-script-to-debug
|
11
|
+
# rdebug [options] [script-options] [--client]
|
12
|
+
# rdebug [--version | --help]
|
13
|
+
#
|
14
|
+
#=== Options
|
15
|
+
#
|
16
|
+
#<tt>-A | --annotate</tt> <i>level</i>::
|
17
|
+
# Set gdb-style annotation to <i>level</i>, a number. Additional
|
18
|
+
# information is output automatically when program state is
|
19
|
+
# changed. This can be used by front-ends such as GNU Emacs to post
|
20
|
+
# this updated information without having to poll for it.
|
21
|
+
#
|
22
|
+
#<tt>--client</tt>::
|
23
|
+
# Connect to a remote debugger. Used with another rdebug invocation
|
24
|
+
# using <tt>--server</tt>. See also <tt>--host</tt> and
|
25
|
+
# <tt>--cport</tt> options
|
26
|
+
#
|
27
|
+
#<tt>--cport=</tt><i>port</i>::
|
28
|
+
# Use port <i>port</i> for access to debugger control.
|
29
|
+
#
|
30
|
+
#<tt>-d | --debug</tt>::
|
31
|
+
# Set $DEBUG true.
|
32
|
+
#
|
33
|
+
#<tt>--emacs</tt>::
|
34
|
+
# Activates full GNU Emacs mode. Is the equivalent of setting the
|
35
|
+
# options <tt>--emacs-basic --annotate=3 --no-stop --no-control
|
36
|
+
# --post-mortem</tt>.
|
37
|
+
#
|
38
|
+
#<tt>--emacs-basic</tt>::
|
39
|
+
# Activates GNU Emacs mode. Debugger prompts are prefaced with two
|
40
|
+
# octal 032 characters.
|
41
|
+
#
|
42
|
+
#<tt>-h | --host=</tt><i>host</i>::
|
43
|
+
# Use host name <i>host</i> for remote debugging.
|
44
|
+
#
|
45
|
+
#<tt>-I | --include</tt> <i>path</i>
|
46
|
+
# Add <i>path</i> to <tt>$LOAD_PATH</tt>
|
47
|
+
#
|
48
|
+
#<tt>-m | --post-mortem</tt>::
|
49
|
+
# Activate post-mortem mode.
|
50
|
+
#
|
51
|
+
#<tt>--no-control</tt>::
|
52
|
+
# Do not automatically start control thread.
|
53
|
+
#
|
54
|
+
#<tt>--no-stop</tt>::
|
55
|
+
# Do not stop when script is loaded.
|
56
|
+
#
|
57
|
+
#<tt>-p | --port=PORT</tt>::
|
58
|
+
# Host name used for remote debugging.
|
59
|
+
#
|
60
|
+
#<tt>-r | --require</tt><i>script</i>::
|
61
|
+
# Require the library, before executing your script.
|
62
|
+
#
|
63
|
+
#<tt>--script</tt> <i>file</i>::
|
64
|
+
# Run debugger script file <i>file</i>
|
65
|
+
#
|
66
|
+
#<tt>-x | --trace</tt>::
|
67
|
+
# Show lines before executing them.
|
68
|
+
#
|
69
|
+
#<tt>--no-quit</tt>::
|
70
|
+
# Do not quit when script terminates. Instead rerun the
|
71
|
+
# program.
|
72
|
+
#
|
73
|
+
#<tt>--version</tt>::
|
74
|
+
# Show the version number and exit.
|
75
|
+
#
|
76
|
+
#<tt>--verbose</tt>::
|
77
|
+
# Turn on verbose mode.
|
78
|
+
#
|
79
|
+
#<tt>--v</tt>::
|
80
|
+
# Print the version number, then turn on verbose mode if
|
81
|
+
# a script name is given. If no script name is given
|
82
|
+
# just exit after printing the version number.
|
83
|
+
#
|
84
|
+
#<tt>--nx</tt>::
|
85
|
+
# Don’t execute commands found in any initialization
|
86
|
+
# files, e.g. <tt>.rdebugrc</tt>.
|
87
|
+
#
|
88
|
+
#<tt>--keep-frame-binding</tt>::
|
89
|
+
# Keep frame bindings.
|
90
|
+
#
|
91
|
+
#<tt>--script=</tt><i>file</i>::
|
92
|
+
# Name of the script file to run
|
93
|
+
#
|
94
|
+
#<tt>-s | --server</tt>::
|
95
|
+
# Listen for remote connections. Another rdebug session
|
96
|
+
# accesses using the <tt>--client</tt> option. See also the
|
97
|
+
# <tt>--host</tt>, <tt>--port</tt> and <tt>--cport</tt> options
|
98
|
+
#
|
99
|
+
#<tt>-w | --wait</tt>::
|
100
|
+
# Wait for a client connection; implies <tt>-s</tt> option.
|
101
|
+
#
|
102
|
+
#<tt>--help</tt>::
|
103
|
+
# Show invocation help and exit.
|
104
|
+
|
105
|
+
require 'optparse'
|
106
|
+
require 'ostruct'
|
107
|
+
require 'debugger'
|
108
|
+
|
109
|
+
def debug_program(options)
|
110
|
+
# Make sure Ruby script syntax checks okay.
|
111
|
+
# Otherwise we get a load message that looks like rdebug has
|
112
|
+
# a problem.
|
113
|
+
output = `ruby -c "#{Debugger::PROG_SCRIPT}" 2>&1`
|
114
|
+
if $?.exitstatus != 0 and RUBY_PLATFORM !~ /mswin/
|
115
|
+
puts output
|
116
|
+
exit $?.exitstatus
|
117
|
+
end
|
118
|
+
print "\032\032starting\n" if Debugger.annotate and Debugger.annotate > 2
|
119
|
+
|
120
|
+
# Record where we are we can know if the call stack has been
|
121
|
+
# truncated or not.
|
122
|
+
Debugger.start_sentinal=caller(0)[1]
|
123
|
+
|
124
|
+
bt = Debugger.debug_load(Debugger::PROG_SCRIPT, options.stop, false)
|
125
|
+
if bt
|
126
|
+
print bt.backtrace.map{|l| "\t#{l}"}.join("\n"), "\n"
|
127
|
+
print "Uncaught exception: #{bt}\n"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# Do a shell-like path lookup for prog_script and return the results.
|
132
|
+
# If we can't find anything return prog_script.
|
133
|
+
def whence_file(prog_script)
|
134
|
+
if prog_script.index(File::SEPARATOR)
|
135
|
+
# Don't search since this name has path separator components
|
136
|
+
return prog_script
|
137
|
+
end
|
138
|
+
for dirname in ENV['PATH'].split(File::PATH_SEPARATOR) do
|
139
|
+
prog_script_try = File.join(dirname, prog_script)
|
140
|
+
return prog_script_try if File.exist?(prog_script_try)
|
141
|
+
end
|
142
|
+
# Failure
|
143
|
+
return prog_script
|
144
|
+
end
|
145
|
+
|
146
|
+
options = OpenStruct.new(
|
147
|
+
'annotate' => Debugger.annotate,
|
148
|
+
'client' => false,
|
149
|
+
'control' => true,
|
150
|
+
'cport' => Debugger::PORT + 1,
|
151
|
+
'host' => nil,
|
152
|
+
'quit' => true,
|
153
|
+
'no_rewrite_program' => false,
|
154
|
+
'stop' => true,
|
155
|
+
'nx' => false,
|
156
|
+
'port' => Debugger::PORT,
|
157
|
+
'restart_script' => nil,
|
158
|
+
'script' => nil,
|
159
|
+
'server' => false,
|
160
|
+
'tracing' => false,
|
161
|
+
'verbose_long' => false,
|
162
|
+
'wait' => false
|
163
|
+
)
|
164
|
+
|
165
|
+
def process_options(options)
|
166
|
+
program = File.basename($0)
|
167
|
+
opts = OptionParser.new do |opts|
|
168
|
+
opts.banner = <<EOB
|
169
|
+
#{program} #{Debugger::VERSION}
|
170
|
+
Usage: #{program} [options] <script.rb> -- <script.rb parameters>
|
171
|
+
EOB
|
172
|
+
opts.separator ""
|
173
|
+
opts.separator "Options:"
|
174
|
+
opts.on("-A", "--annotate LEVEL", Integer, "Set annotation level") do
|
175
|
+
|annotate|
|
176
|
+
Debugger.annotate = annotate
|
177
|
+
end
|
178
|
+
opts.on("-c", "--client", "Connect to remote debugger") do
|
179
|
+
options.client = true
|
180
|
+
end
|
181
|
+
opts.on("--cport PORT", Integer, "Port used for control commands") do
|
182
|
+
|cport|
|
183
|
+
options.cport = cport
|
184
|
+
end
|
185
|
+
opts.on("-d", "--debug", "Set $DEBUG=true") {$DEBUG = true}
|
186
|
+
opts.on("--emacs LEVEL", Integer,
|
187
|
+
"Activates full Emacs support at annotation level LEVEL") do
|
188
|
+
|level|
|
189
|
+
Debugger.annotate = level.to_i
|
190
|
+
ENV['EMACS'] = '1'
|
191
|
+
ENV['COLUMNS'] = '120' if ENV['COLUMNS'].to_i < 120
|
192
|
+
options.control = false
|
193
|
+
options.quit = false
|
194
|
+
end
|
195
|
+
opts.on('--emacs-basic', 'Activates basic Emacs mode') do
|
196
|
+
ENV['EMACS'] = '1'
|
197
|
+
end
|
198
|
+
opts.on('-h', '--host HOST', 'Host name used for remote debugging') do
|
199
|
+
|host|
|
200
|
+
options.host = host
|
201
|
+
end
|
202
|
+
opts.on('-I', '--include PATH', String, 'Add PATH to $LOAD_PATH') do |path|
|
203
|
+
$LOAD_PATH.unshift(path)
|
204
|
+
end
|
205
|
+
opts.on('--no-control', 'Do not automatically start control thread') do
|
206
|
+
options.control = false
|
207
|
+
end
|
208
|
+
opts.on('--no-quit', 'Do not quit when script finishes') do
|
209
|
+
options.quit = false
|
210
|
+
end
|
211
|
+
opts.on('--no-rewrite-program',
|
212
|
+
'Do not set $0 to the program being debugged') do
|
213
|
+
options.no_rewrite_program = true
|
214
|
+
end
|
215
|
+
opts.on('--no-stop', 'Do not stop when script is loaded') do
|
216
|
+
options.stop = false
|
217
|
+
end
|
218
|
+
opts.on('-nx', 'Not run debugger initialization files (e.g. .rdebugrc') do
|
219
|
+
options.nx = true
|
220
|
+
end
|
221
|
+
opts.on('-p', '--port PORT', Integer, 'Port used for remote debugging') do
|
222
|
+
|port|
|
223
|
+
options.port = port
|
224
|
+
end
|
225
|
+
opts.on('-r', '--require SCRIPT', String,
|
226
|
+
'Require the library, before executing your script') do |name|
|
227
|
+
if name == 'debug'
|
228
|
+
puts "debugger is not compatible with Ruby's 'debug' library. This option is ignored."
|
229
|
+
else
|
230
|
+
require name
|
231
|
+
end
|
232
|
+
end
|
233
|
+
opts.on('--restart-script FILE', String,
|
234
|
+
'Name of the script file to run. Erased after read') do
|
235
|
+
|restart_script|
|
236
|
+
options.restart_script = restart_script
|
237
|
+
unless File.exists?(options.restart_script)
|
238
|
+
puts "Script file '#{options.restart_script}' is not found"
|
239
|
+
exit
|
240
|
+
end
|
241
|
+
end
|
242
|
+
opts.on('--script FILE', String, 'Name of the script file to run') do
|
243
|
+
|script|
|
244
|
+
options.script = script
|
245
|
+
unless File.exists?(options.script)
|
246
|
+
puts "Script file '#{options.script}' is not found"
|
247
|
+
exit
|
248
|
+
end
|
249
|
+
end
|
250
|
+
opts.on('-s', '--server', 'Listen for remote connections') do
|
251
|
+
options.server = true
|
252
|
+
end
|
253
|
+
opts.on('-w', '--wait', 'Wait for a client connection, implies -s option') do
|
254
|
+
options.wait = true
|
255
|
+
end
|
256
|
+
opts.on('-x', '--trace', 'Turn on line tracing') {options.tracing = true}
|
257
|
+
opts.separator ''
|
258
|
+
opts.separator 'Common options:'
|
259
|
+
opts.on_tail('--help', 'Show this message') do
|
260
|
+
puts opts
|
261
|
+
exit
|
262
|
+
end
|
263
|
+
opts.on_tail('--version',
|
264
|
+
'Print the version') do
|
265
|
+
puts "debugger #{Debugger::VERSION}"
|
266
|
+
exit
|
267
|
+
end
|
268
|
+
opts.on('--verbose', 'Turn on verbose mode') do
|
269
|
+
$VERBOSE = true
|
270
|
+
options.verbose_long = true
|
271
|
+
end
|
272
|
+
opts.on_tail('-v',
|
273
|
+
'Print version number, then turn on verbose mode') do
|
274
|
+
puts "debugger #{Debugger::VERSION}"
|
275
|
+
$VERBOSE = true
|
276
|
+
end
|
277
|
+
end
|
278
|
+
return opts
|
279
|
+
end
|
280
|
+
|
281
|
+
# What file is used for debugger startup commands.
|
282
|
+
unless defined?(OPTS_INITFILE)
|
283
|
+
if RUBY_PLATFORM =~ /mswin/
|
284
|
+
# Of course MS Windows has to be different
|
285
|
+
OPTS_INITFILE = 'rdbopt.ini'
|
286
|
+
HOME_DIR = (ENV['HOME'] ||
|
287
|
+
ENV['HOMEDRIVE'].to_s + ENV['HOMEPATH'].to_s).to_s
|
288
|
+
else
|
289
|
+
OPTS_INITFILE = '.rdboptrc'
|
290
|
+
HOME_DIR = ENV['HOME'].to_s
|
291
|
+
end
|
292
|
+
end
|
293
|
+
begin
|
294
|
+
initfile = File.join(HOME_DIR, OPTS_INITFILE)
|
295
|
+
eval(File.read(initfile)) if
|
296
|
+
File.exist?(initfile)
|
297
|
+
rescue
|
298
|
+
end
|
299
|
+
|
300
|
+
opts = process_options(options)
|
301
|
+
begin
|
302
|
+
if not defined? Debugger::ARGV
|
303
|
+
Debugger::ARGV = ARGV.clone
|
304
|
+
end
|
305
|
+
rdebug_path = File.expand_path($0)
|
306
|
+
if RUBY_PLATFORM =~ /mswin/
|
307
|
+
rdebug_path += '.cmd' unless rdebug_path =~ /\.cmd$/i
|
308
|
+
end
|
309
|
+
Debugger::RDEBUG_SCRIPT = rdebug_path
|
310
|
+
Debugger::RDEBUG_FILE = __FILE__
|
311
|
+
Debugger::INITIAL_DIR = Dir.pwd
|
312
|
+
opts.parse! ARGV
|
313
|
+
rescue StandardError => e
|
314
|
+
puts opts
|
315
|
+
puts
|
316
|
+
puts e.message
|
317
|
+
exit(-1)
|
318
|
+
end
|
319
|
+
|
320
|
+
if options.client
|
321
|
+
Debugger.start_client(options.host, options.port)
|
322
|
+
else
|
323
|
+
if ARGV.empty?
|
324
|
+
exit if $VERBOSE and not options.verbose_long
|
325
|
+
puts opts
|
326
|
+
puts
|
327
|
+
puts 'Must specify a script to run'
|
328
|
+
exit(-1)
|
329
|
+
end
|
330
|
+
|
331
|
+
# save script name
|
332
|
+
prog_script = ARGV.shift
|
333
|
+
prog_script = whence_file(prog_script) unless File.exist?(prog_script)
|
334
|
+
Debugger::PROG_SCRIPT = File.expand_path prog_script
|
335
|
+
|
336
|
+
# install interruption handler
|
337
|
+
trap('INT') { Debugger.interrupt_last }
|
338
|
+
|
339
|
+
# set options
|
340
|
+
Debugger.wait_connection = options.wait
|
341
|
+
|
342
|
+
if options.server
|
343
|
+
# start remote mode
|
344
|
+
Debugger.start_remote(options.host, [options.port, options.cport]) do
|
345
|
+
# load initrc script
|
346
|
+
Debugger.run_init_script(StringIO.new) unless options.nx
|
347
|
+
end
|
348
|
+
debug_program(options)
|
349
|
+
else
|
350
|
+
# Set up trace hook for debugger
|
351
|
+
Debugger.start
|
352
|
+
# start control thread
|
353
|
+
Debugger.start_control(options.host, options.cport) if options.control
|
354
|
+
|
355
|
+
# load initrc script (e.g. .rdebugrc)
|
356
|
+
Debugger.run_init_script(StringIO.new) unless options.nx
|
357
|
+
|
358
|
+
# run restore-settings startup script if specified
|
359
|
+
if options.restart_script
|
360
|
+
require 'fileutils'
|
361
|
+
Debugger.run_script(options.restart_script)
|
362
|
+
FileUtils.rm(options.restart_script)
|
363
|
+
end
|
364
|
+
|
365
|
+
# run startup script if specified
|
366
|
+
if options.script
|
367
|
+
Debugger.run_script(options.script)
|
368
|
+
end
|
369
|
+
|
370
|
+
options.stop = false if options.tracing
|
371
|
+
Debugger.tracing = options.tracing
|
372
|
+
|
373
|
+
if !options.quit
|
374
|
+
if Debugger.started?
|
375
|
+
until Debugger.stop do end
|
376
|
+
end
|
377
|
+
begin
|
378
|
+
debug_program(options)
|
379
|
+
rescue SyntaxError
|
380
|
+
puts $!.backtrace.map{|l| "\t#{l}"}.join("\n")
|
381
|
+
puts "Uncaught Syntax Error\n"
|
382
|
+
rescue
|
383
|
+
print $!.backtrace.map{|l| "\t#{l}"}.join("\n"), "\n"
|
384
|
+
print "Uncaught exception: #{$!}\n"
|
385
|
+
end
|
386
|
+
print "The program finished.\n" unless
|
387
|
+
Debugger.annotate.to_i > 1 # annotate has its own way
|
388
|
+
interface = Debugger::LocalInterface.new
|
389
|
+
# Not sure if ControlCommandProcessor is really the right
|
390
|
+
# thing to use. CommandProcessor requires a state.
|
391
|
+
processor = Debugger::ControlCommandProcessor.new(interface)
|
392
|
+
processor.process_commands
|
393
|
+
else
|
394
|
+
debug_program(options)
|
395
|
+
end
|
396
|
+
end
|
397
|
+
end
|