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,282 @@
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 TestDofProviders < Test::Unit::TestCase
11
+ include Dtrace::Dof::Constants
12
+
13
+ def test_probe_no_args
14
+ f = Dtrace::Dof::File.new
15
+
16
+ s = Dtrace::Dof::Section.new(DOF_SECT_STRTAB, 0)
17
+ s.data = ['test', 'main', 'test1']
18
+ f.sections << s
19
+
20
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROBES, 1)
21
+ s.data = [
22
+ {
23
+ :noffs => 1,
24
+ :enoffidx => 0,
25
+ :argidx => 0,
26
+ :name => 1,
27
+ :nenoffs => 0,
28
+ :offidx => 0,
29
+ :addr => 0,
30
+ :nargc => 0,
31
+ :func => 6,
32
+ :xargc => 0
33
+ },
34
+ ]
35
+ f.sections << s
36
+
37
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRARGS, 2)
38
+ s.data = [ 0 ]
39
+ f.sections << s
40
+
41
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROFFS, 3)
42
+ s.data = [ 36 ]
43
+ f.sections << s
44
+
45
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRENOFFS, 4)
46
+ s.data = [ 0 ]
47
+ f.sections << s
48
+
49
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROVIDER, 5)
50
+ s.data = {
51
+ :strtab => 0,
52
+ :probes => 1,
53
+ :prargs => 2,
54
+ :proffs => 3,
55
+ :prenoffs => 4,
56
+ :name => 11,
57
+ :provattr => { :name => 5, :data => 5, :class => 5 },
58
+ :modattr => { :name => 1, :data => 1, :class => 5 },
59
+ :funcattr => { :name => 1, :data => 1, :class => 5 },
60
+ :nameattr => { :name => 5, :data => 5, :class => 5 },
61
+ :argsattr => { :name => 5, :data => 5, :class => 5 }
62
+ }
63
+ f.sections << s
64
+
65
+ f.generate
66
+ Dtrace::Dof.loaddof(f, 'testmodule')
67
+
68
+ t = Dtrace.new
69
+ matches = 0
70
+ t.each_probe do |p|
71
+ if p.to_s == "test1#{$$}:testmodule:main:test"
72
+ matches += 1
73
+ end
74
+ end
75
+ assert_equal 1, matches
76
+
77
+ end
78
+
79
+ def test_probe_with_char_arg
80
+ f = Dtrace::Dof::File.new
81
+
82
+ s = Dtrace::Dof::Section.new(DOF_SECT_STRTAB, 0)
83
+ s.data = ['test', 'char *', 'char *', 'main', 'test2']
84
+ f.sections << s
85
+
86
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROBES, 1)
87
+ s.data = [
88
+ {
89
+ :nargv => 6,
90
+ :noffs => 1,
91
+ :xargv => 13,
92
+ :enoffidx => 0,
93
+ :argidx => 0,
94
+ :name => 1,
95
+ :nenoffs => 0,
96
+ :offidx => 0,
97
+ :addr => 0,
98
+ :nargc => 1,
99
+ :func => 20,
100
+ :xargc => 1
101
+ },
102
+ ]
103
+ f.sections << s
104
+
105
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRARGS, 2)
106
+ s.data = [ 0 ]
107
+ f.sections << s
108
+
109
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROFFS, 3)
110
+ s.data = [ 36 ]
111
+ f.sections << s
112
+
113
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRENOFFS, 4)
114
+ s.data = [ 0 ]
115
+ f.sections << s
116
+
117
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROVIDER, 5)
118
+ s.data = {
119
+ :strtab => 0,
120
+ :probes => 1,
121
+ :prargs => 2,
122
+ :proffs => 3,
123
+ :prenoffs => 4,
124
+ :name => 25,
125
+ :provattr => { :name => 5, :data => 5, :class => 5 },
126
+ :modattr => { :name => 1, :data => 1, :class => 5 },
127
+ :funcattr => { :name => 1, :data => 1, :class => 5 },
128
+ :nameattr => { :name => 5, :data => 5, :class => 5 },
129
+ :argsattr => { :name => 5, :data => 5, :class => 5 }
130
+ }
131
+ f.sections << s
132
+
133
+ f.generate
134
+ Dtrace::Dof.loaddof(f, 'testmodule')
135
+
136
+ t = Dtrace.new
137
+ matches = 0
138
+ t.each_probe do |p|
139
+ if p.to_s == "test2#{$$}:testmodule:main:test"
140
+ matches += 1
141
+ end
142
+ end
143
+ assert_equal 1, matches
144
+
145
+ end
146
+
147
+ def test_probe_with_int_arg
148
+ f = Dtrace::Dof::File.new
149
+
150
+ s = Dtrace::Dof::Section.new(DOF_SECT_STRTAB, 0)
151
+ s.data = ['test', 'int', 'int', 'main', 'test3']
152
+ f.sections << s
153
+
154
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROBES, 1)
155
+ s.data = [
156
+ {
157
+ :nargv => 6,
158
+ :noffs => 1,
159
+ :xargv => 10,
160
+ :enoffidx => 0,
161
+ :argidx => 0,
162
+ :name => 1,
163
+ :nenoffs => 0,
164
+ :offidx => 0,
165
+ :addr => 0,
166
+ :nargc => 1,
167
+ :func => 14,
168
+ :xargc => 1
169
+ },
170
+ ]
171
+ f.sections << s
172
+
173
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRARGS, 2)
174
+ s.data = [ 0 ]
175
+ f.sections << s
176
+
177
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROFFS, 3)
178
+ s.data = [ 36 ]
179
+ f.sections << s
180
+
181
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRENOFFS, 4)
182
+ s.data = [ 36 ]
183
+ f.sections << s
184
+
185
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROVIDER, 5)
186
+ s.data = {
187
+ :strtab => 0,
188
+ :probes => 1,
189
+ :prargs => 2,
190
+ :proffs => 3,
191
+ :prenoffs => 4,
192
+ :name => 19,
193
+ :provattr => { :name => 5, :data => 5, :class => 5 },
194
+ :modattr => { :name => 1, :data => 1, :class => 5 },
195
+ :funcattr => { :name => 1, :data => 1, :class => 5 },
196
+ :nameattr => { :name => 5, :data => 5, :class => 5 },
197
+ :argsattr => { :name => 5, :data => 5, :class => 5 }
198
+ }
199
+ f.sections << s
200
+
201
+ f.generate
202
+ Dtrace::Dof.loaddof(f, 'testmodule')
203
+
204
+ t = Dtrace.new
205
+ matches = 0
206
+ t.each_probe do |p|
207
+ if p.to_s == "test3#{$$}:testmodule:main:test"
208
+ matches += 1
209
+ end
210
+ end
211
+ assert_equal 1, matches
212
+
213
+ end
214
+
215
+ def test_probe_is_enabled
216
+ f = Dtrace::Dof::File.new
217
+
218
+ s = Dtrace::Dof::Section.new(DOF_SECT_STRTAB, 0)
219
+ s.data = ['test', 'main', 'test4']
220
+ f.sections << s
221
+
222
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROBES, 1)
223
+ s.data = [
224
+ {
225
+ :noffs => 1,
226
+ :enoffidx => 0,
227
+ :argidx => 0,
228
+ :name => 1,
229
+ :nenoffs => 0,
230
+ :offidx => 0,
231
+ :addr => 0,
232
+ :nargc => 0,
233
+ :func => 6,
234
+ :xargc => 0
235
+ },
236
+ ]
237
+ f.sections << s
238
+
239
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRARGS, 2)
240
+ s.data = [ 0 ]
241
+ f.sections << s
242
+
243
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROFFS, 3)
244
+ s.data = [ 36 ]
245
+ f.sections << s
246
+
247
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRENOFFS, 4)
248
+ s.data = [ 44 ]
249
+ f.sections << s
250
+
251
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROVIDER, 5)
252
+ s.data = {
253
+ :name => 11,
254
+ :strtab => 0,
255
+ :probes => 1,
256
+ :prargs => 2,
257
+ :proffs => 3,
258
+ :prenoffs => 4,
259
+ :provattr => { :name => 5, :data => 5, :class => 5 },
260
+ :modattr => { :name => 1, :data => 1, :class => 5 },
261
+ :funcattr => { :name => 1, :data => 1, :class => 5 },
262
+ :nameattr => { :name => 5, :data => 5, :class => 5 },
263
+ :argsattr => { :name => 5, :data => 5, :class => 5 }
264
+ }
265
+ f.sections << s
266
+
267
+ f.generate
268
+ Dtrace::Dof.loaddof(f, 'testmodule')
269
+
270
+ t = Dtrace.new
271
+ matches = 0
272
+ t.each_probe do |p|
273
+ if p.to_s == "test4#{$$}:testmodule:main:test"
274
+ matches += 1
275
+ end
276
+ end
277
+ assert_equal 1, matches
278
+
279
+ end
280
+
281
+ end
282
+
@@ -0,0 +1,92 @@
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 TestDofStrtabs < Test::Unit::TestCase
11
+ include Dtrace::Dof::Constants
12
+
13
+ def test_strtab_stridxs
14
+ sec = Dtrace::Dof::Section::Strtab.new(1)
15
+ assert sec
16
+
17
+ assert_equal 1, sec.add('foo')
18
+ assert_equal 5, sec.add('bar')
19
+ assert_equal 9, sec.add('baz')
20
+ end
21
+
22
+ def test_strtab_dof
23
+ f = Dtrace::Dof::File.new
24
+
25
+ strtab = Dtrace::Dof::Section::Strtab.new(0)
26
+ f.sections << strtab
27
+
28
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROBES, 1)
29
+ s.data = [
30
+ {
31
+ :name => strtab.add('test'),
32
+ :func => strtab.add('main'),
33
+ :noffs => 1,
34
+ :enoffidx => 0,
35
+ :argidx => 0,
36
+ :nenoffs => 0,
37
+ :offidx => 0,
38
+ :addr => 0,
39
+ :nargc => 0,
40
+ :xargc => 0
41
+ },
42
+ ]
43
+ f.sections << s
44
+
45
+ s = Dtrace::Dof::Section.new(DOF_SECT_PRARGS, 2)
46
+ s.data = [ 0 ]
47
+ f.sections << s
48
+
49
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROFFS, 3)
50
+ s.data = [ 36 ]
51
+ f.sections << s
52
+
53
+ s = Dtrace::Dof::Section.new(DOF_SECT_PROVIDER, 4)
54
+ s.data = {
55
+ :strtab => 0,
56
+ :probes => 1,
57
+ :prargs => 2,
58
+ :proffs => 3,
59
+ :name => strtab.add('test'),
60
+ :provattr => {
61
+ :name => DTRACE_STABILITY_EVOLVING,
62
+ :data => DTRACE_STABILITY_EVOLVING,
63
+ :class => DTRACE_STABILITY_EVOLVING
64
+ },
65
+ :modattr => {
66
+ :name => DTRACE_STABILITY_PRIVATE,
67
+ :data => DTRACE_STABILITY_PRIVATE,
68
+ :class => DTRACE_STABILITY_EVOLVING
69
+ },
70
+ :funcattr => {
71
+ :name => DTRACE_STABILITY_PRIVATE,
72
+ :data => DTRACE_STABILITY_PRIVATE,
73
+ :class => DTRACE_STABILITY_EVOLVING
74
+ },
75
+ :nameattr => {
76
+ :name => DTRACE_STABILITY_EVOLVING,
77
+ :data => DTRACE_STABILITY_EVOLVING,
78
+ :class => DTRACE_STABILITY_EVOLVING
79
+ },
80
+ :argsattr => {
81
+ :name => DTRACE_STABILITY_EVOLVING,
82
+ :data => DTRACE_STABILITY_EVOLVING,
83
+ :class => DTRACE_STABILITY_EVOLVING
84
+ },
85
+ }
86
+ f.sections << s
87
+
88
+ f.generate
89
+ Dtrace::Dof.loaddof(f, 'testmodule')
90
+ end
91
+
92
+ end
@@ -0,0 +1,111 @@
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 the Dtrace handle class
10
+
11
+ class TestDtrace < Test::Unit::TestCase
12
+ def test_dtrace
13
+ t = Dtrace.new
14
+ assert_equal Object, Dtrace.superclass
15
+ assert_equal Dtrace, t.class
16
+ end
17
+
18
+ def test_list_probes
19
+ t = Dtrace.new
20
+ probe_count = 0
21
+ t.each_probe do |probe|
22
+ assert probe.provider
23
+ assert probe.mod
24
+ assert probe.func
25
+ assert probe.name
26
+ probe_count += 1
27
+ end
28
+ assert probe_count
29
+ end
30
+
31
+ def test_compile
32
+ t = Dtrace.new
33
+
34
+ progtext = "syscall:::entry
35
+ {
36
+ @calls[execname] = count();
37
+ @fcalls[probefunc] = count();
38
+ }"
39
+
40
+ prog = t.compile progtext
41
+ assert prog
42
+ prog.execute
43
+
44
+ info = prog.info
45
+ assert info
46
+ assert info.aggregates_count
47
+ assert_equal 0, info.speculations_count
48
+ assert info.recgens_count
49
+ assert info.matches_count
50
+ end
51
+
52
+ def test_compile_with_args
53
+ t = Dtrace.new
54
+
55
+ progtext = "syscall:::entry
56
+ /pid == $1/
57
+ {
58
+ @calls[execname] = count();
59
+ @fcalls[probefunc] = count();
60
+ }"
61
+
62
+ prog = t.compile(progtext, $$.to_s)
63
+ assert prog
64
+ prog.execute
65
+
66
+ info = prog.info
67
+ assert info
68
+ assert_equal 2, info.aggregates_count
69
+ assert_equal 0, info.speculations_count
70
+ assert_equal 4, info.recgens_count
71
+
72
+ # matches_count is platform dependent
73
+ assert info.matches_count
74
+ end
75
+
76
+ def test_run
77
+ t = Dtrace.new
78
+
79
+ t.setopt("aggsize", "4m")
80
+ t.setopt("bufsize", "4m")
81
+
82
+ progtext = "syscall:::entry
83
+ {
84
+ @calls[execname] = count();
85
+ @fcalls[probefunc] = count();
86
+ }"
87
+
88
+ prog = t.compile progtext
89
+ assert prog
90
+ prog.execute
91
+ assert_equal 0, t.status # none
92
+
93
+ t.go
94
+
95
+ assert_equal 1, t.status # ok
96
+ sleep 1
97
+ assert_equal 1, t.status # ok
98
+ t.stop
99
+ assert_equal 4, t.status # stopped
100
+ end
101
+
102
+ def test_bad_program
103
+ t = Dtrace.new
104
+ progtext = "blah blahb albhacasfas"
105
+ e = assert_raise Dtrace::Exception do
106
+ prog = t.compile progtext
107
+ end
108
+ assert_equal "probe description :::blah does not match any probes", e.message
109
+ end
110
+
111
+ end
@@ -0,0 +1,56 @@
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 TestDtraceAggregates < Test::Unit::TestCase
12
+ def test_aggregate_group
13
+ t = Dtrace.new
14
+ t.setopt("bufsize", "4m")
15
+ t.setopt("aggsize", "4m")
16
+
17
+ progtext =<<EOD
18
+ profile-1000
19
+ {
20
+ @a[execname] = count();
21
+ @b[execname] = count();
22
+ }
23
+
24
+ profile-1
25
+ {
26
+ printa(@a);
27
+ printa(@b);
28
+ }
29
+ EOD
30
+
31
+ prog = t.compile progtext
32
+ prog.execute
33
+ t.go
34
+
35
+ sleep 3
36
+
37
+ c = Dtrace::Consumer.new(t)
38
+ assert c
39
+
40
+ data = []
41
+ c.consume_once do |d|
42
+ data << d
43
+ end
44
+
45
+ assert data.length > 0
46
+ data.each do |d|
47
+ assert d
48
+ assert_equal Dtrace::Data, d.class
49
+ d.data.each do |agg|
50
+ assert_equal Dtrace::AggregateSet, agg.class
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,183 @@
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 the DropData record.
10
+
11
+ class TestDtraceDropsErrors < Test::Unit::TestCase
12
+
13
+ def test_drops
14
+ t = Dtrace.new
15
+ t.setopt("bufsize", "512")
16
+ t.setopt("strsize", "1024")
17
+
18
+ # drp.DTRACEDROP_PRINCIPAL.d
19
+ progtext = <<EOD
20
+ BEGIN
21
+ {
22
+ trace("Harding");
23
+ trace("Hoover");
24
+ trace("Nixon");
25
+ trace("Bush");
26
+ }
27
+
28
+ BEGIN
29
+ {
30
+ exit(0);
31
+ }
32
+ EOD
33
+
34
+ prog = t.compile progtext
35
+ prog.execute
36
+
37
+ c = Dtrace::Consumer.new(t)
38
+ assert c
39
+
40
+ i = 0
41
+ c.drophandler do |d|
42
+ assert_match(/1 drop on CPU [0-9]+/, d.msg)
43
+ assert_equal "drop to principal buffer", d.kind
44
+ assert_not_nil d.cpu
45
+ assert_equal 1, d.drops
46
+ assert_not_nil d.total
47
+ i = 1
48
+ end
49
+
50
+ t.go
51
+ c.consume do |d|
52
+ end
53
+
54
+ assert_equal 1, i
55
+ end
56
+
57
+ def test_error_handler_too_late
58
+ t = Dtrace.new
59
+ t.setopt("bufsize", "512")
60
+ t.setopt("strsize", "1024")
61
+
62
+ progtext = <<EOD
63
+ BEGIN
64
+ {
65
+ *(char *)NULL;
66
+ }
67
+ EOD
68
+
69
+ prog = t.compile progtext
70
+ prog.execute
71
+ t.go
72
+
73
+ c = Dtrace::Consumer.new(t)
74
+ assert c
75
+
76
+ # since we've already said "go", we now can't apply an error
77
+ # handler (DTrace will let us, but won't call it).
78
+ assert_raise(Dtrace::Exception) do
79
+ c.errhandler do |d|
80
+ # nothing
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+ def test_errors
87
+ t = Dtrace.new
88
+ t.setopt("bufsize", "512")
89
+ t.setopt("strsize", "1024")
90
+
91
+ progtext = <<EOD
92
+ BEGIN
93
+ {
94
+ *(char *)NULL;
95
+ }
96
+ EOD
97
+
98
+ prog = t.compile progtext
99
+ prog.execute
100
+
101
+ c = Dtrace::Consumer.new(t)
102
+ assert c
103
+
104
+ i = 0
105
+ c.errhandler do |d|
106
+ assert_match(/error on enabled probe ID [0-9]+ \(ID [0-9]+: dtrace:::BEGIN\): invalid address \(0x0\) in action #1 at DIF offset 16/, d.msg)
107
+ assert_not_nil d.cpu
108
+ assert d.action
109
+ assert d.offset
110
+ assert d.fault
111
+ assert_not_nil d.addr
112
+ i = 1
113
+ end
114
+
115
+ t.go
116
+ c.consume_once do |d|
117
+ end
118
+
119
+ assert_equal 1, i
120
+ end
121
+
122
+ def test_error_and_drop_handler
123
+
124
+ t = Dtrace.new
125
+ t.setopt("bufsize", "512")
126
+ t.setopt("strsize", "1024")
127
+
128
+ progtext = <<EOD
129
+ BEGIN
130
+ {
131
+ trace("Harding");
132
+ trace("Hoover");
133
+ trace("Nixon");
134
+ trace("Bush");
135
+ }
136
+
137
+ BEGIN
138
+ {
139
+ *(char *)NULL;
140
+ }
141
+
142
+ ERROR
143
+ {
144
+ exit(0);
145
+ }
146
+ EOD
147
+
148
+ prog = t.compile progtext
149
+ prog.execute
150
+
151
+ c = Dtrace::Consumer.new(t)
152
+ assert c
153
+
154
+ errors = 0
155
+ c.errhandler do |d|
156
+ assert_match(/error on enabled probe ID [0-9]+ \(ID [0-9]+: dtrace:::BEGIN\): invalid address \(0x0\) in action #1 at DIF offset 16/, d.msg)
157
+ assert_not_nil d.cpu
158
+ assert d.action
159
+ assert d.offset
160
+ assert d.fault
161
+ assert_not_nil d.addr
162
+ errors = 1
163
+ end
164
+
165
+ drops = 0
166
+ c.drophandler do |d|
167
+ assert_match(/1 drop on CPU [0-9]+/, d.msg)
168
+ assert_equal "drop to principal buffer", d.kind
169
+ assert_not_nil d.cpu
170
+ assert_equal 1, d.drops
171
+ assert_not_nil d.total
172
+ drops = 1
173
+ end
174
+
175
+ t.go
176
+ c.consume do |d|
177
+ end
178
+
179
+ assert_equal 1, errors
180
+ assert_equal 1, drops
181
+ end
182
+
183
+ end