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.
- data/History.txt +34 -0
- data/Manifest.txt +58 -0
- data/README.txt +88 -0
- data/Rakefile +73 -0
- data/examples/scsi.rb +442 -0
- data/ext/dof/constants.c +49 -0
- data/ext/dof/dof.h +55 -0
- data/ext/dof/dof_api.c +57 -0
- data/ext/dof/dof_helper.c +82 -0
- data/ext/dof/extconf.rb +4 -0
- data/ext/dof/file.c +56 -0
- data/ext/dof/generator.c +9 -0
- data/ext/dof/header.c +80 -0
- data/ext/dof/parser.c +415 -0
- data/ext/dof/parser.h +10 -0
- data/ext/dof/section.c +302 -0
- data/ext/dtrace_aggdata.c +142 -0
- data/ext/dtrace_api.c +119 -0
- data/ext/dtrace_api.h +150 -0
- data/ext/dtrace_bufdata.c +139 -0
- data/ext/dtrace_dropdata.c +131 -0
- data/ext/dtrace_errdata.c +110 -0
- data/ext/dtrace_hdl.c +577 -0
- data/ext/dtrace_probedata.c +267 -0
- data/ext/dtrace_probedesc.c +78 -0
- data/ext/dtrace_process.c +37 -0
- data/ext/dtrace_program.c +62 -0
- data/ext/dtrace_programinfo.c +60 -0
- data/ext/dtrace_recdesc.c +46 -0
- data/ext/dtrace_util.c +92 -0
- data/ext/extconf.rb +28 -0
- data/ext/stubs.txt +78 -0
- data/lib/dtrace/aggregate.rb +40 -0
- data/lib/dtrace/aggregateset.rb +19 -0
- data/lib/dtrace/consumer.rb +174 -0
- data/lib/dtrace/data.rb +82 -0
- data/lib/dtrace/dof/file.rb +63 -0
- data/lib/dtrace/dof/section/strtab.rb +21 -0
- data/lib/dtrace/dof/section.rb +69 -0
- data/lib/dtrace/dof.rb +8 -0
- data/lib/dtrace/printfrecord.rb +10 -0
- data/lib/dtrace/probe.rb +46 -0
- data/lib/dtrace/probedata.rb +23 -0
- data/lib/dtrace/probedesc.rb +15 -0
- data/lib/dtrace/provider/probedef.rb +24 -0
- data/lib/dtrace/provider.rb +231 -0
- data/lib/dtrace/record.rb +11 -0
- data/lib/dtrace/stackrecord.rb +31 -0
- data/lib/dtrace/tracer.rb +35 -0
- data/lib/dtrace.rb +74 -0
- data/lib/dtraceconsumer.rb +9 -0
- data/plugin/dtrace/README +81 -0
- data/plugin/dtrace/Rakefile +22 -0
- data/plugin/dtrace/bin/dtracer.rb +29 -0
- data/plugin/dtrace/init.rb +7 -0
- data/plugin/dtrace/lib/dtrace_helper.rb +2 -0
- data/plugin/dtrace/lib/dtrace_report.rb +67 -0
- data/plugin/dtrace/lib/dtracer.rb +52 -0
- data/plugin/dtrace/lib/dtracer_client.rb +26 -0
- data/plugin/dtrace/public/stylesheets/dtrace.css +48 -0
- data/plugin/dtrace/scripts/default.d +11 -0
- data/plugin/dtrace/scripts/rails_mysql.d +29 -0
- data/plugin/dtrace/tasks/dtrace.rake +52 -0
- data/plugin/dtrace/test/dtrace_test.rb +8 -0
- data/plugin/dtrace/views/dtrace/_report.rhtml +26 -0
- data/test/apple-dof +0 -0
- data/test/disabled_probe_effect.txt +19 -0
- data/test/dof +0 -0
- data/test/dof2 +0 -0
- data/test/test_disabled_probe_effect.rb +60 -0
- data/test/test_dof_generator.rb +142 -0
- data/test/test_dof_helper.rb +106 -0
- data/test/test_dof_parser.rb +25 -0
- data/test/test_dof_providers.rb +282 -0
- data/test/test_dof_strtabs.rb +92 -0
- data/test/test_dtrace.rb +111 -0
- data/test/test_dtrace_aggregates.rb +56 -0
- data/test/test_dtrace_drops_errors.rb +183 -0
- data/test/test_dtrace_probe.rb +383 -0
- data/test/test_dtrace_probes.rb +400 -0
- data/test/test_dtrace_processes.rb +83 -0
- data/test/test_dtrace_profile.rb +232 -0
- data/test/test_dtrace_provider.rb +153 -0
- data/test/test_dtrace_repeat.rb +51 -0
- data/test/test_dtrace_rubyprobe.rb +52 -0
- data/test/test_dtrace_typefilter.rb +108 -0
- data/test/test_legacy_consumer.rb +56 -0
- metadata +165 -0
@@ -0,0 +1,400 @@
|
|
1
|
+
#
|
2
|
+
# Ruby-Dtrace
|
3
|
+
# (c) 2008 Chris Andrews <chris@nodnol.org>
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'dtrace'
|
7
|
+
require 'dtrace/provider'
|
8
|
+
require 'test/unit'
|
9
|
+
|
10
|
+
class TestDtraceProbes < Test::Unit::TestCase
|
11
|
+
|
12
|
+
def test_probe_no_args
|
13
|
+
Dtrace::Provider.create :foo1 do |p|
|
14
|
+
p.probe :bar
|
15
|
+
end
|
16
|
+
|
17
|
+
t = Dtrace.new
|
18
|
+
t.setopt("bufsize", "4m")
|
19
|
+
|
20
|
+
progtext = <<EOD
|
21
|
+
foo1*:ruby:test_probe_no_args:bar
|
22
|
+
{
|
23
|
+
trace("fired");
|
24
|
+
}
|
25
|
+
EOD
|
26
|
+
|
27
|
+
prog = t.compile progtext
|
28
|
+
prog.execute
|
29
|
+
t.go
|
30
|
+
c = Dtrace::Consumer.new(t)
|
31
|
+
|
32
|
+
Dtrace::Probe::Foo1.bar do |p|
|
33
|
+
p.fire
|
34
|
+
end
|
35
|
+
|
36
|
+
data = []
|
37
|
+
c.consume_once do |d|
|
38
|
+
data << d
|
39
|
+
end
|
40
|
+
|
41
|
+
assert_equal 1, data.length
|
42
|
+
assert_equal 'fired', data[0].data[0].value
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_probe_one_int_arg
|
47
|
+
Dtrace::Provider.create :foo2 do |p|
|
48
|
+
p.probe :bar, :integer
|
49
|
+
end
|
50
|
+
|
51
|
+
t = Dtrace.new
|
52
|
+
t.setopt("bufsize", "4m")
|
53
|
+
|
54
|
+
progtext = <<EOD
|
55
|
+
foo2*:ruby:test_probe_one_int_arg:bar
|
56
|
+
{
|
57
|
+
trace(arg0);
|
58
|
+
}
|
59
|
+
EOD
|
60
|
+
|
61
|
+
prog = t.compile progtext
|
62
|
+
prog.execute
|
63
|
+
t.go
|
64
|
+
c = Dtrace::Consumer.new(t)
|
65
|
+
|
66
|
+
Dtrace::Probe::Foo2.bar do |p|
|
67
|
+
p.fire(42)
|
68
|
+
end
|
69
|
+
|
70
|
+
data = []
|
71
|
+
c.consume_once do |d|
|
72
|
+
data << d
|
73
|
+
end
|
74
|
+
|
75
|
+
assert_equal 1, data.length
|
76
|
+
assert_equal 42, data[0].data[0].value
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_multiple_probes_w_args
|
81
|
+
Dtrace::Provider.create :foo3 do |p|
|
82
|
+
p.probe :bar, :integer
|
83
|
+
p.probe :baz, :string
|
84
|
+
end
|
85
|
+
|
86
|
+
t = Dtrace.new
|
87
|
+
t.setopt("bufsize", "4m")
|
88
|
+
|
89
|
+
progtext = <<EOD
|
90
|
+
foo3*:ruby:*:bar
|
91
|
+
{
|
92
|
+
trace(arg0);
|
93
|
+
}
|
94
|
+
|
95
|
+
foo3*:ruby:*:baz
|
96
|
+
{
|
97
|
+
trace(copyinstr(arg0));
|
98
|
+
}
|
99
|
+
EOD
|
100
|
+
|
101
|
+
prog = t.compile progtext
|
102
|
+
prog.execute
|
103
|
+
t.go
|
104
|
+
c = Dtrace::Consumer.new(t)
|
105
|
+
|
106
|
+
Dtrace::Probe::Foo3.bar do |p|
|
107
|
+
p.fire(42)
|
108
|
+
end
|
109
|
+
|
110
|
+
Dtrace::Probe::Foo3.baz do |p|
|
111
|
+
p.fire('fired!')
|
112
|
+
end
|
113
|
+
|
114
|
+
data = []
|
115
|
+
c.consume_once do |d|
|
116
|
+
data << d
|
117
|
+
end
|
118
|
+
|
119
|
+
assert_equal 2, data.length
|
120
|
+
assert_equal 42, data[0].data[0].value
|
121
|
+
assert_equal 'fired!', data[1].data[0].value
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_multiple_probes_w_multiple_args
|
126
|
+
Dtrace::Provider.create :foo4 do |p|
|
127
|
+
p.probe :bar, :integer, :integer
|
128
|
+
p.probe :baz, :string, :string
|
129
|
+
end
|
130
|
+
|
131
|
+
t = Dtrace.new
|
132
|
+
t.setopt("bufsize", "4m")
|
133
|
+
|
134
|
+
progtext = <<EOD
|
135
|
+
foo4*:ruby:*:bar
|
136
|
+
{
|
137
|
+
trace(arg0);
|
138
|
+
trace(arg1);
|
139
|
+
}
|
140
|
+
|
141
|
+
foo4*:ruby:*:baz
|
142
|
+
{
|
143
|
+
trace(copyinstr(arg0));
|
144
|
+
trace(copyinstr(arg1));
|
145
|
+
}
|
146
|
+
EOD
|
147
|
+
|
148
|
+
prog = t.compile progtext
|
149
|
+
prog.execute
|
150
|
+
t.go
|
151
|
+
c = Dtrace::Consumer.new(t)
|
152
|
+
|
153
|
+
Dtrace::Probe::Foo4.bar do |p|
|
154
|
+
p.fire(42, 27)
|
155
|
+
end
|
156
|
+
|
157
|
+
Dtrace::Probe::Foo4.baz do |p|
|
158
|
+
p.fire('fired!', 'again')
|
159
|
+
end
|
160
|
+
|
161
|
+
data = []
|
162
|
+
c.consume_once do |d|
|
163
|
+
data << d
|
164
|
+
end
|
165
|
+
|
166
|
+
assert_equal 2, data.length
|
167
|
+
assert_equal 42, data[0].data[0].value
|
168
|
+
assert_equal 27, data[0].data[1].value
|
169
|
+
assert_equal 'fired!', data[1].data[0].value
|
170
|
+
assert_equal 'again', data[1].data[1].value
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_all_argcs
|
175
|
+
Dtrace::Provider.create :foo5 do |p|
|
176
|
+
p.probe :bar1, :integer
|
177
|
+
p.probe :bar2, :integer, :integer
|
178
|
+
p.probe :bar3, :integer, :integer, :integer
|
179
|
+
p.probe :bar4, :integer, :integer, :integer, :integer
|
180
|
+
p.probe :bar5, :integer, :integer, :integer, :integer,
|
181
|
+
:integer
|
182
|
+
p.probe :bar6, :integer, :integer, :integer, :integer,
|
183
|
+
:integer, :integer
|
184
|
+
p.probe :bar7, :integer, :integer, :integer, :integer,
|
185
|
+
:integer, :integer, :integer
|
186
|
+
p.probe :bar8, :integer, :integer, :integer, :integer,
|
187
|
+
:integer, :integer, :integer, :integer
|
188
|
+
end
|
189
|
+
|
190
|
+
t = Dtrace.new
|
191
|
+
t.setopt("bufsize", "4m")
|
192
|
+
|
193
|
+
progtext = <<EOD
|
194
|
+
foo5*:ruby:*:bar1
|
195
|
+
{
|
196
|
+
trace(arg0);
|
197
|
+
|
198
|
+
}
|
199
|
+
|
200
|
+
foo5*:ruby:*:bar2
|
201
|
+
{
|
202
|
+
trace(arg0);
|
203
|
+
trace(arg1);
|
204
|
+
|
205
|
+
}
|
206
|
+
|
207
|
+
foo5*:ruby:*:bar3
|
208
|
+
{
|
209
|
+
trace(arg0);
|
210
|
+
trace(arg1);
|
211
|
+
trace(arg2);
|
212
|
+
|
213
|
+
}
|
214
|
+
|
215
|
+
foo5*:ruby:*:bar4
|
216
|
+
{
|
217
|
+
trace(arg0);
|
218
|
+
trace(arg1);
|
219
|
+
trace(arg2);
|
220
|
+
trace(arg3);
|
221
|
+
|
222
|
+
}
|
223
|
+
|
224
|
+
foo5*:ruby:*:bar5
|
225
|
+
{
|
226
|
+
trace(arg0);
|
227
|
+
trace(arg1);
|
228
|
+
trace(arg2);
|
229
|
+
trace(arg3);
|
230
|
+
trace(arg4);
|
231
|
+
}
|
232
|
+
|
233
|
+
foo5*:ruby:*:bar6
|
234
|
+
{
|
235
|
+
trace(arg0);
|
236
|
+
trace(arg1);
|
237
|
+
trace(arg2);
|
238
|
+
trace(arg3);
|
239
|
+
trace(arg4);
|
240
|
+
trace(arg5);
|
241
|
+
}
|
242
|
+
|
243
|
+
foo5*:ruby:*:bar7
|
244
|
+
{
|
245
|
+
trace(arg0);
|
246
|
+
trace(arg1);
|
247
|
+
trace(arg2);
|
248
|
+
trace(arg3);
|
249
|
+
trace(arg4);
|
250
|
+
trace(arg5);
|
251
|
+
trace(arg6);
|
252
|
+
}
|
253
|
+
|
254
|
+
foo5*:ruby:*:bar8
|
255
|
+
{
|
256
|
+
trace(arg0);
|
257
|
+
trace(arg1);
|
258
|
+
trace(arg2);
|
259
|
+
trace(arg3);
|
260
|
+
trace(arg4);
|
261
|
+
trace(arg5);
|
262
|
+
trace(arg6);
|
263
|
+
trace(arg7);
|
264
|
+
}
|
265
|
+
EOD
|
266
|
+
|
267
|
+
prog = t.compile progtext
|
268
|
+
prog.execute
|
269
|
+
t.go
|
270
|
+
c = Dtrace::Consumer.new(t)
|
271
|
+
|
272
|
+
Dtrace::Probe::Foo5.bar1 do |p|
|
273
|
+
p.fire(11)
|
274
|
+
end
|
275
|
+
Dtrace::Probe::Foo5.bar2 do |p|
|
276
|
+
p.fire(21, 22)
|
277
|
+
end
|
278
|
+
Dtrace::Probe::Foo5.bar3 do |p|
|
279
|
+
p.fire(31, 32, 33)
|
280
|
+
end
|
281
|
+
Dtrace::Probe::Foo5.bar4 do |p|
|
282
|
+
p.fire(41, 42, 43, 44)
|
283
|
+
end
|
284
|
+
Dtrace::Probe::Foo5.bar5 do |p|
|
285
|
+
p.fire(51, 52, 53, 54, 55)
|
286
|
+
end
|
287
|
+
Dtrace::Probe::Foo5.bar6 do |p|
|
288
|
+
p.fire(61, 62, 63, 64, 65, 66)
|
289
|
+
end
|
290
|
+
Dtrace::Probe::Foo5.bar7 do |p|
|
291
|
+
p.fire(71, 72, 73, 74, 75, 76, 77)
|
292
|
+
end
|
293
|
+
Dtrace::Probe::Foo5.bar8 do |p|
|
294
|
+
p.fire(81, 82, 83, 84, 85, 86, 87, 88)
|
295
|
+
end
|
296
|
+
|
297
|
+
data = []
|
298
|
+
c.consume_once do |d|
|
299
|
+
data << d
|
300
|
+
end
|
301
|
+
|
302
|
+
assert_equal 8, data.length
|
303
|
+
|
304
|
+
assert_equal 11, data[0].data[0].value
|
305
|
+
|
306
|
+
assert_equal 21, data[1].data[0].value
|
307
|
+
assert_equal 22, data[1].data[1].value
|
308
|
+
|
309
|
+
assert_equal 31, data[2].data[0].value
|
310
|
+
assert_equal 32, data[2].data[1].value
|
311
|
+
assert_equal 33, data[2].data[2].value
|
312
|
+
|
313
|
+
assert_equal 41, data[3].data[0].value
|
314
|
+
assert_equal 42, data[3].data[1].value
|
315
|
+
assert_equal 43, data[3].data[2].value
|
316
|
+
assert_equal 44, data[3].data[3].value
|
317
|
+
|
318
|
+
assert_equal 51, data[4].data[0].value
|
319
|
+
assert_equal 52, data[4].data[1].value
|
320
|
+
assert_equal 53, data[4].data[2].value
|
321
|
+
assert_equal 54, data[4].data[3].value
|
322
|
+
assert_equal 55, data[4].data[4].value
|
323
|
+
|
324
|
+
assert_equal 61, data[5].data[0].value
|
325
|
+
assert_equal 62, data[5].data[1].value
|
326
|
+
assert_equal 63, data[5].data[2].value
|
327
|
+
assert_equal 64, data[5].data[3].value
|
328
|
+
assert_equal 65, data[5].data[4].value
|
329
|
+
assert_equal 66, data[5].data[5].value
|
330
|
+
|
331
|
+
assert_equal 71, data[6].data[0].value
|
332
|
+
assert_equal 72, data[6].data[1].value
|
333
|
+
assert_equal 73, data[6].data[2].value
|
334
|
+
assert_equal 74, data[6].data[3].value
|
335
|
+
assert_equal 75, data[6].data[4].value
|
336
|
+
assert_equal 76, data[6].data[5].value
|
337
|
+
assert_equal 77, data[6].data[6].value
|
338
|
+
|
339
|
+
assert_equal 81, data[7].data[0].value
|
340
|
+
assert_equal 82, data[7].data[1].value
|
341
|
+
assert_equal 83, data[7].data[2].value
|
342
|
+
assert_equal 84, data[7].data[3].value
|
343
|
+
assert_equal 85, data[7].data[4].value
|
344
|
+
assert_equal 86, data[7].data[5].value
|
345
|
+
assert_equal 87, data[7].data[6].value
|
346
|
+
assert_equal 88, data[7].data[7].value
|
347
|
+
|
348
|
+
end
|
349
|
+
|
350
|
+
def test_all_eight_args_chars
|
351
|
+
Dtrace::Provider.create :foo6 do |p|
|
352
|
+
p.probe :bar, :string, :string, :string, :string,
|
353
|
+
:string, :string, :string, :string
|
354
|
+
end
|
355
|
+
|
356
|
+
t = Dtrace.new
|
357
|
+
t.setopt("bufsize", "4m")
|
358
|
+
|
359
|
+
progtext = <<EOD
|
360
|
+
foo6*:ruby:*:bar
|
361
|
+
{
|
362
|
+
trace(copyinstr(arg0));
|
363
|
+
trace(copyinstr(arg1));
|
364
|
+
trace(copyinstr(arg2));
|
365
|
+
trace(copyinstr(arg3));
|
366
|
+
trace(copyinstr(arg4));
|
367
|
+
trace(copyinstr(arg5));
|
368
|
+
trace(copyinstr(arg6));
|
369
|
+
trace(copyinstr(arg7));
|
370
|
+
}
|
371
|
+
EOD
|
372
|
+
|
373
|
+
prog = t.compile progtext
|
374
|
+
prog.execute
|
375
|
+
t.go
|
376
|
+
c = Dtrace::Consumer.new(t)
|
377
|
+
|
378
|
+
Dtrace::Probe::Foo6.bar do |p|
|
379
|
+
p.fire('one', 'two', 'three', 'four',
|
380
|
+
'five', 'six', 'seven', 'eight')
|
381
|
+
end
|
382
|
+
|
383
|
+
data = []
|
384
|
+
c.consume_once do |d|
|
385
|
+
data << d
|
386
|
+
end
|
387
|
+
|
388
|
+
assert_equal 1, data.length
|
389
|
+
assert_equal 'one', data[0].data[0].value
|
390
|
+
assert_equal 'two', data[0].data[1].value
|
391
|
+
assert_equal 'three', data[0].data[2].value
|
392
|
+
assert_equal 'four', data[0].data[3].value
|
393
|
+
assert_equal 'five', data[0].data[4].value
|
394
|
+
assert_equal 'six', data[0].data[5].value
|
395
|
+
assert_equal 'seven', data[0].data[6].value
|
396
|
+
assert_equal 'eight', data[0].data[7].value
|
397
|
+
|
398
|
+
end
|
399
|
+
|
400
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
#
|
2
|
+
# Ruby-Dtrace
|
3
|
+
# (c) 2007 Chris Andrews <chris@nodnol.org>
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'dtrace'
|
7
|
+
require 'test/unit'
|
8
|
+
|
9
|
+
# Tests for creating and grabbing processes.
|
10
|
+
|
11
|
+
class TestDtraceProcesses < Test::Unit::TestCase
|
12
|
+
|
13
|
+
def test_createprocess
|
14
|
+
|
15
|
+
t = Dtrace.new
|
16
|
+
t.setopt("bufsize", "8m")
|
17
|
+
t.setopt("aggsize", "4m")
|
18
|
+
t.setopt("stackframes", "5")
|
19
|
+
t.setopt("strsize", "131072")
|
20
|
+
|
21
|
+
progtext = <<EOD
|
22
|
+
pid$target:*::entry,
|
23
|
+
pid$target:*::return
|
24
|
+
{
|
25
|
+
trace(pid);
|
26
|
+
}
|
27
|
+
EOD
|
28
|
+
|
29
|
+
p = t.createprocess([ '/usr/bin/true' ])
|
30
|
+
prog = t.compile(progtext)
|
31
|
+
prog.execute
|
32
|
+
t.go
|
33
|
+
p.continue
|
34
|
+
|
35
|
+
i = 0
|
36
|
+
c = Dtrace::Consumer.new(t)
|
37
|
+
c.consume do |d|
|
38
|
+
assert d
|
39
|
+
assert_equal "pid#{d.data[0].value}", d.probe.provider
|
40
|
+
i = i + 1
|
41
|
+
if i > 10
|
42
|
+
c.finish
|
43
|
+
end
|
44
|
+
end
|
45
|
+
assert i > 0
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_grabprocess
|
49
|
+
|
50
|
+
t = Dtrace.new
|
51
|
+
t.setopt("bufsize", "8m")
|
52
|
+
t.setopt("aggsize", "4m")
|
53
|
+
t.setopt("stackframes", "5")
|
54
|
+
t.setopt("strsize", "131072")
|
55
|
+
|
56
|
+
progtext = <<EOD
|
57
|
+
pid$target:*::entry,
|
58
|
+
pid$target:*::return
|
59
|
+
{
|
60
|
+
|
61
|
+
}
|
62
|
+
EOD
|
63
|
+
|
64
|
+
pid = Kernel.fork { (0..9).each do sleep 1 end }
|
65
|
+
p = t.grabprocess(pid)
|
66
|
+
prog = t.compile(progtext)
|
67
|
+
prog.execute
|
68
|
+
|
69
|
+
t.go
|
70
|
+
p.continue
|
71
|
+
|
72
|
+
sleep 3
|
73
|
+
|
74
|
+
i = 0
|
75
|
+
c = Dtrace::Consumer.new(t)
|
76
|
+
c.consume_once do |d|
|
77
|
+
assert d
|
78
|
+
assert_equal "pid#{pid}", d.probe.provider
|
79
|
+
i = i + 1
|
80
|
+
end
|
81
|
+
assert i > 0
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
#
|
2
|
+
# Ruby-Dtrace
|
3
|
+
# (c) 2007 Chris Andrews <chris@nodnol.org>
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'dtrace'
|
7
|
+
require 'test/unit'
|
8
|
+
|
9
|
+
# Tests using the DTrace profile provider.
|
10
|
+
|
11
|
+
class TestDtraceProfile < Test::Unit::TestCase
|
12
|
+
|
13
|
+
def test_dprogram_run
|
14
|
+
t = Dtrace.new
|
15
|
+
t.setopt("bufsize", "4m")
|
16
|
+
t.setopt("aggsize", "4m")
|
17
|
+
|
18
|
+
progtext = 'profile:::profile-1 { trace("foo"); }'
|
19
|
+
|
20
|
+
prog = t.compile progtext
|
21
|
+
prog.execute
|
22
|
+
t.go
|
23
|
+
sleep 2
|
24
|
+
|
25
|
+
c = Dtrace::Consumer.new(t)
|
26
|
+
assert c
|
27
|
+
|
28
|
+
i = 0
|
29
|
+
c.consume do |d|
|
30
|
+
assert d
|
31
|
+
assert_equal "profile:::profile-1", d.probe.to_s
|
32
|
+
assert_not_nil d.cpu
|
33
|
+
|
34
|
+
d.data.each do |r|
|
35
|
+
assert_equal r.value, "foo"
|
36
|
+
end
|
37
|
+
|
38
|
+
i = i + 1
|
39
|
+
if i > 10
|
40
|
+
c.finish
|
41
|
+
end
|
42
|
+
end
|
43
|
+
assert i > 0
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_dprogram_aggregate
|
47
|
+
t = Dtrace.new
|
48
|
+
t.setopt("bufsize", "4m")
|
49
|
+
t.setopt("aggsize", "4m")
|
50
|
+
|
51
|
+
progtext = <<EOD
|
52
|
+
profile-1000
|
53
|
+
{
|
54
|
+
@a[execname] = count();
|
55
|
+
}
|
56
|
+
|
57
|
+
profile-10
|
58
|
+
{
|
59
|
+
printa(@a)
|
60
|
+
}
|
61
|
+
EOD
|
62
|
+
|
63
|
+
prog = t.compile progtext
|
64
|
+
prog.execute
|
65
|
+
t.go
|
66
|
+
sleep 2
|
67
|
+
|
68
|
+
c = Dtrace::Consumer.new(t)
|
69
|
+
|
70
|
+
i = 0
|
71
|
+
c.consume do |d|
|
72
|
+
assert d
|
73
|
+
assert_not_nil d.cpu
|
74
|
+
assert_equal "profile:::profile-10", d.probe.to_s
|
75
|
+
|
76
|
+
d.data.each do |r|
|
77
|
+
assert_equal Dtrace::AggregateSet, r.class
|
78
|
+
r.data.each do |a|
|
79
|
+
assert_not_nil a.value
|
80
|
+
assert_not_nil a.tuple
|
81
|
+
assert_equal 1, a.tuple.length
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
i = i + 1
|
86
|
+
if i >= 10
|
87
|
+
c.finish
|
88
|
+
end
|
89
|
+
end
|
90
|
+
assert i > 0
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_dprogram_printf
|
94
|
+
t = Dtrace.new
|
95
|
+
t.setopt("bufsize", "4m")
|
96
|
+
t.setopt("aggsize", "4m")
|
97
|
+
|
98
|
+
progtext = <<EOD
|
99
|
+
profile-1
|
100
|
+
{
|
101
|
+
printf("execname: %s %s", execname, "foo")
|
102
|
+
}
|
103
|
+
EOD
|
104
|
+
|
105
|
+
prog = t.compile progtext
|
106
|
+
prog.execute
|
107
|
+
t.go
|
108
|
+
sleep 2
|
109
|
+
|
110
|
+
c = Dtrace::Consumer.new(t)
|
111
|
+
|
112
|
+
i = 0
|
113
|
+
c.consume do |d|
|
114
|
+
assert d
|
115
|
+
assert_not_nil d.cpu
|
116
|
+
assert_equal "profile:::profile-1", d.probe.to_s
|
117
|
+
|
118
|
+
i = i + 1
|
119
|
+
if i >= 10
|
120
|
+
c.finish
|
121
|
+
end
|
122
|
+
end
|
123
|
+
assert i > 0
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_dprogram_aggregate_once
|
127
|
+
t = Dtrace.new
|
128
|
+
t.setopt("bufsize", "4m")
|
129
|
+
t.setopt("aggsize", "4m")
|
130
|
+
|
131
|
+
progtext = <<EOD
|
132
|
+
profile-1000hz
|
133
|
+
{
|
134
|
+
@a[execname] = count();
|
135
|
+
}
|
136
|
+
|
137
|
+
END
|
138
|
+
{
|
139
|
+
printa(@a)
|
140
|
+
}
|
141
|
+
EOD
|
142
|
+
|
143
|
+
prog = t.compile progtext
|
144
|
+
prog.execute
|
145
|
+
t.go
|
146
|
+
sleep 2
|
147
|
+
|
148
|
+
i = 0
|
149
|
+
c = Dtrace::Consumer.new(t)
|
150
|
+
c.consume_once do |d|
|
151
|
+
i = i + 1
|
152
|
+
assert d
|
153
|
+
assert_not_nil d.cpu
|
154
|
+
assert_equal "dtrace:::END", d.probe.to_s
|
155
|
+
|
156
|
+
d.data.each do |r|
|
157
|
+
assert_equal Dtrace::AggregateSet, r.class
|
158
|
+
r.data.each do |a|
|
159
|
+
assert_not_nil a.value
|
160
|
+
assert_not_nil a.tuple
|
161
|
+
assert_equal 1, a.tuple.length
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
assert i > 0
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_stack
|
169
|
+
t = Dtrace.new
|
170
|
+
t.setopt("bufsize", "8m")
|
171
|
+
t.setopt("aggsize", "4m")
|
172
|
+
t.setopt("stackframes", "5")
|
173
|
+
t.setopt("strsize", "131072")
|
174
|
+
|
175
|
+
progtext = "profile-1 { trace(execname); stack(); }"
|
176
|
+
prog = t.compile progtext
|
177
|
+
prog.execute
|
178
|
+
t.go
|
179
|
+
sleep 2
|
180
|
+
|
181
|
+
c = Dtrace::Consumer.new(t)
|
182
|
+
i = 0
|
183
|
+
c.consume do |d|
|
184
|
+
assert d
|
185
|
+
assert_not_nil d.cpu
|
186
|
+
assert_equal "profile:::profile-1", d.probe.to_s
|
187
|
+
|
188
|
+
assert_equal 2, d.data.length
|
189
|
+
assert_equal Dtrace::Record, d.data[0].class
|
190
|
+
assert_equal Dtrace::StackRecord, d.data[1].class
|
191
|
+
|
192
|
+
i = i + 1
|
193
|
+
if i > 10
|
194
|
+
c.finish
|
195
|
+
end
|
196
|
+
end
|
197
|
+
assert i > 0
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_ustack
|
201
|
+
t = Dtrace.new
|
202
|
+
t.setopt("bufsize", "8m")
|
203
|
+
t.setopt("aggsize", "4m")
|
204
|
+
t.setopt("stackframes", "5")
|
205
|
+
t.setopt("strsize", "131072")
|
206
|
+
|
207
|
+
progtext = "profile-1 { trace(execname); ustack(); }"
|
208
|
+
prog = t.compile progtext
|
209
|
+
prog.execute
|
210
|
+
t.go
|
211
|
+
sleep 2
|
212
|
+
|
213
|
+
c = Dtrace::Consumer.new(t)
|
214
|
+
i = 0
|
215
|
+
c.consume do |d|
|
216
|
+
assert d
|
217
|
+
assert_not_nil d.cpu
|
218
|
+
assert_equal "profile:::profile-1", d.probe.to_s
|
219
|
+
|
220
|
+
assert_equal 2, d.data.length
|
221
|
+
assert_equal Dtrace::Record, d.data[0].class
|
222
|
+
assert_equal Dtrace::StackRecord, d.data[1].class
|
223
|
+
|
224
|
+
i = i + 1
|
225
|
+
if i > 10
|
226
|
+
c.finish
|
227
|
+
end
|
228
|
+
end
|
229
|
+
assert i > 0
|
230
|
+
end
|
231
|
+
|
232
|
+
end
|