debug 1.2.4 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +116 -5
- data/ext/debug/debug.c +2 -1
- data/ext/debug/extconf.rb +2 -0
- data/lib/debug/client.rb +41 -17
- data/lib/debug/config.rb +30 -10
- data/lib/debug/console.rb +92 -25
- data/lib/debug/local.rb +4 -1
- data/lib/debug/prelude.rb +49 -0
- data/lib/debug/server.rb +161 -17
- data/lib/debug/server_cdp.rb +412 -0
- data/lib/debug/server_dap.rb +53 -23
- data/lib/debug/session.rb +397 -120
- data/lib/debug/thread_client.rb +4 -2
- data/lib/debug/version.rb +1 -1
- data/misc/README.md.erb +95 -1
- metadata +4 -2
data/lib/debug/server_dap.rb
CHANGED
@@ -6,11 +6,17 @@ module DEBUGGER__
|
|
6
6
|
module UI_DAP
|
7
7
|
SHOW_PROTOCOL = ENV['RUBY_DEBUG_DAP_SHOW_PROTOCOL'] == '1'
|
8
8
|
|
9
|
+
def show_protocol dir, msg
|
10
|
+
if SHOW_PROTOCOL
|
11
|
+
$stderr.puts "\##{Process.pid}:[#{dir}] #{msg}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
9
15
|
def dap_setup bytes
|
10
16
|
CONFIG.set_config no_color: true
|
11
17
|
@seq = 0
|
12
18
|
|
13
|
-
|
19
|
+
show_protocol :>, bytes
|
14
20
|
req = JSON.load(bytes)
|
15
21
|
|
16
22
|
# capability
|
@@ -80,10 +86,8 @@ module DEBUGGER__
|
|
80
86
|
def send **kw
|
81
87
|
kw[:seq] = @seq += 1
|
82
88
|
str = JSON.dump(kw)
|
83
|
-
|
84
|
-
|
85
|
-
@sock.print header = "Content-Length: #{str.size}\r\n\r\n"
|
86
|
-
@sock.write str
|
89
|
+
show_protocol '<', str
|
90
|
+
@sock.write "Content-Length: #{str.size}\r\n\r\n#{str}"
|
87
91
|
end
|
88
92
|
|
89
93
|
def send_response req, success: true, **kw
|
@@ -111,19 +115,32 @@ module DEBUGGER__
|
|
111
115
|
end
|
112
116
|
end
|
113
117
|
|
118
|
+
class RetryBecauseCantRead < Exception
|
119
|
+
end
|
120
|
+
|
114
121
|
def recv_request
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
122
|
+
begin
|
123
|
+
r = IO.select([@sock])
|
124
|
+
|
125
|
+
@session.process_group.sync do
|
126
|
+
raise RetryBecauseCantRead unless IO.select([@sock], nil, nil, 0)
|
127
|
+
|
128
|
+
case header = @sock.gets
|
129
|
+
when /Content-Length: (\d+)/
|
130
|
+
b = @sock.read(2)
|
131
|
+
raise b.inspect unless b == "\r\n"
|
132
|
+
|
133
|
+
l = @sock.read(s = $1.to_i)
|
134
|
+
show_protocol :>, l
|
135
|
+
JSON.load(l)
|
136
|
+
when nil
|
137
|
+
nil
|
138
|
+
else
|
139
|
+
raise "unrecognized line: #{l} (#{l.size} bytes)"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
rescue RetryBecauseCantRead
|
143
|
+
retry
|
127
144
|
end
|
128
145
|
end
|
129
146
|
|
@@ -137,6 +154,11 @@ module DEBUGGER__
|
|
137
154
|
## boot/configuration
|
138
155
|
when 'launch'
|
139
156
|
send_response req
|
157
|
+
@is_attach = false
|
158
|
+
when 'attach'
|
159
|
+
send_response req
|
160
|
+
Process.kill(:SIGURG, Process.pid)
|
161
|
+
@is_attach = true
|
140
162
|
when 'setBreakpoints'
|
141
163
|
path = args.dig('source', 'path')
|
142
164
|
bp_args = args['breakpoints']
|
@@ -179,13 +201,21 @@ module DEBUGGER__
|
|
179
201
|
send_response req, breakpoints: filters
|
180
202
|
when 'configurationDone'
|
181
203
|
send_response req
|
182
|
-
@
|
183
|
-
|
184
|
-
|
185
|
-
|
204
|
+
if defined?(@is_attach) && @is_attach
|
205
|
+
@q_msg << 'p'
|
206
|
+
send_event 'stopped', reason: 'pause',
|
207
|
+
threadId: 1,
|
208
|
+
allThreadsStopped: true
|
209
|
+
else
|
210
|
+
@q_msg << 'continue'
|
211
|
+
end
|
186
212
|
when 'disconnect'
|
213
|
+
if args.fetch("terminateDebuggee", false)
|
214
|
+
@q_msg << 'kill!'
|
215
|
+
else
|
216
|
+
@q_msg << 'continue'
|
217
|
+
end
|
187
218
|
send_response req
|
188
|
-
@q_msg << 'continue'
|
189
219
|
|
190
220
|
## control
|
191
221
|
when 'continue'
|
@@ -297,7 +327,7 @@ module DEBUGGER__
|
|
297
327
|
return :retry
|
298
328
|
end
|
299
329
|
|
300
|
-
def
|
330
|
+
def process_protocol_request req
|
301
331
|
case req['command']
|
302
332
|
when 'stepBack'
|
303
333
|
if @tc.recorder&.can_step_back?
|