debug 1.3.4 → 1.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 58d7a886dc29b717d9f31ca7859a40a881a251a4c5e64705ac38de1cb94c0f32
4
- data.tar.gz: a58994d8d302dac0aedd63775b8d81769d326a6bb0746d9953182fa8b36894fd
3
+ metadata.gz: a62295065b9bb4f9d498a21b32ea122ab680fd1e1b9794368ac2385858abf844
4
+ data.tar.gz: 0dc6f9aeb1ff23a47e0c399ee32ac80953821520cc52b0c4e27e30d7600a67bd
5
5
  SHA512:
6
- metadata.gz: 3988bc3fd10cab3592a9f6b3b816dd2f5cabf5e8e4bceaec646011a1663b037a7f9683008c77d1c91a0a8f984540c16ef5975fa14b93f84b6cca5915e98df440
7
- data.tar.gz: 4283c41adf172ae2d1e51bb34adfb65ab2b521862bae6be7bd08ba485bea178e0e2ec511db7b9f0297e2aea4e4d2ac249887bb9271f51d71d6beb76a0aee63d0
6
+ metadata.gz: 144d16fc2b8e377d7d25df0b09f088492647b76de2ffc1a841e09967caed2678f28fbaf24747fc351fd7e7d7c0d107cd39245ca0c8eff41547bce4f2ab35a8c3
7
+ data.tar.gz: 4e62e36b0fe72a2c1ce8e1dd44e6bae646e06b0d4d8d07072db595f908d00595252e35525a9ba1fde09a53f9a57781165c73e63d8eaa8a59a5e93219bd4c9ed5
@@ -0,0 +1,9 @@
1
+ Thanks for your Pull Request 🎉
2
+
3
+ **Please follow these instructions to help us review it more efficiently:**
4
+
5
+ - Add references of related issues/PRs in the description if available.
6
+ - If you're updating the readme file, make sure you followed [the instruction here](https://github.com/ruby/debug/blob/master/CONTRIBUTING.md#to-update-readme).
7
+
8
+ ## Description
9
+ Describe your changes:
data/CONTRIBUTING.md CHANGED
@@ -26,11 +26,17 @@ $ ruby test/debug/bp_test.rb -h # to see all the test options
26
26
  ```
27
27
 
28
28
  ## Generate Tests
29
+
29
30
  There is a test generator in `debug.rb` project to make it easier to write tests.
31
+
30
32
  ### Quickstart
31
- This section shows you how to create test file by test generator. For more advanced informations on creating tests, please take a look at [gentest options](#gentest-options). (You can also check by `$bin/gentest -h`)
33
+
34
+ This section shows you how to create test file by test generator. For more advanced information on creating tests, please take a look at [gentest options](#gentest-options). (You can also check by `$bin/gentest -h`)
35
+
32
36
  #### 1. Create a target file for debuggee.
37
+
33
38
  Let's say, we created `target.rb` which is located in top level directory of debugger.
39
+
34
40
  ```ruby
35
41
  module Foo
36
42
  class Bar
@@ -42,11 +48,15 @@ module Foo
42
48
  bar = Bar.new
43
49
  end
44
50
  ```
51
+
45
52
  #### 2. Run `gentest` as shown in the example below.
53
+
46
54
  ```shell
47
55
  $ bin/gentest target.rb
48
56
  ```
57
+
49
58
  #### 3. Debugger will be executed. You can type any debug commands.
59
+
50
60
  ```shell
51
61
  $ bin/gentest target.rb
52
62
  DEBUGGER: Session start (pid: 11139)
@@ -119,8 +129,11 @@ created: /Users/naotto/workspace/debug/test/tool/../debug/foo_test.rb
119
129
  class: FooTest
120
130
  method: test_1629720194
121
131
  ```
132
+
122
133
  #### 4. The test file will be created as `test/debug/foo_test.rb`.
134
+
123
135
  If the file already exists, **only method** will be added to it.
136
+
124
137
  ```ruby
125
138
  # frozen_string_literal: true
126
139
 
