readapt 0.7.1 → 1.1.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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +16 -14
  3. data/.rspec +2 -2
  4. data/.travis.yml +18 -13
  5. data/CHANGELOG.md +76 -53
  6. data/Gemfile +4 -4
  7. data/LICENSE.txt +21 -21
  8. data/README.md +37 -29
  9. data/Rakefile +14 -25
  10. data/bin/console +14 -14
  11. data/bin/setup +8 -8
  12. data/exe/readapt +5 -5
  13. data/ext/readapt/breakpoints.c +83 -88
  14. data/ext/readapt/breakpoints.h +11 -12
  15. data/ext/readapt/extconf.rb +0 -0
  16. data/ext/readapt/frame.c +137 -0
  17. data/ext/readapt/frame.h +17 -0
  18. data/ext/readapt/hash_table.c +211 -212
  19. data/ext/readapt/hash_table.h +30 -32
  20. data/ext/readapt/inspector.c +51 -0
  21. data/ext/readapt/inspector.h +8 -0
  22. data/ext/readapt/monitor.c +40 -27
  23. data/ext/readapt/monitor.h +0 -0
  24. data/ext/readapt/normalize.c +59 -53
  25. data/ext/readapt/normalize.h +7 -7
  26. data/ext/readapt/readapt.c +18 -16
  27. data/ext/readapt/stack.c +86 -0
  28. data/ext/readapt/stack.h +20 -0
  29. data/ext/readapt/threads.c +111 -17
  30. data/ext/readapt/threads.h +11 -4
  31. data/lib/readapt.rb +21 -19
  32. data/lib/readapt/adapter.rb +98 -138
  33. data/lib/readapt/breakpoint.rb +20 -13
  34. data/lib/readapt/data_reader.rb +62 -0
  35. data/lib/readapt/debugger.rb +220 -204
  36. data/lib/readapt/error.rb +63 -0
  37. data/lib/readapt/finder.rb +20 -20
  38. data/lib/readapt/frame.rb +40 -42
  39. data/lib/readapt/input.rb +7 -0
  40. data/lib/readapt/message.rb +62 -59
  41. data/lib/readapt/message/attach.rb +11 -11
  42. data/lib/readapt/message/base.rb +32 -32
  43. data/lib/readapt/message/configuration_done.rb +11 -11
  44. data/lib/readapt/message/continue.rb +15 -15
  45. data/lib/readapt/message/disconnect.rb +13 -14
  46. data/lib/readapt/message/evaluate.rb +18 -18
  47. data/lib/readapt/message/initialize.rb +13 -13
  48. data/lib/readapt/message/launch.rb +11 -11
  49. data/lib/readapt/message/next.rb +12 -12
  50. data/lib/readapt/message/pause.rb +11 -11
  51. data/lib/readapt/message/scopes.rb +26 -25
  52. data/lib/readapt/message/set_breakpoints.rb +25 -25
  53. data/lib/readapt/message/set_exception_breakpoints.rb +8 -8
  54. data/lib/readapt/message/stack_trace.rb +38 -26
  55. data/lib/readapt/message/step_in.rb +11 -11
  56. data/lib/readapt/message/step_out.rb +11 -11
  57. data/lib/readapt/message/threads.rb +18 -18
  58. data/lib/readapt/message/variables.rb +61 -57
  59. data/lib/readapt/monitor.rb +0 -0
  60. data/lib/readapt/output.rb +25 -0
  61. data/lib/readapt/references.rb +27 -0
  62. data/lib/readapt/server.rb +22 -0
  63. data/lib/readapt/shell.rb +104 -39
  64. data/lib/readapt/snapshot.rb +1 -13
  65. data/lib/readapt/thread.rb +23 -39
  66. data/lib/readapt/variable.rb +1 -1
  67. data/lib/readapt/version.rb +3 -3
  68. data/readapt.gemspec +39 -39
  69. metadata +19 -8
  70. data/lib/readapt/location.rb +0 -25
