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 +4 -4
 - data/.github/pull_request_template.md +9 -0
 - data/CONTRIBUTING.md +39 -6
 - data/README.md +34 -7
 - data/bin/gentest +12 -4
 - data/ext/debug/debug.c +4 -1
 - data/lib/debug/breakpoint.rb +61 -11
 - data/lib/debug/client.rb +57 -16
 - data/lib/debug/color.rb +29 -19
 - data/lib/debug/config.rb +6 -3
 - data/lib/debug/console.rb +17 -3
 - data/lib/debug/frame_info.rb +11 -16
 - data/lib/debug/prelude.rb +2 -2
 - data/lib/debug/server.rb +45 -77
 - data/lib/debug/server_cdp.rb +590 -93
 - data/lib/debug/server_dap.rb +231 -53
 - data/lib/debug/session.rb +114 -52
 - data/lib/debug/source_repository.rb +4 -6
 - data/lib/debug/thread_client.rb +67 -48
 - data/lib/debug/tracer.rb +1 -1
 - data/lib/debug/version.rb +1 -1
 - data/misc/README.md.erb +12 -4
 - metadata +3 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: a62295065b9bb4f9d498a21b32ea122ab680fd1e1b9794368ac2385858abf844
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 0dc6f9aeb1ff23a47e0c399ee32ac80953821520cc52b0c4e27e30d7600a67bd
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
| 
       215 
     | 
    
         
            -
            | `$ bin/gentest target.rb  
     | 
| 
       216 
     | 
    
         
            -
            | `$ bin/gentest target.rb - 
     | 
| 
       217 
     | 
    
         
            -
            | `$ bin/gentest target.rb - 
     | 
| 
      
 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'`  
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
      
 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 `[ 
     | 
| 
      
 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 
     | 
| 
      
 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 ` 
     | 
| 
      
 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  
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
                 
     | 
| 
      
 12 
     | 
    
         
            +
                options[:method] = m
         
     | 
| 
       13 
13 
     | 
    
         
             
              end
         
     | 
| 
       14 
14 
     | 
    
         
             
              opt.on('-c CLASS', 'Class name in the test file') do |c|
         
     | 
| 
       15 
     | 
    
         
            -
                 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 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
         
     | 
    
        data/lib/debug/breakpoint.rb
    CHANGED
    
    | 
         @@ -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 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 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 ' 
     | 
| 
       25 
     | 
    
         
            -
                       
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                       
     | 
| 
      
 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 
     | 
    
         
            -
                       
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
                     
     | 
| 
       52 
     | 
    
         
            -
                       
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                       
     | 
| 
      
 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 
     | 
    
         
            -
                     
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
       65 
     | 
    
         
            -
                     
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
                     
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       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,  
     | 
| 
      
 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. 
     | 
| 
      
 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{| 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 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. 
     | 
| 
      
 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
         
     |