debug 1.7.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/TODO.md +8 -8
- data/lib/debug/prelude.rb +1 -1
- data/lib/debug/server_cdp.rb +22 -17
- data/lib/debug/server_dap.rb +28 -15
- data/lib/debug/thread_client.rb +10 -3
- data/lib/debug/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: a84e87e9582c98cf24ca8aa9f1f30032c10736bf4dbc1c44da016db564a7a574
         | 
| 4 | 
            +
              data.tar.gz: da093ef6ebfd8fc5e4a10fcc39c59826e45829ec09da0d9dc164b9cd71085286
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d663b6db0dba8921aaaa535f834e768367e07fef03613e6a277a27724fb75ecf830c7557465521998d42cbb41744e6335495958f626285468d6e38ae6ec52515
         | 
| 7 | 
            +
              data.tar.gz: cb24e62c5875c069812ff1b056dda3b912a20069d09123b72dbd0da69e61aed66968bc4dc5f80e9b599df743fb7755a2399f1461f344fc43ed9ea6bbf20f251c
         | 
    
        data/TODO.md
    CHANGED
    
    | @@ -2,22 +2,22 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            ## Basic functionality
         | 
| 4 4 |  | 
| 5 | 
            -
            * Support Ractors
         | 
| 6 | 
            -
            * Signal (SIGINT) trap handling 
         | 
| 5 | 
            +
            * Support Fibers and Ractors
         | 
| 7 6 |  | 
| 8 7 | 
             
            ## UI
         | 
| 9 8 |  | 
| 9 | 
            +
            * Multi-line support
         | 
| 10 10 | 
             
            * Completion for Ruby's code
         | 
| 11 11 | 
             
            * Interactive breakpoint setting
         | 
| 12 12 | 
             
            * Interactive record & play debugging
         | 
| 13 13 | 
             
            * irb integration
         | 
| 14 | 
            -
            * Web browser integrated UI
         | 
| 15 | 
            -
            * History file
         | 
| 16 14 |  | 
| 17 15 | 
             
            ## Debug command
         | 
| 18 16 |  | 
| 19 | 
            -
            * Breakpoints
         | 
| 20 | 
            -
                * Lightweight pending method break points with Ruby 3.1 feature (TP:method_added)
         | 
| 21 17 | 
             
            * Watch points
         | 
| 22 | 
            -
                * Lightweight watchpoints for instance variables with Ruby 3. | 
| 23 | 
            -
            *  | 
| 18 | 
            +
                * Lightweight watchpoints for instance variables with Ruby 3.3 features (TP:ivar_set)
         | 
| 19 | 
            +
            * Alias
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            ## Debug port
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            * Debug port for monitoring
         | 
    
        data/lib/debug/prelude.rb
    CHANGED
    
    
    
        data/lib/debug/server_cdp.rb
    CHANGED
    
    | @@ -34,25 +34,26 @@ module DEBUGGER__ | |
| 34 34 |  | 
| 35 35 | 
             
                    loop do
         | 
| 36 36 | 
             
                      res = ws_client.extract_data
         | 
| 37 | 
            -
                      case
         | 
| 38 | 
            -
                      when  | 
| 37 | 
            +
                      case res['id']
         | 
| 38 | 
            +
                      when 1
         | 
| 39 | 
            +
                        target_info = res.dig('result', 'targetInfos')
         | 
| 39 40 | 
             
                        page = target_info.find{|t| t['type'] == 'page'}
         | 
| 40 41 | 
             
                        ws_client.send id: 2, method: 'Target.attachToTarget',
         | 
| 41 42 | 
             
                                      params: {
         | 
| 42 43 | 
             
                                        targetId: page['targetId'],
         | 
| 43 44 | 
             
                                        flatten: true
         | 
| 44 45 | 
             
                                      }
         | 
| 45 | 
            -
                      when  | 
| 46 | 
            +
                      when 2
         | 
| 46 47 | 
             
                        s_id = res.dig('result', 'sessionId')
         | 
| 47 48 | 
             
                        # TODO: change id
         | 
| 48 49 | 
             
                        ws_client.send sessionId: s_id, id: 100, method: 'Network.enable'
         | 
| 49 50 | 
             
                        ws_client.send sessionId: s_id, id: 3,
         | 
| 50 51 | 
             
                                      method: 'Page.enable'
         | 
| 51 | 
            -
                      when  | 
| 52 | 
            +
                      when 3
         | 
| 52 53 | 
             
                        s_id = res['sessionId']
         | 
| 53 54 | 
             
                        ws_client.send sessionId: s_id, id: 4,
         | 
| 54 55 | 
             
                                      method: 'Page.getFrameTree'
         | 
