rookout 0.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.
- checksums.yaml +7 -0
- data/LICENSE +12 -0
- data/bin/rookout +30 -0
- data/lib/rookout.rb +18 -0
- data/lib/rookout/augs/actions/action.rb +11 -0
- data/lib/rookout/augs/actions/action_run_processor.rb +29 -0
- data/lib/rookout/augs/aug.rb +121 -0
- data/lib/rookout/augs/aug_factory.rb +69 -0
- data/lib/rookout/augs/aug_rate_limiter.rb +96 -0
- data/lib/rookout/augs/augs_manager.rb +77 -0
- data/lib/rookout/augs/conditions/condition.rb +15 -0
- data/lib/rookout/augs/locations/location.rb +11 -0
- data/lib/rookout/augs/locations/location_file_line.rb +26 -0
- data/lib/rookout/com_ws/agent_com_ws.rb +221 -0
- data/lib/rookout/com_ws/backoff.rb +35 -0
- data/lib/rookout/com_ws/command_handler.rb +22 -0
- data/lib/rookout/com_ws/git.rb +53 -0
- data/lib/rookout/com_ws/information.rb +85 -0
- data/lib/rookout/com_ws/output.rb +135 -0
- data/lib/rookout/com_ws/token_bucket.rb +36 -0
- data/lib/rookout/config.rb +55 -0
- data/lib/rookout/exceptions.rb +140 -0
- data/lib/rookout/interface.rb +140 -0
- data/lib/rookout/logger.rb +158 -0
- data/lib/rookout/processor/namespace_serializer.rb +26 -0
- data/lib/rookout/processor/namespaces/container_namespace.rb +45 -0
- data/lib/rookout/processor/namespaces/frame_namespace.rb +65 -0
- data/lib/rookout/processor/namespaces/namespace.rb +28 -0
- data/lib/rookout/processor/namespaces/noop_namespace.rb +32 -0
- data/lib/rookout/processor/namespaces/ruby_object_namespace.rb +97 -0
- data/lib/rookout/processor/namespaces/ruby_object_serializer.rb +208 -0
- data/lib/rookout/processor/namespaces/ruby_utils_namespace.rb +65 -0
- data/lib/rookout/processor/namespaces/stack_namespace.rb +30 -0
- data/lib/rookout/processor/namespaces/traceback_namespace.rb +40 -0
- data/lib/rookout/processor/operations/operation.rb +11 -0
- data/lib/rookout/processor/operations/set_operation.rb +48 -0
- data/lib/rookout/processor/paths/arithmetic_path.rb +84 -0
- data/lib/rookout/processor/paths/canopy/actions.rb +184 -0
- data/lib/rookout/processor/paths/canopy/consts.rb +82 -0
- data/lib/rookout/processor/paths/canopy/maps.rb +2837 -0
- data/lib/rookout/processor/paths/canopy/markers.rb +186 -0
- data/lib/rookout/processor/paths/path.rb +15 -0
- data/lib/rookout/processor/processor.rb +34 -0
- data/lib/rookout/processor/processor_factory.rb +23 -0
- data/lib/rookout/processor/rook_error.rb +45 -0
- data/lib/rookout/protobuf/.gitignore +0 -0
- data/lib/rookout/protobuf/agent_info_pb.rb +68 -0
- data/lib/rookout/protobuf/controller_info_pb.rb +29 -0
- data/lib/rookout/protobuf/envelope_pb.rb +21 -0
- data/lib/rookout/protobuf/messages_pb.rb +189 -0
- data/lib/rookout/protobuf/variant_pb.rb +139 -0
- data/lib/rookout/rookout_singleton.rb +73 -0
- data/lib/rookout/services/position.rb +163 -0
- data/lib/rookout/services/tracer.rb +83 -0
- data/lib/rookout/trigger_services.rb +34 -0
- data/lib/rookout/user_warnings.rb +25 -0
- data/lib/rookout/version.rb +4 -0
- metadata +269 -0
@@ -0,0 +1,139 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: variant.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
require 'google/protobuf/timestamp_pb'
|
7
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
8
|
+
add_file("variant.proto", :syntax => :proto3) do
|
9
|
+
add_message "com.rookout.Error" do
|
10
|
+
optional :message, :string, 1
|
11
|
+
optional :type, :string, 2
|
12
|
+
optional :parameters, :message, 3, "com.rookout.Variant"
|
13
|
+
optional :exc, :message, 4, "com.rookout.Variant"
|
14
|
+
optional :traceback, :message, 5, "com.rookout.Variant"
|
15
|
+
end
|
16
|
+
add_message "com.rookout.Variant" do
|
17
|
+
optional :variant_type, :enum, 1, "com.rookout.Variant.Type"
|
18
|
+
optional :original_type, :string, 2
|
19
|
+
repeated :attributes, :message, 3, "com.rookout.Variant.NamedValue"
|
20
|
+
optional :max_depth, :bool, 4
|
21
|
+
oneof :value do
|
22
|
+
optional :int_value, :int32, 11
|
23
|
+
optional :long_value, :int64, 12
|
24
|
+
optional :double_value, :double, 13
|
25
|
+
optional :binary_value, :message, 14, "com.rookout.Variant.Binary"
|
26
|
+
optional :string_value, :message, 15, "com.rookout.Variant.String"
|
27
|
+
optional :list_value, :message, 16, "com.rookout.Variant.List"
|
28
|
+
optional :map_value, :message, 17, "com.rookout.Variant.Map"
|
29
|
+
optional :namespace_value, :message, 19, "com.rookout.Variant.Namespace"
|
30
|
+
optional :error_value, :message, 20, "com.rookout.Error"
|
31
|
+
optional :message_value, :message, 23, "com.rookout.Variant.FormattedMessage"
|
32
|
+
optional :time_value, :message, 24, "google.protobuf.Timestamp"
|
33
|
+
optional :code_value, :message, 26, "com.rookout.Variant.CodeObject"
|
34
|
+
optional :large_int_value, :message, 27, "com.rookout.Variant.LargeInt"
|
35
|
+
optional :complex_value, :message, 28, "com.rookout.Variant.Complex"
|
36
|
+
optional :enum_value, :message, 31, "com.rookout.Variant.Enumeration"
|
37
|
+
optional :traceback, :message, 32, "com.rookout.Variant.Traceback"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
add_message "com.rookout.Variant.NamedValue" do
|
41
|
+
optional :name, :string, 1
|
42
|
+
optional :value, :message, 2, "com.rookout.Variant"
|
43
|
+
end
|
44
|
+
add_message "com.rookout.Variant.Binary" do
|
45
|
+
optional :original_size, :int32, 1
|
46
|
+
optional :value, :bytes, 2
|
47
|
+
end
|
48
|
+
add_message "com.rookout.Variant.String" do
|
49
|
+
optional :original_size, :int32, 1
|
50
|
+
optional :value, :string, 2
|
51
|
+
end
|
52
|
+
add_message "com.rookout.Variant.List" do
|
53
|
+
optional :type, :string, 1
|
54
|
+
optional :original_size, :int32, 2
|
55
|
+
repeated :values, :message, 3, "com.rookout.Variant"
|
56
|
+
end
|
57
|
+
add_message "com.rookout.Variant.Pair" do
|
58
|
+
optional :first, :message, 1, "com.rookout.Variant"
|
59
|
+
optional :second, :message, 2, "com.rookout.Variant"
|
60
|
+
end
|
61
|
+
add_message "com.rookout.Variant.Map" do
|
62
|
+
optional :original_size, :int32, 1
|
63
|
+
repeated :pairs, :message, 2, "com.rookout.Variant.Pair"
|
64
|
+
end
|
65
|
+
add_message "com.rookout.Variant.Namespace" do
|
66
|
+
repeated :attributes, :message, 1, "com.rookout.Variant.NamedValue"
|
67
|
+
end
|
68
|
+
add_message "com.rookout.Variant.FormattedMessage" do
|
69
|
+
optional :message, :string, 1
|
70
|
+
end
|
71
|
+
add_message "com.rookout.Variant.CodeObject" do
|
72
|
+
optional :name, :string, 1
|
73
|
+
optional :module, :string, 2
|
74
|
+
optional :filename, :string, 3
|
75
|
+
optional :lineno, :uint32, 4
|
76
|
+
end
|
77
|
+
add_message "com.rookout.Variant.LargeInt" do
|
78
|
+
optional :value, :string, 1
|
79
|
+
end
|
80
|
+
add_message "com.rookout.Variant.Complex" do
|
81
|
+
optional :real, :double, 1
|
82
|
+
optional :imaginary, :double, 2
|
83
|
+
end
|
84
|
+
add_message "com.rookout.Variant.Enumeration" do
|
85
|
+
optional :string_value, :string, 1
|
86
|
+
optional :ordinal_value, :int32, 2
|
87
|
+
optional :type_name, :string, 3
|
88
|
+
end
|
89
|
+
add_message "com.rookout.Variant.Traceback" do
|
90
|
+
repeated :locations, :message, 1, "com.rookout.Variant.CodeObject"
|
91
|
+
end
|
92
|
+
add_enum "com.rookout.Variant.Type" do
|
93
|
+
value :VARIANT_NONE, 0
|
94
|
+
value :VARIANT_INT, 1
|
95
|
+
value :VARIANT_LONG, 2
|
96
|
+
value :VARIANT_DOUBLE, 3
|
97
|
+
value :VARIANT_BINARY, 4
|
98
|
+
value :VARIANT_STRING, 5
|
99
|
+
value :VARIANT_LIST, 6
|
100
|
+
value :VARIANT_MAP, 7
|
101
|
+
value :VARIANT_OBJECT, 8
|
102
|
+
value :VARIANT_NAMESPACE, 9
|
103
|
+
value :VARIANT_ERROR, 10
|
104
|
+
value :VARIANT_NOT_SUPPORTED, 11
|
105
|
+
value :VARIANT_MAX_DEPTH, 12
|
106
|
+
value :VARIANT_FORMATTED_MESSAGE, 13
|
107
|
+
value :VARIANT_TIME, 14
|
108
|
+
value :VARIANT_UKNOWN_OBJECT, 15
|
109
|
+
value :VARIANT_CODE_OBJECT, 16
|
110
|
+
value :VARIANT_LARGE_INT, 17
|
111
|
+
value :VARIANT_COMPLEX, 18
|
112
|
+
value :VARIANT_UNDEFINED, 19
|
113
|
+
value :VARIANT_DYNAMIC, 20
|
114
|
+
value :VARIANT_ENUM, 21
|
115
|
+
value :VARIANT_TRACEBACK, 22
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
module Com
|
121
|
+
module Rookout
|
122
|
+
Error = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Error").msgclass
|
123
|
+
Variant = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant").msgclass
|
124
|
+
Variant::NamedValue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.NamedValue").msgclass
|
125
|
+
Variant::Binary = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.Binary").msgclass
|
126
|
+
Variant::String = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.String").msgclass
|
127
|
+
Variant::List = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.List").msgclass
|
128
|
+
Variant::Pair = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.Pair").msgclass
|
129
|
+
Variant::Map = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.Map").msgclass
|
130
|
+
Variant::Namespace = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.Namespace").msgclass
|
131
|
+
Variant::FormattedMessage = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.FormattedMessage").msgclass
|
132
|
+
Variant::CodeObject = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.CodeObject").msgclass
|
133
|
+
Variant::LargeInt = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.LargeInt").msgclass
|
134
|
+
Variant::Complex = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.Complex").msgclass
|
135
|
+
Variant::Enumeration = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.Enumeration").msgclass
|
136
|
+
Variant::Traceback = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.Traceback").msgclass
|
137
|
+
Variant::Type = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("com.rookout.Variant.Type").enummodule
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Rookout
|
2
|
+
require_relative "logger"
|
3
|
+
require_relative "trigger_services"
|
4
|
+
require_relative "exceptions"
|
5
|
+
|
6
|
+
require_relative "augs/augs_manager"
|
7
|
+
|
8
|
+
require_relative "com_ws/agent_com_ws"
|
9
|
+
require_relative "com_ws/output"
|
10
|
+
require_relative "com_ws/command_handler"
|
11
|
+
|
12
|
+
class RookoutSingleton
|
13
|
+
require "singleton"
|
14
|
+
include Singleton
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
check_version_supported
|
18
|
+
|
19
|
+
@output = ComWs::Output.new
|
20
|
+
|
21
|
+
@services_started = false
|
22
|
+
@services = TriggerServices.new
|
23
|
+
|
24
|
+
@aug_manager = Augs::AugsManager.new @services, @output
|
25
|
+
|
26
|
+
@agent_com = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def start_trigger_services
|
30
|
+
return if @services_started
|
31
|
+
|
32
|
+
@services.start
|
33
|
+
@services_started = true
|
34
|
+
end
|
35
|
+
|
36
|
+
def stop_trigger_services
|
37
|
+
return unless @services_started
|
38
|
+
|
39
|
+
@services.close
|
40
|
+
@services_started = false
|
41
|
+
end
|
42
|
+
|
43
|
+
def connect token, host, port, proxy, labels, async_start, _fork
|
44
|
+
raise Exceptions::RookInterfaceException, "Multiple connection attempts not supported!" unless @agent_com.nil?
|
45
|
+
|
46
|
+
start_trigger_services
|
47
|
+
|
48
|
+
Logger.instance.debug "Initiating AgentCom-\t#{host}:#{port}"
|
49
|
+
|
50
|
+
@agent_com = ComWs::AgentComWs.new @output, host, port, proxy, token, labels
|
51
|
+
@command_handler = ComWs::CommandHandler.new @agent_com, @aug_manager
|
52
|
+
|
53
|
+
@agent_com.connect
|
54
|
+
return if async_start
|
55
|
+
|
56
|
+
@agent_com.wait_for_ready
|
57
|
+
end
|
58
|
+
|
59
|
+
def flush
|
60
|
+
@output.flush_messages if !@output.nil && !@agent_com.nil?
|
61
|
+
end
|
62
|
+
|
63
|
+
attr_reader :services
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def check_version_supported
|
68
|
+
raise Exceptions:: RookVersionNotSupported, "platform", RUBY_ENGINE unless RUBY_ENGINE == "ruby"
|
69
|
+
raise Exceptions::RookVersionNotSupported, "version", RUBY_VERSION unless
|
70
|
+
RUBY_VERSION.start_with?("2.7") || RUBY_VERSION.start_with?("2.6")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
module Rookout
|
2
|
+
module Services
|
3
|
+
require_relative "../logger"
|
4
|
+
require_relative "../exceptions"
|
5
|
+
|
6
|
+
class PositionMarker
|
7
|
+
def initialize lineno, method
|
8
|
+
@lineno = lineno
|
9
|
+
@method = method
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :lineno, :method
|
13
|
+
end
|
14
|
+
|
15
|
+
class PositionResolver
|
16
|
+
def initialize tracer
|
17
|
+
@tracer = tracer
|
18
|
+
@augs = {}
|
19
|
+
@trace_point = TracePoint.new :script_compiled do |tp|
|
20
|
+
begin
|
21
|
+
begin
|
22
|
+
evaluate_script tp.instruction_sequence
|
23
|
+
rescue Exception => e
|
24
|
+
Logger.instance.exception "Exception while evaluating script", e
|
25
|
+
end
|
26
|
+
rescue
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
@trace_point.enable
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_aug location, aug
|
34
|
+
positions = resolve_positions location, aug
|
35
|
+
if positions.empty?
|
36
|
+
@augs[aug.id] = [location, aug]
|
37
|
+
else
|
38
|
+
@tracer.add_breakpoint_aug positions, aug
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def remove_aug aug_id
|
43
|
+
pair = @augs[aug_id]
|
44
|
+
return if pair.nil?
|
45
|
+
|
46
|
+
@augs.delete [aug_id]
|
47
|
+
aug = pair[1]
|
48
|
+
aug.notify_removed
|
49
|
+
end
|
50
|
+
|
51
|
+
def clear_augs
|
52
|
+
@augs.values.each do |aug_id|
|
53
|
+
remove_aug aug_id
|
54
|
+
end
|
55
|
+
|
56
|
+
@augs = {}
|
57
|
+
end
|
58
|
+
|
59
|
+
def close
|
60
|
+
clear_augs
|
61
|
+
@trace_point.disable
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
#########################################################################################
|
67
|
+
# Dynamic Loading Section
|
68
|
+
def evaluate_script iseq
|
69
|
+
filename = iseq.absolute_path
|
70
|
+
return if filename.nil?
|
71
|
+
|
72
|
+
@augs.each do |pair|
|
73
|
+
location = pair[0]
|
74
|
+
|
75
|
+
if exact_match? location, filename
|
76
|
+
# TODO: CHECK FILE AND LINE HASH COMPARED TO AUG
|
77
|
+
position = PositionMarker.new iseq.absolute_path, location.lineno, iseq
|
78
|
+
@tracer.add_breakpoint_aug [position], pair[1]
|
79
|
+
elsif suggested_match? location, filename
|
80
|
+
warning = Exceptions::RookSourceFilePathSuggestion.new location.filename, filename
|
81
|
+
pair[1].notify_warning warning
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
#########################################################################################
|
87
|
+
# Enumerating Section
|
88
|
+
def resolve_positions location, aug
|
89
|
+
# TODO: ADD HASHES AND SUGGESTIONS TO THIS FLOW
|
90
|
+
positions = []
|
91
|
+
|
92
|
+
ObjectSpace.each_object Module do |mod|
|
93
|
+
positions += scan_module_or_class mod, location, aug
|
94
|
+
end
|
95
|
+
|
96
|
+
ObjectSpace.each_object Class do |klass|
|
97
|
+
positions += scan_module_or_class klass, location, aug
|
98
|
+
end
|
99
|
+
|
100
|
+
positions
|
101
|
+
end
|
102
|
+
|
103
|
+
def scan_module_or_class mod, location, aug
|
104
|
+
positions = []
|
105
|
+
|
106
|
+
mod.instance_methods(false).each do |method_name|
|
107
|
+
method = mod.instance_method method_name
|
108
|
+
next unless method_match? method, location, aug
|
109
|
+
|
110
|
+
position = PositionMarker.new location.lineno, method
|
111
|
+
positions.push position
|
112
|
+
end
|
113
|
+
|
114
|
+
mod.private_instance_methods(false).each do |method_name|
|
115
|
+
method = mod.instance_method method_name
|
116
|
+
next unless method_match? method, location, aug
|
117
|
+
|
118
|
+
position = PositionMarker.new location.lineno, method
|
119
|
+
positions.push position
|
120
|
+
end
|
121
|
+
|
122
|
+
positions
|
123
|
+
end
|
124
|
+
|
125
|
+
def method_match? method, location, aug
|
126
|
+
return false unless method.source_location
|
127
|
+
filename = method.source_location[0]
|
128
|
+
|
129
|
+
if exact_match? location, filename
|
130
|
+
disasm_header = "== disasm: #<ISeq:#{method.name}@#{location.filename}:"
|
131
|
+
line_in_disasm = "(#{location.lineno.to_s.rjust 4})"
|
132
|
+
text = RubyVM::InstructionSequence.disasm method
|
133
|
+
return false if text.nil?
|
134
|
+
|
135
|
+
text.start_with?(disasm_header) && text.include?(line_in_disasm)
|
136
|
+
else
|
137
|
+
if suggested_match? location, filename
|
138
|
+
warning = Exceptions::RookSourceFilePathSuggestion.new location.filename, filename
|
139
|
+
aug.notify_warning warning
|
140
|
+
end
|
141
|
+
false
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
#########################################################################################
|
146
|
+
# Utils
|
147
|
+
def exact_match? location, filename
|
148
|
+
filename.end_with? location.filename
|
149
|
+
end
|
150
|
+
|
151
|
+
def suggested_match? location, filename
|
152
|
+
return unless File.basename(location.filename) == File.basename(filename)
|
153
|
+
location.file_hash == get_hash(filename)
|
154
|
+
end
|
155
|
+
|
156
|
+
def get_hash filename
|
157
|
+
content = File.read filename
|
158
|
+
content.gsub!(/(?:\r\n|\r|\n)/, "\n")
|
159
|
+
Digest::SHA2.new(256).hexdigest content
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Rookout
|
2
|
+
module Services
|
3
|
+
require "binding_of_caller"
|
4
|
+
include BindingOfCaller::BindingExtensions
|
5
|
+
|
6
|
+
class Tracer
|
7
|
+
def initialize
|
8
|
+
@trace_points = {}
|
9
|
+
@augs = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_breakpoint_aug positions, aug
|
13
|
+
return if @augs.include? aug.id
|
14
|
+
|
15
|
+
aug_trace_points = []
|
16
|
+
positions.each do |position|
|
17
|
+
trace_point = create_trace_point aug
|
18
|
+
|
19
|
+
begin
|
20
|
+
trace_point.enable target: position.method, target_line: position.lineno
|
21
|
+
rescue ArgumentError => e
|
22
|
+
raise Exceptions::RookSetTracepointFailed, position.lineno, e
|
23
|
+
end
|
24
|
+
|
25
|
+
# We add and remove a dummy trace point to re-align the tracing mechanism as a result of some bug in adding
|
26
|
+
# a breakpoint
|
27
|
+
dummy_trace_point = TracePoint.new(:line) {}
|
28
|
+
dummy_trace_point.enable target: position.method, target_line: position.lineno
|
29
|
+
dummy_trace_point.disable
|
30
|
+
|
31
|
+
aug_trace_points.push trace_point
|
32
|
+
end
|
33
|
+
|
34
|
+
@trace_points[aug.id] = aug_trace_points
|
35
|
+
@augs[aug.id] = aug
|
36
|
+
aug.notify_active
|
37
|
+
end
|
38
|
+
|
39
|
+
def remove_aug aug_id
|
40
|
+
aug = @augs[aug_id]
|
41
|
+
return if aug.nil?
|
42
|
+
|
43
|
+
aug_trace_points = @trace_points[aug_id]
|
44
|
+
unless aug_trace_points.nil?
|
45
|
+
aug_trace_points.each(&:disable)
|
46
|
+
end
|
47
|
+
|
48
|
+
@augs.delete aug_id
|
49
|
+
@trace_points.delete aug_id
|
50
|
+
aug.notify_removed
|
51
|
+
end
|
52
|
+
|
53
|
+
def clear_augs
|
54
|
+
@augs.values.each do |aug_id|
|
55
|
+
remove_aug aug_id
|
56
|
+
end
|
57
|
+
|
58
|
+
@trace_points = {}
|
59
|
+
@augs = {}
|
60
|
+
end
|
61
|
+
|
62
|
+
def close
|
63
|
+
clear_augs
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def create_trace_point aug
|
69
|
+
TracePoint.new :line do
|
70
|
+
begin
|
71
|
+
begin
|
72
|
+
aug.execute BindingOfCaller::BindingExtensions.callers, nil
|
73
|
+
rescue Exception => e
|
74
|
+
Logger.instance.exception "Exception while evaluating script", e
|
75
|
+
end
|
76
|
+
rescue
|
77
|
+
# Don't leak any exception from here
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|