readapt 0.7.1 → 1.1.1

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