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,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