File without changes
@@ -0,0 +1,25 @@
1
+ module Readapt
2
+ module Output
3
+ class << self
4
+ attr_accessor :adapter
5
+ end
6
+
7
+ def receiving data
8
+ send_event('output', {
9
+ output: data.force_encoding('utf-8'),
10
+ category: 'stdout'
11
+ })
12
+ end
13
+
14
+ def send_event event, data
15
+ obj = {
16
+ type: 'event',
17
+ event: event
18
+ }
19
+ obj[:body] = data unless data.nil?
20
+ json = obj.to_json
21
+ envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
22
+ Output.adapter.write envelope
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module Readapt
2
+ module References
3
+ module_function
4
+
5
+ @variable_reference_map = {}
6
+ @reference_variable_map = {}
7
+ @reference_id = 1000
8
+
9
+ def clear
10
+ @variable_reference_map.clear
11
+ @reference_variable_map.clear
12
+ @reference_id = 1000
13
+ end
14
+
15
+ def identify object
16
+ return @variable_reference_map[object] if @variable_reference_map.has_key?(object)
17
+ @reference_id += 1
18
+ @variable_reference_map[object] = @reference_id
19
+ @reference_variable_map[@reference_id] = object
20
+ @reference_id
21
+ end
22
+
23
+ def get id
24
+ @reference_variable_map[id]
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ require 'securerandom'
2
+ require 'stringio'
3
+
4
+ module Readapt
5
+ module Server
6
+ class << self
7
+ attr_accessor :target_in
8
+ attr_accessor :target_pid
9
+ end
10
+
11
+ def opening
12
+ Error.adapter = self
13
+ Output.adapter = self
14
+ end
15
+
16
+ def receiving data
17
+ Server.target_in.syswrite data
18
+ rescue Errno::EPIPE, IOError
19
+ close
20
+ end
21
+ end
22
+ end
@@ -1,39 +1,104 @@
1
- require 'thor'
2
- require 'backport'
3
-
4
- module Readapt
5
- class Shell < Thor
6
- map %w[--version -v] => :version
7
-
8
- desc "--version, -v", "Print the version"
9
- def version
10
- puts Readapt::VERSION
11
- end
12
-
13
- desc 'serve', 'Run a DAP server'
14
- option :host, type: :string, aliases: :h, description: 'The server host', default: '127.0.0.1'
15
- option :port, type: :numeric, aliases: :p, description: 'The server port', default: 1234
16
- def serve
17
- machine = Backport::Machine.new
18
- machine.run do
19
- Signal.trap("INT") do
20
- graceful_shutdown
21
- end
22
- Signal.trap("TERM") do
23
- graceful_shutdown
24
- end
25
- debugger = Readapt::Debugger.new(machine)
26
- Readapt::Adapter.host debugger
27
- machine.prepare Backport::Server::Tcpip.new(host: options[:host], port: options[:port], adapter: Readapt::Adapter)
28
- STDERR.puts "Readapt Debugger #{Readapt::VERSION} is listening HOST=#{options[:host]} PORT=#{options[:port]} PID=#{Process.pid}"
29
- end
30
- end
31
-
32
- private
33
-
34
- def graceful_shutdown
35
- Backport.stop
36
- exit
37
- end
38
- end
39
- end
1
+ require 'thor'
2
+ require 'backport'
3
+ require 'open3'
4
+ require 'securerandom'
5
+ require 'socket'
6
+
7
+ module Readapt
8
+ class Shell < Thor
9
+ map %w[--version -v] => :version
10
+
11
+ desc "--version, -v", "Print the version"
12
+ def version
13
+ puts Readapt::VERSION
14
+ end
15
+
16
+ desc 'socket', 'Run a DAP server over TCP'
17
+ option :host, type: :string, aliases: :h, description: 'The server host', default: '127.0.0.1'
18
+ option :port, type: :numeric, aliases: :p, description: 'The server port', default: 1234
19
+ def socket
20
+ machine = Backport::Machine.new
21
+ machine.run do
22
+ prepare_machine machine
23
+ server = Backport::Server::Tcpip.new(host: options[:host], port: options[:port], adapter: Readapt::Server)
24
+ machine.prepare server
25
+ STDERR.puts "Readapt Debugger #{Readapt::VERSION} is listening HOST=#{options[:host]} PORT=#{options[:port]} PID=#{Process.pid}"
26
+ end
27
+ end
28
+ map serve: :socket
29
+
30
+ desc 'stdio', 'Run a DAP server over STDIO'
31
+ def stdio
32
+ machine = Backport::Machine.new
33
+ machine.run do
34
+ prepare_machine machine
35
+ server = Backport::Server::Stdio.new(adapter: Readapt::Server)
36
+ machine.prepare server
37
+ end
38
+ end
39
+
40
+ desc 'target [PROCID]', 'Run a target process'
41
+ def target procid = nil
42
+ STDIN.binmode
43
+ STDOUT.binmode
44
+ STDERR.binmode
45
+ STDOUT.sync = true
46
+ STDERR.sync = true
47
+ Readapt::Adapter.procid = procid
48
+ machine = Backport::Machine.new
49
+ Signal.trap("INT") do
50
+ graceful_shutdown machine
51
+ end
52
+ Signal.trap("TERM") do
53
+ graceful_shutdown machine
54
+ end
55
+ machine.run do
56
+ debugger = Readapt::Debugger.new
57
+ Readapt::Adapter.host debugger
58
+ machine.prepare Backport::Server::Stdio.new(input: STDIN, output: STDERR, adapter: Readapt::Adapter)
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ # @param machine [Backport::Machine]
65
+ # @return [void]
66
+ def prepare_machine machine
67
+ STDOUT.sync = true
68
+ STDERR.sync = true
69
+ Signal.trap("INT") do
70
+ graceful_shutdown machine
71
+ end
72
+ Signal.trap("TERM") do
73
+ graceful_shutdown machine
74
+ end
75
+ procid = SecureRandom.hex(8)
76
+ Readapt::Error.procid = procid
77
+ stdin, stdout, stderr, thr = Open3.popen3('ruby', $0, 'target', procid)
78
+ stdin.sync = true
79
+ stdout.sync = true
80
+ stderr.sync = true
81
+ stdin.binmode
82
+ Readapt::Server.target_in = stdin
83
+ Readapt::Server.target_pid = thr[:pid]
84
+ output = Backport::Server::Stdio.new(input: stdout, output: stdin, adapter: Readapt::Output)
85
+ error = Backport::Server::Stdio.new(input: stderr, output: stdin, adapter: Readapt::Error)
86
+ machine.prepare output
87
+ machine.prepare error
88
+ at_exit do
89
+ begin
90
+ Process.kill 'KILL', thr[:pid]
91
+ rescue Errno::ESRCH
92
+ # Ignore
93
+ end
94
+ end
95
+ end
96
+
97
+ # @param machine [Backport::Machine]
98
+ # @return [void]
99
+ def graceful_shutdown machine
100
+ machine.stop
101
+ exit
102
+ end
103
+ end
104
+ end
@@ -7,25 +7,16 @@ module Readapt
7
7
  # @return [Integer]