| 55 | 
            -
                      when  | 
| 56 | 
            +
                      when 4
         | 
| 56 57 | 
             
                        s_id = res['sessionId']
         | 
| 57 58 | 
             
                        f_id = res.dig('result', 'frameTree', 'frame', 'id')
         | 
| 58 59 | 
             
                        ws_client.send sessionId: s_id, id: 5,
         | 
| @@ -61,17 +62,19 @@ module DEBUGGER__ | |
| 61 62 | 
             
                                        url: "devtools://devtools/bundled/inspector.html?v8only=true&panel=sources&ws=#{addr}/#{uuid}",
         | 
| 62 63 | 
             
                                        frameId: f_id
         | 
| 63 64 | 
             
                                      }
         | 
| 64 | 
            -
                      when  | 
| 65 | 
            -
                        s_id = res['sessionId']
         | 
| 66 | 
            -
                        # Display the console by entering ESC key
         | 
| 67 | 
            -
                        ws_client.send sessionId: s_id, id: 101,  # TODO: change id
         | 
| 68 | 
            -
                                      method:"Input.dispatchKeyEvent",
         | 
| 69 | 
            -
                                      params: {
         | 
| 70 | 
            -
                                        type:"keyDown",
         | 
| 71 | 
            -
                                        windowsVirtualKeyCode:27 # ESC key
         | 
| 72 | 
            -
                                      }
         | 
| 73 | 
            -
                      when res['id'] == 101
         | 
| 65 | 
            +
                      when 101
         | 
| 74 66 | 
             
                        break
         | 
| 67 | 
            +
                      else
         | 
| 68 | 
            +
                        if res['method'] == 'Network.webSocketWillSendHandshakeRequest'
         | 
| 69 | 
            +
                          s_id = res['sessionId']
         | 
| 70 | 
            +
                          # Display the console by entering ESC key
         | 
| 71 | 
            +
                          ws_client.send sessionId: s_id, id: 101,  # TODO: change id
         | 
| 72 | 
            +
                                        method:"Input.dispatchKeyEvent",
         | 
| 73 | 
            +
                                        params: {
         | 
| 74 | 
            +
                                          type:"keyDown",
         | 
| 75 | 
            +
                                          windowsVirtualKeyCode:27 # ESC key
         | 
| 76 | 
            +
                                        }
         | 
| 77 | 
            +
                        end
         | 
| 75 78 | 
             
                      end
         | 
| 76 79 | 
             
                    end
         | 
| 77 80 | 
             
                    pid
         | 
| @@ -696,6 +699,8 @@ module DEBUGGER__ | |
| 696 699 | 
             
              end
         | 
| 697 700 |  | 
| 698 701 | 
             
              class Session
         | 
| 702 | 
            +
                include GlobalVariablesHelper
         | 
| 703 | 
            +
             | 
| 699 704 | 
             
                # FIXME: unify this method with ThreadClient#propertyDescriptor.
         | 
| 700 705 | 
             
                def get_type obj
         | 
| 701 706 | 
             
                  case obj
         | 
| @@ -750,7 +755,7 @@ module DEBUGGER__ | |
| 750 755 | 
             
                        fid = @frame_map[frame_id]
         | 
| 751 756 | 
             
                        request_tc [:cdp, :scope, req, fid]
         | 
| 752 757 | 
             
                      when 'global'
         | 
| 753 | 
            -
                        vars =  | 
| 758 | 
            +
                        vars = safe_global_variables.sort.map do |name|
         | 
| 754 759 | 
             
                          gv = eval(name.to_s)
         | 
