chrisa-ruby-dtrace 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. data/History.txt +34 -0
  2. data/Manifest.txt +58 -0
  3. data/README.txt +88 -0
  4. data/Rakefile +73 -0
  5. data/examples/scsi.rb +442 -0
  6. data/ext/dof/constants.c +49 -0
  7. data/ext/dof/dof.h +55 -0
  8. data/ext/dof/dof_api.c +57 -0
  9. data/ext/dof/dof_helper.c +82 -0
  10. data/ext/dof/extconf.rb +4 -0
  11. data/ext/dof/file.c +56 -0
  12. data/ext/dof/generator.c +9 -0
  13. data/ext/dof/header.c +80 -0
  14. data/ext/dof/parser.c +415 -0
  15. data/ext/dof/parser.h +10 -0
  16. data/ext/dof/section.c +302 -0
  17. data/ext/dtrace_aggdata.c +142 -0
  18. data/ext/dtrace_api.c +119 -0
  19. data/ext/dtrace_api.h +150 -0
  20. data/ext/dtrace_bufdata.c +139 -0
  21. data/ext/dtrace_dropdata.c +131 -0
  22. data/ext/dtrace_errdata.c +110 -0
  23. data/ext/dtrace_hdl.c +577 -0
  24. data/ext/dtrace_probedata.c +267 -0
  25. data/ext/dtrace_probedesc.c +78 -0
  26. data/ext/dtrace_process.c +37 -0
  27. data/ext/dtrace_program.c +62 -0
  28. data/ext/dtrace_programinfo.c +60 -0
  29. data/ext/dtrace_recdesc.c +46 -0
  30. data/ext/dtrace_util.c +92 -0
  31. data/ext/extconf.rb +28 -0
  32. data/ext/stubs.txt +78 -0
  33. data/lib/dtrace/aggregate.rb +40 -0
  34. data/lib/dtrace/aggregateset.rb +19 -0
  35. data/lib/dtrace/consumer.rb +174 -0
  36. data/lib/dtrace/data.rb +82 -0
  37. data/lib/dtrace/dof/file.rb +63 -0
  38. data/lib/dtrace/dof/section/strtab.rb +21 -0
  39. data/lib/dtrace/dof/section.rb +69 -0
  40. data/lib/dtrace/dof.rb +8 -0
  41. data/lib/dtrace/printfrecord.rb +10 -0
  42. data/lib/dtrace/probe.rb +46 -0
  43. data/lib/dtrace/probedata.rb +23 -0
  44. data/lib/dtrace/probedesc.rb +15 -0
  45. data/lib/dtrace/provider/probedef.rb +24 -0
  46. data/lib/dtrace/provider.rb +231 -0
  47. data/lib/dtrace/record.rb +11 -0
  48. data/lib/dtrace/stackrecord.rb +31 -0
  49. data/lib/dtrace/tracer.rb +35 -0
  50. data/lib/dtrace.rb +74 -0
  51. data/lib/dtraceconsumer.rb +9 -0
  52. data/plugin/dtrace/README +81 -0
  53. data/plugin/dtrace/Rakefile +22 -0
  54. data/plugin/dtrace/bin/dtracer.rb +29 -0
  55. data/plugin/dtrace/init.rb +7 -0
  56. data/plugin/dtrace/lib/dtrace_helper.rb +2 -0
  57. data/plugin/dtrace/lib/dtrace_report.rb +67 -0
  58. data/plugin/dtrace/lib/dtracer.rb +52 -0
  59. data/plugin/dtrace/lib/dtracer_client.rb +26 -0
  60. data/plugin/dtrace/public/stylesheets/dtrace.css +48 -0
  61. data/plugin/dtrace/scripts/default.d +11 -0
  62. data/plugin/dtrace/scripts/rails_mysql.d +29 -0
  63. data/plugin/dtrace/tasks/dtrace.rake +52 -0
  64. data/plugin/dtrace/test/dtrace_test.rb +8 -0
  65. data/plugin/dtrace/views/dtrace/_report.rhtml +26 -0
  66. data/test/apple-dof +0 -0
  67. data/test/disabled_probe_effect.txt +19 -0
  68. data/test/dof +0 -0
  69. data/test/dof2 +0 -0
  70. data/test/test_disabled_probe_effect.rb +60 -0
  71. data/test/test_dof_generator.rb +142 -0
  72. data/test/test_dof_helper.rb +106 -0
  73. data/test/test_dof_parser.rb +25 -0
  74. data/test/test_dof_providers.rb +282 -0
  75. data/test/test_dof_strtabs.rb +92 -0
  76. data/test/test_dtrace.rb +111 -0
  77. data/test/test_dtrace_aggregates.rb +56 -0
  78. data/test/test_dtrace_drops_errors.rb +183 -0
  79. data/test/test_dtrace_probe.rb +383 -0
  80. data/test/test_dtrace_probes.rb +400 -0
  81. data/test/test_dtrace_processes.rb +83 -0
  82. data/test/test_dtrace_profile.rb +232 -0
  83. data/test/test_dtrace_provider.rb +153 -0
  84. data/test/test_dtrace_repeat.rb +51 -0
  85. data/test/test_dtrace_rubyprobe.rb +52 -0
  86. data/test/test_dtrace_typefilter.rb +108 -0
  87. data/test/test_legacy_consumer.rb +56 -0
  88. metadata +165 -0