@@ -204,17 +217,37 @@ end
204
217
  ```
205
218
 
206
219
  #### gentest options
220
+
207
221
  You can get more information about `gentest` here.
208
222
 
209
- The default method name is `test_#{some integer numbers}`, the class name is `FooTest`, and the file name will be `foo_test.rb`.
223
+ The default method name is `test_#{some integer numbers}`, the class name is `FooTest#{some integer numbers}`, and the file name will be `foo_test.rb`.
210
224
  The following table shows examples of the gentest options.
211
225
 
212
226
  | Command | Description | File | Class | Method |
213
227
  | --- | --- | --- | --- | --- |
214
- | `$ bin/gentest target.rb` | Run without any options | `foo_test.rb` | `FooTest` | `test_#{some integer numbers}` |
215
- | `$ bin/gentest target.rb -c step` | Specify the class name | `step_test.rb` | `StepTest` | `test_#{some integer numbers}` |
216
- | `$ bin/gentest target.rb -m test_step` | Specify the method name | `foo_test.rb` | `FooTest` | `test_step` |
217
- | `$ bin/gentest target.rb -c step -m test_step` | Specify the class name and the method name | `step_test.rb` | `StepTest` | `test_step` |
228
+ | `$ bin/gentest target.rb` | Run without any options | `foo_test.rb` | `FooTest...` | `test_...` |
229
+ | `$ bin/gentest target.rb --open=vscode` | Run the debugger with VScode | `foo_test.rb` | `FooTest...` | `test_...` |
230
+ | `$ bin/gentest target.rb -c step` | Specify the class name | `step_test.rb` | `StepTest...` | `test_...` |
231
+ | `$ bin/gentest target.rb -m test_step` | Specify the method name | `foo_test.rb` | `FooTest...` | `test_step` |
232
+ | `$ bin/gentest target.rb -c step -m test_step` | Specify the class name and the method name | `step_test.rb` | `StepTest...` | `test_step` |
233
+
234
+ ### Assertions
235
+
236
+ - assert_line_num(expected)
237
+
238
+ Passes if `expected` is equal to the location where debugger stops.
239
+
240
+ - assert_line_text(text)
241
+
242
+ Passes if `text` is included in the last debugger log.
243
+
244
+ - assert_no_line_text(text)
245
+
246
+ Passes if `text` is not included in the last debugger log.
247
+
248
+ - assert_debuggee_line_text(text)
249
+
250
+ Passes if `text` is included in the debuggee log.
218
251
 
219
252
  ## To Update README
220
253
 
data/README.md CHANGED
@@ -60,8 +60,14 @@ There are several options for (1) and (2). Please choose your favorite way.
60
60
 
61
61
  ### Modify source code with [`binding.break`](#bindingbreak-method) (similar to `binding.pry` or `binding.irb`)
62
62
 
