google-cloud-debugger 0.27.0 → 0.28.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 +4 -4
- data/ext/google/cloud/debugger/debugger_c/tracer.c +55 -15
- data/lib/google-cloud-debugger.rb +15 -14
- data/lib/google/cloud/debugger.rb +19 -18
- data/lib/google/cloud/debugger/agent.rb +16 -7
- data/lib/google/cloud/debugger/breakpoint.rb +4 -2
- data/lib/google/cloud/debugger/breakpoint/evaluator.rb +15 -5
- data/lib/google/cloud/debugger/breakpoint/validator.rb +3 -2
- data/lib/google/cloud/debugger/breakpoint/variable.rb +53 -33
- data/lib/google/cloud/debugger/breakpoint_manager.rb +2 -1
- data/lib/google/cloud/debugger/debuggee.rb +10 -10
- data/lib/google/cloud/debugger/logpoint.rb +4 -3
- data/lib/google/cloud/debugger/middleware.rb +9 -9
- data/lib/google/cloud/debugger/project.rb +9 -9
- data/lib/google/cloud/debugger/rails.rb +9 -8
- data/lib/google/cloud/debugger/snappoint.rb +1 -1
- data/lib/google/cloud/debugger/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 652e6668d5e1d3e951c59d020e2d9469cc96bd8c
|
4
|
+
data.tar.gz: e9e11492a9245c6af29d709375d694c7d528946c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f18d03765b379d84dfd271ad0796b5aefc12f6e528e538d281b86cd76a1ba752f624a5a723cd8368930b2f57752113a71116bffb130c00522b274249f36766b
|
7
|
+
data.tar.gz: '00639952a36ba91f983bf974c26fedbfee09c3eaf0056323ae4a059857bfe860491515d29e6111369ee4aa091662f168a3dfdd63f8fd54730be58d43c804c8e6'
|
@@ -55,16 +55,26 @@ hash_get_keys(VALUE hash)
|
|
55
55
|
* Check the Tracer#breakpoints_cache if any breakpoints match the given
|
56
56
|
* tracepoint_path. Return 1 if found. Otherwise 0;
|
57
57
|
*/
|
58
|
-
static
|
58
|
+
static int
|
59
59
|
match_breakpoints_files(VALUE self, VALUE tracepoint_path)
|
60
60
|
{
|
61
61
|
int i;
|
62
|
-
char *c_tracepoint_path
|
62
|
+
char *c_tracepoint_path;
|
63
|
+
VALUE path_breakpoints_hash;
|
64
|
+
VALUE breakpoints_paths;
|
65
|
+
VALUE *c_breakpoints_paths;
|
66
|
+
int breakpoints_paths_len;
|
67
|
+
|
68
|
+
// Return 0 if the given path is Qnil
|
69
|
+
if(!RTEST(tracepoint_path)) {
|
70
|
+
return 0;
|
71
|
+
}
|
63
72
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
73
|
+
c_tracepoint_path = rb_string_value_cstr(&tracepoint_path);
|
74
|
+
path_breakpoints_hash = rb_iv_get(self, "@breakpoints_cache");
|
75
|
+
breakpoints_paths = hash_get_keys(path_breakpoints_hash);
|
76
|
+
c_breakpoints_paths = RARRAY_PTR(breakpoints_paths);
|
77
|
+
breakpoints_paths_len = RARRAY_LEN(breakpoints_paths);
|
68
78
|
|
69
79
|
for (i = 0; i < breakpoints_paths_len; i++) {
|
70
80
|
VALUE breakpoint_path = c_breakpoints_paths[i];
|
@@ -139,15 +149,28 @@ static void
|
|
139
149
|
line_trace_callback(rb_event_flag_t event, VALUE data, VALUE obj, ID mid, VALUE klass)
|
140
150
|
{
|
141
151
|
VALUE self = data;
|
142
|
-
|
143
|
-
int c_trace_lineno
|
152
|
+
VALUE trace_path;
|
153
|
+
int c_trace_lineno;
|
154
|
+
const char *c_trace_path;
|
144
155
|
VALUE trace_binding;
|
145
156
|
VALUE call_stack_bindings;
|
146
|
-
|
147
|
-
VALUE matching_result = match_breakpoints(self, c_trace_path, c_trace_lineno);
|
148
|
-
|
149
157
|
ID callers_id;
|
150
158
|
ID breakpoints_hit_id;
|
159
|
+
VALUE matching_result;
|
160
|
+
|
161
|
+
c_trace_path = rb_sourcefile();
|
162
|
+
// Ensure C_trace_path is absolute path
|
163
|
+
trace_path = rb_str_new_cstr(c_trace_path);
|
164
|
+
trace_path = rb_file_expand_path(trace_path, Qnil);
|
165
|
+
|
166
|
+
if(!RTEST(trace_path)) {
|
167
|
+
return;
|
168
|
+
}
|
169
|
+
|
170
|
+
c_trace_path = rb_string_value_cstr(&trace_path);
|
171
|
+
|
172
|
+
c_trace_lineno = rb_sourceline();
|
173
|
+
matching_result = match_breakpoints(self, c_trace_path, c_trace_lineno);
|
151
174
|
|
152
175
|
CONST_ID(callers_id, "callers");
|
153
176
|
CONST_ID(breakpoints_hit_id, "breakpoints_hit");
|
@@ -163,7 +186,6 @@ line_trace_callback(rb_event_flag_t event, VALUE data, VALUE obj, ID mid, VALUE
|
|
163
186
|
|
164
187
|
trace_binding = rb_binding_new();
|
165
188
|
call_stack_bindings = rb_funcall(trace_binding, callers_id, 0);
|
166
|
-
rb_ary_pop(call_stack_bindings);
|
167
189
|
|
168
190
|
rb_funcall(self, breakpoints_hit_id, 2, matching_result, call_stack_bindings);
|
169
191
|
|
@@ -248,12 +270,13 @@ enable_line_trace_for_thread(VALUE self)
|
|
248
270
|
static void
|
249
271
|
return_trace_callback(void *data, rb_trace_arg_t *trace_arg)
|
250
272
|
{
|
251
|
-
|
273
|
+
int match_found;
|
252
274
|
VALUE self = (VALUE) data;
|
253
275
|
VALUE caller_locations;
|
254
276
|
VALUE *c_caller_locations;
|
255
277
|
VALUE caller_location;
|
256
278
|
VALUE caller_path;
|
279
|
+
int c_caller_locations_len;
|
257
280
|
|
258
281
|
ID caller_locations_id;
|
259
282
|
ID absolute_path_id;
|
@@ -261,16 +284,26 @@ return_trace_callback(void *data, rb_trace_arg_t *trace_arg)
|
|
261
284
|
CONST_ID(caller_locations_id, "caller_locations");
|
262
285
|
CONST_ID(absolute_path_id, "absolute_path");
|
263
286
|
|
264
|
-
caller_locations = rb_funcall(rb_mKernel, caller_locations_id, 2, INT2NUM(
|
287
|
+
caller_locations = rb_funcall(rb_mKernel, caller_locations_id, 2, INT2NUM(1), INT2NUM(1));
|
265
288
|
|
289
|
+
|
290
|
+
// Return if current execution stack is too shallow.
|
266
291
|
if(!RTEST(caller_locations)) {
|
267
292
|
return;
|
268
293
|
}
|
269
294
|
|
270
295
|
c_caller_locations = RARRAY_PTR(caller_locations);
|
296
|
+
c_caller_locations_len = RARRAY_LEN(caller_locations);
|
297
|
+
|
298
|
+
// Make sure caller locations has at least one entry.
|
299
|
+
if(c_caller_locations_len == 0) {
|
300
|
+
return;
|
301
|
+
}
|
302
|
+
|
271
303
|
caller_location = c_caller_locations[0];
|
272
304
|
caller_path = rb_funcall(caller_location, absolute_path_id, 0);
|
273
305
|
|
306
|
+
// Return if caller location doesn't have absolute path. (i.e. dynamically defined method)
|
274
307
|
if(!RTEST(caller_path)) {
|
275
308
|
return;
|
276
309
|
}
|
@@ -367,11 +400,18 @@ file_tracepoint_callback(VALUE tracepoint, void *data)
|
|
367
400
|
VALUE self = (VALUE) data;
|
368
401
|
rb_trace_arg_t *tracepoint_arg = rb_tracearg_from_tracepoint(tracepoint);
|
369
402
|
VALUE tracepoint_path = rb_tracearg_path(tracepoint_arg);
|
370
|
-
|
403
|
+
int match_found;
|
371
404
|
|
372
405
|
if (!RB_TYPE_P(tracepoint_path, T_STRING))
|
373
406
|
return;
|
374
407
|
|
408
|
+
// Ensure tracepoint_path is absolute path
|
409
|
+
tracepoint_path = rb_file_expand_path(tracepoint_path, Qnil);
|
410
|
+
|
411
|
+
if (!RTEST(tracepoint_path)) {
|
412
|
+
return;
|
413
|
+
}
|
414
|
+
|
375
415
|
match_found = match_breakpoints_files(self, tracepoint_path);
|
376
416
|
|
377
417
|
if (match_found) {
|
@@ -31,8 +31,8 @@ module Google
|
|
31
31
|
# For more information on connecting to Google Cloud see the [Authentication
|
32
32
|
# Guide](https://googlecloudplatform.github.io/google-cloud-ruby/#/docs/guides/authentication).
|
33
33
|
#
|
34
|
-
# @param [String]
|
35
|
-
# @param [String]
|
34
|
+
# @param [String] service_name Name for the debuggee application. Optional.
|
35
|
+
# @param [String] service_version Version identifier for the debuggee
|
36
36
|
# application. Optional.
|
37
37
|
# @param [String, Array<String>] scope The OAuth 2.0 scopes controlling the
|
38
38
|
# set of resources and operations that the connection can access. See
|
@@ -63,13 +63,14 @@ module Google
|
|
63
63
|
# platform_scope = "https://www.googleapis.com/auth/cloud-platform"
|
64
64
|
# debugger = gcloud.debugger scope: platform_scope
|
65
65
|
#
|
66
|
-
def debugger
|
66
|
+
def debugger service_name: nil, service_version: nil, scope: nil,
|
67
67
|
timeout: nil, client_config: nil
|
68
|
-
Google::Cloud.debugger @project, @keyfile,
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
68
|
+
Google::Cloud.debugger @project, @keyfile,
|
69
|
+
service_name: service_name,
|
70
|
+
service_version: service_version,
|
71
|
+
scope: scope,
|
72
|
+
timeout: (timeout || @timeout),
|
73
|
+
client_config: client_config
|
73
74
|
end
|
74
75
|
|
75
76
|
##
|
@@ -84,8 +85,8 @@ module Google
|
|
84
85
|
# service you are connecting to.
|
85
86
|
# @param [String, Hash] keyfile Keyfile downloaded from Google Cloud. If
|
86
87
|
# file path the file must be readable.
|
87
|
-
# @param [String]
|
88
|
-
# @param [String]
|
88
|
+
# @param [String] service_name Name for the debuggee application. Optional.
|
89
|
+
# @param [String] service_version Version identifier for the debuggee
|
89
90
|
# @param [String, Array<String>] scope The OAuth 2.0 scopes controlling the
|
90
91
|
# set of resources and operations that the connection can access. See
|
91
92
|
# [Using OAuth 2.0 to Access Google
|
@@ -107,13 +108,13 @@ module Google
|
|
107
108
|
#
|
108
109
|
# debugger.start
|
109
110
|
#
|
110
|
-
def self.debugger project = nil, keyfile = nil,
|
111
|
-
|
111
|
+
def self.debugger project = nil, keyfile = nil, service_name: nil,
|
112
|
+
service_version: nil, scope: nil, timeout: nil,
|
112
113
|
client_config: nil
|
113
114
|
require "google/cloud/debugger"
|
114
115
|
Google::Cloud::Debugger.new project: project, keyfile: keyfile,
|
115
|
-
|
116
|
-
|
116
|
+
service_name: service_name,
|
117
|
+
service_version: service_version,
|
117
118
|
scope: scope, timeout: timeout,
|
118
119
|
client_config: client_config
|
119
120
|
end
|
@@ -104,10 +104,10 @@ module Google
|
|
104
104
|
# config.google_cloud.keyfile = "/path/to/keyfile.json"
|
105
105
|
# # Google Cloud authentication json file for Stackdriver Debugger only
|
106
106
|
# config.google_cloud.debugger.keyfile = "/path/to/debugger/keyfile.json"
|
107
|
-
# # Stackdriver Debugger Agent
|
108
|
-
# config.google_cloud.debugger.
|
109
|
-
# # Stackdriver Debugger Agent
|
110
|
-
# config.google_cloud.debugger.
|
107
|
+
# # Stackdriver Debugger Agent service name identifier
|
108
|
+
# config.google_cloud.debugger.service_name = "my-ruby-app"
|
109
|
+
# # Stackdriver Debugger Agent service version identifier
|
110
|
+
# config.google_cloud.debugger.service_version = "v1"
|
111
111
|
# ```
|
112
112
|
#
|
113
113
|
# See the {Google::Cloud::Debugger::Railtie} class for more information.
|
@@ -130,8 +130,8 @@ module Google
|
|
130
130
|
# require "google/cloud/debugger"
|
131
131
|
# use Google::Cloud::Debugger::Middleware project: "debugger-project-id",
|
132
132
|
# keyfile: "/path/to/keyfile.json",
|
133
|
-
#
|
134
|
-
#
|
133
|
+
# service_name: "my-ruby-app",
|
134
|
+
# service_version: "v1"
|
135
135
|
# ```
|
136
136
|
#
|
137
137
|
# ### Using instrumentation with other Rack-based frameworks
|
@@ -343,8 +343,9 @@ module Google
|
|
343
343
|
# service.
|
344
344
|
# @param [String, Hash] keyfile Keyfile downloaded from Google Cloud:
|
345
345
|
# either the JSON data or the path to a readable file.
|
346
|
-
# @param [String]
|
347
|
-
#
|
346
|
+
# @param [String] service_name Name for the debuggee application.
|
347
|
+
# Optional.
|
348
|
+
# @param [String] service_version Version identifier for the debuggee
|
348
349
|
# application. Optional.
|
349
350
|
# @param [String, Array<String>] scope The OAuth 2.0 scopes controlling
|
350
351
|
# the set of resources and operations that the connection can access.
|
@@ -361,19 +362,19 @@ module Google
|
|
361
362
|
# debugger = Google::Cloud::Debugger.new
|
362
363
|
# debugger.start
|
363
364
|
#
|
364
|
-
def self.new project: nil, keyfile: nil,
|
365
|
-
|
365
|
+
def self.new project: nil, keyfile: nil, service_name: nil,
|
366
|
+
service_version: nil, scope: nil, timeout: nil,
|
366
367
|
client_config: nil
|
367
368
|
project ||= Debugger::Project.default_project
|
368
369
|
project = project.to_s # Always cast to a string
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
370
|
+
service_name ||= Debugger::Project.default_service_name
|
371
|
+
service_name = service_name.to_s
|
372
|
+
service_version ||= Debugger::Project.default_service_version
|
373
|
+
service_version = service_version.to_s
|
373
374
|
|
374
375
|
fail ArgumentError, "project is missing" if project.empty?
|
375
|
-
fail ArgumentError, "
|
376
|
-
fail ArgumentError, "
|
376
|
+
fail ArgumentError, "service_name is missing" if service_name.empty?
|
377
|
+
fail ArgumentError, "service_version is missing" if service_version.nil?
|
377
378
|
|
378
379
|
credentials = Credentials.credentials_with_scope keyfile, scope
|
379
380
|
|
@@ -381,8 +382,8 @@ module Google
|
|
381
382
|
Google::Cloud::Debugger::Service.new(
|
382
383
|
project, credentials, timeout: timeout,
|
383
384
|
client_config: client_config),
|
384
|
-
|
385
|
-
|
385
|
+
service_name: service_name,
|
386
|
+
service_version: service_version
|
386
387
|
)
|
387
388
|
end
|
388
389
|
|
@@ -114,19 +114,19 @@ module Google
|
|
114
114
|
# object
|
115
115
|
# @param [Google::Cloud::Logging::Logger] logger The logger used
|
116
116
|
# to write the results of Logpoints.
|
117
|
-
# @param [String]
|
118
|
-
# @param [String]
|
117
|
+
# @param [String] service_name Name for the debuggee application.
|
118
|
+
# @param [String] service_version Version identifier for the debuggee
|
119
119
|
# application.
|
120
120
|
# @param [String] app_root Absolute path to the root directory of
|
121
121
|
# the debuggee application. Default to Rack root.
|
122
122
|
#
|
123
|
-
def initialize service, logger: nil,
|
123
|
+
def initialize service, logger: nil, service_name:, service_version:,
|
124
124
|
app_root: nil
|
125
125
|
super()
|
126
126
|
|
127
127
|
@service = service
|
128
|
-
@debuggee = Debuggee.new service,
|
129
|
-
|
128
|
+
@debuggee = Debuggee.new service, service_name: service_name,
|
129
|
+
service_version: service_version
|
130
130
|
@tracer = Debugger::Tracer.new self
|
131
131
|
@breakpoint_manager = BreakpointManager.new self, service
|
132
132
|
@breakpoint_manager.on_breakpoints_change =
|
@@ -136,8 +136,7 @@ module Google
|
|
136
136
|
|
137
137
|
@logger = logger || default_logger
|
138
138
|
|
139
|
-
|
140
|
-
@app_root ||= Rack::Directory.new("").root if defined? Rack::Directory
|
139
|
+
init_app_root app_root
|
141
140
|
|
142
141
|
# Agent actor thread needs to force exit immediately.
|
143
142
|
set_cleanup_options timeout: 0
|
@@ -199,6 +198,16 @@ module Google
|
|
199
198
|
|
200
199
|
private
|
201
200
|
|
201
|
+
##
|
202
|
+
# @private Initialize `@app_root` instance variable.
|
203
|
+
def init_app_root app_root = nil
|
204
|
+
app_root ||= Google::Cloud::Debugger.configure.app_root
|
205
|
+
app_root ||= Rack::Directory.new("").root if defined? Rack::Directory
|
206
|
+
app_root ||= Dir.pwd
|
207
|
+
|
208
|
+
@app_root = app_root
|
209
|
+
end
|
210
|
+
|
202
211
|
##
|
203
212
|
# @private Callback function for breakpoint manager when any updates
|
204
213
|
# happens to the list of active breakpoints
|
@@ -271,7 +271,8 @@ module Google
|
|
271
271
|
##
|
272
272
|
# Get the file path of this breakpoint
|
273
273
|
# @example
|
274
|
-
# breakpoint =
|
274
|
+
# breakpoint =
|
275
|
+
# Google::Cloud::Debugger::Breakpoint.new nil, "path/to/file.rb"
|
275
276
|
# breakpoint.path #=> "path/to/file.rb"
|
276
277
|
# @return [String] The file path for this breakpoint
|
277
278
|
def path
|
@@ -281,7 +282,8 @@ module Google
|
|
281
282
|
##
|
282
283
|
# Get the line number of this breakpoint
|
283
284
|
# @example
|
284
|
-
# breakpoint =
|
285
|
+
# breakpoint =
|
286
|
+
# Google::Cloud::Debugger::Breakpoint.new nil, "path/to/file.rb", 11
|
285
287
|
# breakpoint.line #=> 11
|
286
288
|
# @return [Integer] The line number for this breakpoint
|
287
289
|
def line
|
@@ -107,6 +107,7 @@ module Google
|
|
107
107
|
Complex,
|
108
108
|
FalseClass,
|
109
109
|
Float,
|
110
|
+
Integer,
|
110
111
|
MatchData,
|
111
112
|
NilClass,
|
112
113
|
Numeric,
|
@@ -120,7 +121,7 @@ module Google
|
|
120
121
|
Enumerable,
|
121
122
|
Math
|
122
123
|
].concat(
|
123
|
-
RUBY_VERSION.to_f >= 2.4 ? [
|
124
|
+
RUBY_VERSION.to_f >= 2.4 ? [] : [Bignum, Fixnum]
|
124
125
|
).freeze
|
125
126
|
|
126
127
|
##
|
@@ -934,7 +935,15 @@ module Google
|
|
934
935
|
# Otherwise raise Google::Cloud::Debugger::MutationError error.
|
935
936
|
#
|
936
937
|
def trace_func_callback receiver, mid
|
937
|
-
meth =
|
938
|
+
meth = nil
|
939
|
+
begin
|
940
|
+
meth = receiver.method mid
|
941
|
+
rescue
|
942
|
+
raise Google::Cloud::Debugger::EvaluationError.new(
|
943
|
+
PROHIBITED_OPERATION_MSG,
|
944
|
+
Google::Cloud::Debugger::EvaluationError::META_PROGRAMMING)
|
945
|
+
end
|
946
|
+
|
938
947
|
yarv_instructions = RubyVM::InstructionSequence.disasm meth
|
939
948
|
|
940
949
|
return if immutable_yarv_instructions?(yarv_instructions,
|
@@ -998,9 +1007,10 @@ module Google
|
|
998
1007
|
# @private Custom error type used to identify evaluation error during
|
999
1008
|
# breakpoint expression evaluation.
|
1000
1009
|
class EvaluationError < StandardError
|
1001
|
-
UNKNOWN_CAUSE =
|
1002
|
-
PROHIBITED_YARV =
|
1003
|
-
PROHIBITED_C_FUNC =
|
1010
|
+
UNKNOWN_CAUSE = :unknown_cause
|
1011
|
+
PROHIBITED_YARV = :prohibited_yarv
|
1012
|
+
PROHIBITED_C_FUNC = :prohibited_c_func
|
1013
|
+
META_PROGRAMMING = :meta_programming
|
1004
1014
|
|
1005
1015
|
attr_reader :mutation_cause
|
1006
1016
|
|
@@ -57,9 +57,10 @@ module Google
|
|
57
57
|
end
|
58
58
|
|
59
59
|
##
|
60
|
-
# @private Check the file from given file path is a
|
60
|
+
# @private Check the file from given file path is a Ruby file
|
61
61
|
def self.verify_file_type file_path
|
62
|
-
File.extname(file_path) == ".rb"
|
62
|
+
File.extname(file_path) == ".rb" ||
|
63
|
+
File.basename(file_path) == "config.ru"
|
63
64
|
rescue
|
64
65
|
false
|
65
66
|
end
|
@@ -101,6 +101,10 @@ module Google
|
|
101
101
|
# full.
|
102
102
|
BUFFER_FULL_MSG = "Buffer full. Use an expression to see more data."
|
103
103
|
|
104
|
+
##
|
105
|
+
# @private Error message when variable can't be converted.
|
106
|
+
FAIL_CONVERSION_MSG = "Error: Unable to inspect value"
|
107
|
+
|
104
108
|
##
|
105
109
|
# @private Name of the variable, if any.
|
106
110
|
# @return [String]
|
@@ -174,42 +178,46 @@ module Google
|
|
174
178
|
# conversions.
|
175
179
|
#
|
176
180
|
# @example Simple variable conversion
|
177
|
-
# x = 3
|
178
|
-
# var = Variable.from_rb_var
|
181
|
+
# x = 3.0
|
182
|
+
# var = Google::Cloud::Debugger::Breakpoint::Variable.from_rb_var \
|
183
|
+
# x, name: "x"
|
179
184
|
# var.name #=> "x"
|
180
|
-
# var.value #=> "3"
|
181
|
-
# var.type #=> "
|
185
|
+
# var.value #=> "3.0"
|
186
|
+
# var.type #=> "Float"
|
182
187
|
#
|
183
188
|
# @example Hash conversion
|
184
|
-
# hash = {a: 1, b: :two}
|
185
|
-
# var = Variable.from_rb_var
|
189
|
+
# hash = {a: 1.0, b: :two}
|
190
|
+
# var = Google::Cloud::Debugger::Breakpoint::Variable.from_rb_var \
|
191
|
+
# hash, name: "hash"
|
186
192
|
# var.name #=> "hash"
|
187
193
|
# var.type #=> "Hash"
|
188
194
|
# var.members[0].name #=> "a"
|
189
|
-
# var.members[0].value #=> "1"
|
190
|
-
# var.members[0].type #=> "
|
195
|
+
# var.members[0].value #=> "1.0"
|
196
|
+
# var.members[0].type #=> "Float"
|
191
197
|
# var.members[1].name #=> "b"
|
192
|
-
# var.members[1].value #=> "two"
|
198
|
+
# var.members[1].value #=> ":two"
|
193
199
|
# var.members[1].type #=> "Symbol"
|
194
200
|
#
|
195
201
|
# @example Custom compound variable conversion
|
196
|
-
# foo = Foo.new(a: 1, b: [])
|
197
|
-
#
|
198
|
-
# var = Variable.from_rb_var
|
202
|
+
# foo = Foo.new(a: 1.0, b: [])
|
203
|
+
# foo.inspect #=> "#<Foo:0xXXXXXX @a=1.0, @b=[]>"
|
204
|
+
# var = Google::Cloud::Debugger::Breakpoint::Variable.from_rb_var \
|
205
|
+
# foo, name: "foo"
|
199
206
|
# var.name #=> "foo"
|
200
207
|
# var.type #=> "Foo"
|
201
208
|
# var.members[0].name #=> "@a"
|
202
|
-
# var.members[0].value #=> "1"
|
203
|
-
# var.members[0].type #=> "
|
209
|
+
# var.members[0].value #=> "1.0"
|
210
|
+
# var.members[0].type #=> "Float"
|
204
211
|
# var.members[1].name #=> "@b"
|
205
212
|
# var.members[1].value #=> "[]"
|
206
213
|
# var.members[1].type #=> "Array"
|
207
214
|
#
|
208
215
|
# @example Use variable table for shared compound variables
|
209
|
-
# hash = {a: 1}
|
216
|
+
# hash = {a: 1.0}
|
210
217
|
# ary = [hash, hash]
|
211
|
-
# var_table = VariableTable.new
|
212
|
-
# var = Variable.from_rb_var
|
218
|
+
# var_table = Google::Cloud::Debugger::Breakpoint::VariableTable.new
|
219
|
+
# var = Google::Cloud::Debugger::Breakpoint::Variable.from_rb_var \
|
220
|
+
# ary, name: "ary", var_table: var_table
|
213
221
|
# var.name #=> "ary"
|
214
222
|
# var.var_table_index #=> 0
|
215
223
|
# var_table[0].type #=> "Array"
|
@@ -219,8 +227,8 @@ module Google
|
|
219
227
|
# var_table[0].members[1].var_table_index #=> 1
|
220
228
|
# var_table[1].type #=> "Hash"
|
221
229
|
# var_table[1].members[0].name #=> "a"
|
222
|
-
# var_table[1].members[0].type #=> "
|
223
|
-
# var_table[1].members[0].value #=> "1"
|
230
|
+
# var_table[1].members[0].type #=> "Float"
|
231
|
+
# var_table[1].members[0].value #=> "1.0"
|
224
232
|
#
|
225
233
|
# @return [Google::Cloud::Debugger::Breakpoint::Variable] Converted
|
226
234
|
# variable.
|
@@ -239,14 +247,27 @@ module Google
|
|
239
247
|
from_compound_var source, name: name, depth: depth,
|
240
248
|
var_table: var_table, limit: limit
|
241
249
|
else
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
+
from_primitive_var source, name: name, limit: limit
|
251
|
+
end
|
252
|
+
rescue
|
253
|
+
new.tap do |var|
|
254
|
+
var.name = name.to_s if name
|
255
|
+
var.set_error_state FAIL_CONVERSION_MSG
|
256
|
+
var.source_var = source
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
##
|
261
|
+
# @private Helper method that converts primitive variables.
|
262
|
+
def self.from_primitive_var source, name: nil, limit: nil
|
263
|
+
new.tap do |var|
|
264
|
+
var.name = name.to_s if name
|
265
|
+
var.type = source.class.to_s
|
266
|
+
var.source_var = source
|
267
|
+
limit = deduct_limit limit,
|
268
|
+
var.name.to_s.bytesize + var.type.bytesize
|
269
|
+
|
270
|
+
var.value = truncate_value source.inspect, limit
|
250
271
|
end
|
251
272
|
end
|
252
273
|
|
@@ -344,8 +365,7 @@ module Google
|
|
344
365
|
var.members << Variable.new.tap do |last_var|
|
345
366
|
last_var.set_error_state \
|
346
367
|
"Only first #{i} items were captured. Use in " \
|
347
|
-
"an expression to see all items."
|
348
|
-
refers_to: StatusMessage::VARIABLE_VALUE
|
368
|
+
"an expression to see all items."
|
349
369
|
end
|
350
370
|
break
|
351
371
|
else
|
@@ -368,8 +388,7 @@ module Google
|
|
368
388
|
var.var_table = var_table
|
369
389
|
var.var_table_index = 0
|
370
390
|
else
|
371
|
-
var.set_error_state BUFFER_FULL_MSG
|
372
|
-
refers_to: StatusMessage::VARIABLE_VALUE
|
391
|
+
var.set_error_state BUFFER_FULL_MSG
|
373
392
|
end
|
374
393
|
end
|
375
394
|
end
|
@@ -382,7 +401,8 @@ module Google
|
|
382
401
|
|
383
402
|
private_class_method :add_compound_members,
|
384
403
|
:add_shared_compound_var,
|
385
|
-
:add_member_vars,
|
404
|
+
:add_member_vars,
|
405
|
+
:compound_var?,
|
386
406
|
:deduct_limit
|
387
407
|
|
388
408
|
##
|
@@ -452,7 +472,7 @@ module Google
|
|
452
472
|
|
453
473
|
##
|
454
474
|
# Set this variable to an error state by setting the status field
|
455
|
-
def set_error_state message, refers_to: StatusMessage::
|
475
|
+
def set_error_state message, refers_to: StatusMessage::VARIABLE_VALUE
|
456
476
|
@status = StatusMessage.new.tap do |s|
|
457
477
|
s.is_error = true
|
458
478
|
s.refers_to = refers_to
|
@@ -141,7 +141,8 @@ module Google
|
|
141
141
|
# Evaluates a hit breakpoint, and submit the breakpoint to
|
142
142
|
# Transmitter if this breakpoint is evaluated successfully.
|
143
143
|
#
|
144
|
-
# See {
|
144
|
+
# See {Snappoint#evaluate} and {Logpoint#evaluate} for evaluation
|
145
|
+
# details.
|
145
146
|
#
|
146
147
|
# @param [Google::Cloud::Debugger::Breakpoint] breakpoint The breakpoint
|
147
148
|
# to be evaluated
|
@@ -48,12 +48,12 @@ module Google
|
|
48
48
|
##
|
49
49
|
# Name for the debuggee application
|
50
50
|
# @return [String]
|
51
|
-
attr_reader :
|
51
|
+
attr_reader :service_name
|
52
52
|
|
53
53
|
##
|
54
54
|
# Version identifier for the debuggee application
|
55
55
|
# @return [String]
|
56
|
-
attr_reader :
|
56
|
+
attr_reader :service_version
|
57
57
|
|
58
58
|
##
|
59
59
|
# Registered Debuggee ID. Set by Stackdriver Debugger service when
|
@@ -63,10 +63,10 @@ module Google
|
|
63
63
|
|
64
64
|
##
|
65
65
|
# @private Construct a new instance of Debuggee
|
66
|
-
def initialize service,
|
66
|
+
def initialize service, service_name:, service_version:
|
67
67
|
@service = service
|
68
|
-
@
|
69
|
-
@
|
68
|
+
@service_name = service_name
|
69
|
+
@service_version = service_version
|
70
70
|
@computed_uniquifier = nil
|
71
71
|
@id = nil
|
72
72
|
end
|
@@ -142,8 +142,8 @@ module Google
|
|
142
142
|
def labels
|
143
143
|
{
|
144
144
|
"projectid" => String(project_id),
|
145
|
-
"module" => String(
|
146
|
-
"version" => String(
|
145
|
+
"module" => String(service_name),
|
146
|
+
"version" => String(service_version)
|
147
147
|
}
|
148
148
|
end
|
149
149
|
|
@@ -155,10 +155,10 @@ module Google
|
|
155
155
|
# @return [String] A compact debuggee description.
|
156
156
|
#
|
157
157
|
def description
|
158
|
-
if
|
159
|
-
|
158
|
+
if service_version.nil? || service_version.empty?
|
159
|
+
service_name
|
160
160
|
else
|
161
|
-
"#{
|
161
|
+
"#{service_name} - #{service_version}"
|
162
162
|
end
|
163
163
|
end
|
164
164
|
|
@@ -29,7 +29,7 @@ module Google
|
|
29
29
|
##
|
30
30
|
# Evaluate the breakpoint unless it's already marked as completed.
|
31
31
|
# Store evaluted expressions and stack frame variables in
|
32
|
-
#
|
32
|
+
# `@evaluated_expressions` and `@evaluated_log_message`.
|
33
33
|
#
|
34
34
|
# @param [Array<Binding>] call_stack_bindings An array of Ruby Binding
|
35
35
|
# objects, from the call stack that leads to the triggering of the
|
@@ -69,8 +69,9 @@ module Google
|
|
69
69
|
# @private Format log message by interpolate expressions.
|
70
70
|
#
|
71
71
|
# @example
|
72
|
-
#
|
73
|
-
#
|
72
|
+
# log_point = Google::Cloud::Debugger::Logpoint.new
|
73
|
+
# log_point.format_message(
|
74
|
+
# "Hello $0", ["World"]) #=> "Hello \"World\""
|
74
75
|
#
|
75
76
|
# @param [String] message_format The message with with
|
76
77
|
# expression placeholders such as `$0`, `$1`, etc.
|
@@ -51,8 +51,8 @@ module Google
|
|
51
51
|
@debugger =
|
52
52
|
Debugger.new(project: configuration.project_id,
|
53
53
|
keyfile: configuration.keyfile,
|
54
|
-
|
55
|
-
|
54
|
+
service_name: configuration.service_name,
|
55
|
+
service_version: configuration.service_version)
|
56
56
|
|
57
57
|
@debugger.agent.quota_manager =
|
58
58
|
Google::Cloud::Debugger::RequestQuotaManager.new
|
@@ -104,10 +104,10 @@ module Google
|
|
104
104
|
configuration.keyfile = kwargs[:keyfile] ||
|
105
105
|
configuration.keyfile
|
106
106
|
|
107
|
-
configuration.
|
108
|
-
|
109
|
-
configuration.
|
110
|
-
|
107
|
+
configuration.service_name = kwargs[:service_name] ||
|
108
|
+
configuration.service_name
|
109
|
+
configuration.service_version = kwargs[:service_version] ||
|
110
|
+
configuration.service_version
|
111
111
|
|
112
112
|
init_default_config
|
113
113
|
end
|
@@ -119,9 +119,9 @@ module Google
|
|
119
119
|
Debugger::Project.default_project
|
120
120
|
configuration.keyfile ||= Cloud.configure.keyfile
|
121
121
|
|
122
|
-
configuration.
|
123
|
-
configuration.
|
124
|
-
Debugger::Project.
|
122
|
+
configuration.service_name ||= Debugger::Project.default_service_name
|
123
|
+
configuration.service_version ||=
|
124
|
+
Debugger::Project.default_service_version
|
125
125
|
end
|
126
126
|
|
127
127
|
##
|
@@ -50,10 +50,10 @@ module Google
|
|
50
50
|
|
51
51
|
##
|
52
52
|
# @private Creates a new Project instance.
|
53
|
-
def initialize service,
|
53
|
+
def initialize service, service_name:, service_version:
|
54
54
|
@service = service
|
55
|
-
@agent = Agent.new service,
|
56
|
-
|
55
|
+
@agent = Agent.new service, service_name: service_name,
|
56
|
+
service_version: service_version
|
57
57
|
end
|
58
58
|
|
59
59
|
##
|
@@ -85,17 +85,17 @@ module Google
|
|
85
85
|
end
|
86
86
|
|
87
87
|
##
|
88
|
-
# @private Default
|
89
|
-
def self.
|
90
|
-
ENV["
|
88
|
+
# @private Default service name identifier.
|
89
|
+
def self.default_service_name
|
90
|
+
ENV["DEBUGGER_SERVICE_NAME"] ||
|
91
91
|
Google::Cloud.env.app_engine_service_id ||
|
92
92
|
"ruby-app"
|
93
93
|
end
|
94
94
|
|
95
95
|
##
|
96
|
-
# @private Default
|
97
|
-
def self.
|
98
|
-
ENV["
|
96
|
+
# @private Default service version identifier.
|
97
|
+
def self.default_service_version
|
98
|
+
ENV["DEBUGGER_SERVICE_VERSION"] ||
|
99
99
|
Google::Cloud.env.app_engine_service_version ||
|
100
100
|
""
|
101
101
|
end
|
@@ -23,8 +23,9 @@ module Google
|
|
23
23
|
# Google::Cloud::Debugger::Railtie automatically adds the
|
24
24
|
# Google::Cloud::Debugger::Middleware to Rack in a Rails environment.
|
25
25
|
#
|
26
|
-
# The Middleware is only added when
|
27
|
-
#
|
26
|
+
# The Middleware is only added when the
|
27
|
+
# `Google::Cloud.configure.use_debugger` setting is true or Rails is
|
28
|
+
# in the production environment.
|
28
29
|
#
|
29
30
|
# When loaded, the Google::Cloud::Debugger::Middleware will be inserted
|
30
31
|
# after the Rack::ETag Middleware, which is top of the Rack stack, closest
|
@@ -62,7 +63,7 @@ module Google
|
|
62
63
|
# configuration. Also consolidate the `use_debugger` setting by
|
63
64
|
# verifying credentials and Rails environment. The `use_debugger`
|
64
65
|
# setting will be true if credentials are valid, and the setting is
|
65
|
-
# manually set to true or Rails is in production environment.
|
66
|
+
# manually set to true or Rails is in the production environment.
|
66
67
|
#
|
67
68
|
# @param [Rails::Railtie::Configuration] config The
|
68
69
|
# Rails.application.config
|
@@ -85,7 +86,7 @@ module Google
|
|
85
86
|
end
|
86
87
|
|
87
88
|
# Otherwise set use_debugger to true if Rails is running in
|
88
|
-
# production
|
89
|
+
# the production environment
|
89
90
|
Google::Cloud.configure.use_debugger ||= Rails.env.production?
|
90
91
|
end
|
91
92
|
|
@@ -100,8 +101,8 @@ module Google
|
|
100
101
|
Debugger.configure do |config|
|
101
102
|
config.project_id ||= dbg_config.project_id || gcp_config.project_id
|
102
103
|
config.keyfile ||= dbg_config.keyfile || gcp_config.keyfile
|
103
|
-
config.
|
104
|
-
config.
|
104
|
+
config.service_name ||= dbg_config.service_name
|
105
|
+
config.service_version ||= dbg_config.service_version
|
105
106
|
end
|
106
107
|
end
|
107
108
|
|
@@ -110,8 +111,8 @@ module Google
|
|
110
111
|
def self.init_default_config
|
111
112
|
config = Debugger.configure
|
112
113
|
config.project_id ||= Debugger::Project.default_project
|
113
|
-
config.
|
114
|
-
config.
|
114
|
+
config.service_name ||= Debugger::Project.default_service_name
|
115
|
+
config.service_version ||= Debugger::Project.default_service_version
|
115
116
|
end
|
116
117
|
|
117
118
|
##
|
@@ -100,7 +100,7 @@ module Google
|
|
100
100
|
# rules. If the expressions do any write operations, the evaluations
|
101
101
|
# abort and show an error message in place of the real result.
|
102
102
|
#
|
103
|
-
# @param [Binding]
|
103
|
+
# @param [Binding] bind The binding object from the context
|
104
104
|
#
|
105
105
|
def eval_expressions bind
|
106
106
|
@evaluated_expressions = []
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-cloud-debugger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.28.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Heng Xiong
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: binding_of_caller
|