@@ -0,0 +1,383 @@
1
+ #
2
+ # Ruby-Dtrace
3
+ # (c) 2008 Chris Andrews <chris@nodnol.org>
4
+ #
5
+
6
+ require 'dtrace'
7
+ require 'dtrace/dof'
8
+ require 'test/unit'
9
+
10
+ class TestDtraceProbe < Test::Unit::TestCase
11
+ include Dtrace::Dof::Constants
12
+
13
+ def test_probe
14
+ p = Dtrace::Probe.new(0)
15
+ end
16
+
17
+ def test_fire_probe
18
+ p = Dtrace::Probe.new(0)
19
+ p.fire
20
+ end
21
+
22
+ def test_is_probe_not_enabled
23
+ p = Dtrace::Probe.new(0)
24
+ assert_equal 0, p.is_enabled?
25
+ end
26
+
27
+ def test_fire_probe_no_args
28
+ probe = Dtrace::Probe.new(0)
29
+ addr = probe.addr
30
+
31
+ f = Dtrace::Dof::File.new
32
+
33
+ s = Dtrace::Dof::Section.new(DOF_SECT_STRTAB, 0)
34
+ s.data = ['args', 'main', 'test']
35
+ f.sections << s
36
+
37
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROBES, 1)
38
+ s.data = [
39
+ {
40
+ :noffs => 1,
41
+ :enoffidx => 0,
42
+ :argidx => 0,
43
+ :name => 1,
44
+ :nenoffs => 1,
45
+ :offidx => 0,
46
+ :addr => addr,
47
+ :nargc => 0,
48
+ :func => 6,
49
+ :xargc => 0
50
+ },
51
+ ]
52
+ f.sections << s
53
+
54
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRARGS, 2)
55
+ s.data = [ 0 ]
56
+ f.sections << s
57
+
58
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROFFS, 3)
59
+ s.data = [ probe.probe_offset(f.addr, 0) ]
60
+ f.sections << s
61
+
62
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRENOFFS, 4)
63
+ s.data = [ probe.is_enabled_offset(f.addr) ]
64
+ f.sections << s
65
+
66
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROVIDER, 5)
67
+ s.data = {
68
+ :strtab => 0,
69
+ :probes => 1,
70
+ :prargs => 2,
71
+ :proffs => 3,
72
+ :prenoffs => 4,
73
+ :name => 11,
74
+ :provattr => { :name => 5, :data => 5, :class => 5 },
75
+ :modattr => { :name => 1, :data => 1, :class => 5 },
76
+ :funcattr => { :name => 1, :data => 1, :class => 5 },
77
+ :nameattr => { :name => 5, :data => 5, :class => 5 },
78
+ :argsattr => { :name => 5, :data => 5, :class => 5 }
79
+ }
80
+ f.sections << s
81
+
82
+ f.generate
83
+ Dtrace::Dof.loaddof(f, 'testmodule')
84
+
85
+ t = Dtrace.new
86
+ t.setopt("bufsize", "4m")
87
+
88
+ matches = 0
89
+ t.each_probe do |p|
90
+ if p.to_s == "test#{$$}:testmodule:main:args"
91
+ matches += 1
92
+ end
93
+ end
94
+ assert_equal 1, matches
95
+
96
+ progtext = <<EOD
97
+ test*:testmodule:main:args
98
+ {
99
+ trace("fired!");
100
+ }
101
+ EOD
102
+
103
+ prog = t.compile progtext
104
+ prog.execute
105
+ t.go
106
+ c = Dtrace::Consumer.new(t)
107
+
108
+ probe.fire
109
+
110
+ data = []
111
+ c.consume_once do |d|
112
+ data << d
113
+ end
114
+
115
+ assert_equal 1, data.length
116
+ assert_equal 'fired!', data[0].data[0].value
117
+ end
118
+
119
+ def test_fire_probe_two_int_args
120
+ probe = Dtrace::Probe.new(2)
121
+ addr = probe.addr
122
+
123
+ f = Dtrace::Dof::File.new
124
+
125
+ s = Dtrace::Dof::Section.new(DOF_SECT_STRTAB, 0)
126
+ s.data = ['test', 'main', 'tes2', 'int', 'int', 'int', 'int']
127
+ f.sections << s
128
+
129
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROBES, 1)
130
+ s.data = [
131
+ {
132
+ :nargv => 16,
133
+ :noffs => 1,
134
+ :xargv => 24,
135
+ :enoffidx => 0,
136
+ :argidx => 0,
137
+ :name => 1,
138
+ :nenoffs => 1,
139
+ :offidx => 0,
140
+ :addr => addr,
141
+ :nargc => 2,
142
+ :func => 6,
143
+ :xargc => 2
144
+ },
145
+ ]
146
+ f.sections << s
147
+
148
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRARGS, 2)
149
+ s.data = [ 0, 1 ]
150
+ f.sections << s
151
+
152
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROFFS, 3)
153
+ s.data = [ probe.probe_offset(f.addr, 2) ]
154
+ f.sections << s
155
+
156
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRENOFFS, 4)
157
+ s.data = [ probe.is_enabled_offset(f.addr) ]
158
+ f.sections << s
159
+
160
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROVIDER, 5)
161
+ s.data = {
162
+ :strtab => 0,
163
+ :probes => 1,
164
+ :prargs => 2,
165
+ :proffs => 3,
166
+ :prenoffs => 4,
167
+ :name => 11,
168
+ :provattr => { :name => 5, :data => 5, :class => 5 },
169
+ :modattr => { :name => 1, :data => 1, :class => 5 },
170
+ :funcattr => { :name => 1, :data => 1, :class => 5 },
171
+ :nameattr => { :name => 5, :data => 5, :class => 5 },
172
+ :argsattr => { :name => 5, :data => 5, :class => 5 }
173
+ }
174
+ f.sections << s
175
+
176
+ f.generate
177
+ Dtrace::Dof.loaddof(f, 'testmodule')
178
+
179
+ t = Dtrace.new
180
+ t.setopt("bufsize", "4m")
181
+
182
+ progtext = <<EOD
183
+ tes2*:testmodule:main:test
184
+ {
185
+ trace(arg0);
186
+ trace(arg1);
187
+ }
188
+ EOD
189
+
190
+ prog = t.compile progtext
191
+ prog.execute
192
+ t.go
193
+ c = Dtrace::Consumer.new(t)
194
+
195
+ probe.fire(41, 42)
196
+
197
+ data = []
198
+ c.consume_once do |d|
199
+ data << d
200
+ end
201
+
202
+ assert_equal 1, data.length
203
+ assert_equal 41, data[0].data[0].value
204
+ assert_equal 42, data[0].data[1].value
205
+ end
206
+
207
+ def test_fire_probe_two_charstar_args
208
+ probe = Dtrace::Probe.new(2)
209
+ addr = probe.addr
210
+
211
+ f = Dtrace::Dof::File.new
212
+
213
+ s = Dtrace::Dof::Section.new(DOF_SECT_STRTAB, 0)
214
+ s.data = ['test', 'main', 'tes3', 'char *', 'char *', 'char *', 'char *']
215
+ f.sections << s
216
+
217
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROBES, 1)
218
+ s.data = [
219
+ {
220
+ :nargv => 16,
221
+ :noffs => 1,
222
+ :xargv => 30,
223
+ :enoffidx => 0,
224
+ :argidx => 0,
225
+ :name => 1,
226
+ :nenoffs => 1,
227
+ :offidx => 0,
228
+ :addr => addr,
229
+ :nargc => 2,
230
+ :func => 6,
231
+ :xargc => 2
232
+ },
233
+ ]
234
+ f.sections << s
235
+
236
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRARGS, 2)
237
+ s.data = [ 0, 1 ]
238
+ f.sections << s
239
+
240
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROFFS, 3)
241
+ s.data = [ probe.probe_offset(f.addr, 2) ]
242
+ f.sections << s
243
+
244
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRENOFFS, 4)
245
+ s.data = [ probe.is_enabled_offset(f.addr) ]
246
+ f.sections << s
247
+
248
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROVIDER, 5)
249
+ s.data = {
250
+ :strtab => 0,
251
+ :probes => 1,
252
+ :prargs => 2,
253
+ :proffs => 3,
254
+ :prenoffs => 4,
255
+ :name => 11,
256
+ :provattr => { :name => 5, :data => 5, :class => 5 },
257
+ :modattr => { :name => 1, :data => 1, :class => 5 },
258
+ :funcattr => { :name => 1, :data => 1, :class => 5 },
259
+ :nameattr => { :name => 5, :data => 5, :class => 5 },
260
+ :argsattr => { :name => 5, :data => 5, :class => 5 }
261
+ }
262
+ f.sections << s
263
+
264
+ f.generate
265
+ Dtrace::Dof.loaddof(f, 'testmodule')
266
+
267
+ t = Dtrace.new
268
+ t.setopt("bufsize", "4m")
269
+
270
+ progtext = <<EOD
271
+ tes3*:testmodule:main:test
272
+ {
273
+ trace(copyinstr(arg0));
274
+ trace(copyinstr(arg1));
275
+ }
276
+ EOD
277
+
278
+ prog = t.compile progtext
279
+ prog.execute
280
+ t.go
281
+ c = Dtrace::Consumer.new(t)
282
+
283
+ probe.fire('foo', 'bar')
284
+
285
+ data = []
286
+ c.consume_once do |d|
287
+ data << d
288
+ end
289
+
290
+ assert_equal 1, data.length
291
+ assert_equal 'foo', data[0].data[0].value
292
+ assert_equal 'bar', data[0].data[1].value
293
+ end
294
+
295
+ def test_probe_is_enabled
296
+ probe = Dtrace::Probe.new(0)
297
+ addr = probe.addr
298
+
299
+ f = Dtrace::Dof::File.new
300
+
301
+ s = Dtrace::Dof::Section.new(DOF_SECT_STRTAB, 0)
302
+ s.data = ['test', 'main', 'tes4']
303
+ f.sections << s
304
+
305
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROBES, 1)
306
+ s.data = [
307
+ {
308
+ :noffs => 1,
309
+ :enoffidx => 0,
310
+ :argidx => 0,
311
+ :name => 1,
312
+ :nenoffs => 1,
313
+ :offidx => 0,
314
+ :addr => addr,
315
+ :nargc => 0,
316
+ :func => 6,
317
+ :xargc => 0
318
+ },
319
+ ]
320
+ f.sections << s
321
+
322
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRARGS, 2)
323
+ s.data = [ 0 ]
324
+ f.sections << s
325
+
326
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROFFS, 3)
327
+ s.data = [ probe.probe_offset(f.addr, 0) ]
328
+ f.sections << s
329
+
330
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRENOFFS, 4)
331
+ s.data = [ probe.is_enabled_offset(f.addr) ]
332
+ f.sections << s
333
+
334
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROVIDER, 5)
335
+ s.data = {
336
+ :strtab => 0,
337
+ :probes => 1,
338
+ :prargs => 2,
339
+ :proffs => 3,
340
+ :prenoffs => 4,
341
+ :name => 11,
342
+ :provattr => { :name => 5, :data => 5, :class => 5 },
343
+ :modattr => { :name => 1, :data => 1, :class => 5 },
344
+ :funcattr => { :name => 1, :data => 1, :class => 5 },
345
+ :nameattr => { :name => 5, :data => 5, :class => 5 },
346
+ :argsattr => { :name => 5, :data => 5, :class => 5 }
347
+ }
348
+ f.sections << s
349
+
350
+ f.generate
351
+ Dtrace::Dof.loaddof(f, 'testmodule')
352
+
353
+ assert_equal 0, probe.is_enabled?
354
+
355
+ t = Dtrace.new
356
+ t.setopt("bufsize", "4m")
357
+
358
+ progtext = <<EOD
359
+ tes4*:testmodule:main:test
360
+ {
361
+ trace("fired!");
362
+ }
363
+ EOD
364
+
365
+ prog = t.compile progtext
366
+ prog.execute
367
+ t.go
368
+
369
+ assert_equal 1, probe.is_enabled?
370
+
371
+ probe.fire
372
+
373
+ c = Dtrace::Consumer.new(t)
374
+ data = []
375
+ c.consume_once do |d|
376
+ data << d
377
+ end
378
+
379
+ assert_equal 1, data.length
380
+ assert_equal 'fired!', data[0].data[0].value
381
+ end
382
+
383
+ end