needy_debugger 1.4.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/.gitignore +14 -0
- data/.travis.yml +8 -0
- data/AUTHORS +10 -0
- data/CHANGELOG.md +68 -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 +141 -0
- data/Rakefile +78 -0
- data/bin/rdebug +397 -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/192/breakpoint.c +586 -0
- data/ext/ruby_debug/192/ruby_debug.c +2645 -0
- data/ext/ruby_debug/192/ruby_debug.h +148 -0
- data/ext/ruby_debug/193/breakpoint.c +586 -0
- data/ext/ruby_debug/193/ruby_debug.c +2626 -0
- data/ext/ruby_debug/193/ruby_debug.h +148 -0
- data/ext/ruby_debug/200/breakpoint.c +586 -0
- data/ext/ruby_debug/200/ruby_debug.c +2692 -0
- data/ext/ruby_debug/200/ruby_debug.h +148 -0
- data/ext/ruby_debug/extconf.rb +94 -0
- data/lib/debugger.rb +5 -0
- data/lib/debugger/version.rb +5 -0
- data/lib/ruby-debug-base.rb +305 -0
- data/lib/ruby-debug.rb +177 -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 +50 -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/needy_debugger.gemspec +31 -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 +365 -0
- data/test/conditions_test.rb +76 -0
- data/test/continue_test.rb +28 -0
- data/test/display_test.rb +141 -0
- data/test/edit_test.rb +55 -0
- data/test/eval_test.rb +92 -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 +48 -0
- data/test/frame_test.rb +140 -0
- data/test/help_test.rb +50 -0
- data/test/info_test.rb +325 -0
- data/test/irb_test.rb +81 -0
- data/test/jump_test.rb +70 -0
- data/test/kill_test.rb +47 -0
- data/test/list_test.rb +145 -0
- data/test/method_test.rb +70 -0
- data/test/post_mortem_test.rb +25 -0
- data/test/quit_test.rb +55 -0
- data/test/reload_test.rb +43 -0
- data/test/restart_test.rb +143 -0
- data/test/save_test.rb +92 -0
- data/test/set_test.rb +177 -0
- data/test/show_test.rb +292 -0
- data/test/source_test.rb +44 -0
- data/test/stepping_test.rb +118 -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 +205 -0
- data/test/support/test_interface.rb +66 -0
- data/test/test_helper.rb +8 -0
- data/test/thread_test.rb +122 -0
- data/test/tmate_test.rb +43 -0
- data/test/trace_test.rb +154 -0
- data/test/variables_test.rb +114 -0
- metadata +352 -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,141 @@
|
|
1
|
+
## Description
|
2
|
+
A fork of ruby-debug(19) that works on 1.9.2 and 1.9.3 and installs easily for rvm/rbenv rubies.
|
3
|
+
|
4
|
+
[](https://travis-ci.org/cldwalker/debugger)
|
5
|
+
|
6
|
+
## Install
|
7
|
+
|
8
|
+
$ gem install debugger
|
9
|
+
|
10
|
+
# If install fails, try passing headers path
|
11
|
+
$ gem install debugger -- --with-ruby-include=PATH_TO_HEADERS
|
12
|
+
|
13
|
+
For Windows install instructions, see OLD\_README.
|
14
|
+
|
15
|
+
|
16
|
+
## Supported Rubies
|
17
|
+
On install, debugger tries to find your ruby's headers. If it's unable to find them and your ruby is
|
18
|
+
a patch release, it will use headers included with
|
19
|
+
[debugger-ruby_core_source](https://github.com/cldwalker/debugger-ruby_core_source). For the list
|
20
|
+
of rubies supported by debugger [see
|
21
|
+
here](https://github.com/cldwalker/debugger-ruby_core_source/tree/master/lib/debugger/ruby_core_source).
|
22
|
+
*If your ruby is not an official patch release i.e. head, dev or an rc, you are responsible for
|
23
|
+
having headers and setting them with --with-ruby-include.*
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
Wherever you need a debugger, simply:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
require 'debugger'; debugger
|
31
|
+
```
|
32
|
+
|
33
|
+
To use with bundler, drop in your Gemfile:
|
34
|
+
|
35
|
+
gem 'debugger'
|
36
|
+
|
37
|
+
### Configuration
|
38
|
+
|
39
|
+
At initialization time, debugger loads config files, executing their lines
|
40
|
+
as if they were actual commands a user has typed. config files are loaded
|
41
|
+
from two locations:
|
42
|
+
|
43
|
+
* ~/.rdebugrc (~/rdebug.ini for windows)
|
44
|
+
* $PWD/.rdebugrc ($PWD/rdebug.ini for windows)
|
45
|
+
|
46
|
+
Here's a common configuration (yeah, I should make this the default):
|
47
|
+
|
48
|
+
set autolist
|
49
|
+
set autoeval
|
50
|
+
set autoreload
|
51
|
+
|
52
|
+
To see debugger's current settings, use the `set` command.
|
53
|
+
|
54
|
+
### Using Commands
|
55
|
+
|
56
|
+
For a list of commands:
|
57
|
+
|
58
|
+
(rdb: 1) help
|
59
|
+
|
60
|
+
Most commands are described in rdebug's man page
|
61
|
+
|
62
|
+
$ gem install gem-man
|
63
|
+
$ man rdebug
|
64
|
+
|
65
|
+
### More documentation
|
66
|
+
|
67
|
+
Some thorough documentation of debugger is found with [this bashdb
|
68
|
+
tutorial](http://bashdb.sourceforge.net/ruby-debug.html). For emacs and debugger
|
69
|
+
usage, see [another bashdb
|
70
|
+
tutorial](http://bashdb.sourceforge.net/ruby-debug/rdebug-emacs.html)
|
71
|
+
|
72
|
+
## Reason for Fork
|
73
|
+
|
74
|
+
* ruby-debug19 maintainer isn't maintaining:
|
75
|
+
* Despite patches from ruby core, no gem release in 2+ years! - 9/1/09.
|
76
|
+
* Requests to release a known working 1.9.3 version have been ignored.
|
77
|
+
* Doesn't respond to rubyforge issues and doesn't have github issues open.
|
78
|
+
* Current install is painful. Requires either [manually downloading gems from rubyforge](
|
79
|
+
http://blog.wyeworks.com/2011/11/1/ruby-1-9-3-and-ruby-debug) and installing with compiler flags
|
80
|
+
or [recompiling
|
81
|
+
ruby](http://blog.sj26.com/post/12146951658/updated-using-ruby-debug-on-ruby-1-9-3-p0).
|
82
|
+
* We need a decent ruby debugger for future rubies!
|
83
|
+
|
84
|
+
## What's different from ruby-debug19
|
85
|
+
|
86
|
+
* Major
|
87
|
+
* Works on 1.9.2 and 1.9.3
|
88
|
+
* 1.9.2 points to ruby-debug-base19-0.11.25 headers
|
89
|
+
* 1.9.3 points to ruby-debug-base19-0.11.26 headers
|
90
|
+
* Install painlessly for rvm and rbenv rubies i.e. no compiler flags needed
|
91
|
+
* No downloading ruby source during install - was behavior of old ruby_core_source dependency
|
92
|
+
* Fix LocalJumpError caused by using proc in extconf.rb
|
93
|
+
* Fix where command failing at top level
|
94
|
+
* A new and improved test suite
|
95
|
+
* Passing tests are up on travis-ci
|
96
|
+
* Minor
|
97
|
+
* The gem name matches the module namespace, Debugger, and main required file, debugger.
|
98
|
+
* ruby-debug-base19 and ruby-debug19 are released as one gem
|
99
|
+
* Rake tasks have been updated
|
100
|
+
* No more $LOAD_PATH manipulation or runtime code outside of lib
|
101
|
+
* man page available via gem-man
|
102
|
+
|
103
|
+
## Issues
|
104
|
+
Please report them [on github](http://github.com/cldwalker/debugger/issues).
|
105
|
+
|
106
|
+
## Known Issues
|
107
|
+
* 2.0.0 support is only partially working and the test suite dies before it can finish.
|
108
|
+
* If you place a debugger call at the end of a block, debugging will start at the next step and
|
109
|
+
outside of your block. A simple work-around is to place a meaningless step (i.e. puts "STAY")
|
110
|
+
at the end of your block and before debugger.
|
111
|
+
|
112
|
+
## Contributing
|
113
|
+
[See here](http://tagaholic.me/contributing.html) for contribution policies.
|
114
|
+
Let's keep this working for the ruby community!
|
115
|
+
|
116
|
+
## Related projects
|
117
|
+
|
118
|
+
* [debugger-completion](https://github.com/cldwalker/debugger-completion) - autocompletion for
|
119
|
+
debugger commands and more
|
120
|
+
* [debugger-pry](https://github.com/pry/debugger-pry) - using pry within debugger
|
121
|
+
* [pry-debugger](https://github.com/nixme/pry-debugger) - using debugger within pry
|
122
|
+
* [ruby-debug-passenger](https://github.com/davejamesmiller/ruby-debug-passenger) - rake task to
|
123
|
+
restart Passenger with debugger connected
|
124
|
+
* [jruby-debug](https://github.com/jruby/jruby-debug)
|
125
|
+
* [rb-trepanning](https://github.com/rocky/rb-trepanning) - rewrite of ruby-debug that requires a
|
126
|
+
patched ruby
|
127
|
+
|
128
|
+
## Credits
|
129
|
+
|
130
|
+
* Thanks to the original authors: Kent Sibilev and Mark Moseley
|
131
|
+
* Thanks to astashov for bringing in a new and improved test suite and various bug fixes.
|
132
|
+
* Thanks to windwiny for porting to 2.0.0
|
133
|
+
* Contributors: ericpromislow, jnimety, adammck, hipe, FooBarWidget, aghull
|
134
|
+
* Fork started on awesome @relevance fridays!
|
135
|
+
|
136
|
+
## TODO
|
137
|
+
|
138
|
+
* Fix test/test-*.rb
|
139
|
+
* Port some of bashdb's docs
|
140
|
+
* Use ~/.debuggerrc and bin/debugger and gracefully deprecate rdebug*
|
141
|
+
* Work with others willing to tackle jruby, rubinius or windows support
|
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('debugger.gemspec'), binding, 'debugger.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
|