8
8
  attr_reader :thread_id
9
9
 
10
- # @return [Integer]
11
- attr_reader :binding_id
12
-
13
10
  # @return [String]
14
11
  attr_reader :file
15
12
 
16
13
  # @return [Integer]
17
14
  attr_reader :line
18
15
 
19
- # @return [Symbol]
20
- attr_reader :method_name
21
-
22
16
  # The reason for pausing the debugging, e.g., "breakpoint" or "step"
23
17
  # @return [String, Symbol]
24
18
  attr_reader :event
25
19
 
26
- # @return [Integer]
27
- attr_reader :depth
28
-
29
20
  # @return [Symbol]
30
21
  attr_accessor :control
31
22
 
@@ -36,14 +27,11 @@ module Readapt
36
27
  # @param method_name [Symbol]
37
28
  # @param event [String, Symbol]
38
29
  # @param depth [Integer]
39
- def initialize thread_id, binding_id, file, line, method_name, event, depth
30
+ def initialize thread_id, file, line, event
40
31
  @thread_id = thread_id
41
- @binding_id = binding_id
42
32
  @file = file
43
33
  @line = line
44
- @method_name = method_name
45
34
  @event = event
46
- @depth = depth
47
35
  @control = :pause
48
36
  end
49
37
  end
@@ -1,39 +1,23 @@
1
- # frozen_string_literal: true
2
-
3
- require 'ostruct'
4
-
5
- module Readapt
6
- class Thread
7
- @@next_id = 0
8
-
9
- # @return [Integer]
10
- attr_reader :id
11
-
12
- # @return [String]
13
- attr_reader :name
14
-
15
- # @return [Symbol]
16
- attr_accessor :control
17
-
18
- def initialize id
19
- @id = id
20
- @@next_id += 1
21
- @name = "Thread #{@@next_id}"
22
- end
23
-
24
- def frames
25
- @frames ||= []
26
- end
27
-
28
- class NullThread < Thread
29
- def initialize
30
- @id = 0
31
- @name = 'Null Thread'
32
- @frames = [].freeze
33
- end
34
- end
35
- private_constant :NullThread
36
-
37
- NULL_THREAD = NullThread.new
38
- end
39
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'ostruct'
4
+
5
+ module Readapt
6
+ class Thread
7
+ @@next_id = 0
8
+
9
+ # @return [Symbol]
10
+ attr_accessor :control
11
+
12
+ def name
13
+ @name ||= begin
14
+ @@next_id += 1
15
+ "Thread #{@@next_id}"
16
+ end
17
+ end
18
+
19
+ def object
20
+ ObjectSpace._id2ref(id)
21
+ end
22
+ end
23
+ end
@@ -16,7 +16,7 @@ module Readapt
16
16
 
