google-cloud-debugger 0.24.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +8 -0
  3. data/LICENSE +201 -0
  4. data/README.md +56 -0
  5. data/ext/google/cloud/debugger/debugger_c/debugger.c +31 -0
  6. data/ext/google/cloud/debugger/debugger_c/debugger.h +26 -0
  7. data/ext/google/cloud/debugger/debugger_c/evaluator.c +78 -0
  8. data/ext/google/cloud/debugger/debugger_c/evaluator.h +25 -0
  9. data/ext/google/cloud/debugger/debugger_c/extconf.rb +22 -0
  10. data/ext/google/cloud/debugger/debugger_c/tracer.c +478 -0
  11. data/ext/google/cloud/debugger/debugger_c/tracer.h +31 -0
  12. data/lib/google-cloud-debugger.rb +121 -0
  13. data/lib/google/cloud/debugger.rb +379 -0
  14. data/lib/google/cloud/debugger/agent.rb +204 -0
  15. data/lib/google/cloud/debugger/async_actor.rb +290 -0
  16. data/lib/google/cloud/debugger/breakpoint.rb +382 -0
  17. data/lib/google/cloud/debugger/breakpoint/evaluator.rb +1113 -0
  18. data/lib/google/cloud/debugger/breakpoint/source_location.rb +75 -0
  19. data/lib/google/cloud/debugger/breakpoint/stack_frame.rb +109 -0
  20. data/lib/google/cloud/debugger/breakpoint/variable.rb +304 -0
  21. data/lib/google/cloud/debugger/breakpoint_manager.rb +217 -0
  22. data/lib/google/cloud/debugger/credentials.rb +41 -0
  23. data/lib/google/cloud/debugger/debuggee.rb +204 -0
  24. data/lib/google/cloud/debugger/debuggee/app_uniquifier_generator.rb +78 -0
  25. data/lib/google/cloud/debugger/middleware.rb +77 -0
  26. data/lib/google/cloud/debugger/project.rb +135 -0
  27. data/lib/google/cloud/debugger/rails.rb +141 -0
  28. data/lib/google/cloud/debugger/service.rb +130 -0
  29. data/lib/google/cloud/debugger/tracer.rb +165 -0
  30. data/lib/google/cloud/debugger/transmitter.rb +129 -0
  31. data/lib/google/cloud/debugger/v2.rb +15 -0
  32. data/lib/google/cloud/debugger/v2/controller2_client.rb +299 -0
  33. data/lib/google/cloud/debugger/v2/controller2_client_config.json +43 -0
  34. data/lib/google/cloud/debugger/v2/debugger2_client.rb +378 -0
  35. data/lib/google/cloud/debugger/v2/debugger2_client_config.json +53 -0
  36. data/lib/google/cloud/debugger/v2/doc/google/devtools/clouddebugger/v2/data.rb +441 -0
  37. data/lib/google/cloud/debugger/v2/doc/google/devtools/clouddebugger/v2/debugger.rb +151 -0
  38. data/lib/google/cloud/debugger/v2/doc/google/devtools/source/v1/source_context.rb +161 -0
  39. data/lib/google/cloud/debugger/v2/doc/google/protobuf/timestamp.rb +81 -0
  40. data/lib/google/cloud/debugger/version.rb +22 -0
  41. data/lib/google/devtools/clouddebugger/v2/controller_pb.rb +47 -0
  42. data/lib/google/devtools/clouddebugger/v2/controller_services_pb.rb +97 -0
  43. data/lib/google/devtools/clouddebugger/v2/data_pb.rb +105 -0
  44. data/lib/google/devtools/clouddebugger/v2/debugger_pb.rb +74 -0
  45. data/lib/google/devtools/clouddebugger/v2/debugger_services_pb.rb +64 -0
  46. data/lib/google/devtools/source/v1/source_context_pb.rb +89 -0
  47. metadata +300 -0
