debug 1.3.4 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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