17
17
  # @return [Integer]
18
18
  def reference
19
- @reference ||= unstructured || object.object_id
19
+ @reference ||= unstructured || References.identify(object)
20
20
  end
21
21
 
22
22
  # @return [String]
@@ -1,3 +1,3 @@
1
- module Readapt
2
- VERSION = "0.7.1"
3
- end
1
+ module Readapt
2
+ VERSION = "1.1.1"
3
+ end
@@ -1,39 +1,39 @@
1
- lib = File.expand_path("lib", __dir__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "readapt/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "readapt"
7
- spec.version = Readapt::VERSION
8
- spec.authors = ["Fred Snyder"]
9
- spec.email = ["fsnyder@castwide.com"]
10
-
11
- spec.summary = 'A Ruby debugger for the Debug Adapter Protocol'
12
- spec.description = 'Readapt is a Ruby debugger that natively supports the Debug Adapter Protocol. Features include next/step in/step out, local and global variable data, and individual thread control.'
13
- spec.homepage = "https://castwide.com"
14
- spec.license = "MIT"
15
-
16
- spec.metadata["homepage_uri"] = spec.homepage
17
- spec.metadata["source_code_uri"] = "https://github.com/castwide/readapt"
18
- spec.metadata["changelog_uri"] = "https://github.com/castwide/readapt/blob/master/CHANGELOG.md"
19
-
20
- # Specify which files should be added to the gem when it is released.
21
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
- end
25
- spec.bindir = "exe"
26
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
- spec.require_paths = ["lib"]
28
- spec.extensions = ['ext/readapt/extconf.rb']
29
-
30
- spec.required_ruby_version = '>= 2.2'
31
-
32
- spec.add_dependency 'backport', '~> 1.1'
33
- spec.add_dependency 'thor', '~> 0.20'
34
-
35
- spec.add_development_dependency "rake", "~> 10.0"
36
- spec.add_development_dependency "rake-compiler", "~> 1.0"
37
- spec.add_development_dependency "rspec", "~> 3.0"
38
- spec.add_development_dependency 'simplecov', '~> 0.14'
39
- end
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "readapt/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "readapt"
7
+ spec.version = Readapt::VERSION
8
+ spec.authors = ["Fred Snyder"]
9
+ spec.email = ["fsnyder@castwide.com"]
10
+
11
+ spec.summary = 'A Ruby debugger for the Debug Adapter Protocol'
12
+ spec.description = 'Readapt is a Ruby debugger that natively supports the Debug Adapter Protocol. Features include next/step in/step out, local and global variable data, and individual thread control.'
13
+ spec.homepage = "https://castwide.com"
14
+ spec.license = "MIT"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/castwide/readapt"
18
+ spec.metadata["changelog_uri"] = "https://github.com/castwide/readapt/blob/master/CHANGELOG.md"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+ spec.extensions = ['ext/readapt/extconf.rb']
29
+
30
+ spec.required_ruby_version = '>= 2.2'
31
+
32
+ spec.add_dependency 'backport', '~> 1.1'
33
+ spec.add_dependency 'thor', '~> 1.0'
34
+
35
+ spec.add_development_dependency "rake", "~> 12.3"
36
+ spec.add_development_dependency "rake-compiler", "~> 1.0"
37
+ spec.add_development_dependency "rspec", "~> 3.0"
38
+ spec.add_development_dependency 'simplecov', '~> 0.14'
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: readapt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Snyder
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-14 00:00:00.000000000 Z
11
+ date: 2020-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backport
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.20'
33
+ version: '1.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.20'
40
+ version: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '12.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: '12.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake-compiler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -119,22 +119,30 @@ files:
119
119
  - ext/readapt/breakpoints.c
120
120
  - ext/readapt/breakpoints.h
121
121
  - ext/readapt/extconf.rb
122
+ - ext/readapt/frame.c
123
+ - ext/readapt/frame.h
122
124
  - ext/readapt/hash_table.c
123
125
  - ext/readapt/hash_table.h
126
+ - ext/readapt/inspector.c
127
+ - ext/readapt/inspector.h
124
128
  - ext/readapt/monitor.c
125
129
  - ext/readapt/monitor.h
126
130
  - ext/readapt/normalize.c
127
131
  - ext/readapt/normalize.h
128
132
  - ext/readapt/readapt.c
133
+ - ext/readapt/stack.c
134
+ - ext/readapt/stack.h
129
135
  - ext/readapt/threads.c
130
136
  - ext/readapt/threads.h
131
137
  - lib/readapt.rb
132
138
  - lib/readapt/adapter.rb
133
139
  - lib/readapt/breakpoint.rb
140
+ - lib/readapt/data_reader.rb
134
141
  - lib/readapt/debugger.rb
142
+ - lib/readapt/error.rb
135
143
  - lib/readapt/finder.rb
136
144
  - lib/readapt/frame.rb
137
- - lib/readapt/location.rb
145
+ - lib/readapt/input.rb
138
146
  - lib/readapt/message.rb
139
147
  - lib/readapt/message/attach.rb
140
148
  - lib/readapt/message/base.rb
@@ -155,6 +163,9 @@ files:
155
163
  - lib/readapt/message/threads.rb
156
164
  - lib/readapt/message/variables.rb
157
165
  - lib/readapt/monitor.rb
166
+ - lib/readapt/output.rb
167
+ - lib/readapt/references.rb
168
+ - lib/readapt/server.rb
158
169
  - lib/readapt/shell.rb
159
170
  - lib/readapt/snapshot.rb
160
171
  - lib/readapt/thread.rb
@@ -183,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
194
  - !ruby/object:Gem::Version
184
195
  version: '0'
185
196
  requirements: []
186
- rubygems_version: 3.0.3
197
+ rubygems_version: 3.2.0
187
198
  signing_key:
188
199
  specification_version: 4
189
200
  summary: A Ruby debugger for the Debug Adapter Protocol