google-cloud-debugger 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +18 -0
  3. data/AUTHENTICATION.md +178 -0
  4. data/CHANGELOG.md +233 -0
  5. data/CODE_OF_CONDUCT.md +40 -0
  6. data/CONTRIBUTING.md +188 -0
  7. data/INSTRUMENTATION.md +115 -0
  8. data/LICENSE +201 -0
  9. data/LOGGING.md +32 -0
  10. data/OVERVIEW.md +266 -0
  11. data/TROUBLESHOOTING.md +31 -0
  12. data/ext/google/cloud/debugger/debugger_c/debugger.c +31 -0
  13. data/ext/google/cloud/debugger/debugger_c/debugger.h +26 -0
  14. data/ext/google/cloud/debugger/debugger_c/evaluator.c +115 -0
  15. data/ext/google/cloud/debugger/debugger_c/evaluator.h +25 -0
  16. data/ext/google/cloud/debugger/debugger_c/extconf.rb +22 -0
  17. data/ext/google/cloud/debugger/debugger_c/tracer.c +542 -0
  18. data/ext/google/cloud/debugger/debugger_c/tracer.h +25 -0
  19. data/lib/google-cloud-debugger.rb +181 -0
  20. data/lib/google/cloud/debugger.rb +259 -0
  21. data/lib/google/cloud/debugger/agent.rb +255 -0
  22. data/lib/google/cloud/debugger/backoff.rb +70 -0
  23. data/lib/google/cloud/debugger/breakpoint.rb +443 -0
  24. data/lib/google/cloud/debugger/breakpoint/evaluator.rb +1099 -0
  25. data/lib/google/cloud/debugger/breakpoint/source_location.rb +74 -0
  26. data/lib/google/cloud/debugger/breakpoint/stack_frame.rb +109 -0
  27. data/lib/google/cloud/debugger/breakpoint/status_message.rb +93 -0
  28. data/lib/google/cloud/debugger/breakpoint/validator.rb +92 -0
  29. data/lib/google/cloud/debugger/breakpoint/variable.rb +595 -0
  30. data/lib/google/cloud/debugger/breakpoint/variable_table.rb +96 -0
  31. data/lib/google/cloud/debugger/breakpoint_manager.rb +311 -0
  32. data/lib/google/cloud/debugger/credentials.rb +50 -0
  33. data/lib/google/cloud/debugger/debuggee.rb +222 -0
  34. data/lib/google/cloud/debugger/debuggee/app_uniquifier_generator.rb +76 -0
  35. data/lib/google/cloud/debugger/logpoint.rb +98 -0
  36. data/lib/google/cloud/debugger/middleware.rb +200 -0
  37. data/lib/google/cloud/debugger/project.rb +110 -0
  38. data/lib/google/cloud/debugger/rails.rb +174 -0
  39. data/lib/google/cloud/debugger/request_quota_manager.rb +95 -0
  40. data/lib/google/cloud/debugger/service.rb +88 -0
  41. data/lib/google/cloud/debugger/snappoint.rb +208 -0
  42. data/lib/google/cloud/debugger/tracer.rb +137 -0
  43. data/lib/google/cloud/debugger/transmitter.rb +199 -0
  44. data/lib/google/cloud/debugger/version.rb +22 -0
  45. metadata +353 -0