| 755 760 | 
             
                          prop = {
         | 
| 756 761 | 
             
                            name: name,
         | 
| @@ -1040,7 +1045,7 @@ module DEBUGGER__ | |
| 1040 1045 | 
             
                        case expr
         | 
| 1041 1046 | 
             
                        # Chrome doesn't read instance variables
         | 
| 1042 1047 | 
             
                        when /\A\$\S/
         | 
| 1043 | 
            -
                           | 
| 1048 | 
            +
                          safe_global_variables.each{|gvar|
         | 
| 1044 1049 | 
             
                            if gvar.to_s == expr
         | 
| 1045 1050 | 
             
                              result = eval(gvar.to_s)
         | 
| 1046 1051 | 
             
                              break false
         | 
    
        data/lib/debug/server_dap.rb
    CHANGED
    
    | @@ -452,7 +452,11 @@ module DEBUGGER__ | |
| 452 452 | 
             
                      @q_msg << req
         | 
| 453 453 |  | 
| 454 454 | 
             
                    else
         | 
| 455 | 
            -
                       | 
| 455 | 
            +
                      if respond_to? mid = "request_#{req['command']}"
         | 
| 456 | 
            +
                        send mid, req
         | 
| 457 | 
            +
                      else
         | 
| 458 | 
            +
                        raise "Unknown request: #{req.inspect}"
         | 
| 459 | 
            +
                      end
         | 
| 456 460 | 
             
                    end
         | 
| 457 461 | 
             
                  end
         | 
| 458 462 | 
             
                ensure
         | 
| @@ -516,6 +520,8 @@ module DEBUGGER__ | |
| 516 520 | 
             
              end
         | 
| 517 521 |  | 
| 518 522 | 
             
              class Session
         | 
| 523 | 
            +
                include GlobalVariablesHelper
         | 
| 524 | 
            +
             | 
| 519 525 | 
             
                def find_waiting_tc id
         | 
| 520 526 | 
             
                  @th_clients.each{|th, tc|
         | 
| 521 527 | 
             
                    return tc if tc.id == id && tc.waiting?
         | 
| @@ -562,8 +568,12 @@ module DEBUGGER__ | |
| 562 568 | 
             
                    if ref = @var_map[varid]
         | 
| 563 569 | 
             
                      case ref[0]
         | 
| 564 570 | 
             
                      when :globals
         | 
| 565 | 
            -
                        vars =  | 
| 566 | 
            -
                           | 
| 571 | 
            +
                        vars = safe_global_variables.sort.map do |name|
         | 
| 572 | 
            +
                          begin
         | 
| 573 | 
            +
                            gv = eval(name.to_s)
         | 
| 574 | 
            +
                          rescue Exception => e
         | 
| 575 | 
            +
                            gv = e.inspect
         | 
| 576 | 
            +
                          end
         | 
| 567 577 | 
             
                          {
         | 
| 568 578 | 
             
                            name: name,
         | 
| 569 579 | 
             
                            value: gv.inspect,
         | 
| @@ -721,9 +731,8 @@ module DEBUGGER__ | |
| 721 731 | 
             
              end
         | 
| 722 732 |  | 
| 723 733 | 
             
              class ThreadClient
         | 
| 724 | 
            -
             | 
| 725 734 | 
             
                MAX_LENGTH = 180
         | 
| 726 | 
            -
             | 
| 735 | 
            +
             | 
| 727 736 | 
             
                def value_inspect obj, short: true
         | 
| 728 737 | 
             
                  # TODO: max length should be configuarable?
         | 
| 729 738 | 
             
                  str = DEBUGGER__.safe_inspect obj, short: short, max_length: MAX_LENGTH
         | 
| @@ -735,6 +744,14 @@ module DEBUGGER__ | |
| 735 744 | 
             
                  end
         | 
| 736 745 | 
             
                end
         | 
| 737 746 |  | 
| 747 | 
            +
                def dap_eval b, expr, _context, prompt: '(repl_eval)'
         | 
| 748 | 
            +
                  begin
         | 
| 749 | 
            +
                    b.eval(expr.to_s, prompt)
         | 
| 750 | 
            +
                  rescue Exception => e
         | 
| 751 | 
            +
                    e
         | 
| 752 | 
            +
                  end
         | 
| 753 | 
            +
                end
         | 
| 754 | 
            +
             | 
| 738 755 | 
             
                def process_dap args
         | 
| 739 756 | 
             
                  # pp tc: self, args: args
         | 
| 740 757 | 
             
                  type = args.shift
         | 
| @@ -800,7 +817,7 @@ module DEBUGGER__ | |
| 800 817 | 
             
                      name: 'Global variables',
         | 
| 801 818 | 
             
                      presentationHint: 'globals',
         | 
| 802 819 | 
             
                      variablesReference: 1, # GLOBAL
         | 
| 803 | 
            -
                      namedVariables:  | 
| 820 | 
            +
                      namedVariables: safe_global_variables.size,
         | 
| 804 821 | 
             
                      indexedVariables: 0,
         | 
| 805 822 | 
             
                      expensive: false,
         | 
| 806 823 | 
             
                    }]
         | 
| @@ -837,10 +854,11 @@ module DEBUGGER__ | |
| 837 854 | 
             
                          }
         | 
| 838 855 | 
             
                        when String
         | 
| 839 856 | 
             
                          vars = [
         | 
| 840 | 
            -
                            variable('# | 
| 857 | 
            +
                            variable('#lengthddsfsd', obj.length),
         | 
| 841 858 | 
             
                            variable('#encoding', obj.encoding),
         | 
| 842 859 | 
             
                          ]
         | 
| 843 | 
            -
                           | 
| 860 | 
            +
                          printed_str = value_inspect(obj)
         | 
| 861 | 
            +
                          vars << variable('#dump', NaiveString.new(obj)) if printed_str.end_with?('...')
         | 
| 844 862 | 
             
                        when Class, Module
         | 
| 845 863 | 
             
                          vars << variable('%ancestors', obj.ancestors[1..])
         | 
| 846 864 | 
             
                        when Range
         | 
| @@ -872,12 +890,7 @@ module DEBUGGER__ | |
| 872 890 |  | 
| 873 891 | 
             
                      case context
         | 
| 874 892 | 
             
                      when 'repl', 'watch'
         | 
| 875 | 
            -
                         | 
| 876 | 
            -
                          result = b.eval(expr.to_s, '(DEBUG CONSOLE)')
         | 
| 877 | 
            -
                        rescue Exception => e
         | 
| 878 | 
            -
                          result = e
         | 
| 879 | 
            -
                        end
         | 
| 880 | 
            -
             | 
| 893 | 
            +
                        result = dap_eval b, expr, context, prompt: '(DEBUG CONSOLE)'
         | 
| 881 894 | 
             
                      when 'hover'
         | 
| 882 895 | 
             
                        case expr
         | 
| 883 896 | 
             
                        when /\A\@\S/
         | 
| @@ -887,7 +900,7 @@ module DEBUGGER__ | |
| 887 900 | 
             
                            message = "Error: Not defined instance variable: #{expr.inspect}"
         | 
| 888 901 | 
             
                          end
         | 
| 889 902 | 
             
                        when /\A\$\S/
         | 
| 890 | 
            -
                           | 
| 903 | 
            +
                          safe_global_variables.each{|gvar|
         | 
| 891 904 | 
             
                            if gvar.to_s == expr
         | 
| 892 905 | 
             
                              result = eval(gvar.to_s)
         | 
| 893 906 | 
             
                              break false
         | 
    
        data/lib/debug/thread_client.rb
    CHANGED
    
    | @@ -29,7 +29,7 @@ module DEBUGGER__ | |
| 29 29 | 
             
                end
         | 
| 30 30 |  | 
| 31 31 | 
             
                def skip_internal_path?(path)
         | 
| 32 | 
            -
                  path.start_with?(__dir__) || path.start_with?('<internal:')
         | 
| 32 | 
            +
                  path.start_with?(__dir__) || path.delete_prefix('!eval:').start_with?('<internal:')
         | 
| 33 33 | 
             
                end
         | 
| 34 34 |  | 
| 35 35 | 
             
                def skip_location?(loc)
         | 
| @@ -38,6 +38,13 @@ module DEBUGGER__ | |
| 38 38 | 
             
                end
         | 
| 39 39 | 
             
              end
         | 
| 40 40 |  | 
| 41 | 
            +
              module GlobalVariablesHelper
         | 
| 42 | 
            +
                SKIP_GLOBAL_LIST = %i[$= $KCODE $-K $SAFE].freeze
         | 
| 43 | 
            +
                def safe_global_variables
         | 
| 44 | 
            +
                  global_variables.reject{|name| SKIP_GLOBAL_LIST.include? name }
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 41 48 | 
             
              class ThreadClient
         | 
| 42 49 | 
             
                def self.current
         | 
| 43 50 | 
             
                  if thc = Thread.current[:DEBUGGER__ThreadClient]
         | 
| @@ -50,6 +57,7 @@ module DEBUGGER__ | |
| 50 57 |  | 
| 51 58 | 
             
                include Color
         | 
| 52 59 | 
             
                include SkipPathHelper
         | 
| 60 | 
            +
                include GlobalVariablesHelper
         | 
| 53 61 |  | 
| 54 62 | 
             
                attr_reader :thread, :id, :recorder, :check_bp_fulfillment_map
         | 
| 55 63 |  | 
| @@ -636,9 +644,8 @@ module DEBUGGER__ | |
| 636 644 | 
             
                  end
         | 
| 637 645 | 
             
                end
         | 
| 638 646 |  | 
| 639 | 
            -
                SKIP_GLOBAL_LIST = %i[$= $KCODE $-K $SAFE].freeze
         | 
| 640 647 | 
             
                def show_globals pat
         | 
| 641 | 
            -
                   | 
| 648 | 
            +
                  safe_global_variables.sort.each{|name|
         | 
| 642 649 | 
             
                    next if SKIP_GLOBAL_LIST.include? name
         | 
| 643 650 |  | 
| 644 651 | 
             
                    value = eval(name.to_s)
         | 
    
        data/lib/debug/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: debug
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.7. | 
| 4 | 
            +
              version: 1.7.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Koichi Sasada
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2022-12- | 
| 11 | 
            +
            date: 2022-12-22 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: irb
         |