63
- If you can modify the source code, you can use the debugger by adding `require 'debug'` line at the top of your program and putting [`binding.break`](#bindingbreak-method) method (`binding.b` for short) into lines where you want to stop as breakpoints like `binding.pry` and `binding.irb`.
64
- After that, you run the program as usual and you will enter the debug console at breakpoints you inserted.
63
+ If you can modify the source code, you can use the debugger by adding `require 'debug'` at the top of your program and putting [`binding.break`](#bindingbreak-method) method into lines where you want to stop as breakpoints like `binding.pry` and `binding.irb`.
64
+
65
+ You can also use its 2 aliases in the same way:
66
+
67
+ - `binding.b`
68
+ - `debugger`
69
+
70
+ After that, run the program as usual and you will enter the debug console at breakpoints you inserted.
65
71
 
66
72
  The following example shows the demonstration of [`binding.break`](#bindingbreak-method).
67
73
 
@@ -346,7 +352,7 @@ You can attach with external debugger frontend with VSCode and Chrome.
346
352
  $ rdbg --open=[frontend] target.rb
347
353
  ```
348
354
 
349
- will open a debug port and `[frontned]` can attache to the port.
355
+ will open a debug port and `[frontend]` can attach to the port.
350
356
 
351
357
  Also `open` command allows opening the debug port.
352
358
 
@@ -427,7 +433,9 @@ Type `devtools://devtools/bundled/inspector.html?ws=127.0.0.1:43633` in the addr
427
433
 
428
434
  Also `open chrome` command works like `open vscode`.
429
435
 
430
- For more information about how to use Chrome debugging, you might want to read [here](https://developer.chrome.com/docs/devtools/)
436
+ For more information about how to use Chrome debugging, you might want to read [here](https://developer.chrome.com/docs/devtools/).
437
+
438
+ Note: If you want to maximize Chrome DevTools, click [Toggle Device Toolbar](https://developer.chrome.com/docs/devtools/device-mode/#viewport).
431
439
 
432
440
  ## Configuration
433
441
 
@@ -479,6 +487,7 @@ config set no_color true
479
487
  * `RUBY_DEBUG_SOCK_DIR` (`sock_dir`): UNIX Domain Socket remote debugging: socket directory
480
488
  * `RUBY_DEBUG_COOKIE` (`cookie`): Cookie for negotiation
481
489
  * `RUBY_DEBUG_OPEN_FRONTEND` (`open_frontend`): frontend used by open command (vscode, chrome, default: rdbg).
490
+ * `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))
482
491
 
483
492
  * OBSOLETE
484
493
  * `RUBY_DEBUG_PARENT_ON_FORK` (`parent_on_fork`): Keep debugging parent process on fork (default: false)
@@ -525,7 +534,7 @@ The `<...>` notation means the argument.
525
534
  * `fin[ish]`
526
535
  * Finish this frame. Resume the program until the current frame is finished.
527
536
  * `fin[ish] <n>`
528
- * Finish frames, same as `step <n>`.
537
+ * Finish `<n>`th frames.
529
538
  * `c[ontinue]`
530
539
  * Resume the program.
531
540
  * `q[uit]` or `Ctrl-D`
@@ -533,11 +542,11 @@ The `<...>` notation means the argument.
533
542
  * `q[uit]!`
534
543
  * Same as q[uit] but without the confirmation prompt.
535
544
  * `kill`
536
- * Stop the debuggee process with `Kernal#exit!`.
545
+ * Stop the debuggee process with `Kernel#exit!`.
537
546
  * `kill!`
538
547
  * Same as kill but without the confirmation prompt.
539
548
  * `sigint`
540
- * Execute SIGINT handler registerred by the debuggee.
549
+ * Execute SIGINT handler registered by the debuggee.
541
550
  * Note that this command should be used just after stop by `SIGINT`.
542
551
 
543
552
  ### Breakpoint
@@ -558,14 +567,32 @@ The `<...>` notation means the argument.
558
567
  * break and run `<command>` before stopping.
559
568
  * `b[reak] ... do: <command>`
560
569
  * break and run `<command>`, and continue.
570
+ * `b[reak] ... path: <path_regexp>`
571
+ * break if the triggering event's path matches <path_regexp>.
561
572
  * `b[reak] if: <expr>`
562
573
  * break if: `<expr>` is true at any lines.
563
574
  * Note that this feature is super slow.
564
575
  * `catch <Error>`
565
576
  * Set breakpoint on raising `<Error>`.
577
+ * `catch ... if: <expr>`
578
+ * stops only if `<expr>` is true as well.
579
+ * `catch ... pre: <command>`
580
+ * runs `<command>` before stopping.
581
+ * `catch ... do: <command>`
582
+ * stops and run `<command>`, and continue.
583
+ * `catch ... path: <path_regexp>`
584
+ * stops if the exception is raised from a path that matches <path_regexp>.
566
585
  * `watch @ivar`
567
586
  * Stop the execution when the result of current scope's `@ivar` is changed.
568
587
  * Note that this feature is super slow.
588
+ * `watch ... if: <expr>`
589
+ * stops only if `<expr>` is true as well.
590
+ * `watch ... pre: <command>`
591
+ * runs `<command>` before stopping.
592
+ * `watch ... do: <command>`
593
+ * stops and run `<command>`, and continue.
594
+ * `watch ... path: <path_regexp>`
595
+ * stops if the triggering event's path matches <path_regexp>.
569
596
  * `del[ete]`
570
597
  * delete all breakpoints.
571
598
  * `del[ete] <bpnum>`
data/bin/gentest CHANGED
@@ -4,19 +4,27 @@ require 'optparse'
4
4
 
5
5
  require_relative '../test/tool/test_builder'
6
6
 
7
- file_info = {}
7
+ options = {}
8
8
 
9
9
  OptionParser.new do |opt|
10
10
  opt.banner = 'Usage: bin/gentest [file] [option]'
11
11
  opt.on('-m METHOD', 'Method name in the test file') do |m|
12
- file_info[:method] = m
12
+ options[:method] = m
13
13
  end
14
14
  opt.on('-c CLASS', 'Class name in the test file') do |c|
15
- file_info[:class] = c
15
+ options[:class] = c
16
+ end
17
+ opt.on('--open=FRONTEND', 'Start remote debugging with opening the network port.',
18
+ 'Currently, only vscode is supported.') do |f|
19
+ options[:open] = f.downcase
16
20
  end
17
21
  opt.parse!(ARGV)
18
22
  end
19
23
 
20
24
  exit if ARGV.empty?
21
25
 
22
- DEBUGGER__::TestBuilder.new(ARGV, file_info[:method], file_info[:class]).start
26
+ if options[:open] == 'vscode'
27
+ DEBUGGER__::DAPTestBuilder.new(ARGV, options[:method], options[:class]).start
28
+ else
29
+ DEBUGGER__::LocalTestBuilder.new(ARGV, options[:method], options[:class]).start
30
+ end
data/ext/debug/debug.c CHANGED
@@ -32,7 +32,10 @@ di_entry(VALUE loc, VALUE self, VALUE binding, VALUE iseq, VALUE klass, VALUE de
32
32
  // :show_line, :local_variables
33
33
  Qnil,
34
34
  // :_local_variables, :_callee # for recorder
35
- Qnil, Qnil);
35
+ Qnil, Qnil,
36
+ // :dupped_binding
37
+ Qnil
38
+ );
36
39
  }
37
40
 
38
41
  static int
@@ -4,6 +4,8 @@ require_relative 'color'
4
4
 
5
5
  module DEBUGGER__
6
6
  class Breakpoint
7
+ include SkipPathHelper
8
+
7
9
  attr_reader :key
8
10
 
9
11
  def initialize do_enable = true
@@ -23,6 +25,10 @@ module DEBUGGER__
23
25
  nil
24
26
  end
25
27
 
28
+ def oneshot?
29
+ defined?(@oneshot) && @oneshot
30
+ end
31
+
26
32
  def setup
27
33
  raise "not implemented..."
28
34
  end
@@ -75,6 +81,14 @@ module DEBUGGER__
75
81
  false
76
82
  end
77
83
 
84
+ def skip_path?(path)
85
+ if @path
86
+ !path.match?(@path)
87
+ else
88
+ super
89
+ end
90
+ end
91
+
78
92
  include Color
79
93
 
80
94
  def generate_label(name)
@@ -87,6 +101,28 @@ module DEBUGGER__
87
101
  TracePoint.new(:line){}.enable{}
88
102
  end
89
103
 
104
+ class ISeqBreakpoint < Breakpoint
105
+ def initialize iseq, events, oneshot: false
106
+ @events = events
107
+ @iseq = iseq
108
+ @oneshot = oneshot
109
+ @key = [:iseq, @iseq.path, @iseq.first_lineno].freeze
110
+
111
+ super()
112
+ end
113
+
114
+ def setup
115
+ @tp = TracePoint.new(*@events) do |tp|
116
+ delete if @oneshot
117
+ suspend
118
+ end
119
+ end
120
+
121
+ def enable
122
+ @tp.enable(target: @iseq)
123
+ end
124
+ end
125
+
90
126
  class LineBreakpoint < Breakpoint
91
127
  attr_reader :path, :line, :iseq
92
128
 
@@ -235,24 +271,25 @@ module DEBUGGER__
235
271
 
236
272
  class CatchBreakpoint < Breakpoint
237
273
  attr_reader :last_exc
238
- include SkipPathHelper
239
274
 
240
- def initialize pat, cond: nil, command: nil
275
+ def initialize pat, cond: nil, command: nil, path: nil
241
276
  @pat = pat.freeze
242
277
  @key = [:catch, @pat].freeze
243
278
  @last_exc = nil
244
279
 
245
280
  @cond = cond
246
281
  @command = command
282
+ @path = path
247
283
 
248
284
  super()
249
285
  end
250
286
 
251
287
  def setup
252
288
  @tp = TracePoint.new(:raise){|tp|
253
- next if skip_path?(tp.path)
254
289
  exc = tp.raised_exception
255
290
  next if SystemExit === exc
291
+ next if skip_path?(tp.path)
292
+
256
293
  next if !safe_eval(tp.binding, @cond) if @cond
257
294
  should_suspend = false
258
295
 
@@ -277,9 +314,10 @@ module DEBUGGER__
277
314
  end
278
315
 
279
316
  class CheckBreakpoint < Breakpoint
280
- def initialize expr
317
+ def initialize expr, path
281
318
  @expr = expr.freeze
282
319
  @key = [:check, @expr].freeze
320
+ @path = path
283
321
 
284
322
  super()
285
323
  end
@@ -289,6 +327,7 @@ module DEBUGGER__
289
327
  next if tp.path.start_with? __dir__
290
328
  next if tp.path.start_with? '<internal:'
291
329
  next if ThreadClient.current.management?
330
+ next if skip_path?(tp.path)
292
331
 
293
332
  if safe_eval tp.binding, @expr
294
333
  suspend
@@ -302,22 +341,29 @@ module DEBUGGER__
302
341
  end
303
342
 
304
343
  class WatchIVarBreakpoint < Breakpoint
305
- def initialize ivar, object, current
344
+ def initialize ivar, object, current, cond: nil, command: nil, path: nil
306
345
  @ivar = ivar.to_sym
307
346
  @object = object
308
- @key = [:watch, @ivar].freeze
347
+ @key = [:watch, object.object_id, @ivar].freeze
309
348
 
310
349
  @current = current
350
+
351
+ @cond = cond
352
+ @command = command
353
+ @path = path
311
354
  super()
312
355
  end
313
356
 
314
- def watch_eval
357
+ def watch_eval(tp)
315
358
  result = @object.instance_variable_get(@ivar)
316
359
  if result != @current
317
360
  begin
318
361
  @prev = @current
319
362
  @current = result
320
- suspend
363
+
364
+ if (@cond.nil? || @object.instance_eval(@cond)) && !skip_path?(tp.path)
365
+ suspend
366
+ end
321
367
  ensure
322
368
  remove_instance_variable(:@prev)
323
369
  end
@@ -331,7 +377,7 @@ module DEBUGGER__
331
377
  next if tp.path.start_with? __dir__
332
378
  next if tp.path.start_with? '<internal:'
333
379
 
334
- watch_eval
380
+ watch_eval(tp)
335
381
  }
336
382
  end
337
383
 
@@ -349,7 +395,7 @@ module DEBUGGER__
349
395
  class MethodBreakpoint < Breakpoint
350
396
  attr_reader :sig_method_name, :method
351
397
 
352
- def initialize b, klass_name, op, method_name, cond: nil, command: nil
398
+ def initialize b, klass_name, op, method_name, cond: nil, command: nil, path: nil
353
399
  @sig_klass_name = klass_name
354
400
  @sig_op = op
355
401
  @sig_method_name = method_name
@@ -361,6 +407,7 @@ module DEBUGGER__
361
407
  @cond = cond
362
408
  @cond_class = nil
363
409
  @command = command
410
+ @path = path
364
411
  @key = "#{klass_name}#{op}#{method_name}".freeze
365
412
 
366
413
  super(false)
@@ -370,7 +417,10 @@ module DEBUGGER__
370
417
  @tp = TracePoint.new(:call){|tp|
371
418
  next if !safe_eval(tp.binding, @cond) if @cond
372
419
  next if @cond_class && !tp.self.kind_of?(@cond_class)
373
- next if @override_method ? (caller_locations(2, 1).first.to_s.start_with?(__dir__)) : tp.path.start_with?(__dir__)
420
+
421
+ caller_location = caller_locations(2, 1).first.to_s
422
+ next if caller_location.start_with?(__dir__)
423
+ next if skip_path?(caller_location)
374
424
 
375
425
  suspend
376
426
  }
data/lib/debug/client.rb CHANGED
@@ -21,20 +21,56 @@ module DEBUGGER__
21
21
  when 'list-socks'
22
22
  cleanup_unix_domain_sockets
23
23
  puts list_connections
24
- when 'init'
25
- if ARGV.shift == '-'
26
- puts <<~EOS
27
- export RUBYOPT="-r #{__dir__}/prelude $(RUBYOPT)"
28
- EOS
29
- else
30
- puts <<~EOS
31
- # add the following lines in your .bash_profile
32
-
33
- eval "$(rdbg init -)"
34
- EOS
35
- end
24
+ when 'setup-autoload'
25
+ setup_autoload
26
+ else
27
+ abort "Unknown utility: #{name}"
28
+ end
29
+ end
30
+
31
+ def working_shell_type
32
+ shell = `ps -p #{Process.ppid} -o 'args='`
33
+ case shell
34
+ when /bash/
35
+ :bash
36
+ when /fish/
37
+ :fish
38
+ when /csh/
39
+ :csh
40
+ when /zsh/
41
+ :szh
42
+ when /dash/
43
+ :dash
36
44
  else
37
- raise "Unknown utility: #{name}"
45
+ :unknown
46
+ end
47
+ end
48
+
49
+ def setup_autoload
50
+ prelude_path = File.join(__dir__, 'prelude.rb')
51
+
52
+ case shell = working_shell_type
53
+ when :bash, :zsh
54
+ puts <<~EOS
55
+ # add the following lines in your ~/.#{shell}_profile
56
+
57
+ if test -s #{prelude_path} ; then
58
+ export RUBYOPT='-r #{prelude_path}'
59
+ fi
60
+
61
+ # Add `Kernel#bb` method which is alias of `Kernel#debugger`
62
+ # export RUBY_DEBUG_BB=1
63
+ EOS
64
+
65
+ when :fish
66
+ puts <<~EOS
67
+ # add the following lines in your ~/.config/fish/config.fish
68
+ set -x RUBYOPT "-r #{__dir__}/prelude" $RUBYOPT
69
+ EOS
70
+
71
+ else
72
+ puts "# Sorry that your shell is not supported yet.",
73
+ "# Please use the content in #{prelude_path} as a reference and modify your login script accordingly."
38
74
  end
39
75
  end
40
76
 
@@ -134,9 +170,14 @@ module DEBUGGER__
134
170
  trap(:SIGINT){
135
171
  send "pause"
136
172
  }
137
- trap(:SIGWINCH){
138
- @width = IO.console_size[1]
139
- }
173
+
174
+ begin
175
+ trap(:SIGWINCH){
176
+ @width = IO.console_size[1]
177
+ }
178
+ rescue ArgumentError => e
179
+ @width = 80
180
+ end
140
181
 
141
182
  while line = @s.gets
142
183
  p recv: line if $VERBOSE
data/lib/debug/color.rb CHANGED
@@ -48,33 +48,29 @@ module DEBUGGER__
48
48
 
49
49
  if defined? IRB::ColorPrinter.pp
50
50
  def color_pp obj, width
51
- if !CONFIG[:no_color]
52
- IRB::ColorPrinter.pp(obj, "".dup, width)
53
- else
54
- obj.pretty_inspect
51
+ with_inspection_error_guard do
52
+ if !CONFIG[:no_color]
53
+ IRB::ColorPrinter.pp(obj, "".dup, width)
54
+ else
55
+ obj.pretty_inspect
56
+ end
55
57
  end
56
58
  end
57
59
  else
58
60
  def color_pp obj, width
59
- obj.pretty_inspect
61
+ with_inspection_error_guard do
62
+ obj.pretty_inspect
63
+ end
60
64
  end
61
65
  end
62
66
 
63
67
  def colored_inspect obj, width: SESSION.width, no_color: false
64
- if !no_color
65
- color_pp obj, width
66
- else
67
- obj.pretty_inspect
68
- end
69
- rescue => ex
70
- err_msg = "#{ex.inspect} rescued during inspection"
71
- string_result = obj.to_s rescue nil
72
-
73
- # don't colorize the string here because it's not from user's application
74
- if string_result
75
- %Q{"#{string_result}" from #to_s because #{err_msg}}
76
- else
77
- err_msg
68
+ with_inspection_error_guard do
69
+ if !no_color
70
+ color_pp obj, width
71
+ else
72
+ obj.pretty_inspect
73
+ end
78
74
  end
79
75
  end
80
76
 
@@ -109,5 +105,19 @@ module DEBUGGER__
109
105
  def colorize_dim(str)
110
106
  colorize(str, [:DIM])
111
107
  end
108
+
109
+ def with_inspection_error_guard
110
+ yield
111
+ rescue Exception => ex
112
+ err_msg = "#{ex.inspect} rescued during inspection"
113
+ string_result = obj.to_s rescue nil
114
+
115
+ # don't colorize the string here because it's not from user's application
116
+ if string_result
117
+ %Q{"#{string_result}" from #to_s because #{err_msg}}
118
+ else
119
+ err_msg
120
+ end
121
+ end
112
122
  end
113
123
  end
data/lib/debug/config.rb CHANGED
@@ -43,20 +43,23 @@ module DEBUGGER__
43
43
  sock_dir: ['RUBY_DEBUG_SOCK_DIR', "REMOTE: UNIX Domain Socket remote debugging: socket directory"],
44
44
  cookie: ['RUBY_DEBUG_COOKIE', "REMOTE: Cookie for negotiation"],
45
45
  open_frontend: ['RUBY_DEBUG_OPEN_FRONTEND',"REMOTE: frontend used by open command (vscode, chrome, default: rdbg)."],
46
+ 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))"],
46
47
 
47
48
  # obsolete
48
49
  parent_on_fork: ['RUBY_DEBUG_PARENT_ON_FORK', "OBSOLETE: Keep debugging parent process on fork (default: false)", :bool],
49
50
  }.freeze
50
51
 
51
- CONFIG_MAP = CONFIG_SET.map{|k, (ev, desc)| [k, ev]}.to_h.freeze
52
+ CONFIG_MAP = CONFIG_SET.map{|k, (ev, _)| [k, ev]}.to_h.freeze
52
53
 
53
54
  class Config
55
+ @config = nil
56
+
54
57
  def self.config
55
58
  @config
56
59
  end
57
60
 
58
61
  def initialize argv
59
- if self.class.instance_variable_defined? :@config
62
+ if self.class.config
60
63
  raise 'Can not make multiple configurations in one process'
61
64
  end
62
65
 
@@ -480,7 +483,7 @@ module DEBUGGER__
480
483
  self.helps.each{|cat, cmds|
481
484
  r << "### #{cat}"
482
485
  r << ''
483
- cmds.each{|ws, desc|
486
+ cmds.each{|_, desc|
484
487
  r << desc
485
488
  }
486
489
  r << ''
data/lib/debug/console.rb CHANGED
@@ -34,6 +34,12 @@ module DEBUGGER__
34
34
  load_history_if_not_loaded
35
35
  commands = DEBUGGER__.commands
36
36
 
37
+ prev_completion_proc = Reline.completion_proc
38
+ prev_output_modifier_proc = Reline.output_modifier_proc
39
+ prev_prompt_proc = Reline.prompt_proc
40
+
41
+ Reline.prompt_proc = nil
42
+
37
43
  Reline.completion_proc = -> given do
38
44
  buff = Reline.line_buffer
39
45
  Reline.completion_append_character= ' '
@@ -72,6 +78,13 @@ module DEBUGGER__
72
78
  colorize_code(buff.chomp) + colorize(" # ruby", [:DIM])
73
79
  end
74
80
  end
81
+
82
+ yield
83
+
84
+ ensure
85
+ Reline.completion_proc = prev_completion_proc
86
+ Reline.output_modifier_proc = prev_output_modifier_proc
87
+ Reline.prompt_proc = prev_prompt_proc
75
88
  end
76
89
 
77
90
  private def get_command line
@@ -84,8 +97,9 @@ module DEBUGGER__
84
97
  end
85
98
 
86
99
  def readline prompt
87
- readline_setup prompt
88
- Reline.readmultiline(prompt, true){ true }
100
+ readline_setup prompt do
101
+ Reline.readmultiline(prompt, true){ true }
102
+ end
89
103
  end
90
104
 
91
105
  def history
@@ -145,7 +159,7 @@ module DEBUGGER__
145
159
  FH = "# Today's OMIKUJI: "
146
160
 
147
161
  def read_history_file
148
- if history && File.exists?(path = history_file)
162
+ if history && File.exist?(path = history_file)
149
163
  f = (['', 'DAI-', 'CHU-', 'SHO-'].map{|e| e+'KICHI'}+['KYO']).sample
150
164
  ["#{FH}#{f}".dup] + File.readlines(path)
151
165
  else