This program actually works under the 0.1 version of the binding.
package require dtrace
# Display instructions {{{
puts {Please input probes in the standard one-liner format:}
puts {[[[provider:] module:] function:] name [[predicate] action]}
puts {Empty probe (just enter) ends the input,}
# }}}
# Get sources {{{
set probes_sources [list]
set probes_count 1
puts "probe $probes_count:"
gets stdin probe_line
while {$probe_line != ""} {
set probes_sources [linsert $probes_sources end $probe_line]
set probes_count [expr {$probes_count + 1}]
puts "probe $probes_count:"
gets stdin probe_line
}
set probes_count [expr {$probes_count - 1}]
# }}}
# Get them compiled and executed {{{
set dhandle [dtrace open -foldpdesc 1]
set OK_count 0
set i 1
set compiled_probes [list]
foreach probe_line $probes_sources {
if { [ catch {
puts -nonewline "Processing probe $i: $probe_line "
set i [expr {$i + 1}]
puts -nonewline .
set compiled [dtrace compile $dhandle $probe_line]
puts -nonewline .
set running [dtrace exec $compiled]
puts -nonewline .
set OK_count [expr {$OK_count + 1}]
puts -nonewline " OK"
} ] } { puts -nonewline "FAILED"}
puts {}
}
if {$OK_count == 0} {
puts "No probes run - exiting."
dtrace close $dhandle
exit
}
# }}}
# Simple to show the output {{{
puts "CPU\tProbe"
proc callback {probe cpu id args} {
puts "$cpu\t$probe"
}
# }}}
# Go go go! {{{
dtrace go $dhandle probe_desc {callback {}}
set counter 10
while {$counter} {
dtrace process $dhandle 1
set counter [expr {$counter - 1}]
}
dtrace stop $dhandle
dtrace close $dhandle
# }}}
