debug 1.6.3 → 1.7.1
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/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|
|