DTrace provider for the Next Scripting Language

This is an implementation of a DTrace provider for the Next Scripting
Language (nsf). The nsf provider is designed to be used with and
without the DTrace support for Tcl. Therefore, nsf can be configured
with --with-dtrace also in cases where Tcl was compiled without it.

To enable DTrace, run configure with the flag --enable-dtrace. The
DTrace support for nsf was developed under Mac OS X, other platforms
might require some fine tuning to get it running. Please report
improvements back to the nsf developers.

Once DTrace support is compiled into nsf, one can run D scripts like
in the following example:

   sudo dtrace -q -F -s dtrace/timestamps.d -c "./nxsh tests/object-system.test"

DTrace requires normally that dtrace is run with root permissions. In
case the provided sample scrips in the dtrace directory don't work the
following hints might help:

* Make sure that a "package require nx" works for root as well
  (install nx, or provide a TCLLIBPATH, etc.).  You might want
  to add e.g. the following line 
      set auto_path [concat . $auto_path]
  to the begin of the nxsh script, or add the path to the dtrace invocation
  (see below)

* If dtrace compliation fails (e.g. "... nsf*:::method-entry does not
  match any probes"), start an nxsh in a different window to make the
  nsf provider and the probes known to the kernel.

-gustaf neumann

Examples

% sudo TCLLIBPATH=. dtrace -arch x86_64 -x bufsize=20m -F -s dtrace/execution-flow.d -c "./nxsh dtrace/sample.tcl"

dtrace: script 'dtrace/execution-flow.d' matched 8 probes
dtrace: pid 65393 has exited
CPU FUNCTION                                 
  0  -> MethodDispatchCsc                     ::nx::Object ::nx::Class.create (2)
  0    -> MethodDispatchCsc                   ::o ::nx::Object.public (4)
  0      -> MethodDispatchCsc                 ::o ::nx::Object.method (3)
  0        -> MethodDispatchCsc               ::o ::nx::Object.__resolve_method_path (2)
  0        <- ObjectDispatch                  ::o ::nx::Object.__resolve_method_path -> 0
  0        -> MethodDispatchCsc               ::o ::nx::Object.__default_method_call_protection (0)
  0        <- ObjectDispatch                  ::o ::nx::Object.__default_method_call_protection -> 0
  0      <- ObjectDispatch                    ::o ::nx::Object.method -> 0
  0    <- ObjectDispatch                      ::o ::nx::Object.public -> 0
  0    -> MethodDispatchCsc                   ::o ::nx::Object.init (0)
  0    <- ObjectDispatch                      ::o ::nx::Object.init -> 0
  0  <- ObjectDispatch                        ::nx::Object ::nx::Class.create -> 0
  0  -> MethodDispatchCsc                     ::o ::o.foo (2)
  0    -> MethodDispatchCsc                   ::o ::o.::incr (2)
  0    <- ObjectDispatch                      ::o ::o.::incr -> 0
  0  <- ObjectDispatch                        ::o ::o.foo -> 0

% sudo TCLLIBPATH=. dtrace -arch x86_64 -x bufsize=20m -F -s dtrace/execution-flow-args.d -c "./nxsh dtrace/sample.tcl" 
dtrace: script 'dtrace/execution-flow-args.d' matched 8 probes
dtrace: pid 65419 has exited

CPU FUNCTION                                 
  1  -> MethodDispatchCsc                     ::nx::Object ::nx::Class.create (2) o 
  :public method foo {x y} {
    [self] ::incr x 
  1    -> MethodDispatchCsc                   ::o ::nx::Object.public (4) method foo
  1      -> MethodDispatchCsc                 ::o ::nx::Object.method (3) foo x y
  1        -> MethodDispatchCsc               ::o ::nx::Object.__resolve_method_path (2) -per-object foo
  1        <- ObjectDispatch                  ::o ::nx::Object.__resolve_method_path -> 0
  1        -> MethodDispatchCsc               ::o ::nx::Object.__default_method_call_protection (0)  
  1        <- ObjectDispatch                  ::o ::nx::Object.__default_method_call_protection -> 0
  1      <- ObjectDispatch                    ::o ::nx::Object.method -> 0
  1    <- ObjectDispatch                      ::o ::nx::Object.public -> 0
  1    -> MethodDispatchCsc                   ::o ::nx::Object.init (0)  
  1    <- ObjectDispatch                      ::o ::nx::Object.init -> 0
  1  <- ObjectDispatch                        ::nx::Object ::nx::Class.create -> 0
  1  -> MethodDispatchCsc                     ::o ::o.foo (2) 1 2
  1    -> MethodDispatchCsc                   ::o ::o.::incr (2) x 1
  1    <- ObjectDispatch                      ::o ::o.::incr -> 0
  1  <- ObjectDispatch                        ::o ::o.foo -> 0


% sudo TCLLIBPATH=. dtrace F -s dtrace/timestamps.d -c "./nxsh tests/object-system.test"
CPU FUNCTION                                 
  0 | :END                                    
::C            ::C                 class                  = 4249
::M            ::M                 class                  = 4347
::o            ::o                 class                  = 4435
::m2           ::m2                class                  = 4444
::M2           ::M2                class                  = 4462
::C0           ::C0                class                  = 4501
::c1           ::c1                class                  = 4611
....

% sudo TCLLIBPATH=. dtrace -F -s dtrace/timestamps-q.d -c "./nxsh tests/object-system.test"
....
  ::nx::Object                                        info                                              
           value  ------------- Distribution ------------- count    
            4096 |                                         0        
            8192 |@@@@@@@@@@@@@@@@@@@@@@@@@                16       
           16384 |@@@@@@@@@@@@@@@                          10       
           32768 |                                         0        

  ::nx::Object                                        objectparameter                                   
           value  ------------- Distribution ------------- count    
           32768 |                                         0        
           65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@         4        
          131072 |@@@@@@@@                                 1        
          262144 |                                         0