debug 1.6.3 → 1.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +19 -7
- data/Gemfile +0 -0
- data/LICENSE.txt +0 -0
- data/README.md +37 -14
- data/Rakefile +0 -0
- data/TODO.md +8 -8
- data/debug.gemspec +1 -1
- data/exe/rdbg +1 -1
- data/ext/debug/debug.c +15 -1
- data/ext/debug/extconf.rb +0 -0
- data/ext/debug/iseq_collector.c +0 -0
- data/lib/debug/abbrev_command.rb +77 -0
- data/lib/debug/breakpoint.rb +17 -11
- data/lib/debug/client.rb +26 -9
- data/lib/debug/color.rb +0 -0
- data/lib/debug/config.rb +34 -16
- data/lib/debug/console.rb +0 -0
- data/lib/debug/frame_info.rb +0 -0
- data/lib/debug/local.rb +16 -10
- data/lib/debug/open.rb +0 -0
- data/lib/debug/open_nonstop.rb +0 -0
- data/lib/debug/prelude.rb +1 -1
- data/lib/debug/server.rb +25 -21
- data/lib/debug/server_cdp.rb +292 -86
- data/lib/debug/server_dap.rb +132 -47
- data/lib/debug/session.rb +384 -204
- data/lib/debug/source_repository.rb +39 -19
- data/lib/debug/start.rb +1 -1
- data/lib/debug/thread_client.rb +196 -63
- data/lib/debug/tracer.rb +0 -0
- data/lib/debug/version.rb +1 -1
- data/lib/debug.rb +7 -3
- data/misc/README.md.erb +9 -3
- metadata +5 -4
data/lib/debug/local.rb
CHANGED
@@ -13,23 +13,28 @@ module DEBUGGER__
|
|
13
13
|
false
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
session.intercept_trap_sigint_start prev_handler
|
24
|
-
end
|
16
|
+
def activate_sigint
|
17
|
+
prev_handler = trap(:SIGINT){
|
18
|
+
if SESSION.active?
|
19
|
+
ThreadClient.current.on_trap :SIGINT
|
20
|
+
end
|
21
|
+
}
|
22
|
+
SESSION.intercept_trap_sigint_start prev_handler
|
25
23
|
end
|
26
24
|
|
27
|
-
def
|
25
|
+
def deactivate_sigint
|
28
26
|
if SESSION.intercept_trap_sigint?
|
29
27
|
prev = SESSION.intercept_trap_sigint_end
|
30
28
|
trap(:SIGINT, prev)
|
31
29
|
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def activate session, on_fork: false
|
33
|
+
activate_sigint unless CONFIG[:no_sigint_hook]
|
34
|
+
end
|
32
35
|
|
36
|
+
def deactivate
|
37
|
+
deactivate_sigint
|
33
38
|
@console.deactivate
|
34
39
|
end
|
35
40
|
|
@@ -42,6 +47,7 @@ module DEBUGGER__
|
|
42
47
|
end
|
43
48
|
|
44
49
|
def quit n
|
50
|
+
yield
|
45
51
|
exit n
|
46
52
|
end
|
47
53
|
|
data/lib/debug/open.rb
CHANGED
File without changes
|
data/lib/debug/open_nonstop.rb
CHANGED
File without changes
|
data/lib/debug/prelude.rb
CHANGED
data/lib/debug/server.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'socket'
|
4
|
-
require 'etc'
|
5
4
|
require_relative 'config'
|
6
5
|
require_relative 'version'
|
7
6
|
|
@@ -22,6 +21,7 @@ module DEBUGGER__
|
|
22
21
|
|
23
22
|
class Terminate < StandardError; end
|
24
23
|
class GreetingError < StandardError; end
|
24
|
+
class RetryConnection < StandardError; end
|
25
25
|
|
26
26
|
def deactivate
|
27
27
|
@reader_thread.raise Terminate
|
@@ -78,6 +78,8 @@ module DEBUGGER__
|
|
78
78
|
next
|
79
79
|
rescue Terminate
|
80
80
|
raise # should catch at outer scope
|
81
|
+
rescue RetryConnection
|
82
|
+
next
|
81
83
|
rescue => e
|
82
84
|
DEBUGGER__.warn "ReaderThreadError: #{e}"
|
83
85
|
pp e.backtrace
|
@@ -128,6 +130,8 @@ module DEBUGGER__
|
|
128
130
|
def greeting
|
129
131
|
case g = @sock.gets
|
130
132
|
when /^info cookie:\s+(.*)$/
|
133
|
+
require 'etc'
|
134
|
+
|
131
135
|
check_cookie $1
|
132
136
|
@sock.puts "PID: #{Process.pid}, $0: #{$0}"
|
133
137
|
@sock.puts "debug #{VERSION} on #{RUBY_DESCRIPTION}"
|
@@ -140,7 +144,8 @@ module DEBUGGER__
|
|
140
144
|
|
141
145
|
# TODO: protocol version
|
142
146
|
if v != VERSION
|
143
|
-
|
147
|
+
@sock.puts msg = "out DEBUGGER: Incompatible version (server:#{VERSION} and client:#{$1})"
|
148
|
+
raise GreetingError, msg
|
144
149
|
end
|
145
150
|
parse_option(params)
|
146
151
|
|
@@ -157,16 +162,13 @@ module DEBUGGER__
|
|
157
162
|
@need_pause_at_first = false
|
158
163
|
dap_setup @sock.read($1.to_i)
|
159
164
|
|
160
|
-
when /^GET
|
165
|
+
when /^GET\s\/json\sHTTP\/1.1/, /^GET\s\/json\/version\sHTTP\/1.1/, /^GET\s\/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}\sHTTP\/1.1/
|
166
|
+
# The reason for not using @uuid here is @uuid is nil if users run debugger without `--open=chrome`.
|
167
|
+
|
161
168
|
require_relative 'server_cdp'
|
162
169
|
|
163
170
|
self.extend(UI_CDP)
|
164
|
-
|
165
|
-
@need_pause_at_first = false
|
166
|
-
CONFIG.set_config no_color: true
|
167
|
-
|
168
|
-
@ws_server = UI_CDP::WebSocketServer.new(@sock)
|
169
|
-
@ws_server.handshake
|
171
|
+
send_chrome_response g
|
170
172
|
else
|
171
173
|
raise GreetingError, "Unknown greeting message: #{g}"
|
172
174
|
end
|
@@ -174,17 +176,17 @@ module DEBUGGER__
|
|
174
176
|
|
175
177
|
def process
|
176
178
|
while true
|
177
|
-
DEBUGGER__.
|
178
|
-
|
179
|
-
DEBUGGER__.
|
179
|
+
DEBUGGER__.debug{ "sleep IO.select" }
|
180
|
+
_r = IO.select([@sock])
|
181
|
+
DEBUGGER__.debug{ "wakeup IO.select" }
|
180
182
|
|
181
183
|
line = @session.process_group.sync do
|
182
184
|
unless IO.select([@sock], nil, nil, 0)
|
183
|
-
DEBUGGER__.
|
185
|
+
DEBUGGER__.debug{ "UI_Server can not read" }
|
184
186
|
break :can_not_read
|
185
187
|
end
|
186
188
|
@sock.gets&.chomp.tap{|line|
|
187
|
-
DEBUGGER__.
|
189
|
+
DEBUGGER__.debug{ "UI_Server received: #{line}" }
|
188
190
|
}
|
189
191
|
end
|
190
192
|
|
@@ -340,12 +342,12 @@ module DEBUGGER__
|
|
340
342
|
if @repl
|
341
343
|
raise "not in subsession, but received: #{line.inspect}" unless @session.in_subsession?
|
342
344
|
line = "input #{Process.pid}"
|
343
|
-
DEBUGGER__.
|
345
|
+
DEBUGGER__.debug{ "send: #{line}" }
|
344
346
|
s.puts line
|
345
347
|
end
|
346
348
|
sleep 0.01 until @q_msg
|
347
349
|
@q_msg.pop.tap{|msg|
|
348
|
-
DEBUGGER__.
|
350
|
+
DEBUGGER__.debug{ "readline: #{msg.inspect}" }
|
349
351
|
}
|
350
352
|
end || 'continue')
|
351
353
|
|
@@ -361,7 +363,7 @@ module DEBUGGER__
|
|
361
363
|
Process.kill(TRAP_SIGNAL, Process.pid)
|
362
364
|
end
|
363
365
|
|
364
|
-
def quit n
|
366
|
+
def quit n, &_b
|
365
367
|
# ignore n
|
366
368
|
sock do |s|
|
367
369
|
s.puts "quit"
|
@@ -395,6 +397,7 @@ module DEBUGGER__
|
|
395
397
|
raise "Specify digits for port number"
|
396
398
|
end
|
397
399
|
end
|
400
|
+
@uuid = nil # for CDP
|
398
401
|
|
399
402
|
super()
|
400
403
|
end
|
@@ -402,11 +405,12 @@ module DEBUGGER__
|
|
402
405
|
def chrome_setup
|
403
406
|
require_relative 'server_cdp'
|
404
407
|
|
405
|
-
|
408
|
+
@uuid = SecureRandom.uuid
|
409
|
+
unless @chrome_pid = UI_CDP.setup_chrome(@local_addr.inspect_sockaddr, @uuid)
|
406
410
|
DEBUGGER__.warn <<~EOS
|
407
411
|
With Chrome browser, type the following URL in the address-bar:
|
408
412
|
|
409
|
-
devtools://devtools/bundled/inspector.html?v8only=true&panel=sources&ws=#{@local_addr.inspect_sockaddr}/#{
|
413
|
+
devtools://devtools/bundled/inspector.html?v8only=true&panel=sources&ws=#{@local_addr.inspect_sockaddr}/#{@uuid}
|
410
414
|
|
411
415
|
EOS
|
412
416
|
end
|
@@ -434,7 +438,7 @@ module DEBUGGER__
|
|
434
438
|
#
|
435
439
|
EOS
|
436
440
|
|
437
|
-
case CONFIG[:
|
441
|
+
case CONFIG[:open]
|
438
442
|
when 'chrome'
|
439
443
|
chrome_setup
|
440
444
|
when 'vscode'
|
@@ -491,7 +495,7 @@ module DEBUGGER__
|
|
491
495
|
end
|
492
496
|
|
493
497
|
::DEBUGGER__.warn "Debugger can attach via UNIX domain socket (#{@sock_path})"
|
494
|
-
vscode_setup @sock_path if CONFIG[:
|
498
|
+
vscode_setup @sock_path if CONFIG[:open] == 'vscode'
|
495
499
|
|
496
500
|
begin
|
497
501
|
Socket.unix_server_loop @sock_path do |sock, client|
|