readapt 1.0.0 → 1.1.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +16 -15
  3. data/.rspec +2 -2
  4. data/.travis.yml +18 -18
  5. data/CHANGELOG.md +72 -69
  6. data/Gemfile +4 -4
  7. data/LICENSE.txt +21 -21
  8. data/README.md +37 -29
  9. data/Rakefile +14 -14
  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 -83
  14. data/ext/readapt/breakpoints.h +11 -11
  15. data/ext/readapt/extconf.rb +0 -0
  16. data/ext/readapt/frame.c +137 -137
  17. data/ext/readapt/frame.h +17 -17
  18. data/ext/readapt/hash_table.c +211 -211
  19. data/ext/readapt/hash_table.h +30 -30
  20. data/ext/readapt/inspector.c +51 -51
  21. data/ext/readapt/inspector.h +8 -8
  22. data/ext/readapt/monitor.c +1 -1
  23. data/ext/readapt/monitor.h +0 -0
  24. data/ext/readapt/normalize.c +59 -59
  25. data/ext/readapt/normalize.h +7 -7
  26. data/ext/readapt/readapt.c +18 -18
  27. data/ext/readapt/stack.c +86 -86
  28. data/ext/readapt/stack.h +20 -20
  29. data/ext/readapt/threads.c +15 -11
  30. data/ext/readapt/threads.h +1 -1
  31. data/lib/readapt.rb +21 -20
  32. data/lib/readapt/adapter.rb +98 -98
  33. data/lib/readapt/breakpoint.rb +20 -20
  34. data/lib/readapt/data_reader.rb +62 -62
  35. data/lib/readapt/debugger.rb +220 -220
  36. data/lib/readapt/error.rb +63 -63
  37. data/lib/readapt/finder.rb +20 -20
  38. data/lib/readapt/frame.rb +40 -40
  39. data/lib/readapt/input.rb +7 -7
  40. data/lib/readapt/message.rb +62 -62
  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 -13
  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 -26
  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 -38
  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 -61
  59. data/lib/readapt/monitor.rb +0 -0
  60. data/lib/readapt/output.rb +25 -25
  61. data/lib/readapt/references.rb +27 -0
  62. data/lib/readapt/server.rb +22 -22
  63. data/lib/readapt/shell.rb +104 -104
  64. data/lib/readapt/snapshot.rb +0 -0
  65. data/lib/readapt/thread.rb +23 -23
  66. data/lib/readapt/variable.rb +1 -1
  67. data/lib/readapt/version.rb +3 -3
  68. data/readapt.gemspec +39 -39
  69. metadata +4 -3
File without changes
@@ -1,25 +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,
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
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,
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
@@ -1,22 +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
+ 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,104 +1,104 @@
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
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
File without changes
@@ -1,23 +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 [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
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 = "1.0.0"
3
- end
1
+ module Readapt
2
+ VERSION = "1.1.0"
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', '~> 1.0'
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", "~> 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