debug 1.0.0.alpha0 → 1.0.0.alpha1
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.
- checksums.yaml +4 -4
- data/README.md +4 -8
- data/lib/debug.rb +0 -14
- data/lib/debug/breakpoint.rb +97 -97
- data/lib/debug/client.rb +135 -135
- data/lib/debug/config.rb +26 -26
- data/lib/debug/repl.rb +3 -1
- data/lib/debug/server.rb +1 -1
- data/lib/debug/session.rb +15 -2
- data/lib/debug/tcpserver.rb +1 -2
- data/lib/debug/unixserver.rb +1 -2
- data/lib/debug/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c921a03e7629b04e9629e77c5c6dac3adfa4acb33f4f72d325315a358d07058c
|
4
|
+
data.tar.gz: eac06881f18621e16ac00f7ce628ff64c5aa7b60d99b725cdc30528e4c41b399
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 299218c5bbfa513df144365e8172ae270a681b3e8e0ab6b7953834d99454947c1a31ce2f6f9aa85b3ae798ac501ea8e4f8892deabf96ca835cb35112fd26a54b
|
7
|
+
data.tar.gz: cac005fa02d12e187f586b2718d27d0c1463d03219a050102c9767540692cd609666cd6ea65db83a3bda54471c4a5ff10f06e1305b8ec013d5735b2633a2eebe
|
data/README.md
CHANGED
@@ -2,16 +2,12 @@
|
|
2
2
|
|
3
3
|
## How to install
|
4
4
|
|
5
|
-
This is temporary installation guide until gemify.
|
6
|
-
|
7
5
|
```
|
8
|
-
$
|
9
|
-
$ gem install debug_inspector
|
10
|
-
$ gem install iseq_collector
|
11
|
-
$ export RUBYOPT=-I`pwd`/debug/lib
|
12
|
-
# or add "-I`pwd`/debug/lib" for the following command
|
6
|
+
$ gem install debug
|
13
7
|
```
|
14
8
|
|
9
|
+
or specify `-Ipath/to/debug/lib` in `RUBYOPT` or each ruby command-line options for development.
|
10
|
+
|
15
11
|
# How to use
|
16
12
|
|
17
13
|
## Invoke with debugger
|
@@ -19,7 +15,7 @@ $ export RUBYOPT=-I`pwd`/debug/lib
|
|
19
15
|
### REPL debug
|
20
16
|
|
21
17
|
```
|
22
|
-
$ ruby -r debug target.rb
|
18
|
+
$ ruby -r debug/repl target.rb
|
23
19
|
```
|
24
20
|
|
25
21
|
and you can see the debugger prompt. The program was suspended at the beggining of target.rb. To continue the program, type `c` (or `continue`). See other debug commands below.
|
data/lib/debug.rb
CHANGED
@@ -1,15 +1 @@
|
|
1
1
|
require_relative 'debug/repl'
|
2
|
-
|
3
|
-
# default break points
|
4
|
-
DEBUGGER__.add_catch_breakpoint 'RuntimeError'
|
5
|
-
class Binding
|
6
|
-
DEBUGGER__.add_line_breakpoint __FILE__, __LINE__ + 1
|
7
|
-
def bp; nil; end
|
8
|
-
end
|
9
|
-
|
10
|
-
if $0 == __FILE__
|
11
|
-
# DEBUGGER__.add_line_breakpoint __dir__ + '/target.rb', 1
|
12
|
-
# load __dir__ + '/target.rb'
|
13
|
-
else
|
14
|
-
DEBUGGER__.add_line_breakpoint $0, 1
|
15
|
-
end
|
data/lib/debug/breakpoint.rb
CHANGED
@@ -1,97 +1,97 @@
|
|
1
|
-
module DEBUGGER__
|
2
|
-
class LineBreakpoint
|
3
|
-
attr_reader :path, :line, :key
|
4
|
-
|
5
|
-
def initialize type, iseq, line, cond = nil, oneshot: false
|
6
|
-
@iseq = iseq
|
7
|
-
@path = iseq.path
|
8
|
-
@line = line
|
9
|
-
@type = type
|
10
|
-
@cond = cond
|
11
|
-
@oneshot = oneshot
|
12
|
-
@key = [@path, @line].freeze
|
13
|
-
setup
|
14
|
-
enable
|
15
|
-
end
|
16
|
-
|
17
|
-
def safe_eval b, expr
|
18
|
-
b.eval(expr)
|
19
|
-
rescue Exception => e
|
20
|
-
puts "[EVAL ERROR]"
|
21
|
-
puts " expr: #{expr}"
|
22
|
-
puts " err: #{e} (#{e.class})"
|
23
|
-
nil
|
24
|
-
end
|
25
|
-
|
26
|
-
def setup
|
27
|
-
if !@cond
|
28
|
-
@tp = TracePoint.new(@type) do |tp|
|
29
|
-
tp.disable if @oneshot
|
30
|
-
ThreadClient.current.on_breakpoint tp
|
31
|
-
end
|
32
|
-
else
|
33
|
-
@tp = TracePoint.new(@type) do |tp|
|
34
|
-
next unless safe_eval tp.binding, @cond
|
35
|
-
tp.disable if @oneshot
|
36
|
-
ThreadClient.current.on_breakpoint tp
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def enable
|
42
|
-
if @type == :line
|
43
|
-
@tp.enable(target: @iseq, target_line: @line)
|
44
|
-
else
|
45
|
-
@tp.enable(target: @iseq)
|
46
|
-
end
|
47
|
-
rescue ArgumentError
|
48
|
-
puts @iseq.disasm # for debug
|
49
|
-
raise
|
50
|
-
end
|
51
|
-
|
52
|
-
def disable
|
53
|
-
@tp.disable
|
54
|
-
end
|
55
|
-
|
56
|
-
def to_s
|
57
|
-
"line bp #{@iseq.absolute_path}:#{@line} (#{@type})" +
|
58
|
-
if @cond
|
59
|
-
"if #{@cond}"
|
60
|
-
else
|
61
|
-
""
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def inspect
|
66
|
-
"<#{self.class.name} #{self.to_s}>"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
class CatchBreakpoint
|
71
|
-
attr_reader :key
|
72
|
-
|
73
|
-
def initialize pat
|
74
|
-
@pat = pat
|
75
|
-
@tp = TracePoint.new(:raise){|tp|
|
76
|
-
exc = tp.raised_exception
|
77
|
-
exc.class.ancestors.each{|cls|
|
78
|
-
if pat === cls.name
|
79
|
-
puts "catch #{exc.class.inspect} by #{@pat.inspect}"
|
80
|
-
ThreadClient.current.on_suspend :catch
|
81
|
-
end
|
82
|
-
}
|
83
|
-
}
|
84
|
-
@tp.enable
|
85
|
-
|
86
|
-
@key = pat.freeze
|
87
|
-
end
|
88
|
-
|
89
|
-
def disable
|
90
|
-
@tp.disable
|
91
|
-
end
|
92
|
-
|
93
|
-
def to_s
|
94
|
-
"catch bp #{@pat.inspect}"
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
1
|
+
module DEBUGGER__
|
2
|
+
class LineBreakpoint
|
3
|
+
attr_reader :path, :line, :key
|
4
|
+
|
5
|
+
def initialize type, iseq, line, cond = nil, oneshot: false
|
6
|
+
@iseq = iseq
|
7
|
+
@path = iseq.path
|
8
|
+
@line = line
|
9
|
+
@type = type
|
10
|
+
@cond = cond
|
11
|
+
@oneshot = oneshot
|
12
|
+
@key = [@path, @line].freeze
|
13
|
+
setup
|
14
|
+
enable
|
15
|
+
end
|
16
|
+
|
17
|
+
def safe_eval b, expr
|
18
|
+
b.eval(expr)
|
19
|
+
rescue Exception => e
|
20
|
+
puts "[EVAL ERROR]"
|
21
|
+
puts " expr: #{expr}"
|
22
|
+
puts " err: #{e} (#{e.class})"
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def setup
|
27
|
+
if !@cond
|
28
|
+
@tp = TracePoint.new(@type) do |tp|
|
29
|
+
tp.disable if @oneshot
|
30
|
+
ThreadClient.current.on_breakpoint tp
|
31
|
+
end
|
32
|
+
else
|
33
|
+
@tp = TracePoint.new(@type) do |tp|
|
34
|
+
next unless safe_eval tp.binding, @cond
|
35
|
+
tp.disable if @oneshot
|
36
|
+
ThreadClient.current.on_breakpoint tp
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def enable
|
42
|
+
if @type == :line
|
43
|
+
@tp.enable(target: @iseq, target_line: @line)
|
44
|
+
else
|
45
|
+
@tp.enable(target: @iseq)
|
46
|
+
end
|
47
|
+
rescue ArgumentError
|
48
|
+
puts @iseq.disasm # for debug
|
49
|
+
raise
|
50
|
+
end
|
51
|
+
|
52
|
+
def disable
|
53
|
+
@tp.disable
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_s
|
57
|
+
"line bp #{@iseq.absolute_path}:#{@line} (#{@type})" +
|
58
|
+
if @cond
|
59
|
+
"if #{@cond}"
|
60
|
+
else
|
61
|
+
""
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def inspect
|
66
|
+
"<#{self.class.name} #{self.to_s}>"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class CatchBreakpoint
|
71
|
+
attr_reader :key
|
72
|
+
|
73
|
+
def initialize pat
|
74
|
+
@pat = pat
|
75
|
+
@tp = TracePoint.new(:raise){|tp|
|
76
|
+
exc = tp.raised_exception
|
77
|
+
exc.class.ancestors.each{|cls|
|
78
|
+
if pat === cls.name
|
79
|
+
puts "catch #{exc.class.inspect} by #{@pat.inspect}"
|
80
|
+
ThreadClient.current.on_suspend :catch
|
81
|
+
end
|
82
|
+
}
|
83
|
+
}
|
84
|
+
@tp.enable
|
85
|
+
|
86
|
+
@key = pat.freeze
|
87
|
+
end
|
88
|
+
|
89
|
+
def disable
|
90
|
+
@tp.disable
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_s
|
94
|
+
"catch bp #{@pat.inspect}"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/debug/client.rb
CHANGED
@@ -1,135 +1,135 @@
|
|
1
|
-
require 'socket'
|
2
|
-
require_relative 'config'
|
3
|
-
|
4
|
-
module DEBUGGER__
|
5
|
-
class Client
|
6
|
-
begin
|
7
|
-
require 'readline'
|
8
|
-
def readline
|
9
|
-
Readline.readline("\n(rdb) ", true)
|
10
|
-
end
|
11
|
-
rescue LoadError
|
12
|
-
def readline
|
13
|
-
print "\n(rdb) "
|
14
|
-
gets
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def help
|
19
|
-
puts "-run -e attach # connect via UNIX Domain socket"
|
20
|
-
puts "-run -e attach name # connect via UNIX Domain socket with specified name"
|
21
|
-
puts "-run -e attach port_num # connect via TCP/IP socket with specified port"
|
22
|
-
puts "-run -e attach host port_num"
|
23
|
-
puts " # connect via TCP/IP socket with specified host and port"
|
24
|
-
end
|
25
|
-
|
26
|
-
def initialize argv
|
27
|
-
case argv.size
|
28
|
-
when 0
|
29
|
-
connect_unix
|
30
|
-
when 1
|
31
|
-
case arg = argv.shift
|
32
|
-
when /-h/, /--help/
|
33
|
-
help
|
34
|
-
exit
|
35
|
-
when /\A\d+\z/
|
36
|
-
connect_tcp nil, arg.to_i
|
37
|
-
else
|
38
|
-
connect_unix arg
|
39
|
-
end
|
40
|
-
when 2
|
41
|
-
connect_tcp argv[0], argv[1]
|
42
|
-
else
|
43
|
-
help
|
44
|
-
exit!
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def cleanup_unix_domain_sockets
|
49
|
-
Dir.glob(DEBUGGER__.create_unix_domain_socket_name_prefix + '*') do |file|
|
50
|
-
if /(\d+)$/ =~ file
|
51
|
-
begin
|
52
|
-
Process.kill(0, $1.to_i)
|
53
|
-
rescue Errno::ESRCH
|
54
|
-
File.unlink(file)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def connect_unix name = nil
|
61
|
-
if name
|
62
|
-
if File.exist? name
|
63
|
-
@s = Socket.unix(name)
|
64
|
-
else
|
65
|
-
@s = Socket.unix(File.join(DEBUGGER__.unix_domain_socket_basedir, name))
|
66
|
-
end
|
67
|
-
else
|
68
|
-
cleanup_unix_domain_sockets
|
69
|
-
files = Dir.glob(DEBUGGER__.create_unix_domain_socket_name_prefix + '*')
|
70
|
-
case files.size
|
71
|
-
when 0
|
72
|
-
$stderr.puts "There is no debug sessions."
|
73
|
-
exit
|
74
|
-
when 1
|
75
|
-
@s = Socket.unix(files.first)
|
76
|
-
else
|
77
|
-
$stderr.puts "Please select a debug session:"
|
78
|
-
files.each{|f|
|
79
|
-
$stderr.puts " #{File.basename(f)}"
|
80
|
-
}
|
81
|
-
exit
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def connect_tcp host, port
|
87
|
-
@s = Socket.tcp(host, port)
|
88
|
-
end
|
89
|
-
|
90
|
-
def connect
|
91
|
-
trap(:SIGINT){
|
92
|
-
@s.puts "pause"
|
93
|
-
}
|
94
|
-
|
95
|
-
while line = @s.gets
|
96
|
-
# p line: line
|
97
|
-
case line
|
98
|
-
when /^out (.*)/
|
99
|
-
puts "#{$1}"
|
100
|
-
when /^input/
|
101
|
-
prev_trap = trap(:SIGINT, 'DEFAULT')
|
102
|
-
|
103
|
-
begin
|
104
|
-
line = readline
|
105
|
-
rescue Interrupt
|
106
|
-
retry
|
107
|
-
ensure
|
108
|
-
trap(:SIGINT, prev_trap)
|
109
|
-
end
|
110
|
-
|
111
|
-
line = (line || 'quit').strip
|
112
|
-
@s.puts "command #{line}"
|
113
|
-
when /^ask (.*)/
|
114
|
-
print $1
|
115
|
-
@s.puts "answer #{gets || ''}"
|
116
|
-
when /^quit/
|
117
|
-
raise 'quit'
|
118
|
-
else
|
119
|
-
puts "(unknown) #{line.inspect}"
|
120
|
-
end
|
121
|
-
end
|
122
|
-
rescue
|
123
|
-
STDERR.puts "disconnected (#{$!})"
|
124
|
-
exit
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def connect argv = ARGV
|
130
|
-
DEBUGGER__::Client.new(argv).connect
|
131
|
-
end
|
132
|
-
|
133
|
-
if __FILE__ == $0
|
134
|
-
connect
|
135
|
-
end
|
1
|
+
require 'socket'
|
2
|
+
require_relative 'config'
|
3
|
+
|
4
|
+
module DEBUGGER__
|
5
|
+
class Client
|
6
|
+
begin
|
7
|
+
require 'readline'
|
8
|
+
def readline
|
9
|
+
Readline.readline("\n(rdb) ", true)
|
10
|
+
end
|
11
|
+
rescue LoadError
|
12
|
+
def readline
|
13
|
+
print "\n(rdb) "
|
14
|
+
gets
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def help
|
19
|
+
puts "-run -e attach # connect via UNIX Domain socket"
|
20
|
+
puts "-run -e attach name # connect via UNIX Domain socket with specified name"
|
21
|
+
puts "-run -e attach port_num # connect via TCP/IP socket with specified port"
|
22
|
+
puts "-run -e attach host port_num"
|
23
|
+
puts " # connect via TCP/IP socket with specified host and port"
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize argv
|
27
|
+
case argv.size
|
28
|
+
when 0
|
29
|
+
connect_unix
|
30
|
+
when 1
|
31
|
+
case arg = argv.shift
|
32
|
+
when /-h/, /--help/
|
33
|
+
help
|
34
|
+
exit
|
35
|
+
when /\A\d+\z/
|
36
|
+
connect_tcp nil, arg.to_i
|
37
|
+
else
|
38
|
+
connect_unix arg
|
39
|
+
end
|
40
|
+
when 2
|
41
|
+
connect_tcp argv[0], argv[1]
|
42
|
+
else
|
43
|
+
help
|
44
|
+
exit!
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def cleanup_unix_domain_sockets
|
49
|
+
Dir.glob(DEBUGGER__.create_unix_domain_socket_name_prefix + '*') do |file|
|
50
|
+
if /(\d+)$/ =~ file
|
51
|
+
begin
|
52
|
+
Process.kill(0, $1.to_i)
|
53
|
+
rescue Errno::ESRCH
|
54
|
+
File.unlink(file)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def connect_unix name = nil
|
61
|
+
if name
|
62
|
+
if File.exist? name
|
63
|
+
@s = Socket.unix(name)
|
64
|
+
else
|
65
|
+
@s = Socket.unix(File.join(DEBUGGER__.unix_domain_socket_basedir, name))
|
66
|
+
end
|
67
|
+
else
|
68
|
+
cleanup_unix_domain_sockets
|
69
|
+
files = Dir.glob(DEBUGGER__.create_unix_domain_socket_name_prefix + '*')
|
70
|
+
case files.size
|
71
|
+
when 0
|
72
|
+
$stderr.puts "There is no debug sessions."
|
73
|
+
exit
|
74
|
+
when 1
|
75
|
+
@s = Socket.unix(files.first)
|
76
|
+
else
|
77
|
+
$stderr.puts "Please select a debug session:"
|
78
|
+
files.each{|f|
|
79
|
+
$stderr.puts " #{File.basename(f)}"
|
80
|
+
}
|
81
|
+
exit
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def connect_tcp host, port
|
87
|
+
@s = Socket.tcp(host, port)
|
88
|
+
end
|
89
|
+
|
90
|
+
def connect
|
91
|
+
trap(:SIGINT){
|
92
|
+
@s.puts "pause"
|
93
|
+
}
|
94
|
+
|
95
|
+
while line = @s.gets
|
96
|
+
# p line: line
|
97
|
+
case line
|
98
|
+
when /^out (.*)/
|
99
|
+
puts "#{$1}"
|
100
|
+
when /^input/
|
101
|
+
prev_trap = trap(:SIGINT, 'DEFAULT')
|
102
|
+
|
103
|
+
begin
|
104
|
+
line = readline
|
105
|
+
rescue Interrupt
|
106
|
+
retry
|
107
|
+
ensure
|
108
|
+
trap(:SIGINT, prev_trap)
|
109
|
+
end
|
110
|
+
|
111
|
+
line = (line || 'quit').strip
|
112
|
+
@s.puts "command #{line}"
|
113
|
+
when /^ask (.*)/
|
114
|
+
print $1
|
115
|
+
@s.puts "answer #{gets || ''}"
|
116
|
+
when /^quit/
|
117
|
+
raise 'quit'
|
118
|
+
else
|
119
|
+
puts "(unknown) #{line.inspect}"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
rescue
|
123
|
+
STDERR.puts "disconnected (#{$!})"
|
124
|
+
exit
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def connect argv = ARGV
|
130
|
+
DEBUGGER__::Client.new(argv).connect
|
131
|
+
end
|
132
|
+
|
133
|
+
if __FILE__ == $0
|
134
|
+
connect
|
135
|
+
end
|
data/lib/debug/config.rb
CHANGED
@@ -1,26 +1,26 @@
|
|
1
|
-
module DEBUGGER__
|
2
|
-
def self.unix_domain_socket_basedir
|
3
|
-
case
|
4
|
-
when path = ENV['RUBY_DEBUG_SOCK_DIR']
|
5
|
-
when path = ENV['XDG_RUNTIME_DIR']
|
6
|
-
when home = ENV['HOME']
|
7
|
-
path = File.join(home, '.ruby-debug-sock')
|
8
|
-
unless File.exist?(path)
|
9
|
-
Dir.mkdir(path, 0700)
|
10
|
-
end
|
11
|
-
else
|
12
|
-
raise 'specify RUBY_DEBUG_SOCK_DIR environment variable for UNIX domain socket directory.'
|
13
|
-
end
|
14
|
-
|
15
|
-
path
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.create_unix_domain_socket_name_prefix
|
19
|
-
user = ENV['USER'] || 'ruby-debug'
|
20
|
-
File.join(unix_domain_socket_basedir, "ruby-debug-#{user}")
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.create_unix_domain_socket_name
|
24
|
-
create_unix_domain_socket_name_prefix + "-#{Process.pid}"
|
25
|
-
end
|
26
|
-
end
|
1
|
+
module DEBUGGER__
|
2
|
+
def self.unix_domain_socket_basedir
|
3
|
+
case
|
4
|
+
when path = ENV['RUBY_DEBUG_SOCK_DIR']
|
5
|
+
when path = ENV['XDG_RUNTIME_DIR']
|
6
|
+
when home = ENV['HOME']
|
7
|
+
path = File.join(home, '.ruby-debug-sock')
|
8
|
+
unless File.exist?(path)
|
9
|
+
Dir.mkdir(path, 0700)
|
10
|
+
end
|
11
|
+
else
|
12
|
+
raise 'specify RUBY_DEBUG_SOCK_DIR environment variable for UNIX domain socket directory.'
|
13
|
+
end
|
14
|
+
|
15
|
+
path
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.create_unix_domain_socket_name_prefix
|
19
|
+
user = ENV['USER'] || 'ruby-debug'
|
20
|
+
File.join(unix_domain_socket_basedir, "ruby-debug-#{user}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.create_unix_domain_socket_name
|
24
|
+
create_unix_domain_socket_name_prefix + "-#{Process.pid}"
|
25
|
+
end
|
26
|
+
end
|
data/lib/debug/repl.rb
CHANGED
data/lib/debug/server.rb
CHANGED
data/lib/debug/session.rb
CHANGED
@@ -82,12 +82,11 @@ module DEBUGGER__
|
|
82
82
|
end
|
83
83
|
|
84
84
|
@management_threads = [@session_server]
|
85
|
+
@management_threads << @ui.reader_thread if @ui.respond_to? :reader_thread
|
85
86
|
|
86
87
|
setup_threads
|
87
88
|
end
|
88
89
|
|
89
|
-
attr_reader :management_threads
|
90
|
-
|
91
90
|
def source path
|
92
91
|
@sr.get(path)
|
93
92
|
end
|
@@ -595,4 +594,18 @@ module DEBUGGER__
|
|
595
594
|
def self.add_catch_breakpoint pat
|
596
595
|
::DEBUGGER__::SESSION.add_catch_breakpoint pat
|
597
596
|
end
|
597
|
+
|
598
|
+
class << self
|
599
|
+
define_method :initialize_session do |ui|
|
600
|
+
::DEBUGGER__.const_set(:SESSION, Session.new(ui))
|
601
|
+
|
602
|
+
# default breakpoints
|
603
|
+
::DEBUGGER__.add_catch_breakpoint 'RuntimeError'
|
604
|
+
|
605
|
+
Binding.module_eval do
|
606
|
+
::DEBUGGER__.add_line_breakpoint __FILE__, __LINE__ + 1
|
607
|
+
def bp; nil; end
|
608
|
+
end
|
609
|
+
end
|
610
|
+
end
|
598
611
|
end
|
data/lib/debug/tcpserver.rb
CHANGED
data/lib/debug/unixserver.rb
CHANGED
data/lib/debug/version.rb
CHANGED