debug 1.6.3 → 1.7.0
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 +0 -0
- 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 +0 -0
- data/lib/debug/server.rb +25 -21
- data/lib/debug/server_cdp.rb +281 -80
- data/lib/debug/server_dap.rb +109 -37
- 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 +186 -60
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14d08935b209386adbc7a1172ae0d43feb7bf31c9483aa177946fa0669db69e8
|
4
|
+
data.tar.gz: '01917758f048b2927a6e42b8965985477fed13011b3cd7626220ea8d1aad42fd'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6381058fe16c43d79afdc04db1dcfcff6bd3c65216ce9bc9a03b02c26dbe098011879128c2e4f3ed31b1f7cf279b590fd641b4030f6cb6308434d65d17e51110
|
7
|
+
data.tar.gz: c2896cca900dea7f5f4456b30f8dc4ecbed6886da74c46033e82bcda37da561759f2bd3b9a702eef7603785c17989f437b4f186817ad458edd16371c7b879688
|
data/CONTRIBUTING.md
CHANGED
@@ -166,7 +166,7 @@ module DEBUGGER__
|
|
166
166
|
9| end
|
167
167
|
RUBY
|
168
168
|
end
|
169
|
-
|
169
|
+
|
170
170
|
def test_1629720194
|
171
171
|
debug_code(program) do
|
172
172
|
type 's'
|
@@ -272,7 +272,7 @@ To run the test generator, you can enter `$ bin/gentest target.rb --open=vscode`
|
|
272
272
|
Also, if you enter `$ bin/gentest target.rb --open=chrome` there, Chrome will be executed.
|
273
273
|
If you need to modify existing tests, it is basically a good idea to regenerate them by the test generator instead of rewriting them directly.
|
274
274
|
Please refer to [the Microsoft "Debug Adapter Protocol" article](https://microsoft.github.io/debug-adapter-protocol/specification) to learn more about DAP formats.
|
275
|
-
Please refer to [
|
275
|
+
Please refer to [the "Chrome DevTools Protocol" official documentation](https://chromedevtools.github.io/devtools-protocol/) to learn more about CDP formats.
|
276
276
|
|
277
277
|
2. High-level tests
|
278
278
|
|
@@ -320,6 +320,22 @@ Execute debugging `program` with `&scenario`. If you want to test it only for DA
|
|
320
320
|
|
321
321
|
`run_protocol_scenario program, cdp: false ...`
|
322
322
|
|
323
|
+
- attach_to_dap_server(terminate_debuggee:)
|
324
|
+
|
325
|
+
Attach to the running DAP server through UNIX Domain Socket.
|
326
|
+
|
327
|
+
- attach_to_cdp_server
|
328
|
+
|
329
|
+
Attach to the running CDP server through TCP/IP.
|
330
|
+
|
331
|
+
- req_dap_disconnect
|
332
|
+
|
333
|
+
Disconnect from the currently connected DAP server.
|
334
|
+
|
335
|
+
- req_cdp_disconnect
|
336
|
+
|
337
|
+
Disconnect from the currently connected CDP server.
|
338
|
+
|
323
339
|
- req_add_breakpoint(lineno, path: temp_file_path, cond: nil)
|
324
340
|
|
325
341
|
Sends request to rdbg to add a breakpoint.
|
@@ -336,7 +352,7 @@ Sends request to rdbg to set exception breakpoints. e.g.
|
|
336
352
|
req_set_exception_breakpoints([{ name: "RuntimeError", condition: "a == 1" }])
|
337
353
|
```
|
338
354
|
|
339
|
-
Please note that `setExceptionBreakpoints` resets all exception breakpoints in every request.
|
355
|
+
Please note that `setExceptionBreakpoints` resets all exception breakpoints in every request.
|
340
356
|
|
341
357
|
So the following code will only set breakpoint for `Exception`.
|
342
358
|
|
@@ -377,10 +393,6 @@ Sends request to rdbg to step back from current method.
|
|
377
393
|
|
378
394
|
Sends request to rdbg to terminate the debuggee.
|
379
395
|
|
380
|
-
- assert_reattach
|
381
|
-
|
382
|
-
Passes if reattaching to rdbg is successful.
|
383
|
-
|
384
396
|
- assert_hover_result(expected, expression)
|
385
397
|
|
386
398
|
Passes if result of `expression` matches `expected`.
|
data/Gemfile
CHANGED
File without changes
|
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
@@ -469,6 +469,7 @@ config set no_color true
|
|
469
469
|
* UI
|
470
470
|
* `RUBY_DEBUG_LOG_LEVEL` (`log_level`): Log level same as Logger (default: WARN)
|
471
471
|
* `RUBY_DEBUG_SHOW_SRC_LINES` (`show_src_lines`): Show n lines source code on breakpoint (default: 10)
|
472
|
+
* `RUBY_DEBUG_SHOW_EVALEDSRC` (`show_evaledsrc`): Show actually evaluated source (default: false)
|
472
473
|
* `RUBY_DEBUG_SHOW_FRAMES` (`show_frames`): Show n frames on breakpoint (default: 2)
|
473
474
|
* `RUBY_DEBUG_USE_SHORT_PATH` (`use_short_path`): Show shorten PATH (like $(Gem)/foo.rb) (default: false)
|
474
475
|
* `RUBY_DEBUG_NO_COLOR` (`no_color`): Do not use colorize (default: false)
|
@@ -488,12 +489,13 @@ config set no_color true
|
|
488
489
|
* `RUBY_DEBUG_NONSTOP` (`nonstop`): Nonstop mode (default: false)
|
489
490
|
* `RUBY_DEBUG_STOP_AT_LOAD` (`stop_at_load`): Stop at just loading location (default: false)
|
490
491
|
* `RUBY_DEBUG_INIT_SCRIPT` (`init_script`): debug command script path loaded at first stop
|
491
|
-
* `RUBY_DEBUG_COMMANDS` (`commands`): debug commands invoked at first stop.
|
492
|
+
* `RUBY_DEBUG_COMMANDS` (`commands`): debug commands invoked at first stop. Commands should be separated by `;;`
|
492
493
|
* `RUBY_DEBUG_NO_RC` (`no_rc`): ignore loading ~/.rdbgrc(.rb) (default: false)
|
493
494
|
* `RUBY_DEBUG_HISTORY_FILE` (`history_file`): history file (default: ~/.rdbg_history)
|
494
495
|
* `RUBY_DEBUG_SAVE_HISTORY` (`save_history`): maximum save history lines (default: 10000)
|
495
496
|
|
496
497
|
* REMOTE
|
498
|
+
* `RUBY_DEBUG_OPEN` (`open`): Open remote port (same as `rdbg --open` option)
|
497
499
|
* `RUBY_DEBUG_PORT` (`port`): TCP/IP remote debugging: port
|
498
500
|
* `RUBY_DEBUG_HOST` (`host`): TCP/IP remote debugging: host (default: 127.0.0.1)
|
499
501
|
* `RUBY_DEBUG_SOCK_PATH` (`sock_path`): UNIX Domain Socket remote debugging: socket path
|
@@ -501,7 +503,6 @@ config set no_color true
|
|
501
503
|
* `RUBY_DEBUG_LOCAL_FS_MAP` (`local_fs_map`): Specify local fs map
|
502
504
|
* `RUBY_DEBUG_SKIP_BP` (`skip_bp`): Skip breakpoints if no clients are attached (default: false)
|
503
505
|
* `RUBY_DEBUG_COOKIE` (`cookie`): Cookie for negotiation
|
504
|
-
* `RUBY_DEBUG_OPEN_FRONTEND` (`open_frontend`): frontend used by open command (vscode, chrome, default: rdbg).
|
505
506
|
* `RUBY_DEBUG_CHROME_PATH` (`chrome_path`): Platform dependent path of Chrome (For more information, See [here](https://github.com/ruby/debug/pull/334/files#diff-5fc3d0a901379a95bc111b86cf0090b03f857edfd0b99a0c1537e26735698453R55-R64))
|
506
507
|
|
507
508
|
* OBSOLETE
|
@@ -536,7 +537,8 @@ There are additional features:
|
|
536
537
|
* `<expr>` without debug command is almost same as `pp <expr>`.
|
537
538
|
* If the input line `<expr>` does *NOT* start with any debug command, the line `<expr>` will be evaluated as a Ruby expression and the result will be printed with `pp` method. So that the input `foo.bar` is same as `pp foo.bar`.
|
538
539
|
* If `<expr>` is recognized as a debug command, of course it is not evaluated as a Ruby expression, but is executed as debug command. For example, you can not evaluate such single letter local variables `i`, `b`, `n`, `c` because they are single letter debug commands. Use `p i` instead.
|
539
|
-
*
|
540
|
+
* So the author (Koichi Sasada) recommends to use `p`, `pp` or `eval` command to evaluate the Ruby expression everytime.
|
541
|
+
* `Enter` without any input repeats the last command (useful when repeating `step`s) for some commands.
|
540
542
|
* `Ctrl-D` is equal to `quit` command.
|
541
543
|
* [debug command compare sheet - Google Sheets](https://docs.google.com/spreadsheets/d/1TlmmUDsvwK4sSIyoMv-io52BUUz__R5wpu-ComXlsw0/edit?usp=sharing)
|
542
544
|
|
@@ -558,7 +560,14 @@ The `<...>` notation means the argument.
|
|
558
560
|
* Finish this frame. Resume the program until the current frame is finished.
|
559
561
|
* `fin[ish] <n>`
|
560
562
|
* Finish `<n>`th frames.
|
561
|
-
* `
|
563
|
+
* `u[ntil]`
|
564
|
+
* Similar to `next` command, but only stop later lines or the end of the current frame.
|
565
|
+
* Similar to gdb's `advance` command.
|
566
|
+
* `u[ntil] <[file:]line>
|
567
|
+
* Run til the program reaches given location or the end of the current frame.
|
568
|
+
* `u[ntil] <name>
|
569
|
+
* Run til the program invokes a method `<name>`. `<name>` can be a regexp with `/name/`.
|
570
|
+
* `c` or `cont` or `continue`
|
562
571
|
* Resume the program.
|
563
572
|
* `q[uit]` or `Ctrl-D`
|
564
573
|
* Finish debugger (with the debuggee process on non-remote debugging).
|
@@ -638,26 +647,35 @@ The `<...>` notation means the argument.
|
|
638
647
|
* Show predecessor lines as opposed to the `list` command.
|
639
648
|
* `l[ist] <start>` or `l[ist] <start>-<end>`
|
640
649
|
* Show current frame's source code from the line <start> to <end> if given.
|
650
|
+
* `whereami`
|
651
|
+
* Show the current frame with source code.
|
641
652
|
* `edit`
|
642
653
|
* Open the current file on the editor (use `EDITOR` environment variable).
|
643
654
|
* Note that edited file will not be reloaded.
|
644
655
|
* `edit <file>`
|
645
656
|
* Open <file> on the editor.
|
646
657
|
* `i[nfo]`
|
647
|
-
|
648
|
-
* `i[nfo]
|
658
|
+
* Show information about current frame (local/instance variables and defined constants).
|
659
|
+
* `i[nfo]` <subcommand>
|
660
|
+
* `info` has the following sub-commands.
|
661
|
+
* Sub-commands can be specified with few letters which is unambiguous, like `l` for 'locals'.
|
662
|
+
* `i[nfo] l or locals or local_variables`
|
649
663
|
* Show information about the current frame (local variables)
|
650
|
-
* It includes `self` as `%self` and a return value as
|
651
|
-
* `i[nfo] i
|
664
|
+
* It includes `self` as `%self` and a return value as `_return`.
|
665
|
+
* `i[nfo] i or ivars or instance_variables`
|
652
666
|
* Show information about instance variables about `self`.
|
653
|
-
* `
|
667
|
+
* `info ivars <expr>` shows the instance variables of the result of `<expr>`.
|
668
|
+
* `i[nfo] c or consts or constants`
|
654
669
|
* Show information about accessible constants except toplevel constants.
|
655
|
-
* `
|
670
|
+
* `info consts <expr>` shows the constants of a class/module of the result of `<expr>`
|
671
|
+
* `i[nfo] g or globals or global_variables`
|
656
672
|
* Show information about global variables
|
673
|
+
* `i[nfo] th or threads`
|
674
|
+
* Show all threads (same as `th[read]`).
|
675
|
+
* `i[nfo] b or breakpoints or w or watchpoints`
|
676
|
+
* Show all breakpoints and watchpoints.
|
657
677
|
* `i[nfo] ... /regexp/`
|
658
678
|
* Filter the output with `/regexp/`.
|
659
|
-
* `i[nfo] th[read[s]]`
|
660
|
-
* Show all threads (same as `th[read]`).
|
661
679
|
* `o[utline]` or `ls`
|
662
680
|
* Show you available methods, constants, local variables, and instance variables in the current scope.
|
663
681
|
* `o[utline] <expr>` or `ls <expr>`
|
@@ -822,11 +840,11 @@ It is useful if you only want to call a debug command and don't want to stop the
|
|
822
840
|
```
|
823
841
|
def initialize
|
824
842
|
@a = 1
|
825
|
-
binding.b do: 'watch @a'
|
843
|
+
binding.b do: 'info \n watch @a'
|
826
844
|
end
|
827
845
|
```
|
828
846
|
|
829
|
-
On this case, register a watch breakpoint for `@a` and continue to run.
|
847
|
+
On this case, execute the `info` command then register a watch breakpoint for `@a` and continue to run. You can also use `;;` instead of `\n` to separate your commands.
|
830
848
|
|
831
849
|
If `pre: 'command'` is specified, the debugger suspends the program and run the `command` as a debug command, and keep suspend.
|
832
850
|
It is useful if you have operations before suspend.
|
@@ -900,6 +918,11 @@ NOTE
|
|
900
918
|
|
901
919
|
```
|
902
920
|
|
921
|
+
# Additional Resources
|
922
|
+
|
923
|
+
- [From byebug to ruby/debug](https://st0012.dev/from-byebug-to-ruby-debug) by Stan Lo - A migration guide for `byebug` users.
|
924
|
+
- [ruby/debug cheatsheet](https://st0012.dev/ruby-debug-cheatsheet) by Stan Lo
|
925
|
+
|
903
926
|
# Contributing
|
904
927
|
|
905
928
|
Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/debug.
|
data/Rakefile
CHANGED
File without changes
|
data/TODO.md
CHANGED
File without changes
|
data/debug.gemspec
CHANGED
@@ -27,6 +27,6 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.require_paths = ["lib"]
|
28
28
|
spec.extensions = ['ext/debug/extconf.rb']
|
29
29
|
|
30
|
-
spec.add_dependency "irb", ">= 1.
|
30
|
+
spec.add_dependency "irb", ">= 1.5.0" # for binding.irb(show_code: false)
|
31
31
|
spec.add_dependency "reline", ">= 0.3.1"
|
32
32
|
end
|
data/exe/rdbg
CHANGED
@@ -10,7 +10,7 @@ when :start
|
|
10
10
|
require 'rbconfig'
|
11
11
|
|
12
12
|
libpath = File.join(File.expand_path(File.dirname(__dir__)), 'lib/debug')
|
13
|
-
start_mode = config[:
|
13
|
+
start_mode = config[:open] ? "open" : 'start'
|
14
14
|
cmd = config[:command] ? ARGV.shift : (ENV['RUBY'] || RbConfig.ruby)
|
15
15
|
|
16
16
|
if defined?($:.resolve_feature_path)
|
data/ext/debug/debug.c
CHANGED
@@ -76,7 +76,12 @@ di_body(const rb_debug_inspector_t *dc, void *ptr)
|
|
76
76
|
rb_debug_inspector_frame_binding_get(dc, i),
|
77
77
|
iseq,
|
78
78
|
rb_debug_inspector_frame_class_get(dc, i),
|
79
|
-
|
79
|
+
#ifdef RB_DEBUG_INSPECTOR_FRAME_DEPTH
|
80
|
+
rb_debug_inspector_frame_depth(dc, i)
|
81
|
+
#else
|
82
|
+
INT2FIX(len - i)
|
83
|
+
#endif
|
84
|
+
);
|
80
85
|
rb_ary_push(ary, e);
|
81
86
|
}
|
82
87
|
|
@@ -89,6 +94,13 @@ capture_frames(VALUE self, VALUE skip_path_prefix)
|
|
89
94
|
return rb_debug_inspector_open(di_body, (void *)skip_path_prefix);
|
90
95
|
}
|
91
96
|
|
97
|
+
#ifdef RB_DEBUG_INSPECTOR_FRAME_DEPTH
|
98
|
+
static VALUE
|
99
|
+
frame_depth(VALUE self)
|
100
|
+
{
|
101
|
+
return rb_debug_inspector_current_depth();
|
102
|
+
}
|
103
|
+
#else
|
92
104
|
static VALUE
|
93
105
|
frame_depth(VALUE self)
|
94
106
|
{
|
@@ -96,6 +108,8 @@ frame_depth(VALUE self)
|
|
96
108
|
VALUE bt = rb_make_backtrace();
|
97
109
|
return INT2FIX(RARRAY_LEN(bt));
|
98
110
|
}
|
111
|
+
#endif
|
112
|
+
|
99
113
|
|
100
114
|
// iseq
|
101
115
|
|
data/ext/debug/extconf.rb
CHANGED
File without changes
|
data/ext/debug/iseq_collector.c
CHANGED
File without changes
|
@@ -0,0 +1,77 @@
|
|
1
|
+
|
2
|
+
module DEBUGGER__
|
3
|
+
class AbbrevCommand
|
4
|
+
class TrieNode
|
5
|
+
def initialize
|
6
|
+
@children = {}
|
7
|
+
@types = {} # set
|
8
|
+
end
|
9
|
+
|
10
|
+
def append c, type
|
11
|
+
trie = (@children[c] ||= TrieNode.new)
|
12
|
+
trie.add_type type
|
13
|
+
end
|
14
|
+
|
15
|
+
def [](c)
|
16
|
+
@children[c]
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_type type
|
20
|
+
@types[type] = true
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def types
|
25
|
+
@types.keys
|
26
|
+
end
|
27
|
+
|
28
|
+
def type
|
29
|
+
if @types.size == 1
|
30
|
+
@types.keys.first
|
31
|
+
else
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def candidates
|
37
|
+
@children.map{|c, n|
|
38
|
+
ss = n.candidates
|
39
|
+
ss.empty? ? c :
|
40
|
+
ss.map{|s|
|
41
|
+
c+s
|
42
|
+
}
|
43
|
+
}.flatten
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# config: { type: [commands...], ... }
|
48
|
+
def initialize config
|
49
|
+
@trie = TrieNode.new
|
50
|
+
build config
|
51
|
+
end
|
52
|
+
|
53
|
+
private def build config
|
54
|
+
config.each do |type, commands|
|
55
|
+
commands.each do |command|
|
56
|
+
trie = @trie
|
57
|
+
command.each_char do |c|
|
58
|
+
trie = trie.append(c, type)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def search str, if_none = nil
|
65
|
+
trie = @trie
|
66
|
+
str.each_char do |c|
|
67
|
+
if trie = trie[c]
|
68
|
+
return trie.type if trie.type
|
69
|
+
else
|
70
|
+
return if_none
|
71
|
+
end
|
72
|
+
end
|
73
|
+
yield trie.candidates.map{|s| str + s} if block_given?
|
74
|
+
if_none
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/lib/debug/breakpoint.rb
CHANGED
@@ -6,7 +6,7 @@ module DEBUGGER__
|
|
6
6
|
class Breakpoint
|
7
7
|
include SkipPathHelper
|
8
8
|
|
9
|
-
attr_reader :key
|
9
|
+
attr_reader :key, :skip_src
|
10
10
|
|
11
11
|
def initialize cond, command, path, do_enable: true
|
12
12
|
@deleted = false
|
@@ -101,6 +101,10 @@ module DEBUGGER__
|
|
101
101
|
def generate_label(name)
|
102
102
|
colorize(" BP - #{name} ", [:YELLOW, :BOLD, :REVERSE])
|
103
103
|
end
|
104
|
+
|
105
|
+
def pending_until_load?
|
106
|
+
false
|
107
|
+
end
|
104
108
|
end
|
105
109
|
|
106
110
|
if RUBY_VERSION.to_f <= 2.7
|
@@ -141,10 +145,11 @@ module DEBUGGER__
|
|
141
145
|
nbp
|
142
146
|
end
|
143
147
|
|
144
|
-
def initialize path, line, cond: nil, oneshot: false, hook_call: true, command: nil, skip_activate: false
|
148
|
+
def initialize path, line, cond: nil, oneshot: false, hook_call: true, command: nil, skip_activate: false, skip_src: false
|
145
149
|
@line = line
|
146
150
|
@oneshot = oneshot
|
147
151
|
@hook_call = hook_call
|
152
|
+
@skip_src = skip_src
|
148
153
|
@pending = false
|
149
154
|
|
150
155
|
@iseq = nil
|
@@ -158,6 +163,10 @@ module DEBUGGER__
|
|
158
163
|
@pending = !@iseq
|
159
164
|
end
|
160
165
|
|
166
|
+
def pending_until_load?
|
167
|
+
@pending
|
168
|
+
end
|
169
|
+
|
161
170
|
def setup
|
162
171
|
return unless @type
|
163
172
|
|
@@ -196,7 +205,7 @@ module DEBUGGER__
|
|
196
205
|
enable
|
197
206
|
|
198
207
|
if @pending && !@oneshot
|
199
|
-
DEBUGGER__.
|
208
|
+
DEBUGGER__.info "#{self} is activated."
|
200
209
|
end
|
201
210
|
end
|
202
211
|
|
@@ -264,13 +273,10 @@ module DEBUGGER__
|
|
264
273
|
|
265
274
|
if !nearest || ((line - nline).abs < (line - nearest.line).abs)
|
266
275
|
nearest = NearestISeq.new(iseq, nline, events)
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
nearest = NearestISeq.new(iseq, nline, events)
|
272
|
-
end
|
273
|
-
end
|
276
|
+
elsif @hook_call &&
|
277
|
+
nearest.line == iseq.first_line &&
|
278
|
+
events.include?(:RUBY_EVENT_CALL)
|
279
|
+
nearest = NearestISeq.new(iseq, nline, events)
|
274
280
|
end
|
275
281
|
end
|
276
282
|
end
|
@@ -500,7 +506,7 @@ module DEBUGGER__
|
|
500
506
|
retried = false
|
501
507
|
|
502
508
|
@tp.enable(target: @method)
|
503
|
-
DEBUGGER__.
|
509
|
+
DEBUGGER__.info "#{self} is activated." if added
|
504
510
|
|
505
511
|
if @sig_op == '#'
|
506
512
|
@cond_class = @klass if @method.owner != @klass
|
data/lib/debug/client.rb
CHANGED
@@ -25,6 +25,9 @@ module DEBUGGER__
|
|
25
25
|
when 'list-socks'
|
26
26
|
cleanup_unix_domain_sockets
|
27
27
|
puts list_connections
|
28
|
+
when 'list-socks-verbose'
|
29
|
+
cleanup_unix_domain_sockets
|
30
|
+
puts list_connections verbose: true
|
28
31
|
when 'setup-autoload'
|
29
32
|
setup_autoload
|
30
33
|
else
|
@@ -91,10 +94,24 @@ module DEBUGGER__
|
|
91
94
|
end
|
92
95
|
end
|
93
96
|
|
94
|
-
def list_connections
|
95
|
-
Dir.glob(DEBUGGER__.create_unix_domain_socket_name_prefix + '*').find_all do |path|
|
97
|
+
def list_connections verbose: false
|
98
|
+
socks = Dir.glob(DEBUGGER__.create_unix_domain_socket_name_prefix + '*').find_all do |path|
|
96
99
|
File.socket?(path)
|
97
100
|
end
|
101
|
+
|
102
|
+
if verbose
|
103
|
+
socks = socks.map{|sock_path|
|
104
|
+
Socket.unix(sock_path){|sock|
|
105
|
+
sock.puts "info cookie: #{CONFIG[:cookie] || '-'}"
|
106
|
+
pid = sock.gets.chomp
|
107
|
+
_dbg = sock.gets.chomp
|
108
|
+
_unm = sock.gets.chomp
|
109
|
+
[sock_path, pid]
|
110
|
+
}
|
111
|
+
}
|
112
|
+
end
|
113
|
+
|
114
|
+
socks
|
98
115
|
end
|
99
116
|
end
|
100
117
|
|
@@ -148,18 +165,18 @@ module DEBUGGER__
|
|
148
165
|
end
|
149
166
|
else
|
150
167
|
Client.cleanup_unix_domain_sockets
|
151
|
-
files = Client.list_connections
|
168
|
+
files = Client.list_connections verbose: true
|
152
169
|
|
153
170
|
case files.size
|
154
171
|
when 0
|
155
172
|
$stderr.puts "No debug session is available."
|
156
173
|
exit
|
157
174
|
when 1
|
158
|
-
@s = Socket.unix(files.first)
|
175
|
+
@s = Socket.unix(files.first.first)
|
159
176
|
else
|
160
177
|
$stderr.puts "Please select a debug session:"
|
161
|
-
files.each{|f|
|
162
|
-
$stderr.puts " #{File.basename(f)}"
|
178
|
+
files.each{|(f, desc)|
|
179
|
+
$stderr.puts " #{File.basename(f)} (#{desc})"
|
163
180
|
}
|
164
181
|
exit
|
165
182
|
end
|
@@ -222,7 +239,7 @@ module DEBUGGER__
|
|
222
239
|
when /^ask (\d+) (.*)/
|
223
240
|
pid = $1
|
224
241
|
print $2
|
225
|
-
send "answer #{pid} #{gets || ''}"
|
242
|
+
send "answer #{pid} #{$stdin.gets || ''}"
|
226
243
|
|
227
244
|
when /^quit/
|
228
245
|
raise 'quit'
|
@@ -231,8 +248,8 @@ module DEBUGGER__
|
|
231
248
|
puts "(unknown) #{line.inspect}"
|
232
249
|
end
|
233
250
|
end
|
234
|
-
rescue
|
235
|
-
STDERR.puts "disconnected (#{
|
251
|
+
rescue => e
|
252
|
+
STDERR.puts "disconnected (#{e})"
|
236
253
|
exit
|
237
254
|
ensure
|
238
255
|
deactivate
|
data/lib/debug/color.rb
CHANGED
File without changes
|
data/lib/debug/config.rb
CHANGED
@@ -14,6 +14,7 @@ module DEBUGGER__
|
|
14
14
|
# UI setting
|
15
15
|
log_level: ['RUBY_DEBUG_LOG_LEVEL', "UI: Log level same as Logger", :loglevel, "WARN"],
|
16
16
|
show_src_lines: ['RUBY_DEBUG_SHOW_SRC_LINES', "UI: Show n lines source code on breakpoint", :int, "10"],
|
17
|
+
show_evaledsrc: ['RUBY_DEBUG_SHOW_EVALEDSRC', "UI: Show actually evaluated source", :bool, "false"],
|
17
18
|
show_frames: ['RUBY_DEBUG_SHOW_FRAMES', "UI: Show n frames on breakpoint", :int, "2"],
|
18
19
|
use_short_path: ['RUBY_DEBUG_USE_SHORT_PATH', "UI: Show shorten PATH (like $(Gem)/foo.rb)", :bool, "false"],
|
19
20
|
no_color: ['RUBY_DEBUG_NO_COLOR', "UI: Do not use colorize", :bool, "false"],
|
@@ -33,12 +34,13 @@ module DEBUGGER__
|
|
33
34
|
nonstop: ['RUBY_DEBUG_NONSTOP', "BOOT: Nonstop mode", :bool, "false"],
|
34
35
|
stop_at_load: ['RUBY_DEBUG_STOP_AT_LOAD',"BOOT: Stop at just loading location", :bool, "false"],
|
35
36
|
init_script: ['RUBY_DEBUG_INIT_SCRIPT', "BOOT: debug command script path loaded at first stop"],
|
36
|
-
commands: ['RUBY_DEBUG_COMMANDS', "BOOT: debug commands invoked at first stop.
|
37
|
+
commands: ['RUBY_DEBUG_COMMANDS', "BOOT: debug commands invoked at first stop. Commands should be separated by `;;`"],
|
37
38
|
no_rc: ['RUBY_DEBUG_NO_RC', "BOOT: ignore loading ~/.rdbgrc(.rb)", :bool, "false"],
|
38
39
|
history_file: ['RUBY_DEBUG_HISTORY_FILE',"BOOT: history file", :string, "~/.rdbg_history"],
|
39
40
|
save_history: ['RUBY_DEBUG_SAVE_HISTORY',"BOOT: maximum save history lines", :int, "10000"],
|
40
41
|
|
41
42
|
# remote setting
|
43
|
+
open: ['RUBY_DEBUG_OPEN', "REMOTE: Open remote port (same as `rdbg --open` option)"],
|
42
44
|
port: ['RUBY_DEBUG_PORT', "REMOTE: TCP/IP remote debugging: port"],
|
43
45
|
host: ['RUBY_DEBUG_HOST', "REMOTE: TCP/IP remote debugging: host", :string, "127.0.0.1"],
|
44
46
|
sock_path: ['RUBY_DEBUG_SOCK_PATH', "REMOTE: UNIX Domain Socket remote debugging: socket path"],
|
@@ -46,7 +48,6 @@ module DEBUGGER__
|
|
46
48
|
local_fs_map: ['RUBY_DEBUG_LOCAL_FS_MAP', "REMOTE: Specify local fs map", :path_map],
|
47
49
|
skip_bp: ['RUBY_DEBUG_SKIP_BP', "REMOTE: Skip breakpoints if no clients are attached", :bool, 'false'],
|
48
50
|
cookie: ['RUBY_DEBUG_COOKIE', "REMOTE: Cookie for negotiation"],
|
49
|
-
open_frontend: ['RUBY_DEBUG_OPEN_FRONTEND',"REMOTE: frontend used by open command (vscode, chrome, default: rdbg)."],
|
50
51
|
chrome_path: ['RUBY_DEBUG_CHROME_PATH', "REMOTE: Platform dependent path of Chrome (For more information, See [here](https://github.com/ruby/debug/pull/334/files#diff-5fc3d0a901379a95bc111b86cf0090b03f857edfd0b99a0c1537e26735698453R55-R64))"],
|
51
52
|
|
52
53
|
# obsolete
|
@@ -63,8 +64,6 @@ module DEBUGGER__
|
|
63
64
|
end
|
64
65
|
|
65
66
|
def initialize argv
|
66
|
-
@skip_all = false
|
67
|
-
|
68
67
|
if self.class.config
|
69
68
|
raise 'Can not make multiple configurations in one process'
|
70
69
|
end
|
@@ -94,14 +93,6 @@ module DEBUGGER__
|
|
94
93
|
set_config(key => val)
|
95
94
|
end
|
96
95
|
|
97
|
-
def skip_all
|
98
|
-
@skip_all = true
|
99
|
-
end
|
100
|
-
|
101
|
-
def skip?
|
102
|
-
@skip_all
|
103
|
-
end
|
104
|
-
|
105
96
|
def set_config(**kw)
|
106
97
|
conf = config.dup
|
107
98
|
kw.each{|k, v|
|
@@ -158,6 +149,12 @@ module DEBUGGER__
|
|
158
149
|
if_updated old_conf, conf, :sigdump_sig do |old_sig, new_sig|
|
159
150
|
setup_sigdump old_sig, new_sig
|
160
151
|
end
|
152
|
+
|
153
|
+
if_updated old_conf, conf, :no_sigint_hook do |old, new|
|
154
|
+
if defined?(SESSION)
|
155
|
+
SESSION.set_no_sigint_hook old, new
|
156
|
+
end
|
157
|
+
end
|
161
158
|
end
|
162
159
|
|
163
160
|
private def if_updated old_conf, new_conf, key
|
@@ -308,8 +305,25 @@ module DEBUGGER__
|
|
308
305
|
'If TCP/IP options are not given, a UNIX domain socket will be used.',
|
309
306
|
'If FRONTEND is given, prepare for the FRONTEND.',
|
310
307
|
'Now rdbg, vscode and chrome is supported.') do |f|
|
311
|
-
|
312
|
-
|
308
|
+
|
309
|
+
case f # some format patterns are not documented yet
|
310
|
+
when nil
|
311
|
+
config[:open] = true
|
312
|
+
when /\A\d\z/
|
313
|
+
config[:open] = true
|
314
|
+
config[:port] = f.to_i
|
315
|
+
when /\A(\S+):(\d+)\z/
|
316
|
+
config[:open] = true
|
317
|
+
config[:host] = $1
|
318
|
+
config[:port] = $2.to_i
|
319
|
+
when 'tcp'
|
320
|
+
config[:open] = true
|
321
|
+
config[:port] ||= 0
|
322
|
+
when 'vscode', 'chrome', 'cdp'
|
323
|
+
config[:open] = f&.downcase
|
324
|
+
else
|
325
|
+
raise "Unknown option for --open: #{f}"
|
326
|
+
end
|
313
327
|
end
|
314
328
|
o.on('--sock-path=SOCK_PATH', 'UNIX Domain socket path') do |path|
|
315
329
|
config[:sock_path] = path
|
@@ -479,10 +493,14 @@ module DEBUGGER__
|
|
479
493
|
when /\A\s*### (.+)/
|
480
494
|
cat = $1
|
481
495
|
break if $1 == 'END'
|
482
|
-
when /\A
|
496
|
+
when /\A register_command (.+)/
|
483
497
|
next unless cat
|
484
498
|
next unless desc
|
485
|
-
|
499
|
+
|
500
|
+
ws = []
|
501
|
+
$1.gsub(/'([a-z]+)'/){|w|
|
502
|
+
ws << $1
|
503
|
+
}
|
486
504
|
helps[cat] << [ws, desc]
|
487
505
|
desc = nil
|
488
506
|
max_w = ws.max_by{|w| w.length}
|
data/lib/debug/console.rb
CHANGED
File without changes
|
data/lib/debug/frame_info.rb
CHANGED
File without changes
|
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
|