@@ -0,0 +1,32 @@
1
+ # Enabling gRPC Logging
2
+
3
+ To enable logging for this library, set the logger for the underlying
4
+ [gRPC](https://github.com/grpc/grpc/tree/master/src/ruby) library. The logger
5
+ that you set may be a Ruby stdlib
6
+ [`Logger`](https://ruby-doc.org/stdlib-2.5.0/libdoc/logger/rdoc/Logger.html) as
7
+ shown below, or a
8
+ [`Google::Cloud::Logging::Logger`](https://googleapis.dev/ruby/google-cloud-logging/latest)
9
+ that will write logs to [Stackdriver
10
+ Logging](https://cloud.google.com/logging/). See
11
+ [grpc/logconfig.rb](https://github.com/grpc/grpc/blob/master/src/ruby/lib/grpc/logconfig.rb)
12
+ and the gRPC
13
+ [spec_helper.rb](https://github.com/grpc/grpc/blob/master/src/ruby/spec/spec_helper.rb)
14
+ for additional information.
15
+
16
+ Configuring a Ruby stdlib logger:
17
+
18
+ ```ruby
19
+ require "logger"
20
+
21
+ module MyLogger
22
+ LOGGER = Logger.new $stderr, level: Logger::WARN
23
+ def logger
24
+ LOGGER
25
+ end
26
+ end
27
+
28
+ # Define a gRPC module-level logger method before grpc/logconfig.rb loads.
29
+ module GRPC
30
+ extend MyLogger
31
+ end
32
+ ```
@@ -0,0 +1,266 @@
1
+ # Stackdriver Debugger
2
+
3
+ Stackdriver Debugger is a feature of the Google Cloud Platform that lets you
4
+ inspect the state of an application at any code location without using logging
5
+ statements and without stopping or slowing down your applications. Your users
6
+ are not impacted during debugging. Using the production debugger you can capture
7
+ the local variables and call stack and link it back to a specific line location
8
+ in your source code. You can use this to analyze the production state of your
9
+ application and understand the behavior of your code in production.
10
+
11
+ For general information about Stackdriver Debugger, read [Stackdriver Debugger
12
+ Documentation](https://cloud.google.com/debugger/docs/).
13
+
14
+ The Stackdriver Debugger Ruby library, `google-cloud-debugger`, provides:
15
+
16
+ * Easy-to-use debugger instrumentation that reports state data, such as value of
17
+ program variables and the call stack, to Stackdriver Debugger when the code at
18
+ a breakpoint location is executed in your Ruby application. See the
19
+ [instrumenting your app](#instrumenting-your-app) section for how to debug
20
+ your application, in both development and production.
21
+ * An idiomatic Ruby API for registerying debuggee application, and querying or
22
+ manipulating breakpoints in registered Ruby debuggee application. See
23
+ [Debugger API](#stackdriver-debugger-api) section for an introduction to
24
+ Stackdriver Debugger API.
25
+
26
+ ## Instrumenting Your App
27
+
28
+ This instrumentation library provides the following features to help you debug
29
+ your applications in production:
30
+
31
+ * Automatic application registration. It facilitates multiple running instances
32
+ of same version of application when hosted in production.
33
+ * A background debugger agent that runs side-by-side with your application that
34
+ automatically collects state data when code is executed at breakpoint
35
+ locations.
36
+ * A Rack middleware and Railtie that automatically manages the debugger agent
37
+ for Ruby on Rails and other Rack-based Ruby applications.
38
+
39
+ When this library is configured in your running application, and the source code
40
+ and breakpoints are setup through the Google Cloud Console, You'll be able to
41
+ [interact](https://cloud.google.com/debugger/docs/debugging) with your
42
+ application in real time through the [Stackdriver Debugger
43
+ UI](https://console.cloud.google.com/debug?_ga=1.84295834.280814654.1476313407).
44
+ This library also integrates with Google App Engine Flexible to make debuggee
45
+ application configuration more seemless.
46
+
47
+ Note that when no breakpoints are created, the debugger agent consumes very
48
+ little resource and has no interference with the running application. Once
49
+ breakpoints are created and depends on where the breakpoints are located, the
50
+ debugger agent may add a little latency onto each request. The application
51
+ performance will be back to normal after all breakpoints are finished being
52
+ evaluated. Be aware the more breakpoints are created, or the harder to reach the
53
+ breakpoints, the more resource the debugger agent would need to consume.
54
+
55
+ ### Using instrumentation with Ruby on Rails
56
+
57
+ To install application instrumentation in your Ruby on Rails app, add this gem,
58
+ `google-cloud-debugger`, to your Gemfile and update your bundle. Then add the
59
+ following line to your `config/application.rb` file:
60
+
61
+ ```ruby
62
+ require "google/cloud/debugger/rails"
63
+ ```
64
+
65
+ This will load a Railtie that automatically integrates with the Rails framework
66
+ by injecting a Rack middleware. The Railtie also takes in the following Rails
67
+ configuration as parameter of the debugger agent initialization:
68
+
69
+ ```ruby
70
+ # Explicitly enable or disable Stackdriver Debugger Agent
71
+ config.google_cloud.use_debugger = true
72
+ # Shared Google Cloud Platform project identifier
73
+ config.google_cloud.project_id = "gcloud-project"
74
+ # Google Cloud Platform project identifier for Stackdriver Debugger only
75
+ config.google_cloud.debugger.project_id = "debugger-project"
76
+ # Shared Google Cloud authentication json file
77
+ config.google_cloud.keyfile = "/path/to/keyfile.json"
78
+ # Google Cloud authentication json file for Stackdriver Debugger only
79
+ config.google_cloud.debugger.keyfile = "/path/to/debugger/keyfile.json"
80
+ # Stackdriver Debugger Agent service name identifier
81
+ config.google_cloud.debugger.service_name = "my-ruby-app"
82
+ # Stackdriver Debugger Agent service version identifier
83
+ config.google_cloud.debugger.service_version = "v1"
84
+ ```
85
+
86
+ See the {Google::Cloud::Debugger::Railtie} class for more information.
87
+
88
+ ### Using instrumentation with Sinatra
89
+
90
+ To install application instrumentation in your Sinatra app, add this gem,
91
+ `google-cloud-debugger`, to your Gemfile and update your bundle. Then add the
92
+ following lines to your main application Ruby file:
93
+
94
+ ```ruby
95
+ require "google/cloud/debugger"
96
+ use Google::Cloud::Debugger::Middleware
97
+ ```
98
+
99
+ This will install the debugger middleware in your application.
100
+
101
+ Configuration parameters may also be passed in as arguments to Middleware.
102
+
103
+ ```ruby
104
+ require "google/cloud/debugger"
105
+ use Google::Cloud::Debugger::Middleware project: "debugger-project-id",
106
+ keyfile: "/path/to/keyfile.json",
107
+ service_name: "my-ruby-app",
108
+ service_version: "v1"
109
+ ```
110
+
111
+ ### Using instrumentation with other Rack-based frameworks
112
+
113
+ To install application instrumentation in an app using another Rack-based web
114
+ framework, add this gem, `google-cloud-debugger`, to your Gemfile and update
115
+ your bundle. Then add install the debugger middleware in your middleware stack.
116
+ In most cases, this means adding these lines to your `config.ru` Rack
117
+ configuration file:
118
+
119
+ ```ruby
120
+ require "google/cloud/debugger"
121
+ use Google::Cloud::Debugger::Middleware
122
+ ```
123
+
124
+ Some web frameworks have an alternate mechanism for modifying the middleware
125
+ stack. Consult your web framework's documentation for more information.
126
+
127
+ ### The Stackdriver diagnostics suite
128
+
129
+ The debugger library is part of the Stackdriver diagnostics suite, which also
130
+ includes error reporting, log analysis, and tracing analysis. If you include the
131
+ `stackdriver` gem in your Gemfile, this debugger library will be included
132
+ automatically. In addition, if you include the `stackdriver` gem in an
133
+ application using Ruby On Rails, the Railties will be installed automatically.
134
+ See the documentation for the "stackdriver" gem for more details.
135
+
136
+ ## Stackdriver Debugger API
137
+
138
+ This library also includes an easy to use Ruby client for the Stackdriver
139
+ Debugger API. This API provides calls to register debuggee application, as well
140
+ as creating or modifying breakpoints.
141
+
142
+ For further information on the Debugger API, see
143
+ {Google::Cloud::Debugger::Project}
144
+
145
+ ### Registering debuggee application
146
+
147
+ ```ruby
148
+ require "google/cloud/debugger/v2"
149
+
150
+ controller_client = Google::Cloud::Debugger::V2::Controller::Client.new
151
+ debuggee = Google::Cloud::Debugger::V2::Debuggee.new
152
+ response = controller_client.register_debuggee debuggee: debuggee
153
+ debuggee_id = response.debuggee.id
154
+ ```
155
+ See [Stackdriver Debugger Debuggee
156
+ doc](https://cloud.google.com/debugger/api/reference/rpc/google.devtools.clouddebugger.v2#google.devtools.clouddebugger.v2.Debuggee)
157
+ on fields necessary for registerying a debuggee.
158
+
159
+ Upon successful registration, the response debuggee object will contain a
160
+ debuggee_id that's later needed to interact with the other Stackdriver Debugger
161
+ API.
162
+
163
+ ### List Active Breakpoints
164
+
165
+ ```ruby
166
+ require "google/cloud/debugger/v2"
167
+
168
+ controller_client = Google::Cloud::Debugger::V2::Controller::Client.new
169
+
170
+ debuggee_id = ''
171
+ response = controller_client.list_active_breakpoints debuggee_id: debuggee_id
172
+ breakpoints = response.breakpoints
173
+ ```
174
+
175
+ ### Update Active Breakpoint
176
+
177
+ Users can send custom snapshots for active breakpoints using this API.
178
+
179
+ ```ruby
180
+ require "google/cloud/debugger/v2"
181
+
182
+ controller_client = Google::Cloud::Debugger::V2::Controller::Client.new
183
+ debuggee_id = ''
184
+ breakpoint = Google::Cloud::Debugger::V2::Breakpoint.new
185
+ response = controller_client.update_active_breakpoint(
186
+ debuggee_id: debuggee_id, breakpoint: breakpoint)
187
+ ```
188
+
189
+ See [Stackdriver Debugger Breakpoint
190
+ doc](https://cloud.google.com/debugger/api/reference/rpc/google.devtools.clouddebugger.v2#google.devtools.clouddebugger.v2.Breakpoint)
191
+ for all available fields for breakpoint.
192
+
193
+ ### Set Breakpoint
194
+
195
+ ```ruby
196
+ require "google/cloud/debugger/v2"
197
+
198
+ debugger_client = Google::Cloud::Debugger::V2::Debugger::Client.new
199
+ debuggee_id = ''
200
+ breakpoint = Google::Cloud::Debugger::V2::Breakpoint.new
201
+ client_version = ''
202
+ response = debugger_client.set_breakpoint(
203
+ debuggee_id: debuggee_id, breakpoint: breakpoint,
204
+ client_version: client_version)
205
+ ```
206
+
207
+ See [Stackdriver Debugger Breakpoint
208
+ doc](https://cloud.google.com/debugger/api/reference/rpc/google.devtools.clouddebugger.v2#google.devtools.clouddebugger.v2.Breakpoint)
209
+ for fields needed to specify breakpoint location.
210
+
211
+ ### Get Breakpoint
212
+
213
+ ```ruby
214
+ require "google/cloud/debugger/v2"
215
+
216
+ debugger_client = Google::Cloud::Debugger::V2::Debugger::Client.new
217
+ debuggee_id = ''
218
+ breakpoint_id = ''
219
+ client_version = ''
220
+ response = debugger_client.get_breakpoint(
221
+ debuggee_id: debuggee_id, breakpoint_id: breakpoint_id,
222
+ client_version: client_version)
223
+ ```
224
+
225
+ ### Delete Breakpoint
226
+
227
+ ```ruby
228
+ require "google/cloud/debugger/v2"
229
+
230
+ debugger_client = Google::Cloud::Debugger::V2::Debugger::Client.new
231
+ debuggee_id = ''
232
+ breakpoint_id = ''
233
+ client_version = ''
234
+ debugger_client.delete_breakpoint(
235
+ debuggee_id: debuggee_id, breakpoint_id: breakpoint_id,
236
+ client_version: client_version)
237
+ ```
238
+
239
+ ### List Breakpoints
240
+
241
+ ```ruby
242
+ require "google/cloud/debugger/v2"
243
+
244
+ debugger_client = Google::Cloud::Debugger::V2::Debugger::Client.new
245
+ debuggee_id = ''
246
+ client_version = ''
247
+ response = debugger_client.list_breakpoints(
248
+ debuggee_id: debuggee_id, client_version: client_version)
249
+ ```
250
+
251
+ ### List Debuggees
252
+
253
+ ```ruby
254
+ require "google/cloud/debugger/v2"
255
+
256
+ debugger_client = Google::Cloud::Debugger::V2::Debugger::Client.new
257
+ project = ''
258
+ client_version = ''
259
+ response = debugger_client.list_debuggees(
260
+ project: project, client_version: client_version)
261
+ ```
262
+
263
+ ## Additional information
264
+
265
+ Stackdriver Debugger can be configured to use gRPC's logging. To learn more, see
266
+ the {file:LOGGING.md Logging guide}.
@@ -0,0 +1,31 @@
1
+ # Troubleshooting
2
+
3
+ ## Where can I get more help?
4
+
5
+ ### Ask the Community
6
+
7
+ If you have a question about how to use a Google Cloud client library in your
8
+ project or are stuck in the Developer's console and don't know where to turn,
9
+ it's possible your questions have already been addressed by the community.
10
+
11
+ First, check out the appropriate tags on StackOverflow:
12
+ - [`google-cloud-platform+ruby+debugger`][so-ruby]
13
+
14
+ Next, try searching through the issues on GitHub:
15
+
16
+ - [`api:debugger` issues][gh-search-ruby]
17
+
18
+ Still nothing?
19
+
20
+ ### Ask the Developers
21
+
22
+ If you're experiencing a bug with the code, or have an idea for how it can be
23
+ improved, *please* create a new issue on GitHub so we can talk about it.
24
+
25
+ - [New issue][gh-ruby]
26
+
27
+ [so-ruby]: http://stackoverflow.com/questions/tagged/google-cloud-platform+ruby+debugger
28
+
29
+ [gh-search-ruby]: https://github.com/googleapis/google-cloud-ruby/issues?q=label%3A%22api%3A+debugger%22
30
+
31
+ [gh-ruby]: https://github.com/googleapis/google-cloud-ruby/issues/new
@@ -0,0 +1,31 @@
1
+ /*
2
+ Copyright 2017 Google Inc. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ #include "ruby/ruby.h"
18
+ #include "debugger.h"
19
+
20
+ static VALUE mGoogle, mCloud, mDebugger;
21
+
22
+ void
23
+ Init_debugger_c()
24
+ {
25
+ mGoogle = rb_define_module("Google");
26
+ mCloud = rb_define_module_under(mGoogle, "Cloud");
27
+ mDebugger = rb_define_module_under(mCloud, "Debugger");
28
+
29
+ Init_tracer(mDebugger);
30
+ Init_evaluator(mDebugger);
31
+ }
@@ -0,0 +1,26 @@
1
+ /*
2
+ Copyright 2017 Google Inc. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ #ifndef GOOGLE_CLOUD_RUBY_DEBUGGER_H_
18
+ #define GOOGLE_CLOUD_RUBY_DEBUGGER_H_
19
+
20
+ #include "tracer.h"
21
+ #include "evaluator.h"
22
+
23
+ void
24
+ Init_debugger_c();
25
+
26
+ #endif // GOOGLE_CLOUD_RUBY_DEBUGGER_H_
@@ -0,0 +1,115 @@
1
+ /*
2
+ Copyright 2017 Google Inc. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ #include "ruby/ruby.h"
18
+ #include "ruby/debug.h"
19
+ #include "evaluator.h"
20
+
21
+ static void
22
+ eval_trace_callback(void *data, rb_trace_arg_t *trace_arg)
23
+ {
24
+ rb_event_flag_t event;
25
+ VALUE evaluator;
26
+ VALUE klass;
27
+ VALUE obj;
28
+ VALUE method_id;
29
+ ID trace_func_cb_id;
30
+ ID trace_c_func_cb_id;
31
+
32
+ CONST_ID(trace_func_cb_id, "trace_func_callback");
33
+ CONST_ID(trace_c_func_cb_id, "trace_c_func_callback");
34
+
35
+ event = rb_tracearg_event_flag(trace_arg);
36
+ evaluator = (VALUE)data;
37
+ obj = rb_tracearg_self(trace_arg);
38
+ method_id = rb_tracearg_method_id(trace_arg);
39
+ klass = rb_tracearg_defined_class(trace_arg);
40
+
41
+ if (event & RUBY_EVENT_CALL) {
42
+ rb_funcall(evaluator, trace_func_cb_id, 3, obj, klass, method_id);
43
+ }
44
+ if (event & RUBY_EVENT_C_CALL) {
45
+ rb_funcall(evaluator, trace_c_func_cb_id, 3, obj, klass, method_id);
46
+ }
47
+
48
+ return;
49
+ }
50
+
51
+ static VALUE
52
+ rb_disable_method_trace_for_thread(VALUE self)
53
+ {
54
+ VALUE current_thread;
55
+ VALUE thread_variables_hash;
56
+ VALUE trace_set;
57
+ ID locals_id;
58
+ ID eval_trace_thread_id;
59
+ VALUE eval_trace_thread_flag;
60
+
61
+ CONST_ID(locals_id, "locals");
62
+ CONST_ID(eval_trace_thread_id, "gcloud_eval_trace_set");
63
+ eval_trace_thread_flag = ID2SYM(eval_trace_thread_id);
64
+
65
+ current_thread = rb_thread_current();
66
+ thread_variables_hash = rb_ivar_get(current_thread, locals_id);
67
+ trace_set = rb_hash_aref(thread_variables_hash, eval_trace_thread_flag);
68
+
69
+ if (RTEST(trace_set)) {
70
+ rb_thread_remove_event_hook(current_thread, (rb_event_hook_func_t)eval_trace_callback);
71
+ rb_hash_aset(thread_variables_hash, eval_trace_thread_flag, Qfalse);
72
+ }
73
+
74
+ return Qnil;
75
+ }
76
+
77
+ static VALUE
78
+ rb_enable_method_trace_for_thread(VALUE self)
79
+ {
80
+ VALUE current_thread;
81
+ VALUE thread_variables_hash;
82
+ VALUE trace_set;
83
+ VALUE evaluator;
84
+ ID current_evaluator_id;
85
+ ID locals_id;
86
+ ID eval_trace_thread_id;
87
+ VALUE eval_trace_thread_flag;
88
+
89
+ CONST_ID(current_evaluator_id, "current");
90
+ CONST_ID(locals_id, "locals");
91
+ CONST_ID(eval_trace_thread_id, "gcloud_eval_trace_set");
92
+ eval_trace_thread_flag = ID2SYM(eval_trace_thread_id);
93
+
94
+ current_thread = rb_thread_current();
95
+ thread_variables_hash = rb_ivar_get(current_thread, locals_id);
96
+ trace_set = rb_hash_aref(thread_variables_hash, eval_trace_thread_flag);
97
+ evaluator = rb_funcall(self, current_evaluator_id, 0);
98
+
99
+ if (!RTEST(trace_set)) {
100
+ rb_thread_add_event_hook2(current_thread, (rb_event_hook_func_t)eval_trace_callback, RUBY_EVENT_CALL | RUBY_EVENT_C_CALL, evaluator, RUBY_EVENT_HOOK_FLAG_RAW_ARG | RUBY_EVENT_HOOK_FLAG_SAFE);
101
+ rb_hash_aset(thread_variables_hash, eval_trace_thread_flag, Qtrue);
102
+ }
103
+
104
+ return Qnil;
105
+ }
106
+
107
+ void
108
+ Init_evaluator(VALUE mDebugger)
109
+ {
110
+ VALUE cBreakpoint = rb_define_class_under(mDebugger, "Breakpoint", rb_cObject);
111
+ VALUE cEvaluator = rb_define_class_under(cBreakpoint, "Evaluator", rb_cObject);
112
+
113
+ rb_define_module_function(cEvaluator, "enable_method_trace_for_thread", rb_enable_method_trace_for_thread, 0);
114
+ rb_define_module_function(cEvaluator, "disable_method_trace_for_thread", rb_disable_method_trace_for_thread, 0);
115
+ }