@@ -0,0 +1,165 @@
1
+ # Copyright 2017 Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "binding_of_caller"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Debugger
21
+ ##
22
+ # # Tracer
23
+ #
24
+ # When active breakpoints are set for the debugger, the tracer monitors
25
+ # the running Ruby application and triggers evaluation when the code is
26
+ # executed at the breakpoint locations.
27
+ #
28
+ # The tracer tracks the running application using several Ruby TracePoints
29
+ # and C level Ruby debugging API.
30
+ #
31
+ class Tracer
32
+ ##
33
+ # The debugger agent this tracer belongs to
34
+ # @return [Google::Cloud::Debugger::Agent]
35
+ attr_reader :agent
36
+
37
+ ##
38
+ # Ruby application root directory, in absolute path form. The
39
+ # Stackdriver Debugger Service only knows the relative application file
40
+ # path. So the tracer needs to combine relative file path with
41
+ # application root directory to get full file path for tracing purpose
42
+ # @return [String]
43
+ attr_accessor :app_root
44
+
45
+ ##
46
+ # @private File tracing point that enables line tracing when program
47
+ # counter enters a file that contains breakpoints
48
+ attr_reader :file_tracepoint
49
+
50
+ ##
51
+ # @private Fiber tracing point that enables line tracing when program
52
+ # counter enters a file that contains breakpoints through fiber
53
+ # switching
54
+ attr_reader :fiber_tracepoint
55
+
56
+ ##
57
+ # @private A nested hash structure represent all the active breakpoints.
58
+ # The structure is optimized for fast access. For example:
59
+ # {
60
+ # "path/to/file.rb" => { # The absolute file path
61
+ # 123 => [ # The line number in file
62
+ # <Google::Cloud::Debugger::Breakpoint> # List of breakpoints
63
+ # ]
64
+ # }
65
+ # }
66
+ attr_reader :breakpoints_cache
67
+
68
+ ##
69
+ # @private Construct a new instance of Tracer
70
+ def initialize agent, app_root: nil
71
+ @agent = agent
72
+ @file_tracepoint = nil
73
+ @fiber_tracepoint = nil
74
+ @breakpoints_cache = {}
75
+
76
+ @app_root = app_root
77
+ @app_root ||= Rack::Directory.new("").root if defined? Rack::Directory
78
+
79
+ fail "Unable to determine application root path" unless @app_root
80
+ end
81
+
82
+ ##
83
+ # Update tracer's private breakpoints cache with the list of active
84
+ # breakpoints from BreakpointManager.
85
+ #
86
+ # This methood is atomic for thread safety purpose.
87
+ def update_breakpoints_cache
88
+ active_breakpoints = agent.breakpoint_manager.active_breakpoints.dup
89
+ breakpoints_hash = {}
90
+
91
+ active_breakpoints.each do |active_breakpoint|
92
+ breakpoint_line = active_breakpoint.line
93
+ breakpoint_path = full_breakpoint_path active_breakpoint.path
94
+ breakpoints_hash[breakpoint_path] ||= {}
95
+ breakpoints_hash[breakpoint_path][breakpoint_line] ||= []
96
+ breakpoints_hash[breakpoint_path][breakpoint_line].push(
97
+ active_breakpoint)
98
+ end
99
+
100
+ # Tracer is explicitly designed to not have a lock. This should be the
101
+ # only place writing @breakpoints_cache to ensure thread safety.
102
+ @breakpoints_cache = breakpoints_hash
103
+ end
104
+
105
+ ##
106
+ # Evaluates a hit breakpoint, and signal BreakpointManager and
107
+ # Transmitter if this breakpoint is evaluated successfully.
108
+ #
109
+ # See {Breakpoint#eval_call_stack} for evaluation details.
110
+ #
111
+ # @param [Google::Cloud::Debugger::Breakpoint] breakpoint The breakpoint
112
+ # to be evaluated
113
+ # @param [Array<Binding>] call_stack_bindings An array of Ruby Binding
114
+ # objects, from the each frame of the call stack that leads to the
115
+ # triggering of the breakpoints.
116
+ #
117
+ def eval_breakpoint breakpoint, call_stack_bindings
118
+ return if breakpoint.nil? || breakpoint.complete?
119
+
120
+ breakpoint.eval_call_stack call_stack_bindings
121
+
122
+ # Take this completed breakpoint off manager's active breakpoints
123
+ # list, submit the breakpoint snapshot, and update Tracer's
124
+ # breakpoints_cache.
125
+ return unless breakpoint.complete?
126
+
127
+ # Signal breakpoint_manager that this breakpoint is evaluated
128
+ agent.breakpoint_manager.mark_off breakpoint
129
+ # Signal transmitter to submit this breakpoint
130
+ agent.transmitter.submit breakpoint
131
+
132
+ update_breakpoints_cache
133
+
134
+ # Disable all trace points and tracing if all breakpoints are complete
135
+ disable_traces if @breakpoints_cache.empty?
136
+ end
137
+
138
+ ##
139
+ # @private Covert breakpoint's relative file path to absolute file
140
+ # path by combining it with application root directory path.
141
+ def full_breakpoint_path breakpoint_path
142
+ if app_root.nil? || app_root.empty?
143
+ breakpoint_path
144
+ else
145
+ "#{app_root}/#{breakpoint_path}"
146
+ end
147
+ end
148
+
149
+ ##
150
+ # Get the sync the breakpoints cache with BreakpointManager. Start
151
+ # tracing and monitoring if there are any breakpoints.
152
+ def start
153
+ update_breakpoints_cache
154
+ enable_traces unless breakpoints_cache.empty?
155
+ end
156
+
157
+ ##
158
+ # Stops all tracing.
159
+ def stop
160
+ disable_traces
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,129 @@
1
+ # Copyright 2017 Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "google/cloud/debugger/async_actor"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Debugger
21
+ ##
22
+ # # Transmitter
23
+ #
24
+ # Responsible for submit evaluated breakpoints back to Stackdriver
25
+ # Debugger service asynchronously. It has it's own dedicated child thread,
26
+ # so it doesn't interfere with main Ruby application threads or the
27
+ # debugger agent's thread.
28
+ #
29
+ # The transmitter is controlled by the debugger agent it belongs to.
30
+ # Debugger agent submits evaluated breakpoint into a thread safe queue,
31
+ # and the transmitter operates directly on the queue along with minimal
32
+ # interaction with the rest debugger agent components
33
+ #
34
+ class Transmitter
35
+ include AsyncActor
36
+
37
+ ##
38
+ # @private Default maximum backlog size for the job queue
39
+ DEFAULT_MAX_QUEUE_SIZE = 1000
40
+
41
+ ##
42
+ # @private The gRPC Service object.
43
+ attr_accessor :service
44
+
45
+ ##
46
+ # The debugger agent this transmiter belongs to
47
+ # @return [Google::Cloud::Debugger::Agent]
48
+ attr_accessor :agent
49
+
50
+ ##
51
+ # Maxium backlog size for this transmitter's queue
52
+ attr_accessor :max_queue_size
53
+
54
+ ##
55
+ # @private Construct a new instance of Tramsnitter
56
+ def initialize service, agent, max_queue_size = DEFAULT_MAX_QUEUE_SIZE
57
+ super()
58
+ @service = service
59
+ @agent = agent
60
+ @max_queue_size = max_queue_size
61
+ @queue = Thread::Queue.new
62
+ end
63
+
64
+ ##
65
+ # Starts the transmitter and its worker thread
66
+ def start
67
+ async_start
68
+ end
69
+
70
+ ##
71
+ # Stops the transmitter and its worker thread. Once stopped, cannot be
72
+ # started again.
73
+ def stop
74
+ async_stop
75
+ end
76
+
77
+ ##
78
+ # Enqueue an evaluated breakpoints to be submitted by the transmitter.
79
+ #
80
+ # @param [Google::Cloud::Debugger::Breakpoint] breakpoint The evaluated
81
+ # breakpoint to be submitted
82
+ def submit breakpoint
83
+ synchronize do
84
+ @queue.push breakpoint
85
+ @lock_cond.broadcast
86
+ # Discard old entries if queue gets too large
87
+ @queue.pop while @queue.size > @max_queue_size
88
+ end
89
+ end
90
+
91
+ ##
92
+ # @private Callback fucntion for AsyncActor module to run the async
93
+ # job in a loop
94
+ def run_backgrounder
95
+ breakpoint = wait_next_item
96
+ return if breakpoint.nil?
97
+ begin
98
+ service.update_active_breakpoint agent.debuggee.id, breakpoint
99
+ rescue => e
100
+ @last_exception = e
101
+ end
102
+ end
103
+
104
+ private
105
+
106
+ ##
107
+ # @private The the next item from the transmitter queue. If there are
108
+ # no more item, it blocks the transmitter thread until an item is
109
+ # enqueued
110
+ def wait_next_item
111
+ synchronize do
112
+ @lock_cond.wait_while do
113
+ async_state == :suspended ||
114
+ (async_state == :running && @queue.empty?)
115
+ end
116
+ queue_item = nil
117
+ if @queue.empty?
118
+ @async_state = :stopped
119
+ else
120
+ queue_item = @queue.pop
121
+ end
122
+ @lock_cond.broadcast
123
+ queue_item
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,15 @@
1
+ # Copyright 2017, Google Inc. All rights reserved.
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+
14
+ require "google/cloud/debugger/v2/controller2_client"
15
+ require "google/cloud/debugger/v2/debugger2_client"
@@ -0,0 +1,299 @@
1
+ # Copyright 2017, Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+ # EDITING INSTRUCTIONS
16
+ # This file was generated from the file
17
+ # https://github.com/googleapis/googleapis/blob/master/google/devtools/clouddebugger/v2/controller.proto,
18
+ # and updates to that file get reflected here through a refresh process.
19
+ # For the short term, the refresh process will only be runnable by Google
20
+ # engineers.
21
+ #
22
+ # The only allowed edits are to method and file documentation. A 3-way
23
+ # merge preserves those additions if the generated source changes.
24
+
25
+ require "json"
26
+ require "pathname"
27
+
28
+ require "google/gax"
29
+
30
+ require "google/devtools/clouddebugger/v2/controller_pb"
31
+
32
+ module Google
33
+ module Cloud
34
+ module Debugger
35
+ module V2
36
+ # The Controller service provides the API for orchestrating a collection of
37
+ # debugger agents to perform debugging tasks. These agents are each attached
38
+ # to a process of an application which may include one or more replicas.
39
+ #
40
+ # The debugger agents register with the Controller to identify the application
41
+ # being debugged, the Debuggee. All agents that register with the same data,
42
+ # represent the same Debuggee, and are assigned the same +debuggee_id+.
43
+ #
44
+ # The debugger agents call the Controller to retrieve the list of active
45
+ # Breakpoints. Agents with the same +debuggee_id+ get the same breakpoints
46
+ # list. An agent that can fulfill the breakpoint request updates the
47
+ # Controller with the breakpoint result. The controller selects the first
48
+ # result received and discards the rest of the results.
49
+ # Agents that poll again for active breakpoints will no longer have
50
+ # the completed breakpoint in the list and should remove that breakpoint from
51
+ # their attached process.
52
+ #
53
+ # The Controller service does not provide a way to retrieve the results of
54
+ # a completed breakpoint. This functionality is available using the Debugger
55
+ # service.
56
+ #
57
+ # @!attribute [r] controller2_stub
58
+ # @return [Google::Devtools::Clouddebugger::V2::Controller2::Stub]
59
+ class Controller2Client
60
+ attr_reader :controller2_stub
61
+
62
+ # The default address of the service.
63
+ SERVICE_ADDRESS = "clouddebugger.googleapis.com".freeze
64
+
65
+ # The default port of the service.
66
+ DEFAULT_SERVICE_PORT = 443
67
+
68
+ DEFAULT_TIMEOUT = 30
69
+
70
+ # The scopes needed to make gRPC calls to all of the methods defined in
71
+ # this service.
72
+ ALL_SCOPES = [
73
+ "https://www.googleapis.com/auth/cloud-platform",
74
+ "https://www.googleapis.com/auth/cloud_debugger"
75
+ ].freeze
76
+
77
+ # @param service_path [String]
78
+ # The domain name of the API remote host.
79
+ # @param port [Integer]
80
+ # The port on which to connect to the remote host.
81
+ # @param channel [Channel]
82
+ # A Channel object through which to make calls.
83
+ # @param chan_creds [Grpc::ChannelCredentials]
84
+ # A ChannelCredentials for the setting up the RPC client.
85
+ # @param client_config[Hash]
86
+ # A Hash for call options for each method. See
87
+ # Google::Gax#construct_settings for the structure of
88
+ # this data. Falls back to the default config if not specified
89
+ # or the specified config is missing data points.
90
+ # @param timeout [Numeric]
91
+ # The default timeout, in seconds, for calls made through this client.
92
+ def initialize \
93
+ service_path: SERVICE_ADDRESS,
94
+ port: DEFAULT_SERVICE_PORT,
95
+ channel: nil,
96
+ chan_creds: nil,
97
+ scopes: ALL_SCOPES,
98
+ client_config: {},
99
+ timeout: DEFAULT_TIMEOUT,
100
+ app_name: nil,
101
+ app_version: nil,
102
+ lib_name: nil,
103
+ lib_version: ""
104
+ # These require statements are intentionally placed here to initialize
105
+ # the gRPC module only when it's required.
106
+ # See https://github.com/googleapis/toolkit/issues/446
107
+ require "google/gax/grpc"
108
+ require "google/devtools/clouddebugger/v2/controller_services_pb"
109
+
110
+
111
+ if app_name || app_version
112
+ warn "`app_name` and `app_version` are no longer being used in the request headers."
113
+ end
114
+
115
+ google_api_client = "gl-ruby/#{RUBY_VERSION}"
116
+ google_api_client << " #{lib_name}/#{lib_version}" if lib_name
117
+ google_api_client << " gapic/0.6.8 gax/#{Google::Gax::VERSION}"
118
+ google_api_client << " grpc/#{GRPC::VERSION}"
119
+ google_api_client.freeze
120
+
121
+ headers = { :"x-goog-api-client" => google_api_client }
122
+ client_config_file = Pathname.new(__dir__).join(
123
+ "controller2_client_config.json"
124
+ )
125
+ defaults = client_config_file.open do |f|
126
+ Google::Gax.construct_settings(
127
+ "google.devtools.clouddebugger.v2.Controller2",
128
+ JSON.parse(f.read),
129
+ client_config,
130
+ Google::Gax::Grpc::STATUS_CODE_NAMES,
131
+ timeout,
132
+ errors: Google::Gax::Grpc::API_ERRORS,
133
+ kwargs: headers
134
+ )
135
+ end
136
+ @controller2_stub = Google::Gax::Grpc.create_stub(
137
+ service_path,
138
+ port,
139
+ chan_creds: chan_creds,
140
+ channel: channel,
141
+ scopes: scopes,
142
+ &Google::Devtools::Clouddebugger::V2::Controller2::Stub.method(:new)
143
+ )
144
+
145
+ @register_debuggee = Google::Gax.create_api_call(
146
+ @controller2_stub.method(:register_debuggee),
147
+ defaults["register_debuggee"]
148
+ )
149
+ @list_active_breakpoints = Google::Gax.create_api_call(
150
+ @controller2_stub.method(:list_active_breakpoints),
151
+ defaults["list_active_breakpoints"]
152
+ )
153
+ @update_active_breakpoint = Google::Gax.create_api_call(
154
+ @controller2_stub.method(:update_active_breakpoint),
155
+ defaults["update_active_breakpoint"]
156
+ )
157
+ end
158
+
159
+ # Service calls
160
+
161
+ # Registers the debuggee with the controller service.
162
+ #
163
+ # All agents attached to the same application should call this method with
164
+ # the same request content to get back the same stable +debuggee_id+. Agents
165
+ # should call this method again whenever +google.rpc.Code.NOT_FOUND+ is
166
+ # returned from any controller method.
167
+ #
168
+ # This allows the controller service to disable the agent or recover from any
169
+ # data loss. If the debuggee is disabled by the server, the response will
170
+ # have +is_disabled+ set to +true+.
171
+ #
172
+ # @param debuggee [Google::Devtools::Clouddebugger::V2::Debuggee]
173
+ # Debuggee information to register.
174
+ # The fields +project+, +uniquifier+, +description+ and +agent_version+
175
+ # of the debuggee must be set.
176
+ # @param options [Google::Gax::CallOptions]
177
+ # Overrides the default settings for this call, e.g, timeout,
178
+ # retries, etc.
179
+ # @return [Google::Devtools::Clouddebugger::V2::RegisterDebuggeeResponse]
180
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
181
+ # @example
182
+ # require "google/cloud/debugger/v2/controller2_client"
183
+ #
184
+ # Controller2Client = Google::Cloud::Debugger::V2::Controller2Client
185
+ # Debuggee = Google::Devtools::Clouddebugger::V2::Debuggee
186
+ #
187
+ # controller2_client = Controller2Client.new
188
+ # debuggee = Debuggee.new
189
+ # response = controller2_client.register_debuggee(debuggee)
190
+
191
+ def register_debuggee \
192
+ debuggee,
193
+ options: nil
194
+ req = Google::Devtools::Clouddebugger::V2::RegisterDebuggeeRequest.new({
195
+ debuggee: debuggee
196
+ }.delete_if { |_, v| v.nil? })
197
+ @register_debuggee.call(req, options)
198
+ end
199
+
200
+ # Returns the list of all active breakpoints for the debuggee.
201
+ #
202
+ # The breakpoint specification (location, condition, and expression
203
+ # fields) is semantically immutable, although the field values may
204
+ # change. For example, an agent may update the location line number
205
+ # to reflect the actual line where the breakpoint was set, but this
206
+ # doesn't change the breakpoint semantics.
207
+ #
208
+ # This means that an agent does not need to check if a breakpoint has changed
209
+ # when it encounters the same breakpoint on a successive call.
210
+ # Moreover, an agent should remember the breakpoints that are completed
211
+ # until the controller removes them from the active list to avoid
212
+ # setting those breakpoints again.
213
+ #
214
+ # @param debuggee_id [String]
215
+ # Identifies the debuggee.
216
+ # @param wait_token [String]
217
+ # A wait token that, if specified, blocks the method call until the list
218
+ # of active breakpoints has changed, or a server selected timeout has
219
+ # expired. The value should be set from the last returned response.
220
+ # @param success_on_timeout [true, false]
221
+ # If set to +true+, returns +google.rpc.Code.OK+ status and sets the
222
+ # +wait_expired+ response field to +true+ when the server-selected timeout
223
+ # has expired (recommended).
224
+ #
225
+ # If set to +false+, returns +google.rpc.Code.ABORTED+ status when the
226
+ # server-selected timeout has expired (deprecated).
227
+ # @param options [Google::Gax::CallOptions]
228
+ # Overrides the default settings for this call, e.g, timeout,
229
+ # retries, etc.
230
+ # @return [Google::Devtools::Clouddebugger::V2::ListActiveBreakpointsResponse]
231
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
232
+ # @example
233
+ # require "google/cloud/debugger/v2/controller2_client"
234
+ #
235
+ # Controller2Client = Google::Cloud::Debugger::V2::Controller2Client
236
+ #
237
+ # controller2_client = Controller2Client.new
238
+ # debuggee_id = ''
239
+ # response = controller2_client.list_active_breakpoints(debuggee_id)
240
+
241
+ def list_active_breakpoints \
242
+ debuggee_id,
243
+ wait_token: nil,
244
+ success_on_timeout: nil,
245
+ options: nil
246
+ req = Google::Devtools::Clouddebugger::V2::ListActiveBreakpointsRequest.new({
247
+ debuggee_id: debuggee_id,
248
+ wait_token: wait_token,
249
+ success_on_timeout: success_on_timeout
250
+ }.delete_if { |_, v| v.nil? })
251
+ @list_active_breakpoints.call(req, options)
252
+ end
253
+
254
+ # Updates the breakpoint state or mutable fields.
255
+ # The entire Breakpoint message must be sent back to the controller
256
+ # service.
257
+ #
258
+ # Updates to active breakpoint fields are only allowed if the new value
259
+ # does not change the breakpoint specification. Updates to the +location+,
260
+ # +condition+ and +expression+ fields should not alter the breakpoint
261
+ # semantics. These may only make changes such as canonicalizing a value
262
+ # or snapping the location to the correct line of code.
263
+ #
264
+ # @param debuggee_id [String]
265
+ # Identifies the debuggee being debugged.
266
+ # @param breakpoint [Google::Devtools::Clouddebugger::V2::Breakpoint]
267
+ # Updated breakpoint information.
268
+ # The field 'id' must be set.
269
+ # @param options [Google::Gax::CallOptions]
270
+ # Overrides the default settings for this call, e.g, timeout,
271
+ # retries, etc.
272
+ # @return [Google::Devtools::Clouddebugger::V2::UpdateActiveBreakpointResponse]
273
+ # @raise [Google::Gax::GaxError] if the RPC is aborted.
274
+ # @example
275
+ # require "google/cloud/debugger/v2/controller2_client"
276
+ #
277
+ # Breakpoint = Google::Devtools::Clouddebugger::V2::Breakpoint
278
+ # Controller2Client = Google::Cloud::Debugger::V2::Controller2Client
279
+ #
280
+ # controller2_client = Controller2Client.new
281
+ # debuggee_id = ''
282
+ # breakpoint = Breakpoint.new
283
+ # response = controller2_client.update_active_breakpoint(debuggee_id, breakpoint)
284
+
285
+ def update_active_breakpoint \
286
+ debuggee_id,
287
+ breakpoint,
288
+ options: nil
289
+ req = Google::Devtools::Clouddebugger::V2::UpdateActiveBreakpointRequest.new({
290
+ debuggee_id: debuggee_id,
291
+ breakpoint: breakpoint
292
+ }.delete_if { |_, v| v.nil? })
293
+ @update_active_breakpoint.call(req, options)
294
+ end
295
+ end
296
+ end
297
+ end
298
+ end
299
+ end