aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge V. Neville-Neil <gnn@FreeBSD.org>2012-05-12 20:38:18 +0000
committerGeorge V. Neville-Neil <gnn@FreeBSD.org>2012-05-12 20:38:18 +0000
commit055173dba4a263acf10325a49eebf82915369ed2 (patch)
treeaec2772e8855e6dbaea6d8136ed0c47bcb825dee
parent87c8f7aa3a46118212b99f0d58b18aa93c06b02a (diff)
downloadsrc-vendor/dtracetoolkit.tar.gz
src-vendor/dtracetoolkit.zip
Add the remaining scripts from the DTraceToolkit, version 0.99, to thevendor/dtracetoolkit/dtracetoolkit-20120512vendor/dtracetoolkit
Notes
Notes: svn path=/vendor/dtracetoolkit/dist/; revision=235368 svn path=/vendor/dtracetoolkit/dtracetoolkit-20120512/; revision=235374; tag=vendor/dtracetoolkit/dtracetoolkit-20120512
-rw-r--r--Apps/Readme5
-rwxr-xr-xApps/httpdstat.d132
-rwxr-xr-xApps/nfswizard.d102
-rwxr-xr-xApps/shellsnoop268
-rwxr-xr-xApps/weblatency.d186
l---------Bin/anonpgpid.d1
l---------Bin/bitesize.d1
l---------Bin/connections1
l---------Bin/cpudists1
l---------Bin/cputimes1
l---------Bin/cputypes.d1
l---------Bin/cpuwalk.d1
l---------Bin/crash.d1
l---------Bin/creatbyproc.d1
l---------Bin/cswstat.d1
l---------Bin/dappprof1
l---------Bin/dapptrace1
l---------Bin/dexplorer1
l---------Bin/diskhits1
l---------Bin/dispqlen.d1
l---------Bin/dnlcps.d1
l---------Bin/dnlcsnoop.d1
l---------Bin/dnlcstat1
l---------Bin/dtruss1
l---------Bin/dvmstat1
l---------Bin/errinfo1
l---------Bin/execsnoop1
l---------Bin/fddist1
l---------Bin/filebyproc.d1
l---------Bin/fspaging.d1
l---------Bin/fsrw.d1
l---------Bin/guess.d1
l---------Bin/hotkernel1
l---------Bin/hotspot.d1
l---------Bin/hotuser1
l---------Bin/httpdstat.d1
l---------Bin/icmpstat.d1
l---------Bin/intbycpu.d1
l---------Bin/intoncpu.d1
l---------Bin/inttimes.d1
l---------Bin/iofile.d1
l---------Bin/iofileb.d1
l---------Bin/iopattern1
l---------Bin/iopending1
l---------Bin/iosnoop1
l---------Bin/iotop1
l---------Bin/j_calldist.d1
l---------Bin/j_calls.d1
l---------Bin/j_calltime.d1
l---------Bin/j_classflow.d1
l---------Bin/j_cpudist.d1
l---------Bin/j_cputime.d1
l---------Bin/j_events.d1
l---------Bin/j_flow.d1
l---------Bin/j_flowtime.d1
l---------Bin/j_methodcalls.d1
l---------Bin/j_objnew.d1
l---------Bin/j_package.d1
l---------Bin/j_profile.d1
l---------Bin/j_stat.d1
l---------Bin/j_syscalls.d1
l---------Bin/j_syscolors.d1
l---------Bin/j_thread.d1
l---------Bin/j_who.d1
l---------Bin/js_calldist.d1
l---------Bin/js_calls.d1
l---------Bin/js_calltime.d1
l---------Bin/js_cpudist.d1
l---------Bin/js_cputime.d1
l---------Bin/js_execs.d1
l---------Bin/js_flow.d1
l---------Bin/js_flowinfo.d1
l---------Bin/js_flowtime.d1
l---------Bin/js_objcpu.d1
l---------Bin/js_objgc.d1
l---------Bin/js_objnew.d1
l---------Bin/js_stat.d1
l---------Bin/js_who.d1
l---------Bin/kill.d1
l---------Bin/kstat_types.d1
l---------Bin/lastwords1
l---------Bin/loads.d1
l---------Bin/lockbydist.d1
l---------Bin/lockbyproc.d1
l---------Bin/minfbypid.d1
l---------Bin/minfbyproc.d1
l---------Bin/mmapfiles.d1
l---------Bin/modcalls.d1
l---------Bin/newproc.d1
l---------Bin/nfswizard.d1
l---------Bin/opensnoop1
l---------Bin/pathopens.d1
l---------Bin/pfilestat1
l---------Bin/pgpginbypid.d1
l---------Bin/pgpginbyproc.d1
l---------Bin/php_calldist.d1
l---------Bin/php_calltime.d1
l---------Bin/php_cpudist.d1
l---------Bin/php_cputime.d1
l---------Bin/php_flow.d1
l---------Bin/php_flowinfo.d1
l---------Bin/php_flowtime.d1
l---------Bin/php_funccalls.d1
l---------Bin/php_malloc.d1
l---------Bin/php_syscalls.d1
l---------Bin/php_syscolors.d1
l---------Bin/php_who.d1
l---------Bin/pidpersec.d1
l---------Bin/pl_calldist.d1
l---------Bin/pl_calltime.d1
l---------Bin/pl_cpudist.d1
l---------Bin/pl_cputime.d1
l---------Bin/pl_flow.d1
l---------Bin/pl_flowinfo.d1
l---------Bin/pl_flowtime.d1
l---------Bin/pl_malloc.d1
l---------Bin/pl_subcalls.d1
l---------Bin/pl_syscalls.d1
l---------Bin/pl_syscolors.d1
l---------Bin/pl_who.d1
l---------Bin/priclass.d1
l---------Bin/pridist.d1
l---------Bin/procsystime1
l---------Bin/putnexts.d1
l---------Bin/py_calldist.d1
l---------Bin/py_calltime.d1
l---------Bin/py_cpudist.d1
l---------Bin/py_cputime.d1
l---------Bin/py_flow.d1
l---------Bin/py_flowinfo.d1
l---------Bin/py_flowtime.d1
l---------Bin/py_funccalls.d1
l---------Bin/py_malloc.d1
l---------Bin/py_mallocstk.d1
l---------Bin/py_profile.d1
l---------Bin/py_syscalls.d1
l---------Bin/py_syscolors.d1
l---------Bin/py_who.d1
l---------Bin/rb_calldist.d1
l---------Bin/rb_calls.d1
l---------Bin/rb_calltime.d1
l---------Bin/rb_cpudist.d1
l---------Bin/rb_cputime.d1
l---------Bin/rb_flow.d1
l---------Bin/rb_flowinfo.d1
l---------Bin/rb_flowtime.d1
l---------Bin/rb_funccalls.d1
l---------Bin/rb_lines.d1
l---------Bin/rb_malloc.d1
l---------Bin/rb_objcpu.d1
l---------Bin/rb_objnew.d1
l---------Bin/rb_stat.d1
l---------Bin/rb_syscalls.d1
l---------Bin/rb_syscolors.d1
l---------Bin/rb_who.d1
l---------Bin/readbytes.d1
l---------Bin/readdist.d1
l---------Bin/rfileio.d1
l---------Bin/rfsio.d1
l---------Bin/runocc.d1
l---------Bin/rwbbypid.d1
l---------Bin/rwbypid.d1
l---------Bin/rwbytype.d1
l---------Bin/rwsnoop1
l---------Bin/rwtop1
l---------Bin/sampleproc1
l---------Bin/sar-c.d1
l---------Bin/seeksize.d1
l---------Bin/setuids.d1
l---------Bin/sh_calldist.d1
l---------Bin/sh_calls.d1
l---------Bin/sh_calltime.d1
l---------Bin/sh_cpudist.d1
l---------Bin/sh_cputime.d1
l---------Bin/sh_flow.d1
l---------Bin/sh_flowinfo.d1
l---------Bin/sh_flowtime.d1
l---------Bin/sh_lines.d1
l---------Bin/sh_pidcolors.d1
l---------Bin/sh_stat.d1
l---------Bin/sh_syscalls.d1
l---------Bin/sh_syscolors.d1
l---------Bin/sh_wasted.d1
l---------Bin/sh_who.d1
l---------Bin/shellsnoop1
l---------Bin/shortlived.d1
l---------Bin/sigdist.d1
l---------Bin/stacksize.d1
l---------Bin/statsnoop1
l---------Bin/swapinfo.d1
l---------Bin/sysbypid.d1
l---------Bin/syscallbypid.d1
l---------Bin/syscallbyproc.d1
l---------Bin/syscallbysysc.d1
l---------Bin/tcl_calldist.d1
l---------Bin/tcl_calls.d1
l---------Bin/tcl_calltime.d1
l---------Bin/tcl_cpudist.d1
l---------Bin/tcl_cputime.d1
l---------Bin/tcl_flow.d1
l---------Bin/tcl_flowtime.d1
l---------Bin/tcl_ins.d1
l---------Bin/tcl_insflow.d1
l---------Bin/tcl_proccalls.d1
l---------Bin/tcl_procflow.d1
l---------Bin/tcl_stat.d1
l---------Bin/tcl_syscalls.d1
l---------Bin/tcl_syscolors.d1
l---------Bin/tcl_who.d1
l---------Bin/tcpsnoop1
l---------Bin/tcpsnoop.d1
l---------Bin/tcpsnoop_snv1
l---------Bin/tcpsnoop_snv.d1
l---------Bin/tcpstat.d1
l---------Bin/tcptop1
l---------Bin/tcptop_snv1
l---------Bin/tcpwdist.d1
l---------Bin/threaded.d1
l---------Bin/topsyscall1
l---------Bin/topsysproc1
l---------Bin/udpstat.d1
l---------Bin/uname-a.d1
l---------Bin/vmbypid.d1
l---------Bin/vmstat-p.d1
l---------Bin/vmstat.d1
l---------Bin/vopstat1
l---------Bin/weblatency.d1
l---------Bin/whatexec.d1
l---------Bin/woof.d1
l---------Bin/wpm.d1
l---------Bin/writebytes.d1
l---------Bin/writedist.d1
l---------Bin/xcallsbypid.d1
l---------Bin/xvmstat1
l---------Bin/zvmstat1
-rw-r--r--Code/Java/Func_abc.java26
-rw-r--r--Code/Java/Func_loop.java19
-rw-r--r--Code/JavaScript/func_clock.html39
-rw-r--r--Code/JavaScript/func_slow.html31
-rwxr-xr-xCode/Perl/func_abc.pl20
-rwxr-xr-xCode/Perl/func_malloc.pl18
-rwxr-xr-xCode/Perl/func_slow.pl20
-rwxr-xr-xCode/Perl/hello.pl3
-rwxr-xr-xCode/Perl/hello_strict.pl5
-rw-r--r--Code/Php/func_abc.php23
-rwxr-xr-xCode/Python/func_abc.py19
-rwxr-xr-xCode/Python/func_slow.py26
-rw-r--r--Code/Readme16
-rwxr-xr-xCode/Ruby/func_abc.rb20
-rwxr-xr-xCode/Ruby/func_slow.rb32
-rwxr-xr-xCode/Shell/func_abc.sh23
-rwxr-xr-xCode/Shell/func_slow.sh35
-rwxr-xr-xCode/Shell/func_waste.sh23
-rw-r--r--Code/Tcl/func_abc.tcl20
-rw-r--r--Code/Tcl/func_slow.tcl29
-rw-r--r--Cpu/Readme3
-rwxr-xr-xCpu/cputypes.d66
-rwxr-xr-xCpu/cpuwalk.d72
-rwxr-xr-xCpu/dispqlen.d52
-rwxr-xr-xCpu/intbycpu.d49
-rwxr-xr-xCpu/intoncpu.d66
-rwxr-xr-xCpu/inttimes.d73
-rwxr-xr-xCpu/loads.d58
-rwxr-xr-xCpu/runocc.d56
-rwxr-xr-xCpu/xcallsbypid.d51
-rw-r--r--Disk/Readme3
-rwxr-xr-xDisk/bitesize.d81
-rwxr-xr-xDisk/diskhits113
-rwxr-xr-xDisk/hotspot.d71
-rwxr-xr-xDisk/iofile.d79
-rwxr-xr-xDisk/iofileb.d59
-rwxr-xr-xDisk/iopending261
-rwxr-xr-xDisk/seeksize.d85
-rw-r--r--Docs/Contents152
l---------Docs/Examples1
-rw-r--r--Docs/Faq126
-rw-r--r--Docs/History249
l---------Docs/Index1
-rw-r--r--Docs/Links30
-rw-r--r--Docs/Maintainer6
l---------Docs/Notes1
-rw-r--r--Docs/Readme21
-rw-r--r--Docs/ToDo7
-rw-r--r--Docs/Who74
-rw-r--r--Docs/cddl1.txt385
-rw-r--r--Docs/oneliners.txt81
-rw-r--r--Examples/Copyright1
-rw-r--r--Examples/Readme21
-rw-r--r--Examples/anonpgpid_example.txt73
-rw-r--r--Examples/bitesize_example.txt74
-rw-r--r--Examples/connections_example.txt23
-rw-r--r--Examples/cpudists_example.txt276
-rw-r--r--Examples/cputimes_example.txt210
-rw-r--r--Examples/cputypes_example.txt40
-rw-r--r--Examples/cpuwalk_example.txt85
-rw-r--r--Examples/crash_example.txt68
-rw-r--r--Examples/creatbyproc_example.txt23
-rw-r--r--Examples/cswstat_example.txt25
-rw-r--r--Examples/dappprof_example.txt71
-rw-r--r--Examples/dapptrace_example.txt215
-rw-r--r--Examples/dexplorer_example.txt95
-rw-r--r--Examples/diskhits_example.txt107
-rw-r--r--Examples/dispqlen_example.txt62
-rw-r--r--Examples/dnlcps_example.txt47
-rw-r--r--Examples/dnlcsnoop_example.txt88
-rw-r--r--Examples/dnlcstat_example.txt40
-rw-r--r--Examples/dtruss_example.txt120
-rw-r--r--Examples/dvmstat_example.txt91
-rw-r--r--Examples/errinfo_example.txt90
-rw-r--r--Examples/execsnoop_example.txt78
-rw-r--r--Examples/fddist_example.txt38
-rw-r--r--Examples/filebyproc_example.txt27
-rw-r--r--Examples/fspaging_example.txt32
-rw-r--r--Examples/fsrw_example.txt129
-rw-r--r--Examples/guess_example.txt39
-rw-r--r--Examples/hotkernel_example.txt153
-rw-r--r--Examples/hotspot_example.txt34
-rw-r--r--Examples/hotuser_example.txt107
-rw-r--r--Examples/httpdstat_example.txt36
-rw-r--r--Examples/icmpstat_example.txt29
-rw-r--r--Examples/intbycpu_example.txt11
-rw-r--r--Examples/intoncpu_example.txt93
-rw-r--r--Examples/inttimes_example.txt18
-rw-r--r--Examples/iofile_example.txt35
-rw-r--r--Examples/iofileb_example.txt23
-rw-r--r--Examples/iopattern_example.txt57
-rw-r--r--Examples/iopending_example.txt126
-rw-r--r--Examples/iosnoop_example.txt39
-rw-r--r--Examples/iotop_example.txt142
-rw-r--r--Examples/j_calldist_example.txt247
-rw-r--r--Examples/j_calls_example.txt137
-rw-r--r--Examples/j_calltime_example.txt67
-rw-r--r--Examples/j_classflow_example.txt89
-rw-r--r--Examples/j_cpudist_example.txt252
-rw-r--r--Examples/j_cputime_example.txt75
-rw-r--r--Examples/j_events_example.txt134
-rw-r--r--Examples/j_flow_example.txt1292
-rw-r--r--Examples/j_flowtime_example.txt1287
-rw-r--r--Examples/j_methodcalls_example.txt999
-rw-r--r--Examples/j_objnew_example.txt1460
-rw-r--r--Examples/j_package_example.txt44
-rw-r--r--Examples/j_profile_example.txt209
-rw-r--r--Examples/j_stat_example.txt33
-rw-r--r--Examples/j_syscalls_example.txt165
-rw-r--r--Examples/j_syscolors_example.txt1550
-rw-r--r--Examples/j_thread_example.txt20
-rw-r--r--Examples/j_who_example.txt17
-rw-r--r--Examples/js_calldist_example.txt110
-rw-r--r--Examples/js_calls_example.txt312
-rw-r--r--Examples/js_calltime_example.txt60
-rw-r--r--Examples/js_cpudist_example.txt112
-rw-r--r--Examples/js_cputime_example.txt69
-rw-r--r--Examples/js_execs_example.txt15
-rw-r--r--Examples/js_flow_example.txt41
-rw-r--r--Examples/js_flowinfo_example.txt42
-rw-r--r--Examples/js_flowtime_example.txt42
-rw-r--r--Examples/js_objcpu_example.txt317
-rw-r--r--Examples/js_objgc_example.txt230
-rw-r--r--Examples/js_objnew_example.txt100
-rw-r--r--Examples/js_stat_example.txt35
-rw-r--r--Examples/js_who_example.txt59
-rw-r--r--Examples/kill_example.txt12
-rw-r--r--Examples/kstat_types_example.txt1358
-rw-r--r--Examples/lastwords_example.txt81
-rw-r--r--Examples/loads_example.txt19
-rw-r--r--Examples/lockbydist_example.txt114
-rw-r--r--Examples/lockbyproc_example.txt42
-rw-r--r--Examples/minfbypid_example.txt20
-rw-r--r--Examples/minfbyproc_example.txt14
-rw-r--r--Examples/mmapfiles_example.txt109
-rw-r--r--Examples/modcalls_example.txt47
-rw-r--r--Examples/newproc_example.txt19
-rw-r--r--Examples/nfswizard_example.txt67
-rw-r--r--Examples/oneliners_examples.txt307
-rw-r--r--Examples/opensnoop_example.txt110
-rw-r--r--Examples/pathopens_example.txt32
-rw-r--r--Examples/pfilestat_example.txt200
-rw-r--r--Examples/pgpginbypid_example.txt14
-rw-r--r--Examples/pgpginbyproc_example.txt13
-rw-r--r--Examples/php_calldist_example.txt84
-rw-r--r--Examples/php_calltime_example.txt51
-rw-r--r--Examples/php_cpudist_example.txt84
-rw-r--r--Examples/php_cputime_example.txt58
-rw-r--r--Examples/php_flow_example.txt36
-rw-r--r--Examples/php_flowinfo_example.txt40
-rw-r--r--Examples/php_flowtime_example.txt41
-rw-r--r--Examples/php_funccalls_example.txt17
-rw-r--r--Examples/php_malloc_example.txt23
-rw-r--r--Examples/php_syscalls_example.txt22
-rw-r--r--Examples/php_syscolors_example.txt63
-rw-r--r--Examples/php_who_example.txt10
-rw-r--r--Examples/pidpersec_example.txt33
-rw-r--r--Examples/pl_calldist_example.txt456
-rw-r--r--Examples/pl_calltime_example.txt150
-rw-r--r--Examples/pl_cpudist_example.txt470
-rw-r--r--Examples/pl_cputime_example.txt151
-rw-r--r--Examples/pl_flow_example.txt179
-rw-r--r--Examples/pl_flowinfo_example.txt188
-rw-r--r--Examples/pl_flowtime_example.txt199
-rw-r--r--Examples/pl_malloc_example.txt79
-rw-r--r--Examples/pl_subcalls_example.txt53
-rw-r--r--Examples/pl_syscalls_example.txt50
-rw-r--r--Examples/pl_syscolors_example.txt183
-rw-r--r--Examples/pl_who_example.txt41
-rw-r--r--Examples/priclass_example.txt82
-rw-r--r--Examples/pridist_example.txt238
-rw-r--r--Examples/procsystime_example.txt149
-rw-r--r--Examples/putnexts_example.txt520
-rw-r--r--Examples/py_calldist_example.txt966
-rw-r--r--Examples/py_calltime_example.txt255
-rw-r--r--Examples/py_cpudist_example.txt966
-rw-r--r--Examples/py_cputime_example.txt262
-rw-r--r--Examples/py_flow_example.txt485
-rw-r--r--Examples/py_flowinfo_example.txt485
-rw-r--r--Examples/py_flowtime_example.txt487
-rw-r--r--Examples/py_funccalls_example.txt89
-rw-r--r--Examples/py_malloc_example.txt508
-rw-r--r--Examples/py_mallocstk_example.txt314
-rw-r--r--Examples/py_profile_example.txt399
-rw-r--r--Examples/py_syscalls_example.txt129
-rw-r--r--Examples/py_syscolors_example.txt584
-rw-r--r--Examples/py_who_example.txt34
-rw-r--r--Examples/rb_calldist_example.txt153
-rw-r--r--Examples/rb_calls_example.txt29
-rw-r--r--Examples/rb_calltime_example.txt77
-rw-r--r--Examples/rb_cpudist_example.txt199
-rw-r--r--Examples/rb_cputime_example.txt81
-rw-r--r--Examples/rb_flow_example.txt54
-rw-r--r--Examples/rb_flowinfo_example.txt54
-rw-r--r--Examples/rb_flowtime_example.txt56
-rw-r--r--Examples/rb_funccalls_example.txt25
-rw-r--r--Examples/rb_lines_example.txt30
-rw-r--r--Examples/rb_malloc_example.txt120
-rw-r--r--Examples/rb_objcpu_example.txt51
-rw-r--r--Examples/rb_objnew_example.txt21
-rw-r--r--Examples/rb_stat_example.txt22
-rw-r--r--Examples/rb_syscalls_example.txt54
-rw-r--r--Examples/rb_syscolors_example.txt331
-rw-r--r--Examples/rb_who_example.txt20
-rw-r--r--Examples/readbytes_example.txt22
-rw-r--r--Examples/readdist_example.txt35
-rw-r--r--Examples/rfileio_example.txt94
-rw-r--r--Examples/rfsio_example.txt82
-rw-r--r--Examples/runocc_example.txt53
-rw-r--r--Examples/rwbbypid_example.txt26
-rw-r--r--Examples/rwbypid_example.txt19
-rw-r--r--Examples/rwbytype_example.txt37
-rw-r--r--Examples/rwsnoop_example.txt98
-rw-r--r--Examples/rwtop_example.txt59
-rw-r--r--Examples/sampleproc_example.txt62
-rw-r--r--Examples/sar-c_example.txt55
-rw-r--r--Examples/seeksize_example.txt197
-rw-r--r--Examples/setuids_example.txt28
-rw-r--r--Examples/sh_calldist_example.txt309
-rw-r--r--Examples/sh_calls_example.txt60
-rw-r--r--Examples/sh_calltime_example.txt144
-rw-r--r--Examples/sh_cpudist_example.txt92
-rw-r--r--Examples/sh_cputime_example.txt131
-rw-r--r--Examples/sh_flow_example.txt129
-rw-r--r--Examples/sh_flowinfo_example.txt242
-rw-r--r--Examples/sh_flowtime_example.txt131
-rw-r--r--Examples/sh_lines_example.txt32
-rw-r--r--Examples/sh_pidcolors_example.txt574
-rw-r--r--Examples/sh_stat_example.txt44
-rw-r--r--Examples/sh_syscalls_example.txt59
-rw-r--r--Examples/sh_syscolors_example.txt328
-rw-r--r--Examples/sh_wasted_example.txt45
-rw-r--r--Examples/sh_who_example.txt45
-rw-r--r--Examples/shellsnoop_example.txt112
-rw-r--r--Examples/shortlived_example.txt57
-rw-r--r--Examples/sigdist_example.txt18
-rw-r--r--Examples/stacksize_example.txt87
-rw-r--r--Examples/statsnoop_example.txt94
-rw-r--r--Examples/swapinfo_example.txt22
-rw-r--r--Examples/sysbypid_example.txt45
-rw-r--r--Examples/syscallbypid_example.txt50
-rw-r--r--Examples/syscallbyproc_example.txt17
-rw-r--r--Examples/syscallbysysc_example.txt24
-rw-r--r--Examples/tcl_calldist_example.txt166
-rw-r--r--Examples/tcl_calls_example.txt41
-rw-r--r--Examples/tcl_calltime_example.txt61
-rw-r--r--Examples/tcl_cpudist_example.txt164
-rw-r--r--Examples/tcl_cputime_example.txt67
-rw-r--r--Examples/tcl_flow_example.txt195
-rw-r--r--Examples/tcl_flowtime_example.txt197
-rw-r--r--Examples/tcl_ins_example.txt46
-rw-r--r--Examples/tcl_insflow_example.txt997
-rw-r--r--Examples/tcl_proccalls_example.txt17
-rw-r--r--Examples/tcl_procflow_example.txt29
-rw-r--r--Examples/tcl_stat_example.txt24
-rw-r--r--Examples/tcl_syscalls_example.txt66
-rw-r--r--Examples/tcl_syscolors_example.txt563
-rw-r--r--Examples/tcl_who_example.txt17
-rw-r--r--Examples/tcpsnoop_d_example.txt41
-rw-r--r--Examples/tcpsnoop_example.txt61
l---------Examples/tcpsnoop_snv_d_example.txt1
l---------Examples/tcpsnoop_snv_example.txt1
-rw-r--r--Examples/tcpstat_example.txt22
-rw-r--r--Examples/tcptop_example.txt28
l---------Examples/tcptop_snv_example.txt1
-rw-r--r--Examples/tcpwdist_example.txt70
-rw-r--r--Examples/threaded_example.txt108
-rw-r--r--Examples/topsyscall_example.txt65
-rw-r--r--Examples/topsysproc_example.txt56
-rw-r--r--Examples/udpstat_example.txt39
-rw-r--r--Examples/uname-a_example.txt15
-rw-r--r--Examples/vmbypid_example.txt32
-rw-r--r--Examples/vmstat-p_example.txt51
-rw-r--r--Examples/vmstat_example.txt45
-rw-r--r--Examples/vopstat_example.txt89
-rw-r--r--Examples/weblatency_example.txt127
-rw-r--r--Examples/whatexec_example.txt18
-rw-r--r--Examples/woof_example.txt28
-rw-r--r--Examples/wpm_example.txt57
-rw-r--r--Examples/writebytes_example.txt26
-rw-r--r--Examples/writedist_example.txt38
-rw-r--r--Examples/xcallsbypid_example.txt17
-rw-r--r--Examples/xvmstat_example.txt44
-rw-r--r--Examples/zvmstat_example.txt34
-rw-r--r--FS/Readme3
-rwxr-xr-xFS/fspaging.d154
-rwxr-xr-xFS/fsrw.d149
-rwxr-xr-xFS/rfileio.d91
-rwxr-xr-xFS/rfsio.d98
-rwxr-xr-xFS/vopstat304
-rw-r--r--Guide91
-rw-r--r--Include/Readme18
-rwxr-xr-xInclude/test.ksh68
-rw-r--r--Include/time.h38
-rw-r--r--Include/tostr.h89
-rw-r--r--Java/Readme17
-rwxr-xr-xJava/j_calldist.d116
-rwxr-xr-xJava/j_calls.d113
-rwxr-xr-xJava/j_calltime.d129
-rwxr-xr-xJava/j_classflow.d100
-rwxr-xr-xJava/j_cpudist.d116
-rwxr-xr-xJava/j_cputime.d129
-rwxr-xr-xJava/j_events.d56
-rwxr-xr-xJava/j_flow.d87
-rwxr-xr-xJava/j_flowtime.d101
-rwxr-xr-xJava/j_methodcalls.d60
-rwxr-xr-xJava/j_objnew.d61
-rwxr-xr-xJava/j_package.d56
-rwxr-xr-xJava/j_profile.d78
-rwxr-xr-xJava/j_stat.d148
-rwxr-xr-xJava/j_syscalls.d68
-rwxr-xr-xJava/j_syscolors.d135
-rwxr-xr-xJava/j_thread.d64
-rwxr-xr-xJava/j_who.d58
-rw-r--r--JavaScript/Readme54
-rwxr-xr-xJavaScript/js_calldist.d101
-rwxr-xr-xJavaScript/js_calls.d76
-rwxr-xr-xJavaScript/js_calltime.d115
-rwxr-xr-xJavaScript/js_cpudist.d101
-rwxr-xr-xJavaScript/js_cputime.d115
-rwxr-xr-xJavaScript/js_execs.d51
-rwxr-xr-xJavaScript/js_flow.d69
-rwxr-xr-xJavaScript/js_flowinfo.d86
-rwxr-xr-xJavaScript/js_flowtime.d84
-rwxr-xr-xJavaScript/js_objcpu.d61
-rwxr-xr-xJavaScript/js_objgc.d89
-rwxr-xr-xJavaScript/js_objnew.d55
-rwxr-xr-xJavaScript/js_stat.d120
-rwxr-xr-xJavaScript/js_who.d56
-rw-r--r--Kernel/Readme3
-rwxr-xr-xKernel/cpudists184
-rwxr-xr-xKernel/cputimes203
-rwxr-xr-xKernel/cswstat.d74
-rwxr-xr-xKernel/dnlcps.d68
-rwxr-xr-xKernel/dnlcsnoop.d92
-rwxr-xr-xKernel/dnlcstat162
-rwxr-xr-xKernel/kstat_types.d66
-rwxr-xr-xKernel/modcalls.d10
-rwxr-xr-xKernel/priclass.d67
-rwxr-xr-xKernel/pridist.d66
-rwxr-xr-xKernel/putnexts.d38
-rwxr-xr-xKernel/whatexec.d79
l---------License1
-rwxr-xr-xLocks/lockbydist.d10
-rwxr-xr-xLocks/lockbyproc.d10
-rw-r--r--Man/Readme40
-rw-r--r--Man/man1m/anonpgpid.d.1m54
-rw-r--r--Man/man1m/bitesize.d.1m57
-rw-r--r--Man/man1m/connections.1m77
-rw-r--r--Man/man1m/cpudists.1m86
-rw-r--r--Man/man1m/cputimes.1m87
-rw-r--r--Man/man1m/cputypes.d.1m54
-rw-r--r--Man/man1m/cpuwalk.d.1m53
-rw-r--r--Man/man1m/crash.d.1m81
-rw-r--r--Man/man1m/creatbyproc.d.1m55
-rw-r--r--Man/man1m/cswstat.d.1m51
-rw-r--r--Man/man1m/dappprof.1m98
-rw-r--r--Man/man1m/dapptrace.1m112
-rw-r--r--Man/man1m/dexplorer.1m64
-rw-r--r--Man/man1m/diskhits.1m46
-rw-r--r--Man/man1m/dispqlen.d.1m36
-rw-r--r--Man/man1m/dnlcps.d.1m51
-rw-r--r--Man/man1m/dnlcsnoop.d.1m52
-rw-r--r--Man/man1m/dnlcstat.1m57
-rw-r--r--Man/man1m/dtruss.1m123
-rw-r--r--Man/man1m/dvmstat.1m93
-rw-r--r--Man/man1m/errinfo.1m85
-rw-r--r--Man/man1m/execsnoop.1m108
-rw-r--r--Man/man1m/fddist.1m63
-rw-r--r--Man/man1m/filebyproc.d.1m56
-rw-r--r--Man/man1m/fspaging.d.1m88
-rw-r--r--Man/man1m/fsrw.d.1m80
-rw-r--r--Man/man1m/guess.d.1m37
-rw-r--r--Man/man1m/hotkernel.1m39
-rw-r--r--Man/man1m/hotspot.d.1m51
-rw-r--r--Man/man1m/hotuser.1m44
-rw-r--r--Man/man1m/httpdstat.d.1m67
-rw-r--r--Man/man1m/icmpstat.d.1m47
-rw-r--r--Man/man1m/intbycpu.d.1m48
-rw-r--r--Man/man1m/intoncpu.d.1m42
-rw-r--r--Man/man1m/inttimes.d.1m43
-rw-r--r--Man/man1m/iofile.d.1m49
-rw-r--r--Man/man1m/iofileb.d.1m46
-rw-r--r--Man/man1m/iopattern.1m112
-rw-r--r--Man/man1m/iopending.1m89
-rw-r--r--Man/man1m/iosnoop.1m167
-rw-r--r--Man/man1m/iotop.1m154
-rw-r--r--Man/man1m/j_calldist.d.1m48
-rw-r--r--Man/man1m/j_calls.d.1m57
-rw-r--r--Man/man1m/j_calltime.d.1m51
-rw-r--r--Man/man1m/j_classflow.d.1m63
-rw-r--r--Man/man1m/j_cpudist.d.1m48
-rw-r--r--Man/man1m/j_cputime.d.1m51
-rw-r--r--Man/man1m/j_events.d.1m46
-rw-r--r--Man/man1m/j_flow.d.1m63
-rw-r--r--Man/man1m/j_flowtime.d.1m69
-rw-r--r--Man/man1m/j_methodcalls.d.1m45
-rw-r--r--Man/man1m/j_objnew.d.1m45
-rw-r--r--Man/man1m/j_package.d.1m44
-rw-r--r--Man/man1m/j_profile.d.1m52
-rw-r--r--Man/man1m/j_stat.d.1m68
-rw-r--r--Man/man1m/j_syscalls.d.1m48
-rw-r--r--Man/man1m/j_syscolors.d.1m65
-rw-r--r--Man/man1m/j_thread.d.1m54
-rw-r--r--Man/man1m/j_who.d.1m51
-rw-r--r--Man/man1m/js_calldist.d.1m46
-rw-r--r--Man/man1m/js_calls.d.1m49
-rw-r--r--Man/man1m/js_calltime.d.1m49
-rw-r--r--Man/man1m/js_cpudist.d.1m46
-rw-r--r--Man/man1m/js_cputime.d.1m49
-rw-r--r--Man/man1m/js_execs.d.1m46
-rw-r--r--Man/man1m/js_flow.d.1m59
-rw-r--r--Man/man1m/js_flowinfo.d.1m68
-rw-r--r--Man/man1m/js_flowtime.d.1m62
-rw-r--r--Man/man1m/js_objcpu.d.1m36
-rw-r--r--Man/man1m/js_objgc.d.1m60
-rw-r--r--Man/man1m/js_objnew.d.1m46
-rw-r--r--Man/man1m/js_stat.d.1m52
-rw-r--r--Man/man1m/js_who.d.1m49
-rw-r--r--Man/man1m/kill.d.1m53
-rw-r--r--Man/man1m/kstat_types.d.1m50
-rw-r--r--Man/man1m/lastwords.1m56
-rw-r--r--Man/man1m/loads.d.1m38
-rw-r--r--Man/man1m/lockbydist.d.1m54
-rw-r--r--Man/man1m/lockbyproc.d.1m47
-rw-r--r--Man/man1m/minfbypid.d.1m46
-rw-r--r--Man/man1m/minfbyproc.d.1m47
-rw-r--r--Man/man1m/mmapfiles.d.1m42
-rw-r--r--Man/man1m/modcalls.d.1m50
-rw-r--r--Man/man1m/newproc.d.1m54
-rw-r--r--Man/man1m/nfswizard.d.1m36
-rw-r--r--Man/man1m/opensnoop.1m139
-rw-r--r--Man/man1m/pathopens.d.1m38
-rw-r--r--Man/man1m/pfilestat.1m87
-rw-r--r--Man/man1m/pgpginbypid.d.1m47
-rw-r--r--Man/man1m/pgpginbyproc.d.1m50
-rw-r--r--Man/man1m/php_calldist.d.1m49
-rw-r--r--Man/man1m/php_calltime.d.1m49
-rw-r--r--Man/man1m/php_cpudist.d.1m49
-rw-r--r--Man/man1m/php_cputime.d.1m49
-rw-r--r--Man/man1m/php_flow.d.1m60
-rw-r--r--Man/man1m/php_flowinfo.d.1m68
-rw-r--r--Man/man1m/php_flowtime.d.1m65
-rw-r--r--Man/man1m/php_funccalls.d.1m43
-rw-r--r--Man/man1m/php_malloc.d.1m39
-rw-r--r--Man/man1m/php_syscalls.d.1m54
-rw-r--r--Man/man1m/php_syscolors.d.1m61
-rw-r--r--Man/man1m/php_who.d.1m49
-rw-r--r--Man/man1m/pidpersec.d.1m42
-rw-r--r--Man/man1m/pl_calldist.d.1m49
-rw-r--r--Man/man1m/pl_calltime.d.1m49
-rw-r--r--Man/man1m/pl_cpudist.d.1m49
-rw-r--r--Man/man1m/pl_cputime.d.1m49
-rw-r--r--Man/man1m/pl_flow.d.1m60
-rw-r--r--Man/man1m/pl_flowinfo.d.1m68
-rw-r--r--Man/man1m/pl_flowtime.d.1m65
-rw-r--r--Man/man1m/pl_malloc.d.1m39
-rw-r--r--Man/man1m/pl_subcalls.d.1m43
-rw-r--r--Man/man1m/pl_syscalls.d.1m49
-rw-r--r--Man/man1m/pl_syscolors.d.1m61
-rw-r--r--Man/man1m/pl_who.d.1m49
-rw-r--r--Man/man1m/priclass.d.1m66
-rw-r--r--Man/man1m/pridist.d.1m55
-rw-r--r--Man/man1m/procsystime.1m108
-rw-r--r--Man/man1m/putnexts.d.1m27
-rw-r--r--Man/man1m/py_calldist.d.1m49
-rw-r--r--Man/man1m/py_calltime.d.1m49
-rw-r--r--Man/man1m/py_cpudist.d.1m49
-rw-r--r--Man/man1m/py_cputime.d.1m49
-rw-r--r--Man/man1m/py_flow.d.1m60
-rw-r--r--Man/man1m/py_flowinfo.d.1m68
-rw-r--r--Man/man1m/py_flowtime.d.1m65
-rw-r--r--Man/man1m/py_funccalls.d.1m43
-rw-r--r--Man/man1m/py_malloc.d.1m39
-rw-r--r--Man/man1m/py_mallocstk.d.1m33
-rw-r--r--Man/man1m/py_profile.d.1m54
-rw-r--r--Man/man1m/py_syscalls.d.1m49
-rw-r--r--Man/man1m/py_syscolors.d.1m61
-rw-r--r--Man/man1m/py_who.d.1m49
-rw-r--r--Man/man1m/rb_calldist.d.1m49
-rw-r--r--Man/man1m/rb_calls.d.1m49
-rw-r--r--Man/man1m/rb_calltime.d.1m49
-rw-r--r--Man/man1m/rb_cpudist.d.1m49
-rw-r--r--Man/man1m/rb_cputime.d.1m49
-rw-r--r--Man/man1m/rb_flow.d.1m59
-rw-r--r--Man/man1m/rb_flowinfo.d.1m68
-rw-r--r--Man/man1m/rb_flowtime.d.1m62
-rw-r--r--Man/man1m/rb_funccalls.d.1m46
-rw-r--r--Man/man1m/rb_lines.d.1m46
-rw-r--r--Man/man1m/rb_malloc.d.1m47
-rw-r--r--Man/man1m/rb_objcpu.d.1m36
-rw-r--r--Man/man1m/rb_objnew.d.1m46
-rw-r--r--Man/man1m/rb_stat.d.1m66
-rw-r--r--Man/man1m/rb_syscalls.d.1m49
-rw-r--r--Man/man1m/rb_syscolors.d.1m61
-rw-r--r--Man/man1m/rb_who.d.1m49
-rw-r--r--Man/man1m/readbytes.d.1m47
-rw-r--r--Man/man1m/readdist.d.1m54
-rw-r--r--Man/man1m/rfileio.d.1m41
-rw-r--r--Man/man1m/rfsio.d.1m41
-rw-r--r--Man/man1m/runocc.d.1m46
-rw-r--r--Man/man1m/rwbbypid.d.1m48
-rw-r--r--Man/man1m/rwbypid.d.1m48
-rw-r--r--Man/man1m/rwbytype.d.1m54
-rw-r--r--Man/man1m/rwsnoop.1m104
-rw-r--r--Man/man1m/rwtop.1m115
-rw-r--r--Man/man1m/sampleproc.1m55
-rw-r--r--Man/man1m/sar-c.d.1m62
-rw-r--r--Man/man1m/seeksize.d.1m51
-rw-r--r--Man/man1m/setuids.d.1m53
-rw-r--r--Man/man1m/sh_calldist.d.1m49
-rw-r--r--Man/man1m/sh_calls.d.1m49
-rw-r--r--Man/man1m/sh_calltime.d.1m49
-rw-r--r--Man/man1m/sh_cpudist.d.1m49
-rw-r--r--Man/man1m/sh_cputime.d.1m49
-rw-r--r--Man/man1m/sh_flow.d.1m66
-rw-r--r--Man/man1m/sh_flowinfo.d.1m62
-rw-r--r--Man/man1m/sh_flowtime.d.1m76
-rw-r--r--Man/man1m/sh_lines.d.1m46
-rw-r--r--Man/man1m/sh_pidcolors.d.1m70
-rw-r--r--Man/man1m/sh_stat.d.1m59
-rw-r--r--Man/man1m/sh_syscalls.d.1m49
-rw-r--r--Man/man1m/sh_syscolors.d.1m63
-rw-r--r--Man/man1m/sh_wasted.d.1m49
-rw-r--r--Man/man1m/sh_who.d.1m49
-rw-r--r--Man/man1m/shellsnoop.1m99
-rw-r--r--Man/man1m/shortlived.d.1m37
-rw-r--r--Man/man1m/sigdist.d.1m50
-rw-r--r--Man/man1m/stacksize.d.1m42
-rw-r--r--Man/man1m/statsnoop.1m140
-rw-r--r--Man/man1m/swapinfo.d.1m88
-rw-r--r--Man/man1m/sysbypid.d.1m50
-rw-r--r--Man/man1m/syscallbypid.d.1m50
-rw-r--r--Man/man1m/syscallbyproc.d.1m50
-rw-r--r--Man/man1m/syscallbysysc.d.1m47
-rw-r--r--Man/man1m/tcl_calldist.d.1m47
-rw-r--r--Man/man1m/tcl_calls.d.1m68
-rw-r--r--Man/man1m/tcl_calltime.d.1m50
-rw-r--r--Man/man1m/tcl_cpudist.d.1m47
-rw-r--r--Man/man1m/tcl_cputime.d.1m50
-rw-r--r--Man/man1m/tcl_flow.d.1m66
-rw-r--r--Man/man1m/tcl_flowtime.d.1m69
-rw-r--r--Man/man1m/tcl_ins.d.1m50
-rw-r--r--Man/man1m/tcl_insflow.d.1m69
-rw-r--r--Man/man1m/tcl_proccalls.d.1m44
-rw-r--r--Man/man1m/tcl_procflow.d.1m60
-rw-r--r--Man/man1m/tcl_stat.d.1m61
-rw-r--r--Man/man1m/tcl_syscalls.d.1m47
-rw-r--r--Man/man1m/tcl_syscolors.d.1m59
-rw-r--r--Man/man1m/tcl_who.d.1m54
-rw-r--r--Man/man1m/tcpsnoop.1m116
-rw-r--r--Man/man1m/tcpsnoop.d.1m68
-rw-r--r--Man/man1m/tcpsnoop_snv.1m116
-rw-r--r--Man/man1m/tcpsnoop_snv.d.1m68
-rw-r--r--Man/man1m/tcpstat.d.1m58
-rw-r--r--Man/man1m/tcptop.1m111
-rw-r--r--Man/man1m/tcptop_snv.1m111
-rw-r--r--Man/man1m/tcpwdist.d.1m60
-rw-r--r--Man/man1m/threaded.d.1m50
-rw-r--r--Man/man1m/topsyscall.1m73
-rw-r--r--Man/man1m/topsysproc.1m75
-rw-r--r--Man/man1m/udpstat.d.1m55
-rw-r--r--Man/man1m/uname-a.d.1m35
-rw-r--r--Man/man1m/vmbypid.d.1m50
-rw-r--r--Man/man1m/vmstat-p.d.1m85
-rw-r--r--Man/man1m/vmstat.d.1m79
-rw-r--r--Man/man1m/vopstat.1m77
-rw-r--r--Man/man1m/weblatency.d.1m63
-rw-r--r--Man/man1m/whatexec.d.1m53
-rw-r--r--Man/man1m/woof.d.1m46
-rw-r--r--Man/man1m/wpm.d.1m34
-rw-r--r--Man/man1m/writebytes.d.1m47
-rw-r--r--Man/man1m/writedist.d.1m54
-rw-r--r--Man/man1m/xcallsbypid.d.1m46
-rw-r--r--Man/man1m/xvmstat.1m104
-rw-r--r--Man/man1m/zvmstat.1m101
-rw-r--r--Mem/Readme3
-rwxr-xr-xMem/anonpgpid.d75
-rwxr-xr-xMem/minfbypid.d57
-rwxr-xr-xMem/minfbyproc.d10
-rwxr-xr-xMem/pgpginbypid.d53
-rwxr-xr-xMem/pgpginbyproc.d10
-rwxr-xr-xMem/swapinfo.d149
-rwxr-xr-xMem/vmbypid.d54
-rwxr-xr-xMem/vmstat-p.d155
-rwxr-xr-xMem/vmstat.d137
-rwxr-xr-xMem/xvmstat217
-rw-r--r--Misc/Readme5
-rwxr-xr-xMisc/guess.d118
-rwxr-xr-xMisc/woof.d63
-rwxr-xr-xMisc/wpm.d143
-rw-r--r--Net/Readme4
-rwxr-xr-xNet/connections178
-rwxr-xr-xNet/icmpstat.d61
-rwxr-xr-xNet/tcpsnoop581
-rwxr-xr-xNet/tcpsnoop.d424
-rwxr-xr-xNet/tcpsnoop_snv583
-rwxr-xr-xNet/tcpsnoop_snv.d426
-rwxr-xr-xNet/tcpstat.d91
-rwxr-xr-xNet/tcptop579
-rwxr-xr-xNet/tcptop_snv581
-rwxr-xr-xNet/tcpwdist.d82
-rwxr-xr-xNet/udpstat.d92
-rw-r--r--Notes/ALLcolors_notes.txt127
-rw-r--r--Notes/ALLelapsed_notes.txt46
-rw-r--r--Notes/ALLexclusive_notes.txt78
-rw-r--r--Notes/ALLfbt_notes.txt77
-rw-r--r--Notes/ALLflow_notes.txt64
-rw-r--r--Notes/ALLinclusive_notes.txt74
-rw-r--r--Notes/ALLjava_notes.txt35
-rw-r--r--Notes/ALLoncpu_notes.txt42
-rw-r--r--Notes/ALLoverhead.txt96
-rw-r--r--Notes/ALLperl_notes.txt44
-rw-r--r--Notes/ALLsnoop_notes.txt94
-rw-r--r--Notes/Readme21
-rw-r--r--Notes/cputimes_notes.txt138
-rw-r--r--Notes/dappprof_notes.txt14
-rw-r--r--Notes/dapptrace_notes.txt19
-rw-r--r--Notes/dtruss_notes.txt97
-rw-r--r--Notes/iosnoop_notes.txt99
-rw-r--r--Notes/iotop_notes.txt48
-rw-r--r--Notes/procsystime_notes.txt14
-rw-r--r--Perl/Readme38
-rwxr-xr-xPerl/pl_calldist.d82
-rwxr-xr-xPerl/pl_calltime.d89
-rwxr-xr-xPerl/pl_cpudist.d82
-rwxr-xr-xPerl/pl_cputime.d89
-rwxr-xr-xPerl/pl_flow.d70
-rwxr-xr-xPerl/pl_flowinfo.d86
-rwxr-xr-xPerl/pl_flowtime.d88
-rwxr-xr-xPerl/pl_malloc.d81
-rwxr-xr-xPerl/pl_subcalls.d55
-rwxr-xr-xPerl/pl_syscalls.d65
-rwxr-xr-xPerl/pl_syscolors.d119
-rwxr-xr-xPerl/pl_who.d56
-rw-r--r--Php/Readme39
-rwxr-xr-xPhp/php_calldist.d83
-rwxr-xr-xPhp/php_calltime.d90
-rwxr-xr-xPhp/php_cpudist.d83
-rwxr-xr-xPhp/php_cputime.d90
-rwxr-xr-xPhp/php_flow.d72
-rwxr-xr-xPhp/php_flowinfo.d88
-rwxr-xr-xPhp/php_flowtime.d91
-rwxr-xr-xPhp/php_funccalls.d56
-rwxr-xr-xPhp/php_malloc.d82
-rwxr-xr-xPhp/php_syscalls.d75
-rwxr-xr-xPhp/php_syscolors.d116
-rwxr-xr-xPhp/php_who.d56
-rw-r--r--Proc/Readme3
-rwxr-xr-xProc/crash.d181
-rwxr-xr-xProc/creatbyproc.d10
-rwxr-xr-xProc/dappprof239
-rwxr-xr-xProc/dapptrace259
-rwxr-xr-xProc/fddist116
-rwxr-xr-xProc/filebyproc.d10
-rwxr-xr-xProc/kill.d63
-rwxr-xr-xProc/lastwords90
-rwxr-xr-xProc/mmapfiles.d62
-rwxr-xr-xProc/newproc.d10
-rwxr-xr-xProc/pathopens.d100
-rwxr-xr-xProc/pfilestat282
-rwxr-xr-xProc/pidpersec.d57
-rwxr-xr-xProc/readbytes.d10
-rwxr-xr-xProc/readdist.d10
-rwxr-xr-xProc/rwbbypid.d61
-rwxr-xr-xProc/rwbypid.d61
-rwxr-xr-xProc/rwbytype.d101
-rwxr-xr-xProc/sampleproc105
-rwxr-xr-xProc/shortlived.d118
-rwxr-xr-xProc/sigdist.d61
-rwxr-xr-xProc/stacksize.d95
-rwxr-xr-xProc/sysbypid.d53
-rwxr-xr-xProc/syscallbypid.d54
-rwxr-xr-xProc/syscallbyproc.d10
-rwxr-xr-xProc/threaded.d66
-rwxr-xr-xProc/topsysproc121
-rwxr-xr-xProc/writebytes.d10
-rwxr-xr-xProc/writedist.d10
-rw-r--r--Python/Readme28
-rwxr-xr-xPython/py_calldist.d82
-rwxr-xr-xPython/py_calltime.d89
-rwxr-xr-xPython/py_cpudist.d82
-rwxr-xr-xPython/py_cputime.d89
-rwxr-xr-xPython/py_flow.d70
-rwxr-xr-xPython/py_flowinfo.d86
-rwxr-xr-xPython/py_flowtime.d89
-rwxr-xr-xPython/py_funccalls.d55
-rwxr-xr-xPython/py_malloc.d81
-rwxr-xr-xPython/py_mallocstk.d49
-rwxr-xr-xPython/py_profile.d79
-rwxr-xr-xPython/py_syscalls.d63
-rwxr-xr-xPython/py_syscolors.d116
-rwxr-xr-xPython/py_who.d56
l---------README1
-rw-r--r--Ruby/Readme31
-rwxr-xr-xRuby/rb_calldist.d120
-rwxr-xr-xRuby/rb_calls.d87
-rwxr-xr-xRuby/rb_calltime.d129
-rwxr-xr-xRuby/rb_cpudist.d120
-rwxr-xr-xRuby/rb_cputime.d129
-rwxr-xr-xRuby/rb_flow.d72
-rwxr-xr-xRuby/rb_flowinfo.d88
-rwxr-xr-xRuby/rb_flowtime.d84
-rwxr-xr-xRuby/rb_funccalls.d57
-rwxr-xr-xRuby/rb_lines.d55
-rwxr-xr-xRuby/rb_malloc.d80
-rwxr-xr-xRuby/rb_objcpu.d61
-rwxr-xr-xRuby/rb_objnew.d55
-rwxr-xr-xRuby/rb_stat.d146
-rwxr-xr-xRuby/rb_syscalls.d66
-rwxr-xr-xRuby/rb_syscolors.d133
-rwxr-xr-xRuby/rb_who.d56
-rw-r--r--Shell/Readme35
-rwxr-xr-xShell/sh_calldist.d119
-rwxr-xr-xShell/sh_calls.d72
-rwxr-xr-xShell/sh_calltime.d136
-rwxr-xr-xShell/sh_cpudist.d142
-rwxr-xr-xShell/sh_cputime.d158
-rwxr-xr-xShell/sh_flow.d85
-rwxr-xr-xShell/sh_flowinfo.d152
-rwxr-xr-xShell/sh_flowtime.d118
-rwxr-xr-xShell/sh_lines.d55
-rwxr-xr-xShell/sh_pidcolors.d203
-rwxr-xr-xShell/sh_stat.d133
-rwxr-xr-xShell/sh_syscalls.d83
-rwxr-xr-xShell/sh_syscolors.d169
-rwxr-xr-xShell/sh_wasted.d101
-rwxr-xr-xShell/sh_who.d56
-rw-r--r--Snippits/Readme11
-rw-r--r--Snippits/fd2pathname.txt32
-rw-r--r--System/Readme3
-rwxr-xr-xSystem/sar-c.d101
-rwxr-xr-xSystem/syscallbysysc.d10
-rwxr-xr-xSystem/topsyscall184
-rwxr-xr-xSystem/uname-a.d53
-rw-r--r--Tcl/Readme39
-rwxr-xr-xTcl/tcl_calldist.d111
-rwxr-xr-xTcl/tcl_calls.d63
-rwxr-xr-xTcl/tcl_calltime.d123
-rwxr-xr-xTcl/tcl_cpudist.d111
-rwxr-xr-xTcl/tcl_cputime.d123
-rwxr-xr-xTcl/tcl_flow.d86
-rwxr-xr-xTcl/tcl_flowtime.d105
-rwxr-xr-xTcl/tcl_ins.d57
-rwxr-xr-xTcl/tcl_insflow.d123
-rwxr-xr-xTcl/tcl_proccalls.d53
-rwxr-xr-xTcl/tcl_procflow.d70
-rwxr-xr-xTcl/tcl_stat.d137
-rwxr-xr-xTcl/tcl_syscalls.d66
-rwxr-xr-xTcl/tcl_syscolors.d139
-rwxr-xr-xTcl/tcl_who.d62
-rw-r--r--User/Readme3
-rwxr-xr-xUser/setuids.d82
-rw-r--r--Version1
-rw-r--r--Zones/Readme3
-rwxr-xr-xZones/zvmstat277
-rwxr-xr-xdexplorer547
-rwxr-xr-xdvmstat250
-rwxr-xr-xerrinfo180
-rwxr-xr-xexecsnoop174
-rwxr-xr-xhotkernel125
-rwxr-xr-xhotuser139
-rwxr-xr-xinstall151
-rwxr-xr-xiopattern277
-rwxr-xr-xiosnoop367
-rwxr-xr-xiotop422
-rwxr-xr-xopensnoop244
-rwxr-xr-xprocsystime233
-rwxr-xr-xrwsnoop234
-rwxr-xr-xrwtop292
-rwxr-xr-xstatsnoop286
1006 files changed, 77925 insertions, 0 deletions
diff --git a/Apps/Readme b/Apps/Readme
new file mode 100644
index 000000000000..3a6812f4bfa2
--- /dev/null
+++ b/Apps/Readme
@@ -0,0 +1,5 @@
+Apps - Specific Application based analysis
+
+ These are DTrace scripts that are written to analyse a particular
+ application or applictaion layer protocol. For example, Apache or NFS
+ scripts would appear here.
diff --git a/Apps/httpdstat.d b/Apps/httpdstat.d
new file mode 100755
index 000000000000..a053482a6c15
--- /dev/null
+++ b/Apps/httpdstat.d
@@ -0,0 +1,132 @@
+#!/usr/sbin/dtrace -s
+/*
+ * httpdstat.d - realtime httpd statistics. Uses DTrace.
+ *
+ * $Id: httpdstat.d 2 2007-08-01 10:01:43Z brendan $
+ *
+ * USAGE: httpdstat.d [interval [count]]
+ *
+ * interval seconds
+ * count number of samples
+ *
+ * FIELDS:
+ * TIME Time, string
+ * NUM Number of connections
+ * GET Number of "GET"s
+ * POST Number of "POST"s
+ * HEAD Number of "HEAD"s
+ * TRACE Number of "TRACE"s
+ *
+ * All of the statistics are printed as a value per interval (not per second).
+ *
+ * NOTE: This version does not process subsequent operations on keepalives.
+ *
+ * IDEA: Ryan Matteson (who first wrote a solution to this).
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 20-Nov-2005 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+inline int SCREEN = 21;
+
+/*
+ * Program Start
+ */
+dtrace:::BEGIN
+{
+ num = 0; get = 0; head = 0; post = 0; trac = 0;
+ lines = SCREEN + 1;
+ secs = $1 ? $1 : 1;
+ counts = $2 ? $2 : -1;
+ first = 1;
+}
+
+profile:::tick-1sec
+{
+ secs--;
+}
+
+/*
+ * Print Header
+ */
+dtrace:::BEGIN,
+profile:::tick-1sec
+/first || (secs == 0 && lines > SCREEN)/
+{
+ printf("%-20s %6s %6s %5s %5s %5s\n", "TIME",
+ "NUM", "GET", "POST", "HEAD", "TRACE");
+ lines = 0;
+ first = 0;
+}
+
+/*
+ * Track Accept Events
+ */
+syscall::accept:return
+/execname == "httpd"/
+{
+ self->buf = 1;
+}
+
+syscall::read:entry
+/self->buf/
+{
+ self->buf = arg1;
+}
+
+/*
+ * Tally Data
+ */
+syscall::read:return
+/self->buf && arg0/
+{
+ this->str = (char *)copyin(self->buf, arg0);
+ this->str[4] = '\0';
+ get += stringof(this->str) == "GET " ? 1 : 0;
+ post += stringof(this->str) == "POST" ? 1 : 0;
+ head += stringof(this->str) == "HEAD" ? 1 : 0;
+ trac += stringof(this->str) == "TRAC" ? 1 : 0;
+ num++;
+ self->buf = 0;
+}
+
+/*
+ * Print Output
+ */
+profile:::tick-1sec
+/secs == 0/
+{
+ printf("%-20Y %6d %6d %5d %5d %5d\n", walltimestamp,
+ num, get, post, head, trac);
+ num = 0; get = 0; head = 0; post = 0; trac = 0;
+ secs = $1 ? $1 : 1;
+ lines++;
+ counts--;
+}
+
+/*
+ * End
+ */
+profile:::tick-1sec
+/counts == 0/
+{
+ exit(0);
+}
diff --git a/Apps/nfswizard.d b/Apps/nfswizard.d
new file mode 100755
index 000000000000..c63bc33dfa4e
--- /dev/null
+++ b/Apps/nfswizard.d
@@ -0,0 +1,102 @@
+#!/usr/sbin/dtrace -s
+/*
+ * nfswizard.d - nfs client activity wizard.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This examines activity caused by NFS client processes on the same server
+ * that you are running this script on. A detailed report is generated
+ * to explain various details of NFS client activity, including response
+ * times and file access.
+ *
+ * $Id: nfswizard.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: nfswizard.d # hit Ctrl-C to end sample
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 02-Dec-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ scriptstart = walltimestamp;
+ timestart = timestamp;
+}
+
+io:nfs::start
+{
+ /* tally file sizes */
+ @file[args[2]->fi_pathname] = sum(args[0]->b_bcount);
+
+ /* time response */
+ start[args[0]->b_addr] = timestamp;
+
+ /* overall stats */
+ @rbytes = sum(args[0]->b_flags & B_READ ? args[0]->b_bcount : 0);
+ @wbytes = sum(args[0]->b_flags & B_READ ? 0 : args[0]->b_bcount);
+ @events = count();
+}
+
+io:nfs::done
+/start[args[0]->b_addr]/
+{
+ /* calculate and save response time stats */
+ this->elapsed = timestamp - start[args[0]->b_addr];
+ @maxtime = max(this->elapsed);
+ @avgtime = avg(this->elapsed);
+ @qnztime = quantize(this->elapsed / 1000);
+}
+
+dtrace:::END
+{
+ /* print header */
+ printf("NFS Client Wizard. %Y -> %Y\n\n", scriptstart, walltimestamp);
+
+ /* print read/write stats */
+ printa("Read: %@d bytes ", @rbytes);
+ normalize(@rbytes, 1000000);
+ printa("(%@d Mb)\n", @rbytes);
+ printa("Write: %@d bytes ", @wbytes);
+ normalize(@wbytes, 1000000);
+ printa("(%@d Mb)\n\n", @wbytes);
+
+ /* print throughput stats */
+ denormalize(@rbytes);
+ normalize(@rbytes, (timestamp - timestart) / 1000000);
+ printa("Read: %@d Kb/sec\n", @rbytes);
+ denormalize(@wbytes);
+ normalize(@wbytes, (timestamp - timestart) / 1000000);
+ printa("Write: %@d Kb/sec\n\n", @wbytes);
+
+ /* print time stats */
+ printa("NFS I/O events: %@d\n", @events);
+ normalize(@avgtime, 1000000);
+ printa("Avg response time: %@d ms\n", @avgtime);
+ normalize(@maxtime, 1000000);
+ printa("Max response time: %@d ms\n\n", @maxtime);
+ printa("Response times (us):%@d\n", @qnztime);
+
+ /* print file stats */
+ printf("Top 25 files accessed (bytes):\n");
+ printf(" %-64s %s\n", "PATHNAME", "BYTES");
+ trunc(@file, 25);
+ printa(" %-64s %@d\n", @file);
+}
diff --git a/Apps/shellsnoop b/Apps/shellsnoop
new file mode 100755
index 000000000000..95f42c046529
--- /dev/null
+++ b/Apps/shellsnoop
@@ -0,0 +1,268 @@
+#!/usr/bin/sh
+#
+# shellsnoop - A program to print read/write details from shells,
+# such as keystrokes and command outputs.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This program sounds somewhat dangerous (snooping keystrokes), but is
+# no more so than /usr/bin/truss, and both need root or dtrace privileges to
+# run. In fact, less dangerous, as we only print visible text (not password
+# text, for example). Having said that, it goes without saying that this
+# program shouldn't be used for breeching privacy of other users.
+#
+# This was written as a tool to demonstrate the capabilities of DTrace.
+#
+# $Id: shellsnoop 19 2007-09-12 07:47:59Z brendan $
+#
+# USAGE: shellsnoop [-hqsv] [-p PID] [-u UID]
+#
+# -q # quiet, only print data
+# -s # include start time, us
+# -v # include start time, string
+# -p PID # process ID to snoop
+# -u UID # user ID to snoop
+# eg,
+# shellsnoop # default output
+# shellsnoop -v # human readable timestamps
+# shellsnoop -p 1892 # snoop this PID only
+# shellsnoop -qp 1892 # watch this PID data only
+#
+# FIELDS:
+# UID User ID
+# PID process ID
+# PPID parent process ID
+# COMM command name
+# DIR direction (R read, W write)
+# TEXT text contained in the read/write
+# TIME timestamp for the command, us
+# STRTIME timestamp for the command, string
+#
+# SEE ALSO: ttywatcher
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 28-Mar-2004 Brendan Gregg Created this.
+# 21-Jan-2005 " " Wrapped in sh to provide options.
+# 30-Nov-2005 " " Fixed trailing buffer text bug.
+# 30-Nov-2005 " " Fixed sh no keystroke text in quiet bug.
+# 30-Nov-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+opt_pid=0; opt_uid=0; opt_time=0; opt_timestr=0; opt_quiet=0; opt_debug=0
+filter=0; pid=0; uid=0
+
+while getopts dhp:qsu:v name
+do
+ case $name in
+ d) opt_debug=1 ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ q) opt_quiet=1 ;;
+ s) opt_time=1 ;;
+ u) opt_uid=1; uid=$OPTARG ;;
+ v) opt_timestr=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: shellsnoop [-hqsv] [-p PID] [-u UID]
+ shellsnoop # default output
+ -q # quiet, only print data
+ -s # include start time, us
+ -v # include start time, string
+ -p PID # process ID to snoop
+ -u UID # user ID to snoop
+ END
+ exit 1
+ esac
+done
+
+if [ $opt_quiet -eq 1 ]; then
+ opt_time=0; opt_timestr=0
+fi
+if [ $opt_pid -eq 1 -o $opt_uid -eq 1 ]; then
+ filter=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_debug = '$opt_debug';
+ inline int OPT_quiet = '$opt_quiet';
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_uid = '$opt_uid';
+ inline int OPT_time = '$opt_time';
+ inline int OPT_timestr = '$opt_timestr';
+ inline int FILTER = '$filter';
+ inline int PID = '$pid';
+ inline int UID = '$uid';
+
+ #pragma D option quiet
+ #pragma D option switchrate=20hz
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN /OPT_time == 1/
+ {
+ printf("%-14s ","TIME");
+ }
+ dtrace:::BEGIN /OPT_timestr == 1/
+ {
+ printf("%-20s ","STRTIME");
+ }
+ dtrace:::BEGIN /OPT_quiet == 0/
+ {
+ printf("%5s %5s %8s %3s %s\n", "PID", "PPID", "CMD", "DIR", "TEXT");
+ }
+
+ /*
+ * Remember this PID is a shell child
+ */
+ syscall::exec:entry, syscall::exece:entry
+ /execname == "sh" || execname == "ksh" || execname == "csh" ||
+ execname == "tcsh" || execname == "zsh" || execname == "bash"/
+ {
+ child[pid] = 1;
+
+ /* debug */
+ this->parent = (char *)curthread->t_procp->p_parent->p_user.u_comm;
+ OPT_debug == 1 ? printf("PID %d CMD %s started. (%s)\n",
+ pid, execname, stringof(this->parent)) : 1;
+ }
+ syscall::exec:entry, syscall::exece:entry
+ /(OPT_pid == 1 && PID != ppid) || (OPT_uid == 1 && UID != uid)/
+ {
+ /* forget if filtered */
+ child[pid] = 0;
+ }
+
+ /*
+ * Print shell keystrokes
+ */
+ syscall::write:entry, syscall::read:entry
+ /(execname == "sh" || execname == "ksh" || execname == "csh" ||
+ execname == "tcsh" || execname == "zsh" || execname == "bash")
+ && (arg0 >= 0 && arg0 <= 2)/
+ {
+ self->buf = arg1;
+ }
+ syscall::write:entry, syscall::read:entry
+ /(OPT_pid == 1 && PID != pid) || (OPT_uid == 1 && UID != uid)/
+ {
+ self->buf = 0;
+ }
+ syscall::write:return, syscall::read:return
+ /self->buf && child[pid] == 0 && OPT_time == 1/
+ {
+ printf("%-14d ", timestamp/1000);
+ }
+ syscall::write:return, syscall::read:return
+ /self->buf && child[pid] == 0 && OPT_timestr == 1/
+ {
+ printf("%-20Y ", walltimestamp);
+ }
+ syscall::write:return, syscall::read:return
+ /self->buf && child[pid] == 0 && OPT_quiet == 0/
+ {
+ this->text = (char *)copyin(self->buf, arg0);
+ this->text[arg0] = '\'\\0\'';
+
+ printf("%5d %5d %8s %3s %s\n", pid, curpsinfo->pr_ppid, execname,
+ probefunc == "read" ? "R" : "W", stringof(this->text));
+ }
+ syscall::write:return
+ /self->buf && child[pid] == 0 && OPT_quiet == 1/
+ {
+ this->text = (char *)copyin(self->buf, arg0);
+ this->text[arg0] = '\'\\0\'';
+ printf("%s", stringof(this->text));
+ }
+ syscall::read:return
+ /self->buf && execname == "sh" && child[pid] == 0 && OPT_quiet == 1/
+ {
+ this->text = (char *)copyin(self->buf, arg0);
+ this->text[arg0] = '\'\\0\'';
+ printf("%s", stringof(this->text));
+ }
+ syscall::write:return, syscall::read:return
+ /self->buf && child[pid] == 0/
+ {
+ self->buf = 0;
+ }
+
+ /*
+ * Print command output
+ */
+ syscall::write:entry, syscall::read:entry
+ /child[pid] == 1 && (arg0 == 1 || arg0 == 2)/
+ {
+ self->buf = arg1;
+ }
+ syscall::write:return, syscall::read:return
+ /self->buf && OPT_time == 1/
+ {
+ printf("%-14d ", timestamp/1000);
+ }
+ syscall::write:return, syscall::read:return
+ /self->buf && OPT_timestr == 1/
+ {
+ printf("%-20Y ", walltimestamp);
+ }
+ syscall::write:return, syscall::read:return
+ /self->buf && OPT_quiet == 0/
+ {
+ this->text = (char *)copyin(self->buf, arg0);
+ this->text[arg0] = '\'\\0\'';
+
+ printf("%5d %5d %8s %3s %s", pid, curpsinfo->pr_ppid, execname,
+ probefunc == "read" ? "R" : "W", stringof(this->text));
+
+ /* here we check if a newline is needed */
+ this->length = strlen(this->text);
+ printf("%s", this->text[this->length - 1] == '\'\\n\'' ? "" : "\n");
+ self->buf = 0;
+ }
+ syscall::write:return, syscall::read:return
+ /self->buf && OPT_quiet == 1/
+ {
+ this->text = (char *)copyin(self->buf, arg0);
+ this->text[arg0] = '\'\\0\'';
+ printf("%s", stringof(this->text));
+ self->buf = 0;
+ }
+
+ /*
+ * Cleanup
+ */
+ syscall::rexit:entry
+ {
+ child[pid] = 0;
+
+ /* debug */
+ this->parent = (char *)curthread->t_procp->p_parent->p_user.u_comm;
+ OPT_debug == 1 ? printf("PID %d CMD %s exited. (%s)\n",
+ pid, execname, stringof(this->parent)) : 1;
+ }
+'
diff --git a/Apps/weblatency.d b/Apps/weblatency.d
new file mode 100755
index 000000000000..8d96d5cdd88b
--- /dev/null
+++ b/Apps/weblatency.d
@@ -0,0 +1,186 @@
+#!/usr/sbin/dtrace -s
+/*
+ * weblatency.d - website latency statistics.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * $Id: weblatency.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: weblatency.d # hit Ctrl-C to end sample
+ *
+ * See the code below for the "BROWSER" variable, which sets the browser
+ * to trace (currently set to "mozilla-bin").
+ *
+ * This is written as an experimental tool, and may not work at all with
+ * your browser.
+ *
+ * FIELDS:
+ * HOST Hostname from URL
+ * NUM Number of GETs
+ * AVGTIME(ms) Average time for response, ms
+ * MAXTIME(ms) Maximum time for response, ms
+ *
+ * NOTE:
+ *
+ * The latency measured here is from the browser sending the GET
+ * request to when the browser begins to recieve the response. It
+ * is an overall response time for the client, and encompasses
+ * connection speed delays, DNS lookups, proxy delays, and web server
+ * response time.
+ *
+ * IDEA: Bryan Cantrill (who wrote an elegant version for Sol 10 update 1)
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * ToDo:
+ * Check write fd for socket, not file.
+ *
+ * 30-Nov-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+/* browser's execname */
+inline string BROWSER = "mozilla-bin";
+
+/* maximum expected hostname length + "GET http://" */
+inline int MAX_REQ = 64;
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+/*
+ * Trace brower request
+ *
+ * This is achieved by matching writes for the browser's execname that
+ * start with "GET", and then timing from the return of the write to
+ * the return of the next read in the same thread. Various stateful flags
+ * are used: self->fd, self->read.
+ *
+ * For performance reasons, I'd like to only process writes that follow a
+ * connect(), however this approach fails to process keepalives.
+ */
+syscall::write:entry
+/execname == BROWSER/
+{
+ self->buf = arg1;
+ self->fd = arg0 + 1;
+ self->nam = "";
+}
+
+syscall::write:return
+/self->fd/
+{
+ this->str = (char *)copyin(self->buf, MAX_REQ);
+ this->str[4] = '\0';
+ self->fd = stringof(this->str) == "GET " ? self->fd : 0;
+}
+
+syscall::write:return
+/self->fd/
+{
+ /* fetch browser request */
+ this->str = (char *)copyin(self->buf, MAX_REQ);
+ this->str[MAX_REQ] = '\0';
+
+ /*
+ * This unrolled loop strips down a URL to it's hostname.
+ * We ought to use strtok(), but it's not available on Sol 10 3/05,
+ * so instead I used dirname(). It's not pretty - it's done so that
+ * this works on all Sol 10 versions.
+ */
+ self->req = stringof(this->str);
+ self->nam = strlen(self->req) > 15 ? self->req : self->nam;
+ self->req = dirname(self->req);
+ self->nam = strlen(self->req) > 15 ? self->req : self->nam;
+ self->req = dirname(self->req);
+ self->nam = strlen(self->req) > 15 ? self->req : self->nam;
+ self->req = dirname(self->req);
+ self->nam = strlen(self->req) > 15 ? self->req : self->nam;
+ self->req = dirname(self->req);
+ self->nam = strlen(self->req) > 15 ? self->req : self->nam;
+ self->req = dirname(self->req);
+ self->nam = strlen(self->req) > 15 ? self->req : self->nam;
+ self->req = dirname(self->req);
+ self->nam = strlen(self->req) > 15 ? self->req : self->nam;
+ self->req = dirname(self->req);
+ self->nam = strlen(self->req) > 15 ? self->req : self->nam;
+ self->req = dirname(self->req);
+ self->nam = strlen(self->req) > 15 ? self->req : self->nam;
+ self->nam = basename(self->nam);
+
+ /* start the timer */
+ start[pid, self->fd - 1] = timestamp;
+ host[pid, self->fd - 1] = self->nam;
+ self->buf = 0;
+ self->fd = 0;
+ self->req = 0;
+ self->nam = 0;
+}
+
+/* this one wasn't a GET */
+syscall::write:return
+/self->buf/
+{
+ self->buf = 0;
+ self->fd = 0;
+}
+
+syscall::read:entry
+/execname == BROWSER && start[pid, arg0]/
+{
+ self->fd = arg0 + 1;
+}
+
+/*
+ * Record host details
+ */
+syscall::read:return
+/self->fd/
+{
+ /* fetch details */
+ self->host = stringof(host[pid, self->fd - 1]);
+ this->start = start[pid, self->fd - 1];
+
+ /* save details */
+ @Avg[self->host] = avg((timestamp - this->start)/1000000);
+ @Max[self->host] = max((timestamp - this->start)/1000000);
+ @Num[self->host] = count();
+
+ /* clear vars */
+ start[pid, self->fd - 1] = 0;
+ host[pid, self->fd - 1] = 0;
+ self->host = 0;
+ self->fd = 0;
+}
+
+/*
+ * Output report
+ */
+dtrace:::END
+{
+ printf("%-32s %11s\n", "HOST", "NUM");
+ printa("%-32s %@11d\n", @Num);
+
+ printf("\n%-32s %11s\n", "HOST", "AVGTIME(ms)");
+ printa("%-32s %@11d\n", @Avg);
+
+ printf("\n%-32s %11s\n", "HOST", "MAXTIME(ms)");
+ printa("%-32s %@11d\n", @Max);
+}
diff --git a/Bin/anonpgpid.d b/Bin/anonpgpid.d
new file mode 120000
index 000000000000..f48a5104fc69
--- /dev/null
+++ b/Bin/anonpgpid.d
@@ -0,0 +1 @@
+../Mem/anonpgpid.d \ No newline at end of file
diff --git a/Bin/bitesize.d b/Bin/bitesize.d
new file mode 120000
index 000000000000..6f984e083f9e
--- /dev/null
+++ b/Bin/bitesize.d
@@ -0,0 +1 @@
+../Disk/bitesize.d \ No newline at end of file
diff --git a/Bin/connections b/Bin/connections
new file mode 120000
index 000000000000..1be9a640e58a
--- /dev/null
+++ b/Bin/connections
@@ -0,0 +1 @@
+../Net/connections \ No newline at end of file
diff --git a/Bin/cpudists b/Bin/cpudists
new file mode 120000
index 000000000000..91f0d8022968
--- /dev/null
+++ b/Bin/cpudists
@@ -0,0 +1 @@
+../Kernel/cpudists \ No newline at end of file
diff --git a/Bin/cputimes b/Bin/cputimes
new file mode 120000
index 000000000000..219dbbc6ca64
--- /dev/null
+++ b/Bin/cputimes
@@ -0,0 +1 @@
+../Kernel/cputimes \ No newline at end of file
diff --git a/Bin/cputypes.d b/Bin/cputypes.d
new file mode 120000
index 000000000000..da583feb485f
--- /dev/null
+++ b/Bin/cputypes.d
@@ -0,0 +1 @@
+../Cpu/cputypes.d \ No newline at end of file
diff --git a/Bin/cpuwalk.d b/Bin/cpuwalk.d
new file mode 120000
index 000000000000..5a1c26e74bfd
--- /dev/null
+++ b/Bin/cpuwalk.d
@@ -0,0 +1 @@
+../Cpu/cpuwalk.d \ No newline at end of file
diff --git a/Bin/crash.d b/Bin/crash.d
new file mode 120000
index 000000000000..d3a3cf8c78d1
--- /dev/null
+++ b/Bin/crash.d
@@ -0,0 +1 @@
+../Proc/crash.d \ No newline at end of file
diff --git a/Bin/creatbyproc.d b/Bin/creatbyproc.d
new file mode 120000
index 000000000000..fecd0f32021f
--- /dev/null
+++ b/Bin/creatbyproc.d
@@ -0,0 +1 @@
+../Proc/creatbyproc.d \ No newline at end of file
diff --git a/Bin/cswstat.d b/Bin/cswstat.d
new file mode 120000
index 000000000000..ea54280e10a0
--- /dev/null
+++ b/Bin/cswstat.d
@@ -0,0 +1 @@
+../Kernel/cswstat.d \ No newline at end of file
diff --git a/Bin/dappprof b/Bin/dappprof
new file mode 120000
index 000000000000..e4fc32ef5658
--- /dev/null
+++ b/Bin/dappprof
@@ -0,0 +1 @@
+../Proc/dappprof \ No newline at end of file
diff --git a/Bin/dapptrace b/Bin/dapptrace
new file mode 120000
index 000000000000..1d38cb5ee7c4
--- /dev/null
+++ b/Bin/dapptrace
@@ -0,0 +1 @@
+../Proc/dapptrace \ No newline at end of file
diff --git a/Bin/dexplorer b/Bin/dexplorer
new file mode 120000
index 000000000000..41c36e49bd9d
--- /dev/null
+++ b/Bin/dexplorer
@@ -0,0 +1 @@
+../dexplorer \ No newline at end of file
diff --git a/Bin/diskhits b/Bin/diskhits
new file mode 120000
index 000000000000..4a57310d9333
--- /dev/null
+++ b/Bin/diskhits
@@ -0,0 +1 @@
+../Disk/diskhits \ No newline at end of file
diff --git a/Bin/dispqlen.d b/Bin/dispqlen.d
new file mode 120000
index 000000000000..1073e0b863f1
--- /dev/null
+++ b/Bin/dispqlen.d
@@ -0,0 +1 @@
+../Cpu/dispqlen.d \ No newline at end of file
diff --git a/Bin/dnlcps.d b/Bin/dnlcps.d
new file mode 120000
index 000000000000..efca13ceaf41
--- /dev/null
+++ b/Bin/dnlcps.d
@@ -0,0 +1 @@
+../Kernel/dnlcps.d \ No newline at end of file
diff --git a/Bin/dnlcsnoop.d b/Bin/dnlcsnoop.d
new file mode 120000
index 000000000000..247868728e05
--- /dev/null
+++ b/Bin/dnlcsnoop.d
@@ -0,0 +1 @@
+../Kernel/dnlcsnoop.d \ No newline at end of file
diff --git a/Bin/dnlcstat b/Bin/dnlcstat
new file mode 120000
index 000000000000..baec18905456
--- /dev/null
+++ b/Bin/dnlcstat
@@ -0,0 +1 @@
+../Kernel/dnlcstat \ No newline at end of file
diff --git a/Bin/dtruss b/Bin/dtruss
new file mode 120000
index 000000000000..90c00c6fe124
--- /dev/null
+++ b/Bin/dtruss
@@ -0,0 +1 @@
+../dtruss \ No newline at end of file
diff --git a/Bin/dvmstat b/Bin/dvmstat
new file mode 120000
index 000000000000..1b92321f0d47
--- /dev/null
+++ b/Bin/dvmstat
@@ -0,0 +1 @@
+../dvmstat \ No newline at end of file
diff --git a/Bin/errinfo b/Bin/errinfo
new file mode 120000
index 000000000000..fbecf4da7e2a
--- /dev/null
+++ b/Bin/errinfo
@@ -0,0 +1 @@
+../errinfo \ No newline at end of file
diff --git a/Bin/execsnoop b/Bin/execsnoop
new file mode 120000
index 000000000000..3a0dde2b1d5c
--- /dev/null
+++ b/Bin/execsnoop
@@ -0,0 +1 @@
+../execsnoop \ No newline at end of file
diff --git a/Bin/fddist b/Bin/fddist
new file mode 120000
index 000000000000..11d6e20f3714
--- /dev/null
+++ b/Bin/fddist
@@ -0,0 +1 @@
+../Proc/fddist \ No newline at end of file
diff --git a/Bin/filebyproc.d b/Bin/filebyproc.d
new file mode 120000
index 000000000000..5c2b2c596a7c
--- /dev/null
+++ b/Bin/filebyproc.d
@@ -0,0 +1 @@
+../Proc/filebyproc.d \ No newline at end of file
diff --git a/Bin/fspaging.d b/Bin/fspaging.d
new file mode 120000
index 000000000000..54db157bb489
--- /dev/null
+++ b/Bin/fspaging.d
@@ -0,0 +1 @@
+../FS/fspaging.d \ No newline at end of file
diff --git a/Bin/fsrw.d b/Bin/fsrw.d
new file mode 120000
index 000000000000..829e583e25b0
--- /dev/null
+++ b/Bin/fsrw.d
@@ -0,0 +1 @@
+../FS/fsrw.d \ No newline at end of file
diff --git a/Bin/guess.d b/Bin/guess.d
new file mode 120000
index 000000000000..b5a41fdf9de6
--- /dev/null
+++ b/Bin/guess.d
@@ -0,0 +1 @@
+../Misc/guess.d \ No newline at end of file
diff --git a/Bin/hotkernel b/Bin/hotkernel
new file mode 120000
index 000000000000..0b872c32e98b
--- /dev/null
+++ b/Bin/hotkernel
@@ -0,0 +1 @@
+../hotkernel \ No newline at end of file
diff --git a/Bin/hotspot.d b/Bin/hotspot.d
new file mode 120000
index 000000000000..dad526acd3fd
--- /dev/null
+++ b/Bin/hotspot.d
@@ -0,0 +1 @@
+../Disk/hotspot.d \ No newline at end of file
diff --git a/Bin/hotuser b/Bin/hotuser
new file mode 120000
index 000000000000..4ff615e9c289
--- /dev/null
+++ b/Bin/hotuser
@@ -0,0 +1 @@
+../hotuser \ No newline at end of file
diff --git a/Bin/httpdstat.d b/Bin/httpdstat.d
new file mode 120000
index 000000000000..5d8900d5aa2e
--- /dev/null
+++ b/Bin/httpdstat.d
@@ -0,0 +1 @@
+../Apps/httpdstat.d \ No newline at end of file
diff --git a/Bin/icmpstat.d b/Bin/icmpstat.d
new file mode 120000
index 000000000000..1d63bb75875f
--- /dev/null
+++ b/Bin/icmpstat.d
@@ -0,0 +1 @@
+../Net/icmpstat.d \ No newline at end of file
diff --git a/Bin/intbycpu.d b/Bin/intbycpu.d
new file mode 120000
index 000000000000..4897057d6937
--- /dev/null
+++ b/Bin/intbycpu.d
@@ -0,0 +1 @@
+../Cpu/intbycpu.d \ No newline at end of file
diff --git a/Bin/intoncpu.d b/Bin/intoncpu.d
new file mode 120000
index 000000000000..814c7be06dab
--- /dev/null
+++ b/Bin/intoncpu.d
@@ -0,0 +1 @@
+../Cpu/intoncpu.d \ No newline at end of file
diff --git a/Bin/inttimes.d b/Bin/inttimes.d
new file mode 120000
index 000000000000..5b179eecfe32
--- /dev/null
+++ b/Bin/inttimes.d
@@ -0,0 +1 @@
+../Cpu/inttimes.d \ No newline at end of file
diff --git a/Bin/iofile.d b/Bin/iofile.d
new file mode 120000
index 000000000000..8c63c1626464
--- /dev/null
+++ b/Bin/iofile.d
@@ -0,0 +1 @@
+../Disk/iofile.d \ No newline at end of file
diff --git a/Bin/iofileb.d b/Bin/iofileb.d
new file mode 120000
index 000000000000..7d6d404ad0c3
--- /dev/null
+++ b/Bin/iofileb.d
@@ -0,0 +1 @@
+../Disk/iofileb.d \ No newline at end of file
diff --git a/Bin/iopattern b/Bin/iopattern
new file mode 120000
index 000000000000..0257e0f83f0d
--- /dev/null
+++ b/Bin/iopattern
@@ -0,0 +1 @@
+../iopattern \ No newline at end of file
diff --git a/Bin/iopending b/Bin/iopending
new file mode 120000
index 000000000000..6ba932823527
--- /dev/null
+++ b/Bin/iopending
@@ -0,0 +1 @@
+../Disk/iopending \ No newline at end of file
diff --git a/Bin/iosnoop b/Bin/iosnoop
new file mode 120000
index 000000000000..2b86bcb70f63
--- /dev/null
+++ b/Bin/iosnoop
@@ -0,0 +1 @@
+../iosnoop \ No newline at end of file
diff --git a/Bin/iotop b/Bin/iotop
new file mode 120000
index 000000000000..14c124b300c1
--- /dev/null
+++ b/Bin/iotop
@@ -0,0 +1 @@
+../iotop \ No newline at end of file
diff --git a/Bin/j_calldist.d b/Bin/j_calldist.d
new file mode 120000
index 000000000000..3d40bca13089
--- /dev/null
+++ b/Bin/j_calldist.d
@@ -0,0 +1 @@
+../Java/j_calldist.d \ No newline at end of file
diff --git a/Bin/j_calls.d b/Bin/j_calls.d
new file mode 120000
index 000000000000..81ddfc590d22
--- /dev/null
+++ b/Bin/j_calls.d
@@ -0,0 +1 @@
+../Java/j_calls.d \ No newline at end of file
diff --git a/Bin/j_calltime.d b/Bin/j_calltime.d
new file mode 120000
index 000000000000..5261cabcb917
--- /dev/null
+++ b/Bin/j_calltime.d
@@ -0,0 +1 @@
+../Java/j_calltime.d \ No newline at end of file
diff --git a/Bin/j_classflow.d b/Bin/j_classflow.d
new file mode 120000
index 000000000000..e6fb86ad0140
--- /dev/null
+++ b/Bin/j_classflow.d
@@ -0,0 +1 @@
+../Java/j_classflow.d \ No newline at end of file
diff --git a/Bin/j_cpudist.d b/Bin/j_cpudist.d
new file mode 120000
index 000000000000..22f9adf86a0c
--- /dev/null
+++ b/Bin/j_cpudist.d
@@ -0,0 +1 @@
+../Java/j_cpudist.d \ No newline at end of file
diff --git a/Bin/j_cputime.d b/Bin/j_cputime.d
new file mode 120000
index 000000000000..bfb684366074
--- /dev/null
+++ b/Bin/j_cputime.d
@@ -0,0 +1 @@
+../Java/j_cputime.d \ No newline at end of file
diff --git a/Bin/j_events.d b/Bin/j_events.d
new file mode 120000
index 000000000000..385456118aae
--- /dev/null
+++ b/Bin/j_events.d
@@ -0,0 +1 @@
+../Java/j_events.d \ No newline at end of file
diff --git a/Bin/j_flow.d b/Bin/j_flow.d
new file mode 120000
index 000000000000..852a740c83bd
--- /dev/null
+++ b/Bin/j_flow.d
@@ -0,0 +1 @@
+../Java/j_flow.d \ No newline at end of file
diff --git a/Bin/j_flowtime.d b/Bin/j_flowtime.d
new file mode 120000
index 000000000000..c0f9faeed015
--- /dev/null
+++ b/Bin/j_flowtime.d
@@ -0,0 +1 @@
+../Java/j_flowtime.d \ No newline at end of file
diff --git a/Bin/j_methodcalls.d b/Bin/j_methodcalls.d
new file mode 120000
index 000000000000..9e5e17f43288
--- /dev/null
+++ b/Bin/j_methodcalls.d
@@ -0,0 +1 @@
+../Java/j_methodcalls.d \ No newline at end of file
diff --git a/Bin/j_objnew.d b/Bin/j_objnew.d
new file mode 120000
index 000000000000..b91ddafd2cb9
--- /dev/null
+++ b/Bin/j_objnew.d
@@ -0,0 +1 @@
+../Java/j_objnew.d \ No newline at end of file
diff --git a/Bin/j_package.d b/Bin/j_package.d
new file mode 120000
index 000000000000..7627671107c8
--- /dev/null
+++ b/Bin/j_package.d
@@ -0,0 +1 @@
+../Java/j_package.d \ No newline at end of file
diff --git a/Bin/j_profile.d b/Bin/j_profile.d
new file mode 120000
index 000000000000..270532ca7971
--- /dev/null
+++ b/Bin/j_profile.d
@@ -0,0 +1 @@
+../Java/j_profile.d \ No newline at end of file
diff --git a/Bin/j_stat.d b/Bin/j_stat.d
new file mode 120000
index 000000000000..128f913603f2
--- /dev/null
+++ b/Bin/j_stat.d
@@ -0,0 +1 @@
+../Java/j_stat.d \ No newline at end of file
diff --git a/Bin/j_syscalls.d b/Bin/j_syscalls.d
new file mode 120000
index 000000000000..fae39687ab58
--- /dev/null
+++ b/Bin/j_syscalls.d
@@ -0,0 +1 @@
+../Java/j_syscalls.d \ No newline at end of file
diff --git a/Bin/j_syscolors.d b/Bin/j_syscolors.d
new file mode 120000
index 000000000000..4acffad372b7
--- /dev/null
+++ b/Bin/j_syscolors.d
@@ -0,0 +1 @@
+../Java/j_syscolors.d \ No newline at end of file
diff --git a/Bin/j_thread.d b/Bin/j_thread.d
new file mode 120000
index 000000000000..f88296ce202f
--- /dev/null
+++ b/Bin/j_thread.d
@@ -0,0 +1 @@
+../Java/j_thread.d \ No newline at end of file
diff --git a/Bin/j_who.d b/Bin/j_who.d
new file mode 120000
index 000000000000..f2aba284055c
--- /dev/null
+++ b/Bin/j_who.d
@@ -0,0 +1 @@
+../Java/j_who.d \ No newline at end of file
diff --git a/Bin/js_calldist.d b/Bin/js_calldist.d
new file mode 120000
index 000000000000..93277b09ba67
--- /dev/null
+++ b/Bin/js_calldist.d
@@ -0,0 +1 @@
+../JavaScript/js_calldist.d \ No newline at end of file
diff --git a/Bin/js_calls.d b/Bin/js_calls.d
new file mode 120000
index 000000000000..9c27755e5f7b
--- /dev/null
+++ b/Bin/js_calls.d
@@ -0,0 +1 @@
+../JavaScript/js_calls.d \ No newline at end of file
diff --git a/Bin/js_calltime.d b/Bin/js_calltime.d
new file mode 120000
index 000000000000..6ec2eedd737d
--- /dev/null
+++ b/Bin/js_calltime.d
@@ -0,0 +1 @@
+../JavaScript/js_calltime.d \ No newline at end of file
diff --git a/Bin/js_cpudist.d b/Bin/js_cpudist.d
new file mode 120000
index 000000000000..2d0c07ab5370
--- /dev/null
+++ b/Bin/js_cpudist.d
@@ -0,0 +1 @@
+../JavaScript/js_cpudist.d \ No newline at end of file
diff --git a/Bin/js_cputime.d b/Bin/js_cputime.d
new file mode 120000
index 000000000000..1c5c716a3b16
--- /dev/null
+++ b/Bin/js_cputime.d
@@ -0,0 +1 @@
+../JavaScript/js_cputime.d \ No newline at end of file
diff --git a/Bin/js_execs.d b/Bin/js_execs.d
new file mode 120000
index 000000000000..2f5c4a6861fd
--- /dev/null
+++ b/Bin/js_execs.d
@@ -0,0 +1 @@
+../JavaScript/js_execs.d \ No newline at end of file
diff --git a/Bin/js_flow.d b/Bin/js_flow.d
new file mode 120000
index 000000000000..ea2f3e78fab5
--- /dev/null
+++ b/Bin/js_flow.d
@@ -0,0 +1 @@
+../JavaScript/js_flow.d \ No newline at end of file
diff --git a/Bin/js_flowinfo.d b/Bin/js_flowinfo.d
new file mode 120000
index 000000000000..0edb8bd84ac8
--- /dev/null
+++ b/Bin/js_flowinfo.d
@@ -0,0 +1 @@
+../JavaScript/js_flowinfo.d \ No newline at end of file
diff --git a/Bin/js_flowtime.d b/Bin/js_flowtime.d
new file mode 120000
index 000000000000..cec488cbfe96
--- /dev/null
+++ b/Bin/js_flowtime.d
@@ -0,0 +1 @@
+../JavaScript/js_flowtime.d \ No newline at end of file
diff --git a/Bin/js_objcpu.d b/Bin/js_objcpu.d
new file mode 120000
index 000000000000..51aacf53ef04
--- /dev/null
+++ b/Bin/js_objcpu.d
@@ -0,0 +1 @@
+../JavaScript/js_objcpu.d \ No newline at end of file
diff --git a/Bin/js_objgc.d b/Bin/js_objgc.d
new file mode 120000
index 000000000000..06f84602208c
--- /dev/null
+++ b/Bin/js_objgc.d
@@ -0,0 +1 @@
+../JavaScript/js_objgc.d \ No newline at end of file
diff --git a/Bin/js_objnew.d b/Bin/js_objnew.d
new file mode 120000
index 000000000000..1a7fc16abac7
--- /dev/null
+++ b/Bin/js_objnew.d
@@ -0,0 +1 @@
+../JavaScript/js_objnew.d \ No newline at end of file
diff --git a/Bin/js_stat.d b/Bin/js_stat.d
new file mode 120000
index 000000000000..b2bc6da5871f
--- /dev/null
+++ b/Bin/js_stat.d
@@ -0,0 +1 @@
+../JavaScript/js_stat.d \ No newline at end of file
diff --git a/Bin/js_who.d b/Bin/js_who.d
new file mode 120000
index 000000000000..40bea74dbd19
--- /dev/null
+++ b/Bin/js_who.d
@@ -0,0 +1 @@
+../JavaScript/js_who.d \ No newline at end of file
diff --git a/Bin/kill.d b/Bin/kill.d
new file mode 120000
index 000000000000..d8c4a73c0d55
--- /dev/null
+++ b/Bin/kill.d
@@ -0,0 +1 @@
+../Proc/kill.d \ No newline at end of file
diff --git a/Bin/kstat_types.d b/Bin/kstat_types.d
new file mode 120000
index 000000000000..156079c0e12c
--- /dev/null
+++ b/Bin/kstat_types.d
@@ -0,0 +1 @@
+../Kernel/kstat_types.d \ No newline at end of file
diff --git a/Bin/lastwords b/Bin/lastwords
new file mode 120000
index 000000000000..54fc3ae2cb8c
--- /dev/null
+++ b/Bin/lastwords
@@ -0,0 +1 @@
+../Proc/lastwords \ No newline at end of file
diff --git a/Bin/loads.d b/Bin/loads.d
new file mode 120000
index 000000000000..842dd94cce0b
--- /dev/null
+++ b/Bin/loads.d
@@ -0,0 +1 @@
+../Cpu/loads.d \ No newline at end of file
diff --git a/Bin/lockbydist.d b/Bin/lockbydist.d
new file mode 120000
index 000000000000..5e9b4a51ea77
--- /dev/null
+++ b/Bin/lockbydist.d
@@ -0,0 +1 @@
+../Locks/lockbydist.d \ No newline at end of file
diff --git a/Bin/lockbyproc.d b/Bin/lockbyproc.d
new file mode 120000
index 000000000000..d16d9412107e
--- /dev/null
+++ b/Bin/lockbyproc.d
@@ -0,0 +1 @@
+../Locks/lockbyproc.d \ No newline at end of file
diff --git a/Bin/minfbypid.d b/Bin/minfbypid.d
new file mode 120000
index 000000000000..b8ccf800e540
--- /dev/null
+++ b/Bin/minfbypid.d
@@ -0,0 +1 @@
+../Mem/minfbypid.d \ No newline at end of file
diff --git a/Bin/minfbyproc.d b/Bin/minfbyproc.d
new file mode 120000
index 000000000000..955320335515
--- /dev/null
+++ b/Bin/minfbyproc.d
@@ -0,0 +1 @@
+../Mem/minfbyproc.d \ No newline at end of file
diff --git a/Bin/mmapfiles.d b/Bin/mmapfiles.d
new file mode 120000
index 000000000000..728fd7551873
--- /dev/null
+++ b/Bin/mmapfiles.d
@@ -0,0 +1 @@
+../Proc/mmapfiles.d \ No newline at end of file
diff --git a/Bin/modcalls.d b/Bin/modcalls.d
new file mode 120000
index 000000000000..fe49549de232
--- /dev/null
+++ b/Bin/modcalls.d
@@ -0,0 +1 @@
+../Kernel/modcalls.d \ No newline at end of file
diff --git a/Bin/newproc.d b/Bin/newproc.d
new file mode 120000
index 000000000000..9387784fc719
--- /dev/null
+++ b/Bin/newproc.d
@@ -0,0 +1 @@
+../Proc/newproc.d \ No newline at end of file
diff --git a/Bin/nfswizard.d b/Bin/nfswizard.d
new file mode 120000
index 000000000000..ddc19d2f8042
--- /dev/null
+++ b/Bin/nfswizard.d
@@ -0,0 +1 @@
+../Apps/nfswizard.d \ No newline at end of file
diff --git a/Bin/opensnoop b/Bin/opensnoop
new file mode 120000
index 000000000000..3fcae8514482
--- /dev/null
+++ b/Bin/opensnoop
@@ -0,0 +1 @@
+../opensnoop \ No newline at end of file
diff --git a/Bin/pathopens.d b/Bin/pathopens.d
new file mode 120000
index 000000000000..21c28a5017ba
--- /dev/null
+++ b/Bin/pathopens.d
@@ -0,0 +1 @@
+../Proc/pathopens.d \ No newline at end of file
diff --git a/Bin/pfilestat b/Bin/pfilestat
new file mode 120000
index 000000000000..333765ff98db
--- /dev/null
+++ b/Bin/pfilestat
@@ -0,0 +1 @@
+../Proc/pfilestat \ No newline at end of file
diff --git a/Bin/pgpginbypid.d b/Bin/pgpginbypid.d
new file mode 120000
index 000000000000..cfa2d799f0bc
--- /dev/null
+++ b/Bin/pgpginbypid.d
@@ -0,0 +1 @@
+../Mem/pgpginbypid.d \ No newline at end of file
diff --git a/Bin/pgpginbyproc.d b/Bin/pgpginbyproc.d
new file mode 120000
index 000000000000..4e9a8b754f58
--- /dev/null
+++ b/Bin/pgpginbyproc.d
@@ -0,0 +1 @@
+../Mem/pgpginbyproc.d \ No newline at end of file
diff --git a/Bin/php_calldist.d b/Bin/php_calldist.d
new file mode 120000
index 000000000000..5ac4b43e2f7f
--- /dev/null
+++ b/Bin/php_calldist.d
@@ -0,0 +1 @@
+../Php/php_calldist.d \ No newline at end of file
diff --git a/Bin/php_calltime.d b/Bin/php_calltime.d
new file mode 120000
index 000000000000..49fb14b78cd9
--- /dev/null
+++ b/Bin/php_calltime.d
@@ -0,0 +1 @@
+../Php/php_calltime.d \ No newline at end of file
diff --git a/Bin/php_cpudist.d b/Bin/php_cpudist.d
new file mode 120000
index 000000000000..6e6595e00e1b
--- /dev/null
+++ b/Bin/php_cpudist.d
@@ -0,0 +1 @@
+../Php/php_cpudist.d \ No newline at end of file
diff --git a/Bin/php_cputime.d b/Bin/php_cputime.d
new file mode 120000
index 000000000000..3e8ccb942b01
--- /dev/null
+++ b/Bin/php_cputime.d
@@ -0,0 +1 @@
+../Php/php_cputime.d \ No newline at end of file
diff --git a/Bin/php_flow.d b/Bin/php_flow.d
new file mode 120000
index 000000000000..fa86f75a0bb4
--- /dev/null
+++ b/Bin/php_flow.d
@@ -0,0 +1 @@
+../Php/php_flow.d \ No newline at end of file
diff --git a/Bin/php_flowinfo.d b/Bin/php_flowinfo.d
new file mode 120000
index 000000000000..52ef64b7f459
--- /dev/null
+++ b/Bin/php_flowinfo.d
@@ -0,0 +1 @@
+../Php/php_flowinfo.d \ No newline at end of file
diff --git a/Bin/php_flowtime.d b/Bin/php_flowtime.d
new file mode 120000
index 000000000000..67dbe844b304
--- /dev/null
+++ b/Bin/php_flowtime.d
@@ -0,0 +1 @@
+../Php/php_flowtime.d \ No newline at end of file
diff --git a/Bin/php_funccalls.d b/Bin/php_funccalls.d
new file mode 120000
index 000000000000..2ba056bfe5e7
--- /dev/null
+++ b/Bin/php_funccalls.d
@@ -0,0 +1 @@
+../Php/php_funccalls.d \ No newline at end of file
diff --git a/Bin/php_malloc.d b/Bin/php_malloc.d
new file mode 120000
index 000000000000..9c51d8344eb2
--- /dev/null
+++ b/Bin/php_malloc.d
@@ -0,0 +1 @@
+../Php/php_malloc.d \ No newline at end of file
diff --git a/Bin/php_syscalls.d b/Bin/php_syscalls.d
new file mode 120000
index 000000000000..6587c4e1c387
--- /dev/null
+++ b/Bin/php_syscalls.d
@@ -0,0 +1 @@
+../Php/php_syscalls.d \ No newline at end of file
diff --git a/Bin/php_syscolors.d b/Bin/php_syscolors.d
new file mode 120000
index 000000000000..463f287a412d
--- /dev/null
+++ b/Bin/php_syscolors.d
@@ -0,0 +1 @@
+../Php/php_syscolors.d \ No newline at end of file
diff --git a/Bin/php_who.d b/Bin/php_who.d
new file mode 120000
index 000000000000..31d6acfd5773
--- /dev/null
+++ b/Bin/php_who.d
@@ -0,0 +1 @@
+../Php/php_who.d \ No newline at end of file
diff --git a/Bin/pidpersec.d b/Bin/pidpersec.d
new file mode 120000
index 000000000000..2ec6eb14514c
--- /dev/null
+++ b/Bin/pidpersec.d
@@ -0,0 +1 @@
+../Proc/pidpersec.d \ No newline at end of file
diff --git a/Bin/pl_calldist.d b/Bin/pl_calldist.d
new file mode 120000
index 000000000000..d5ef923a2672
--- /dev/null
+++ b/Bin/pl_calldist.d
@@ -0,0 +1 @@
+../Perl/pl_calldist.d \ No newline at end of file
diff --git a/Bin/pl_calltime.d b/Bin/pl_calltime.d
new file mode 120000
index 000000000000..38986ec85b66
--- /dev/null
+++ b/Bin/pl_calltime.d
@@ -0,0 +1 @@
+../Perl/pl_calltime.d \ No newline at end of file
diff --git a/Bin/pl_cpudist.d b/Bin/pl_cpudist.d
new file mode 120000
index 000000000000..ce4703602d09
--- /dev/null
+++ b/Bin/pl_cpudist.d
@@ -0,0 +1 @@
+../Perl/pl_cpudist.d \ No newline at end of file
diff --git a/Bin/pl_cputime.d b/Bin/pl_cputime.d
new file mode 120000
index 000000000000..66ea2f7867fe
--- /dev/null
+++ b/Bin/pl_cputime.d
@@ -0,0 +1 @@
+../Perl/pl_cputime.d \ No newline at end of file
diff --git a/Bin/pl_flow.d b/Bin/pl_flow.d
new file mode 120000
index 000000000000..b5d566e1e13a
--- /dev/null
+++ b/Bin/pl_flow.d
@@ -0,0 +1 @@
+../Perl/pl_flow.d \ No newline at end of file
diff --git a/Bin/pl_flowinfo.d b/Bin/pl_flowinfo.d
new file mode 120000
index 000000000000..ad53e51a6c75
--- /dev/null
+++ b/Bin/pl_flowinfo.d
@@ -0,0 +1 @@
+../Perl/pl_flowinfo.d \ No newline at end of file
diff --git a/Bin/pl_flowtime.d b/Bin/pl_flowtime.d
new file mode 120000
index 000000000000..89bee37932e2
--- /dev/null
+++ b/Bin/pl_flowtime.d
@@ -0,0 +1 @@
+../Perl/pl_flowtime.d \ No newline at end of file
diff --git a/Bin/pl_malloc.d b/Bin/pl_malloc.d
new file mode 120000
index 000000000000..025e4ef92f42
--- /dev/null
+++ b/Bin/pl_malloc.d
@@ -0,0 +1 @@
+../Perl/pl_malloc.d \ No newline at end of file
diff --git a/Bin/pl_subcalls.d b/Bin/pl_subcalls.d
new file mode 120000
index 000000000000..350f8c120550
--- /dev/null
+++ b/Bin/pl_subcalls.d
@@ -0,0 +1 @@
+../Perl/pl_subcalls.d \ No newline at end of file
diff --git a/Bin/pl_syscalls.d b/Bin/pl_syscalls.d
new file mode 120000
index 000000000000..a1ab6e5e939d
--- /dev/null
+++ b/Bin/pl_syscalls.d
@@ -0,0 +1 @@
+../Perl/pl_syscalls.d \ No newline at end of file
diff --git a/Bin/pl_syscolors.d b/Bin/pl_syscolors.d
new file mode 120000
index 000000000000..ebc087f4e4a0
--- /dev/null
+++ b/Bin/pl_syscolors.d
@@ -0,0 +1 @@
+../Perl/pl_syscolors.d \ No newline at end of file
diff --git a/Bin/pl_who.d b/Bin/pl_who.d
new file mode 120000
index 000000000000..398de670a223
--- /dev/null
+++ b/Bin/pl_who.d
@@ -0,0 +1 @@
+../Perl/pl_who.d \ No newline at end of file
diff --git a/Bin/priclass.d b/Bin/priclass.d
new file mode 120000
index 000000000000..09cd160a7375
--- /dev/null
+++ b/Bin/priclass.d
@@ -0,0 +1 @@
+../Kernel/priclass.d \ No newline at end of file
diff --git a/Bin/pridist.d b/Bin/pridist.d
new file mode 120000
index 000000000000..3c25cbdd35d9
--- /dev/null
+++ b/Bin/pridist.d
@@ -0,0 +1 @@
+../Kernel/pridist.d \ No newline at end of file
diff --git a/Bin/procsystime b/Bin/procsystime
new file mode 120000
index 000000000000..891c2a1d2f08
--- /dev/null
+++ b/Bin/procsystime
@@ -0,0 +1 @@
+../procsystime \ No newline at end of file
diff --git a/Bin/putnexts.d b/Bin/putnexts.d
new file mode 120000
index 000000000000..23cba6e46535
--- /dev/null
+++ b/Bin/putnexts.d
@@ -0,0 +1 @@
+../Kernel/putnexts.d \ No newline at end of file
diff --git a/Bin/py_calldist.d b/Bin/py_calldist.d
new file mode 120000
index 000000000000..4a007c54fff1
--- /dev/null
+++ b/Bin/py_calldist.d
@@ -0,0 +1 @@
+../Python/py_calldist.d \ No newline at end of file
diff --git a/Bin/py_calltime.d b/Bin/py_calltime.d
new file mode 120000
index 000000000000..6f1c400aba08
--- /dev/null
+++ b/Bin/py_calltime.d
@@ -0,0 +1 @@
+../Python/py_calltime.d \ No newline at end of file
diff --git a/Bin/py_cpudist.d b/Bin/py_cpudist.d
new file mode 120000
index 000000000000..76ce8db570a0
--- /dev/null
+++ b/Bin/py_cpudist.d
@@ -0,0 +1 @@
+../Python/py_cpudist.d \ No newline at end of file
diff --git a/Bin/py_cputime.d b/Bin/py_cputime.d
new file mode 120000
index 000000000000..d11dd87ac40d
--- /dev/null
+++ b/Bin/py_cputime.d
@@ -0,0 +1 @@
+../Python/py_cputime.d \ No newline at end of file
diff --git a/Bin/py_flow.d b/Bin/py_flow.d
new file mode 120000
index 000000000000..bf1485aff777
--- /dev/null
+++ b/Bin/py_flow.d
@@ -0,0 +1 @@
+../Python/py_flow.d \ No newline at end of file
diff --git a/Bin/py_flowinfo.d b/Bin/py_flowinfo.d
new file mode 120000
index 000000000000..adc611499207
--- /dev/null
+++ b/Bin/py_flowinfo.d
@@ -0,0 +1 @@
+../Python/py_flowinfo.d \ No newline at end of file
diff --git a/Bin/py_flowtime.d b/Bin/py_flowtime.d
new file mode 120000
index 000000000000..1ae51db26bf5
--- /dev/null
+++ b/Bin/py_flowtime.d
@@ -0,0 +1 @@
+../Python/py_flowtime.d \ No newline at end of file
diff --git a/Bin/py_funccalls.d b/Bin/py_funccalls.d
new file mode 120000
index 000000000000..81015120f6ab
--- /dev/null
+++ b/Bin/py_funccalls.d
@@ -0,0 +1 @@
+../Python/py_funccalls.d \ No newline at end of file
diff --git a/Bin/py_malloc.d b/Bin/py_malloc.d
new file mode 120000
index 000000000000..ed37a3b05678
--- /dev/null
+++ b/Bin/py_malloc.d
@@ -0,0 +1 @@
+../Python/py_malloc.d \ No newline at end of file
diff --git a/Bin/py_mallocstk.d b/Bin/py_mallocstk.d
new file mode 120000
index 000000000000..d2bb1bbfc71e
--- /dev/null
+++ b/Bin/py_mallocstk.d
@@ -0,0 +1 @@
+../Python/py_mallocstk.d \ No newline at end of file
diff --git a/Bin/py_profile.d b/Bin/py_profile.d
new file mode 120000
index 000000000000..3eb72196f3f0
--- /dev/null
+++ b/Bin/py_profile.d
@@ -0,0 +1 @@
+../Python/py_profile.d \ No newline at end of file
diff --git a/Bin/py_syscalls.d b/Bin/py_syscalls.d
new file mode 120000
index 000000000000..ecf137c31404
--- /dev/null
+++ b/Bin/py_syscalls.d
@@ -0,0 +1 @@
+../Python/py_syscalls.d \ No newline at end of file
diff --git a/Bin/py_syscolors.d b/Bin/py_syscolors.d
new file mode 120000
index 000000000000..6781115d28a3
--- /dev/null
+++ b/Bin/py_syscolors.d
@@ -0,0 +1 @@
+../Python/py_syscolors.d \ No newline at end of file
diff --git a/Bin/py_who.d b/Bin/py_who.d
new file mode 120000
index 000000000000..28db7e5f3e03
--- /dev/null
+++ b/Bin/py_who.d
@@ -0,0 +1 @@
+../Python/py_who.d \ No newline at end of file
diff --git a/Bin/rb_calldist.d b/Bin/rb_calldist.d
new file mode 120000
index 000000000000..8067860713ce
--- /dev/null
+++ b/Bin/rb_calldist.d
@@ -0,0 +1 @@
+../Ruby/rb_calldist.d \ No newline at end of file
diff --git a/Bin/rb_calls.d b/Bin/rb_calls.d
new file mode 120000
index 000000000000..266bacb2bf13
--- /dev/null
+++ b/Bin/rb_calls.d
@@ -0,0 +1 @@
+../Ruby/rb_calls.d \ No newline at end of file
diff --git a/Bin/rb_calltime.d b/Bin/rb_calltime.d
new file mode 120000
index 000000000000..f00df1a616bd
--- /dev/null
+++ b/Bin/rb_calltime.d
@@ -0,0 +1 @@
+../Ruby/rb_calltime.d \ No newline at end of file
diff --git a/Bin/rb_cpudist.d b/Bin/rb_cpudist.d
new file mode 120000
index 000000000000..6e77cc33b7f5
--- /dev/null
+++ b/Bin/rb_cpudist.d
@@ -0,0 +1 @@
+../Ruby/rb_cpudist.d \ No newline at end of file
diff --git a/Bin/rb_cputime.d b/Bin/rb_cputime.d
new file mode 120000
index 000000000000..88d9138ef8f6
--- /dev/null
+++ b/Bin/rb_cputime.d
@@ -0,0 +1 @@
+../Ruby/rb_cputime.d \ No newline at end of file
diff --git a/Bin/rb_flow.d b/Bin/rb_flow.d
new file mode 120000
index 000000000000..1a0f490cde70
--- /dev/null
+++ b/Bin/rb_flow.d
@@ -0,0 +1 @@
+../Ruby/rb_flow.d \ No newline at end of file
diff --git a/Bin/rb_flowinfo.d b/Bin/rb_flowinfo.d
new file mode 120000
index 000000000000..b8130191c8f5
--- /dev/null
+++ b/Bin/rb_flowinfo.d
@@ -0,0 +1 @@
+../Ruby/rb_flowinfo.d \ No newline at end of file
diff --git a/Bin/rb_flowtime.d b/Bin/rb_flowtime.d
new file mode 120000
index 000000000000..911ea08907cf
--- /dev/null
+++ b/Bin/rb_flowtime.d
@@ -0,0 +1 @@
+../Ruby/rb_flowtime.d \ No newline at end of file
diff --git a/Bin/rb_funccalls.d b/Bin/rb_funccalls.d
new file mode 120000
index 000000000000..2a3ac9a4adcf
--- /dev/null
+++ b/Bin/rb_funccalls.d
@@ -0,0 +1 @@
+../Ruby/rb_funccalls.d \ No newline at end of file
diff --git a/Bin/rb_lines.d b/Bin/rb_lines.d
new file mode 120000
index 000000000000..3447ccfedde3
--- /dev/null
+++ b/Bin/rb_lines.d
@@ -0,0 +1 @@
+../Ruby/rb_lines.d \ No newline at end of file
diff --git a/Bin/rb_malloc.d b/Bin/rb_malloc.d
new file mode 120000
index 000000000000..b3e2ba77de96
--- /dev/null
+++ b/Bin/rb_malloc.d
@@ -0,0 +1 @@
+../Ruby/rb_malloc.d \ No newline at end of file
diff --git a/Bin/rb_objcpu.d b/Bin/rb_objcpu.d
new file mode 120000
index 000000000000..ac7d6a22403f
--- /dev/null
+++ b/Bin/rb_objcpu.d
@@ -0,0 +1 @@
+../Ruby/rb_objcpu.d \ No newline at end of file
diff --git a/Bin/rb_objnew.d b/Bin/rb_objnew.d
new file mode 120000
index 000000000000..ca7689888eac
--- /dev/null
+++ b/Bin/rb_objnew.d
@@ -0,0 +1 @@
+../Ruby/rb_objnew.d \ No newline at end of file
diff --git a/Bin/rb_stat.d b/Bin/rb_stat.d
new file mode 120000
index 000000000000..7a0e2aef1101
--- /dev/null
+++ b/Bin/rb_stat.d
@@ -0,0 +1 @@
+../Ruby/rb_stat.d \ No newline at end of file
diff --git a/Bin/rb_syscalls.d b/Bin/rb_syscalls.d
new file mode 120000
index 000000000000..1b15e57e4647
--- /dev/null
+++ b/Bin/rb_syscalls.d
@@ -0,0 +1 @@
+../Ruby/rb_syscalls.d \ No newline at end of file
diff --git a/Bin/rb_syscolors.d b/Bin/rb_syscolors.d
new file mode 120000
index 000000000000..4fd3d6a0c423
--- /dev/null
+++ b/Bin/rb_syscolors.d
@@ -0,0 +1 @@
+../Ruby/rb_syscolors.d \ No newline at end of file
diff --git a/Bin/rb_who.d b/Bin/rb_who.d
new file mode 120000
index 000000000000..effc0ce82217
--- /dev/null
+++ b/Bin/rb_who.d
@@ -0,0 +1 @@
+../Ruby/rb_who.d \ No newline at end of file
diff --git a/Bin/readbytes.d b/Bin/readbytes.d
new file mode 120000
index 000000000000..4b82f0ced66c
--- /dev/null
+++ b/Bin/readbytes.d
@@ -0,0 +1 @@
+../Proc/readbytes.d \ No newline at end of file
diff --git a/Bin/readdist.d b/Bin/readdist.d
new file mode 120000
index 000000000000..d73e49cec889
--- /dev/null
+++ b/Bin/readdist.d
@@ -0,0 +1 @@
+../Proc/readdist.d \ No newline at end of file
diff --git a/Bin/rfileio.d b/Bin/rfileio.d
new file mode 120000
index 000000000000..a73a1bcfbfb9
--- /dev/null
+++ b/Bin/rfileio.d
@@ -0,0 +1 @@
+../FS/rfileio.d \ No newline at end of file
diff --git a/Bin/rfsio.d b/Bin/rfsio.d
new file mode 120000
index 000000000000..2dcbe2cd1493
--- /dev/null
+++ b/Bin/rfsio.d
@@ -0,0 +1 @@
+../FS/rfsio.d \ No newline at end of file
diff --git a/Bin/runocc.d b/Bin/runocc.d
new file mode 120000
index 000000000000..9b856b366296
--- /dev/null
+++ b/Bin/runocc.d
@@ -0,0 +1 @@
+../Cpu/runocc.d \ No newline at end of file
diff --git a/Bin/rwbbypid.d b/Bin/rwbbypid.d
new file mode 120000
index 000000000000..be6540134d50
--- /dev/null
+++ b/Bin/rwbbypid.d
@@ -0,0 +1 @@
+../Proc/rwbbypid.d \ No newline at end of file
diff --git a/Bin/rwbypid.d b/Bin/rwbypid.d
new file mode 120000
index 000000000000..9dcec04b7b39
--- /dev/null
+++ b/Bin/rwbypid.d
@@ -0,0 +1 @@
+../Proc/rwbypid.d \ No newline at end of file
diff --git a/Bin/rwbytype.d b/Bin/rwbytype.d
new file mode 120000
index 000000000000..a02b48d0a46d
--- /dev/null
+++ b/Bin/rwbytype.d
@@ -0,0 +1 @@
+../Proc/rwbytype.d \ No newline at end of file
diff --git a/Bin/rwsnoop b/Bin/rwsnoop
new file mode 120000
index 000000000000..3398d039476f
--- /dev/null
+++ b/Bin/rwsnoop
@@ -0,0 +1 @@
+../rwsnoop \ No newline at end of file
diff --git a/Bin/rwtop b/Bin/rwtop
new file mode 120000
index 000000000000..64e421bd72a5
--- /dev/null
+++ b/Bin/rwtop
@@ -0,0 +1 @@
+../rwtop \ No newline at end of file
diff --git a/Bin/sampleproc b/Bin/sampleproc
new file mode 120000
index 000000000000..7bdd2896b6f2
--- /dev/null
+++ b/Bin/sampleproc
@@ -0,0 +1 @@
+../Proc/sampleproc \ No newline at end of file
diff --git a/Bin/sar-c.d b/Bin/sar-c.d
new file mode 120000
index 000000000000..9a2221025781
--- /dev/null
+++ b/Bin/sar-c.d
@@ -0,0 +1 @@
+../System/sar-c.d \ No newline at end of file
diff --git a/Bin/seeksize.d b/Bin/seeksize.d
new file mode 120000
index 000000000000..3f853d79798c
--- /dev/null
+++ b/Bin/seeksize.d
@@ -0,0 +1 @@
+../Disk/seeksize.d \ No newline at end of file
diff --git a/Bin/setuids.d b/Bin/setuids.d
new file mode 120000
index 000000000000..43dbf8a72365
--- /dev/null
+++ b/Bin/setuids.d
@@ -0,0 +1 @@
+../User/setuids.d \ No newline at end of file
diff --git a/Bin/sh_calldist.d b/Bin/sh_calldist.d
new file mode 120000
index 000000000000..abc69280fe66
--- /dev/null
+++ b/Bin/sh_calldist.d
@@ -0,0 +1 @@
+../Shell/sh_calldist.d \ No newline at end of file
diff --git a/Bin/sh_calls.d b/Bin/sh_calls.d
new file mode 120000
index 000000000000..2fa61317e21c
--- /dev/null
+++ b/Bin/sh_calls.d
@@ -0,0 +1 @@
+../Shell/sh_calls.d \ No newline at end of file
diff --git a/Bin/sh_calltime.d b/Bin/sh_calltime.d
new file mode 120000
index 000000000000..35331d361607
--- /dev/null
+++ b/Bin/sh_calltime.d
@@ -0,0 +1 @@
+../Shell/sh_calltime.d \ No newline at end of file
diff --git a/Bin/sh_cpudist.d b/Bin/sh_cpudist.d
new file mode 120000
index 000000000000..d2fd1ce9d9f0
--- /dev/null
+++ b/Bin/sh_cpudist.d
@@ -0,0 +1 @@
+../Shell/sh_cpudist.d \ No newline at end of file
diff --git a/Bin/sh_cputime.d b/Bin/sh_cputime.d
new file mode 120000
index 000000000000..7188fc50a32e
--- /dev/null
+++ b/Bin/sh_cputime.d
@@ -0,0 +1 @@
+../Shell/sh_cputime.d \ No newline at end of file
diff --git a/Bin/sh_flow.d b/Bin/sh_flow.d
new file mode 120000
index 000000000000..fc02ecf33544
--- /dev/null
+++ b/Bin/sh_flow.d
@@ -0,0 +1 @@
+../Shell/sh_flow.d \ No newline at end of file
diff --git a/Bin/sh_flowinfo.d b/Bin/sh_flowinfo.d
new file mode 120000
index 000000000000..10da77a9e072
--- /dev/null
+++ b/Bin/sh_flowinfo.d
@@ -0,0 +1 @@
+../Shell/sh_flowinfo.d \ No newline at end of file
diff --git a/Bin/sh_flowtime.d b/Bin/sh_flowtime.d
new file mode 120000
index 000000000000..c3c3cb8a0cf8
--- /dev/null
+++ b/Bin/sh_flowtime.d
@@ -0,0 +1 @@
+../Shell/sh_flowtime.d \ No newline at end of file
diff --git a/Bin/sh_lines.d b/Bin/sh_lines.d
new file mode 120000
index 000000000000..918890ebfb93
--- /dev/null
+++ b/Bin/sh_lines.d
@@ -0,0 +1 @@
+../Shell/sh_lines.d \ No newline at end of file
diff --git a/Bin/sh_pidcolors.d b/Bin/sh_pidcolors.d
new file mode 120000
index 000000000000..24ae05471166
--- /dev/null
+++ b/Bin/sh_pidcolors.d
@@ -0,0 +1 @@
+../Shell/sh_pidcolors.d \ No newline at end of file
diff --git a/Bin/sh_stat.d b/Bin/sh_stat.d
new file mode 120000
index 000000000000..0dafd999b0e0
--- /dev/null
+++ b/Bin/sh_stat.d
@@ -0,0 +1 @@
+../Shell/sh_stat.d \ No newline at end of file
diff --git a/Bin/sh_syscalls.d b/Bin/sh_syscalls.d
new file mode 120000
index 000000000000..0402c76e8e02
--- /dev/null
+++ b/Bin/sh_syscalls.d
@@ -0,0 +1 @@
+../Shell/sh_syscalls.d \ No newline at end of file
diff --git a/Bin/sh_syscolors.d b/Bin/sh_syscolors.d
new file mode 120000
index 000000000000..c79f82883525
--- /dev/null
+++ b/Bin/sh_syscolors.d
@@ -0,0 +1 @@
+../Shell/sh_syscolors.d \ No newline at end of file
diff --git a/Bin/sh_wasted.d b/Bin/sh_wasted.d
new file mode 120000
index 000000000000..564fc98adfeb
--- /dev/null
+++ b/Bin/sh_wasted.d
@@ -0,0 +1 @@
+../Shell/sh_wasted.d \ No newline at end of file
diff --git a/Bin/sh_who.d b/Bin/sh_who.d
new file mode 120000
index 000000000000..ca00fab11e4d
--- /dev/null
+++ b/Bin/sh_who.d
@@ -0,0 +1 @@
+../Shell/sh_who.d \ No newline at end of file
diff --git a/Bin/shellsnoop b/Bin/shellsnoop
new file mode 120000
index 000000000000..84169abed066
--- /dev/null
+++ b/Bin/shellsnoop
@@ -0,0 +1 @@
+../Apps/shellsnoop \ No newline at end of file
diff --git a/Bin/shortlived.d b/Bin/shortlived.d
new file mode 120000
index 000000000000..6c234cf6dc4b
--- /dev/null
+++ b/Bin/shortlived.d
@@ -0,0 +1 @@
+../Proc/shortlived.d \ No newline at end of file
diff --git a/Bin/sigdist.d b/Bin/sigdist.d
new file mode 120000
index 000000000000..838da2686546
--- /dev/null
+++ b/Bin/sigdist.d
@@ -0,0 +1 @@
+../Proc/sigdist.d \ No newline at end of file
diff --git a/Bin/stacksize.d b/Bin/stacksize.d
new file mode 120000
index 000000000000..cb6fec40bb79
--- /dev/null
+++ b/Bin/stacksize.d
@@ -0,0 +1 @@
+../Proc/stacksize.d \ No newline at end of file
diff --git a/Bin/statsnoop b/Bin/statsnoop
new file mode 120000
index 000000000000..445e361554aa
--- /dev/null
+++ b/Bin/statsnoop
@@ -0,0 +1 @@
+../statsnoop \ No newline at end of file
diff --git a/Bin/swapinfo.d b/Bin/swapinfo.d
new file mode 120000
index 000000000000..e5cd10f76920
--- /dev/null
+++ b/Bin/swapinfo.d
@@ -0,0 +1 @@
+../Mem/swapinfo.d \ No newline at end of file
diff --git a/Bin/sysbypid.d b/Bin/sysbypid.d
new file mode 120000
index 000000000000..761ada95b82f
--- /dev/null
+++ b/Bin/sysbypid.d
@@ -0,0 +1 @@
+../Proc/sysbypid.d \ No newline at end of file
diff --git a/Bin/syscallbypid.d b/Bin/syscallbypid.d
new file mode 120000
index 000000000000..eca83c7bf2d6
--- /dev/null
+++ b/Bin/syscallbypid.d
@@ -0,0 +1 @@
+../Proc/syscallbypid.d \ No newline at end of file
diff --git a/Bin/syscallbyproc.d b/Bin/syscallbyproc.d
new file mode 120000
index 000000000000..0260655574bb
--- /dev/null
+++ b/Bin/syscallbyproc.d
@@ -0,0 +1 @@
+../Proc/syscallbyproc.d \ No newline at end of file
diff --git a/Bin/syscallbysysc.d b/Bin/syscallbysysc.d
new file mode 120000
index 000000000000..43258f1ebdc4
--- /dev/null
+++ b/Bin/syscallbysysc.d
@@ -0,0 +1 @@
+../System/syscallbysysc.d \ No newline at end of file
diff --git a/Bin/tcl_calldist.d b/Bin/tcl_calldist.d
new file mode 120000
index 000000000000..6e3cf23de470
--- /dev/null
+++ b/Bin/tcl_calldist.d
@@ -0,0 +1 @@
+../Tcl/tcl_calldist.d \ No newline at end of file
diff --git a/Bin/tcl_calls.d b/Bin/tcl_calls.d
new file mode 120000
index 000000000000..3a48d0b3eda1
--- /dev/null
+++ b/Bin/tcl_calls.d
@@ -0,0 +1 @@
+../Tcl/tcl_calls.d \ No newline at end of file
diff --git a/Bin/tcl_calltime.d b/Bin/tcl_calltime.d
new file mode 120000
index 000000000000..32cead5d1edc
--- /dev/null
+++ b/Bin/tcl_calltime.d
@@ -0,0 +1 @@
+../Tcl/tcl_calltime.d \ No newline at end of file
diff --git a/Bin/tcl_cpudist.d b/Bin/tcl_cpudist.d
new file mode 120000
index 000000000000..1724115a9b64
--- /dev/null
+++ b/Bin/tcl_cpudist.d
@@ -0,0 +1 @@
+../Tcl/tcl_cpudist.d \ No newline at end of file
diff --git a/Bin/tcl_cputime.d b/Bin/tcl_cputime.d
new file mode 120000
index 000000000000..e8269db5c879
--- /dev/null
+++ b/Bin/tcl_cputime.d
@@ -0,0 +1 @@
+../Tcl/tcl_cputime.d \ No newline at end of file
diff --git a/Bin/tcl_flow.d b/Bin/tcl_flow.d
new file mode 120000
index 000000000000..4f3e01f16541
--- /dev/null
+++ b/Bin/tcl_flow.d
@@ -0,0 +1 @@
+../Tcl/tcl_flow.d \ No newline at end of file
diff --git a/Bin/tcl_flowtime.d b/Bin/tcl_flowtime.d
new file mode 120000
index 000000000000..3664f7a1100e
--- /dev/null
+++ b/Bin/tcl_flowtime.d
@@ -0,0 +1 @@
+../Tcl/tcl_flowtime.d \ No newline at end of file
diff --git a/Bin/tcl_ins.d b/Bin/tcl_ins.d
new file mode 120000
index 000000000000..d7480340a0ff
--- /dev/null
+++ b/Bin/tcl_ins.d
@@ -0,0 +1 @@
+../Tcl/tcl_ins.d \ No newline at end of file
diff --git a/Bin/tcl_insflow.d b/Bin/tcl_insflow.d
new file mode 120000
index 000000000000..9f716bda057e
--- /dev/null
+++ b/Bin/tcl_insflow.d
@@ -0,0 +1 @@
+../Tcl/tcl_insflow.d \ No newline at end of file
diff --git a/Bin/tcl_proccalls.d b/Bin/tcl_proccalls.d
new file mode 120000
index 000000000000..704e0b5cf20f
--- /dev/null
+++ b/Bin/tcl_proccalls.d
@@ -0,0 +1 @@
+../Tcl/tcl_proccalls.d \ No newline at end of file
diff --git a/Bin/tcl_procflow.d b/Bin/tcl_procflow.d
new file mode 120000
index 000000000000..51da9dcd15bf
--- /dev/null
+++ b/Bin/tcl_procflow.d
@@ -0,0 +1 @@
+../Tcl/tcl_procflow.d \ No newline at end of file
diff --git a/Bin/tcl_stat.d b/Bin/tcl_stat.d
new file mode 120000
index 000000000000..7f9659a2e8c1
--- /dev/null
+++ b/Bin/tcl_stat.d
@@ -0,0 +1 @@
+../Tcl/tcl_stat.d \ No newline at end of file
diff --git a/Bin/tcl_syscalls.d b/Bin/tcl_syscalls.d
new file mode 120000
index 000000000000..aec76739ca2c
--- /dev/null
+++ b/Bin/tcl_syscalls.d
@@ -0,0 +1 @@
+../Tcl/tcl_syscalls.d \ No newline at end of file
diff --git a/Bin/tcl_syscolors.d b/Bin/tcl_syscolors.d
new file mode 120000
index 000000000000..890ea5ff3a2c
--- /dev/null
+++ b/Bin/tcl_syscolors.d
@@ -0,0 +1 @@
+../Tcl/tcl_syscolors.d \ No newline at end of file
diff --git a/Bin/tcl_who.d b/Bin/tcl_who.d
new file mode 120000
index 000000000000..7917b5ed7bab
--- /dev/null
+++ b/Bin/tcl_who.d
@@ -0,0 +1 @@
+../Tcl/tcl_who.d \ No newline at end of file
diff --git a/Bin/tcpsnoop b/Bin/tcpsnoop
new file mode 120000
index 000000000000..7f7b37d4394d
--- /dev/null
+++ b/Bin/tcpsnoop
@@ -0,0 +1 @@
+../Net/tcpsnoop \ No newline at end of file
diff --git a/Bin/tcpsnoop.d b/Bin/tcpsnoop.d
new file mode 120000
index 000000000000..ad9ccf93a10d
--- /dev/null
+++ b/Bin/tcpsnoop.d
@@ -0,0 +1 @@
+../Net/tcpsnoop.d \ No newline at end of file
diff --git a/Bin/tcpsnoop_snv b/Bin/tcpsnoop_snv
new file mode 120000
index 000000000000..7ea5a09274d6
--- /dev/null
+++ b/Bin/tcpsnoop_snv
@@ -0,0 +1 @@
+../Net/tcpsnoop_snv \ No newline at end of file
diff --git a/Bin/tcpsnoop_snv.d b/Bin/tcpsnoop_snv.d
new file mode 120000
index 000000000000..a2321e0d5947
--- /dev/null
+++ b/Bin/tcpsnoop_snv.d
@@ -0,0 +1 @@
+../Net/tcpsnoop_snv.d \ No newline at end of file
diff --git a/Bin/tcpstat.d b/Bin/tcpstat.d
new file mode 120000
index 000000000000..176f0e322756
--- /dev/null
+++ b/Bin/tcpstat.d
@@ -0,0 +1 @@
+../Net/tcpstat.d \ No newline at end of file
diff --git a/Bin/tcptop b/Bin/tcptop
new file mode 120000
index 000000000000..a97fec359309
--- /dev/null
+++ b/Bin/tcptop
@@ -0,0 +1 @@
+../Net/tcptop \ No newline at end of file
diff --git a/Bin/tcptop_snv b/Bin/tcptop_snv
new file mode 120000
index 000000000000..ad75a7b77596
--- /dev/null
+++ b/Bin/tcptop_snv
@@ -0,0 +1 @@
+../Net/tcptop_snv \ No newline at end of file
diff --git a/Bin/tcpwdist.d b/Bin/tcpwdist.d
new file mode 120000
index 000000000000..0be2a4139776
--- /dev/null
+++ b/Bin/tcpwdist.d
@@ -0,0 +1 @@
+../Net/tcpwdist.d \ No newline at end of file
diff --git a/Bin/threaded.d b/Bin/threaded.d
new file mode 120000
index 000000000000..b9febd847996
--- /dev/null
+++ b/Bin/threaded.d
@@ -0,0 +1 @@
+../Proc/threaded.d \ No newline at end of file
diff --git a/Bin/topsyscall b/Bin/topsyscall
new file mode 120000
index 000000000000..b9a2eec61fac
--- /dev/null
+++ b/Bin/topsyscall
@@ -0,0 +1 @@
+../System/topsyscall \ No newline at end of file
diff --git a/Bin/topsysproc b/Bin/topsysproc
new file mode 120000
index 000000000000..d523f507cf9e
--- /dev/null
+++ b/Bin/topsysproc
@@ -0,0 +1 @@
+../Proc/topsysproc \ No newline at end of file
diff --git a/Bin/udpstat.d b/Bin/udpstat.d
new file mode 120000
index 000000000000..11d0bca5f36f
--- /dev/null
+++ b/Bin/udpstat.d
@@ -0,0 +1 @@
+../Net/udpstat.d \ No newline at end of file
diff --git a/Bin/uname-a.d b/Bin/uname-a.d
new file mode 120000
index 000000000000..11251757f57e
--- /dev/null
+++ b/Bin/uname-a.d
@@ -0,0 +1 @@
+../System/uname-a.d \ No newline at end of file
diff --git a/Bin/vmbypid.d b/Bin/vmbypid.d
new file mode 120000
index 000000000000..16e5ac4edadb
--- /dev/null
+++ b/Bin/vmbypid.d
@@ -0,0 +1 @@
+../Mem/vmbypid.d \ No newline at end of file
diff --git a/Bin/vmstat-p.d b/Bin/vmstat-p.d
new file mode 120000
index 000000000000..a75e5a1b1544
--- /dev/null
+++ b/Bin/vmstat-p.d
@@ -0,0 +1 @@
+../Mem/vmstat-p.d \ No newline at end of file
diff --git a/Bin/vmstat.d b/Bin/vmstat.d
new file mode 120000
index 000000000000..395ba5f80858
--- /dev/null
+++ b/Bin/vmstat.d
@@ -0,0 +1 @@
+../Mem/vmstat.d \ No newline at end of file
diff --git a/Bin/vopstat b/Bin/vopstat
new file mode 120000
index 000000000000..f38b57905d6e
--- /dev/null
+++ b/Bin/vopstat
@@ -0,0 +1 @@
+../FS/vopstat \ No newline at end of file
diff --git a/Bin/weblatency.d b/Bin/weblatency.d
new file mode 120000
index 000000000000..c16bb2ee361b
--- /dev/null
+++ b/Bin/weblatency.d
@@ -0,0 +1 @@
+../Apps/weblatency.d \ No newline at end of file
diff --git a/Bin/whatexec.d b/Bin/whatexec.d
new file mode 120000
index 000000000000..660ff83826b7
--- /dev/null
+++ b/Bin/whatexec.d
@@ -0,0 +1 @@
+../Kernel/whatexec.d \ No newline at end of file
diff --git a/Bin/woof.d b/Bin/woof.d
new file mode 120000
index 000000000000..a380d7c2f2ca
--- /dev/null
+++ b/Bin/woof.d
@@ -0,0 +1 @@
+../Misc/woof.d \ No newline at end of file
diff --git a/Bin/wpm.d b/Bin/wpm.d
new file mode 120000
index 000000000000..fee9c99a1efb
--- /dev/null
+++ b/Bin/wpm.d
@@ -0,0 +1 @@
+../Misc/wpm.d \ No newline at end of file
diff --git a/Bin/writebytes.d b/Bin/writebytes.d
new file mode 120000
index 000000000000..586cbd75ba86
--- /dev/null
+++ b/Bin/writebytes.d
@@ -0,0 +1 @@
+../Proc/writebytes.d \ No newline at end of file
diff --git a/Bin/writedist.d b/Bin/writedist.d
new file mode 120000
index 000000000000..3710f132fe16
--- /dev/null
+++ b/Bin/writedist.d
@@ -0,0 +1 @@
+../Proc/writedist.d \ No newline at end of file
diff --git a/Bin/xcallsbypid.d b/Bin/xcallsbypid.d
new file mode 120000
index 000000000000..08c7feca8235
--- /dev/null
+++ b/Bin/xcallsbypid.d
@@ -0,0 +1 @@
+../Cpu/xcallsbypid.d \ No newline at end of file
diff --git a/Bin/xvmstat b/Bin/xvmstat
new file mode 120000
index 000000000000..24008fbb4672
--- /dev/null
+++ b/Bin/xvmstat
@@ -0,0 +1 @@
+../Mem/xvmstat \ No newline at end of file
diff --git a/Bin/zvmstat b/Bin/zvmstat
new file mode 120000
index 000000000000..41c7dbbb31e0
--- /dev/null
+++ b/Bin/zvmstat
@@ -0,0 +1 @@
+../Zones/zvmstat \ No newline at end of file
diff --git a/Code/Java/Func_abc.java b/Code/Java/Func_abc.java
new file mode 100644
index 000000000000..c14012e4988e
--- /dev/null
+++ b/Code/Java/Func_abc.java
@@ -0,0 +1,26 @@
+public class Func_abc {
+ public static void func_c() {
+ System.out.println("Function C");
+ try {
+ Thread.currentThread().sleep(1000);
+ } catch (Exception e) { }
+ }
+ public static void func_b() {
+ System.out.println("Function B");
+ try {
+ Thread.currentThread().sleep(1000);
+ } catch (Exception e) { }
+ func_c();
+ }
+ public static void func_a() {
+ System.out.println("Function A");
+ try {
+ Thread.currentThread().sleep(1000);
+ } catch (Exception e) { }
+ func_b();
+ }
+
+ public static void main(String[] args) {
+ func_a();
+ }
+}
diff --git a/Code/Java/Func_loop.java b/Code/Java/Func_loop.java
new file mode 100644
index 000000000000..81be852bb7f1
--- /dev/null
+++ b/Code/Java/Func_loop.java
@@ -0,0 +1,19 @@
+public class Func_loop {
+ public static void func_c() {
+ System.out.println("Function C");
+ while (true) {
+ }
+ }
+ public static void func_b() {
+ System.out.println("Function B");
+ func_c();
+ }
+ public static void func_a() {
+ System.out.println("Function A");
+ func_b();
+ }
+
+ public static void main(String[] args) {
+ func_a();
+ }
+}
diff --git a/Code/JavaScript/func_clock.html b/Code/JavaScript/func_clock.html
new file mode 100644
index 000000000000..c25610b30f2c
--- /dev/null
+++ b/Code/JavaScript/func_clock.html
@@ -0,0 +1,39 @@
+<HTML>
+<HEAD>
+<TITLE>func_clock, JavaScript</TITLE>
+<SCRIPT type="text/javascript">
+function func_c() {
+ document.getElementById('now').innerHTML += "Function C<br>"
+ for (i = 0; i < 30000; i++) {
+ j = i + 1
+ }
+}
+
+function func_b() {
+ document.getElementById('now').innerHTML += "Function B<br>"
+ for (i = 0; i < 20000; i++) {
+ j = i + 1
+ }
+ func_c()
+}
+
+function func_a() {
+ document.getElementById('now').innerHTML += "Function A<br>"
+ for (i = 0; i < 10000; i++) {
+ j = i + 1
+ }
+ func_b()
+}
+
+function start() {
+ now = new Date()
+ document.getElementById('now').innerHTML = now + "<br>"
+ func_a()
+ var timeout = setTimeout('start()', 1000)
+}
+</SCRIPT>
+</HEAD>
+<BODY onload="start()">
+<DIV id="now"></DIV>
+</BODY>
+</HTML>
diff --git a/Code/JavaScript/func_slow.html b/Code/JavaScript/func_slow.html
new file mode 100644
index 000000000000..14fdfda3870c
--- /dev/null
+++ b/Code/JavaScript/func_slow.html
@@ -0,0 +1,31 @@
+<HTML>
+<HEAD><TITLE>func_slow, JavaScript</TITLE></HEAD>
+<BODY>
+<SCRIPT type="text/javascript">
+function func_c() {
+ document.write("Function C<br>")
+ for (i = 0; i < 30000; i++) {
+ j = i + 1
+ }
+}
+
+function func_b() {
+ document.write("Function B<br>")
+ for (i = 0; i < 20000; i++) {
+ j = i + 1
+ }
+ func_c()
+}
+
+function func_a() {
+ document.write("Function A<br>")
+ for (i = 0; i < 10000; i++) {
+ j = i + 1
+ }
+ func_b()
+}
+
+func_a()
+</SCRIPT>
+</BODY>
+</HTML>
diff --git a/Code/Perl/func_abc.pl b/Code/Perl/func_abc.pl
new file mode 100755
index 000000000000..394f1c2b245a
--- /dev/null
+++ b/Code/Perl/func_abc.pl
@@ -0,0 +1,20 @@
+#!./perl -w
+
+sub func_c {
+ print "Function C\n";
+ sleep 1;
+}
+
+sub func_b {
+ print "Function B\n";
+ sleep 1;
+ func_c();
+}
+
+sub func_a {
+ print "Function A\n";
+ sleep 1;
+ func_b();
+}
+
+func_a();
diff --git a/Code/Perl/func_malloc.pl b/Code/Perl/func_malloc.pl
new file mode 100755
index 000000000000..5340c82b2cdc
--- /dev/null
+++ b/Code/Perl/func_malloc.pl
@@ -0,0 +1,18 @@
+#!./perl -w
+
+sub func_c {
+ print "Function C\n";
+}
+
+sub func_b {
+ print "Function B\n";
+ my $b = "B" x 100_000;
+ func_c();
+}
+
+sub func_a {
+ print "Function A\n";
+ func_b();
+}
+
+func_a();
diff --git a/Code/Perl/func_slow.pl b/Code/Perl/func_slow.pl
new file mode 100755
index 000000000000..f32d09ed9bf8
--- /dev/null
+++ b/Code/Perl/func_slow.pl
@@ -0,0 +1,20 @@
+#!./perl -w
+
+sub func_c {
+ print "Function C\n";
+ for (my $i = 0; $i < 3000000; $i++) { my $j = $i + 1; }
+}
+
+sub func_b {
+ print "Function B\n";
+ for (my $i = 0; $i < 2000000; $i++) { my $j = $i + 1 ; }
+ func_c();
+}
+
+sub func_a {
+ print "Function A\n";
+ for (my $i = 0; $i < 1000000; $i++) { my $j = $i + 1; }
+ func_b();
+}
+
+func_a();
diff --git a/Code/Perl/hello.pl b/Code/Perl/hello.pl
new file mode 100755
index 000000000000..3ca70a2847c8
--- /dev/null
+++ b/Code/Perl/hello.pl
@@ -0,0 +1,3 @@
+#!./perl
+
+print "Hello World!\n";
diff --git a/Code/Perl/hello_strict.pl b/Code/Perl/hello_strict.pl
new file mode 100755
index 000000000000..78003a971448
--- /dev/null
+++ b/Code/Perl/hello_strict.pl
@@ -0,0 +1,5 @@
+#!./perl -w
+
+use strict;
+
+print "Hello World!\n";
diff --git a/Code/Php/func_abc.php b/Code/Php/func_abc.php
new file mode 100644
index 000000000000..916561157881
--- /dev/null
+++ b/Code/Php/func_abc.php
@@ -0,0 +1,23 @@
+<?php
+function func_c()
+{
+ echo "Function C\n";
+ sleep(1);
+}
+
+function func_b()
+{
+ echo "Function B\n";
+ sleep(1);
+ func_c();
+}
+
+function func_a()
+{
+ echo "Function A\n";
+ sleep(1);
+ func_b();
+}
+
+func_a();
+?>
diff --git a/Code/Python/func_abc.py b/Code/Python/func_abc.py
new file mode 100755
index 000000000000..0d4919fb8930
--- /dev/null
+++ b/Code/Python/func_abc.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+
+import time
+
+def func_c():
+ print "Function C"
+ time.sleep(1)
+
+def func_b():
+ print "Function B"
+ time.sleep(1)
+ func_c()
+
+def func_a():
+ print "Function A"
+ time.sleep(1)
+ func_b()
+
+func_a()
diff --git a/Code/Python/func_slow.py b/Code/Python/func_slow.py
new file mode 100755
index 000000000000..9cba9c5b1204
--- /dev/null
+++ b/Code/Python/func_slow.py
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+
+def func_c():
+ print "Function C"
+ i = 0
+ while (i < 3000000):
+ i = i + 1
+ j = i + 1
+
+def func_b():
+ print "Function B"
+ i = 0
+ while (i < 2000000):
+ i = i + 1
+ j = i + 1
+ func_c()
+
+def func_a():
+ print "Function A"
+ i = 0
+ while (i < 1000000):
+ i = i + 1
+ j = i + 1
+ func_b()
+
+func_a()
diff --git a/Code/Readme b/Code/Readme
new file mode 100644
index 000000000000..f8b16d79b7e4
--- /dev/null
+++ b/Code/Readme
@@ -0,0 +1,16 @@
+Code - Example Programs
+
+ This directory contains example software sorted by language, which may
+ be used as the target for DTrace scripts. These examples are simple and
+ to the point, and are intended as example targets for when learing
+ DTrace.
+
+ Some people attempt to learn DTrace by tracing their complex real
+ world application first. That's the hard way. Try these programs instead,
+ and once you are confident here, move onto harder targets.
+
+ Some of these programs feature in the example files in the /Examples
+ directory.
+
+ This directory does not contain DTrace scripts.
+
diff --git a/Code/Ruby/func_abc.rb b/Code/Ruby/func_abc.rb
new file mode 100755
index 000000000000..75adaf9f7ff1
--- /dev/null
+++ b/Code/Ruby/func_abc.rb
@@ -0,0 +1,20 @@
+#!./ruby -w
+
+def func_c
+ print "Function C\n"
+ sleep 1
+end
+
+def func_b
+ print "Function B\n"
+ sleep 1
+ func_c
+end
+
+def func_a
+ print "Function A\n"
+ sleep 1
+ func_b
+end
+
+func_a
diff --git a/Code/Ruby/func_slow.rb b/Code/Ruby/func_slow.rb
new file mode 100755
index 000000000000..87a498c6a3b1
--- /dev/null
+++ b/Code/Ruby/func_slow.rb
@@ -0,0 +1,32 @@
+#!./ruby -w
+
+def func_c
+ print "Function C\n"
+ i = 0
+ while i < 300000
+ i = i + 1
+ j = i + 1
+ end
+end
+
+def func_b
+ print "Function B\n"
+ i = 0
+ while i < 200000
+ i = i + 1
+ j = i + 1
+ end
+ func_c
+end
+
+def func_a
+ print "Function A\n"
+ i = 0
+ while i < 100000
+ i = i + 1
+ j = i + 1
+ end
+ func_b
+end
+
+func_a
diff --git a/Code/Shell/func_abc.sh b/Code/Shell/func_abc.sh
new file mode 100755
index 000000000000..b44ce570ab93
--- /dev/null
+++ b/Code/Shell/func_abc.sh
@@ -0,0 +1,23 @@
+#!./sh
+
+func_c()
+{
+ echo "Function C"
+ sleep 1
+}
+
+func_b()
+{
+ echo "Function B"
+ sleep 1
+ func_c
+}
+
+func_a()
+{
+ echo "Function A"
+ sleep 1
+ func_b
+}
+
+func_a
diff --git a/Code/Shell/func_slow.sh b/Code/Shell/func_slow.sh
new file mode 100755
index 000000000000..3407646f9c64
--- /dev/null
+++ b/Code/Shell/func_slow.sh
@@ -0,0 +1,35 @@
+#!./sh
+
+func_c()
+{
+ echo "Function C"
+ i=0
+ while [ $i -lt 300 ]
+ do
+ i=`expr $i + 1`
+ done
+}
+
+func_b()
+{
+ echo "Function B"
+ i=0
+ while [ $i -lt 200 ]
+ do
+ i=`expr $i + 1`
+ done
+ func_c
+}
+
+func_a()
+{
+ echo "Function A"
+ i=0
+ while [ $i -lt 100 ]
+ do
+ i=`expr $i + 1`
+ done
+ func_b
+}
+
+func_a
diff --git a/Code/Shell/func_waste.sh b/Code/Shell/func_waste.sh
new file mode 100755
index 000000000000..bfeeecb4ef4e
--- /dev/null
+++ b/Code/Shell/func_waste.sh
@@ -0,0 +1,23 @@
+#!./sh
+
+func_c()
+{
+ /usr/bin/echo "Function C"
+ sleep 1
+}
+
+func_b()
+{
+ /usr/bin/echo "Function B"
+ sleep 1
+ func_c
+}
+
+func_a()
+{
+ /usr/bin/echo "Function A"
+ sleep 1
+ func_b
+}
+
+func_a
diff --git a/Code/Tcl/func_abc.tcl b/Code/Tcl/func_abc.tcl
new file mode 100644
index 000000000000..c84acb074882
--- /dev/null
+++ b/Code/Tcl/func_abc.tcl
@@ -0,0 +1,20 @@
+#!./tclsh
+
+proc func_c {} {
+ puts "Function C"
+ after 1000
+}
+
+proc func_b {} {
+ puts "Function B"
+ after 1000
+ func_c
+}
+
+proc func_a {} {
+ puts "Function A"
+ after 1000
+ func_b
+}
+
+func_a
diff --git a/Code/Tcl/func_slow.tcl b/Code/Tcl/func_slow.tcl
new file mode 100644
index 000000000000..d4fc59894680
--- /dev/null
+++ b/Code/Tcl/func_slow.tcl
@@ -0,0 +1,29 @@
+#!./tclsh
+
+proc func_c {} {
+ puts "Function C"
+ set i 0
+ while {$i < 300000} {
+ set i [expr $i + 1]
+ }
+}
+
+proc func_b {} {
+ puts "Function B"
+ set i 0
+ while {$i < 200000} {
+ set i [expr $i + 1]
+ }
+ func_c
+}
+
+proc func_a {} {
+ puts "Function A"
+ set i 0
+ while {$i < 100000} {
+ set i [expr $i + 1]
+ }
+ func_b
+}
+
+func_a
diff --git a/Cpu/Readme b/Cpu/Readme
new file mode 100644
index 000000000000..e0f8698c71b2
--- /dev/null
+++ b/Cpu/Readme
@@ -0,0 +1,3 @@
+Cpu - CPU based analysis
+
+ This would include activity by CPU.
diff --git a/Cpu/cputypes.d b/Cpu/cputypes.d
new file mode 100755
index 000000000000..213af9efa935
--- /dev/null
+++ b/Cpu/cputypes.d
@@ -0,0 +1,66 @@
+#!/usr/sbin/dtrace -s
+/*
+ * cputypes.d - list CPU type info.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * $Id: cputypes.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: cputypes.d
+ *
+ * FIELDS:
+ * CPU CPU ID
+ * CHIP chip ID
+ * PSET processor set ID
+ * LGRP latency group ID
+ * CLOCK clock speed, MHz
+ * TYPE CPU type
+ * FPU floating point identifier types
+ *
+ * SEE ALSO: psrinfo(1M)
+ * /usr/include/sys/processor.h
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 27-Jun-2005 Brendan Gregg Created this.
+ * 27-Jun-2005 " " Last update.
+ */
+
+#pragma D option quiet
+#pragma D option bufsize=64k
+
+dtrace:::BEGIN
+{
+ printf("%4s %4s %4s %4s %6s %-16s %s\n",
+ "CPU", "CHIP", "PSET", "LGRP", "CLOCK", "TYPE", "FPU");
+ done[0] = 0;
+}
+
+profile:::profile-10ms
+/done[cpu] == 0/
+{
+ printf("%4d %4d %4d %4d %6d %-16s %s\n",
+ cpu, curcpu->cpu_chip, curcpu->cpu_pset,
+ curcpu->cpu_lgrp, curcpu->cpu_info.pi_clock,
+ stringof(curcpu->cpu_info.pi_processor_type),
+ stringof(curcpu->cpu_info.pi_fputypes));
+ done[cpu]++;
+}
+
+profile:::tick-100ms
+{
+ exit(0);
+}
diff --git a/Cpu/cpuwalk.d b/Cpu/cpuwalk.d
new file mode 100755
index 000000000000..495f64bb5f95
--- /dev/null
+++ b/Cpu/cpuwalk.d
@@ -0,0 +1,72 @@
+#!/usr/sbin/dtrace -s
+/*
+ * cpuwalk.d - Measure which CPUs a process runs on.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This program is for multi-CPU servers, and can help identify if a process
+ * is running on multiple CPUs concurrently or not.
+ *
+ * $Id: cpuwalk.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: cpuwalk.d [duration]
+ * eg,
+ * cpuwalk.d 10 # sample for 10 seconds
+ * cpuwalk.d # sample until Ctrl-C is hit
+ *
+ * FIELDS:
+ * value CPU id
+ * count Number of 1000 hz samples on this CPU
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 22-Sep-2005 Brendan Gregg Created this.
+ * 14-Feb-2006 " " Last update.
+ */
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+inline int MAXCPUID = 1024;
+
+dtrace:::BEGIN
+{
+ $1 ? printf("Sampling...\n") :
+ printf("Sampling... Hit Ctrl-C to end.\n");
+ seconds = 0;
+}
+
+profile:::profile-1000hz
+/pid/
+{
+ @sample[pid, execname] = lquantize(cpu, 0, MAXCPUID, 1);
+}
+
+profile:::tick-1sec
+{
+ seconds++;
+}
+
+profile:::tick-1sec
+/seconds == $1/
+{
+ exit(0);
+}
+
+dtrace:::END
+{
+ printa("\n PID: %-8d CMD: %s\n%@d", @sample);
+}
diff --git a/Cpu/dispqlen.d b/Cpu/dispqlen.d
new file mode 100755
index 000000000000..46742c5a02b1
--- /dev/null
+++ b/Cpu/dispqlen.d
@@ -0,0 +1,52 @@
+#!/usr/sbin/dtrace -s
+/*
+ * dispqlen.d - dispatcher queue length by CPU.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * $Id: dispqlen.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: dispqlen.d # hit Ctrl-C to end sample
+ *
+ * NOTES: The dispatcher queue length is an indication of CPU saturation.
+ * It is not an indicatior of utilisation - the CPUs may or may not be
+ * utilised when the dispatcher queue reports a length of zero.
+ *
+ * SEE ALSO: uptime(1M)
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 27-Jun-2005 Brendan Gregg Created this.
+ * 14-Feb-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Sampling... Hit Ctrl-C to end.\n");
+}
+
+profile:::profile-1000hz
+{
+ @queue[cpu] =
+ lquantize(curthread->t_cpu->cpu_disp->disp_nrunnable, 0, 64, 1);
+}
+
+dtrace:::END
+{
+ printa(" CPU %d%@d\n", @queue);
+}
diff --git a/Cpu/intbycpu.d b/Cpu/intbycpu.d
new file mode 100755
index 000000000000..606f40280564
--- /dev/null
+++ b/Cpu/intbycpu.d
@@ -0,0 +1,49 @@
+#!/usr/sbin/dtrace -s
+/*
+ * intbycpu.d - interrupts by CPU.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * $Id: intbycpu.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: intbycpu.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * CPU CPU number
+ * INTERRUPTS number of interrupts in sample
+ *
+ * This is based on a DTrace OneLiner from the DTraceToolkit.
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 15-May-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sdt:::interrupt-start { @num[cpu] = count(); }
+
+dtrace:::END
+{
+ printf("%-16s %16s\n", "CPU", "INTERRUPTS");
+ printa("%-16d %@16d\n", @num);
+}
diff --git a/Cpu/intoncpu.d b/Cpu/intoncpu.d
new file mode 100755
index 000000000000..b32685ab689b
--- /dev/null
+++ b/Cpu/intoncpu.d
@@ -0,0 +1,66 @@
+#!/usr/sbin/dtrace -s
+/*
+ * intoncpu.d - print interrupt on-cpu usage.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * $Id: intoncpu.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: intoncpu.d # wait several seconds, then hit Ctrl-C
+ *
+ * FIELDS:
+ * value Time interrupt thread was on-cpu, ns
+ * count Number of occurrences of at least this time
+ *
+ * BASED ON: /usr/demo/dtrace/intr.d
+ *
+ * SEE ALSO: DTrace Guide "sdt Provider" chapter (docs.sun.com)
+ * intrstat(1M)
+ *
+ * PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-May-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sdt:::interrupt-start
+{
+ self->ts = vtimestamp;
+}
+
+sdt:::interrupt-complete
+/self->ts && arg0 != 0/
+{
+ this->devi = (struct dev_info *)arg0;
+ /* this checks the pointer is valid, */
+ self->name = this->devi != 0 ?
+ stringof(`devnamesp[this->devi->devi_major].dn_name) : "?";
+ this->inst = this->devi != 0 ? this->devi->devi_instance : 0;
+ @Time[self->name, this->inst] = quantize(vtimestamp - self->ts);
+ self->name = 0;
+}
+
+dtrace:::END
+{
+ printa("%s%d\n%@d", @Time);
+}
diff --git a/Cpu/inttimes.d b/Cpu/inttimes.d
new file mode 100755
index 000000000000..926a566553e5
--- /dev/null
+++ b/Cpu/inttimes.d
@@ -0,0 +1,73 @@
+#!/usr/sbin/dtrace -s
+/*
+ * inttimes.d - print interrupt on-cpu time.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * $Id: inttimes.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: inttimes.d # wait several seconds, then hit Ctrl-C
+ *
+ * FIELDS:
+ * DEVICE instance name of device driver
+ * TIME (ns) sum of time spent servicing interrupt (ns)
+ *
+ * BASED ON: /usr/demo/dtrace/intr.d
+ *
+ * SEE ALSO:
+ * DTrace Guide "sdt Provider" chapter (docs.sun.com)
+ * intrstat(1M)
+ *
+ * PORTIONS: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 28-Jun-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sdt:::interrupt-start
+{
+ self->ts = vtimestamp;
+}
+
+sdt:::interrupt-complete
+/self->ts && arg0 != 0/
+{
+ this->devi = (struct dev_info *)arg0;
+ /* this checks the pointer is valid, */
+ self->name = this->devi != 0 ?
+ stringof(`devnamesp[this->devi->devi_major].dn_name) : "?";
+ this->inst = this->devi != 0 ? this->devi->devi_instance : 0;
+ @num[self->name, this->inst] = sum(vtimestamp - self->ts);
+ self->name = 0;
+}
+
+sdt:::interrupt-complete
+{
+ self->ts = 0;
+}
+
+dtrace:::END
+{
+ printf("%11s %16s\n", "DEVICE", "TIME (ns)");
+ printa("%10s%-3d %@16d\n", @num);
+}
diff --git a/Cpu/loads.d b/Cpu/loads.d
new file mode 100755
index 000000000000..681e8f6beb7d
--- /dev/null
+++ b/Cpu/loads.d
@@ -0,0 +1,58 @@
+#!/usr/sbin/dtrace -s
+/*
+ * loads.d - print load averages. Written using DTrace (Solaris 10 3/05).
+ *
+ * These are the same load averages that the "uptime" command prints.
+ * The purpose of this script is to demonstrate fetching these values
+ * from the DTrace language.
+ *
+ * $Id: loads.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: loads.d
+ *
+ * SEE ALSO: uptime(1)
+ *
+ * The first field is the 1 minute average, the second is the 5 minute,
+ * and the third is the 15 minute average. The value represents the average
+ * number of runnable threads in the system, a value higher than your
+ * CPU (core/hwthread) count may be a sign of CPU saturation.
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 10-Jun-2005 Brendan Gregg Created this.
+ * 10-Jun-2005 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ /* fetch load averages */
+ this->load1a = `hp_avenrun[0] / 65536;
+ this->load5a = `hp_avenrun[1] / 65536;
+ this->load15a = `hp_avenrun[2] / 65536;
+ this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536;
+ this->load5b = ((`hp_avenrun[1] % 65536) * 100) / 65536;
+ this->load15b = ((`hp_avenrun[2] % 65536) * 100) / 65536;
+
+ /* print load average */
+ printf("%Y, load average: %d.%02d, %d.%02d, %d.%02d\n",
+ walltimestamp, this->load1a, this->load1b, this->load5a,
+ this->load5b, this->load15a, this->load15b);
+
+ exit(0);
+}
diff --git a/Cpu/runocc.d b/Cpu/runocc.d
new file mode 100755
index 000000000000..a2b046971a2c
--- /dev/null
+++ b/Cpu/runocc.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -s
+/*
+ * runocc.d - run queue occupancy by CPU.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This prints the dispatcher run queue occupancy by CPU each second.
+ * A consistant run queue occupancy is a sign of CPU saturation.
+ *
+ * The value is similar to that seen in "sar -q", however this is
+ * calculated in a more accurate manner - sampling at 1000 Hertz.
+ *
+ * $Id: runocc.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: runocc.d
+ *
+ * FIELDS:
+ * CPU cpu ID
+ * %runocc % run queue occupancy, sampled at 1000 Hertz
+ *
+ * SEE ALSO: Solaris Internals 2nd Ed, vol 2, CPU chapter.
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 02-Mar-2006 Brendan Gregg Created this.
+ * 24-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+profile-1000hz
+/curthread->t_cpu->cpu_disp->disp_nrunnable/
+{
+ @qocc[cpu] = count();
+}
+
+profile:::tick-1sec
+{
+ normalize(@qocc, 10);
+ printf("\n%8s %8s\n", "CPU", "%runocc");
+ printa("%8d %@8d\n", @qocc);
+ clear(@qocc);
+}
diff --git a/Cpu/xcallsbypid.d b/Cpu/xcallsbypid.d
new file mode 100755
index 000000000000..b08027c2a254
--- /dev/null
+++ b/Cpu/xcallsbypid.d
@@ -0,0 +1,51 @@
+#!/usr/sbin/dtrace -s
+/*
+ * xcallsbypid.d - CPU cross calls by PID.
+ * Writen using DTrace (Solaris 10 3/05).
+ *
+ * $Id: xcallsbypid.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: xcallsbypid.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD process name
+ * XCALLS number of cross calls
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 17-Sep-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sysinfo:::xcalls
+{
+ @num[pid, execname] = count();
+}
+
+dtrace:::END
+{
+ printf("%6s %-16s %16s\n", "PID", "CMD", "XCALLS");
+ printa("%6d %-16s %@16d\n", @num);
+}
diff --git a/Disk/Readme b/Disk/Readme
new file mode 100644
index 000000000000..37a5301cb466
--- /dev/null
+++ b/Disk/Readme
@@ -0,0 +1,3 @@
+Disk - Disk based analysis
+
+ These are scripts that analyse I/O activity that has made it to the disks.
diff --git a/Disk/bitesize.d b/Disk/bitesize.d
new file mode 100755
index 000000000000..f2e8ea4fcc3b
--- /dev/null
+++ b/Disk/bitesize.d
@@ -0,0 +1,81 @@
+#!/usr/sbin/dtrace -s
+/*
+ * bitesize.d - analyse disk I/O size by process.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This produces a report for the size of disk events caused by
+ * processes. These are the disk events sent by the block I/O driver.
+ *
+ * If applications must use the disks, we generally prefer they do so
+ * with large I/O sizes.
+ *
+ * $Id: bitesize.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: bitesize.d # wait several seconds, then hit Ctrl-C
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD command and argument list
+ * value size in bytes
+ * count number of I/O operations
+ *
+ * NOTES:
+ *
+ * The application may be requesting smaller sized operations, which
+ * are being rounded up to the nearest sector size or UFS block size.
+ * To analyse what the application is requesting, DTraceToolkit programs
+ * such as Proc/fddist may help.
+ *
+ * SEE ALSO: seeksize.d, iosnoop
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 31-Mar-2004 Brendan Gregg Created this, build 51.
+ * 10-Oct-2004 " " Rewrote to use the io provider, build 63.
+ * 18-Feb-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+/*
+ * Process io start
+ */
+io:::start
+{
+ /* fetch details */
+ this->size = args[0]->b_bcount;
+
+ /* store details */
+ @Size[pid, curpsinfo->pr_psargs] = quantize(this->size);
+}
+
+/*
+ * Print final report
+ */
+dtrace:::END
+{
+ printf("\n%8s %s\n", "PID", "CMD");
+ printa("%8d %S\n%@d\n", @Size);
+}
diff --git a/Disk/diskhits b/Disk/diskhits
new file mode 100755
index 000000000000..3d72e4ade583
--- /dev/null
+++ b/Disk/diskhits
@@ -0,0 +1,113 @@
+#!/usr/bin/ksh
+#
+# diskhits - disk access by file offset.
+# Written using DTrace (Solaris 10 3/05).
+#
+# $Id: diskhits 3 2007-08-01 10:50:08Z brendan $
+#
+# This prints how a file was accessed, the locations on a distribution plot.
+# This is for the cache misses only - the file activity that resulted in
+# disk events.
+#
+# USAGE: diskhits pathname
+# eg,
+# diskhits /var/adm/messages
+#
+# FIELDS:
+# Location (KB) The file offset of the disk activity, Kbytes.
+# Size (KB) Size of the disk activity, Kbytes.
+# Total RW Total disk activity, reads + writes.
+#
+# BASED ON: /usr/demo/dtrace/applicat.d
+#
+# SEE ALSO: DTrace Guide "io Provider" chapter (docs.sun.com)
+# iosnoop (DTraceToolkit)
+#
+# PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# 08-Jun-2005 Brendan Gregg Created this.
+# 20-Apr-2006 " " Last update.
+#
+
+### Usage
+function usage
+{
+ cat <<-END >&2
+ USAGE: diskhits pathname
+ eg,
+ diskhits /var/adm/wtmpx
+ END
+ exit 1
+}
+
+### Process arguments
+if (( $# != 1 )); then
+ usage
+fi
+if [[ $1 == "-h" ]]; then
+ usage
+fi
+pathname=$1
+if [[ ! -e $pathname ]]; then
+ print "ERROR2: file $pathname not found" >&2
+ exit 2
+fi
+
+### Calculate output scale
+report_lines=20
+set -- `ls -l $pathname`
+filesize=$5
+(( file_kb_max = filesize / 1024 ))
+(( scale_kb = filesize / (1024 * report_lines) ))
+if (( file_kb_max < 20 )); then file_kb_max=20; fi
+if (( scale_kb < 1 )); then scale_kb=1; fi
+
+#
+# Run DTrace
+#
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+
+ inline string PATHNAME = "'$pathname'";
+ inline int FILE_KB_MAX = '$file_kb_max';
+ inline int SCALE_KB = '$scale_kb';
+
+ dtrace:::BEGIN
+ {
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ }
+
+ io:::start
+ /args[2]->fi_pathname == PATHNAME/
+ {
+ this->kb = args[2]->fi_offset == -1 ? -1 : args[2]->fi_offset / 1024;
+ @Location = lquantize(this->kb, 0, FILE_KB_MAX, SCALE_KB);
+ @Size = quantize(args[0]->b_bcount/1024);
+ @Total = sum(args[0]->b_bcount/1024);
+ }
+
+ dtrace:::END
+ {
+ printf("Location (KB),");
+ printa(@Location);
+
+ printf("Size (KB),");
+ printa(@Size);
+
+ printa("Total RW: %@d KB\n", @Total);
+ }
+'
diff --git a/Disk/hotspot.d b/Disk/hotspot.d
new file mode 100755
index 000000000000..6ab6ee45d69a
--- /dev/null
+++ b/Disk/hotspot.d
@@ -0,0 +1,71 @@
+#!/usr/sbin/dtrace -s
+/*
+ * hotspot.d - plot disk event by location, look for hotspots.
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * This simple DTrace script determines if disk activity is occuring in
+ * the one place - a "hotspot". This helps us understand the system's usage
+ * of a disk, it does not imply that the existance or not of a hotspot is
+ * good or bad (often may be good, less seeking).
+ *
+ * $Id: hotspot.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: hotspot.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * Disk disk instance name
+ * Major driver major number
+ * Minor driver minor number
+ * value location, by megabyte
+ * count number of I/O operations
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 07-May-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+inline int DISK_MB_MAX = 1000000; /* max size of a single disk */
+inline int REPORT_SCALE_MB = 1000; /* output step size for report */
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+/*
+ * Process disk event
+ */
+io:::start
+{
+ this->mb = args[0]->b_blkno / 2048;
+ @Block[args[1]->dev_statname, args[1]->dev_major, args[1]->dev_minor] =
+ lquantize(this->mb, 0, DISK_MB_MAX, REPORT_SCALE_MB);
+}
+
+/*
+ * Print final report
+ */
+dtrace:::END
+{
+ printa("Disk: %s Major,Minor: %d,%d\n%@d\n", @Block);
+}
diff --git a/Disk/iofile.d b/Disk/iofile.d
new file mode 100755
index 000000000000..255057a7ebd7
--- /dev/null
+++ b/Disk/iofile.d
@@ -0,0 +1,79 @@
+#!/usr/sbin/dtrace -s
+/*
+ * iofile.d - I/O wait time by filename and process.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This prints the total I/O wait times for each filename by process.
+ * This can help determine why an application is performing poorly by
+ * identifying which file they are waiting on, and the total times.
+ * Both disk and NFS I/O are measured.
+ *
+ * $Id: iofile.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: iofile.d # wait, then hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * CMD Process name
+ * TIME Total wait time for disk events, us
+ * FILE File pathname
+ *
+ * BASED ON: /usr/demo/dtrace/iocpu.d
+ *
+ * SEE ALSO: iosnoop, iotop
+ *
+ * PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 24-Jul-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+/* print header */
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+/* save time at start */
+io:::wait-start
+{
+ self->start = timestamp;
+}
+
+/* process event */
+io:::wait-done
+/self->start/
+{
+ /*
+ * wait-done is used as we are measing wait times. It also
+ * is triggered when the correct thread is on the CPU, obviating
+ * the need to link process details to the start event.
+ */
+ this->elapsed = timestamp - self->start;
+ @files[pid, execname, args[2]->fi_pathname] = sum(this->elapsed);
+ self->start = 0;
+}
+
+/* print report */
+dtrace:::END
+{
+ normalize(@files, 1000);
+ printf("%6s %-12s %8s %s\n", "PID", "CMD", "TIME", "FILE");
+ printa("%6d %-12.12s %@8d %s\n", @files);
+}
diff --git a/Disk/iofileb.d b/Disk/iofileb.d
new file mode 100755
index 000000000000..e7572f338ad1
--- /dev/null
+++ b/Disk/iofileb.d
@@ -0,0 +1,59 @@
+#!/usr/sbin/dtrace -s
+/*
+ * iofileb.d - I/O bytes by filename and process.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This prints a summary of requested disk activity by pathname,
+ * providing totals of the I/O events in bytes. It is a companion to the
+ * iofile.d script - which prints in terms of I/O wait time, not bytes.
+ * I/O wait time is a better metric for understanding performance issues.
+ * Both disk and NFS I/O are measured.
+ *
+ * $Id: iofileb.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: iofileb.d # wait several seconds, then hit Ctrl-C
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD command name
+ * KB Kilobytes of disk I/O
+ * FILE Full pathname of the file
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 20-Feb-2006 Brendan Gregg Created this.
+ * 20-Feb-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+io:::start
+{
+ @files[pid, execname, args[2]->fi_pathname] = sum(args[0]->b_bcount);
+}
+
+dtrace:::END
+{
+ normalize(@files, 1024);
+ printf("%6s %-12s %6s %s\n", "PID", "CMD", "KB", "FILE");
+ printa("%6d %-12.12s %@6d %s\n", @files);
+}
diff --git a/Disk/iopending b/Disk/iopending
new file mode 100755
index 000000000000..ef9d4da7a625
--- /dev/null
+++ b/Disk/iopending
@@ -0,0 +1,261 @@
+#!/usr/bin/ksh
+#
+# iopending - Print a plot for the number of pending disk I/O events.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This is measuring disk events that have made it past system caches.
+# By plotting a distribution graph of the number of pending events, the
+# "serialness" or "parallelness" of disk behaviour can be distinguished.
+#
+# $Id: iopending 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: iopending [-c] [-d device] [-f filename]
+# [-m mount_point] [interval [count]]
+#
+# -c # clear the screen
+# -d device # instance name to snoop (eg, dad0)
+# -f filename # full pathname of file to snoop
+# -m mount_point # this FS only (will skip raw events)
+# eg,
+# iopending # default output, 5 second intervals
+# iopending 1 # 1 second samples
+# iopending -c # clear the screen
+# iopending 5 12 # print 12 x 5 second samples
+#
+# FIELDS:
+# value number of pending events, 0 == idle
+# count number of samples @ 1000 Hz
+# load 1 min load average
+# disk_r total disk read Kbytes for sample
+# disk_w total disk write Kbytes for sample
+#
+# SEE ALSO: iosnoop, iotop
+#
+# IDEA: Dr Rex di Bona (Sydney, Australia)
+#
+# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 01-Nov-2005 Brendan Gregg Created this.
+# 20-Apr-2006 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_device=0; opt_file=0; opt_mount=0; opt_clear=0;
+opt_def=1; filter=0; device=.; filename=.; mount=.
+interval=5; count=-1
+
+### process options
+while getopts cd:f:hm: name
+do
+ case $name in
+ c) opt_clear=1 ;;
+ d) opt_device=1; device=$OPTARG ;;
+ f) opt_file=1; filename=$OPTARG ;;
+ m) opt_mount=1; mount=$OPTARG ;;
+ h|?) cat <<-END >&2
+ USAGE: iopending [-c] [-d device] [-f filename]
+ [-m mount_point] [interval [count]]
+
+ -c # clear the screen
+ -d device # instance name to snoop
+ -f filename # snoop this file only
+ -m mount_point # this FS only
+ eg,
+ iopending # default output, 5 second samples
+ iopending 1 # 1 second samples
+ iopending -m / # snoop events on filesystem / only
+ iopending 5 12 # print 12 x 5 second samples
+ END
+ exit 1
+ esac
+done
+
+shift $(( $OPTIND - 1 ))
+
+### option logic
+if [[ "$1" > 0 ]]; then
+ interval=$1; shift
+fi
+if [[ "$1" > 0 ]]; then
+ count=$1; shift
+fi
+if (( opt_device || opt_mount || opt_file )); then
+ filter=1
+fi
+if (( opt_clear )); then
+ clearstr=`clear`
+else
+ clearstr=.
+fi
+
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_def = '$opt_def';
+ inline int OPT_clear = '$opt_clear';
+ inline int OPT_device = '$opt_device';
+ inline int OPT_mount = '$opt_mount';
+ inline int OPT_file = '$opt_file';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+ inline int FILTER = '$filter';
+ inline string DEVICE = "'$device'";
+ inline string FILENAME = "'$filename'";
+ inline string MOUNT = "'$mount'";
+ inline string CLEAR = "'$clearstr'";
+
+ inline int MAX_PENDING = 32; /* max pending value */
+
+ #pragma D option quiet
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ /* starting values */
+ counts = COUNTER;
+ secs = INTERVAL;
+ disk_r = 0;
+ disk_w = 0;
+ pending = 0;
+
+ printf("Tracing... Please wait.\n");
+ }
+
+ /*
+ * Check event is being traced
+ */
+ io:genunix::start,
+ io:genunix::done
+ {
+ /* default is to trace unless filtering, */
+ this->ok = FILTER ? 0 : 1;
+
+ /* check each filter, */
+ (OPT_device == 1 && DEVICE == args[1]->dev_statname)? this->ok = 1 : 1;
+ (OPT_file == 1 && FILENAME == args[2]->fi_pathname) ? this->ok = 1 : 1;
+ (OPT_mount == 1 && MOUNT == args[2]->fi_mount) ? this->ok = 1 : 1;
+ }
+
+ /*
+ * Store entry details
+ */
+ io:genunix::start
+ /this->ok/
+ {
+ /* track bytes */
+ disk_r += args[0]->b_flags & B_READ ? args[0]->b_bcount : 0;
+ disk_w += args[0]->b_flags & B_READ ? 0 : args[0]->b_bcount;
+
+ /* increase event pending count */
+ pending++;
+ }
+
+ /*
+ * Process and Print completion
+ */
+ io:genunix::done
+ /this->ok/
+ {
+ /* decrease event pending count */
+ pending--;
+ }
+
+ /*
+ * Prevent pending from underflowing
+ * this can happen if this program is started during disk events.
+ */
+ io:genunix::done
+ /pending < 0/
+ {
+ pending = 0;
+ }
+
+ /*
+ * Timer
+ */
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+ profile:::profile-1000hz
+ {
+ @out = lquantize(pending, 0, MAX_PENDING, 1);
+ }
+
+ /*
+ * Print Report
+ */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ /* fetch 1 min load average */
+ this->load1a = `hp_avenrun[0] / 65536;
+ this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536;
+
+ /* convert counters to Kbytes */
+ disk_r /= 1024;
+ disk_w /= 1024;
+
+ /* print status */
+ OPT_clear ? printf("%s", CLEAR) : 1;
+ printf("%Y, load: %d.%02d, disk_r: %6d KB, disk_w: %6d KB",
+ walltimestamp, this->load1a, this->load1b, disk_r, disk_w);
+
+ /* print output */
+ printa(@out);
+
+ /* clear data */
+ trunc(@out);
+ disk_r = 0;
+ disk_w = 0;
+ secs = INTERVAL;
+ counts--;
+ }
+
+ /*
+ * End of program
+ */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+
+ /*
+ * Cleanup for Ctrl-C
+ */
+ dtrace:::END
+ {
+ trunc(@out);
+ }
+'
diff --git a/Disk/seeksize.d b/Disk/seeksize.d
new file mode 100755
index 000000000000..963d9ad6d637
--- /dev/null
+++ b/Disk/seeksize.d
@@ -0,0 +1,85 @@
+#!/usr/sbin/dtrace -s
+/*
+ * seeksize.d - analyse disk head seek distance by process.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * Disk I/O events caused by processes will in turn cause the disk heads
+ * to seek. This program analyses those seeks, so that we can determine
+ * if processes are causing the disks to seek in a "random" or "sequential"
+ * manner.
+ *
+ * $Id: seeksize.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: seeksize.d # wait several seconds, then hit Ctrl-C
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD command and argument list
+ * value distance in disk blocks (sectors)
+ * count number of I/O operations
+ *
+ * SEE ALSO: bitesize.d, iosnoop
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 11-Sep-2004 Brendan Gregg Created this.
+ * 10-Oct-2004 " " Rewrote to use the io provider.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+self int last[dev_t];
+
+/*
+ * Process io start
+ */
+io:genunix::start
+/self->last[args[0]->b_edev] != 0/
+{
+ /* calculate seek distance */
+ this->last = self->last[args[0]->b_edev];
+ this->dist = (int)(args[0]->b_blkno - this->last) > 0 ?
+ args[0]->b_blkno - this->last : this->last - args[0]->b_blkno;
+
+ /* store details */
+ @Size[pid, curpsinfo->pr_psargs] = quantize(this->dist);
+}
+
+io:genunix::start
+{
+ /* save last position of disk head */
+ self->last[args[0]->b_edev] = args[0]->b_blkno +
+ args[0]->b_bcount / 512;
+}
+
+/*
+ * Print final report
+ */
+dtrace:::END
+{
+ printf("\n%8s %s\n", "PID", "CMD");
+ printa("%8d %S\n%@d\n", @Size);
+}
diff --git a/Docs/Contents b/Docs/Contents
new file mode 100644
index 000000000000..525fd05b85a7
--- /dev/null
+++ b/Docs/Contents
@@ -0,0 +1,152 @@
+Contents - Command Summary
+
+ The following is a list of commands found in the DTraceToolkit, along
+ with their directory location.
+
+Generally commands that end in a ".d" are DTrace scripts, and commands
+that don't are DTrace scripts wrapped in another language (eg, shell
+or Perl). See the Docs/Readme for instructions for finding their docs.
+
+DTraceToolkit/
+ dexplorer run a series of scripts and archive output
+ dtruss process syscall info. DTrace truss
+ dvmstat vmstat by PID/name/command
+ errinfo report syscall failures with details
+ execsnoop snoop process execution as it occurs
+ iosnoop snoop I/O events as they occur
+ iopattern print disk I/O pattern
+ iotop display top disk I/O events by process
+ opensnoop snoop file opens as they occur
+ procsystime analyse process system call times
+ rwsnoop snoop read/write events
+ rwtop display top read/write bytes by process
+ statsnoop snoop file stats as they occur
+ Apps/
+ httpdstat.d realtime httpd statistics
+ nfswizard.d NFS client activity wizard
+ shellsnoop snoop live shell activity
+ weblatency.d website latency statistics
+ Cpu/
+ cputypes.d list CPU types
+ cpuwalk.d measure which CPUs a process runs on
+ dispqlen.d dispatcher queue length by CPU
+ intbycpu.d interrupts by CPU
+ intoncpu.d interrput on-cpu usage
+ inttimes.d interrput on-cpu time total
+ loads.d print load averages
+ runocc.d run queue occupancy by CPU
+ xcallsbypid.d CPU cross calls by PID
+ Disk/
+ bitesize.d print disk event size report
+ diskhits disk access by file offset
+ hotspot.d print disk event by location
+ iofile.d I/O wait time by filename and process
+ iofileb.d I/O bytes by filename and process
+ iopending plot number of pending disk events
+ pathopens.d pathnames successfully opened count
+ seeksize.d print disk seek size report
+ Docs/
+ oneliners.txt DTrace oneliners
+ FS/
+ fsrw.d file system read/write event tracing
+ fspaging.d file system read/write and paging tracing
+ rfsio.d read FS I/O stats, with cache miss rate
+ rfileio.d read file I/O stats, with cache miss rate
+ vopstat vnode interface statistics
+ Java/
+ j_*.d 18 scripts for tracing Java using the hotspot provider
+ JavaScript/
+ js_*.d 14 scripts for JavaScript with the Mozilla provider
+ Kernel/
+ cputimes print time by Kernel/Idle/Process
+ cpudists time distribution by Kernel/Idle/Process
+ cswstat.d context switch time statistics
+ dnlcps.d DNLC stats by process
+ dnlcsnoop.d snoop DNLC activity
+ dnlcstat DNLC statistics
+ kstat_types.d trace kstat reads with type info
+ modcalls.d kernel function calls by module name
+ priclass.d priority distribution by scheduling class
+ pridist.d process priority distribution
+ putnexts.d trace who is putting to which streams module
+ whatexec.d examine the type of files executed
+ Locks/
+ lockbyproc.d lock time by process name
+ lockbydist.d lock time distribution by process name
+ Mem/
+ anonpgpid.d anonymous memory paging info by PID on CPU
+ minfbypid.d minor faults by PID
+ minfbyproc.d minor faults by process name
+ pgpginbypid.d pages paged in by PID
+ pgpginbyproc.d pages paged in by process name
+ swapinfo.d print virtual memory info
+ vmbypid.d virtual memory stats by PID
+ vmstat.d vmstat demo using DTrace
+ vmstat-p.d vmstat -p demo using DTrace
+ xvmstat extended vmstat demo using DTrace
+ Misc/
+ guess.d guessing game
+ wpm.d words per minute tracing
+ woof.d audio alert for new processes
+ Net/
+ connections print inbound TCP connections by process
+ icmpstat.d print ICMP statistics
+ tcpsnoop snoop TCP network packets by process, Solaris 10 3/05
+ tcpsnoop_snv snoop TCP network packets by process, Solaris Nevada
+ tcpsnoop.d snoop TCP network packets by process, Solaris 10 3/05
+ tcpsnoop_snv.d snoop TCP network packets by process, Solaris Nevada
+ tcpstat.d print TCP statistics
+ tcptop display top TCP network packets by PID, Solaris 10 3/05
+ tcptop_snv display top TCP network packets by PID, Solaris Nevada
+ tcpwdist.d simple TCP write distribution by process
+ udpstat.d print UDP statistics
+ Perl/
+ pl_*.d 12 scripts for tracing Perl
+ Php/
+ php_*.d 12 scripts for tracing Php
+ Proc/
+ crash.d crashed application report
+ creatbyproc.d snoop file creat() by process name
+ dappprof profile user and lib function usage
+ dapptrace trace user and lib function usage
+ fddist file descriptor usage distribution
+ fileproc.d snoop files opened by process
+ kill.d snoop process signals
+ lastwords print syscalls before exit
+ mmapfiles.d mmap'd files by process
+ newproc.d snoop new processes
+ pfilestat show I/O latency break down by FD
+ pidpersec.d print new PIDs per sec
+ readbytes.d read bytes by process name
+ readdist.d read distribution by process name
+ rwbbypid.d read/write bytes by PID
+ rwbypid.d read/write calls by PID
+ rwbytype.d read/write bytes by vnode type
+ sampleproc sample processes on the CPUs
+ shortlived.d check short lived process time
+ sigdist.d signal distribution by process name
+ stacksize.d measure stack size for running threads
+ sysbypid.d system stats by PID
+ syscallbyproc.d system calls by process name
+ syscallbypid.d system calls by process ID
+ threaded.d sample multi-threaded CPU usage
+ topsysproc display top syscalls by process name
+ writebytes.d write bytes by process name
+ writedist.d write distribution by process name
+ Python/
+ py_*.d 14 scripts for tracing Python
+ Shell/
+ sh_*.d 15 scripts for tracing the Bourne shell
+ System/
+ sar-c.d sar -c demo using DTrace
+ syscallbysysc.d system calls by system call
+ topsyscall display top system call type
+ uname-a.d uname -a demo using DTrace
+ Tcl/
+ tcl_*.d 15 scripts for tracing Tcl
+ User/
+ setuids.d snoop setuid calls
+ Zones/
+ zvmstat vmstat info by zone
+
+Total: 230 scripts
diff --git a/Docs/Examples b/Docs/Examples
new file mode 120000
index 000000000000..309832683601
--- /dev/null
+++ b/Docs/Examples
@@ -0,0 +1 @@
+../Examples \ No newline at end of file
diff --git a/Docs/Faq b/Docs/Faq
new file mode 100644
index 000000000000..4919cac9fc51
--- /dev/null
+++ b/Docs/Faq
@@ -0,0 +1,126 @@
+Faq - Frequently Asked Questions
+
+ The following may serve as a guide to the DTraceToolkit.
+
+16-May-2005, ver 0.30 (first version of the FAQ)
+
+The DTraceToolkit is new, and as such there hasn't been many questions asked.
+This may be better called a "possibly asked questions" :)
+
+
+Questions
+
+1. Intro
+1.1. What is the DTraceToolkit?
+1.2. Who wrote the DTraceToolkit?
+1.3. Where do I get support?
+1.4. Am I now a performance tuning expert?
+1.5. Will this solve all my performance problems?
+1.6. So the DTraceToolkit *is* DTrace?
+
+2. Toolkit
+2.1. What is in it?
+2.2. What performance effect can the DTraceToolkit cause?
+
+3. Contributing
+3.1. Where do I send bugs?
+
+
+Answers
+
+1. Intro
+
+1.1. What is the DTraceToolkit?
+
+ The DTraceToolkit is a collection of tools written using DTrace for
+ the Solaris 10[tm] OS by Sun Microsystems[tm]. Many of these scripts
+ will also work on OpenSolaris.
+
+1.2. Who wrote the DTraceToolkit?
+
+ Volunteers of the DTrace and OpenSolaris community. Check the scripts
+ themselves, Docs/Contrib, Docs/Who and Docs/History.
+
+1.3. Where do I get support?
+
+ As the DTraceToolkit is a freeware product, there is no official company
+ offering support for this. Sun Microsystems does not support this. If you
+ post messages to the DTrace forums found in the Docs/Links file, a
+ volunteer may help you out.
+
+1.4. Am I now a performance tuning expert?
+
+ The DTraceToolkit does not turn people into performance tuning experts in
+ the same way that owning a set of golf clubs won't make you a professional
+ golfer. Experience and understanding are necessary. The toolkit certainly
+ helps by fetching the data in an easy way, and also by providing some
+ documentation. So it is valuable, but not magical.
+
+1.5. Will this solve all my performance problems?
+
+ This is similar to the previous point; the DTraceToolkit is valuable
+ for it's scripts and documentation, but it's no magical product.
+ Understanding and experience are necessary.
+
+1.6. So the DTraceToolkit *is* DTrace?
+
+ The DTraceToolkit is one use of DTrace, but there is far more to DTrace
+ than just the toolkit. DTrace allows people to write their own customised
+ scripts to solve a wide number of problems.
+
+ Think of the DTraceToolkit as a starting point. Maybe your problem has
+ a solution in the kit. Maybe changing one of the toolkit programs slightly
+ is what you want. Finally you may need to write your script from scratch.
+
+
+2. Toolkit
+
+2.1. What is in it?
+
+ Read the Guide file for a table of contents, and Docs/Contents for a
+ list of commands.
+
+2.2. What performance effect can the DTraceToolkit cause?
+
+ Enabling DTrace to monitor events has little effect on the system,
+ especially when compared to the disruptive behaviour of truss (See
+ http://www.brendangregg.com/DTrace/dtracevstruss.html for a comparison).
+
+ It really boils down to how often the events occur that you are monitoring.
+ The following numbers have been provided as an approximation:
+
+ 1. Fixed rate scripts. For example, dispqlen.d samples at 1000 hz.
+ The impact will be negligible, close to 0% CPU. (in testing, 0.1% CPU).
+
+ 2. Demand rated scripts. For example, iosnoop probes disk I/O events.
+ The impact depends on the rate of events, for many servers the disk
+ events would be slow enough for this to be less than 0.2% CPU.
+ Scripts such as execsnoop would expect even fewer events, their impact
+ would be close to 0.0% CPU. However scripts that monitor potentially
+ very rapid events will have a greater impact, for example running
+ dapptrace on Xorg (over 6000 lines of output per second) was consuming
+ around 10% of a CPU to do so.
+
+ 3. Heavy voodoo scripts. A few scripts in the toolkit must probe either
+ a ton of different events, or very rapid events, or both. They are
+ going to hurt and there is no way around it. Scripts such as cputimes
+ and cpudists trace very frequent events, and can chew around 5% of
+ the CPUs; scripts such as dapptrace and dappprof trace extreamly
+ frequent events, and can chew over 20%.
+
+ There is an emphasis in the DTraceToolkit to write demand rated scripts
+ that measure the fewest events, such that their impact is close to 0.0%
+ CPU usage. Some scripts are fixed rate, which are safer as their impact
+ has a known upper bound, and are most suitable to run in production.
+
+ There are additional notes in Notes/ALLoverhead_notes.txt about the
+ overheads for running DTrace.
+
+
+3. Contributing
+
+3.1. Where do I send bugs?
+
+ The DTraceToolkit maintainer. See the Docs/Maintainer file.
+
+
diff --git a/Docs/History b/Docs/History
new file mode 100644
index 000000000000..d92bf11436e4
--- /dev/null
+++ b/Docs/History
@@ -0,0 +1,249 @@
+History - History of the DTraceToolkit
+
+------------------------------------------------------------------------------
+20-Apr-2005 Brendan Gregg Idea
+ For a while I had thought that a DTrace toolkit would be a nice
+ idea, but on this day it became clear. I was explaining DTrace to
+ an SSE from Sun (Canberra, Australia), who had a need for using
+ DTrace but didn't have the time to sit down and write all the
+ tools he was after. It simply made sense to have a DTrace toolkit
+ that people could download or carry around a copy to use. Some
+ people would write DTrace tools, others would use the toolkit.
+------------------------------------------------------------------------------
+15-May-2005 Brendan Gregg Version 0.30
+ I had discussed the idea of a DTrace toolkit with the Sun PAE guys in
+ Adelaide, Australia. It was making more sense now. It would be much
+ like the SE Toolkit, not just due to the large number of sample
+ scripts provided, but also due to the role it would play: few people
+ wrote SE Toolkit programs, more people used it as a toolkit. While
+ we would like a majority of Solaris users to write DTrace scripts,
+ the reality is that many would want to use a prewritten toolkit.
+ Today I created the toolkit as version 0.30, with 11 main directories,
+ a dozen scripts, man pages and a structure for documentation.
+------------------------------------------------------------------------------
+16-May-2005 Brendan Gregg OneLiners
+ I've been using the toolkit for a day now (wow!), and have noticed
+ a few problems I've been fixing. One of them was the dtrace oneliners.
+ I have them in two files, Docs/oneliners.txt and the examples in
+ Docs/Examples/oneliners_examples.txt. The problem is that when I'm
+ looking for a script, I'm looking in Docs/Commands - a list of the
+ seperate script files, or I'm doing an ls or find. Ok, so I've now
+ made each one liner a seperate script. This seems at first pretty
+ silly since they are oneliners and shouldn't deserve an entire script
+ each, but I've found having them as seperate scripts makes them far
+ easier to find and use. The scripts and man page for each script do
+ point out the fact that it's a one liner.
+------------------------------------------------------------------------------
+17-May-2005 Brendan Gregg Version 0.33
+ Version 0.33 with 33 scripts. Maybe I should make the version number
+ equal the script count. :) I just finished dtruss, dapptrace and
+ dappprof.
+------------------------------------------------------------------------------
+08-Jun-2005 Brendan Gregg Name changes.
+ I've renamed Docs/Commands to Docs/Contents. I found myself typing
+ "more Docs/Contents" by mistake a lot. ok, maybe it made more sense
+ to call it Contents after all. I've also made a symlink to it called
+ Index.
+------------------------------------------------------------------------------
+08-Jun-2005 Brendan Gregg Version 0.35
+ Version 0.35 with 35 scripts. Also touched up procsystime and some
+ man pages. Added the CDDL version 1.0.
+------------------------------------------------------------------------------
+09-Jun-2005 Brendan Gregg Version 0.42
+ Added 7 more scripts.
+------------------------------------------------------------------------------
+14-Jun-2005 Brendan Gregg Version 0.57
+ Added heaps of new scripts. Now at 57 scripts.
+------------------------------------------------------------------------------
+17-Jun-2005 Brendan Gregg Version 0.61
+ Restyled many commands.
+------------------------------------------------------------------------------
+28-Jun-2005 Brendan Gregg Version 0.70
+ Added several commands including dexplorer. Developed a few useful
+ variants of classic scripts while writing dexplorer, and have added
+ them to the toolkit (I kept wanting to run them individually but
+ not have to run an entire dexplorer).
+------------------------------------------------------------------------------
+25-Jul-2005 Brendan Gregg Version 0.77
+ Added tcpsnoop.d, tcpsnoop, tcptop. Because of their addition I have
+ dropped tcpwbytes.d and tcpwlist. These are complex scripts, but they
+ track TCP in an accurate manner. However! also because they are
+ complex scripts, I expect they will require maintainence for newer
+ versions of [Open]Solaris, as various probes may change. They will
+ become much more stable once a network provider has been added to
+ DTrace (which may be some time away).
+ Also added iotop, and updated a bunch of scripts. A lot of work went
+ into this version, although the version change doesn't reflect that
+ (I'm still keeping the version number == to number of scripts).
+ Also added rwsnoop, rwtop, and more.
+------------------------------------------------------------------------------
+26-Jul-2005 Brendan Gregg Version 0.82
+ Many new scripts added, many updates. This is a major release.
+------------------------------------------------------------------------------
+17-Sep-2005 Brendan Gregg Version 0.83
+ A few scripts have been updated so that they work better.
+ execsnoop, iosnoop, opensnoop and rwsnoop will be more responsive
+ (increased switchrate).
+------------------------------------------------------------------------------
+22-Sep-2005 Brendan Gregg Version 0.84
+ Some updates, fixed some bugs (cputimes, cpudists). Added cpuwalk.d.
+------------------------------------------------------------------------------
+15-Nov-2005 Brendan Gregg Sys Admin Magazine
+ Ryan Matteson wrote an article on the DTraceToolkit which has been
+ printed in Sys Admin Magazine, December 2005. It's quite good,
+ and made it as the feature article - which means it will be available
+ online for some time. Thanks Matty, and Sys Admin Magazine!
+ "Observing I/O Behavior with the DTraceToolkit"
+ http://www.samag.com/documents/sam0512a/
+------------------------------------------------------------------------------
+01-Dec-2005 Brendan Gregg Version 0.88
+ Many scripts were updated. Added the Apps category. I had planned
+ to add some key scripts, but they haven't made it out of testing yet.
+------------------------------------------------------------------------------
+03-Dec-2005 Brendan Gregg Version 0.89
+ Added nfswisard.d, fixed a minor bug with tcp* tools (see
+ dtrace-discuss mailing list).
+------------------------------------------------------------------------------
+12-Jan-2006 Brendan Gregg Version 0.92
+ Added a few scripts including rwbytype.d. Fixed several issues.
+------------------------------------------------------------------------------
+09-Apr-2006 Brendan Gregg Solaris Internals 2nd Edition
+ In the past few months I have been contributing to Solaris Internals
+ 2nd Edition. This book (now two volumes) is really amazing. The 2nd
+ volume does use the DTraceToolkit where appropriate, and covers loads
+ of useful topics. While writing and reviewing material for Solaris
+ Internals, I've had numerous new ideas for DTrace scripts. Not only
+ that, but a few people have managed to send me well styled, carefully
+ tested, well considered DTrace scripts for inclusion in the toolkit.
+------------------------------------------------------------------------------
+20-Apr-2006 Brendan Gregg TCP bug fixed
+ Stefan Parvu sent me a bug for the tcp* scripts: on build 31+ they
+ error'd on the symbol SS_TCP_FAST_ACCEPT. This symbol was
+ renamed to SS_DIRECT (I checked the code, they are used in the
+ same way). Ironically, when I first wrote the scripts I had hardcoded
+ the value 0x00200000, then rewrote it "properly" by importing
+ the header files and using the symbol name. Had I been lazy and left
+ it hardcoded, the bug would never have eventuated. Not to worry,
+ it has returned to being hardcoded, so that it works on all builds
+ (until something else changes).
+------------------------------------------------------------------------------
+21-Apr-2006 Brendan Gregg Restyled - again!
+ I've been writing the "DTraceToolkit Style Guide", to document
+ the style that these scripts obey. It is quite strict, and sets
+ the bar fairly high. I've been warned that it may cause very few
+ people to ever contribute scripts, which is fine. At some point
+ I'll carefully explain the mentality behind this, but in a nutshell:
+ Users on critical production servers expect the tools to be
+ accurate, carefully tested, and cause no undocumented harm.
+------------------------------------------------------------------------------
+22-Apr-2006 Brendan Gregg Docs changes
+ The "Contrib" file was merged into the "Who" file. In hindsight
+ it is better to keep this data together than to split it up.
+------------------------------------------------------------------------------
+24-Apr-2006 Brendan Gregg Version 0.96
+ The toolkit now contains 104 scripts, however I'll keep the version
+ number < 1.00 until the dust has settled on these new scripts.
+ There is some special significance with version 1.00, it would
+ imply that every script had been tested for some time - not that
+ I've just added a few.
+ There is a new main directory, FS for file system related scripts.
+ There are some interesting scripts in there, from or based on
+ Solaris Internals 2nd ed, vol 2.
+------------------------------------------------------------------------------
+30-Sep-2007 Brendan Gregg Version 0.99
+ It's been a year and a half since the last release, and a lot has
+ happneed. Firstly, the DTraceToolkit has featured in the Prentice Hall
+ book,
+ Solaris Performance and Tools
+ DTrace and mdb techniques for Solaris 10 and OpenSolaris
+
+ written by Richard McDougall, Jim Mauro and myself. It is a companion
+ book to "Solaris Internals 2nd edition" by Richard McDougall and
+ Jim Mauro. If you are serious about becomming a DTrace guru,
+ especially on Solaris, then please study both books. (Yes, I realize
+ that many people are using the DTraceToolkit because they don't have
+ the time or don't want to become DTrace gurus; well, so long as
+ you are using DTrace anyway :). The performance book was a great relief
+ to write - since we were able to put to print much performance wisdom
+ and knowledge that was begging to be documented.
+
+ Then, in late 2006 I joined an advanced products engineering team
+ at Sun in San Francisco, a team which includes the three members of
+ team DTrace. It's been a great opportunity to learn from such
+ engineers, and to contribute more directly to DTrace. So far my work
+ has included writing a JavaScript provider, integrated inet_ntoa()
+ style functions into DTrace, and prototying DTrace IP, TCP and UDP
+ providers.
+
+ Working on the network providers is good news for the DTraceToolkit,
+ as it will indirectly help the tcp* scripts become more stable. Yes,
+ those scripts have broken a few more times during the last 18 months,
+ sorry about that, and it will keep happening until we have stable
+ network providers. This is why I only ever wrote three tcp* scripts,
+ and not at least a dozen, which I'd really like to do.
+
+ I did leave my pile of old SPARC and x86 development servers behind
+ in Australia, and brought over a couple of laptops. That has made me
+ more dependant on Stefan for testing the toolkit - especially on SPARC.
+
+ So, it's been about 18 months since the last release, which is
+ mostly due to having less spare time due to moving countries and
+ learning a new job.
+
+ Michelle from Sun docs has been asking for a newer version of the
+ DTraceToolkit for the OpenSolaris starter kit, which is why I'm
+ releasing this version now and not waiting a few more weeks as
+ I complete bug fixes.
+
+ So the good and the bad news for this release, starting with the bad,
+
+ Bad: tcpsnoop/tcptop still don't work on some Solaris 10 releases.
+ I've added versions that should work on Solaris Nevada and OpenSolaris
+ for releases from around late 2007. They are likely to break again.
+ The real answer, as always, is for stable nework providers to be
+ integrated into Solaris.
+
+ Many of the exciting new language provider scripts in this release
+ currently require downloading, patching and compling of the language
+ interpreter to get working. See the Readme file in each directory
+ for pointers.
+
+ Good: many more scripts to cover the new DTrace language providers
+ that are available (the DTraceToolkit is now 227 scripts). Many
+ updates to the Notes directory. Bug fixes. Some new categories
+ other than for scripts: Code - for simple programs to DTrace (and
+ for the example files), and Snippits - for useful lumps of DTrace
+ code to copy-n-paste from. The man pages are also making room
+ for documenting both stability and supported operating systems for
+ each script - now that DTrace exists for MacOS X Leopard, the
+ DTraceToolkit will begin supporting multiple operating systems.
+
+ This can be thought of as a developer's release of the DTraceToolkit -
+ to help people start using DTrace with Perl, Python, Ruby, Php, Java,
+ JavaScript, Shell and Tcl. I've written about 15 scripts for each
+ language, to cover the basics and to show the way for deeper analysis.
+ The scripts are also similar from one language to another, having
+ devoleped a tried-and-tested group of scripts for analyzing real world
+ issues - it made sense to repeat these scripts for every language
+ possible. To see what I mean, try reading,
+
+ Examples/j_cputime_example.txt Examples/py_cputime_example.txt
+ Examples/js_cputime_example.txt Examples/rb_cputime_example.txt
+ Examples/php_cputime_example.txt Examples/sh_cputime_example.txt
+ Examples/pl_cputime_example.txt Examples/tcl_cputime_example.txt
+
+ You might notice that the example files are more clearly and carefully
+ explained. Claire (my wife), wrote close to one hundred of them for
+ this release while I focused on writing and testing the scripts.
+ Claire has worked as a SysAdmin and as an IT instructor, and is well
+ skilled at explaining relavent technical details. And she can spell
+ much better than I can. :)
+
+ The future: I still have many new scripts and some bug fixes in mind,
+ as well as generally improving the Notes and Examples provided.
+ Hopefully it won't be too many months before you see another
+ release. Check here for the lastest installment,
+
+ http://www.opensolaris.org/os/community/dtrace/dtracetoolkit
+------------------------------------------------------------------------------
+
diff --git a/Docs/Index b/Docs/Index
new file mode 120000
index 000000000000..9ae9ea0ab582
--- /dev/null
+++ b/Docs/Index
@@ -0,0 +1 @@
+Contents \ No newline at end of file
diff --git a/Docs/Links b/Docs/Links
new file mode 100644
index 000000000000..182bb548b5b2
--- /dev/null
+++ b/Docs/Links
@@ -0,0 +1,30 @@
+Links - DTrace links
+
+ http://www.opensolaris.org/os/community/dtrace/dtracetoolkit
+ DTraceToolkit Home
+
+ http://www.opensolaris.org/os/community/dtrace
+ OpenSolaris DTrace site
+
+ http://www.brendangregg.com/dtrace.html
+ DTraceToolkit
+ DTrace Tools
+
+ http://www.sun.com/bigadmin/content/dtrace
+ DTrace site on BigAdmin
+
+ http://docs.sun.com/db/doc/817-6223
+ DTrace Guide (answerbook)
+
+ http://blogs.sun.com/roller/page/bmc
+ Bryan Cantrill's Blog (DTrace Team)
+
+ http://blogs.sun.com/roller/page/ahl
+ Adam Leventhal's Blog (DTrace Team)
+
+ http://blogs.sun.com/mws
+ Mike Shapiro's Blog (DTrace Team)
+
+ http://www.solarisinternals.com/si/dtrace/index.php
+ DTrace scripts by Richard McDougall
+
diff --git a/Docs/Maintainer b/Docs/Maintainer
new file mode 100644
index 000000000000..3a8bb429a1c4
--- /dev/null
+++ b/Docs/Maintainer
@@ -0,0 +1,6 @@
+Maintainer - The DTraceToolkit Author and Maintainer,
+
+ Brendan Gregg
+ brendan@sun.com (or see website below for emailaddr)
+ http://www.brendangregg.com
+
diff --git a/Docs/Notes b/Docs/Notes
new file mode 120000
index 000000000000..e0856feb2688
--- /dev/null
+++ b/Docs/Notes
@@ -0,0 +1 @@
+../Notes \ No newline at end of file
diff --git a/Docs/Readme b/Docs/Readme
new file mode 100644
index 000000000000..1f98f38d30f1
--- /dev/null
+++ b/Docs/Readme
@@ -0,0 +1,21 @@
+Docs - DTraceToolkit Documentation
+
+ Docs/Contents summary of toolkit commands
+ Examples examples of command usage
+ Notes notes on commands
+
+The following may be followed to learn about a DTraceToolkit command,
+
+ 1. read "Contents" for a command name and toolkit location.
+ 2. run the command with "-h" to check it's usage.
+ 3. read the manpage from Man/man1m.
+ 4. read the examples from Examples.
+ 5. read the notes from Notes.
+ 6. read the script itself
+
+Try the following to discover all docs related to a command, eg iosnoop,
+
+ find . | grep iosnoop
+
+best run from the DTraceToolkit root directory.
+
diff --git a/Docs/ToDo b/Docs/ToDo
new file mode 100644
index 000000000000..5561ea4b17ad
--- /dev/null
+++ b/Docs/ToDo
@@ -0,0 +1,7 @@
+ToDo - To Do List
+
+ The following is a list of todo reminders for the DTraceToolkit.
+
+* Run PHP examples on mediawiki.
+
+
diff --git a/Docs/Who b/Docs/Who
new file mode 100644
index 000000000000..f1019a9b92b1
--- /dev/null
+++ b/Docs/Who
@@ -0,0 +1,74 @@
+Who - Who the Contributers are
+
+ This is a record of contributors to the DTraceToolkit whose name isn't
+ already mentioned (such as in the source of a script).
+
+
+In alphabetical first-name order,
+
+Adam Leventhal
+ Location: CA, USA
+ Blog: http://blogs.sun.com/ahl
+ wrote DTrace itself
+
+Ben Rockwood
+ Location: CA, USA
+ Website: http://www.cuddletech.com
+ first encouraged the idea of DTrace oneliners
+
+Brendan Gregg
+ Location: Sydney, Australia
+ Website: http://www.brendangregg.com
+ Email: brendan.gregg@tpg.com.au (maybe, check the website above)
+ Blog: http://bdgregg.blogspot.com
+ Notes: Also see http://www.brendangregg.com/dtrace.html
+ created toolkit, tools, manpages, example docs, notes docs, testing
+
+Bryan Cantrill
+ Location: CA, USA
+ Blog: http://blogs.sun.com/bmc
+ wrote DTrace itself
+
+David Rubio
+ technical advice
+
+James Dickens
+ Location: WI, USA
+ Blog: http://uadmin.blogspot.com
+ tool ideas and testing
+
+Jonathan Adams
+ Blog: http://blogs.sun.com/jwadams
+ wrote stacksize.d
+
+Mike Shapiro
+ Location: CA, USA
+ Blog: http://blogs.sun.com/mws
+ wrote DTrace itself
+
+Nathan Kroenert
+ Location: Sydney, Australia
+ thoughts on how to present tools
+
+Richard McDougall
+ Location: CA, USA
+ Website: http://www.solarisinternals.com
+ Blog: http://blogs.sun.com/rmc
+ wrote pfilestat, vopstat
+
+Ryan Matteson
+ Location: USA
+ Blog: http://blogomatty.blogspot.com
+ tool ideas and testing
+
+Stefan Parvu
+ Blog: http://stefanparvu.blogspot.com
+ suggestions, bug fixes, extensive testing
+
+unknown Sun people
+ wrote /usr/demo/dtrace tools, which some of the toolkit tools are
+ based on. See "BASED ON" in source or man page, or try the following,
+ cd Bin
+ grep 'BASED ON' *
+ for a list.
+
diff --git a/Docs/cddl1.txt b/Docs/cddl1.txt
new file mode 100644
index 000000000000..b3487ade1b87
--- /dev/null
+++ b/Docs/cddl1.txt
@@ -0,0 +1,385 @@
+
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+
+ 1. Definitions.
+
+ 1.1. ÒContributorÓ means each individual or entity that
+ creates or contributes to the creation of Modifications.
+
+ 1.2. ÒContributor VersionÓ means the combination of the
+ Original Software, prior Modifications used by a
+ Contributor (if any), and the Modifications made by that
+ particular Contributor.
+
+ 1.3. ÒCovered SoftwareÓ means (a) the Original Software, or
+ (b) Modifications, or (c) the combination of files
+ containing Original Software with files containing
+ Modifications, in each case including portions thereof.
+
+ 1.4. ÒExecutableÓ means the Covered Software in any form
+ other than Source Code.
+
+ 1.5. ÒInitial DeveloperÓ means the individual or entity
+ that first makes Original Software available under this
+ License.
+
+ 1.6. ÒLarger WorkÓ means a work which combines Covered
+ Software or portions thereof with code not governed by the
+ terms of this License.
+
+ 1.7. ÒLicenseÓ means this document.
+
+ 1.8. ÒLicensableÓ means having the right to grant, to the
+ maximum extent possible, whether at the time of the initial
+ grant or subsequently acquired, any and all of the rights
+ conveyed herein.
+
+ 1.9. ÒModificationsÓ means the Source Code and Executable
+ form of any of the following:
+
+ A. Any file that results from an addition to,
+ deletion from or modification of the contents of a
+ file containing Original Software or previous
+ Modifications;
+
+ B. Any new file that contains any part of the
+ Original Software or previous Modification; or
+
+ C. Any new file that is contributed or otherwise made
+ available under the terms of this License.
+
+ 1.10. ÒOriginal SoftwareÓ means the Source Code and
+ Executable form of computer software code that is
+ originally released under this License.
+
+ 1.11. ÒPatent ClaimsÓ means any patent claim(s), now owned
+ or hereafter acquired, including without limitation,
+ method, process, and apparatus claims, in any patent
+ Licensable by grantor.
+
+ 1.12. ÒSource CodeÓ means (a) the common form of computer
+ software code in which modifications are made and (b)
+ associated documentation included in or with such code.
+
+ 1.13. ÒYouÓ (or ÒYourÓ) means an individual or a legal
+ entity exercising rights under, and complying with all of
+ the terms of, this License. For legal entities, ÒYouÓ
+ includes any entity which controls, is controlled by, or is
+ under common control with You. For purposes of this
+ definition, ÒcontrolÓ means (a) the power, direct or
+ indirect, to cause the direction or management of such
+ entity, whether by contract or otherwise, or (b) ownership
+ of more than fifty percent (50%) of the outstanding shares
+ or beneficial ownership of such entity.
+
+ 2. License Grants.
+
+ 2.1. The Initial Developer Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and
+ subject to third party intellectual property claims, the
+ Initial Developer hereby grants You a world-wide,
+ royalty-free, non-exclusive license:
+
+ (a) under intellectual property rights (other than
+ patent or trademark) Licensable by Initial Developer,
+ to use, reproduce, modify, display, perform,
+ sublicense and distribute the Original Software (or
+ portions thereof), with or without Modifications,
+ and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making,
+ using or selling of Original Software, to make, have
+ made, use, practice, sell, and offer for sale, and/or
+ otherwise dispose of the Original Software (or
+ portions thereof).
+
+ (c) The licenses granted in Sections 2.1(a) and (b)
+ are effective on the date Initial Developer first
+ distributes or otherwise makes the Original Software
+ available to a third party under the terms of this
+ License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent
+ license is granted: (1) for code that You delete from
+ the Original Software, or (2) for infringements
+ caused by: (i) the modification of the Original
+ Software, or (ii) the combination of the Original
+ Software with other software or devices.
+
+ 2.2. Contributor Grant.
+
+ Conditioned upon Your compliance with Section 3.1 below and
+ subject to third party intellectual property claims, each
+ Contributor hereby grants You a world-wide, royalty-free,
+ non-exclusive license:
+
+ (a) under intellectual property rights (other than
+ patent or trademark) Licensable by Contributor to
+ use, reproduce, modify, display, perform, sublicense
+ and distribute the Modifications created by such
+ Contributor (or portions thereof), either on an
+ unmodified basis, with other Modifications, as
+ Covered Software and/or as part of a Larger Work; and
+
+
+ (b) under Patent Claims infringed by the making,
+ using, or selling of Modifications made by that
+ Contributor either alone and/or in combination with
+ its Contributor Version (or portions of such
+ combination), to make, use, sell, offer for sale,
+ have made, and/or otherwise dispose of: (1)
+ Modifications made by that Contributor (or portions
+ thereof); and (2) the combination of Modifications
+ made by that Contributor with its Contributor Version
+ (or portions of such combination).
+
+ (c) The licenses granted in Sections 2.2(a) and
+ 2.2(b) are effective on the date Contributor first
+ distributes or otherwise makes the Modifications
+ available to a third party.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent
+ license is granted: (1) for any code that Contributor
+ has deleted from the Contributor Version; (2) for
+ infringements caused by: (i) third party
+ modifications of Contributor Version, or (ii) the
+ combination of Modifications made by that Contributor
+ with other software (except as part of the
+ Contributor Version) or other devices; or (3) under
+ Patent Claims infringed by Covered Software in the
+ absence of Modifications made by that Contributor.
+
+ 3. Distribution Obligations.
+
+ 3.1. Availability of Source Code.
+
+ Any Covered Software that You distribute or otherwise make
+ available in Executable form must also be made available in
+ Source Code form and that Source Code form must be
+ distributed only under the terms of this License. You must
+ include a copy of this License with every copy of the
+ Source Code form of the Covered Software You distribute or
+ otherwise make available. You must inform recipients of any
+ such Covered Software in Executable form as to how they can
+ obtain such Covered Software in Source Code form in a
+ reasonable manner on or through a medium customarily used
+ for software exchange.
+
+ 3.2. Modifications.
+
+ The Modifications that You create or to which You
+ contribute are governed by the terms of this License. You
+ represent that You believe Your Modifications are Your
+ original creation(s) and/or You have sufficient rights to
+ grant the rights conveyed by this License.
+
+ 3.3. Required Notices.
+
+ You must include a notice in each of Your Modifications
+ that identifies You as the Contributor of the Modification.
+ You may not remove or alter any copyright, patent or
+ trademark notices contained within the Covered Software, or
+ any notices of licensing or any descriptive text giving
+ attribution to any Contributor or the Initial Developer.
+
+ 3.4. Application of Additional Terms.
+
+ You may not offer or impose any terms on any Covered
+ Software in Source Code form that alters or restricts the
+ applicable version of this License or the recipientsÕ
+ rights hereunder. You may choose to offer, and to charge a
+ fee for, warranty, support, indemnity or liability
+ obligations to one or more recipients of Covered Software.
+ However, you may do so only on Your own behalf, and not on
+ behalf of the Initial Developer or any Contributor. You
+ must make it absolutely clear that any such warranty,
+ support, indemnity or liability obligation is offered by
+ You alone, and You hereby agree to indemnify the Initial
+ Developer and every Contributor for any liability incurred
+ by the Initial Developer or such Contributor as a result of
+ warranty, support, indemnity or liability terms You offer.
+
+
+ 3.5. Distribution of Executable Versions.
+
+ You may distribute the Executable form of the Covered
+ Software under the terms of this License or under the terms
+ of a license of Your choice, which may contain terms
+ different from this License, provided that You are in
+ compliance with the terms of this License and that the
+ license for the Executable form does not attempt to limit
+ or alter the recipientÕs rights in the Source Code form
+ from the rights set forth in this License. If You
+ distribute the Covered Software in Executable form under a
+ different license, You must make it absolutely clear that
+ any terms which differ from this License are offered by You
+ alone, not by the Initial Developer or Contributor. You
+ hereby agree to indemnify the Initial Developer and every
+ Contributor for any liability incurred by the Initial
+ Developer or such Contributor as a result of any such terms
+ You offer.
+
+ 3.6. Larger Works.
+
+ You may create a Larger Work by combining Covered Software
+ with other code not governed by the terms of this License
+ and distribute the Larger Work as a single product. In such
+ a case, You must make sure the requirements of this License
+ are fulfilled for the Covered Software.
+
+ 4. Versions of the License.
+
+ 4.1. New Versions.
+
+ Sun Microsystems, Inc. is the initial license steward and
+ may publish revised and/or new versions of this License
+ from time to time. Each version will be given a
+ distinguishing version number. Except as provided in
+ Section 4.3, no one other than the license steward has the
+ right to modify this License.
+
+ 4.2. Effect of New Versions.
+
+ You may always continue to use, distribute or otherwise
+ make the Covered Software available under the terms of the
+ version of the License under which You originally received
+ the Covered Software. If the Initial Developer includes a
+ notice in the Original Software prohibiting it from being
+ distributed or otherwise made available under any
+ subsequent version of the License, You must distribute and
+ make the Covered Software available under the terms of the
+ version of the License under which You originally received
+ the Covered Software. Otherwise, You may also choose to
+ use, distribute or otherwise make the Covered Software
+ available under the terms of any subsequent version of the
+ License published by the license steward.
+
+ 4.3. Modified Versions.
+
+ When You are an Initial Developer and You want to create a
+ new license for Your Original Software, You may create and
+ use a modified version of this License if You: (a) rename
+ the license and remove any references to the name of the
+ license steward (except to note that the license differs
+ from this License); and (b) otherwise make it clear that
+ the license contains terms which differ from this License.
+
+
+ 5. DISCLAIMER OF WARRANTY.
+
+ COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN ÒAS ISÓ
+ BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+ INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED
+ SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+ PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
+ PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY
+ COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+ INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF
+ ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
+ WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
+ DISCLAIMER.
+
+ 6. TERMINATION.
+
+ 6.1. This License and the rights granted hereunder will
+ terminate automatically if You fail to comply with terms
+ herein and fail to cure such breach within 30 days of
+ becoming aware of the breach. Provisions which, by their
+ nature, must remain in effect beyond the termination of
+ this License shall survive.
+
+ 6.2. If You assert a patent infringement claim (excluding
+ declaratory judgment actions) against Initial Developer or
+ a Contributor (the Initial Developer or Contributor against
+ whom You assert such claim is referred to as ÒParticipantÓ)
+ alleging that the Participant Software (meaning the
+ Contributor Version where the Participant is a Contributor
+ or the Original Software where the Participant is the
+ Initial Developer) directly or indirectly infringes any
+ patent, then any and all rights granted directly or
+ indirectly to You by such Participant, the Initial
+ Developer (if the Initial Developer is not the Participant)
+ and all Contributors under Sections 2.1 and/or 2.2 of this
+ License shall, upon 60 days notice from Participant
+ terminate prospectively and automatically at the expiration
+ of such 60 day notice period, unless if within such 60 day
+ period You withdraw Your claim with respect to the
+ Participant Software against such Participant either
+ unilaterally or pursuant to a written agreement with
+ Participant.
+
+ 6.3. In the event of termination under Sections 6.1 or 6.2
+ above, all end user licenses that have been validly granted
+ by You or any distributor hereunder prior to termination
+ (excluding licenses granted to You by any distributor)
+ shall survive termination.
+
+ 7. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+ (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
+ INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
+ COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE
+ LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
+ CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
+ LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK
+ STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+ COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+ INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+ LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL
+ INJURY RESULTING FROM SUCH PARTYÕS NEGLIGENCE TO THE EXTENT
+ APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO
+ NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR
+ CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT
+ APPLY TO YOU.
+
+ 8. U.S. GOVERNMENT END USERS.
+
+ The Covered Software is a Òcommercial item,Ó as that term is
+ defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of Òcommercial
+ computer softwareÓ (as that term is defined at 48 C.F.R. ¤
+ 252.227-7014(a)(1)) and Òcommercial computer software
+ documentationÓ as such terms are used in 48 C.F.R. 12.212 (Sept.
+ 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1
+ through 227.7202-4 (June 1995), all U.S. Government End Users
+ acquire Covered Software with only those rights set forth herein.
+ This U.S. Government Rights clause is in lieu of, and supersedes,
+ any other FAR, DFAR, or other clause or provision that addresses
+ Government rights in computer software under this License.
+
+ 9. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject
+ matter hereof. If any provision of this License is held to be
+ unenforceable, such provision shall be reformed only to the
+ extent necessary to make it enforceable. This License shall be
+ governed by the law of the jurisdiction specified in a notice
+ contained within the Original Software (except to the extent
+ applicable law, if any, provides otherwise), excluding such
+ jurisdictionÕs conflict-of-law provisions. Any litigation
+ relating to this License shall be subject to the jurisdiction of
+ the courts located in the jurisdiction and venue specified in a
+ notice contained within the Original Software, with the losing
+ party responsible for costs, including, without limitation, court
+ costs and reasonable attorneysÕ fees and expenses. The
+ application of the United Nations Convention on Contracts for the
+ International Sale of Goods is expressly excluded. Any law or
+ regulation which provides that the language of a contract shall
+ be construed against the drafter shall not apply to this License.
+ You agree that You alone are responsible for compliance with the
+ United States export administration regulations (and the export
+ control laws and regulation of any other countries) when You use,
+ distribute or otherwise make available any Covered Software.
+
+ 10. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is
+ responsible for claims and damages arising, directly or
+ indirectly, out of its utilization of rights under this License
+ and You agree to work with Initial Developer and Contributors to
+ distribute such responsibility on an equitable basis. Nothing
+ herein is intended or shall be deemed to constitute any admission
+ of liability.
diff --git a/Docs/oneliners.txt b/Docs/oneliners.txt
new file mode 100644
index 000000000000..fca2aa313e2f
--- /dev/null
+++ b/Docs/oneliners.txt
@@ -0,0 +1,81 @@
+#
+# DTrace OneLiners
+#
+
+DTrace One Liners,
+
+# New processes with arguments,
+dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }'
+
+# Files opened by process name,
+dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
+
+# Files created using creat() by process name,
+dtrace -n 'syscall::creat*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
+
+# Syscall count by process name,
+dtrace -n 'syscall:::entry { @num[execname] = count(); }'
+
+# Syscall count by syscall,
+dtrace -n 'syscall:::entry { @num[probefunc] = count(); }'
+
+# Syscall count by process ID,
+dtrace -n 'syscall:::entry { @num[pid,execname] = count(); }'
+
+# Read bytes by process name,
+dtrace -n 'sysinfo:::readch { @bytes[execname] = sum(arg0); }'
+
+# Write bytes by process name,
+dtrace -n 'sysinfo:::writech { @bytes[execname] = sum(arg0); }'
+
+# Read size distribution by process name,
+dtrace -n 'sysinfo:::readch { @dist[execname] = quantize(arg0); }'
+
+# Write size distribution by process name,
+dtrace -n 'sysinfo:::writech { @dist[execname] = quantize(arg0); }'
+
+# Disk size by process ID,
+dtrace -n 'io:::start { printf("%d %s %d",pid,execname,args[0]->b_bcount); }'
+
+# Disk size aggregation
+dtrace -n 'io:::start { @size[execname] = quantize(args[0]->b_bcount); }'
+
+# Pages paged in by process name,
+dtrace -n 'vminfo:::pgpgin { @pg[execname] = sum(arg0); }'
+
+# Minor faults by process name,
+dtrace -n 'vminfo:::as_fault { @mem[execname] = sum(arg0); }'
+
+# Interrupts by CPU,
+dtrace -n 'sdt:::interrupt-start { @num[cpu] = count(); }'
+
+# CPU cross calls by process name,
+dtrace -n 'sysinfo:::xcalls { @num[execname] = count(); }'
+
+# Lock time by process name,
+dtrace -n 'lockstat:::adaptive-block { @time[execname] = sum(arg1); }'
+
+# Lock distribution by process name,
+dtrace -n 'lockstat:::adaptive-block { @time[execname] = quantize(arg1); }'
+
+# Kernel funtion calls by module
+dtrace -n 'fbt:::entry { @calls[probemod] = count(); }'
+
+# Stack size for processes
+dtrace -n 'sched:::on-cpu { @[execname] = max(curthread->t_procp->p_stksize);}'
+
+# Kill all top processes when they are invoked,
+dtrace -wn 'syscall::exece:return /execname == "top"/ { raise(9); }'
+
+
+
+DTrace Longer One Liners,
+
+# New processes with arguments and time,
+dtrace -qn 'syscall::exec*:return { printf("%Y %s\n",walltimestamp,curpsinfo->pr_psargs); }'
+
+# Successful signal details,
+dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'
+
+
+
diff --git a/Examples/Copyright b/Examples/Copyright
new file mode 100644
index 000000000000..d802fe9086b4
--- /dev/null
+++ b/Examples/Copyright
@@ -0,0 +1 @@
+The examples in this directory are copyright to their author.
diff --git a/Examples/Readme b/Examples/Readme
new file mode 100644
index 000000000000..762a3312abf8
--- /dev/null
+++ b/Examples/Readme
@@ -0,0 +1,21 @@
+Examples - Script demos, screenshots, and how to read the output
+
+ This directory contains an example file per script in the DTraceToolkit.
+
+ When I hear of a new performance tool or what not, the first thing I want
+ to see are screenshots. They illustrate,
+
+ - generally what the tool is for
+ - many details and features, since the output is (supposed to be)
+ as intuitive as possible
+ - how to use the tool (command line usage)
+
+ It is a rapid way to get a handle on what a tool generally is, and how
+ to start using it. The files in this directory serve that purpose.
+
+ These are especially important now that the DTraceToolkit has over 200
+ scripts. Flicking through these files and seeing the screenshots may
+ be the quickest way to find what you are after.
+
+ Of course, don't forget to read the man pages and notes files too :)
+
diff --git a/Examples/anonpgpid_example.txt b/Examples/anonpgpid_example.txt
new file mode 100644
index 000000000000..b505f3d1596f
--- /dev/null
+++ b/Examples/anonpgpid_example.txt
@@ -0,0 +1,73 @@
+The following is a demonstration of the anonpgpid.d script,
+
+
+Here we run it on a system that is implementing memory caps using the
+resource capping daemon, "rcapd",
+
+ # anonpgpid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD D BYTES
+ 6215 bash R 8192
+ 6215 bash W 126976
+ 5809 rcapd R 245760
+ 6222 memleak.pl R 974848
+ 6222 memleak.pl W 3055616
+
+The "memleak.pl" process consumes memory, and we can see above that it has
+encountered both reads and writes to the physical swap device - it is being
+paged out. A bash shell was also effected (which was in the same project that
+rcapd was monitoring).
+
+
+
+The following is an ordinary system that is very low on memory,
+
+ # anonpgpid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD D BYTES
+ 18885 sendmail R 4096
+ 18600 automountd R 4096
+ 1 init R 4096
+ 2456 inetd R 8192
+ 18546 nscd R 8192
+ 2400 bash R 12288
+ 217 utmpd R 28672
+ 221 ttymon R 32768
+ 210 sac R 36864
+ 18777 snmpd R 49152
+ 18440 init R 49152
+ 89 nscd R 61440
+ 318 syslogd R 73728
+ 487 snmpd R 81920
+ 2453 inetd R 102400
+ 165 in.routed R 131072
+ 294 automountd R 135168
+ 215 inetd R 135168
+ 187 rpcbind R 204800
+ 86 kcfd R 290816
+ 7 svc.startd R 1015808
+ 9 svc.configd R 1478656
+ 2 pageout W 23453696
+
+The "pageout" process is responsible for writing all the anonymous memory
+pages to the physical swap device, and we can see from the above that it
+has written 23 Mb. When processes access anonymous memory that has been
+swapped out, a major fault occurs and the memory is paged back in; in this
+case we can trace the process that was effected, and from the above we can
+see that several processes have been effected by the memory pressure.
+The most is "svc.configd", which needed to page back in 1.4 Mb of anonymous
+memory.
+
+
+
+Sometimes anonpgpid.d doesn't help too much. Here we only have pageouts
+to the physical swap device and no pageins,
+
+ # anonpgpid.d
+ ^C
+ PID CMD D BYTES
+ 2 pageout W 61083648
+
+Only pageout is identified.
diff --git a/Examples/bitesize_example.txt b/Examples/bitesize_example.txt
new file mode 100644
index 000000000000..dcc697d5070d
--- /dev/null
+++ b/Examples/bitesize_example.txt
@@ -0,0 +1,74 @@
+In this example, bitesize.d was run for several seconds then Ctrl-C was hit.
+As bitesize.d runs it records how processes on the system are accessing the
+disks - in particular the size of the I/O operation. It is usually desirable
+for processes to be requesting large I/O operations rather than taking many
+small "bites".
+
+The final report highlights how processes performed. The find command mostly
+read 1K blocks while the tar command was reading large blocks - both as
+expected.
+
+ # bitesize.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ PID CMD
+ 7110 -bash\0
+
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@ 1
+ 8192 | 0
+
+ 7110 sync\0
+
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@ 1
+ 2048 |@@@@@@@@@@ 2
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 16384 | 0
+
+ 0 sched\0
+
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@ 1
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 16384 | 0
+
+ 7109 find /\0
+
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1452
+ 2048 |@@ 91
+ 4096 | 33
+ 8192 |@@ 97
+ 16384 | 0
+
+ 3 fsflush\0
+
+ value ------------- Distribution ------------- count
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 449
+ 16384 | 0
+
+ 7108 tar cf /dev/null /\0
+
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 | 70
+ 1024 |@@@@@@@@@@ 1306
+ 2048 |@@@@ 569
+ 4096 |@@@@@@@@@ 1286
+ 8192 |@@@@@@@@@@ 1403
+ 16384 |@ 190
+ 32768 |@@@ 396
+ 65536 | 0
+
+
diff --git a/Examples/connections_example.txt b/Examples/connections_example.txt
new file mode 100644
index 000000000000..e39d063113a8
--- /dev/null
+++ b/Examples/connections_example.txt
@@ -0,0 +1,23 @@
+The following is an example of connections. As inbound TCP connections are
+established their details are printed out. This includes the UID, PID and
+CMD of the server process that is listening on that port,
+
+ # connections
+ UID PID CMD TYPE PORT IP_SOURCE
+ 0 242 inetd tcp 79 192.168.1.1
+ 0 359 sshd tcp 22 192.168.1.1
+ 100 1532 Xorg tcp 6000 192.168.1.1
+ ^C
+
+
+In another window snoop was running for comparison,
+
+ # snoop 'tcp[13:1] = 0x02'
+ Using device /dev/rtls0 (promiscuous mode)
+ mars -> jupiter FINGER C port=56760
+ mars -> jupiter TCP D=22 S=56761 Syn Seq=3264782212 Len=0 ...
+ mars -> jupiter XWIN C port=56763
+
+snoop can already tell me that these connections are happening - but does not
+print out details of the server that accepted the connection.
+
diff --git a/Examples/cpudists_example.txt b/Examples/cpudists_example.txt
new file mode 100644
index 000000000000..aa8256b7b7a9
--- /dev/null
+++ b/Examples/cpudists_example.txt
@@ -0,0 +1,276 @@
+The following demonstrates the cpudists program. It prints distributions
+of CPU time consumed by the Kernel, Idle thread, or Processes.
+
+Here we run cpudists for 5 seconds once,
+
+# ./cpudists 5 1
+2005 Apr 28 00:08:42,
+ KERNEL
+ value ------------- Distribution ------------- count
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1134
+ 16384 |@@@@@@@@@ 344
+ 32768 |@@@ 104
+ 65536 | 3
+ 131072 | 0
+ 262144 | 1
+ 524288 | 0
+ 1048576 | 11
+ 2097152 | 0
+
+ PROCESS
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@ 170
+ 32768 |@@@@@@@@@@@@@@@@@@ 331
+ 65536 |@@@@@@@@ 152
+ 131072 |@ 17
+ 262144 |@ 25
+ 524288 |@ 13
+ 1048576 | 4
+ 2097152 | 9
+ 4194304 | 0
+
+ IDLE
+ value ------------- Distribution ------------- count
+ 2097152 | 0
+ 4194304 |@ 9
+ 8388608 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 418
+ 16777216 |@@@ 31
+ 33554432 | 0
+
+The value indicates the time in nanoseconds, the count the number of
+runs for this length.
+
+From the above, we can see the kernel has run many times - but for short
+intervals each time. Processes have taken fom 10 to 60 microseconds;
+and when the idle thread runs it runs for some time - around 8 milliseconds
+for each.
+
+
+
+
+cpudists has a "-a" option for all processes,
+
+# ./cpudists -a 5 1
+2005 Apr 28 00:17:34,
+ mapping-daemon
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32768 |@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+ sendmail
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@ 1
+ 131072 | 0
+
+ nautilus
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@ 1
+ 131072 | 0
+
+ fmd
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@ 1
+ 131072 | 0
+
+ in.routed
+ value ------------- Distribution ------------- count
+ 65536 | 0
+ 131072 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 262144 | 0
+
+ miniserv.pl
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32768 | 0
+ 65536 | 0
+ 131072 |@@@@@@@@@@@@@ 1
+ 262144 | 0
+
+ xscreensaver
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@ 2
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@ 2
+ 131072 | 0
+
+gnome-vfs-daemon
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@ 2
+ 131072 | 0
+
+ gnome-panel
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@ 1
+ 32768 |@@@@@@@@@@@@@@@@ 2
+ 65536 | 0
+ 131072 |@@@@@@@@@@@@@@@@ 2
+ 262144 | 0
+
+ svc.startd
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 32768 |@@@@@@@@@@@ 4
+ 65536 |@@@ 1
+ 131072 | 0
+
+ nscd
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 25
+ 32768 |@ 1
+ 65536 | 0
+ 131072 |@ 1
+ 262144 | 0
+
+gnome-netstatus-
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32768 | 0
+ 65536 | 0
+ 131072 | 0
+ 262144 | 0
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ mixer_applet2
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@ 10
+ 32768 |@@@@@@@@@@@@@@@@@ 19
+ 65536 |@@@@@@@@@@@@@@ 16
+ 131072 | 0
+
+ soffice.bin
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@ 7
+ 32768 |@@@@@@@@@@@@@@@@@@@ 14
+ 65536 |@@@@@@@@ 6
+ 131072 | 0
+ 262144 |@@@ 2
+ 524288 | 0
+ 1048576 | 0
+ 2097152 |@ 1
+ 4194304 | 0
+
+ dtrace
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 32768 | 0
+ 65536 | 0
+ 131072 | 0
+ 262144 |@@@ 1
+ 524288 |@@@@@@@@@ 3
+ 1048576 | 0
+ 2097152 |@@@ 1
+ 4194304 | 0
+
+ Xorg
+ value ------------- Distribution ------------- count
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@ 15
+ 131072 |@@@@@@@@ 6
+ 262144 |@@@@@@@@@@@@ 9
+ 524288 | 0
+
+ java_vm
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@ 101
+ 32768 |@@@@@@@@@@@@@@@@ 84
+ 65536 |@@@@ 20
+ 131072 | 0
+
+ gnome-terminal
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@ 12
+ 65536 |@@@@@@@@@@@ 8
+ 131072 |@ 1
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@ 9
+ 1048576 | 0
+
+ acroread
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 | 1
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 188
+ 65536 |@@@@@@@@ 47
+ 131072 |@@ 10
+ 262144 | 0
+
+ mozilla-bin
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@ 21
+ 32768 |@@@@@ 13
+ 65536 |@@@@@@@@@@@@@ 36
+ 131072 |@@@@@@@ 19
+ 262144 |@@@ 9
+ 524288 |@@ 5
+ 1048576 |@ 2
+ 2097152 |@@ 5
+ 4194304 | 0
+
+ KERNEL
+ value ------------- Distribution ------------- count
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 1085
+ 16384 |@@@@@@@@@@@ 443
+ 32768 |@@ 98
+ 65536 | 5
+ 131072 | 1
+ 262144 | 1
+ 524288 | 0
+ 1048576 | 11
+ 2097152 | 0
+
+ fsflush
+ value ------------- Distribution ------------- count
+ 131072 | 0
+ 262144 |@@@@@@@ 1
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 2097152 | 0
+ 4194304 | 0
+ 8388608 | 0
+ 16777216 | 0
+ 33554432 |@@@@@@@ 1
+ 67108864 | 0
+
+ IDLE
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 | 1
+ 2097152 | 0
+ 4194304 |@ 13
+ 8388608 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 411
+ 16777216 |@@@ 31
+ 33554432 | 0
+
+
+
diff --git a/Examples/cputimes_example.txt b/Examples/cputimes_example.txt
new file mode 100644
index 000000000000..253a7a34bd6e
--- /dev/null
+++ b/Examples/cputimes_example.txt
@@ -0,0 +1,210 @@
+The following demonstrates running the cputimes program on an idle system.
+We use an interval of 1 second and a count of 3,
+
+ # ./cputimes 1 3
+ 2005 Apr 27 23:37:58,
+ THREADS TIME (ns)
+ KERNEL 10795499
+ PROCESS 20941091
+ IDLE 970707443
+ 2005 Apr 27 23:37:59,
+ THREADS TIME (ns)
+ KERNEL 8919418
+ PROCESS 77446789
+ IDLE 910555040
+ 2005 Apr 27 23:38:00,
+ THREADS TIME (ns)
+ KERNEL 8615123
+ PROCESS 78314246
+ IDLE 810100417
+
+In the above output, we can see a breakdown of CPU time into the catagories
+KERNEL, PROCESS and IDLE. The time is measured in nanoseconds. Most of the
+time is in the IDLE category, as the system is idle. Very little time
+was spent serving the kernel.
+
+
+
+
+In the following example, several programs are run to hog the CPUs,
+
+ # ./cputimes 1 3
+ 2005 Apr 27 23:40:58,
+ THREADS TIME (ns)
+ KERNEL 11398807
+ PROCESS 992254664
+ 2005 Apr 27 23:40:59,
+ THREADS TIME (ns)
+ KERNEL 9205260
+ PROCESS 987561182
+ 2005 Apr 27 23:41:00,
+ THREADS TIME (ns)
+ KERNEL 9196669
+ PROCESS 877850474
+
+Now there is no IDLE category, as the system is 100% utilised.
+The programs were the following,
+
+ while :; do :; done &
+
+which keeps the CPU busy.
+
+
+
+
+In the following example a different style of program is run to hog the CPUs,
+
+ while :; do date; done
+
+This causes many processes to be created and destroyed in a hurry, and can
+be difficult to troubleshoot (tools like prstat cannot sample quick enough
+to easily identify what is going on). The following is the cputimes output,
+
+ # ./cputimes 1 3
+ 2005 Apr 27 23:45:30,
+ THREADS TIME (ns)
+ KERNEL 192647392
+ PROCESS 835397568
+ 2005 Apr 27 23:45:31,
+ THREADS TIME (ns)
+ KERNEL 168773713
+ PROCESS 810825730
+ 2005 Apr 27 23:45:32,
+ THREADS TIME (ns)
+ KERNEL 151676122
+ PROCESS 728477272
+
+Now the kernel is doing a substantial amount of work to create and destroy
+these processes.
+
+
+
+
+In the following example, a large amount of network activity occurs while
+cputimes is running,
+
+ # ./cputimes 1 6
+ 2005 Apr 27 23:49:29,
+ THREADS TIME (ns)
+ KERNEL 10596399
+ PROCESS 21793920
+ IDLE 974395713
+ 2005 Apr 27 23:49:30,
+ THREADS TIME (ns)
+ KERNEL 251465759
+ IDLE 357436576
+ PROCESS 508986422
+ 2005 Apr 27 23:49:31,
+ THREADS TIME (ns)
+ IDLE 9758227
+ KERNEL 367645318
+ PROCESS 385427847
+ 2005 Apr 27 23:49:32,
+ THREADS TIME (ns)
+ IDLE 28351679
+ KERNEL 436022725
+ PROCESS 451304688
+ 2005 Apr 27 23:49:33,
+ THREADS TIME (ns)
+ KERNEL 262586158
+ PROCESS 325238896
+ IDLE 358243503
+ 2005 Apr 27 23:49:34,
+ THREADS TIME (ns)
+ KERNEL 10075578
+ PROCESS 238170506
+ IDLE 647956998
+
+Initially the system is idle. A command is run to cause heavy network
+activity, which peaks during the fourth sample - during which the kernel
+is using around 40% of the CPU. The Solaris 10 command "intrstat" can
+help to analyse this activity further.
+
+
+
+
+Longer samples are possible. The following is a 60 second sample,
+
+ # ./cputimes 60 1
+ 2005 Apr 27 23:53:02,
+ THREADS TIME (ns)
+ KERNEL 689808449
+ PROCESS 8529562214
+ IDLE 50406951876
+ #
+
+
+
+
+cputimes has a "-a" option to print all processes. The following is a
+single 1 second sample with -a,
+
+ # ./cputimes -a 1 1
+ 2005 Apr 28 00:00:32,
+ THREADS TIME (ns)
+ svc.startd 51042
+ nautilus 130645
+ in.routed 131823
+ fmd 152822
+ nscd 307042
+ dsdm 415799
+ mixer_applet2 551066
+ gnome-smproxy 587234
+ xscreensaver 672270
+ fsflush 1060196
+ java_vm 1552988
+ wnck-applet 2060870
+ dtrace 2398658
+ acroread 2614687
+ soffice.bin 2825117
+ mozilla-bin 5497488
+ KERNEL 13541120
+ metacity 28924204
+ gnome-terminal 74304348
+ Xorg 289631407
+ IDLE 465054209
+
+The times are in nanoseconds, and multiple processes with the same name
+have their times aggregated. The above output is at an amazing resolution -
+svc.startd ran for 51 microseconds, and soffice.bin ran for 28 milliseconds.
+
+
+
+
+The following is a 10 second sample on an idle desktop,
+
+ # ./cputimes -a 10 1
+ 2005 Apr 28 00:03:57,
+ THREADS TIME (ns)
+ snmpd 127859
+ fmd 171897
+ inetd 177134
+ svc.configd 185006
+ mapping-daemon 197674
+ miniserv.pl 305603
+ gconfd-2 330511
+ xscreensaver 443207
+ sendmail 473434
+ nautilus 506799
+ gnome-vfs-daemon 549037
+ gnome-panel 770631
+ nscd 885353
+ svc.startd 1181286
+ gnome-netstatus- 4329671
+ mixer_applet2 4833519
+ dtrace 6244366
+ in.routed 6556075
+ fsflush 9553155
+ soffice.bin 13954327
+ java_vm 16285243
+ acroread 32126193
+ gnome-terminal 34891991
+ Xorg 35553412
+ mozilla-bin 67855629
+ KERNEL 94834997
+ IDLE 9540941846
+
+Wow, maybe not as idle as I thought!
+
+
+
diff --git a/Examples/cputypes_example.txt b/Examples/cputypes_example.txt
new file mode 100644
index 000000000000..158a43f15875
--- /dev/null
+++ b/Examples/cputypes_example.txt
@@ -0,0 +1,40 @@
+The following are demonstrations of the cputypes.d script,
+
+
+This is running cputypes.d on a desktop,
+
+ # cputypes.d
+ CPU CHIP PSET LGRP CLOCK TYPE FPU
+ 0 0 0 0 867 i386 i387 compatible
+
+fairly boring.
+
+
+
+The following is a multi CPU x86 server,
+
+ # cputypes.d
+ CPU CHIP PSET LGRP CLOCK TYPE FPU
+ 0 0 0 0 2791 i386 i387 compatible
+ 1 3 1 0 2791 i386 i387 compatible
+ 2 0 0 0 2791 i386 i387 compatible
+ 3 3 0 0 2791 i386 i387 compatible
+
+Much more interesting! We can see from the CHIP field that there is actually
+two CPUs, each with two cores. There is also two processor sets (0, 1).
+
+The CPUs were printed in CPU id order by mere chance.
+
+
+
+Here is a multi CPU SPARC server,
+
+ # cputypes.d
+ CPU CHIP PSET LGRP CLOCK TYPE FPU
+ 0 0 0 0 400 sparcv9 sparcv9
+ 1 1 0 0 400 sparcv9 sparcv9
+ 4 4 0 0 400 sparcv9 sparcv9
+ 5 5 0 0 400 sparcv9 sparcv9
+
+
+
diff --git a/Examples/cpuwalk_example.txt b/Examples/cpuwalk_example.txt
new file mode 100644
index 000000000000..34afa959815e
--- /dev/null
+++ b/Examples/cpuwalk_example.txt
@@ -0,0 +1,85 @@
+The following is a demonstration of the cpuwalk.d script,
+
+
+cpuwalk.d is not that useful on a single CPU server,
+
+ # cpuwalk.d
+ Sampling... Hit Ctrl-C to end.
+ ^C
+
+ PID: 18843 CMD: bash
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 30
+ 1 | 0
+
+ PID: 8079 CMD: mozilla-bin
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 1 | 0
+
+The output above shows that PID 18843, "bash", was sampled on CPU 0 a total
+of 30 times (we sample at 1000 hz).
+
+
+
+The following is a demonstration of running cpuwalk.d with a 5 second
+duration. This is on a 4 CPU server running a multithreaded CPU bound
+application called "cputhread",
+
+ # cpuwalk.d 5
+ Sampling...
+
+ PID: 3 CMD: fsflush
+
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 30
+ 3 | 0
+
+ PID: 12186 CMD: cputhread
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@ 4900
+ 1 |@@@@@@@@@@ 4900
+ 2 |@@@@@@@@@@ 4860
+ 3 |@@@@@@@@@@ 4890
+ 4 | 0
+
+As we are sampling at 1000 hz, the application cputhread is indeed running
+concurrently across all available CPUs. We measured the applicaiton on
+CPU 0 a total of 4900 times, on CPU 1 a total of 4900 times, etc. As there
+are around 5000 samples per CPU available in this 5 second 1000 hz sample,
+the application is using almost all the CPU capacity in this server well.
+
+
+
+The following is a similar demonstration, this time running a multithreaded
+CPU bound application called "cpuserial" that has a poor use of locking
+such that the threads "serialise",
+
+
+ # cpuwalk.d 5
+ Sampling...
+
+ PID: 12194 CMD: cpuserial
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@ 470
+ 1 |@@@@@@ 920
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@ 3840
+ 3 |@@@@@@ 850
+ 4 | 0
+
+In the above, we can see that this CPU bound application is not making
+efficient use of the CPU resources available, only reaching 3840 samples
+on CPU 2 out of a potential 5000. This problem was caused by a poor use
+of locks.
+
+
+
diff --git a/Examples/crash_example.txt b/Examples/crash_example.txt
new file mode 100644
index 000000000000..f0034d3b74d9
--- /dev/null
+++ b/Examples/crash_example.txt
@@ -0,0 +1,68 @@
+The following is an example of the crashed application script, crash.d
+This demonstration is for version 0.80 of crash.d, newer versions may
+produce enhanced output.
+
+Here is the report generated as crash.d catches a crashing procmail process,
+
+# ./crash.d
+Waiting for crashing applications...
+
+-----------------------------------------------------
+CRASH DETECTED at 2005 May 30 19:41:34
+-----------------------------------------------------
+Type: SIGSEGV
+Program: procmail
+Args: procmail -m\0
+PID: 2877
+TID: 1
+LWPs: 1
+PPID: 1778
+UID: 100
+GID: 1
+TaskID: 76
+ProjID: 3
+PoolID: 0
+ZoneID: 0
+zone: global
+CWD: /usr/include/sys
+errno: 0
+
+User Stack Backtrace,
+ procmail`sendcomsat+0x24
+ procmail`Terminate+0x76
+ procmail`0x805a2b0
+ procmail`0x805a40f
+ libc.so.1`__sighndlr+0xf
+ libc.so.1`call_user_handler+0x22b
+ libc.so.1`sigacthandler+0xbb
+ 0xffffffff
+ procmail`rread+0x1d
+ procmail`0x805bcb4
+ procmail`read2blk+0x6b
+ procmail`readdyn+0x1f
+ procmail`readmail+0x181
+ procmail`main+0x532
+ procmail`_start+0x5d
+
+Kernel Stack Backtrace,
+ genunix`sigaddqa+0x3f
+ genunix`trapsig+0xdb
+ unix`trap+0xc2b
+ unix`_cmntrap+0x83
+
+Ansestors,
+ 2877 procmail -m\0
+ 1778 bash\0
+ 1777 xterm -bg black -fg grey70 -sl 500 -vb\0
+ 1 /sbin/init\0
+ 0 sched\0
+
+Times,
+ User: 0 ticks
+ Sys: 1 ticks
+ Elapsed: 3307 ms
+
+Sizes,
+ Heap: 16388 bytes
+ Stack: 8192 bytes
+
diff --git a/Examples/creatbyproc_example.txt b/Examples/creatbyproc_example.txt
new file mode 100644
index 000000000000..295e07ff2fbb
--- /dev/null
+++ b/Examples/creatbyproc_example.txt
@@ -0,0 +1,23 @@
+The following is an example of the creatbyproc.d script,
+
+
+Here we run creatbyproc.d for several seconds,
+
+ # ./creatbyproc.d
+ dtrace: script './creatbyproc.d' matched 2 probes
+ CPU ID FUNCTION:NAME
+ 0 5438 creat64:entry touch /tmp/newfile
+ 0 5438 creat64:entry sh /tmp/mpLaaOik
+ 0 5438 creat64:entry sh /dev/null
+ ^C
+
+In another window, the following commands were run,
+
+ touch /tmp/newfile
+ man ls
+
+The file creation activity caused by these commands can be seen in the
+output by creatbyproc.d
+
+
+
diff --git a/Examples/cswstat_example.txt b/Examples/cswstat_example.txt
new file mode 100644
index 000000000000..d45347c64f33
--- /dev/null
+++ b/Examples/cswstat_example.txt
@@ -0,0 +1,25 @@
+The following is an example of the cswstat.d script,
+
+ # cswstat.d
+ TIME NUM CSWTIME AVGTIME
+ 2005 May 17 01:57:21 276 2407 8
+ 2005 May 17 01:57:22 283 2251 7
+ 2005 May 17 01:57:23 259 2098 8
+ 2005 May 17 01:57:24 268 2169 8
+ 2005 May 17 01:57:25 1248 10864 8
+ 2005 May 17 01:57:26 2421 21263 8
+ 2005 May 17 01:57:27 2183 19804 9
+ 2005 May 17 01:57:28 1980 18640 9
+ 2005 May 17 01:57:29 794 7422 9
+ 2005 May 17 01:57:30 275 2233 8
+ 2005 May 17 01:57:31 288 2338 8
+ 2005 May 17 01:57:32 545 4154 7
+ 2005 May 17 01:57:33 264 2149 8
+ ^C
+
+In the above output, the average context switch time is 8 microseconds.
+During the sample there was a burst of activity, increasing the number
+of context switches per second from around 270 to over 2000. The time
+consumed by all of these context switches in total is printed, peaking
+at 21 ms.
+
diff --git a/Examples/dappprof_example.txt b/Examples/dappprof_example.txt
new file mode 100644
index 000000000000..a2c3935939c2
--- /dev/null
+++ b/Examples/dappprof_example.txt
@@ -0,0 +1,71 @@
+The following is a demonstration of the dappprof command,
+
+This is the usage for version 0.60,
+
+ # dappprof -h
+ USAGE: dappprof [-cehoTU] [-u lib] { -p PID | command }
+
+ -p PID # examine this PID
+ -a # print all details
+ -c # print syscall counts
+ -e # print elapsed times (us)
+ -o # print on cpu times
+ -T # print totals
+ -u lib # trace this library instead
+ -U # trace all libraries + user funcs
+ -b bufsize # dynamic variable buf size
+ eg,
+ dappprof df -h # run and examine "df -h"
+ dappprof -p 1871 # examine PID 1871
+ dappprof -ap 1871 # print all data
+
+
+
+The following shows running dappprof with the "banner hello" command.
+Elapsed and on-cpu times are printed (-eo), as well as counts (-c) and
+totals (-T),
+
+ # dappprof -eocT banner hello
+
+ # # ###### # # ####
+ # # # # # # #
+ ###### ##### # # # #
+ # # # # # # #
+ # # # # # # #
+ # # ###### ###### ###### ####
+
+
+ CALL COUNT
+ __fsr 1
+ main 1
+ banprt 1
+ banner 1
+ banset 1
+ convert 5
+ banfil 5
+ TOTAL: 15
+
+ CALL ELAPSED
+ banset 37363
+ banfil 147407
+ convert 149606
+ banprt 423507
+ banner 891088
+ __fsr 1694349
+ TOTAL: 3343320
+
+ CALL CPU
+ banset 7532
+ convert 8805
+ banfil 11092
+ __fsr 15708
+ banner 48696
+ banprt 388853
+ TOTAL: 480686
+
+The above output has analysed user functions (the default). It makes it
+easy to identify which function is being called the most (COUNT), which
+is taking the most time (ELAPSED), and which is consuming the most CPU (CPU).
+These times are totals for all the functions called.
+
+
diff --git a/Examples/dapptrace_example.txt b/Examples/dapptrace_example.txt
new file mode 100644
index 000000000000..f19606ceca51
--- /dev/null
+++ b/Examples/dapptrace_example.txt
@@ -0,0 +1,215 @@
+The following is a demonstration of the dapptrace command,
+
+This is the usage for version 0.60,
+
+ # dapptrace -h
+ USAGE: dapptrace [-acdeholFLU] [-u lib] { -p PID | command }
+
+ -p PID # examine this PID
+ -a # print all details
+ -c # print syscall counts
+ -d # print relative times (us)
+ -e # print elapsed times (us)
+ -F # print flow indentation
+ -l # print pid/lwpid
+ -o # print CPU on cpu times
+ -u lib # trace this library instead
+ -U # trace all libraries + user funcs
+ -b bufsize # dynamic variable buf size
+ eg,
+ dapptrace df -h # run and examine "df -h"
+ dapptrace -p 1871 # examine PID 1871
+ dapptrace -Fp 1871 # print using flow indents
+ dapptrace -eop 1871 # print elapsed and CPU times
+
+
+
+The following is an example of the default output. We run dapptrace with
+the "banner hello" command,
+
+ # dapptrace banner hi
+
+ # # #
+ # # #
+ ###### #
+ # # #
+ # # #
+ # # #
+
+ CALL(args) = return
+ -> __fsr(0x2, 0x8047D7C, 0x8047D88)
+ <- __fsr = 122
+ -> main(0x2, 0x8047D7C, 0x8047D88)
+ -> banner(0x8047E3B, 0x80614C2, 0x8047D38)
+ -> banset(0x20, 0x80614C2, 0x8047DCC)
+ <- banset = 36
+ -> convert(0x68, 0x8047DCC, 0x2)
+ <- convert = 319
+ -> banfil(0x8061412, 0x80614C2, 0x8047DCC)
+ <- banfil = 57
+ -> convert(0x69, 0x8047DCC, 0x2)
+ <- convert = 319
+ -> banfil(0x8061419, 0x80614CA, 0x8047DCC)
+ <- banfil = 57
+ <- banner = 118
+ -> banprt(0x80614C2, 0x8047D38, 0xD27FB824)
+ <- banprt = 74
+
+The default output shows user function calls. An entry is prefixed
+with a "->", and the return has a "<-".
+
+
+
+Here we run dapptrace with the -F for flow indent option,
+
+ # dapptrace -F banner hi
+
+ # # #
+ # # #
+ ###### #
+ # # #
+ # # #
+ # # #
+
+ CALL(args) = return
+ -> __fsr(0x2, 0x8047D7C, 0x8047D88)
+ <- __fsr = 122
+ -> main(0x2, 0x8047D7C, 0x8047D88)
+ -> banner(0x8047E3B, 0x80614C2, 0x8047D38)
+ -> banset(0x20, 0x80614C2, 0x8047DCC)
+ <- banset = 36
+ -> convert(0x68, 0x8047DCC, 0x2)
+ <- convert = 319
+ -> banfil(0x8061412, 0x80614C2, 0x8047DCC)
+ <- banfil = 57
+ -> convert(0x69, 0x8047DCC, 0x2)
+ <- convert = 319
+ -> banfil(0x8061419, 0x80614CA, 0x8047DCC)
+ <- banfil = 57
+ <- banner = 118
+ -> banprt(0x80614C2, 0x8047D38, 0xD27FB824)
+ <- banprt = 74
+
+The above output illustrates the flow of the program, which functions
+call which other functions.
+
+
+
+Now the same command is run with -d to display relative timestamps,
+
+ # dapptrace -dF banner hi
+
+ # # #
+ # # #
+ ###### #
+ # # #
+ # # #
+ # # #
+
+ RELATIVE CALL(args) = return
+ 2512 -> __fsr(0x2, 0x8047D7C, 0x8047D88)
+ 2516 <- __fsr = 122
+ 2518 -> main(0x2, 0x8047D7C, 0x8047D88)
+ 2863 -> banner(0x8047E3B, 0x80614C2, 0x8047D38)
+ 2865 -> banset(0x20, 0x80614C2, 0x8047DCC)
+ 2872 <- banset = 36
+ 2874 -> convert(0x68, 0x8047DCC, 0x2)
+ 2877 <- convert = 319
+ 2879 -> banfil(0x8061412, 0x80614C2, 0x8047DCC)
+ 2882 <- banfil = 57
+ 2883 -> convert(0x69, 0x8047DCC, 0x2)
+ 2885 <- convert = 319
+ 2886 -> banfil(0x8061419, 0x80614CA, 0x8047DCC)
+ 2888 <- banfil = 57
+ 2890 <- banner = 118
+ 2892 -> banprt(0x80614C2, 0x8047D38, 0xD27FB824)
+ 3214 <- banprt = 74
+
+The relative times are in microseconds since the program's invocation. Great!
+
+
+
+Even better is if we use the -eo options, to print elapsed times and on-cpu
+times,
+
+ # dapptrace -eoF banner hi
+
+ # # #
+ # # #
+ ###### #
+ # # #
+ # # #
+ # # #
+
+ ELAPSD CPU CALL(args) = return
+ . . -> __fsr(0x2, 0x8047D7C, 0x8047D88)
+ 41 4 <- __fsr = 122
+ . . -> main(0x2, 0x8047D7C, 0x8047D88)
+ . . -> banner(0x8047E3B, 0x80614C2, 0x8047D38)
+ . . -> banset(0x20, 0x80614C2, 0x8047DCC)
+ 29 6 <- banset = 36
+ . . -> convert(0x68, 0x8047DCC, 0x2)
+ 26 3 <- convert = 319
+ . . -> banfil(0x8061412, 0x80614C2, 0x8047DCC)
+ 25 2 <- banfil = 57
+ . . -> convert(0x69, 0x8047DCC, 0x2)
+ 23 1 <- convert = 319
+ . . -> banfil(0x8061419, 0x80614CA, 0x8047DCC)
+ 23 1 <- banfil = 57
+ 309 28 <- banner = 118
+ . . -> banprt(0x80614C2, 0x8047D38, 0xD27FB824)
+ 349 322 <- banprt = 74
+
+Now it is easy to see which functions take the longest (elapsed), and
+which consume the most CPU cycles.
+
+
+
+The following demonstrates the -U option, to trace all libraries,
+
+ # dapptrace -U banner hi
+
+ # # #
+ # # #
+ ###### #
+ # # #
+ # # #
+ # # #
+
+ CALL(args) = return
+ -> ld.so.1:_rt_boot(0x8047E34, 0x8047E3B, 0x0)
+ -> ld.so.1:_setup(0x8047D38, 0x20AE4, 0x3)
+ -> ld.so.1:setup(0x8047D88, 0x8047DCC, 0x0)
+ -> ld.so.1:fmap_setup(0x0, 0xD27FB2E4, 0xD27FB824)
+ <- ld.so.1:fmap_setup = 125
+ -> ld.so.1:addfree(0xD27FD3C0, 0xC40, 0x0)
+ <- ld.so.1:addfree = 65
+ -> ld.so.1:security(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF)
+ <- ld.so.1:security = 142
+ -> ld.so.1:readenv_user(0x8047D88, 0xD27FB204, 0xD27FB220)
+ -> ld.so.1:ld_str_env(0x8047E3E, 0xD27FB204, 0xD27FB220)
+ <- ld.so.1:ld_str_env = 389
+ -> ld.so.1:ld_str_env(0x8047E45, 0xD27FB204, 0xD27FB220)
+ <- ld.so.1:ld_str_env = 389
+ -> ld.so.1:ld_str_env(0x8047E49, 0xD27FB204, 0xD27FB220)
+ <- ld.so.1:ld_str_env = 389
+ -> ld.so.1:ld_str_env(0x8047E50, 0xD27FB204, 0xD27FB220)
+ -> ld.so.1:strncmp(0x8047E53, 0xD27F7BEB, 0x4)
+ <- ld.so.1:strncmp = 113
+ -> ld.so.1:rd_event(0xD27FB1F8, 0x3, 0x0)
+ [...4486 lines deleted...]
+ -> ld.so.1:_lwp_mutex_unlock(0xD27FD380, 0xD27FB824, 0x8047C04)
+ <- ld.so.1:_lwp_mutex_unlock = 47
+ <- ld.so.1:rt_mutex_unlock = 34
+ -> ld.so.1:rt_bind_clear(0x1, 0xD279ECC0, 0xD27FDB2C)
+ <- ld.so.1:rt_bind_clear = 34
+ <- ld.so.1:leave = 210
+ <- ld.so.1:elf_bndr = 803
+ <- ld.so.1:elf_rtbndr = 35
+
+The output was huge, around 4500 lines long. Function names are prefixed
+with their library name, eg "ld.so.1".
+
+This full output should be used with caution, as it enables so many probes
+it could well be a burden on the system.
+
diff --git a/Examples/dexplorer_example.txt b/Examples/dexplorer_example.txt
new file mode 100644
index 000000000000..cba6171c350e
--- /dev/null
+++ b/Examples/dexplorer_example.txt
@@ -0,0 +1,95 @@
+The following is a demonstration of the dexplorer program.
+
+
+Here we run dexplorer with no arguments. By default it will sample various
+system activities using DTrace at 5 seconds per sample. It creates an
+output tar.gz file containing all the DTrace output,
+
+ # dexplorer
+ Output dir will be the current dir (/export/home/root/DTrace/Dexplorer).
+ Hit enter for yes, or type path:
+ Starting dexplorer ver 0.70.
+ Sample interval is 5 seconds. Total run is > 100 seconds.
+ 0% Interrupts by CPU...
+ 5% Interrupt counts...
+ 10% Dispatcher queue length by CPU...
+ 15% Sdt counts...
+ 20% Pages paged in by process name...
+ 25% Files opened count...
+ 30% Disk I/O size distribution by process name...
+ 35% Minor faults by process name...
+ 40% Vminfo data by process name...
+ 45% Mib data by mib statistic...
+ 50% TCP write bytes by process...
+ 55% Sample process @ 1000 Hz...
+ 60% Syscall count by process name...
+ 65% Syscall count by syscall...
+ 70% Read bytes by process name...
+ 75% Write bytes by process name...
+ 80% Sysinfo counts by process name...
+ 85% New process counts with arguments...
+ 90% Signal counts...
+ 95% Syscall error counts...
+ 100% Done.
+ File is de_jupiter_200506271803.tar.gz
+
+As each sample is taken, a line of output is printed above. The above example
+is for version 0.70, newer versions of dexplorer are likely to print more
+lines as they take more samples.
+
+The final line states which file all the output is now in.
+
+
+
+
+The following displays the contents of a dexplorer file,
+
+ # gunzip de_jupiter_200506271803.tar.gz
+ # tar xf de_jupiter_200506271803.tar
+ de_jupiter_200506271803
+ de_jupiter_200506271803/Cpu
+ de_jupiter_200506271803/Cpu/interrupt_by_cpu
+ de_jupiter_200506271803/Cpu/interrupt_time
+ de_jupiter_200506271803/Cpu/dispqlen_by_cpu
+ de_jupiter_200506271803/Cpu/sdt_count
+ de_jupiter_200506271803/Disk
+ de_jupiter_200506271803/Disk/pgpgin_by_processname
+ de_jupiter_200506271803/Disk/fileopen_count
+ de_jupiter_200506271803/Disk/sizedist_by_processname
+ de_jupiter_200506271803/Mem
+ de_jupiter_200506271803/Mem/minf_by_processname
+ de_jupiter_200506271803/Mem/vminfo_by_processname
+ de_jupiter_200506271803/Net
+ de_jupiter_200506271803/Net/mib_data
+ de_jupiter_200506271803/Net/tcpw_by_process
+ de_jupiter_200506271803/Proc
+ de_jupiter_200506271803/Proc/sample_process
+ de_jupiter_200506271803/Proc/syscall_by_processname
+ de_jupiter_200506271803/Proc/syscall_count
+ de_jupiter_200506271803/Proc/readb_by_processname
+ de_jupiter_200506271803/Proc/writeb_by_processname
+ de_jupiter_200506271803/Proc/sysinfo_by_processname
+ de_jupiter_200506271803/Proc/newprocess_count
+ de_jupiter_200506271803/Proc/signal_count
+ de_jupiter_200506271803/Proc/syscall_errors
+ de_jupiter_200506271803/Info
+ de_jupiter_200506271803/Info/uname-a
+ de_jupiter_200506271803/Info/psrinfo-v
+ de_jupiter_200506271803/Info/prtconf
+ de_jupiter_200506271803/Info/df-k
+ de_jupiter_200506271803/Info/ifconfig-a
+ de_jupiter_200506271803/Info/ps-o
+ de_jupiter_200506271803/Info/uptime
+ de_jupiter_200506271803/log
+
+
+
+The following demonstrates running dexplorer in full quiet mode,
+
+ # dexplorer -qy -d /var/tmp
+ #
+
+No text is written to the screen (-qy). The output file will have been
+put in /var/tmp (-d).
+
+
diff --git a/Examples/diskhits_example.txt b/Examples/diskhits_example.txt
new file mode 100644
index 000000000000..6fe3a859a972
--- /dev/null
+++ b/Examples/diskhits_example.txt
@@ -0,0 +1,107 @@
+The following is a demonstration of the diskhits command.
+
+
+Here we run diskhits on a large file, /extra1/contents with is 46 Mb, and
+currently hasn't been accessed (so isn't in any cache).
+
+While diskhits is running, the file is grep'd in another window. This causes
+the entire file to be read,
+
+ # ./diskhits /extra1/contents
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ Location (KB),
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@ 47
+ 2303 |@@ 41
+ 4606 |@@ 41
+ 6909 |@@ 42
+ 9212 |@@ 41
+ 11515 |@@ 41
+ 13818 |@@ 42
+ 16121 |@@ 43
+ 18424 |@@ 42
+ 20727 |@@ 41
+ 23030 |@@ 41
+ 25333 |@@ 41
+ 27636 |@@ 41
+ 29939 |@@ 42
+ 32242 |@@ 44
+ 34545 |@@ 41
+ 36848 |@@ 41
+ 39151 |@@ 41
+ 41454 |@@ 41
+ 43757 |@@ 40
+ >= 46060 | 0
+
+ Size (KB),
+
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 | 6
+ 16 | 10
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 818
+ 64 | 0
+
+ Total RW: 46064 KB
+
+Ok, so the file was read evently with each access around 32 to 63 Kb in size,
+and a total of 46 Mb read. This all makes sense, as it is reading the file
+for the first time.
+
+
+
+Now the same file is grep'd with diskhits running, this time we can see what
+effect caching the file has made,
+
+ # ./diskhits /extra1/contents
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ Location (KB),
+
+ value ------------- Distribution ------------- count
+ 2303 | 0
+ 4606 | 5
+ 6909 |@ 67
+ 9212 |@@@@ 170
+ 11515 |@@@@@ 216
+ 13818 |@@@@@ 224
+ 16121 |@@@@@@ 287
+ 18424 |@@@@@ 227
+ 20727 |@@@ 144
+ 23030 |@@ 75
+ 25333 |@ 59
+ 27636 |@ 42
+ 29939 |@ 41
+ 32242 |@ 44
+ 34545 |@ 41
+ 36848 |@ 41
+ 39151 |@ 41
+ 41454 |@ 41
+ 43757 |@ 39
+ >= 46060 | 0
+
+ Size (KB),
+
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@ 1137
+ 8 |@@@@@ 211
+ 16 |@@ 111
+ 32 |@@@@@@@@ 345
+ 64 | 0
+
+ Total RW: 29392 KB
+
+The difference is dramatic. This time only 29 Mb is read, leaving around
+17 Mb that was read from the cache. The way the file is read differs -
+in the later half of the file it looks the same, but in the first half there
+are many more events; oddly enough, this is because the early part of the
+file is cached more, the extra events are likely to be much smaller in size -
+as indicated in the difference in the size distribution.
+
+It appears that everything less that 4606 Kb has remained in the cache, with
+zero hits for that range.
+
diff --git a/Examples/dispqlen_example.txt b/Examples/dispqlen_example.txt
new file mode 100644
index 000000000000..f3542c00ea82
--- /dev/null
+++ b/Examples/dispqlen_example.txt
@@ -0,0 +1,62 @@
+This is a demonstration of the dispqlen.d script,
+
+
+Here we run it on a single CPU desktop,
+
+ # dispqlen.d
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ CPU 0
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1790
+ 1 |@@@ 160
+ 2 | 10
+ 3 | 0
+
+The output shows the length of the dispatcher queue is mostly 0. This is
+evidence that the CPU is not very saturated. It does not indicate that the
+CPU is idle - as we are measuring the length of the queue, not what is
+on the CPU.
+
+
+
+Here it is run on a multi CPU server,
+
+ # dispqlen.d
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ CPU 1
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1573
+ 1 |@@@@@@@@@ 436
+ 2 | 4
+ 3 | 0
+
+ CPU 4
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@ 1100
+ 1 |@@@@@@@@@@@@@@@@@@ 912
+ 2 | 1
+ 3 | 0
+
+ CPU 0
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@ 846
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@ 1167
+ 2 | 0
+
+ CPU 5
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@ 397
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1537
+ 2 |@@ 79
+ 3 | 0
+
+The above output shows that threads are queueing up on CPU 5 much more than
+CPU 0.
+
diff --git a/Examples/dnlcps_example.txt b/Examples/dnlcps_example.txt
new file mode 100644
index 000000000000..eed35b41f70a
--- /dev/null
+++ b/Examples/dnlcps_example.txt
@@ -0,0 +1,47 @@
+The following is a demonstration of the dnlcps.d script.
+
+
+Here we run dnlcps.d for o few seconds, then hit Ctrl-C,
+
+ # dnlcps.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ CMD: bash PID: 12508
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@ 2
+ >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@ 3
+
+ CMD: nscd PID: 109
+
+ value ------------- Distribution ------------- count
+ 0 | 0
+ >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+
+ CMD: in.routed PID: 143
+
+ value ------------- Distribution ------------- count
+ 0 | 0
+ >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 12
+
+ CMD: ls PID: 12508
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@ 2
+ >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22
+
+ CMD: find PID: 12507
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@ 5768
+ >= 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 11263
+
+A "find" command was running at the time, which had 11,263 hits on the DNLC
+and 5768 misses. An "ls" command scored 22 hits.
+
+The above distribution output can help us identify if procesess
+are both using the DNLC a lot, and what hit rate they are scoring.
+
diff --git a/Examples/dnlcsnoop_example.txt b/Examples/dnlcsnoop_example.txt
new file mode 100644
index 000000000000..45915f1088b4
--- /dev/null
+++ b/Examples/dnlcsnoop_example.txt
@@ -0,0 +1,88 @@
+The following is a demonstration of the dnlcsnoop.d script.
+
+
+Here we run dnlcsnoop.d, while in another window a "find /etc/default"
+command is executed,
+
+ # dnlcsnoop.d
+ PID CMD TIME HIT PATH
+ 9185 bash 9 Y /etc
+ 9185 bash 3 Y /etc
+ 12293 bash 9 Y /usr
+ 12293 bash 3 Y /usr/bin
+ 12293 bash 4 Y /usr/bin/find
+ 12293 bash 7 Y /lib
+ 12293 bash 3 Y /lib/ld.so.1
+ 12293 find 6 Y /usr
+ 12293 find 3 Y /usr/bin
+ 12293 find 3 Y /usr/bin/find
+ 12293 find 3 Y /usr
+ 12293 find 3 Y /usr/lib
+ 12293 find 3 Y /usr/lib/ld.so.1
+ 12293 find 3 Y /usr/lib/..
+ 12293 find 3 Y /usr/..
+ 12293 find 3 Y /lib
+ 12293 find 3 Y /lib/ld.so.1
+ 12293 find 3 Y /usr
+ 12293 find 3 Y /usr/bin
+ 12293 find 2 Y /usr/bin/find
+ 12293 find 4 Y /var
+ 12293 find 3 Y /var/ld
+ 12293 find 3 Y /var/ld/ld.config
+ 12293 find 3 Y /lib
+ 12293 find 3 Y /lib/libc.so.1
+ 12293 find 3 Y /lib
+ 12293 find 3 Y /lib/libc.so.1
+ 12293 find 3 Y /lib
+ 12293 find 3 Y /lib/libc.so.1
+ 12293 find 8 Y /export
+ 12293 find 4 Y /export/home
+ 12293 find 3 Y /export/home/root
+ 12293 find 4 Y /export/home/root/CacheKit-0.93
+ 12293 find 3 Y /export
+ 12293 find 3 Y /export/home
+ 12293 find 3 Y /export/home/root
+ 12293 find 3 Y /export/home/root/CacheKit-0.93
+ 12293 find 3 Y /etc
+ 12293 find 3 Y /etc/default
+ 12293 find 3 Y /etc
+ 12293 find 3 Y /etc/default
+ 12293 find 5 N /etc/default/cron
+ 12293 find 3 N /etc/default/devfsadm
+ 12293 find 4 N /etc/default/fs
+ 12293 find 4 N /etc/default/kbd
+ 12293 find 3 N /etc/default/keyserv
+ 12293 find 4 N /etc/default/nss
+ 12293 find 3 N /etc/default/syslogd
+ 12293 find 3 N /etc/default/tar
+ 12293 find 4 N /etc/default/utmpd
+ 12293 find 5 N /etc/default/init
+ 12293 find 4 Y /etc/default/login
+ 12293 find 4 Y /etc/default/su
+ 12293 find 3 N /etc/default/passwd
+ 12293 find 3 N /etc/default/dhcpagent
+ 12293 find 4 N /etc/default/inetinit
+ 12293 find 3 N /etc/default/ipsec
+ 12293 find 3 N /etc/default/mpathd
+ 12293 find 3 N /etc/default/telnetd
+ 12293 find 3 Y /etc/default/nfs
+ 12293 find 3 N /etc/default/autofs
+ 12293 find 9 Y /etc/default/ftp
+ 12293 find 5 N /etc/default/rpc.nisd
+ 12293 find 5 N /etc/default/nfslogd
+ 12293 find 4 N /etc/default/lu
+ 12293 find 6 N /etc/default/power
+ 12293 find 5 N /etc/default/sys-suspend
+ 12293 find 6 N /etc/default/metassist.xml
+ 12293 find 5 N /etc/default/yppasswdd
+ 12293 find 4 N /etc/default/webconsole
+ 12293 find 5 Y /export
+ 12293 find 4 Y /export/home
+ 12293 find 4 Y /export/home/root
+ 12293 find 4 Y /export/home/root/CacheKit-0.93
+
+The DNLC is the Directory Name Lookup Cache. Here we can see name lookups,
+and whether the cache returned a hit. "/export/home/root/CacheKit-0.93" was
+looked up a few times - this was the current directory that the find
+command was executed from.
+
diff --git a/Examples/dnlcstat_example.txt b/Examples/dnlcstat_example.txt
new file mode 100644
index 000000000000..a6ce1d6ec3d5
--- /dev/null
+++ b/Examples/dnlcstat_example.txt
@@ -0,0 +1,40 @@
+The following is a demonstration of the dnlcstat command.
+
+
+Here we run dnlcstat with no options. It prints a line every second,
+
+ # dnlcstat
+ dnlc %hit hit miss
+ 0 0 0
+ 0 0 0
+ 93 95 7
+ 89 1920 231
+ 89 2130 243
+ 91 2358 232
+ 92 1476 124
+ 92 1953 159
+ 94 2416 134
+ 94 1962 114
+ 95 2113 101
+ 97 1969 54
+ 98 1489 26
+ 41 564 786
+ 40 622 913
+ 35 520 952
+ 27 937 2503
+ 22 1696 5806
+ 22 955 3281
+ 21 1377 5059
+ 31 2043 4516
+ 22 1423 4968
+ 13 550 3438
+ 2 95 3810
+ 0 58 6410
+ 4 223 4433
+ 4 198 4491
+ 7 339 4383
+
+In another window, a "find /" was run. We can see the DNLC activity above,
+initially there are high hit rates in the DNLC - over 90%. Eventually
+the find command exhausts the DNLC, and the hit rate drops to below 10%.
+
diff --git a/Examples/dtruss_example.txt b/Examples/dtruss_example.txt
new file mode 100644
index 000000000000..107fc1978426
--- /dev/null
+++ b/Examples/dtruss_example.txt
@@ -0,0 +1,120 @@
+The following demonstrates the dtruss command - a DTrace version of truss.
+This version is designed to be less intrusive and safer than running truss.
+
+dtruss has many options. Here is the help for version 0.70,
+
+ USAGE: dtruss [-acdefholL] [-t syscall] { -p PID | -n name | command }
+
+ -p PID # examine this PID
+ -n name # examine this process name
+ -t syscall # examine this syscall only
+ -a # print all details
+ -c # print syscall counts
+ -d # print relative times (us)
+ -e # print elapsed times (us)
+ -f # follow children
+ -l # force printing pid/lwpid
+ -o # print on cpu times
+ -L # don't print pid/lwpid
+ -b bufsize # dynamic variable buf size
+ eg,
+ dtruss df -h # run and examine "df -h"
+ dtruss -p 1871 # examine PID 1871
+ dtruss -n tar # examine all processes called "tar"
+ dtruss -f test.sh # run test.sh and follow children
+
+
+
+For example, here we dtruss any process with the name "ksh" - the Korn shell,
+
+ # dtruss -n ksh
+ PID/LWP SYSCALL(args) = return
+ 27547/1: llseek(0x3F, 0xE4E, 0x0) = 3662 0
+ 27547/1: read(0x3F, "\0", 0x400) = 0 0
+ 27547/1: llseek(0x3F, 0x0, 0x0) = 3662 0
+ 27547/1: write(0x3F, "ls -l\n\0", 0x8) = 8 0
+ 27547/1: fdsync(0x3F, 0x10, 0xFEC1D444) = 0 0
+ 27547/1: lwp_sigmask(0x3, 0x20000, 0x0) = 0xFFBFFEFF 0
+ 27547/1: stat64("/usr/bin/ls\0", 0x8047A00, 0xFEC1D444) = 0 0
+ 27547/1: lwp_sigmask(0x3, 0x0, 0x0) = 0xFFBFFEFF 0
+ [...]
+
+The output for each system call does not yet evaluate as much as truss does.
+
+
+
+In the following example, syscall elapsed and overhead times are measured.
+Elapsed times represent the time from syscall start to finish; overhead
+times measure the time spent on the CPU,
+
+ # dtruss -eon bash
+ PID/LWP ELAPSD CPU SYSCALL(args) = return
+ 3911/1: 41 26 write(0x2, "l\0", 0x1) = 1 0
+ 3911/1: 1001579 43 read(0x0, "s\0", 0x1) = 1 0
+ 3911/1: 38 26 write(0x2, "s\0", 0x1) = 1 0
+ 3911/1: 1019129 43 read(0x0, " \001\0", 0x1) = 1 0
+ 3911/1: 38 26 write(0x2, " \0", 0x1) = 1 0
+ 3911/1: 998533 43 read(0x0, "-\0", 0x1) = 1 0
+ 3911/1: 38 26 write(0x2, "-\001\0", 0x1) = 1 0
+ 3911/1: 1094323 42 read(0x0, "l\0", 0x1) = 1 0
+ 3911/1: 39 27 write(0x2, "l\001\0", 0x1) = 1 0
+ 3911/1: 1210496 44 read(0x0, "\r\0", 0x1) = 1 0
+ 3911/1: 40 28 write(0x2, "\n\001\0", 0x1) = 1 0
+ 3911/1: 9 1 lwp_sigmask(0x3, 0x2, 0x0) = 0xFFBFFEFF 0
+ 3911/1: 70 63 ioctl(0x0, 0x540F, 0x80F6D00) = 0 0
+
+A bash command was in another window, where the "ls -l" command was being
+typed. The keystrokes can be seen above, along with the long elapsed times
+(keystroke delays), and short overhead times (as the bash process blocks
+on the read and leaves the CPU).
+
+
+
+Now dtruss is put to the test. Here we truss a test program that runs several
+hundred smaller programs, which in turn generate thousands of system calls.
+
+First, as a "control" we run the program without a truss or dtruss running,
+
+ # time ./test
+ real 0m38.508s
+ user 0m5.299s
+ sys 0m25.668s
+
+Now we try truss,
+
+ # time truss ./test 2> /dev/null
+ real 0m41.281s
+ user 0m0.558s
+ sys 0m1.351s
+
+Now we try dtruss,
+
+ # time dtruss ./test 2> /dev/null
+ real 0m46.226s
+ user 0m6.771s
+ sys 0m31.703s
+
+In the above test, truss slowed the program from 38 seconds to 41. dtruss
+slowed the program from 38 seconds to 46, slightly slower that truss...
+
+Now we try follow mode "-f". The test program does run several hundred
+smaller programs, so now there are plenty more system calls to track,
+
+ # time truss -f ./test 2> /dev/null
+ real 2m28.317s
+ user 0m0.893s
+ sys 0m3.527s
+
+Now we try dtruss,
+
+ # time dtruss -f ./test 2> /dev/null
+ real 0m56.179s
+ user 0m10.040s
+ sys 0m38.185s
+
+Wow, the difference is huge! truss slows the program from 38 to 148 seconds;
+but dtruss has only slowed the program from 38 to 56 seconds.
+
+
+
+
diff --git a/Examples/dvmstat_example.txt b/Examples/dvmstat_example.txt
new file mode 100644
index 000000000000..1fb7fbb739d1
--- /dev/null
+++ b/Examples/dvmstat_example.txt
@@ -0,0 +1,91 @@
+The following is a demonstration of the dvmstat program,
+
+
+Here we run dvmstat to monitor all processes called "find". In another
+window, a "find /" command is run,
+
+ # dvmstat -n find
+ re maj mf fr epi epo api apo fpi fpo sy
+ 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0
+ 6336 0 372 0 0 0 0 0 0 0 22255
+ 1624 0 0 0 0 0 0 0 0 0 5497
+ 2292 0 0 0 0 0 0 0 0 0 7715
+ 13064 0 0 0 0 0 0 0 0 0 43998
+ 7972 168 0 0 0 0 0 0 168 0 38361
+ 468 636 0 0 0 0 0 0 636 0 13774
+ 376 588 0 0 0 0 0 0 588 0 10723
+ 80 636 0 0 0 0 0 0 656 0 11078
+ 48 772 0 0 0 0 0 0 812 0 9841
+ 16 1028 0 0 0 0 0 0 1056 0 10752
+ 0 1712 0 0 0 0 0 0 1740 0 12176
+ 4 1224 0 0 0 0 0 0 1236 0 9024
+
+The output above is spectacular! When the find command is first run,
+it begins be reading data from the file cache, as indicated by the "re"
+reclaims, and a lack of "fpi" filesystem page ins.
+
+Eventually the find command travels to places which are not cached, we can
+see the "re" value drops, and both the "maj" major faults and "fpi" values
+increase. This transition from cache hits to file system activity is
+very clear from the above output.
+
+
+
+Here we run a dvmstat to examine the PID 3778,
+
+ # dvmstat -p 3778
+ re maj mf fr epi epo api apo fpi fpo sy
+ 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0
+ 24 28 0 0 0 0 0 0 28 0 109
+ 4 148 16 0 0 0 0 0 148 0 1883
+ 16 412 384 0 0 0 0 0 412 0 21019
+ 0 0 0 0 0 0 0 0 0 0 3
+ 0 0 0 0 0 0 0 0 0 0 221
+ 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 84
+ 0 0 0 0 0 0 0 0 0 0 0
+
+Here we can see the statistics for that process only.
+
+
+
+The following runs the date command through dvmstat,
+
+ # dvmstat date
+ Sun Jun 12 17:44:24 EST 2005
+ re maj mf fr epi epo api apo fpi fpo sy
+ 16 0 208 0 0 0 0 0 0 0 38
+
+The values above are for the date command only.
+
+
+
+Now we run dvmstat on a tar command. Here we tar around 50Mb of files,
+so the command takes around 20 seconds to complete,
+
+ # dvmstat tar cf backup.tar DTrace
+ re maj mf fr epi epo api apo fpi fpo sy
+ 20 256 304 0 8 0 0 0 352 0 621
+ 4540 56 896 0 0 0 0 0 4636 0 1005
+ 4432 12 644 0 0 0 0 0 4384 0 906
+ 680 180 136 0 8 0 0 0 1056 0 502
+ 2328 60 468 0 0 0 0 0 2296 0 592
+ 1300 380 272 0 0 0 0 0 1704 0 1095
+ 2816 72 560 0 0 0 0 0 2940 0 709
+ 4084 40 416 0 0 0 0 0 4220 0 894
+ 2764 4 276 0 0 0 0 0 2700 0 566
+ 1824 96 328 0 0 0 0 0 2072 0 556
+ 3408 80 392 0 20 0 0 0 3496 0 857
+ 2804 92 552 0 4 0 0 0 2924 0 741
+ 1344 16 272 0 0 0 0 0 1376 0 289
+ 3284 52 520 0 12 0 0 0 3260 0 743
+ 4832 200 812 0 0 0 0 0 5292 0 1276
+ 11052 56 2200 0 0 0 0 0 8676 0 2326
+ 5256 328 1020 0 8 0 0 0 4404 0 1725
+ re maj mf fr epi epo api apo fpi fpo sy
+ 404 340 72 0 64 0 0 0 536 0 1135
+
+Great! Activity from the tar command such as "fpi"s can be clearly seen.
+
diff --git a/Examples/errinfo_example.txt b/Examples/errinfo_example.txt
new file mode 100644
index 000000000000..1dcb28d29db9
--- /dev/null
+++ b/Examples/errinfo_example.txt
@@ -0,0 +1,90 @@
+This is an example of the errinfo program, which prints details on syscall
+failures.
+
+By default it "snoops" syscall failures and prints their details,
+
+ # ./errinfo
+ EXEC SYSCALL ERR DESC
+ wnck-applet read 11 Resource temporarily unavailable
+ Xorg read 11 Resource temporarily unavailable
+ nautilus read 11 Resource temporarily unavailable
+ Xorg read 11 Resource temporarily unavailable
+ dsdm read 11 Resource temporarily unavailable
+ Xorg read 11 Resource temporarily unavailable
+ Xorg pollsys 4 interrupted system call
+ mozilla-bin lwp_park 62 timer expired
+ gnome-netstatus- ioctl 12 Not enough core
+ mozilla-bin lwp_park 62 timer expired
+ Xorg read 11 Resource temporarily unavailable
+ mozilla-bin lwp_park 62 timer expired
+ [...]
+
+which is useful to see these events live, but can scroll off the screen
+somewhat rapidly.. so,
+
+
+
+The "-c" option will count the number of errors. Hit Ctrl-C to stop the
+sample. For example,
+
+# ./errinfo -c
+Tracing... Hit Ctrl-C to end.
+^C
+ EXEC SYSCALL ERR COUNT DESC
+ nscd fcntl 22 1 Invalid argument
+ xscreensaver read 11 1 Resource temporarily unavailable
+ inetd lwp_park 62 1 timer expired
+ svc.startd lwp_park 62 1 timer expired
+ svc.configd lwp_park 62 1 timer expired
+ ttymon ioctl 25 1 Inappropriate ioctl for device
+gnome-netstatus- ioctl 12 2 Not enough core
+ mozilla-bin lwp_kill 3 2 No such process
+ mozilla-bin connect 150 5 operation now in progress
+ svc.startd portfs 62 8 timer expired
+ java_vm lwp_cond_wait 62 8 timer expired
+ soffice.bin read 11 9 Resource temporarily unavailable
+ gnome-terminal read 11 23 Resource temporarily unavailable
+ mozilla-bin recv 11 26 Resource temporarily unavailable
+ nautilus read 11 26 Resource temporarily unavailable
+gnome-settings-d read 11 26 Resource temporarily unavailable
+ gnome-smproxy read 11 34 Resource temporarily unavailable
+ gnome-panel read 11 42 Resource temporarily unavailable
+ dsdm read 11 112 Resource temporarily unavailable
+ metacity read 11 128 Resource temporarily unavailable
+ mozilla-bin lwp_park 62 133 timer expired
+ Xorg pollsys 4 147 interrupted system call
+ wnck-applet read 11 179 Resource temporarily unavailable
+ mozilla-bin read 11 258 Resource temporarily unavailable
+ Xorg read 11 1707 Resource temporarily unavailable
+
+Ok, so Xorg has received 1707 of the same type of error for the syscall read().
+
+
+
+The "-n" option lets us match on one type of process only. In the following
+we match processes that have the name "mozilla-bin",
+
+# ./errinfo -c -n mozilla-bin
+Tracing... Hit Ctrl-C to end.
+^C
+ EXEC SYSCALL ERR COUNT DESC
+ mozilla-bin getpeername 134 1 Socket is not connected
+ mozilla-bin recv 11 2 Resource temporarily unavailable
+ mozilla-bin lwp_kill 3 2 No such process
+ mozilla-bin connect 150 5 operation now in progress
+ mozilla-bin lwp_park 62 207 timer expired
+ mozilla-bin read 11 396 Resource temporarily unavailable
+
+
+
+The "-p" option lets us examine one PID only. The following example examines
+PID 1119,
+
+# ./errinfo -c -p 1119
+Tracing... Hit Ctrl-C to end.
+^C
+ EXEC SYSCALL ERR COUNT DESC
+ Xorg pollsys 4 47 interrupted system call
+ Xorg read 11 669 Resource temporarily unavailable
+
+
diff --git a/Examples/execsnoop_example.txt b/Examples/execsnoop_example.txt
new file mode 100644
index 000000000000..e55682a9e64a
--- /dev/null
+++ b/Examples/execsnoop_example.txt
@@ -0,0 +1,78 @@
+The following is an example of execsnoop. As processes are executed their
+details are printed out. Another user was logged in running a few commands
+which can be viewed below,
+
+ # ./execsnoop
+ UID PID PPID ARGS
+ 100 3008 2656 ls
+ 100 3009 2656 ls -l
+ 100 3010 2656 cat /etc/passwd
+ 100 3011 2656 vi /etc/hosts
+ 100 3012 2656 date
+ 100 3013 2656 ls -l
+ 100 3014 2656 ls
+ 100 3015 2656 finger
+ [...]
+
+
+
+In this example the command "man gzip" was executed. The output lets us
+see what the man command is actually doing,
+
+ # ./execsnoop
+ UID PID PPID ARGS
+ 100 3064 2656 man gzip
+ 100 3065 3064 sh -c cd /usr/share/man; tbl /usr/share/man/man1/gzip.1 |nroff -u0 -Tlp -man -
+ 100 3067 3066 tbl /usr/share/man/man1/gzip.1
+ 100 3068 3066 nroff -u0 -Tlp -man -
+ 100 3066 3065 col -x
+ 100 3069 3064 sh -c trap '' 1 15; /usr/bin/mv -f /tmp/mpoMaa_f /usr/share/man/cat1/gzip.1 2>
+ 100 3070 3069 /usr/bin/mv -f /tmp/mpoMaa_f /usr/share/man/cat1/gzip.1
+ 100 3071 3064 sh -c more -s /tmp/mpoMaa_f
+ 100 3072 3071 more -s /tmp/mpoMaa_f
+ ^C
+
+
+
+Execsnoop has other options,
+
+ # ./execsnoop -h
+ USAGE: execsnoop [-a|-A|-sv] [-c command]
+ execsnoop # default output
+ -a # print all data
+ -A # dump all data, space delimited
+ -s # include start time, us
+ -v # include start time, string
+ -c command # command name to snoop
+
+
+
+In particular the verbose option for human readable timestamps is
+very useful,
+
+ # ./execsnoop -v
+ STRTIME UID PID PPID ARGS
+ 2005 Jan 22 00:07:22 0 23053 20933 date
+ 2005 Jan 22 00:07:24 0 23054 20933 uname -a
+ 2005 Jan 22 00:07:25 0 23055 20933 ls -latr
+ 2005 Jan 22 00:07:27 0 23056 20933 df -k
+ 2005 Jan 22 00:07:29 0 23057 20933 ps -ef
+ 2005 Jan 22 00:07:29 0 23057 20933 ps -ef
+ 2005 Jan 22 00:07:34 0 23058 20933 uptime
+ 2005 Jan 22 00:07:34 0 23058 20933 uptime
+ [...]
+
+
+
+It is also possible to match particular commands. Here we watch
+anyone using the vi command only,
+
+ # ./execsnoop -vc vi
+ STRTIME UID PID PPID ARGS
+ 2005 Jan 22 00:10:33 0 23063 20933 vi /etc/passwd
+ 2005 Jan 22 00:10:40 0 23064 20933 vi /etc/shadow
+ 2005 Jan 22 00:10:51 0 23065 20933 vi /etc/group
+ 2005 Jan 22 00:10:57 0 23066 20933 vi /.rhosts
+ [...]
+
+
diff --git a/Examples/fddist_example.txt b/Examples/fddist_example.txt
new file mode 100644
index 000000000000..3d943b9e0185
--- /dev/null
+++ b/Examples/fddist_example.txt
@@ -0,0 +1,38 @@
+The following is a demonstration of the fddist command,
+
+
+Here fddist is run for a few seconds on an idle workstation,
+
+ Tracing reads and writes... Hit Ctrl-C to end.
+ ^C
+ EXEC: dtrace PID: 3288
+
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 2 | 0
+
+ EXEC: mozilla-bin PID: 1659
+
+ value ------------- Distribution ------------- count
+ 3 | 0
+ 4 |@@@@@@@@@@ 28
+ 5 | 0
+ 6 |@@@@@@@@@@@@@@@ 40
+ 7 |@@@@@@@@@@@@@@@ 40
+ 8 | 0
+
+ EXEC: Xorg PID: 1532
+
+ value ------------- Distribution ------------- count
+ 22 | 0
+ 23 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 57
+ 24 | 0
+
+The above displays the usage pattern for process file descriptors.
+We can see the Xorg process (PID 1532) has made 57 reads or writes to
+it's file descriptor 23.
+
+The pfiles(1) command can be used to help determine what file
+descriptor 23 actually is.
+
diff --git a/Examples/filebyproc_example.txt b/Examples/filebyproc_example.txt
new file mode 100644
index 000000000000..8267da2fc083
--- /dev/null
+++ b/Examples/filebyproc_example.txt
@@ -0,0 +1,27 @@
+The following is an example of the filebyproc.d script,
+
+ # filebyproc.d
+ dtrace: description 'syscall::open*:entry ' matched 2 probes
+ CPU ID FUNCTION:NAME
+ 0 14 open:entry gnome-netstatus- /dev/kstat
+ 0 14 open:entry man /var/ld/ld.config
+ 0 14 open:entry man /lib/libc.so.1
+ 0 14 open:entry man /usr/share/man/man.cf
+ 0 14 open:entry man /usr/share/man/windex
+ 0 14 open:entry man /usr/share/man/man1/ls.1
+ 0 14 open:entry man /usr/share/man/man1/ls.1
+ 0 14 open:entry man /tmp/mpqea4RF
+ 0 14 open:entry sh /var/ld/ld.config
+ 0 14 open:entry sh /lib/libc.so.1
+ 0 14 open:entry neqn /var/ld/ld.config
+ 0 14 open:entry neqn /lib/libc.so.1
+ 0 14 open:entry neqn /usr/share/lib/pub/eqnchar
+ 0 14 open:entry tbl /var/ld/ld.config
+ 0 14 open:entry tbl /lib/libc.so.1
+ 0 14 open:entry tbl /usr/share/man/man1/ls.1
+ 0 14 open:entry nroff /var/ld/ld.config
+ [...]
+
+In the above example, the command "man ls" was run. Each file that was
+attempted to be opened can be seen, along with the program name responsible.
+
diff --git a/Examples/fspaging_example.txt b/Examples/fspaging_example.txt
new file mode 100644
index 000000000000..c29cb086b832
--- /dev/null
+++ b/Examples/fspaging_example.txt
@@ -0,0 +1,32 @@
+The following is a short sample of output from the fspaging.d script.
+
+
+fspaging.d traces syscall read and writes, vnode interface reads, writes,
+getpage and putpage, and disk io.
+
+ # ./fspaging.d
+ Event Device RW Size Offset Path
+ disk_io dad1 R 1024 0 /extra1
+ disk_io dad1 R 8192 0 <none>
+ disk_io dad1 R 2048 0 <none>
+ sc-write . W 51200 0 /extra1/outfile
+ fop_write . W 51200 0 /extra1/outfile
+ fop_getpage . R 8192 0 /extra1/50k
+ disk_io dad1 R 8192 0 /extra1/50k
+ disk_ra dad1 R 8192 8 /extra1/50k
+ fop_getpage . R 8192 8 /extra1/50k
+ disk_ra dad1 R 34816 16 /extra1/50k
+ fop_getpage . R 8192 16 /extra1/50k
+ fop_getpage . R 8192 24 /extra1/50k
+ fop_getpage . R 8192 32 /extra1/50k
+ fop_getpage . R 8192 40 /extra1/50k
+ fop_getpage . R 8192 48 /extra1/50k
+ fop_putpage . W 8192 0 /extra1/outfile
+ fop_putpage . W 8192 8 /extra1/outfile
+ fop_putpage . W 8192 16 /extra1/outfile
+ fop_putpage . W 8192 24 /extra1/outfile
+ fop_putpage . W 8192 32 /extra1/outfile
+ fop_putpage . W 8192 40 /extra1/outfile
+ disk_io dad1 W 51200 0 /extra1/outfile
+
+For a full discussion of this example, see fsrw_example.txt.
diff --git a/Examples/fsrw_example.txt b/Examples/fsrw_example.txt
new file mode 100644
index 000000000000..b153303738ee
--- /dev/null
+++ b/Examples/fsrw_example.txt
@@ -0,0 +1,129 @@
+The following are demonstrations of the fsrw.d script.
+
+
+Here the fsrw.d script was running while a 50 Kbyte file was read,
+
+ # ./fsrw.d
+ Event Device RW Size Offset Path
+ sc-read . R 8192 0 /extra1/50k
+ fop_read . R 8192 0 /extra1/50k
+ disk_io cmdk0 R 8192 0 /extra1/50k
+ disk_ra cmdk0 R 8192 8 /extra1/50k
+ sc-read . R 8192 8 /extra1/50k
+ fop_read . R 8192 8 /extra1/50k
+ disk_ra cmdk0 R 34816 16 /extra1/50k
+ sc-read . R 8192 16 /extra1/50k
+ fop_read . R 8192 16 /extra1/50k
+ sc-read . R 8192 24 /extra1/50k
+ fop_read . R 8192 24 /extra1/50k
+ sc-read . R 8192 32 /extra1/50k
+ fop_read . R 8192 32 /extra1/50k
+ sc-read . R 8192 40 /extra1/50k
+ fop_read . R 8192 40 /extra1/50k
+ sc-read . R 8192 48 /extra1/50k
+ fop_read . R 8192 48 /extra1/50k
+ sc-read . R 8192 50 /extra1/50k
+ fop_read . R 8192 50 /extra1/50k
+ ^C
+
+By looking closely at the Offset (Kbytes) and Size of each transaction, we
+can see how the read() system calls (sc-read) were satisfied by the file
+system. There were 8 read() system calls, and 3 disk events - 2 of which were
+UFS read-ahead (disk_ra). The final read-ahead was for 34 Kbytes and began
+with an offset of 16 Kbytes, which read the remaining file data (34 + 16 = 50
+Kbytes). The subsequent read() system calls and corresponding fop_read() calls
+returned from the page cache.
+
+
+
+The following demonstrates how a logical I/O is broken up into multiple
+physical I/O events. Here a dd command was used to read 1 Mbytes from the
+/var/sadm/install/contents file while fsrw.d was tracing.
+
+ # ./fsrw.d
+ Event Device RW Size Offset Path
+ sc-read . R 1048576 0 /var/sadm/install/contents
+ fop_read . R 1048576 0 /var/sadm/install/contents
+ disk_ra cmdk0 R 4096 72 /var/sadm/install/contents
+ disk_ra cmdk0 R 8192 96 <none>
+ disk_ra cmdk0 R 57344 96 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 152 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 208 /var/sadm/install/contents
+ disk_ra cmdk0 R 49152 264 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 312 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 368 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 424 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 480 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 536 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 592 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 648 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 704 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 760 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 816 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 872 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 928 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 984 /var/sadm/install/contents
+ disk_ra cmdk0 R 57344 1040 /var/sadm/install/contents
+ ^C
+
+Both the read() syscall (sc-read) and the fop_read() call asked the file system
+for 1048576 bytes, which was then broken into numerous disk I/O events of up to
+56 Kbytes in size. The 8192 byte read with a path of "<none>" is likely to be
+the file system reading the indirect block pointers for the
+/var/sadm/install/contents file (something DTrace could confirm in detail).
+
+
+
+
+The following traces activity as a cp command copies a 50 Kbyte file.
+
+ # ./fsrw.d
+ Event Device RW Size Offset Path
+ disk_io dad1 R 1024 0 /extra1
+ disk_io dad1 R 8192 0 <none>
+ disk_io dad1 R 8192 0 <none>
+ disk_io dad1 R 2048 0 <none>
+ disk_io dad1 R 2048 0 <none>
+ sc-write . W 51200 0 /extra1/outfile
+ fop_write . W 51200 0 /extra1/outfile
+ disk_io dad1 R 8192 0 /extra1/50k
+ disk_ra dad1 R 8192 8 /extra1/50k
+ disk_ra dad1 R 34816 16 /extra1/50k
+ disk_io dad1 R 2048 0 <none>
+ disk_io dad1 W 49152 0 /extra1/outfile
+ ^C
+
+Reads including UFS read-ahead can be seen as the file is read.
+The output finishes with disk writes as the new file is flushed to disk.
+The syscall write() and fop_write() can be seen to the /extra1/outfile,
+however there is no syscall read() or fop_read() to /extra1/50k - which
+we may have expected to occur before the writes. This is due to the way
+the cp command now works, it uses mmap() to map files in for reading.
+This activity can be seen if we also trace fop_getpage() and fop_putpage(),
+as the fspaging.d dtrace script does.
+
+ # ./fspaging.d
+ Event Device RW Size Offset Path
+ disk_io dad1 R 1024 0 /extra1
+ disk_io dad1 R 8192 0 <none>
+ disk_io dad1 R 2048 0 <none>
+ sc-write . W 51200 0 /extra1/outfile
+ fop_write . W 51200 0 /extra1/outfile
+ fop_getpage . R 8192 0 /extra1/50k
+ disk_io dad1 R 8192 0 /extra1/50k
+ disk_ra dad1 R 8192 8 /extra1/50k
+ fop_getpage . R 8192 8 /extra1/50k
+ disk_ra dad1 R 34816 16 /extra1/50k
+ fop_getpage . R 8192 16 /extra1/50k
+ fop_getpage . R 8192 24 /extra1/50k
+ fop_getpage . R 8192 32 /extra1/50k
+ fop_getpage . R 8192 40 /extra1/50k
+ fop_getpage . R 8192 48 /extra1/50k
+ fop_putpage . W 8192 0 /extra1/outfile
+ fop_putpage . W 8192 8 /extra1/outfile
+ fop_putpage . W 8192 16 /extra1/outfile
+ fop_putpage . W 8192 24 /extra1/outfile
+ fop_putpage . W 8192 32 /extra1/outfile
+ fop_putpage . W 8192 40 /extra1/outfile
+ disk_io dad1 W 51200 0 /extra1/outfile
+
diff --git a/Examples/guess_example.txt b/Examples/guess_example.txt
new file mode 100644
index 000000000000..74be8b3a4d81
--- /dev/null
+++ b/Examples/guess_example.txt
@@ -0,0 +1,39 @@
+The following is a demonstration of the guess.d script,
+
+
+guess.d is a guessing game written in DTrace. It goes like this,
+
+ # ./guess.d
+ guess.d - Guess a number between 1 and 100
+
+ Enter guess 1: 50
+ Lower...
+ Enter guess 2: 25
+ Higher...
+ Enter guess 3: 37
+ Higher...
+ Enter guess 4: 44
+ Higher...
+ Enter guess 5: 48
+ Lower...
+ Enter guess 6: 46
+ Lower...
+ Enter guess 7: 45
+ Correct! That took 7 guesses.
+
+ Please enter your name: Brendan Gregg
+
+ Previous high scores,
+ Fred Nurk 7
+ Brendan Gregg 7
+
+It was written as a demonstration of the same code written in dozens of
+languages. It makes a good demonstration, as it covers integer and string
+variables, conditional statements, loops, keyboard input, screen output,
+and file input and output.
+
+Written in DTrace however, is not such a good demonstration! DTrace doesn't
+have loops (it doesn't really need them either) which made the code a
+little odd. DTrace also doesn't have keyboard input... So this script is
+somewhat amusing as an example, but not terribly useful.
+
diff --git a/Examples/hotkernel_example.txt b/Examples/hotkernel_example.txt
new file mode 100644
index 000000000000..d8a5aec0b98f
--- /dev/null
+++ b/Examples/hotkernel_example.txt
@@ -0,0 +1,153 @@
+The following are demonstrations of the hotkernel DTrace program.
+
+
+Here hotkernel is run for a couple of seconds then Ctrl-C is hit,
+
+ # ./hotkernel
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ FUNCTION COUNT PCNT
+ unix`swtch 1 0.1%
+ pcplusmp`apic_redistribute_compute 1 0.1%
+ genunix`strrput 1 0.1%
+ unix`sys_call 1 0.1%
+ genunix`fsflush_do_pages 1 0.1%
+ TS`ts_wakeup 1 0.1%
+ genunix`callout_schedule_1 1 0.1%
+ unix`page_create_putback 1 0.1%
+ unix`mutex_enter 4 0.3%
+ unix`cpu_halt 1575 99.2%
+
+The output summarises which kernel-level function was sampled on the
+CPU the most. This report shows that unix`cpu_halt was sampled 1575
+times, which was 99.2% of the kernel-level samples.
+
+As it turns out, unix`cpu_halt is called on this x86 server as part of the
+kernel idle thread - explaining why it is so often found on the CPU,
+
+ # dtrace -n 'fbt::cpu_halt:entry { @[stack()] = count(); }'
+ dtrace: description 'fbt::cpu_halt:entry ' matched 1 probe
+ ^C
+
+ unix`idle+0x3b
+ unix`thread_start+0x3
+ 956
+
+This kernel stack trace indicates that cpu_halt() is called by idle().
+
+The following is a SPARC example,
+
+ # ./hotkernel
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ FUNCTION COUNT PCNT
+ genunix`fop_ioctl 1 0.1%
+ genunix`allocb_cred 1 0.1%
+ genunix`poll_common 1 0.1%
+ genunix`cv_block 1 0.1%
+ genunix`strioctl 1 0.1%
+ genunix`disp_lock_exit 1 0.1%
+ genunix`crfree 1 0.1%
+ ufs`ufs_getpage 1 0.1%
+ SUNW,UltraSPARC-IIi`copyin 1 0.1%
+ genunix`strmakedata 1 0.1%
+ genunix`cv_waituntil_sig 1 0.1%
+ SUNW,UltraSPARC-IIi`prefetch_page_r 1 0.1%
+ unix`set_freemem 1 0.1%
+ unix`page_trylock 1 0.1%
+ genunix`anon_get_ptr 1 0.1%
+ unix`page_hashin 1 0.1%
+ genunix`bt_getlowbit 1 0.1%
+ unix`pp_load_tlb 1 0.1%
+ unix`_resume_from_idle 1 0.1%
+ unix`hat_pageunload 1 0.1%
+ genunix`strrput 1 0.1%
+ genunix`strpoll 1 0.1%
+ unix`page_do_hashin 1 0.1%
+ unix`cpu_vm_stats_ks_update 1 0.1%
+ genunix`sleepq_wakeone_chan 1 0.1%
+ unix`lock_set_spl 1 0.1%
+ tl`tl_wput 1 0.1%
+ genunix`kstrgetmsg 1 0.1%
+ genunix`qbackenable 1 0.1%
+ genunix`releasef 1 0.1%
+ genunix`callout_execute 1 0.1%
+ uata`ata_hba_start 1 0.1%
+ genunix`pcacheset_cmp 1 0.1%
+ genunix`sleepq_insert 1 0.1%
+ genunix`syscall_mstate 1 0.1%
+ sockfs`sotpi_recvmsg 1 0.1%
+ genunix`strput 1 0.1%
+ genunix`timespectohz 1 0.1%
+ unix`lock_clear_splx 1 0.1%
+ genunix`read 1 0.1%
+ genunix`as_segcompar 1 0.1%
+ unix`atomic_cas_64 1 0.1%
+ unix`mutex_exit 1 0.1%
+ genunix`cv_unsleep 1 0.1%
+ unix`putnext 1 0.1%
+ unix`intr_thread 1 0.1%
+ genunix`hrt2tv 1 0.1%
+ sockfs`socktpi_poll 1 0.1%
+ unix`sfmmu_mlspl_enter 1 0.1%
+ SUNW,UltraSPARC-IIi`get_ecache_tag 1 0.1%
+ SUNW,UltraSPARC-IIi`gethrestime 1 0.1%
+ genunix`cv_timedwait_sig 1 0.1%
+ genunix`getq_noenab 1 0.1%
+ SUNW,UltraSPARC-IIi`flushecacheline 1 0.1%
+ unix`utl0 1 0.1%
+ genunix`anon_alloc 1 0.1%
+ unix`page_downgrade 1 0.1%
+ unix`setfrontdq 1 0.1%
+ genunix`timeout_common 1 0.1%
+ unix`bzero 1 0.1%
+ unix`ktl0 2 0.1%
+ genunix`canputnext 2 0.1%
+ genunix`clear_active_fd 2 0.1%
+ unix`sfmmu_tlb_demap 2 0.1%
+ unix`page_vpadd 2 0.1%
+ SUNW,UltraSPARC-IIi`check_ecache_line 2 0.1%
+ genunix`cyclic_softint 2 0.1%
+ genunix`restore_mstate 2 0.1%
+ genunix`anon_map_getpages 2 0.1%
+ genunix`putq 2 0.1%
+ unix`page_lookup_create 2 0.1%
+ dtrace`dtrace_dynvar_clean 2 0.1%
+ unix`sfmmu_pageunload 2 0.1%
+ genunix`cpu_decay 2 0.1%
+ genunix`kmem_cache_alloc 3 0.2%
+ unix`rw_exit 3 0.2%
+ tl`tl_wput_data_ser 3 0.2%
+ unix`page_get_replacement_page 3 0.2%
+ unix`page_sub 3 0.2%
+ genunix`clock 3 0.2%
+ SUNW,UltraSPARC-IIi`copyout 3 0.2%
+ unix`mutex_enter 4 0.2%
+ genunix`pcache_poll 5 0.3%
+ SUNW,UltraSPARC-IIi`scrub_ecache_line 5 0.3%
+ SUNW,UltraSPARC-IIi`hwblkpagecopy 22 1.2%
+ SUNW,UltraSPARC-IIi`hwblkclr 39 2.1%
+ unix`generic_idle_cpu 506 26.8%
+ unix`idle 1199 63.5%
+
+Which shows the most common function is unix`idle.
+
+
+
+
+Now the hotkernel tool is demonstrated with the -m option, to only print
+out samples by module,
+
+ # ./hotkernel -m
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ MODULE COUNT PCNT
+ usbms 1 0.0%
+ specfs 1 0.0%
+ uhci 1 0.0%
+ sockfs 2 0.0%
+ genunix 28 0.6%
+ unix 4539 99.3%
+
+Here, genunix and unix (the two core parts of the kernel) were the most
+common module to be executing on-CPU.
diff --git a/Examples/hotspot_example.txt b/Examples/hotspot_example.txt
new file mode 100644
index 000000000000..179ba8d0a18f
--- /dev/null
+++ b/Examples/hotspot_example.txt
@@ -0,0 +1,34 @@
+The following is a demonstration of the hotspot.d script.
+
+Here the script is run while a large file is copied from one filesystem
+(cmdk0 102,0) to another (cmdk0 102,3). We can see the file mostly resided
+around the 9000 to 10999 Mb range on the source disk (102,0), and was
+copied to the 0 to 999 Mb range on the target disk (102,3).
+
+ # ./hotspot.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ Disk: cmdk0 Major,Minor: 102,3
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 418
+ 1000 | 0
+
+ Disk: cmdk0 Major,Minor: 102,0
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 | 1
+ 1000 | 5
+ 2000 | 0
+ 3000 | 0
+ 4000 | 0
+ 5000 | 0
+ 6000 | 0
+ 7000 | 0
+ 8000 | 0
+ 9000 |@@@@@ 171
+ 10000 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1157
+ 11000 | 0
+
diff --git a/Examples/hotuser_example.txt b/Examples/hotuser_example.txt
new file mode 100644
index 000000000000..c038acd6cda8
--- /dev/null
+++ b/Examples/hotuser_example.txt
@@ -0,0 +1,107 @@
+The following are demonstrations of the hotuser DTrace program.
+
+
+Here, hotuser is run on a test program called "dofuncs", which is hard coded
+to spend half its time in delta(), a third in beta() and a sixth in alpha().
+
+ # ./hotuser -c ./dofuncs
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ FUNCTION COUNT PCNT
+ dofuncs`alpha 511 16.5%
+ dofuncs`beta 1029 33.3%
+ dofuncs`delta 1552 50.2%
+
+hotuser has accurately sampled which user-level functions are on the CPU,
+producing a report of the expected breakdown. The hottest user-level function
+is delta(), which was sampled 1552 times - 50.2% of the total samples.
+
+
+
+Now hotuser is run on gunzip, to find which functions are most often
+on the CPU,
+
+ # ./hotuser -c 'gunzip contents.gz'
+ Sampling... Hit Ctrl-C to end.
+
+ FUNCTION COUNT PCNT
+ libc.so.1`_free_unlocked 1 0.1%
+ gunzip`unzip 1 0.1%
+ ld.so.1`strcmp 1 0.1%
+ gunzip`inflate_dynamic 1 0.1%
+ libc.so.1`_write 1 0.1%
+ gunzip`write_buf 1 0.1%
+ gunzip`0x2d990 2 0.3%
+ libc.so.1`write 2 0.3%
+ gunzip`0x2d994 2 0.3%
+ ld.so.1`rtld_db_preinit 3 0.4%
+ gunzip`0x2d98c 7 0.9%
+ gunzip`huft_build 9 1.2%
+ libc_psr.so.1`memcpy 138 18.5%
+ gunzip`inflate_codes 233 31.2%
+ gunzip`updcrc 344 46.1%
+
+This shows that updcrc() was sampled 344 times, and 46.1% of the total
+samples.
+
+
+
+A -l option will provide a breakdown on libraries only. hotuser
+is run on gzip to show library usage only,
+
+ # ./hotuser -lc 'gzip contents'
+ Sampling... Hit Ctrl-C to end.
+
+ LIBRARY COUNT PCNT
+ libc.so.1 2 0.0%
+ libc_psr.so.1 37 0.9%
+ gzip 4113 99.1%
+
+This shows that code in the gzip binary itself was on the CPU 99.1% of
+the sample times, with libc_psr.so.1 code on the CPU 0.9% of the time.
+
+
+
+The following shows library usage of mozilla. The pgrep command is used to
+match the most recent PID of mozilla-bin.
+
+ # ./hotuser -lp `pgrep -n mozilla-bin`
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ LIBRARY COUNT PCNT
+ libplds4.so 1 0.1%
+ libappcomps.so 1 0.1%
+ libi18n.so 1 0.1%
+ libuconv.so 1 0.1%
+ libpref.so 1 0.1%
+ libblueprint.so 1 0.1%
+ libz.so.1 2 0.2%
+ libcaps.so 2 0.2%
+ libXrender.so.1 2 0.2%
+ libimglib2.so 2 0.2%
+ libXft.so.2 3 0.3%
+ libCrun.so.1 3 0.3%
+ libdocshell.so 3 0.3%
+ libplc4.so 4 0.4%
+ libgtk-x11-2.0.so.0.400.9 5 0.5%
+ libjsd.so 5 0.5%
+ libX11.so.4 5 0.5%
+ libnecko.so 8 0.9%
+ libwidget_gtk2.so 9 1.0%
+ libgkgfx.so 13 1.4%
+ libglib-2.0.so.0.400.1 14 1.5%
+ libgfx_gtk.so 18 2.0%
+ libnspr4.so 20 2.2%
+ libxpconnect.so 22 2.4%
+ libgdk-x11-2.0.so.0.400.9 23 2.5%
+ libgobject-2.0.so.0.400.1 25 2.7%
+ libhtmlpars.so 27 3.0%
+ libfontconfig.so.1 41 4.5%
+ libxpcom.so 49 5.4%
+ mozilla-bin 55 6.0%
+ libmozjs.so 80 8.8%
+ libc.so.1 115 12.6%
+ libgklayout.so 352 38.6%
+
+This shows that 352 samples found code from libgklayout.so running, which
+was 38.6% of the samples.
diff --git a/Examples/httpdstat_example.txt b/Examples/httpdstat_example.txt
new file mode 100644
index 000000000000..b9f59e8ca687
--- /dev/null
+++ b/Examples/httpdstat_example.txt
@@ -0,0 +1,36 @@
+The following is an example of using the httpdstat.d script.
+
+
+This Solaris 10 server is running Apache as a webserver. The script matches
+on the process name "httpd". Here it shows many GET connections,
+
+ # httpdstat.d
+ TIME NUM GET POST HEAD TRACE
+ 2005 Nov 29 18:46:46 38 38 0 0 0
+ 2005 Nov 29 18:46:47 109 109 0 0 0
+ 2005 Nov 29 18:46:48 112 112 0 0 0
+ 2005 Nov 29 18:46:49 113 113 0 0 0
+ 2005 Nov 29 18:46:50 107 107 0 0 0
+ 2005 Nov 29 18:46:51 56 56 0 0 0
+ 2005 Nov 29 18:46:52 0 0 0 0 0
+ 2005 Nov 29 18:46:53 0 0 0 0 0
+ 2005 Nov 29 18:46:54 20 20 0 0 0
+ 2005 Nov 29 18:46:55 48 48 0 0 0
+ ^C
+
+For a few seconds we had around 100 GETs per second.
+
+
+
+httpdstat.d accepts an argument as the sample interval, here we print a
+line every 30 seconds,
+
+ # httpdstat.d 30
+ TIME NUM GET POST HEAD TRACE
+ 2005 Nov 29 18:50:49 462 458 3 1 0
+ 2005 Nov 29 18:51:19 421 413 5 2 1
+ 2005 Nov 29 18:51:49 1361 1358 3 0 0
+ ^C
+
+The values are for the entire interval.
+
diff --git a/Examples/icmpstat_example.txt b/Examples/icmpstat_example.txt
new file mode 100644
index 000000000000..e8b8cfe6500b
--- /dev/null
+++ b/Examples/icmpstat_example.txt
@@ -0,0 +1,29 @@
+The following is a demonstration of the icmpstat.d script,
+
+
+Here we run it and catch an inbound ping,
+
+ # icmpstat.d
+ 2005 Jul 25 23:05:39,
+
+ STATISTIC VALUE
+
+ 2005 Jul 25 23:05:40,
+
+ STATISTIC VALUE
+ icmpOutMsgs 1
+ icmpOutEchoReps 1
+ icmpInEchos 1
+ icmpInMsgs 1
+
+ 2005 Jul 25 23:05:41,
+
+ STATISTIC VALUE
+
+ ^C
+
+Files such as /usr/include/inet/mib2.h may explain each of the statistics.
+
+The icmpstat.d is a simple demonstration of tracing ICMP activity. It may
+serve as the starting point for other scripts.
+
diff --git a/Examples/intbycpu_example.txt b/Examples/intbycpu_example.txt
new file mode 100644
index 000000000000..5ed213cba6ba
--- /dev/null
+++ b/Examples/intbycpu_example.txt
@@ -0,0 +1,11 @@
+The following is a demonstration of the intbycpu.d script,
+
+ # intbycpu.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ CPU INTERRUPTS
+ 0 374
+ 1 412
+
+In the above output, CPU 1 had 412 interrupts, and CPU 0 had 374.
+
diff --git a/Examples/intoncpu_example.txt b/Examples/intoncpu_example.txt
new file mode 100644
index 000000000000..ed408eb6a17d
--- /dev/null
+++ b/Examples/intoncpu_example.txt
@@ -0,0 +1,93 @@
+The following is an example of the intoncpu.d script.
+
+
+Here we run it for a few seconds then hit Ctrl-C,
+
+ # ./intoncpu.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ uhci1
+
+ value ------------- Distribution ------------- count
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 8192 | 0
+ uhci0
+
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16
+ 2048 |@@@@ 2
+ 4096 |@@ 1
+ 8192 |@@ 1
+ 16384 | 0
+ rtls0
+
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@ 8
+ 2048 |@@@@@@@@@@ 5
+ 4096 |@@@@@@ 3
+ 8192 | 0
+ 16384 |@@ 1
+ 32768 |@@ 1
+ 65536 |@@@@ 2
+ 131072 | 0
+
+The rtls0 driver (the network interface) has encourtered the most interrupts,
+with the time taken to process each interrupt visible as a distribution.
+These times ranged from around 1000 ns (1 us), to at least 65536 ns (65 us).
+
+To determine which devices the instance names represent (eg, "uhci1"), the
+/etc/path_to_inst file could be examied.
+
+
+
+The following is a longer example of running intoncpu.d,
+
+ # ./intoncpu.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ uhci1
+
+ value ------------- Distribution ------------- count
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 8192 | 0
+ ata1
+
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@ 2
+ 32768 |@@@@@@@@@@@@@@@@@@@@ 2
+ 65536 | 0
+ ata0
+
+ value ------------- Distribution ------------- count
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@ 55
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 113
+ 16384 |@ 5
+ 32768 | 0
+ uhci0
+
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1288
+ 2048 |@@ 53
+ 4096 | 6
+ 8192 | 0
+ rtls0
+
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@ 665
+ 2048 |@@@@@@@@@ 307
+ 4096 |@ 35
+ 8192 | 0
+ 16384 |@@@@@@@ 229
+ 32768 |@@@ 91
+ 65536 |@ 19
+ 131072 | 1
+ 262144 | 0
+
diff --git a/Examples/inttimes_example.txt b/Examples/inttimes_example.txt
new file mode 100644
index 000000000000..384d700ba234
--- /dev/null
+++ b/Examples/inttimes_example.txt
@@ -0,0 +1,18 @@
+The following is a demonstration of the inttimes.d script,
+
+
+Here we run it for a few seconds then hit Ctrl-C,
+
+ # inttimes.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ DEVICE TIME (ns)
+ ata0 22324
+ uhci1 45893
+ ata1 138559
+ uhci0 229226
+ i80420 1305617
+ rtls0 2540175
+
+In the above output, we can see that the rtls0 driver spent 2540 us on the
+CPU servicing interrupts, while ata0 spent only 22 us.
diff --git a/Examples/iofile_example.txt b/Examples/iofile_example.txt
new file mode 100644
index 000000000000..f4fc476910f0
--- /dev/null
+++ b/Examples/iofile_example.txt
@@ -0,0 +1,35 @@
+The following is a demonstration of the iofile.d script,
+
+
+Here we run it while a tar command is backing up /var/adm,
+
+ # iofile.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD TIME FILE
+ 5206 tar 109 /var/adm/acct/nite
+ 5206 tar 110 /var/adm/acct/sum
+ 5206 tar 114 /var/adm/acct/fiscal
+ 5206 tar 117 /var/adm/messages.3
+ 5206 tar 172 /var/adm/sa
+ 5206 tar 3605 /var/adm/messages.2
+ 5206 tar 4548 /var/adm/spellhist
+ 5206 tar 5769 /var/adm/exacct/brendan1task
+ 5206 tar 6416 /var/adm/acct
+ 5206 tar 7587 /var/adm/messages.1
+ 5206 tar 8246 /var/adm/exacct/task
+ 5206 tar 8320 /var/adm/pool
+ 5206 tar 8973 /var/adm/pool/history
+ 5206 tar 9183 /var/adm/exacct
+ 3 fsflush 10882 <none>
+ 5206 tar 11861 /var/adm/exacct/flow
+ 5206 tar 12042 /var/adm/messages.0
+ 5206 tar 12408 /var/adm/sm.bin
+ 5206 tar 13021 /var/adm/sulog
+ 5206 tar 19007 /var/adm/streams
+ 5206 tar 21811 <none>
+ 5206 tar 24918 /var/adm/exacct/proc
+
+In the above output, we can see that the tar command spent 24918 us (25 ms)
+waiting for disk I/O on the /var/adm/exacct/proc file.
+
diff --git a/Examples/iofileb_example.txt b/Examples/iofileb_example.txt
new file mode 100644
index 000000000000..21597f7e776d
--- /dev/null
+++ b/Examples/iofileb_example.txt
@@ -0,0 +1,23 @@
+The following is a demonstration of the iofileb.d script,
+
+
+Here we run it while a tar command is backing up /var/adm,
+
+ # ./iofileb.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD KB FILE
+ 29529 tar 56 /var/adm/sa/sa31
+ 29529 tar 56 /var/adm/sa/sa03
+ 29529 tar 56 /var/adm/sa/sa02
+ 29529 tar 56 /var/adm/sa/sa01
+ 29529 tar 56 /var/adm/sa/sa04
+ 29529 tar 56 /var/adm/sa/sa27
+ 29529 tar 56 /var/adm/sa/sa28
+ 29529 tar 324 /var/adm/exacct/task
+ 29529 tar 736 /var/adm/wtmpx
+
+In the above output, we can see that the tar command has caused 736 Kbytes
+of the /var/adm/wtmpx file to be read from disk. All af the Kbyte values
+measured are for disk activity.
+
diff --git a/Examples/iopattern_example.txt b/Examples/iopattern_example.txt
new file mode 100644
index 000000000000..818a4a22e6dc
--- /dev/null
+++ b/Examples/iopattern_example.txt
@@ -0,0 +1,57 @@
+The following is a demonstration of the iopattern program,
+
+
+Here we run iopattern for a few seconds then hit Ctrl-C. There is a "dd"
+command running on this system to intentionally create heavy sequential
+disk activity,
+
+ # iopattern
+ %RAN %SEQ COUNT MIN MAX AVG KR KW
+ 1 99 465 4096 57344 52992 23916 148
+ 0 100 556 57344 57344 57344 31136 0
+ 0 100 634 57344 57344 57344 35504 0
+ 6 94 554 512 57344 54034 29184 49
+ 0 100 489 57344 57344 57344 27384 0
+ 21 79 568 4096 57344 46188 25576 44
+ 4 96 431 4096 57344 56118 23620 0
+ ^C
+
+In the above output we can see that the disk activity is mostly sequential.
+The disks are also pulling around 30 Mb during each sample, with a large
+average event size.
+
+
+
+The following demonstrates iopattern while running a "find" command to
+cause random disk activity,
+
+ # iopattern
+ %RAN %SEQ COUNT MIN MAX AVG KR KW
+ 86 14 400 1024 8192 1543 603 0
+ 81 19 455 1024 8192 1606 714 0
+ 89 11 469 512 8192 1854 550 299
+ 83 17 463 1024 8192 1782 806 0
+ 87 13 394 1024 8192 1551 597 0
+ 85 15 348 512 57344 2835 808 155
+ 91 9 513 512 47616 2812 570 839
+ 76 24 317 512 35840 3755 562 600
+ ^C
+
+In the above output, we can see from the percentages that the disk events
+were mostly random. We can also see that the average event size is small -
+which makes sense if we are reading through many directory files.
+
+
+
+iopattern has options. Here we print timestamps "-v" and measure every 10
+seconds,
+
+ # iopattern -v 10
+ TIME %RAN %SEQ COUNT MIN MAX AVG KR KW
+ 2005 Jul 25 20:40:55 97 3 33 512 8192 1163 8 29
+ 2005 Jul 25 20:41:05 0 0 0 0 0 0 0 0
+ 2005 Jul 25 20:41:15 84 16 6 512 11776 5973 22 13
+ 2005 Jul 25 20:41:25 100 0 26 512 8192 1496 8 30
+ 2005 Jul 25 20:41:35 0 0 0 0 0 0 0 0
+ ^C
+
diff --git a/Examples/iopending_example.txt b/Examples/iopending_example.txt
new file mode 100644
index 000000000000..f4bc8225c867
--- /dev/null
+++ b/Examples/iopending_example.txt
@@ -0,0 +1,126 @@
+The following is a demonstration of the iopending tool,
+
+Here we run it with a sample interval of 1 second,
+
+ # iopending 1
+ Tracing... Please wait.
+ 2006 Jan 6 20:21:59, load: 0.02, disk_r: 0 KB, disk_w: 0 KB
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1010
+ 1 | 0
+
+ 2006 Jan 6 20:22:00, load: 0.03, disk_r: 0 KB, disk_w: 0 KB
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1000
+ 1 | 0
+
+ 2006 Jan 6 20:22:01, load: 0.03, disk_r: 0 KB, disk_w: 0 KB
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1000
+ 1 | 0
+
+ ^C
+
+The iopending tool samples at 1000 Hz, and prints a distribution of how many
+disk events were "pending" completion. In the above example the disks are
+quiet - for all the samples there are zero disk events pending.
+
+
+
+Now iopending is run with no arguments. It will default to an interval of 5
+seconds,
+
+ # iopending
+ Tracing... Please wait.
+ 2006 Jan 6 19:15:41, load: 0.03, disk_r: 3599 KB, disk_w: 0 KB
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4450
+ 1 |@@@ 390
+ 2 |@ 80
+ 3 | 40
+ 4 | 20
+ 5 | 30
+ 6 | 0
+
+ ^C
+
+In the above output there was a little disk activity. For 390 samples there
+was 1 I/O event pending; for 80 samples there was 2, and so on.
+
+
+
+
+In the following example iopending is run during heavy disk activity. We
+print output every 10 seconds,
+
+ # iopending 10
+ Tracing... Please wait.
+ 2006 Jan 6 20:58:07, load: 0.03, disk_r: 25172 KB, disk_w: 33321 KB
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@ 2160
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6720
+ 2 |@@@@ 1000
+ 3 | 50
+ 4 | 30
+ 5 | 20
+ 6 | 10
+ 7 | 10
+ 8 | 10
+ 9 | 0
+
+ 2006 Jan 6 20:58:17, load: 0.05, disk_r: 8409 KB, disk_w: 12449 KB
+
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7260
+ 1 |@@@@@@@ 1700
+ 2 |@ 300
+ 3 | 0
+ 4 | 10
+ 5 | 10
+ 6 | 10
+ 7 | 20
+ 8 | 0
+ 9 | 0
+ 10 | 0
+ 11 | 0
+ 12 | 0
+ 13 | 0
+ 14 | 0
+ 15 | 0
+ 16 | 0
+ 17 | 10
+ 18 | 20
+ 19 | 0
+ 20 | 0
+ 21 | 0
+ 22 | 0
+ 23 | 0
+ 24 | 0
+ 25 | 0
+ 26 | 0
+ 27 | 0
+ 28 | 0
+ 29 | 0
+ 30 | 0
+ 31 | 10
+ >= 32 |@@@ 650
+
+ ^C
+
+In the first output, most of the time (67%) there was 1 event pending,
+and for a short time there were 8 events pending. In the second output we
+see many samples were off the scale - 650 samples at 32 or more pending
+events. For this sample I had typed "sync" in another window, which
+queued many disk events immediately which were eventually completed.
+
diff --git a/Examples/iosnoop_example.txt b/Examples/iosnoop_example.txt
new file mode 100644
index 000000000000..addb7dcbbe46
--- /dev/null
+++ b/Examples/iosnoop_example.txt
@@ -0,0 +1,39 @@
+The following demonstrates iosnoop. It was run on a system that was
+fairly quiet until a tar command was run,
+
+# ./iosnoop
+ UID PID D BLOCK SIZE COMM PATHNAME
+ 0 0 W 1067 512 sched <none>
+ 0 0 W 6496304 1024 sched <none>
+ 0 3 W 6498797 512 fsflush <none>
+ 0 0 W 1067 512 sched <none>
+ 0 0 W 6496304 1024 sched <none>
+ 100 443 R 892288 4096 Xsun /usr/openwin/bin/Xsun
+ 100 443 R 891456 4096 Xsun /usr/openwin/bin/Xsun
+ 100 15795 R 3808 8192 tar /usr/bin/eject
+ 100 15795 R 35904 6144 tar /usr/bin/eject
+ 100 15795 R 39828 6144 tar /usr/bin/env
+ 100 15795 R 3872 8192 tar /usr/bin/expr
+ 100 15795 R 21120 7168 tar /usr/bin/expr
+ 100 15795 R 43680 6144 tar /usr/bin/false
+ 100 15795 R 44176 6144 tar /usr/bin/fdetach
+ 100 15795 R 3920 8192 tar /usr/bin/fdformat
+ 100 15795 R 3936 8192 tar /usr/bin/fdformat
+ 100 15795 R 4080 8192 tar /usr/bin/fdformat
+ 100 15795 R 9680 3072 tar /usr/bin/fdformat
+ 100 15795 R 4096 8192 tar /usr/bin/fgrep
+ 100 15795 R 46896 6144 tar /usr/bin/fgrep
+ 100 15795 R 4112 8192 tar /usr/bin/file
+ 100 15795 R 4128 8192 tar /usr/bin/file
+ 100 15795 R 4144 8192 tar /usr/bin/file
+ 100 15795 R 21552 7168 tar /usr/bin/file
+ 100 15795 R 4192 8192 tar /usr/bin/fmli
+ 100 15795 R 4208 8192 tar /usr/bin/fmli
+ 100 15795 R 4224 57344 tar /usr/bin/fmli
+ 100 15795 R 4336 24576 tar /usr/bin/fmli
+ 100 15795 R 695792 8192 tar <none>
+ 100 15795 R 696432 57344 tar /usr/bin/fmli
+[...]
+
+
+
diff --git a/Examples/iotop_example.txt b/Examples/iotop_example.txt
new file mode 100644
index 000000000000..8cf55c189ba3
--- /dev/null
+++ b/Examples/iotop_example.txt
@@ -0,0 +1,142 @@
+The following are demonstrations of the iotop program,
+
+
+Here we run iotop with the -C option to not clear the screen, but instead
+provide a scrolling output,
+
+ # iotop -C
+ Tracing... Please wait.
+ 2005 Jul 16 00:34:40, load: 1.21, disk_r: 12891 KB, disk_w: 1087 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D BYTES
+ 0 3 0 fsflush cmdk0 102 4 W 512
+ 0 3 0 fsflush cmdk0 102 0 W 11776
+ 0 27751 20320 tar cmdk0 102 16 W 23040
+ 0 3 0 fsflush cmdk0 102 0 R 73728
+ 0 0 0 sched cmdk0 102 0 R 548864
+ 0 0 0 sched cmdk0 102 0 W 1078272
+ 0 27751 20320 tar cmdk0 102 16 R 1514496
+ 0 27751 20320 tar cmdk0 102 3 R 11767808
+
+ 2005 Jul 16 00:34:45, load: 1.23, disk_r: 83849 KB, disk_w: 488 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D BYTES
+ 0 0 0 sched cmdk0 102 4 W 1536
+ 0 0 0 sched cmdk0 102 0 R 131072
+ 0 27752 20320 find cmdk0 102 0 R 262144
+ 0 0 0 sched cmdk0 102 0 W 498176
+ 0 27751 20320 tar cmdk0 102 3 R 11780096
+ 0 27751 20320 tar cmdk0 102 5 R 29745152
+ 0 27751 20320 tar cmdk0 102 4 R 47203328
+
+ 2005 Jul 16 00:34:50, load: 1.25, disk_r: 22394 KB, disk_w: 2 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D BYTES
+ 0 27752 20320 find cmdk0 102 0 W 2048
+ 0 0 0 sched cmdk0 102 0 R 16384
+ 0 321 1 automountd cmdk0 102 0 R 22528
+ 0 27752 20320 find cmdk0 102 0 R 1462272
+ 0 27751 20320 tar cmdk0 102 5 R 17465344
+
+In the above output, we can see a tar command is reading from the cmdk0
+disk, from several different slices (different minor numbers), on the last
+report focusing on 102,5 (an "ls -lL" in /dev/dsk can explain the number to
+slice mappings).
+
+The disk_r and disk_w values give a summary of the overall activity in
+bytes.
+
+
+
+Bytes can be used as a yardstick to determine which process is keeping the
+disks busy, however either of the delta times available from iotop would
+be more accurate (as they take into account whether the activity is random
+or sequential).
+
+ # iotop -Co
+ Tracing... Please wait.
+ 2005 Jul 16 00:39:03, load: 1.10, disk_r: 5302 KB, disk_w: 20 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D DISKTIME
+ 0 0 0 sched cmdk0 102 0 W 532
+ 0 0 0 sched cmdk0 102 0 R 245398
+ 0 27758 20320 find cmdk0 102 0 R 3094794
+
+ 2005 Jul 16 00:39:08, load: 1.14, disk_r: 5268 KB, disk_w: 273 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D DISKTIME
+ 0 3 0 fsflush cmdk0 102 0 W 2834
+ 0 0 0 sched cmdk0 102 0 W 263527
+ 0 0 0 sched cmdk0 102 0 R 285015
+ 0 3 0 fsflush cmdk0 102 0 R 519187
+ 0 27758 20320 find cmdk0 102 0 R 2429232
+
+ 2005 Jul 16 00:39:13, load: 1.16, disk_r: 602 KB, disk_w: 1238 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D DISKTIME
+ 0 3 0 fsflush cmdk0 102 4 W 200
+ 0 3 0 fsflush cmdk0 102 6 W 260
+ 0 3 0 fsflush cmdk0 102 0 W 883
+ 0 27758 20320 find cmdk0 102 0 R 55686
+ 0 3 0 fsflush cmdk0 102 0 R 317508
+ 0 0 0 sched cmdk0 102 0 R 320195
+ 0 0 0 sched cmdk0 102 0 W 571084
+ [...]
+
+The disk time is in microseconds. In the first sample, we can see the find
+command caused a total of 3.094 seconds of disk time - the duration of the
+samples here is 5 seconds (the default), so it would be fair to say that
+the find command is keeping the disk 60% busy.
+
+
+
+A new option for iotop is to print percents "-P" which are based on disk
+I/O times, and hense are a fair measurementt of what is keeping the disks
+busy.
+
+ # iotop -PC 1
+ Tracing... Please wait.
+ 2005 Nov 18 15:26:14, load: 0.24, disk_r: 13176 KB, disk_w: 0 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D %I/O
+ 0 2215 1663 bart cmdk0 102 0 R 85
+
+ 2005 Nov 18 15:26:15, load: 0.25, disk_r: 5263 KB, disk_w: 0 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D %I/O
+ 0 2214 1663 find cmdk0 102 0 R 15
+ 0 2215 1663 bart cmdk0 102 0 R 67
+
+ 2005 Nov 18 15:26:16, load: 0.25, disk_r: 8724 KB, disk_w: 0 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D %I/O
+ 0 2214 1663 find cmdk0 102 0 R 10
+ 0 2215 1663 bart cmdk0 102 0 R 71
+
+ 2005 Nov 18 15:26:17, load: 0.25, disk_r: 7528 KB, disk_w: 0 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D %I/O
+ 0 2214 1663 find cmdk0 102 0 R 0
+ 0 2215 1663 bart cmdk0 102 0 R 85
+
+ 2005 Nov 18 15:26:18, load: 0.26, disk_r: 11389 KB, disk_w: 0 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D %I/O
+ 0 2214 1663 find cmdk0 102 0 R 2
+ 0 2215 1663 bart cmdk0 102 0 R 80
+
+ 2005 Nov 18 15:26:19, load: 0.26, disk_r: 22109 KB, disk_w: 0 KB
+
+ UID PID PPID CMD DEVICE MAJ MIN D %I/O
+ 0 2215 1663 bart cmdk0 102 0 R 76
+
+ ^C
+
+In the above output, bart and find jostle for disk access as they create
+a database of file checksums. The command was,
+
+ find / | bart create -I > /dev/null
+
+Note that the %I/O is in terms of 1 disk. A %I/O of say 200 is allowed - it
+would mean that effectively 2 disks were at 100%, or 4 disks at 50%, etc.
+
diff --git a/Examples/j_calldist_example.txt b/Examples/j_calldist_example.txt
new file mode 100644
index 000000000000..b659c0afc3ed
--- /dev/null
+++ b/Examples/j_calldist_example.txt
@@ -0,0 +1,247 @@
+This is an example of j_calldist.d showing the elapsed times for different
+types of Java operations.
+
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0), and produces the output in graphical format, showing
+a histogram of the amount of time taken by each call. Method calls are only
+visible when using the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+Because of the extensive results returned otherwise, this script will show you
+a configurable number of results in each section. The default (as in this
+example) is ten.
+
+Here we see it tracing the activity of Code/Java/Func_abc.
+
+# j_calldist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Top 10 elapsed times (us),
+
+Top 10 exclusive method elapsed times (us),
+ PID=311342, method, sun/net/www/ParseUtil.decode
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@ 3
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@ 5
+ 2048 |@@@@ 1
+ 4096 | 0
+
+ PID=311342, method, java/net/URLClassLoader.<clinit>
+ value ------------- Distribution ------------- count
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16384 | 0
+
+ PID=311342, method, java/util/jar/JarFile.hasClassPathAttribute
+ value ------------- Distribution ------------- count
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16384 | 0
+
+ PID=311342, method, java/util/zip/ZipFile.read
+ value ------------- Distribution ------------- count
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16384 | 0
+
+ PID=311342, method, sun/nio/cs/US_ASCII.newEncoder
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16384 | 0
+
+ PID=311342, method, java/util/zip/ZipFile.getInputStream
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16384 | 0
+
+ PID=311342, method, sun/nio/cs/US_ASCII.newDecoder
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@ 1
+ 16 |@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 |@@@@@@@@@@ 1
+ 16384 | 0
+
+ PID=311342, method, java/util/HashMap.<init>
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@ 8
+ 16 |@@@@@@@@@@@@@@@@ 9
+ 32 |@@@@@@@@@ 5
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 |@@ 1
+ 16384 | 0
+
+ PID=311342, method, java/io/UnixFileSystem.normalize
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@ 1
+ 16 | 0
+ 32 | 0
+ 64 |@@@@@@@@@ 8
+ 128 |@@@@@@@@@@@@@ 11
+ 256 |@@@@@@ 5
+ 512 |@@@@@@@@@ 8
+ 1024 | 0
+ 2048 | 0
+ 4096 |@ 1
+ 8192 | 0
+
+ PID=311342, method, java/lang/Thread.sleep
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 1048576 | 0
+
+
+Top 10 inclusive method elapsed times (us),
+ PID=311342, method, java/net/URLClassLoader$1.run
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@ 1
+ 131072 | 0
+
+ PID=311342, method, java/net/URLClassLoader.findClass
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@ 1
+ 131072 | 0
+
+ PID=311342, method, sun/misc/URLClassPath.getLoader
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@ 1
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@ 2
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 8192 | 0
+ 16384 |@@@ 1
+ 32768 | 0
+ 65536 |@@@ 1
+ 131072 | 0
+
+ PID=311342, method, java/lang/ClassLoader.loadClass
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@ 6
+ 256 |@@@@@@@@@@@@@@@@@@@@@@ 15
+ 512 |@@@@ 3
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 | 0
+ 32768 | 0
+ 65536 |@@@@ 3
+ 131072 | 0
+
+ PID=311342, method, java/security/AccessController.doPrivileged
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@ 2
+ 32 |@ 1
+ 64 |@@@@ 4
+ 128 |@@@@@@@@@@@@@@@@ 17
+ 256 |@ 1
+ 512 |@@@@ 4
+ 1024 |@@ 2
+ 2048 |@ 1
+ 4096 |@@@@@@ 6
+ 8192 |@ 1
+ 16384 |@@ 2
+ 32768 | 0
+ 65536 |@@ 2
+ 131072 | 0
+
+ PID=311342, method, Func_abc.func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ PID=311342, method, Func_abc.func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ PID=311342, method, java/lang/Thread.sleep
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 1048576 | 0
+
+ PID=311342, method, Func_abc.func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+ PID=311342, method, Func_abc.main
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+The elapsed times section is empty. It would show us anything that is not a
+Java method - garbage collection for example. However there was nothing of
+the kind in this example.
+
+The exclusive method elapsed times show us the time spent in the top ten most
+time consuming methods, not including time spent in subroutines called by
+those methods.
+
+The inclusive method elapsed times show us the time spent in the top ten most
+time consuming methods including time spent in subroutines called by those
+methods.
+
+It is important to pay close attention to the third column, "count" as this
+will indicate if there were any instances in a particular timeframe, even if
+the number is too small to show up on the histogram clearly.
diff --git a/Examples/j_calls_example.txt b/Examples/j_calls_example.txt
new file mode 100644
index 000000000000..3aacb2c9025c
--- /dev/null
+++ b/Examples/j_calls_example.txt
@@ -0,0 +1,137 @@
+The following are examples of running the j_calls.d script.
+
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0). Method calls and object allocation are only visible
+when using the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+Here we see it running on Code/Java/Func_abc
+
+# j_calls.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+ PID TYPE NAME COUNT
+ 311334 cload Func_abc 1
+ 311334 cload java/io/BufferedInputStream 1
+ 311334 cload java/io/BufferedOutputStream 1
+ 311334 cload java/io/BufferedReader 1
+ 311334 cload java/io/BufferedWriter 1
+ 311334 cload java/io/Closeable 1
+ 311334 cload java/io/Console 1
+ 311334 cload java/io/Console$1 1
+ 311334 cload java/io/Console$1$1 1
+ 311334 cload java/io/DataInput 1
+ 311334 cload java/io/DataInputStream 1
+ 311334 cload java/io/DeleteOnExitHook 1
+ 311334 cload java/io/ExpiringCache 1
+ 311334 cload java/io/ExpiringCache$1 1
+ 311334 cload java/io/ExpiringCache$Entry 1
+ 311334 cload java/io/File 1
+ 311334 cload java/io/File$1 1
+ 311334 cload java/io/FileDescriptor 1
+ 311334 cload java/io/FileInputStream 1
+ 311334 cload java/io/FileOutputStream 1
+ 311334 cload java/io/FilePermission 1
+ 311334 cload java/io/FilePermission$1 1
+ 311334 cload java/io/FilePermissionCollection 1
+ 311334 cload java/io/FileReader 1
+ 311334 cload java/io/FileSystem 1
+ 311334 cload java/io/FilterInputStream 1
+ 311334 cload java/io/FilterOutputStream 1
+ 311334 cload java/io/Flushable 1
+ 311334 cload java/io/InputStream 1
+ 311334 cload java/io/InputStreamReader 1
+ 311334 cload java/io/ObjectStreamClass 1
+ 311334 cload java/io/ObjectStreamField 1
+ 311334 cload java/io/OutputStream 1
+ 311334 cload java/io/OutputStreamWriter 1
+ 311334 cload java/io/PrintStream 1
+ 311334 cload java/io/Reader 1
+ 311334 cload java/io/Serializable 1
+ 311334 cload java/io/UnixFileSystem 1
+ 311334 cload java/io/Writer 1
+ 311334 cload java/lang/AbstractStringBuilder 1
+ 311334 cload java/lang/Appendable 1
+ 311334 cload java/lang/ApplicationShutdownHooks 1
+ 311334 cload java/lang/ArithmeticException 1
+ 311334 cload java/lang/ArrayStoreException 1
+ 311334 cload java/lang/Boolean 1
+ 311334 cload java/lang/Byte 1
+ 311334 cload java/lang/CharSequence 1
+ 311334 cload java/lang/Character 1
+ 311334 cload java/lang/CharacterDataLatin1 1
+ 311334 cload java/lang/Class 1
+[... 1400 lines truncated ...]
+ 311334 method java/lang/Class.getClassLoader0 34
+ 311334 method java/lang/String.toLowerCase 34
+ 311334 method sun/security/action/GetPropertyAction.run 34
+ 311334 method java/nio/CharBuffer.arrayOffset 36
+ 311334 method java/util/HashMap.getEntry 36
+ 311334 method java/io/File.<init> 37
+ 311334 method java/io/UnixFileSystem.prefixLength 37
+ 311334 oalloc java/io/File 37
+ 311334 oalloc java/lang/reflect/Field 37
+ 311334 method java/io/BufferedReader.readLine 38
+ 311334 method java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread 38
+ 311334 method java/lang/CharacterDataLatin1.toLowerCase 41
+ 311334 method java/lang/CharacterDataLatin1.getProperties 43
+ 311334 method java/security/AccessController.doPrivileged 43
+ 311334 method java/util/Vector.size 43
+ 311334 method java/nio/Buffer.position 44
+ 311334 method java/nio/ByteBuffer.arrayOffset 44
+ 311334 method java/lang/System.getProperty 48
+ 311334 method java/util/Properties.getProperty 50
+ 311334 method java/util/BitSet.expandTo 51
+ 311334 method java/util/BitSet.set 51
+ 311334 method java/lang/System.checkKey 56
+ 311334 method java/lang/Thread.currentThread 57
+ 311334 method java/util/Hashtable$Entry.<init> 57
+ 311334 oalloc [Ljava/lang/String; 57
+ 311334 oalloc java/util/Hashtable$Entry 57
+ 311334 method java/util/Hashtable.get 59
+ 311334 method java/util/Hashtable.put 63
+ 311334 method java/util/BitSet.checkInvariants 71
+ 311334 method java/util/BitSet.wordIndex 72
+ 311334 method java/lang/StringBuilder.<init> 73
+ 311334 method java/lang/StringBuilder.toString 73
+ 311334 oalloc java/lang/StringBuilder 73
+ 311334 method java/lang/AbstractStringBuilder.expandCapacity 81
+ 311334 method java/util/HashMap.hash 81
+ 311334 method java/util/HashMap.indexFor 81
+ 311334 method java/lang/AbstractStringBuilder.<init> 82
+ 311334 method java/lang/Character.toLowerCase 82
+ 311334 method java/lang/String.startsWith 83
+ 311334 method java/util/Arrays.copyOf 87
+ 311334 method java/lang/String.lastIndexOf 90
+ 311334 method java/lang/String.substring 94
+ 311334 method java/util/Arrays.copyOfRange 107
+ 311334 method java/lang/String.getChars 156
+ 311334 method java/lang/System.getSecurityManager 174
+ 311334 method java/lang/String.<init> 175
+ 311334 method java/lang/String.equals 202
+ 311334 method java/lang/Math.min 208
+ 311334 method java/lang/String.hashCode 213
+ 311334 method java/lang/String.indexOf 302
+ 311334 oalloc [Ljava/lang/Object; 326
+ 311334 method java/lang/System.arraycopy 360
+ 311334 oalloc [I 374
+ 311334 oalloc java/lang/Class 395
+ 311334 oalloc [B 406
+ 311334 oalloc [S 486
+ 311334 method java/lang/StringBuilder.append 533
+ 311334 oalloc [[I 541
+ 311334 method java/lang/AbstractStringBuilder.append 549
+ 311334 method java/lang/Object.<init> 823
+ 311334 oalloc java/lang/String 931
+ 311334 oalloc [C 1076
+ 311334 method java/lang/String.charAt 1960
+
+This shows us each of the events associated with the PID 311334, and the
+number of times each event happened. These events can be of type cload (class
+load), method (method call), mcompile (method compile), mload (compiled method
+load), oalloc (object alloc) or thread (thread start).
+
+In this case you can see 1960 calls to java/lang/String.charAt, and 1076
+object allocations of type [C.
+
diff --git a/Examples/j_calltime_example.txt b/Examples/j_calltime_example.txt
new file mode 100644
index 000000000000..937e06f2a08a
--- /dev/null
+++ b/Examples/j_calltime_example.txt
@@ -0,0 +1,67 @@
+The following are examples of j_calltime.d.
+
+This script traces the elapsed time of Java methods and prints a report of the
+top ten in each category. This number is configurable with simple edit of
+the DTrace script
+
+Here it traces the example program, Code/Java/Func_abc
+
+# j_calltime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Top 10 counts,
+ PID TYPE NAME COUNT
+ 311358 method java/lang/String.equals 202
+ 311358 method java/lang/Math.min 208
+ 311358 method java/lang/String.hashCode 213
+ 311358 method java/lang/String.indexOf 302
+ 311358 method java/lang/System.arraycopy 360
+ 311358 method java/lang/StringBuilder.append 533
+ 311358 method java/lang/AbstractStringBuilder.append 549
+ 311358 method java/lang/Object.<init> 823
+ 311358 method java/lang/String.charAt 1960
+ 0 total - 12020
+
+Top 10 elapsed times (us),
+ PID TYPE NAME TOTAL
+
+Top 10 exclusive method elapsed times (us),
+ PID TYPE NAME TOTAL
+ 311358 method java/nio/ByteBuffer.<init> 5430
+ 311358 method java/lang/String.charAt 6079
+ 311358 method java/lang/String.<init> 7306
+ 311358 method java/lang/StringBuilder.append 10240
+ 311358 method java/util/StringTokenizer.scanToken 11075
+ 311358 method java/net/URL.<clinit> 12519
+ 311358 method java/io/UnixFileSystem.normalize 13218
+ 311358 method sun/net/www/ParseUtil.decode 14208
+ 311358 method java/lang/Thread.sleep 3016374
+ 0 total - 3344993
+
+Top 10 inclusive method elapsed times (us),
+ PID TYPE NAME TOTAL
+ 311358 method sun/misc/Launcher.<clinit> 129120
+ 311358 method java/lang/ClassLoader.initSystemClassLoader 129851
+ 311358 method java/lang/ClassLoader.getSystemClassLoader 129897
+ 311358 method java/lang/ClassLoader.loadClass 267404
+ 311358 method java/security/AccessController.doPrivileged 278364
+ 311358 method Func_abc.func_c 1009971
+ 311358 method Func_abc.func_b 2019995
+ 311358 method java/lang/Thread.sleep 3016374
+ 311358 method Func_abc.func_a 3027043
+ 311358 method Func_abc.main 3027068
+
+Counts shows us how many times each different method was called, and how
+many methods were called in total.
+
+The exclusive method elapsed times show the time that each method spent
+processing code - while not in other method.
+
+The inclusive method elapsed times show the time that each method spent
+processing code, including the time spent in other calls.
+
+These elapsed times are the absolute time from when the method began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc.
+
diff --git a/Examples/j_classflow_example.txt b/Examples/j_classflow_example.txt
new file mode 100644
index 000000000000..b8a9b75000cd
--- /dev/null
+++ b/Examples/j_classflow_example.txt
@@ -0,0 +1,89 @@
+Following are examples of j_classflow.d.
+
+This watches Java method entries and returns from all Java processes on the
+system with hotspot provider support (1.6.0) and the flag
+"+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+
+Here we can see it run on Code/Java/Func_abc.
+
+# j_classflow.d Func_abc
+ C PID TIME(us) -- CLASS.METHOD
+ 0 311425 4789778117827 -> Func_abc.main
+ 0 311425 4789778117844 -> Func_abc.func_a
+ 0 311425 4789779120071 -> Func_abc.func_b
+ 0 311425 4789780130070 -> Func_abc.func_c
+ 0 311425 4789781140067 <- Func_abc.func_c
+ 0 311425 4789781140079 <- Func_abc.func_b
+ 0 311425 4789781140087 <- Func_abc.func_a
+ 0 311425 4789781140095 <- Func_abc.main
+^C
+
+The first column, C gives us the CPU ID.
+
+The second column, TIME(us), gives us the time since boot in microseconds.
+
+The third column, PID gives us the Process ID.
+
+The fourth column, CLASS.METHOD gives us the Java class and method name.
+
+We can see that Func_abc.main called Func.abc.func_a, which in turn
+called Func_abc.funcb etc.
+
+Here we can see an example of running it on java/io/BufferedOutputStream
+
+# j_classflow.d java/io/BufferedOutputStream
+ C PID TIME(us) -- CLASS.METHOD
+ 0 311461 4790094765413 -> java/io/BufferedOutputStream.<init>
+ 0 311461 4790094765459 <- java/io/BufferedOutputStream.<init>
+ 0 311461 4790094779559 -> java/io/BufferedOutputStream.<init>
+ 0 311461 4790094779595 <- java/io/BufferedOutputStream.<init>
+ 0 311461 4790094965883 -> java/io/BufferedOutputStream.write
+ 0 311461 4790094965913 <- java/io/BufferedOutputStream.write
+ 0 311461 4790094965926 -> java/io/BufferedOutputStream.flush
+ 0 311461 4790094965936 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790094966279 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790094966293 <- java/io/BufferedOutputStream.flush
+ 0 311461 4790094966588 -> java/io/BufferedOutputStream.write
+ 0 311461 4790094966602 <- java/io/BufferedOutputStream.write
+ 0 311461 4790094966610 -> java/io/BufferedOutputStream.flush
+ 0 311461 4790094966618 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790094966778 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790094966787 <- java/io/BufferedOutputStream.flush
+ 0 311461 4790094966811 -> java/io/BufferedOutputStream.flush
+ 0 311461 4790094966819 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790094966828 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790094966836 <- java/io/BufferedOutputStream.flush
+ 0 311461 4790095970345 -> java/io/BufferedOutputStream.write
+ 0 311461 4790095970372 <- java/io/BufferedOutputStream.write
+ 0 311461 4790095970382 -> java/io/BufferedOutputStream.flush
+ 0 311461 4790095970390 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790095970453 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790095970462 <- java/io/BufferedOutputStream.flush
+ 0 311461 4790095970737 -> java/io/BufferedOutputStream.write
+ 0 311461 4790095970751 <- java/io/BufferedOutputStream.write
+ 0 311461 4790095970759 -> java/io/BufferedOutputStream.flush
+ 0 311461 4790095970766 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790095970795 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790095970804 <- java/io/BufferedOutputStream.flush
+ 0 311461 4790095970828 -> java/io/BufferedOutputStream.flush
+ 0 311461 4790095970836 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790095970844 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790095970853 <- java/io/BufferedOutputStream.flush
+ 0 311461 4790096980348 -> java/io/BufferedOutputStream.write
+ 0 311461 4790096980373 <- java/io/BufferedOutputStream.write
+ 0 311461 4790096980383 -> java/io/BufferedOutputStream.flush
+ 0 311461 4790096980391 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790096980452 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790096980460 <- java/io/BufferedOutputStream.flush
+ 0 311461 4790096980735 -> java/io/BufferedOutputStream.write
+ 0 311461 4790096980749 <- java/io/BufferedOutputStream.write
+ 0 311461 4790096980757 -> java/io/BufferedOutputStream.flush
+ 0 311461 4790096980765 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790096980794 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790096980803 <- java/io/BufferedOutputStream.flush
+ 0 311461 4790096980826 -> java/io/BufferedOutputStream.flush
+ 0 311461 4790096980834 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790096980843 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311461 4790096980851 <- java/io/BufferedOutputStream.flush
+
+
diff --git a/Examples/j_cpudist_example.txt b/Examples/j_cpudist_example.txt
new file mode 100644
index 000000000000..15abac649a5f
--- /dev/null
+++ b/Examples/j_cpudist_example.txt
@@ -0,0 +1,252 @@
+This is an example of j_cpudist.d showing the elapsed times for different
+types of Java operations.
+
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0), and produces the output in graphical format, showing
+a histogram of the amount of time taken by each call. Method calls are only
+visible when using the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+Because of the extensive results returned otherwise, this script will show you
+a configurable number of results in each section. The default (as in this
+example) is ten.
+
+Here we see it tracing the activity of Code/Java/Func_abc.
+
+# j_cpudist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Top 10 on-CPU times (us),
+
+Top 10 exclusive method on-CPU times (us),
+ PID=311364, method, java/lang/AbstractStringBuilder.append
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 382
+ 2 |@@@@@@@@@@@ 151
+ 4 |@ 13
+ 8 | 1
+ 16 | 1
+ 32 | 1
+ 64 | 0
+
+ PID=311364, method, java/util/Arrays.copyOf
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 68
+ 4 |@@@@@@@ 15
+ 8 | 0
+ 16 | 0
+ 32 | 1
+ 64 | 1
+ 128 | 0
+ 256 |@ 2
+ 512 | 0
+
+ PID=311364, method, java/io/UnixFileSystem.normalize
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@ 1
+ 4 | 0
+ 8 |@@@@@@@@@@@ 9
+ 16 |@@@@@@@@@@@@@@ 12
+ 32 |@@@@@@ 5
+ 64 |@@@@@@@ 6
+ 128 |@ 1
+ 256 | 0
+
+ PID=311364, method, java/io/File.<clinit>
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ PID=311364, method, sun/misc/URLClassPath$JarLoader.getJarFile
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ PID=311364, method, java/io/FilePermission$1.run
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 2
+ 4 |@@@@@@@@@@ 1
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 |@@@@@@@@@@ 1
+ 2048 | 0
+
+ PID=311364, method, java/lang/StringBuilder.append
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 526
+ 4 | 2
+ 8 | 0
+ 16 | 4
+ 32 | 1
+ 64 | 0
+
+ PID=311364, method, java/lang/String.<init>
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 162
+ 4 |@@ 10
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 1
+ 128 | 0
+ 256 | 1
+ 512 | 0
+ 1024 | 1
+ 2048 | 0
+
+ PID=311364, method, java/lang/String.charAt
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1953
+ 2 | 3
+ 4 | 1
+ 8 | 1
+ 16 | 2
+ 32 | 0
+
+ PID=311364, method, java/lang/System.initializeSystemClass
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+
+Top 10 inclusive method on-CPU times (us),
+ PID=311364, method, sun/misc/Launcher$ExtClassLoader.<init>
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32768 | 0
+
+ PID=311364, method, sun/misc/Launcher$ExtClassLoader.getExtClassLoader
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32768 | 0
+
+ PID=311364, method, sun/misc/Launcher$ExtClassLoader.getExtURLs
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32768 | 0
+
+ PID=311364, method, sun/misc/Launcher.<clinit>
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32768 | 0
+
+ PID=311364, method, sun/misc/Launcher.<init>
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32768 | 0
+
+ PID=311364, method, java/lang/ClassLoader.loadClassInternal
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 128 |@@@@@@@@@ 2
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 |@@@@ 1
+ 32768 | 0
+
+ PID=311364, method, sun/misc/Launcher$AppClassLoader.loadClass
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 128 |@@@@@@@@@ 2
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 |@@@@ 1
+ 32768 | 0
+
+ PID=311364, method, sun/misc/URLClassPath.getLoader
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@ 1
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 |@@@ 1
+ 512 |@@@@@@@@@@@@@@@@@@@@@@ 7
+ 1024 |@@@@@@ 2
+ 2048 | 0
+ 4096 |@@@ 1
+ 8192 |@@@ 1
+ 16384 | 0
+
+ PID=311364, method, java/lang/ClassLoader.loadClass
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@ 6
+ 64 |@@@@@@@@@@@@@@@@@@@@@ 14
+ 128 |@@@@@@ 4
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 |@ 1
+ 16384 |@@@ 2
+ 32768 | 0
+
+ PID=311364, method, java/security/AccessController.doPrivileged
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@ 1
+ 8 |@@@@ 4
+ 16 |@@@@@@@@@@ 11
+ 32 |@@@@@@@@@@ 11
+ 64 | 0
+ 128 |@@@ 3
+ 256 |@ 1
+ 512 |@@@@@ 5
+ 1024 |@@ 2
+ 2048 |@ 1
+ 4096 |@ 1
+ 8192 |@@ 2
+ 16384 |@ 1
+ 32768 | 0
+
+The elapsed times section is empty. It would show us anything that is not a
+Java method - garbage collection for example. However there was nothing of
+the kind in this example.
+
+The exclusive method elapsed times show us the time spent on-CPU by the most
+time consuming methods, not including time spent in subroutines called by
+those methods.
+
+The inclusive method elapsed times show us the time spent on-CPU by the top
+ten most time consuming methods including time spent in subroutines called by
+those methods.
+
+It is important to pay close attention to the third column, "count" as this
+will indicate if there were any instances in a particular timeframe, even if
+the number is too small to show up on the histogram clearly.
+
diff --git a/Examples/j_cputime_example.txt b/Examples/j_cputime_example.txt
new file mode 100644
index 000000000000..0947cc05cbcd
--- /dev/null
+++ b/Examples/j_cputime_example.txt
@@ -0,0 +1,75 @@
+The following are examples of j_cputime.d.
+
+This script traces the on-CPU time of Java methods and prints a report. Here
+it traces the example program, Code/Java/Func_abc
+
+# j_cputime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Top 10 counts,
+ PID TYPE NAME COUNT
+ 311374 method java/lang/String.equals 202
+ 311374 method java/lang/Math.min 208
+ 311374 method java/lang/String.hashCode 213
+ 311374 method java/lang/String.indexOf 302
+ 311374 method java/lang/System.arraycopy 360
+ 311374 method java/lang/StringBuilder.append 533
+ 311374 method java/lang/AbstractStringBuilder.append 549
+ 311374 method java/lang/Object.<init> 823
+ 311374 method java/lang/String.charAt 1960
+ 0 total - 12020
+
+Top 10 on-CPU times (us),
+ PID TYPE NAME TOTAL
+
+Top 10 exclusive method on-CPU times (us),
+ PID TYPE NAME TOTAL
+ 311374 method java/io/FilePermission$1.run 1055
+ 311374 method java/util/Arrays.copyOf 1110
+ 311374 method sun/net/www/ParseUtil.decode 1161
+ 311374 method java/io/File.<clinit> 1212
+ 311374 method java/lang/StringBuilder.append 1228
+ 311374 method java/io/UnixFileSystem.normalize 1402
+ 311374 method java/lang/String.<init> 2251
+ 311374 method java/lang/String.charAt 2262
+ 311374 method java/lang/System.initializeSystemClass 2751
+ 0 total - 99868
+
+Top 10 inclusive method on-CPU times (us),
+ PID TYPE NAME TOTAL
+ 311374 method java/lang/ClassLoader.loadClassInternal 25826
+ 311374 method sun/misc/Launcher$ExtClassLoader.getExtClassLoader 25914
+ 311374 method java/net/URL.<init> 27677
+ 311374 method sun/misc/Launcher.<init> 28566
+ 311374 method sun/misc/Launcher.<clinit> 28744
+ 311374 method java/lang/ClassLoader.initSystemClassLoader 29241
+ 311374 method java/lang/ClassLoader.getSystemClassLoader 29249
+ 311374 method java/lang/System.initializeSystemClass 33814
+ 311374 method java/lang/ClassLoader.loadClass 66564
+ 311374 method java/security/AccessController.doPrivileged 67499
+
+You can see that it prints the top ten results in each of four categories.
+
+The first section reports how many times each subroutine was called, and it's
+type.
+
+The second section reports on the on-CPU time of anything that was not of type
+"method", in this case - none.
+
+The exclusive method on-CPU times shows, amongst other results, that
+java/lang/String.charAt spent around 2,200 microseconds on-CPU. This times
+excludes time spent in other subroutines.
+
+The inclusive method on-CPU times show the times that various methods
+spent on-CPU. This includes the time spent in other subroutines called.
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the subroutine began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
diff --git a/Examples/j_events_example.txt b/Examples/j_events_example.txt
new file mode 100644
index 000000000000..2c48700f3d21
--- /dev/null
+++ b/Examples/j_events_example.txt
@@ -0,0 +1,134 @@
+The following are examples of j_events.d.
+
+This counts events from all Java processes on the system with hotspot
+provider support (1.6.0). Some events such as method calls are only visible
+when using the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+Here you can see it running while the program Code/Java/Func_abc
+
+# j_events.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+ PID EVENT COUNT
+ 311379 AttachCurrentThread-entry 1
+ 311379 AttachCurrentThread-return 1
+ 311379 CallIntMethod-entry 1
+ 311379 CallIntMethod-return 1
+ 311379 CallStaticBooleanMethod-entry 1
+ 311379 CallStaticBooleanMethod-return 1
+ 311379 CallStaticObjectMethod-entry 1
+ 311379 CallStaticObjectMethod-return 1
+ 311379 CallStaticObjectMethodV-entry 1
+ 311379 CallStaticObjectMethodV-return 1
+ 311379 CallStaticVoidMethod-entry 1
+ 311379 CallStaticVoidMethod-return 1
+ 311379 CreateJavaVM-entry 1
+ 311379 CreateJavaVM-return 1
+ 311379 DestroyJavaVM-entry 1
+ 311379 DestroyJavaVM-return 1
+ 311379 DetachCurrentThread-entry 1
+ 311379 DetachCurrentThread-return 1
+ 311379 ExceptionCheck-entry 1
+ 311379 ExceptionCheck-return 1
+ 311379 ExceptionClear-entry 1
+ 311379 ExceptionClear-return 1
+ 311379 GetDefaultJavaVMInitArgs-entry 1
+ 311379 GetDefaultJavaVMInitArgs-return 1
+ 311379 GetJavaVM-entry 1
+ 311379 GetJavaVM-return 1
+ 311379 GetStringRegion-entry 1
+ 311379 GetStringRegion-return 1
+ 311379 NewByteArray-entry 1
+ 311379 NewByteArray-return 1
+ 311379 NewObject-entry 1
+ 311379 NewObject-return 1
+ 311379 NewObjectV-entry 1
+ 311379 NewObjectV-return 1
+ 311379 SetBooleanField-entry 1
+ 311379 SetBooleanField-return 1
+ 311379 ToReflectedMethod-entry 1
+ 311379 ToReflectedMethod-return 1
+ 311379 vm-init-begin 1
+ 311379 vm-init-end 1
+ 311379 vm-shutdown 1
+ 311379 NewGlobalRef-entry 2
+ 311379 NewGlobalRef-return 2
+ 311379 monitor-wait 2
+ 311379 GetStaticFieldID-entry 3
+ 311379 GetStaticFieldID-return 3
+ 311379 NewObjectArray-entry 3
+ 311379 NewObjectArray-return 3
+ 311379 SetStaticObjectField-entry 3
+ 311379 SetStaticObjectField-return 3
+ 311379 GetStaticMethodID-entry 4
+ 311379 GetStaticMethodID-return 4
+ 311379 EnsureLocalCapacity-entry 5
+ 311379 EnsureLocalCapacity-return 5
+ 311379 SetByteArrayRegion-entry 5
+ 311379 SetByteArrayRegion-return 5
+ 311379 SetLongField-entry 5
+ 311379 SetLongField-return 5
+ 311379 GetMethodID-entry 6
+ 311379 GetMethodID-return 6
+ 311379 GetObjectArrayElement-entry 6
+ 311379 GetObjectArrayElement-return 6
+ 311379 GetSuperclass-entry 6
+ 311379 GetSuperclass-return 6
+ 311379 thread-start 6
+ 311379 SetIntField-entry 8
+ 311379 SetIntField-return 8
+ 311379 GetArrayLength-entry 9
+ 311379 GetArrayLength-return 9
+ 311379 GetByteArrayRegion-entry 9
+ 311379 GetByteArrayRegion-return 9
+ 311379 RegisterNatives-entry 9
+ 311379 RegisterNatives-return 9
+ 311379 GetObjectClass-entry 10
+ 311379 GetObjectClass-return 10
+ 311379 FindClass-entry 11
+ 311379 FindClass-return 11
+ 311379 SetObjectArrayElement-entry 12
+ 311379 SetObjectArrayElement-return 12
+ 311379 GetStringUTFLength-entry 18
+ 311379 GetStringUTFLength-return 18
+ 311379 GetStringUTFRegion-entry 18
+ 311379 GetStringUTFRegion-return 18
+ 311379 GetFieldID-entry 21
+ 311379 GetFieldID-return 21
+ 309790 CallStaticVoidMethod-entry 24
+ 309790 CallStaticVoidMethod-return 24
+ 194441 CallStaticVoidMethod-entry 26
+ 194441 CallStaticVoidMethod-return 26
+ 311379 GetStringUTFChars-entry 29
+ 311379 GetStringUTFChars-return 29
+ 311379 ReleaseStringUTFChars-entry 29
+ 311379 ReleaseStringUTFChars-return 29
+ 311379 CallObjectMethod-entry 30
+ 311379 CallObjectMethod-return 30
+ 311379 GetStringCritical-entry 35
+ 311379 GetStringCritical-return 35
+ 311379 ReleaseStringCritical-entry 35
+ 311379 ReleaseStringCritical-return 35
+ 311379 ExceptionOccurred-entry 46
+ 311379 ExceptionOccurred-return 46
+ 311379 GetStringLength-entry 54
+ 311379 GetStringLength-return 54
+ 311379 NewStringUTF-entry 54
+ 311379 NewStringUTF-return 54
+ 311379 NewString-entry 55
+ 311379 NewString-return 55
+ 311379 GetObjectField-entry 60
+ 311379 GetObjectField-return 60
+ 311379 DeleteLocalRef-entry 108
+ 311379 DeleteLocalRef-return 108
+ 311379 class-loaded 327
+ 311379 object-alloc 5389
+ 311379 method-return 12024
+ 311379 method-entry 12031
+
+You can see that nearly all of the events recorded are from PID 311379, which
+we can assume in this case is the program in question. Not all of the lines
+correspond to this, however, which is something to be aware of while analysing
+the results.
diff --git a/Examples/j_flow_example.txt b/Examples/j_flow_example.txt
new file mode 100644
index 000000000000..433bef314224
--- /dev/null
+++ b/Examples/j_flow_example.txt
@@ -0,0 +1,1292 @@
+The following are examples of j_flow.d.
+
+This is a simple script to trace the not-so-simple flow of Java methods and
+classes. Here it traces the example program, Code/Java/func_abc
+
+# j_flow.d
+ C PID TIME(us) -- CLASS.METHOD
+ 0 311403 4789112583163 -> java/lang/Object.<clinit>
+ 0 311403 4789112583207 -> java/lang/Object.registerNatives
+ 0 311403 4789112583323 <- java/lang/Object.registerNatives
+ 0 311403 4789112583333 <- java/lang/Object.<clinit>
+ 0 311403 4789112583343 -> java/lang/String.<clinit>
+ 0 311403 4789112583732 -> java/lang/String$CaseInsensitiveComparator.<init>
+ 0 311403 4789112583743 -> java/lang/String$CaseInsensitiveComparator.<init>
+ 0 311403 4789112583752 -> java/lang/Object.<init>
+ 0 311403 4789112583760 <- java/lang/Object.<init>
+ 0 311403 4789112583767 <- java/lang/String$CaseInsensitiveComparator.<init>
+ 0 311403 4789112583774 <- java/lang/String$CaseInsensitiveComparator.<init>
+ 0 311403 4789112583783 <- java/lang/String.<clinit>
+ 0 311403 4789112583849 -> java/lang/System.<clinit>
+ 0 311403 4789112583859 -> java/lang/System.registerNatives
+ 0 311403 4789112583878 <- java/lang/System.registerNatives
+ 0 311403 4789112583887 -> java/lang/System.nullInputStream
+ 0 311403 4789112583895 -> java/lang/System.currentTimeMillis
+ 0 311403 4789112583905 <- java/lang/System.currentTimeMillis
+ 0 311403 4789112583913 <- java/lang/System.nullInputStream
+ 0 311403 4789112583923 -> java/lang/System.nullPrintStream
+ 0 311403 4789112583929 -> java/lang/System.currentTimeMillis
+ 0 311403 4789112583937 <- java/lang/System.currentTimeMillis
+ 0 311403 4789112583944 <- java/lang/System.nullPrintStream
+ 0 311403 4789112583951 -> java/lang/System.nullPrintStream
+ 0 311403 4789112583958 -> java/lang/System.currentTimeMillis
+ 0 311403 4789112583965 <- java/lang/System.currentTimeMillis
+ 0 311403 4789112583972 <- java/lang/System.nullPrintStream
+ 0 311403 4789112583982 <- java/lang/System.<clinit>
+ 0 311403 4789112584058 -> java/lang/ThreadGroup.<init>
+ 0 311403 4789112584068 -> java/lang/Object.<init>
+ 0 311403 4789112584075 <- java/lang/Object.<init>
+ 0 311403 4789112584100 <- java/lang/ThreadGroup.<init>
+ 0 311403 4789112584109 -> java/lang/ThreadGroup.<init>
+ 0 311403 4789112584116 -> java/lang/Object.<init>
+ 0 311403 4789112584123 <- java/lang/Object.<init>
+ 0 311403 4789112584139 -> java/lang/ThreadGroup.checkAccess
+ 0 311403 4789112584148 -> java/lang/System.getSecurityManager
+ 0 311403 4789112584157 <- java/lang/System.getSecurityManager
+ 0 311403 4789112584164 <- java/lang/ThreadGroup.checkAccess
+ 0 311403 4789112584175 -> java/lang/ThreadGroup.add
+ 0 311403 4789112584196 <- java/lang/ThreadGroup.add
+ 0 311403 4789112584202 <- java/lang/ThreadGroup.<init>
+ 0 311403 4789112584385 -> java/lang/Thread.<clinit>
+ 0 311403 4789112584396 -> java/lang/Thread.registerNatives
+ 0 311403 4789112584421 <- java/lang/Thread.registerNatives
+ 0 311403 4789112584779 -> java/lang/RuntimePermission.<init>
+ 0 311403 4789112584789 -> java/security/BasicPermission.<init>
+ 0 311403 4789112584798 -> java/security/Permission.<init>
+ 0 311403 4789112584806 -> java/lang/Object.<init>
+ 0 311403 4789112584814 <- java/lang/Object.<init>
+ 0 311403 4789112584823 <- java/security/Permission.<init>
+ 0 311403 4789112584831 -> java/security/BasicPermission.init
+ 0 311403 4789112584842 -> java/lang/String.length
+ 0 311403 4789112584850 <- java/lang/String.length
+ 0 311403 4789112584860 -> java/lang/String.charAt
+ 0 311403 4789112584869 <- java/lang/String.charAt
+ 0 311403 4789112584880 -> java/lang/String.equals
+ 0 311403 4789112584888 <- java/lang/String.equals
+ 0 311403 4789112584896 <- java/security/BasicPermission.init
+ 0 311403 4789112584903 <- java/security/BasicPermission.<init>
+ 0 311403 4789112584910 <- java/lang/RuntimePermission.<init>
+ 0 311403 4789112585319 -> sun/misc/SoftCache.<init>
+ 0 311403 4789112585329 -> java/util/AbstractMap.<init>
+ 0 311403 4789112585337 -> java/lang/Object.<init>
+ 0 311403 4789112585345 <- java/lang/Object.<init>
+ 0 311403 4789112585355 <- java/util/AbstractMap.<init>
+ 0 311403 4789112585485 -> java/lang/ref/ReferenceQueue.<clinit>
+ 0 311403 4789112585554 -> java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311403 4789112585564 -> java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311403 4789112585572 -> java/lang/ref/ReferenceQueue.<init>
+ 0 311403 4789112585581 -> java/lang/Object.<init>
+ 0 311403 4789112585589 <- java/lang/Object.<init>
+ 0 311403 4789112585646 -> java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311403 4789112585656 -> java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311403 4789112585664 -> java/lang/Object.<init>
+ 0 311403 4789112585671 <- java/lang/Object.<init>
+ 0 311403 4789112585678 <- java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311403 4789112585685 <- java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311403 4789112585696 <- java/lang/ref/ReferenceQueue.<init>
+ 0 311403 4789112585702 <- java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311403 4789112585709 <- java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311403 4789112585717 -> java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311403 4789112585723 -> java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311403 4789112585729 -> java/lang/ref/ReferenceQueue.<init>
+ 0 311403 4789112585736 -> java/lang/Object.<init>
+ 0 311403 4789112585743 <- java/lang/Object.<init>
+ 0 311403 4789112585748 -> java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311403 4789112585755 -> java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311403 4789112585761 -> java/lang/Object.<init>
+ 0 311403 4789112585768 <- java/lang/Object.<init>
+ 0 311403 4789112585796 <- java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311403 4789112585803 <- java/lang/ref/ReferenceQueue$Lock.<init>
+[... 22800 lines truncated ...]
+ 0 311403 4789112982170 <- java/lang/reflect/Method.getModifiers
+ 0 311403 4789112982182 -> Func_abc.main
+ 0 311403 4789112982193 -> Func_abc.func_a
+ 0 311403 4789112982201 -> java/lang/ClassLoader.checkPackageAccess
+ 0 311403 4789112982208 -> java/lang/System.getSecurityManager
+ 0 311403 4789112982215 <- java/lang/System.getSecurityManager
+ 0 311403 4789112982221 -> java/util/HashSet.add
+ 0 311403 4789112982228 -> java/util/HashMap.put
+ 0 311403 4789112982234 -> java/lang/Object.hashCode
+ 0 311403 4789112982241 <- java/lang/Object.hashCode
+ 0 311403 4789112982247 -> java/util/HashMap.hash
+ 0 311403 4789112982254 <- java/util/HashMap.hash
+ 0 311403 4789112982260 -> java/util/HashMap.indexFor
+ 0 311403 4789112982267 <- java/util/HashMap.indexFor
+ 0 311403 4789112982274 <- java/util/HashMap.put
+ 0 311403 4789112982280 <- java/util/HashSet.add
+ 0 311403 4789112982287 <- java/lang/ClassLoader.checkPackageAccess
+ 0 311403 4789112982349 -> java/lang/ClassLoader.loadClassInternal
+ 0 311403 4789112982356 -> java/lang/ClassLoader.loadClass
+ 0 311403 4789112982363 -> sun/misc/Launcher$AppClassLoader.loadClass
+ 0 311403 4789112982369 -> java/lang/String.lastIndexOf
+ 0 311403 4789112982376 -> java/lang/String.lastIndexOf
+ 0 311403 4789112982384 <- java/lang/String.lastIndexOf
+ 0 311403 4789112982391 <- java/lang/String.lastIndexOf
+ 0 311403 4789112982396 -> java/lang/System.getSecurityManager
+ 0 311403 4789112982404 <- java/lang/System.getSecurityManager
+ 0 311403 4789112982410 -> java/lang/ClassLoader.loadClass
+ 0 311403 4789112982416 -> java/lang/ClassLoader.findLoadedClass
+ 0 311403 4789112982422 -> java/lang/ClassLoader.check
+ 0 311403 4789112982429 <- java/lang/ClassLoader.check
+ 0 311403 4789112982435 -> java/lang/ClassLoader.checkName
+ 0 311403 4789112982442 -> java/lang/String.indexOf
+ 0 311403 4789112982448 -> java/lang/String.indexOf
+ 0 311403 4789112982456 <- java/lang/String.indexOf
+ 0 311403 4789112982462 <- java/lang/String.indexOf
+ 0 311403 4789112982468 -> sun/misc/VM.allowArraySyntax
+ 0 311403 4789112982475 <- sun/misc/VM.allowArraySyntax
+ 0 311403 4789112982481 -> java/lang/String.charAt
+ 0 311403 4789112982488 <- java/lang/String.charAt
+ 0 311403 4789112982495 <- java/lang/ClassLoader.checkName
+ 0 311403 4789112982501 -> java/lang/ClassLoader.findLoadedClass0
+ 0 311403 4789112982510 <- java/lang/ClassLoader.findLoadedClass0
+ 0 311403 4789112982517 <- java/lang/ClassLoader.findLoadedClass
+ 0 311403 4789112982524 -> java/lang/ClassLoader.loadClass
+ 0 311403 4789112982530 -> java/lang/ClassLoader.findLoadedClass
+ 0 311403 4789112982536 -> java/lang/ClassLoader.check
+ 0 311403 4789112982543 <- java/lang/ClassLoader.check
+ 0 311403 4789112982549 -> java/lang/ClassLoader.checkName
+ 0 311403 4789112982555 -> java/lang/String.indexOf
+ 0 311403 4789112982561 -> java/lang/String.indexOf
+ 0 311403 4789112982569 <- java/lang/String.indexOf
+ 0 311403 4789112982576 <- java/lang/String.indexOf
+ 0 311403 4789112982582 -> sun/misc/VM.allowArraySyntax
+ 0 311403 4789112982589 <- sun/misc/VM.allowArraySyntax
+ 0 311403 4789112982594 -> java/lang/String.charAt
+ 0 311403 4789112982602 <- java/lang/String.charAt
+ 0 311403 4789112982608 <- java/lang/ClassLoader.checkName
+ 0 311403 4789112982614 -> java/lang/ClassLoader.findLoadedClass0
+ 0 311403 4789112982623 <- java/lang/ClassLoader.findLoadedClass0
+ 0 311403 4789112982630 <- java/lang/ClassLoader.findLoadedClass
+ 0 311403 4789112982636 -> java/lang/ClassLoader.findBootstrapClass0
+ 0 311403 4789112982642 -> java/lang/ClassLoader.check
+ 0 311403 4789112982650 <- java/lang/ClassLoader.check
+ 0 311403 4789112982655 -> java/lang/ClassLoader.checkName
+ 0 311403 4789112982662 -> java/lang/String.indexOf
+ 0 311403 4789112982668 -> java/lang/String.indexOf
+ 0 311403 4789112982676 <- java/lang/String.indexOf
+ 0 311403 4789112982682 <- java/lang/String.indexOf
+ 0 311403 4789112982688 -> sun/misc/VM.allowArraySyntax
+ 0 311403 4789112982695 <- sun/misc/VM.allowArraySyntax
+ 0 311403 4789112982701 -> java/lang/String.charAt
+ 0 311403 4789112982708 <- java/lang/String.charAt
+ 0 311403 4789112982715 <- java/lang/ClassLoader.checkName
+ 0 311403 4789112982720 -> java/lang/ClassLoader.findBootstrapClass
+ 0 311403 4789112982730 <- java/lang/ClassLoader.findBootstrapClass
+ 0 311403 4789112982737 <- java/lang/ClassLoader.findBootstrapClass0
+ 0 311403 4789112982744 <- java/lang/ClassLoader.loadClass
+ 0 311403 4789112982751 <- java/lang/ClassLoader.loadClass
+ 0 311403 4789112982757 <- sun/misc/Launcher$AppClassLoader.loadClass
+ 0 311403 4789112982764 <- java/lang/ClassLoader.loadClass
+ 0 311403 4789112982771 <- java/lang/ClassLoader.loadClassInternal
+ 0 311403 4789112982780 -> java/lang/ClassLoader.checkPackageAccess
+ 0 311403 4789112982787 -> java/lang/System.getSecurityManager
+ 0 311403 4789112982794 <- java/lang/System.getSecurityManager
+ 0 311403 4789112982800 -> java/util/HashSet.add
+ 0 311403 4789112982806 -> java/util/HashMap.put
+ 0 311403 4789112982813 -> java/lang/Object.hashCode
+ 0 311403 4789112982820 <- java/lang/Object.hashCode
+ 0 311403 4789112982826 -> java/util/HashMap.hash
+ 0 311403 4789112982833 <- java/util/HashMap.hash
+ 0 311403 4789112982839 -> java/util/HashMap.indexFor
+ 0 311403 4789112982846 <- java/util/HashMap.indexFor
+ 0 311403 4789112982853 <- java/util/HashMap.put
+ 0 311403 4789112982859 <- java/util/HashSet.add
+ 0 311403 4789112982866 <- java/lang/ClassLoader.checkPackageAccess
+ 0 311403 4789112982879 -> java/io/PrintStream.println
+ 0 311403 4789112982889 -> java/io/PrintStream.print
+ 0 311403 4789112982897 -> java/io/PrintStream.write
+ 0 311403 4789112982906 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789112982916 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789112982927 -> java/io/Writer.write
+ 0 311403 4789112982939 -> java/io/BufferedWriter.write
+ 0 311403 4789112982948 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789112982956 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789112982964 -> java/io/BufferedWriter.min
+ 0 311403 4789112982971 <- java/io/BufferedWriter.min
+ 0 311403 4789112982980 -> java/lang/String.getChars
+ 0 311403 4789112982987 -> java/lang/System.arraycopy
+ 0 311403 4789112982995 <- java/lang/System.arraycopy
+ 0 311403 4789112983002 <- java/lang/String.getChars
+ 0 311403 4789112983009 <- java/io/BufferedWriter.write
+ 0 311403 4789112983016 <- java/io/Writer.write
+ 0 311403 4789112983024 -> java/io/BufferedWriter.flushBuffer
+ 0 311403 4789112983031 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789112983038 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789112983046 -> java/io/OutputStreamWriter.write
+ 0 311403 4789112983056 -> sun/nio/cs/StreamEncoder.write
+ 0 311403 4789112983066 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789112983073 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789112983082 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789112983093 -> java/nio/CharBuffer.wrap
+ 0 311403 4789112983099 -> java/nio/HeapCharBuffer.<init>
+ 0 311403 4789112983106 -> java/nio/CharBuffer.<init>
+ 0 311403 4789112983113 -> java/nio/Buffer.<init>
+ 0 311403 4789112983119 -> java/lang/Object.<init>
+ 0 311403 4789112983126 <- java/lang/Object.<init>
+ 0 311403 4789112983133 -> java/nio/Buffer.limit
+ 0 311403 4789112983140 <- java/nio/Buffer.limit
+ 0 311403 4789112983146 -> java/nio/Buffer.position
+ 0 311403 4789112983153 <- java/nio/Buffer.position
+ 0 311403 4789112983160 <- java/nio/Buffer.<init>
+ 0 311403 4789112983166 <- java/nio/CharBuffer.<init>
+ 0 311403 4789112983173 <- java/nio/HeapCharBuffer.<init>
+ 0 311403 4789112983180 <- java/nio/CharBuffer.wrap
+ 0 311403 4789112983188 -> java/nio/Buffer.hasRemaining
+ 0 311403 4789112983196 <- java/nio/Buffer.hasRemaining
+ 0 311403 4789112983206 -> java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789112983216 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789112983226 -> java/nio/CharBuffer.hasArray
+ 0 311403 4789112983233 <- java/nio/CharBuffer.hasArray
+ 0 311403 4789112983243 -> java/nio/ByteBuffer.hasArray
+ 0 311403 4789112983250 <- java/nio/ByteBuffer.hasArray
+ 0 311403 4789112983259 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789112983267 -> java/nio/CharBuffer.array
+ 0 311403 4789112983274 <- java/nio/CharBuffer.array
+ 0 311403 4789112983282 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112983289 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112983297 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112983305 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112983316 -> java/nio/ByteBuffer.array
+ 0 311403 4789112983323 <- java/nio/ByteBuffer.array
+ 0 311403 4789112983331 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112983338 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112983346 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112983354 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112983366 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112983374 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112983382 -> java/nio/Buffer.position
+ 0 311403 4789112983389 <- java/nio/Buffer.position
+ 0 311403 4789112983395 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112983402 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112983410 -> java/nio/Buffer.position
+ 0 311403 4789112983417 <- java/nio/Buffer.position
+ 0 311403 4789112983424 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789112983431 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789112983439 -> java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789112983447 <- java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789112983454 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789112983462 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789112983469 <- java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789112983477 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789112983485 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789112983494 -> java/nio/Buffer.remaining
+ 0 311403 4789112983501 <- java/nio/Buffer.remaining
+ 0 311403 4789112983508 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789112983515 <- sun/nio/cs/StreamEncoder.write
+ 0 311403 4789112983522 <- java/io/OutputStreamWriter.write
+ 0 311403 4789112983528 <- java/io/BufferedWriter.flushBuffer
+ 0 311403 4789112983537 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789112983546 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789112983555 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789112983565 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789112983574 -> java/nio/Buffer.flip
+ 0 311403 4789112983581 <- java/nio/Buffer.flip
+ 0 311403 4789112983591 -> java/nio/ByteBuffer.array
+ 0 311403 4789112983598 <- java/nio/ByteBuffer.array
+ 0 311403 4789112983606 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112983613 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112983623 -> java/io/PrintStream.write
+ 0 311403 4789112983629 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789112983636 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789112983645 -> java/io/BufferedOutputStream.write
+ 0 311403 4789112983657 -> java/lang/System.arraycopy
+ 0 311403 4789112983664 <- java/lang/System.arraycopy
+ 0 311403 4789112983671 <- java/io/BufferedOutputStream.write
+ 0 311403 4789112983679 -> java/io/BufferedOutputStream.flush
+ 0 311403 4789112983688 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789112983698 -> java/io/FileOutputStream.write
+ 0 311403 4789112983707 -> java/io/FileOutputStream.writeBytes
+ 0 311403 4789112983860 <- java/io/FileOutputStream.writeBytes
+ 0 311403 4789112983868 <- java/io/FileOutputStream.write
+ 0 311403 4789112983874 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789112983885 <- java/io/BufferedOutputStream.flush
+ 0 311403 4789112983892 <- java/io/PrintStream.write
+ 0 311403 4789112983901 -> java/nio/Buffer.clear
+ 0 311403 4789112983909 <- java/nio/Buffer.clear
+ 0 311403 4789112983915 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789112983922 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789112983929 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789112983936 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789112983946 -> java/lang/String.indexOf
+ 0 311403 4789112983952 -> java/lang/String.indexOf
+ 0 311403 4789112983961 <- java/lang/String.indexOf
+ 0 311403 4789112983967 <- java/lang/String.indexOf
+ 0 311403 4789112983974 <- java/io/PrintStream.write
+ 0 311403 4789112983981 <- java/io/PrintStream.print
+ 0 311403 4789112983989 -> java/io/PrintStream.newLine
+ 0 311403 4789112983995 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789112984002 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789112984010 -> java/io/BufferedWriter.newLine
+ 0 311403 4789112984019 -> java/io/Writer.write
+ 0 311403 4789112984025 -> java/io/BufferedWriter.write
+ 0 311403 4789112984031 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789112984039 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789112984045 -> java/io/BufferedWriter.min
+ 0 311403 4789112984052 <- java/io/BufferedWriter.min
+ 0 311403 4789112984058 -> java/lang/String.getChars
+ 0 311403 4789112984064 -> java/lang/System.arraycopy
+ 0 311403 4789112984072 <- java/lang/System.arraycopy
+ 0 311403 4789112984078 <- java/lang/String.getChars
+ 0 311403 4789112984085 <- java/io/BufferedWriter.write
+ 0 311403 4789112984092 <- java/io/Writer.write
+ 0 311403 4789112984099 <- java/io/BufferedWriter.newLine
+ 0 311403 4789112984104 -> java/io/BufferedWriter.flushBuffer
+ 0 311403 4789112984111 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789112984118 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789112984124 -> java/io/OutputStreamWriter.write
+ 0 311403 4789112984130 -> sun/nio/cs/StreamEncoder.write
+ 0 311403 4789112984137 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789112984144 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789112984150 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789112984156 -> java/nio/CharBuffer.wrap
+ 0 311403 4789112984163 -> java/nio/HeapCharBuffer.<init>
+ 0 311403 4789112984169 -> java/nio/CharBuffer.<init>
+ 0 311403 4789112984175 -> java/nio/Buffer.<init>
+ 0 311403 4789112984181 -> java/lang/Object.<init>
+ 0 311403 4789112984189 <- java/lang/Object.<init>
+ 0 311403 4789112984194 -> java/nio/Buffer.limit
+ 0 311403 4789112984202 <- java/nio/Buffer.limit
+ 0 311403 4789112984207 -> java/nio/Buffer.position
+ 0 311403 4789112984214 <- java/nio/Buffer.position
+ 0 311403 4789112984221 <- java/nio/Buffer.<init>
+ 0 311403 4789112984228 <- java/nio/CharBuffer.<init>
+ 0 311403 4789112984234 <- java/nio/HeapCharBuffer.<init>
+ 0 311403 4789112984241 <- java/nio/CharBuffer.wrap
+ 0 311403 4789112984247 -> java/nio/Buffer.hasRemaining
+ 0 311403 4789112984254 <- java/nio/Buffer.hasRemaining
+ 0 311403 4789112984260 -> java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789112984266 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789112984273 -> java/nio/CharBuffer.hasArray
+ 0 311403 4789112984280 <- java/nio/CharBuffer.hasArray
+ 0 311403 4789112984286 -> java/nio/ByteBuffer.hasArray
+ 0 311403 4789112984293 <- java/nio/ByteBuffer.hasArray
+ 0 311403 4789112984299 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789112984305 -> java/nio/CharBuffer.array
+ 0 311403 4789112984312 <- java/nio/CharBuffer.array
+ 0 311403 4789112984318 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112984325 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112984331 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112984338 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112984344 -> java/nio/ByteBuffer.array
+ 0 311403 4789112984352 <- java/nio/ByteBuffer.array
+ 0 311403 4789112984358 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112984365 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112984371 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112984378 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112984384 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112984391 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789112984397 -> java/nio/Buffer.position
+ 0 311403 4789112984404 <- java/nio/Buffer.position
+ 0 311403 4789112984410 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112984417 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112984423 -> java/nio/Buffer.position
+ 0 311403 4789112984430 <- java/nio/Buffer.position
+ 0 311403 4789112984437 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789112984444 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789112984450 -> java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789112984457 <- java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789112984463 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789112984470 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789112984477 <- java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789112984483 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789112984491 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789112984497 -> java/nio/Buffer.remaining
+ 0 311403 4789112984504 <- java/nio/Buffer.remaining
+ 0 311403 4789112984510 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789112984517 <- sun/nio/cs/StreamEncoder.write
+ 0 311403 4789112984524 <- java/io/OutputStreamWriter.write
+ 0 311403 4789112984531 <- java/io/BufferedWriter.flushBuffer
+ 0 311403 4789112984536 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789112984543 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789112984549 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789112984556 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789112984562 -> java/nio/Buffer.flip
+ 0 311403 4789112984569 <- java/nio/Buffer.flip
+ 0 311403 4789112984575 -> java/nio/ByteBuffer.array
+ 0 311403 4789112984582 <- java/nio/ByteBuffer.array
+ 0 311403 4789112984588 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112984595 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789112984601 -> java/io/PrintStream.write
+ 0 311403 4789112984607 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789112984615 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789112984621 -> java/io/BufferedOutputStream.write
+ 0 311403 4789112984627 -> java/lang/System.arraycopy
+ 0 311403 4789112984635 <- java/lang/System.arraycopy
+ 0 311403 4789112984641 <- java/io/BufferedOutputStream.write
+ 0 311403 4789112984647 -> java/io/BufferedOutputStream.flush
+ 0 311403 4789112984654 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789112984660 -> java/io/FileOutputStream.write
+ 0 311403 4789112984666 -> java/io/FileOutputStream.writeBytes
+ 0 311403 4789112984712 <- java/io/FileOutputStream.writeBytes
+ 0 311403 4789112984719 <- java/io/FileOutputStream.write
+ 0 311403 4789112984726 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789112984733 <- java/io/BufferedOutputStream.flush
+ 0 311403 4789112984740 <- java/io/PrintStream.write
+ 0 311403 4789112984746 -> java/nio/Buffer.clear
+ 0 311403 4789112984753 <- java/nio/Buffer.clear
+ 0 311403 4789112984760 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789112984766 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789112984773 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789112984780 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789112984786 -> java/io/BufferedOutputStream.flush
+ 0 311403 4789112984792 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789112984800 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789112984807 <- java/io/BufferedOutputStream.flush
+ 0 311403 4789112984813 <- java/io/PrintStream.newLine
+ 0 311403 4789112984820 <- java/io/PrintStream.println
+ 0 311403 4789112984835 -> java/lang/ClassLoader.loadClassInternal
+ 0 311403 4789112984842 -> java/lang/ClassLoader.loadClass
+ 0 311403 4789112984849 -> sun/misc/Launcher$AppClassLoader.loadClass
+ 0 311403 4789112984855 -> java/lang/String.lastIndexOf
+ 0 311403 4789112984862 -> java/lang/String.lastIndexOf
+ 0 311403 4789112984870 <- java/lang/String.lastIndexOf
+ 0 311403 4789112984877 <- java/lang/String.lastIndexOf
+ 0 311403 4789112984882 -> java/lang/System.getSecurityManager
+ 0 311403 4789112984890 <- java/lang/System.getSecurityManager
+ 0 311403 4789112984896 -> java/lang/ClassLoader.loadClass
+ 0 311403 4789112984902 -> java/lang/ClassLoader.findLoadedClass
+ 0 311403 4789112984908 -> java/lang/ClassLoader.check
+ 0 311403 4789112984915 <- java/lang/ClassLoader.check
+ 0 311403 4789112984921 -> java/lang/ClassLoader.checkName
+ 0 311403 4789112984927 -> java/lang/String.indexOf
+ 0 311403 4789112984934 -> java/lang/String.indexOf
+ 0 311403 4789112984942 <- java/lang/String.indexOf
+ 0 311403 4789112984948 <- java/lang/String.indexOf
+ 0 311403 4789112984954 -> sun/misc/VM.allowArraySyntax
+ 0 311403 4789112984961 <- sun/misc/VM.allowArraySyntax
+ 0 311403 4789112984967 -> java/lang/String.charAt
+ 0 311403 4789112984974 <- java/lang/String.charAt
+ 0 311403 4789112984981 <- java/lang/ClassLoader.checkName
+ 0 311403 4789112984987 -> java/lang/ClassLoader.findLoadedClass0
+ 0 311403 4789112984998 <- java/lang/ClassLoader.findLoadedClass0
+ 0 311403 4789112985005 <- java/lang/ClassLoader.findLoadedClass
+ 0 311403 4789112985011 -> java/lang/ClassLoader.loadClass
+ 0 311403 4789112985018 -> java/lang/ClassLoader.findLoadedClass
+ 0 311403 4789112985024 -> java/lang/ClassLoader.check
+ 0 311403 4789112985031 <- java/lang/ClassLoader.check
+ 0 311403 4789112985037 -> java/lang/ClassLoader.checkName
+ 0 311403 4789112985043 -> java/lang/String.indexOf
+ 0 311403 4789112985049 -> java/lang/String.indexOf
+ 0 311403 4789112985057 <- java/lang/String.indexOf
+ 0 311403 4789112985064 <- java/lang/String.indexOf
+ 0 311403 4789112985070 -> sun/misc/VM.allowArraySyntax
+ 0 311403 4789112985077 <- sun/misc/VM.allowArraySyntax
+ 0 311403 4789112985083 -> java/lang/String.charAt
+ 0 311403 4789112985090 <- java/lang/String.charAt
+ 0 311403 4789112985096 <- java/lang/ClassLoader.checkName
+ 0 311403 4789112985102 -> java/lang/ClassLoader.findLoadedClass0
+ 0 311403 4789112985111 <- java/lang/ClassLoader.findLoadedClass0
+ 0 311403 4789112985118 <- java/lang/ClassLoader.findLoadedClass
+ 0 311403 4789112985124 -> java/lang/ClassLoader.findBootstrapClass0
+ 0 311403 4789112985130 -> java/lang/ClassLoader.check
+ 0 311403 4789112985138 <- java/lang/ClassLoader.check
+ 0 311403 4789112985143 -> java/lang/ClassLoader.checkName
+ 0 311403 4789112985150 -> java/lang/String.indexOf
+ 0 311403 4789112985156 -> java/lang/String.indexOf
+ 0 311403 4789112985164 <- java/lang/String.indexOf
+ 0 311403 4789112985170 <- java/lang/String.indexOf
+ 0 311403 4789112985176 -> sun/misc/VM.allowArraySyntax
+ 0 311403 4789112985183 <- sun/misc/VM.allowArraySyntax
+ 0 311403 4789112985189 -> java/lang/String.charAt
+ 0 311403 4789112985196 <- java/lang/String.charAt
+ 0 311403 4789112985203 <- java/lang/ClassLoader.checkName
+ 0 311403 4789112985208 -> java/lang/ClassLoader.findBootstrapClass
+ 0 311403 4789112985219 <- java/lang/ClassLoader.findBootstrapClass
+ 0 311403 4789112985226 <- java/lang/ClassLoader.findBootstrapClass0
+ 0 311403 4789112985233 <- java/lang/ClassLoader.loadClass
+ 0 311403 4789112985240 <- java/lang/ClassLoader.loadClass
+ 0 311403 4789112985247 <- sun/misc/Launcher$AppClassLoader.loadClass
+ 0 311403 4789112985253 <- java/lang/ClassLoader.loadClass
+ 0 311403 4789112985260 <- java/lang/ClassLoader.loadClassInternal
+ 0 311403 4789112985270 -> java/lang/ClassLoader.checkPackageAccess
+ 0 311403 4789112985277 -> java/lang/System.getSecurityManager
+ 0 311403 4789112985285 <- java/lang/System.getSecurityManager
+ 0 311403 4789112985291 -> java/util/HashSet.add
+ 0 311403 4789112985297 -> java/util/HashMap.put
+ 0 311403 4789112985304 -> java/lang/Object.hashCode
+ 0 311403 4789112985311 <- java/lang/Object.hashCode
+ 0 311403 4789112985317 -> java/util/HashMap.hash
+ 0 311403 4789112985324 <- java/util/HashMap.hash
+ 0 311403 4789112985330 -> java/util/HashMap.indexFor
+ 0 311403 4789112985337 <- java/util/HashMap.indexFor
+ 0 311403 4789112985344 <- java/util/HashMap.put
+ 0 311403 4789112985351 <- java/util/HashSet.add
+ 0 311403 4789112985358 <- java/lang/ClassLoader.checkPackageAccess
+ 0 311403 4789112985371 -> java/lang/Thread.currentThread
+ 0 311403 4789112985379 <- java/lang/Thread.currentThread
+ 0 311403 4789112985387 -> java/lang/Thread.sleep
+ 0 311403 4789113990048 <- java/lang/Thread.sleep
+ 0 311403 4789113990080 -> Func_abc.func_b
+ 0 311403 4789113990104 -> java/io/PrintStream.println
+ 0 311403 4789113990112 -> java/io/PrintStream.print
+ 0 311403 4789113990118 -> java/io/PrintStream.write
+ 0 311403 4789113990125 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789113990133 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789113990139 -> java/io/Writer.write
+ 0 311403 4789113990147 -> java/io/BufferedWriter.write
+ 0 311403 4789113990154 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789113990161 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789113990168 -> java/io/BufferedWriter.min
+ 0 311403 4789113990176 <- java/io/BufferedWriter.min
+ 0 311403 4789113990182 -> java/lang/String.getChars
+ 0 311403 4789113990189 -> java/lang/System.arraycopy
+ 0 311403 4789113990198 <- java/lang/System.arraycopy
+ 0 311403 4789113990205 <- java/lang/String.getChars
+ 0 311403 4789113990212 <- java/io/BufferedWriter.write
+ 0 311403 4789113990219 <- java/io/Writer.write
+ 0 311403 4789113990225 -> java/io/BufferedWriter.flushBuffer
+ 0 311403 4789113990231 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789113990238 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789113990245 -> java/io/OutputStreamWriter.write
+ 0 311403 4789113990252 -> sun/nio/cs/StreamEncoder.write
+ 0 311403 4789113990258 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789113990265 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789113990272 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789113990279 -> java/nio/CharBuffer.wrap
+ 0 311403 4789113990286 -> java/nio/HeapCharBuffer.<init>
+ 0 311403 4789113990293 -> java/nio/CharBuffer.<init>
+ 0 311403 4789113990299 -> java/nio/Buffer.<init>
+ 0 311403 4789113990306 -> java/lang/Object.<init>
+ 0 311403 4789113990313 <- java/lang/Object.<init>
+ 0 311403 4789113990320 -> java/nio/Buffer.limit
+ 0 311403 4789113990327 <- java/nio/Buffer.limit
+ 0 311403 4789113990333 -> java/nio/Buffer.position
+ 0 311403 4789113990340 <- java/nio/Buffer.position
+ 0 311403 4789113990347 <- java/nio/Buffer.<init>
+ 0 311403 4789113990354 <- java/nio/CharBuffer.<init>
+ 0 311403 4789113990360 <- java/nio/HeapCharBuffer.<init>
+ 0 311403 4789113990367 <- java/nio/CharBuffer.wrap
+ 0 311403 4789113990373 -> java/nio/Buffer.hasRemaining
+ 0 311403 4789113990381 <- java/nio/Buffer.hasRemaining
+ 0 311403 4789113990387 -> java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789113990394 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789113990401 -> java/nio/CharBuffer.hasArray
+ 0 311403 4789113990409 <- java/nio/CharBuffer.hasArray
+ 0 311403 4789113990415 -> java/nio/ByteBuffer.hasArray
+ 0 311403 4789113990422 <- java/nio/ByteBuffer.hasArray
+ 0 311403 4789113990428 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789113990435 -> java/nio/CharBuffer.array
+ 0 311403 4789113990442 <- java/nio/CharBuffer.array
+ 0 311403 4789113990448 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113990455 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113990461 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113990468 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113990475 -> java/nio/ByteBuffer.array
+ 0 311403 4789113990482 <- java/nio/ByteBuffer.array
+ 0 311403 4789113990488 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113990495 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113990501 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113990508 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113990517 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113990524 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113990529 -> java/nio/Buffer.position
+ 0 311403 4789113990537 <- java/nio/Buffer.position
+ 0 311403 4789113990542 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113990550 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113990555 -> java/nio/Buffer.position
+ 0 311403 4789113990563 <- java/nio/Buffer.position
+ 0 311403 4789113990569 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789113990576 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789113990583 -> java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789113990590 <- java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789113990596 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789113990603 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789113990610 <- java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789113990616 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789113990624 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789113990630 -> java/nio/Buffer.remaining
+ 0 311403 4789113990637 <- java/nio/Buffer.remaining
+ 0 311403 4789113990643 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789113990650 <- sun/nio/cs/StreamEncoder.write
+ 0 311403 4789113990657 <- java/io/OutputStreamWriter.write
+ 0 311403 4789113990664 <- java/io/BufferedWriter.flushBuffer
+ 0 311403 4789113990670 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789113990677 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789113990683 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789113990690 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789113990697 -> java/nio/Buffer.flip
+ 0 311403 4789113990704 <- java/nio/Buffer.flip
+ 0 311403 4789113990710 -> java/nio/ByteBuffer.array
+ 0 311403 4789113990717 <- java/nio/ByteBuffer.array
+ 0 311403 4789113990723 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113990730 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113990736 -> java/io/PrintStream.write
+ 0 311403 4789113990742 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789113990749 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789113990756 -> java/io/BufferedOutputStream.write
+ 0 311403 4789113990763 -> java/lang/System.arraycopy
+ 0 311403 4789113990770 <- java/lang/System.arraycopy
+ 0 311403 4789113990777 <- java/io/BufferedOutputStream.write
+ 0 311403 4789113990783 -> java/io/BufferedOutputStream.flush
+ 0 311403 4789113990790 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789113990797 -> java/io/FileOutputStream.write
+ 0 311403 4789113990803 -> java/io/FileOutputStream.writeBytes
+ 0 311403 4789113990841 <- java/io/FileOutputStream.writeBytes
+ 0 311403 4789113990848 <- java/io/FileOutputStream.write
+ 0 311403 4789113990855 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789113990862 <- java/io/BufferedOutputStream.flush
+ 0 311403 4789113990869 <- java/io/PrintStream.write
+ 0 311403 4789113990875 -> java/nio/Buffer.clear
+ 0 311403 4789113990882 <- java/nio/Buffer.clear
+ 0 311403 4789113990888 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789113990895 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789113990902 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789113990909 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789113990915 -> java/lang/String.indexOf
+ 0 311403 4789113990922 -> java/lang/String.indexOf
+ 0 311403 4789113990930 <- java/lang/String.indexOf
+ 0 311403 4789113990936 <- java/lang/String.indexOf
+ 0 311403 4789113990943 <- java/io/PrintStream.write
+ 0 311403 4789113990950 <- java/io/PrintStream.print
+ 0 311403 4789113990956 -> java/io/PrintStream.newLine
+ 0 311403 4789113990962 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789113990969 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789113990975 -> java/io/BufferedWriter.newLine
+ 0 311403 4789113990981 -> java/io/Writer.write
+ 0 311403 4789113990988 -> java/io/BufferedWriter.write
+ 0 311403 4789113990994 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789113991001 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789113991007 -> java/io/BufferedWriter.min
+ 0 311403 4789113991014 <- java/io/BufferedWriter.min
+ 0 311403 4789113991020 -> java/lang/String.getChars
+ 0 311403 4789113991026 -> java/lang/System.arraycopy
+ 0 311403 4789113991034 <- java/lang/System.arraycopy
+ 0 311403 4789113991040 <- java/lang/String.getChars
+ 0 311403 4789113991047 <- java/io/BufferedWriter.write
+ 0 311403 4789113991054 <- java/io/Writer.write
+ 0 311403 4789113991060 <- java/io/BufferedWriter.newLine
+ 0 311403 4789113991066 -> java/io/BufferedWriter.flushBuffer
+ 0 311403 4789113991072 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789113991080 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789113991086 -> java/io/OutputStreamWriter.write
+ 0 311403 4789113991092 -> sun/nio/cs/StreamEncoder.write
+ 0 311403 4789113991098 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789113991106 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789113991112 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789113991118 -> java/nio/CharBuffer.wrap
+ 0 311403 4789113991124 -> java/nio/HeapCharBuffer.<init>
+ 0 311403 4789113991131 -> java/nio/CharBuffer.<init>
+ 0 311403 4789113991137 -> java/nio/Buffer.<init>
+ 0 311403 4789113991143 -> java/lang/Object.<init>
+ 0 311403 4789113991150 <- java/lang/Object.<init>
+ 0 311403 4789113991156 -> java/nio/Buffer.limit
+ 0 311403 4789113991163 <- java/nio/Buffer.limit
+ 0 311403 4789113991169 -> java/nio/Buffer.position
+ 0 311403 4789113991176 <- java/nio/Buffer.position
+ 0 311403 4789113991182 <- java/nio/Buffer.<init>
+ 0 311403 4789113991189 <- java/nio/CharBuffer.<init>
+ 0 311403 4789113991196 <- java/nio/HeapCharBuffer.<init>
+ 0 311403 4789113991202 <- java/nio/CharBuffer.wrap
+ 0 311403 4789113991208 -> java/nio/Buffer.hasRemaining
+ 0 311403 4789113991215 <- java/nio/Buffer.hasRemaining
+ 0 311403 4789113991221 -> java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789113991281 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789113991287 -> java/nio/CharBuffer.hasArray
+ 0 311403 4789113991295 <- java/nio/CharBuffer.hasArray
+ 0 311403 4789113991301 -> java/nio/ByteBuffer.hasArray
+ 0 311403 4789113991308 <- java/nio/ByteBuffer.hasArray
+ 0 311403 4789113991314 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789113991320 -> java/nio/CharBuffer.array
+ 0 311403 4789113991328 <- java/nio/CharBuffer.array
+ 0 311403 4789113991333 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113991341 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113991347 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113991354 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113991360 -> java/nio/ByteBuffer.array
+ 0 311403 4789113991367 <- java/nio/ByteBuffer.array
+ 0 311403 4789113991373 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113991380 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113991386 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113991393 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113991400 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113991407 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789113991413 -> java/nio/Buffer.position
+ 0 311403 4789113991420 <- java/nio/Buffer.position
+ 0 311403 4789113991426 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113991433 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113991439 -> java/nio/Buffer.position
+ 0 311403 4789113991446 <- java/nio/Buffer.position
+ 0 311403 4789113991453 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789113991459 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789113991465 -> java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789113991473 <- java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789113991479 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789113991486 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789113991493 <- java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789113991499 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789113991506 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789113991512 -> java/nio/Buffer.remaining
+ 0 311403 4789113991519 <- java/nio/Buffer.remaining
+ 0 311403 4789113991526 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789113991533 <- sun/nio/cs/StreamEncoder.write
+ 0 311403 4789113991539 <- java/io/OutputStreamWriter.write
+ 0 311403 4789113991546 <- java/io/BufferedWriter.flushBuffer
+ 0 311403 4789113991552 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789113991559 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789113991565 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789113991572 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789113991578 -> java/nio/Buffer.flip
+ 0 311403 4789113991585 <- java/nio/Buffer.flip
+ 0 311403 4789113991591 -> java/nio/ByteBuffer.array
+ 0 311403 4789113991598 <- java/nio/ByteBuffer.array
+ 0 311403 4789113991604 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113991611 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789113991617 -> java/io/PrintStream.write
+ 0 311403 4789113991623 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789113991630 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789113991636 -> java/io/BufferedOutputStream.write
+ 0 311403 4789113991643 -> java/lang/System.arraycopy
+ 0 311403 4789113991651 <- java/lang/System.arraycopy
+ 0 311403 4789113991657 <- java/io/BufferedOutputStream.write
+ 0 311403 4789113991663 -> java/io/BufferedOutputStream.flush
+ 0 311403 4789113991670 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789113991676 -> java/io/FileOutputStream.write
+ 0 311403 4789113991682 -> java/io/FileOutputStream.writeBytes
+ 0 311403 4789113991701 <- java/io/FileOutputStream.writeBytes
+ 0 311403 4789113991708 <- java/io/FileOutputStream.write
+ 0 311403 4789113991720 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789113991728 <- java/io/BufferedOutputStream.flush
+ 0 311403 4789113991734 <- java/io/PrintStream.write
+ 0 311403 4789113991740 -> java/nio/Buffer.clear
+ 0 311403 4789113991747 <- java/nio/Buffer.clear
+ 0 311403 4789113991754 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789113991761 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789113991768 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789113991774 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789113991780 -> java/io/BufferedOutputStream.flush
+ 0 311403 4789113991787 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789113991794 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789113991801 <- java/io/BufferedOutputStream.flush
+ 0 311403 4789113991808 <- java/io/PrintStream.newLine
+ 0 311403 4789113991815 <- java/io/PrintStream.println
+ 0 311403 4789113991821 -> java/lang/Thread.currentThread
+ 0 311403 4789113991828 <- java/lang/Thread.currentThread
+ 0 311403 4789113991834 -> java/lang/Thread.sleep
+ 0 311403 4789115000050 <- java/lang/Thread.sleep
+ 0 311403 4789115000081 -> Func_abc.func_c
+ 0 311403 4789115000105 -> java/io/PrintStream.println
+ 0 311403 4789115000113 -> java/io/PrintStream.print
+ 0 311403 4789115000120 -> java/io/PrintStream.write
+ 0 311403 4789115000126 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789115000134 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789115000141 -> java/io/Writer.write
+ 0 311403 4789115000148 -> java/io/BufferedWriter.write
+ 0 311403 4789115000155 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789115000162 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789115000170 -> java/io/BufferedWriter.min
+ 0 311403 4789115000177 <- java/io/BufferedWriter.min
+ 0 311403 4789115000183 -> java/lang/String.getChars
+ 0 311403 4789115000191 -> java/lang/System.arraycopy
+ 0 311403 4789115000199 <- java/lang/System.arraycopy
+ 0 311403 4789115000206 <- java/lang/String.getChars
+ 0 311403 4789115000213 <- java/io/BufferedWriter.write
+ 0 311403 4789115000220 <- java/io/Writer.write
+ 0 311403 4789115000226 -> java/io/BufferedWriter.flushBuffer
+ 0 311403 4789115000233 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789115000240 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789115000246 -> java/io/OutputStreamWriter.write
+ 0 311403 4789115000253 -> sun/nio/cs/StreamEncoder.write
+ 0 311403 4789115000260 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789115000267 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789115000274 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789115000281 -> java/nio/CharBuffer.wrap
+ 0 311403 4789115000288 -> java/nio/HeapCharBuffer.<init>
+ 0 311403 4789115000294 -> java/nio/CharBuffer.<init>
+ 0 311403 4789115000301 -> java/nio/Buffer.<init>
+ 0 311403 4789115000307 -> java/lang/Object.<init>
+ 0 311403 4789115000315 <- java/lang/Object.<init>
+ 0 311403 4789115000321 -> java/nio/Buffer.limit
+ 0 311403 4789115000328 <- java/nio/Buffer.limit
+ 0 311403 4789115000334 -> java/nio/Buffer.position
+ 0 311403 4789115000342 <- java/nio/Buffer.position
+ 0 311403 4789115000348 <- java/nio/Buffer.<init>
+ 0 311403 4789115000355 <- java/nio/CharBuffer.<init>
+ 0 311403 4789115000362 <- java/nio/HeapCharBuffer.<init>
+ 0 311403 4789115000368 <- java/nio/CharBuffer.wrap
+ 0 311403 4789115000374 -> java/nio/Buffer.hasRemaining
+ 0 311403 4789115000382 <- java/nio/Buffer.hasRemaining
+ 0 311403 4789115000388 -> java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789115000396 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789115000402 -> java/nio/CharBuffer.hasArray
+ 0 311403 4789115000410 <- java/nio/CharBuffer.hasArray
+ 0 311403 4789115000416 -> java/nio/ByteBuffer.hasArray
+ 0 311403 4789115000424 <- java/nio/ByteBuffer.hasArray
+ 0 311403 4789115000430 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789115000436 -> java/nio/CharBuffer.array
+ 0 311403 4789115000444 <- java/nio/CharBuffer.array
+ 0 311403 4789115000450 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115000457 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115000463 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115000470 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115000476 -> java/nio/ByteBuffer.array
+ 0 311403 4789115000483 <- java/nio/ByteBuffer.array
+ 0 311403 4789115000489 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115000496 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115000502 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115000509 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115000518 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115000525 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115000531 -> java/nio/Buffer.position
+ 0 311403 4789115000538 <- java/nio/Buffer.position
+ 0 311403 4789115000544 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115000551 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115000557 -> java/nio/Buffer.position
+ 0 311403 4789115000564 <- java/nio/Buffer.position
+ 0 311403 4789115000570 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789115000577 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789115000584 -> java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789115000591 <- java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789115000597 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789115000605 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789115000611 <- java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789115000617 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789115000625 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789115000631 -> java/nio/Buffer.remaining
+ 0 311403 4789115000638 <- java/nio/Buffer.remaining
+ 0 311403 4789115000645 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789115000652 <- sun/nio/cs/StreamEncoder.write
+ 0 311403 4789115000658 <- java/io/OutputStreamWriter.write
+ 0 311403 4789115000665 <- java/io/BufferedWriter.flushBuffer
+ 0 311403 4789115000671 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789115000678 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789115000685 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789115000692 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789115000698 -> java/nio/Buffer.flip
+ 0 311403 4789115000705 <- java/nio/Buffer.flip
+ 0 311403 4789115000711 -> java/nio/ByteBuffer.array
+ 0 311403 4789115000718 <- java/nio/ByteBuffer.array
+ 0 311403 4789115000724 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115000731 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115000738 -> java/io/PrintStream.write
+ 0 311403 4789115000744 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789115000751 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789115000758 -> java/io/BufferedOutputStream.write
+ 0 311403 4789115000764 -> java/lang/System.arraycopy
+ 0 311403 4789115000772 <- java/lang/System.arraycopy
+ 0 311403 4789115000778 <- java/io/BufferedOutputStream.write
+ 0 311403 4789115000785 -> java/io/BufferedOutputStream.flush
+ 0 311403 4789115000791 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789115000798 -> java/io/FileOutputStream.write
+ 0 311403 4789115000805 -> java/io/FileOutputStream.writeBytes
+ 0 311403 4789115000843 <- java/io/FileOutputStream.writeBytes
+ 0 311403 4789115000850 <- java/io/FileOutputStream.write
+ 0 311403 4789115000857 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789115000864 <- java/io/BufferedOutputStream.flush
+ 0 311403 4789115000871 <- java/io/PrintStream.write
+ 0 311403 4789115000877 -> java/nio/Buffer.clear
+ 0 311403 4789115000884 <- java/nio/Buffer.clear
+ 0 311403 4789115000891 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789115000897 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789115000904 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789115000911 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789115000917 -> java/lang/String.indexOf
+ 0 311403 4789115000924 -> java/lang/String.indexOf
+ 0 311403 4789115000932 <- java/lang/String.indexOf
+ 0 311403 4789115000939 <- java/lang/String.indexOf
+ 0 311403 4789115000945 <- java/io/PrintStream.write
+ 0 311403 4789115000952 <- java/io/PrintStream.print
+ 0 311403 4789115000958 -> java/io/PrintStream.newLine
+ 0 311403 4789115000964 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789115000971 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789115000977 -> java/io/BufferedWriter.newLine
+ 0 311403 4789115000983 -> java/io/Writer.write
+ 0 311403 4789115000990 -> java/io/BufferedWriter.write
+ 0 311403 4789115000996 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789115001003 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789115001009 -> java/io/BufferedWriter.min
+ 0 311403 4789115001016 <- java/io/BufferedWriter.min
+ 0 311403 4789115001022 -> java/lang/String.getChars
+ 0 311403 4789115001029 -> java/lang/System.arraycopy
+ 0 311403 4789115001036 <- java/lang/System.arraycopy
+ 0 311403 4789115001042 <- java/lang/String.getChars
+ 0 311403 4789115001049 <- java/io/BufferedWriter.write
+ 0 311403 4789115001056 <- java/io/Writer.write
+ 0 311403 4789115001062 <- java/io/BufferedWriter.newLine
+ 0 311403 4789115001068 -> java/io/BufferedWriter.flushBuffer
+ 0 311403 4789115001075 -> java/io/BufferedWriter.ensureOpen
+ 0 311403 4789115001082 <- java/io/BufferedWriter.ensureOpen
+ 0 311403 4789115001088 -> java/io/OutputStreamWriter.write
+ 0 311403 4789115001094 -> sun/nio/cs/StreamEncoder.write
+ 0 311403 4789115001101 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789115001108 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311403 4789115001114 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789115001120 -> java/nio/CharBuffer.wrap
+ 0 311403 4789115001127 -> java/nio/HeapCharBuffer.<init>
+ 0 311403 4789115001133 -> java/nio/CharBuffer.<init>
+ 0 311403 4789115001139 -> java/nio/Buffer.<init>
+ 0 311403 4789115001145 -> java/lang/Object.<init>
+ 0 311403 4789115001152 <- java/lang/Object.<init>
+ 0 311403 4789115001158 -> java/nio/Buffer.limit
+ 0 311403 4789115001165 <- java/nio/Buffer.limit
+ 0 311403 4789115001171 -> java/nio/Buffer.position
+ 0 311403 4789115001178 <- java/nio/Buffer.position
+ 0 311403 4789115001185 <- java/nio/Buffer.<init>
+ 0 311403 4789115001191 <- java/nio/CharBuffer.<init>
+ 0 311403 4789115001198 <- java/nio/HeapCharBuffer.<init>
+ 0 311403 4789115001204 <- java/nio/CharBuffer.wrap
+ 0 311403 4789115001210 -> java/nio/Buffer.hasRemaining
+ 0 311403 4789115001217 <- java/nio/Buffer.hasRemaining
+ 0 311403 4789115001223 -> java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789115001230 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789115001236 -> java/nio/CharBuffer.hasArray
+ 0 311403 4789115001243 <- java/nio/CharBuffer.hasArray
+ 0 311403 4789115001249 -> java/nio/ByteBuffer.hasArray
+ 0 311403 4789115001256 <- java/nio/ByteBuffer.hasArray
+ 0 311403 4789115001262 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789115001269 -> java/nio/CharBuffer.array
+ 0 311403 4789115001276 <- java/nio/CharBuffer.array
+ 0 311403 4789115001281 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115001288 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115001294 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115001302 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115001308 -> java/nio/ByteBuffer.array
+ 0 311403 4789115001315 <- java/nio/ByteBuffer.array
+ 0 311403 4789115001320 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115001328 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115001334 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115001341 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115001347 -> java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115001354 <- java/nio/CharBuffer.arrayOffset
+ 0 311403 4789115001360 -> java/nio/Buffer.position
+ 0 311403 4789115001367 <- java/nio/Buffer.position
+ 0 311403 4789115001373 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115001380 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115001386 -> java/nio/Buffer.position
+ 0 311403 4789115001393 <- java/nio/Buffer.position
+ 0 311403 4789115001400 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311403 4789115001407 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311403 4789115001413 -> java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789115001420 <- java/nio/charset/CoderResult.isOverflow
+ 0 311403 4789115001426 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789115001433 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789115001440 <- java/nio/charset/CharsetEncoder.encode
+ 0 311403 4789115001446 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789115001453 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311403 4789115001459 -> java/nio/Buffer.remaining
+ 0 311403 4789115001466 <- java/nio/Buffer.remaining
+ 0 311403 4789115001473 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311403 4789115001480 <- sun/nio/cs/StreamEncoder.write
+ 0 311403 4789115001487 <- java/io/OutputStreamWriter.write
+ 0 311403 4789115001493 <- java/io/BufferedWriter.flushBuffer
+ 0 311403 4789115001499 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789115001506 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789115001512 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789115001519 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789115001525 -> java/nio/Buffer.flip
+ 0 311403 4789115001532 <- java/nio/Buffer.flip
+ 0 311403 4789115001538 -> java/nio/ByteBuffer.array
+ 0 311403 4789115001545 <- java/nio/ByteBuffer.array
+ 0 311403 4789115001551 -> java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115001558 <- java/nio/ByteBuffer.arrayOffset
+ 0 311403 4789115001564 -> java/io/PrintStream.write
+ 0 311403 4789115001570 -> java/io/PrintStream.ensureOpen
+ 0 311403 4789115001577 <- java/io/PrintStream.ensureOpen
+ 0 311403 4789115001583 -> java/io/BufferedOutputStream.write
+ 0 311403 4789115001590 -> java/lang/System.arraycopy
+ 0 311403 4789115001597 <- java/lang/System.arraycopy
+ 0 311403 4789115001604 <- java/io/BufferedOutputStream.write
+ 0 311403 4789115001610 -> java/io/BufferedOutputStream.flush
+ 0 311403 4789115001621 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789115001628 -> java/io/FileOutputStream.write
+ 0 311403 4789115001634 -> java/io/FileOutputStream.writeBytes
+ 0 311403 4789115001652 <- java/io/FileOutputStream.writeBytes
+ 0 311403 4789115001706 <- java/io/FileOutputStream.write
+ 0 311403 4789115001713 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789115001720 <- java/io/BufferedOutputStream.flush
+ 0 311403 4789115001727 <- java/io/PrintStream.write
+ 0 311403 4789115001733 -> java/nio/Buffer.clear
+ 0 311403 4789115001740 <- java/nio/Buffer.clear
+ 0 311403 4789115001747 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311403 4789115001753 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311403 4789115001760 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311403 4789115001767 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311403 4789115001773 -> java/io/BufferedOutputStream.flush
+ 0 311403 4789115001779 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789115001787 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311403 4789115001794 <- java/io/BufferedOutputStream.flush
+ 0 311403 4789115001801 <- java/io/PrintStream.newLine
+ 0 311403 4789115001807 <- java/io/PrintStream.println
+ 0 311403 4789115001813 -> java/lang/Thread.currentThread
+ 0 311403 4789115001821 <- java/lang/Thread.currentThread
+ 0 311403 4789115001827 -> java/lang/Thread.sleep
+ 0 311403 4789116010060 <- java/lang/Thread.sleep
+ 0 311403 4789116010073 <- Func_abc.func_c
+ 0 311403 4789116010080 <- Func_abc.func_b
+ 0 311403 4789116010086 <- Func_abc.func_a
+ 0 311403 4789116010093 <- Func_abc.main
+ 0 311403 4789116010118 -> java/lang/Thread.exit
+ 0 311403 4789116010145 -> java/lang/ThreadGroup.remove
+ 0 311403 4789116010160 -> java/lang/System.arraycopy
+ 0 311403 4789116010169 <- java/lang/System.arraycopy
+ 0 311403 4789116010178 -> java/lang/Object.notifyAll
+ 0 311403 4789116010192 <- java/lang/Object.notifyAll
+ 0 311403 4789116010199 <- java/lang/ThreadGroup.remove
+ 0 311403 4789116010212 <- java/lang/Thread.exit
+ 0 311403 4789116010380 -> java/lang/Thread.<init>
+ 0 311403 4789116010388 -> java/lang/Object.<init>
+ 0 311403 4789116010395 <- java/lang/Object.<init>
+ 0 311403 4789116010402 -> java/lang/Object.<init>
+ 0 311403 4789116010409 <- java/lang/Object.<init>
+ 0 311403 4789116010415 -> java/lang/Thread.init
+ 0 311403 4789116010422 -> java/lang/Thread.currentThread
+ 0 311403 4789116010430 <- java/lang/Thread.currentThread
+ 0 311403 4789116010436 -> java/lang/System.getSecurityManager
+ 0 311403 4789116010444 <- java/lang/System.getSecurityManager
+ 0 311403 4789116010450 -> java/lang/ThreadGroup.checkAccess
+ 0 311403 4789116010457 -> java/lang/System.getSecurityManager
+ 0 311403 4789116010464 <- java/lang/System.getSecurityManager
+ 0 311403 4789116010471 <- java/lang/ThreadGroup.checkAccess
+ 0 311403 4789116010477 -> java/lang/ThreadGroup.addUnstarted
+ 0 311403 4789116010484 <- java/lang/ThreadGroup.addUnstarted
+ 0 311403 4789116010491 -> java/lang/String.toCharArray
+ 0 311403 4789116010499 -> java/lang/String.getChars
+ 0 311403 4789116010506 -> java/lang/System.arraycopy
+ 0 311403 4789116010514 <- java/lang/System.arraycopy
+ 0 311403 4789116010521 <- java/lang/String.getChars
+ 0 311403 4789116010527 <- java/lang/String.toCharArray
+ 0 311403 4789116010534 -> java/lang/Thread.getContextClassLoader
+ 0 311403 4789116010541 <- java/lang/Thread.getContextClassLoader
+ 0 311403 4789116010548 -> java/security/AccessController.getContext
+ 0 311403 4789116010554 -> java/security/AccessController.getStackAccessControlContext
+ 0 311403 4789116010569 <- java/security/AccessController.getStackAccessControlContext
+ 0 311403 4789116010576 -> java/security/AccessControlContext.optimize
+ 0 311403 4789116010583 -> java/security/AccessController.getInheritedAccessControlContext
+ 0 311403 4789116010591 <- java/security/AccessController.getInheritedAccessControlContext
+ 0 311403 4789116010599 <- java/security/AccessControlContext.optimize
+ 0 311403 4789116010606 <- java/security/AccessController.getContext
+ 0 311403 4789116010612 -> java/lang/Thread.setPriority
+ 0 311403 4789116010618 -> java/lang/Thread.checkAccess
+ 0 311403 4789116010625 -> java/lang/System.getSecurityManager
+ 0 311403 4789116010632 <- java/lang/System.getSecurityManager
+ 0 311403 4789116010639 <- java/lang/Thread.checkAccess
+ 0 311403 4789116010645 -> java/lang/Thread.setPriority0
+ 0 311403 4789116010664 <- java/lang/Thread.setPriority0
+ 0 311403 4789116010671 <- java/lang/Thread.setPriority
+ 0 311403 4789116010678 -> java/lang/Thread.nextThreadID
+ 0 311403 4789116010686 <- java/lang/Thread.nextThreadID
+ 0 311403 4789116010693 <- java/lang/Thread.init
+ 0 311403 4789116010700 <- java/lang/Thread.<init>
+ 0 311403 4789116010707 -> java/lang/ThreadGroup.add
+ 0 311403 4789116010716 <- java/lang/ThreadGroup.add
+ 0 311403 4789116010729 -> java/lang/Shutdown.shutdown
+ 0 311403 4789116010740 -> java/lang/Shutdown.sequence
+ 0 311403 4789116010748 -> java/lang/Shutdown.runHooks
+ 0 311403 4789116010758 -> java/util/AbstractList.iterator
+ 0 311403 4789116011022 -> java/util/AbstractList$Itr.<init>
+ 0 311403 4789116011032 -> java/util/AbstractList$Itr.<init>
+ 0 311403 4789116011042 -> java/lang/Object.<init>
+ 0 311403 4789116011050 <- java/lang/Object.<init>
+ 0 311403 4789116011062 <- java/util/AbstractList$Itr.<init>
+ 0 311403 4789116011069 <- java/util/AbstractList$Itr.<init>
+ 0 311403 4789116011076 <- java/util/AbstractList.iterator
+ 0 311403 4789116011087 -> java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116011099 <- java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116011107 -> java/util/AbstractList$Itr.next
+ 0 311403 4789116011115 -> java/util/AbstractList$Itr.checkForComodification
+ 0 311403 4789116011123 <- java/util/AbstractList$Itr.checkForComodification
+ 0 311403 4789116011131 -> java/util/ArrayList.get
+ 0 311403 4789116011138 -> java/util/ArrayList.RangeCheck
+ 0 311403 4789116011145 <- java/util/ArrayList.RangeCheck
+ 0 311403 4789116011152 <- java/util/ArrayList.get
+ 0 311403 4789116011159 <- java/util/AbstractList$Itr.next
+ 0 311403 4789116011170 -> java/io/Console$1$1.run
+ 0 311403 4789116011180 -> java/io/Console.access$600
+ 0 311403 4789116011189 <- java/io/Console.access$600
+ 0 311403 4789116011196 <- java/io/Console$1$1.run
+ 0 311403 4789116011202 -> java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116011209 <- java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116011215 -> java/util/AbstractList$Itr.next
+ 0 311403 4789116011221 -> java/util/AbstractList$Itr.checkForComodification
+ 0 311403 4789116011229 <- java/util/AbstractList$Itr.checkForComodification
+ 0 311403 4789116011235 -> java/util/ArrayList.get
+ 0 311403 4789116011241 -> java/util/ArrayList.RangeCheck
+ 0 311403 4789116011248 <- java/util/ArrayList.RangeCheck
+ 0 311403 4789116011255 <- java/util/ArrayList.get
+ 0 311403 4789116011262 <- java/util/AbstractList$Itr.next
+ 0 311403 4789116011268 -> java/lang/ApplicationShutdownHooks.run
+ 0 311403 4789116011280 -> java/util/IdentityHashMap.keySet
+ 0 311403 4789116011442 -> java/util/IdentityHashMap$KeySet.<init>
+ 0 311403 4789116011452 -> java/util/IdentityHashMap$KeySet.<init>
+ 0 311403 4789116011462 -> java/util/AbstractSet.<init>
+ 0 311403 4789116011469 -> java/util/AbstractCollection.<init>
+ 0 311403 4789116011475 -> java/lang/Object.<init>
+ 0 311403 4789116011483 <- java/lang/Object.<init>
+ 0 311403 4789116011490 <- java/util/AbstractCollection.<init>
+ 0 311403 4789116011497 <- java/util/AbstractSet.<init>
+ 0 311403 4789116011503 <- java/util/IdentityHashMap$KeySet.<init>
+ 0 311403 4789116011510 <- java/util/IdentityHashMap$KeySet.<init>
+ 0 311403 4789116011528 <- java/util/IdentityHashMap.keySet
+ 0 311403 4789116011538 -> java/util/IdentityHashMap$KeySet.iterator
+ 0 311403 4789116011727 -> java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311403 4789116011737 -> java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311403 4789116011748 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311403 4789116011757 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311403 4789116011766 -> java/lang/Object.<init>
+ 0 311403 4789116011774 <- java/lang/Object.<init>
+ 0 311403 4789116011784 -> java/util/IdentityHashMap.access$000
+ 0 311403 4789116011793 <- java/util/IdentityHashMap.access$000
+ 0 311403 4789116011803 -> java/util/IdentityHashMap.access$200
+ 0 311403 4789116011811 <- java/util/IdentityHashMap.access$200
+ 0 311403 4789116011821 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311403 4789116011828 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311403 4789116011835 <- java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311403 4789116011842 <- java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311403 4789116011849 <- java/util/IdentityHashMap$KeySet.iterator
+ 0 311403 4789116011858 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+ 0 311403 4789116011866 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+ 0 311403 4789116011873 -> java/util/IdentityHashMap$KeySet.iterator
+ 0 311403 4789116011879 -> java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311403 4789116011886 -> java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311403 4789116011892 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311403 4789116011899 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311403 4789116011905 -> java/lang/Object.<init>
+ 0 311403 4789116011912 <- java/lang/Object.<init>
+ 0 311403 4789116011919 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311403 4789116011926 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311403 4789116011934 <- java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311403 4789116011940 <- java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311403 4789116011947 <- java/util/IdentityHashMap$KeySet.iterator
+ 0 311403 4789116011953 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+ 0 311403 4789116011961 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+ 0 311403 4789116011968 <- java/lang/ApplicationShutdownHooks.run
+ 0 311403 4789116011974 -> java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116011982 <- java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116011988 -> java/util/AbstractList$Itr.next
+ 0 311403 4789116011994 -> java/util/AbstractList$Itr.checkForComodification
+ 0 311403 4789116012002 <- java/util/AbstractList$Itr.checkForComodification
+ 0 311403 4789116012008 -> java/util/ArrayList.get
+ 0 311403 4789116012014 -> java/util/ArrayList.RangeCheck
+ 0 311403 4789116012021 <- java/util/ArrayList.RangeCheck
+ 0 311403 4789116012028 <- java/util/ArrayList.get
+ 0 311403 4789116012035 <- java/util/AbstractList$Itr.next
+ 0 311403 4789116012041 -> java/io/File$1.run
+ 0 311403 4789116012187 -> java/io/DeleteOnExitHook.<clinit>
+ 0 311403 4789116012333 -> java/util/LinkedHashSet.<init>
+ 0 311403 4789116012343 -> java/util/HashSet.<init>
+ 0 311403 4789116012350 -> java/util/AbstractSet.<init>
+ 0 311403 4789116012356 -> java/util/AbstractCollection.<init>
+ 0 311403 4789116012362 -> java/lang/Object.<init>
+ 0 311403 4789116012370 <- java/lang/Object.<init>
+ 0 311403 4789116012377 <- java/util/AbstractCollection.<init>
+ 0 311403 4789116012384 <- java/util/AbstractSet.<init>
+ 0 311403 4789116012394 -> java/util/LinkedHashMap.<init>
+ 0 311403 4789116012404 -> java/util/HashMap.<init>
+ 0 311403 4789116012410 -> java/util/AbstractMap.<init>
+ 0 311403 4789116012417 -> java/lang/Object.<init>
+ 0 311403 4789116012424 <- java/lang/Object.<init>
+ 0 311403 4789116012431 <- java/util/AbstractMap.<init>
+ 0 311403 4789116012438 -> java/lang/Float.isNaN
+ 0 311403 4789116012445 <- java/lang/Float.isNaN
+ 0 311403 4789116012456 -> java/util/LinkedHashMap.init
+ 0 311403 4789116012463 -> java/util/LinkedHashMap$Entry.<init>
+ 0 311403 4789116012469 -> java/util/HashMap$Entry.<init>
+ 0 311403 4789116012476 -> java/lang/Object.<init>
+ 0 311403 4789116012482 <- java/lang/Object.<init>
+ 0 311403 4789116012489 <- java/util/HashMap$Entry.<init>
+ 0 311403 4789116012496 <- java/util/LinkedHashMap$Entry.<init>
+ 0 311403 4789116012503 <- java/util/LinkedHashMap.init
+ 0 311403 4789116012510 <- java/util/HashMap.<init>
+ 0 311403 4789116012516 <- java/util/LinkedHashMap.<init>
+ 0 311403 4789116012523 <- java/util/HashSet.<init>
+ 0 311403 4789116012529 <- java/util/LinkedHashSet.<init>
+ 0 311403 4789116012538 <- java/io/DeleteOnExitHook.<clinit>
+ 0 311403 4789116012547 -> java/io/DeleteOnExitHook.hook
+ 0 311403 4789116012556 -> java/io/DeleteOnExitHook.<init>
+ 0 311403 4789116012565 -> java/lang/Object.<init>
+ 0 311403 4789116012572 <- java/lang/Object.<init>
+ 0 311403 4789116012579 <- java/io/DeleteOnExitHook.<init>
+ 0 311403 4789116012586 <- java/io/DeleteOnExitHook.hook
+ 0 311403 4789116012594 -> java/io/DeleteOnExitHook.run
+ 0 311403 4789116012605 -> java/util/ArrayList.<init>
+ 0 311403 4789116012612 -> java/util/AbstractList.<init>
+ 0 311403 4789116012618 -> java/util/AbstractCollection.<init>
+ 0 311403 4789116012624 -> java/lang/Object.<init>
+ 0 311403 4789116012631 <- java/lang/Object.<init>
+ 0 311403 4789116012638 <- java/util/AbstractCollection.<init>
+ 0 311403 4789116012645 <- java/util/AbstractList.<init>
+ 0 311403 4789116012654 -> java/util/AbstractCollection.toArray
+ 0 311403 4789116012664 -> java/util/HashSet.size
+ 0 311403 4789116012674 <- java/util/HashSet.size
+ 0 311403 4789116012682 -> java/util/HashSet.iterator
+ 0 311403 4789116012691 -> java/util/HashMap.keySet
+ 0 311403 4789116012782 -> java/util/HashMap$KeySet.<init>
+ 0 311403 4789116012791 -> java/util/HashMap$KeySet.<init>
+ 0 311403 4789116012801 -> java/util/AbstractSet.<init>
+ 0 311403 4789116012807 -> java/util/AbstractCollection.<init>
+ 0 311403 4789116012814 -> java/lang/Object.<init>
+ 0 311403 4789116012821 <- java/lang/Object.<init>
+ 0 311403 4789116012828 <- java/util/AbstractCollection.<init>
+ 0 311403 4789116012835 <- java/util/AbstractSet.<init>
+ 0 311403 4789116012841 <- java/util/HashMap$KeySet.<init>
+ 0 311403 4789116012848 <- java/util/HashMap$KeySet.<init>
+ 0 311403 4789116012855 <- java/util/HashMap.keySet
+ 0 311403 4789116012864 -> java/util/HashMap$KeySet.iterator
+ 0 311403 4789116012874 -> java/util/LinkedHashMap.newKeyIterator
+ 0 311403 4789116013056 -> java/util/LinkedHashMap$KeyIterator.<init>
+ 0 311403 4789116013066 -> java/util/LinkedHashMap$KeyIterator.<init>
+ 0 311403 4789116013076 -> java/util/LinkedHashMap$LinkedHashIterator.<init>
+ 0 311403 4789116013085 -> java/util/LinkedHashMap$LinkedHashIterator.<init>
+ 0 311403 4789116013095 -> java/lang/Object.<init>
+ 0 311403 4789116013102 <- java/lang/Object.<init>
+ 0 311403 4789116013117 <- java/util/LinkedHashMap$LinkedHashIterator.<init>
+ 0 311403 4789116013125 <- java/util/LinkedHashMap$LinkedHashIterator.<init>
+ 0 311403 4789116013132 <- java/util/LinkedHashMap$KeyIterator.<init>
+ 0 311403 4789116013138 <- java/util/LinkedHashMap$KeyIterator.<init>
+ 0 311403 4789116013145 <- java/util/LinkedHashMap.newKeyIterator
+ 0 311403 4789116013152 <- java/util/HashMap$KeySet.iterator
+ 0 311403 4789116013159 <- java/util/HashSet.iterator
+ 0 311403 4789116013168 -> java/util/LinkedHashMap$LinkedHashIterator.hasNext
+ 0 311403 4789116013176 <- java/util/LinkedHashMap$LinkedHashIterator.hasNext
+ 0 311403 4789116013183 <- java/util/AbstractCollection.toArray
+ 0 311403 4789116013190 -> java/lang/Object.getClass
+ 0 311403 4789116013198 <- java/lang/Object.getClass
+ 0 311403 4789116013206 <- java/util/ArrayList.<init>
+ 0 311403 4789116013216 -> java/util/Collections.reverse
+ 0 311403 4789116013228 <- java/util/Collections.reverse
+ 0 311403 4789116013236 -> java/util/AbstractList.iterator
+ 0 311403 4789116013243 -> java/util/AbstractList$Itr.<init>
+ 0 311403 4789116013250 -> java/util/AbstractList$Itr.<init>
+ 0 311403 4789116013256 -> java/lang/Object.<init>
+ 0 311403 4789116013263 <- java/lang/Object.<init>
+ 0 311403 4789116013270 <- java/util/AbstractList$Itr.<init>
+ 0 311403 4789116013276 <- java/util/AbstractList$Itr.<init>
+ 0 311403 4789116013283 <- java/util/AbstractList.iterator
+ 0 311403 4789116013292 -> java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116013299 <- java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116013306 <- java/io/DeleteOnExitHook.run
+ 0 311403 4789116013313 <- java/io/File$1.run
+ 0 311403 4789116013319 -> java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116013326 <- java/util/AbstractList$Itr.hasNext
+ 0 311403 4789116013333 <- java/lang/Shutdown.runHooks
+ 0 311403 4789116013342 <- java/lang/Shutdown.sequence
+ 0 311403 4789116013349 <- java/lang/Shutdown.shutdown
+
+The fourth column is indented by 2 spaces to show when a new method begins.
+This shows what is calling what.
+
+The TIME(us) column shows time from boot in microseconds.
+
+If the output looks strange, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
+I truncated the above output by 22800 lines so that it would fit. To make
+sense of the output, try searching for "Func_abc" or using grep. The
+lines were,
+
+ 0 311403 4789112982182 -> Func_abc.main
+ 0 311403 4789112982193 -> Func_abc.func_a
+ 0 311403 4789113990080 -> Func_abc.func_b
+ 0 311403 4789115000081 -> Func_abc.func_c
+ 0 311403 4789116010073 <- Func_abc.func_c
+ 0 311403 4789116010080 <- Func_abc.func_b
+ 0 311403 4789116010086 <- Func_abc.func_a
+ 0 311403 4789116010093 <- Func_abc.main
+
+You can also use the j_classflow.d script to only trace one class.
+
+If you see "drops" warnings, see the Notes/ALLjava_notes.txt file for details.
+
diff --git a/Examples/j_flowtime_example.txt b/Examples/j_flowtime_example.txt
new file mode 100644
index 000000000000..22c6a612f873
--- /dev/null
+++ b/Examples/j_flowtime_example.txt
@@ -0,0 +1,1287 @@
+The following are examples of j_flowtime.d.
+
+This is a simple script to trace the timing and the not-so-simple flow of
+Java methods and classes. Here it traces the example program,
+Code/Java/func_abc
+
+# j_flowtime.d
+ C PID/TID TIME(us) DELTA(us) -- CLASS.METHOD
+ 0 311481/2 4790256870903 2 -> java/lang/Object.<clinit>
+ 0 311481/2 4790256870950 46 -> java/lang/Object.registerNatives
+ 0 311481/2 4790256871090 140 <- java/lang/Object.registerNatives
+ 0 311481/2 4790256871109 18 <- java/lang/Object.<clinit>
+ 0 311481/2 4790256871121 12 -> java/lang/String.<clinit>
+ 0 311481/2 4790256871518 397 -> java/lang/String$CaseInsensitiveComparator.<init>
+ 0 311481/2 4790256871531 12 -> java/lang/String$CaseInsensitiveComparator.<init>
+ 0 311481/2 4790256871541 10 -> java/lang/Object.<init>
+ 0 311481/2 4790256871549 7 <- java/lang/Object.<init>
+ 0 311481/2 4790256871558 8 <- java/lang/String$CaseInsensitiveComparator.<init>
+ 0 311481/2 4790256871566 7 <- java/lang/String$CaseInsensitiveComparator.<init>
+ 0 311481/2 4790256871575 9 <- java/lang/String.<clinit>
+ 0 311481/2 4790256871644 68 -> java/lang/System.<clinit>
+ 0 311481/2 4790256871656 11 -> java/lang/System.registerNatives
+ 0 311481/2 4790256871675 18 <- java/lang/System.registerNatives
+ 0 311481/2 4790256871686 10 -> java/lang/System.nullInputStream
+ 0 311481/2 4790256871695 9 -> java/lang/System.currentTimeMillis
+ 0 311481/2 4790256871705 10 <- java/lang/System.currentTimeMillis
+ 0 311481/2 4790256871714 8 <- java/lang/System.nullInputStream
+ 0 311481/2 4790256871726 11 -> java/lang/System.nullPrintStream
+ 0 311481/2 4790256871734 7 -> java/lang/System.currentTimeMillis
+ 0 311481/2 4790256871741 7 <- java/lang/System.currentTimeMillis
+ 0 311481/2 4790256871749 7 <- java/lang/System.nullPrintStream
+ 0 311481/2 4790256871758 9 -> java/lang/System.nullPrintStream
+ 0 311481/2 4790256871766 7 -> java/lang/System.currentTimeMillis
+ 0 311481/2 4790256871773 7 <- java/lang/System.currentTimeMillis
+ 0 311481/2 4790256871781 7 <- java/lang/System.nullPrintStream
+ 0 311481/2 4790256871792 10 <- java/lang/System.<clinit>
+ 0 311481/2 4790256871870 78 -> java/lang/ThreadGroup.<init>
+ 0 311481/2 4790256871881 10 -> java/lang/Object.<init>
+ 0 311481/2 4790256871889 7 <- java/lang/Object.<init>
+ 0 311481/2 4790256871906 17 <- java/lang/ThreadGroup.<init>
+ 0 311481/2 4790256871918 11 -> java/lang/ThreadGroup.<init>
+ 0 311481/2 4790256871926 7 -> java/lang/Object.<init>
+ 0 311481/2 4790256871933 7 <- java/lang/Object.<init>
+ 0 311481/2 4790256871945 12 -> java/lang/ThreadGroup.checkAccess
+ 0 311481/2 4790256871955 10 -> java/lang/System.getSecurityManager
+ 0 311481/2 4790256871964 8 <- java/lang/System.getSecurityManager
+ 0 311481/2 4790256871972 8 <- java/lang/ThreadGroup.checkAccess
+ 0 311481/2 4790256871984 12 -> java/lang/ThreadGroup.add
+ 0 311481/2 4790256872006 21 <- java/lang/ThreadGroup.add
+ 0 311481/2 4790256872014 8 <- java/lang/ThreadGroup.<init>
+ 0 311481/2 4790256872201 187 -> java/lang/Thread.<clinit>
+ 0 311481/2 4790256872213 12 -> java/lang/Thread.registerNatives
+ 0 311481/2 4790256872239 25 <- java/lang/Thread.registerNatives
+ 0 311481/2 4790256872606 367 -> java/lang/RuntimePermission.<init>
+ 0 311481/2 4790256872618 11 -> java/security/BasicPermission.<init>
+ 0 311481/2 4790256872628 9 -> java/security/Permission.<init>
+ 0 311481/2 4790256872637 9 -> java/lang/Object.<init>
+ 0 311481/2 4790256872645 7 <- java/lang/Object.<init>
+ 0 311481/2 4790256872656 10 <- java/security/Permission.<init>
+ 0 311481/2 4790256872666 10 -> java/security/BasicPermission.init
+ 0 311481/2 4790256872677 11 -> java/lang/String.length
+ 0 311481/2 4790256872686 8 <- java/lang/String.length
+ 0 311481/2 4790256872697 11 -> java/lang/String.charAt
+ 0 311481/2 4790256872707 10 <- java/lang/String.charAt
+ 0 311481/2 4790256872720 12 -> java/lang/String.equals
+ 0 311481/2 4790256872728 8 <- java/lang/String.equals
+ 0 311481/2 4790256872737 9 <- java/security/BasicPermission.init
+ 0 311481/2 4790256872745 7 <- java/security/BasicPermission.<init>
+ 0 311481/2 4790256872753 7 <- java/lang/RuntimePermission.<init>
+ 0 311481/2 4790256873195 442 -> sun/misc/SoftCache.<init>
+ 0 311481/2 4790256873208 12 -> java/util/AbstractMap.<init>
+ 0 311481/2 4790256873218 9 -> java/lang/Object.<init>
+ 0 311481/2 4790256873226 7 <- java/lang/Object.<init>
+ 0 311481/2 4790256873238 11 <- java/util/AbstractMap.<init>
+ 0 311481/2 4790256873371 133 -> java/lang/ref/ReferenceQueue.<clinit>
+ 0 311481/2 4790256873443 72 -> java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311481/2 4790256873454 10 -> java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311481/2 4790256873464 9 -> java/lang/ref/ReferenceQueue.<init>
+ 0 311481/2 4790256873474 9 -> java/lang/Object.<init>
+ 0 311481/2 4790256873481 7 <- java/lang/Object.<init>
+ 0 311481/2 4790256873542 60 -> java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311481/2 4790256873553 10 -> java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311481/2 4790256873562 9 -> java/lang/Object.<init>
+ 0 311481/2 4790256873570 7 <- java/lang/Object.<init>
+ 0 311481/2 4790256873578 7 <- java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311481/2 4790256873585 7 <- java/lang/ref/ReferenceQueue$Lock.<init>
+ 0 311481/2 4790256873597 11 <- java/lang/ref/ReferenceQueue.<init>
+ 0 311481/2 4790256873604 7 <- java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311481/2 4790256873612 7 <- java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311481/2 4790256873622 9 -> java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311481/2 4790256873629 7 -> java/lang/ref/ReferenceQueue$Null.<init>
+ 0 311481/2 4790256873636 7 -> java/lang/ref/ReferenceQueue.<init>
+ 0 311481/2 4790256873644 7 -> java/lang/Object.<init>
+ 0 311481/2 4790256873651 6 <- java/lang/Object.<init>
+ 0 311481/2 4790256873659 7 -> java/lang/ref/ReferenceQueue$Lock.<init>
+[... 22800 lines truncated ...]
+ 0 311481/2 4790257387424 7 <- java/util/HashMap.indexFor
+ 0 311481/2 4790257387432 8 <- java/util/HashMap.put
+ 0 311481/2 4790257387440 7 <- java/util/HashSet.add
+ 0 311481/2 4790257387447 7 <- java/lang/ClassLoader.checkPackageAccess
+ 0 311481/2 4790257387473 26 -> java/lang/reflect/Method.getModifiers
+ 0 311481/2 4790257387486 12 <- java/lang/reflect/Method.getModifiers
+ 0 311481/2 4790257387500 14 -> Func_abc.main
+ 0 311481/2 4790257387512 11 -> Func_abc.func_a
+ 0 311481/2 4790257387522 9 -> java/lang/ClassLoader.checkPackageAccess
+ 0 311481/2 4790257387530 7 -> java/lang/System.getSecurityManager
+ 0 311481/2 4790257387537 7 <- java/lang/System.getSecurityManager
+ 0 311481/2 4790257387545 8 -> java/util/HashSet.add
+ 0 311481/2 4790257387552 7 -> java/util/HashMap.put
+ 0 311481/2 4790257387559 7 -> java/lang/Object.hashCode
+ 0 311481/2 4790257387567 7 <- java/lang/Object.hashCode
+ 0 311481/2 4790257387574 7 -> java/util/HashMap.hash
+ 0 311481/2 4790257387581 7 <- java/util/HashMap.hash
+ 0 311481/2 4790257387589 7 -> java/util/HashMap.indexFor
+ 0 311481/2 4790257387596 7 <- java/util/HashMap.indexFor
+ 0 311481/2 4790257387604 8 <- java/util/HashMap.put
+ 0 311481/2 4790257387611 7 <- java/util/HashSet.add
+ 0 311481/2 4790257387619 7 <- java/lang/ClassLoader.checkPackageAccess
+ 0 311481/2 4790257387683 64 -> java/lang/ClassLoader.loadClassInternal
+ 0 311481/2 4790257387691 8 -> java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257387699 7 -> sun/misc/Launcher$AppClassLoader.loadClass
+ 0 311481/2 4790257387706 7 -> java/lang/String.lastIndexOf
+ 0 311481/2 4790257387713 7 -> java/lang/String.lastIndexOf
+ 0 311481/2 4790257387722 8 <- java/lang/String.lastIndexOf
+ 0 311481/2 4790257387729 7 <- java/lang/String.lastIndexOf
+ 0 311481/2 4790257387737 7 -> java/lang/System.getSecurityManager
+ 0 311481/2 4790257387760 22 <- java/lang/System.getSecurityManager
+ 0 311481/2 4790257387768 7 -> java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257387775 7 -> java/lang/ClassLoader.findLoadedClass
+ 0 311481/2 4790257387782 7 -> java/lang/ClassLoader.check
+ 0 311481/2 4790257387789 7 <- java/lang/ClassLoader.check
+ 0 311481/2 4790257387797 7 -> java/lang/ClassLoader.checkName
+ 0 311481/2 4790257387805 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257387812 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257387820 8 <- java/lang/String.indexOf
+ 0 311481/2 4790257387828 7 <- java/lang/String.indexOf
+ 0 311481/2 4790257387835 7 -> sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257387843 7 <- sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257387850 7 -> java/lang/String.charAt
+ 0 311481/2 4790257387857 7 <- java/lang/String.charAt
+ 0 311481/2 4790257387865 7 <- java/lang/ClassLoader.checkName
+ 0 311481/2 4790257387873 7 -> java/lang/ClassLoader.findLoadedClass0
+ 0 311481/2 4790257387883 9 <- java/lang/ClassLoader.findLoadedClass0
+ 0 311481/2 4790257387890 7 <- java/lang/ClassLoader.findLoadedClass
+ 0 311481/2 4790257387899 8 -> java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257387906 7 -> java/lang/ClassLoader.findLoadedClass
+ 0 311481/2 4790257387913 7 -> java/lang/ClassLoader.check
+ 0 311481/2 4790257387920 7 <- java/lang/ClassLoader.check
+ 0 311481/2 4790257387928 7 -> java/lang/ClassLoader.checkName
+ 0 311481/2 4790257387935 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257387942 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257387951 8 <- java/lang/String.indexOf
+ 0 311481/2 4790257387958 7 <- java/lang/String.indexOf
+ 0 311481/2 4790257387966 7 -> sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257387973 7 <- sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257387981 7 -> java/lang/String.charAt
+ 0 311481/2 4790257387988 7 <- java/lang/String.charAt
+ 0 311481/2 4790257387995 7 <- java/lang/ClassLoader.checkName
+ 0 311481/2 4790257388003 7 -> java/lang/ClassLoader.findLoadedClass0
+ 0 311481/2 4790257388012 8 <- java/lang/ClassLoader.findLoadedClass0
+ 0 311481/2 4790257388020 7 <- java/lang/ClassLoader.findLoadedClass
+ 0 311481/2 4790257388028 7 -> java/lang/ClassLoader.findBootstrapClass0
+ 0 311481/2 4790257388035 7 -> java/lang/ClassLoader.check
+ 0 311481/2 4790257388042 7 <- java/lang/ClassLoader.check
+ 0 311481/2 4790257388050 7 -> java/lang/ClassLoader.checkName
+ 0 311481/2 4790257388057 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257388064 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257388072 8 <- java/lang/String.indexOf
+ 0 311481/2 4790257388080 7 <- java/lang/String.indexOf
+ 0 311481/2 4790257388087 7 -> sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257388094 7 <- sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257388102 7 -> java/lang/String.charAt
+ 0 311481/2 4790257388109 7 <- java/lang/String.charAt
+ 0 311481/2 4790257388117 7 <- java/lang/ClassLoader.checkName
+ 0 311481/2 4790257388124 7 -> java/lang/ClassLoader.findBootstrapClass
+ 0 311481/2 4790257388134 9 <- java/lang/ClassLoader.findBootstrapClass
+ 0 311481/2 4790257388142 8 <- java/lang/ClassLoader.findBootstrapClass0
+ 0 311481/2 4790257388150 8 <- java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257388158 7 <- java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257388166 7 <- sun/misc/Launcher$AppClassLoader.loadClass
+ 0 311481/2 4790257388173 7 <- java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257388181 7 <- java/lang/ClassLoader.loadClassInternal
+ 0 311481/2 4790257388193 11 -> java/lang/ClassLoader.checkPackageAccess
+ 0 311481/2 4790257388200 7 -> java/lang/System.getSecurityManager
+ 0 311481/2 4790257388207 7 <- java/lang/System.getSecurityManager
+ 0 311481/2 4790257388215 7 -> java/util/HashSet.add
+ 0 311481/2 4790257388223 7 -> java/util/HashMap.put
+ 0 311481/2 4790257388230 7 -> java/lang/Object.hashCode
+ 0 311481/2 4790257388237 7 <- java/lang/Object.hashCode
+ 0 311481/2 4790257388245 7 -> java/util/HashMap.hash
+ 0 311481/2 4790257388252 7 <- java/util/HashMap.hash
+ 0 311481/2 4790257388260 7 -> java/util/HashMap.indexFor
+ 0 311481/2 4790257388267 7 <- java/util/HashMap.indexFor
+ 0 311481/2 4790257388275 7 <- java/util/HashMap.put
+ 0 311481/2 4790257388282 7 <- java/util/HashSet.add
+ 0 311481/2 4790257388290 7 <- java/lang/ClassLoader.checkPackageAccess
+ 0 311481/2 4790257388305 15 -> java/io/PrintStream.println
+ 0 311481/2 4790257388316 11 -> java/io/PrintStream.print
+ 0 311481/2 4790257388326 9 -> java/io/PrintStream.write
+ 0 311481/2 4790257388335 9 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790257388345 10 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790257388358 12 -> java/io/Writer.write
+ 0 311481/2 4790257388371 13 -> java/io/BufferedWriter.write
+ 0 311481/2 4790257388382 10 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790257388389 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790257388399 10 -> java/io/BufferedWriter.min
+ 0 311481/2 4790257388407 7 <- java/io/BufferedWriter.min
+ 0 311481/2 4790257388417 10 -> java/lang/String.getChars
+ 0 311481/2 4790257388425 8 -> java/lang/System.arraycopy
+ 0 311481/2 4790257388434 8 <- java/lang/System.arraycopy
+ 0 311481/2 4790257388442 7 <- java/lang/String.getChars
+ 0 311481/2 4790257388450 8 <- java/io/BufferedWriter.write
+ 0 311481/2 4790257388457 7 <- java/io/Writer.write
+ 0 311481/2 4790257388467 10 -> java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790257388475 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790257388482 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790257388493 10 -> java/io/OutputStreamWriter.write
+ 0 311481/2 4790257388504 11 -> sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790257388515 10 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790257388522 7 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790257388533 10 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790257388544 11 -> java/nio/CharBuffer.wrap
+ 0 311481/2 4790257388552 8 -> java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790257388560 7 -> java/nio/CharBuffer.<init>
+ 0 311481/2 4790257388567 7 -> java/nio/Buffer.<init>
+ 0 311481/2 4790257388574 7 -> java/lang/Object.<init>
+ 0 311481/2 4790257388582 7 <- java/lang/Object.<init>
+ 0 311481/2 4790257388590 8 -> java/nio/Buffer.limit
+ 0 311481/2 4790257388598 7 <- java/nio/Buffer.limit
+ 0 311481/2 4790257388605 7 -> java/nio/Buffer.position
+ 0 311481/2 4790257388612 7 <- java/nio/Buffer.position
+ 0 311481/2 4790257388620 7 <- java/nio/Buffer.<init>
+ 0 311481/2 4790257388628 7 <- java/nio/CharBuffer.<init>
+ 0 311481/2 4790257388635 7 <- java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790257388643 7 <- java/nio/CharBuffer.wrap
+ 0 311481/2 4790257388654 10 -> java/nio/Buffer.hasRemaining
+ 0 311481/2 4790257388661 7 <- java/nio/Buffer.hasRemaining
+ 0 311481/2 4790257388673 11 -> java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790257388684 10 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790257388695 10 -> java/nio/CharBuffer.hasArray
+ 0 311481/2 4790257388702 7 <- java/nio/CharBuffer.hasArray
+ 0 311481/2 4790257388714 11 -> java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790257388722 7 <- java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790257388732 10 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790257388742 9 -> java/nio/CharBuffer.array
+ 0 311481/2 4790257388749 7 <- java/nio/CharBuffer.array
+ 0 311481/2 4790257388759 9 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257388766 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257388776 9 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257388784 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257388797 13 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790257388804 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790257388814 9 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257388821 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257388831 9 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257388838 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257388853 14 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257388861 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257388871 9 -> java/nio/Buffer.position
+ 0 311481/2 4790257388878 7 <- java/nio/Buffer.position
+ 0 311481/2 4790257388886 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257388893 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257388903 9 -> java/nio/Buffer.position
+ 0 311481/2 4790257388910 7 <- java/nio/Buffer.position
+ 0 311481/2 4790257388918 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790257388925 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790257388936 10 -> java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790257388943 7 <- java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790257388953 9 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790257388961 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790257388969 7 <- java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790257388979 10 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790257388987 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790257388998 11 -> java/nio/Buffer.remaining
+ 0 311481/2 4790257389005 7 <- java/nio/Buffer.remaining
+ 0 311481/2 4790257389013 7 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790257389020 7 <- sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790257389028 7 <- java/io/OutputStreamWriter.write
+ 0 311481/2 4790257389113 85 <- java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790257389125 11 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790257389135 9 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790257389146 11 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790257389158 11 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790257389167 9 -> java/nio/Buffer.flip
+ 0 311481/2 4790257389174 7 <- java/nio/Buffer.flip
+ 0 311481/2 4790257389186 11 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790257389193 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790257389203 9 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257389210 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257389222 11 -> java/io/PrintStream.write
+ 0 311481/2 4790257389230 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790257389237 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790257389248 11 -> java/io/BufferedOutputStream.write
+ 0 311481/2 4790257389261 12 -> java/lang/System.arraycopy
+ 0 311481/2 4790257389268 7 <- java/lang/System.arraycopy
+ 0 311481/2 4790257389276 7 <- java/io/BufferedOutputStream.write
+ 0 311481/2 4790257389286 9 -> java/io/BufferedOutputStream.flush
+ 0 311481/2 4790257389295 9 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790257389307 11 -> java/io/FileOutputStream.write
+ 0 311481/2 4790257389317 10 -> java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790257389479 162 <- java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790257389489 9 <- java/io/FileOutputStream.write
+ 0 311481/2 4790257389497 7 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790257389509 12 <- java/io/BufferedOutputStream.flush
+ 0 311481/2 4790257389517 8 <- java/io/PrintStream.write
+ 0 311481/2 4790257389527 10 -> java/nio/Buffer.clear
+ 0 311481/2 4790257389536 8 <- java/nio/Buffer.clear
+ 0 311481/2 4790257389543 7 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790257389551 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790257389559 7 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790257389566 7 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790257389579 12 -> java/lang/String.indexOf
+ 0 311481/2 4790257389586 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257389595 8 <- java/lang/String.indexOf
+ 0 311481/2 4790257389602 7 <- java/lang/String.indexOf
+ 0 311481/2 4790257389610 7 <- java/io/PrintStream.write
+ 0 311481/2 4790257389617 7 <- java/io/PrintStream.print
+ 0 311481/2 4790257389627 9 -> java/io/PrintStream.newLine
+ 0 311481/2 4790257389635 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790257389642 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790257389651 9 -> java/io/BufferedWriter.newLine
+ 0 311481/2 4790257389661 9 -> java/io/Writer.write
+ 0 311481/2 4790257389668 7 -> java/io/BufferedWriter.write
+ 0 311481/2 4790257389713 44 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790257389721 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790257389729 8 -> java/io/BufferedWriter.min
+ 0 311481/2 4790257389737 7 <- java/io/BufferedWriter.min
+ 0 311481/2 4790257389744 7 -> java/lang/String.getChars
+ 0 311481/2 4790257389752 7 -> java/lang/System.arraycopy
+ 0 311481/2 4790257389760 7 <- java/lang/System.arraycopy
+ 0 311481/2 4790257389767 7 <- java/lang/String.getChars
+ 0 311481/2 4790257389775 7 <- java/io/BufferedWriter.write
+ 0 311481/2 4790257389783 7 <- java/io/Writer.write
+ 0 311481/2 4790257389790 7 <- java/io/BufferedWriter.newLine
+ 0 311481/2 4790257389798 7 -> java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790257389805 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790257389812 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790257389820 7 -> java/io/OutputStreamWriter.write
+ 0 311481/2 4790257389828 7 -> sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790257389835 7 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790257389842 7 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790257389850 7 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790257389857 7 -> java/nio/CharBuffer.wrap
+ 0 311481/2 4790257389865 7 -> java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790257389872 7 -> java/nio/CharBuffer.<init>
+ 0 311481/2 4790257389879 7 -> java/nio/Buffer.<init>
+ 0 311481/2 4790257389886 6 -> java/lang/Object.<init>
+ 0 311481/2 4790257389893 7 <- java/lang/Object.<init>
+ 0 311481/2 4790257389901 7 -> java/nio/Buffer.limit
+ 0 311481/2 4790257389908 7 <- java/nio/Buffer.limit
+ 0 311481/2 4790257389916 7 -> java/nio/Buffer.position
+ 0 311481/2 4790257389923 7 <- java/nio/Buffer.position
+ 0 311481/2 4790257389930 7 <- java/nio/Buffer.<init>
+ 0 311481/2 4790257389938 7 <- java/nio/CharBuffer.<init>
+ 0 311481/2 4790257389946 7 <- java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790257389953 7 <- java/nio/CharBuffer.wrap
+ 0 311481/2 4790257389961 7 -> java/nio/Buffer.hasRemaining
+ 0 311481/2 4790257389968 7 <- java/nio/Buffer.hasRemaining
+ 0 311481/2 4790257389976 7 -> java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790257389984 7 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790257389991 7 -> java/nio/CharBuffer.hasArray
+ 0 311481/2 4790257389998 7 <- java/nio/CharBuffer.hasArray
+ 0 311481/2 4790257390760 761 -> java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790257390772 11 <- java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790257390782 10 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790257390790 7 -> java/nio/CharBuffer.array
+ 0 311481/2 4790257390797 7 <- java/nio/CharBuffer.array
+ 0 311481/2 4790257390805 7 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257390812 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257390820 8 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257390828 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257390836 8 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790257390844 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790257390851 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257390859 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257390866 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257390874 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257390883 8 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257390890 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790257390898 8 -> java/nio/Buffer.position
+ 0 311481/2 4790257390906 7 <- java/nio/Buffer.position
+ 0 311481/2 4790257390913 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257390921 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257390928 7 -> java/nio/Buffer.position
+ 0 311481/2 4790257390936 7 <- java/nio/Buffer.position
+ 0 311481/2 4790257390943 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790257390951 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790257390959 8 -> java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790257390967 7 <- java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790257390974 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790257390982 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790257390990 7 <- java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790257390998 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790257391005 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790257391013 8 -> java/nio/Buffer.remaining
+ 0 311481/2 4790257391020 7 <- java/nio/Buffer.remaining
+ 0 311481/2 4790257391028 7 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790257391036 7 <- sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790257391044 7 <- java/io/OutputStreamWriter.write
+ 0 311481/2 4790257391052 8 <- java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790257391060 7 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790257391067 7 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790257391075 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790257391082 7 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790257391090 7 -> java/nio/Buffer.flip
+ 0 311481/2 4790257391097 7 <- java/nio/Buffer.flip
+ 0 311481/2 4790257391105 8 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790257391112 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790257391120 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257391127 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790257391135 8 -> java/io/PrintStream.write
+ 0 311481/2 4790257391142 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790257391150 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790257391158 8 -> java/io/BufferedOutputStream.write
+ 0 311481/2 4790257391166 7 -> java/lang/System.arraycopy
+ 0 311481/2 4790257391174 8 <- java/lang/System.arraycopy
+ 0 311481/2 4790257391182 7 <- java/io/BufferedOutputStream.write
+ 0 311481/2 4790257391190 7 -> java/io/BufferedOutputStream.flush
+ 0 311481/2 4790257391197 7 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790257391205 7 -> java/io/FileOutputStream.write
+ 0 311481/2 4790257391212 7 -> java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790257391280 67 <- java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790257391289 9 <- java/io/FileOutputStream.write
+ 0 311481/2 4790257391297 7 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790257391305 7 <- java/io/BufferedOutputStream.flush
+ 0 311481/2 4790257391313 7 <- java/io/PrintStream.write
+ 0 311481/2 4790257391321 7 -> java/nio/Buffer.clear
+ 0 311481/2 4790257391329 7 <- java/nio/Buffer.clear
+ 0 311481/2 4790257391336 7 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790257391344 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790257391352 7 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790257391359 7 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790257391368 8 -> java/io/BufferedOutputStream.flush
+ 0 311481/2 4790257391375 7 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790257391383 7 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790257391391 8 <- java/io/BufferedOutputStream.flush
+ 0 311481/2 4790257391398 7 <- java/io/PrintStream.newLine
+ 0 311481/2 4790257391406 7 <- java/io/PrintStream.println
+ 0 311481/2 4790257391439 32 -> java/lang/ClassLoader.loadClassInternal
+ 0 311481/2 4790257391447 8 -> java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257391455 7 -> sun/misc/Launcher$AppClassLoader.loadClass
+ 0 311481/2 4790257391463 7 -> java/lang/String.lastIndexOf
+ 0 311481/2 4790257391471 7 -> java/lang/String.lastIndexOf
+ 0 311481/2 4790257391479 8 <- java/lang/String.lastIndexOf
+ 0 311481/2 4790257391487 7 <- java/lang/String.lastIndexOf
+ 0 311481/2 4790257391495 8 -> java/lang/System.getSecurityManager
+ 0 311481/2 4790257391503 7 <- java/lang/System.getSecurityManager
+ 0 311481/2 4790257391511 8 -> java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257391518 7 -> java/lang/ClassLoader.findLoadedClass
+ 0 311481/2 4790257391526 7 -> java/lang/ClassLoader.check
+ 0 311481/2 4790257391533 7 <- java/lang/ClassLoader.check
+ 0 311481/2 4790257391541 7 -> java/lang/ClassLoader.checkName
+ 0 311481/2 4790257391549 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257391556 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257391564 8 <- java/lang/String.indexOf
+ 0 311481/2 4790257391572 7 <- java/lang/String.indexOf
+ 0 311481/2 4790257391580 8 -> sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257391587 7 <- sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257391595 7 -> java/lang/String.charAt
+ 0 311481/2 4790257391603 7 <- java/lang/String.charAt
+ 0 311481/2 4790257391610 7 <- java/lang/ClassLoader.checkName
+ 0 311481/2 4790257391618 7 -> java/lang/ClassLoader.findLoadedClass0
+ 0 311481/2 4790257391633 14 <- java/lang/ClassLoader.findLoadedClass0
+ 0 311481/2 4790257391641 8 <- java/lang/ClassLoader.findLoadedClass
+ 0 311481/2 4790257391651 9 -> java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257391658 7 -> java/lang/ClassLoader.findLoadedClass
+ 0 311481/2 4790257391665 7 -> java/lang/ClassLoader.check
+ 0 311481/2 4790257391672 7 <- java/lang/ClassLoader.check
+ 0 311481/2 4790257391680 7 -> java/lang/ClassLoader.checkName
+ 0 311481/2 4790257391688 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257391695 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257391703 8 <- java/lang/String.indexOf
+ 0 311481/2 4790257391711 7 <- java/lang/String.indexOf
+ 0 311481/2 4790257391718 7 -> sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257391725 7 <- sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257391733 7 -> java/lang/String.charAt
+ 0 311481/2 4790257391740 7 <- java/lang/String.charAt
+ 0 311481/2 4790257391748 7 <- java/lang/ClassLoader.checkName
+ 0 311481/2 4790257391755 7 -> java/lang/ClassLoader.findLoadedClass0
+ 0 311481/2 4790257391765 9 <- java/lang/ClassLoader.findLoadedClass0
+ 0 311481/2 4790257391773 8 <- java/lang/ClassLoader.findLoadedClass
+ 0 311481/2 4790257391781 8 -> java/lang/ClassLoader.findBootstrapClass0
+ 0 311481/2 4790257391788 7 -> java/lang/ClassLoader.check
+ 0 311481/2 4790257391795 7 <- java/lang/ClassLoader.check
+ 0 311481/2 4790257391803 7 -> java/lang/ClassLoader.checkName
+ 0 311481/2 4790257391810 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257391817 7 -> java/lang/String.indexOf
+ 0 311481/2 4790257391825 7 <- java/lang/String.indexOf
+ 0 311481/2 4790257391833 7 <- java/lang/String.indexOf
+ 0 311481/2 4790257391840 7 -> sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257391848 7 <- sun/misc/VM.allowArraySyntax
+ 0 311481/2 4790257391855 7 -> java/lang/String.charAt
+ 0 311481/2 4790257391862 7 <- java/lang/String.charAt
+ 0 311481/2 4790257391870 7 <- java/lang/ClassLoader.checkName
+ 0 311481/2 4790257391877 7 -> java/lang/ClassLoader.findBootstrapClass
+ 0 311481/2 4790257391891 13 <- java/lang/ClassLoader.findBootstrapClass
+ 0 311481/2 4790257391899 7 <- java/lang/ClassLoader.findBootstrapClass0
+ 0 311481/2 4790257391907 8 <- java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257391915 7 <- java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257391922 7 <- sun/misc/Launcher$AppClassLoader.loadClass
+ 0 311481/2 4790257391930 7 <- java/lang/ClassLoader.loadClass
+ 0 311481/2 4790257391938 7 <- java/lang/ClassLoader.loadClassInternal
+ 0 311481/2 4790257391954 16 -> java/lang/ClassLoader.checkPackageAccess
+ 0 311481/2 4790257391962 7 -> java/lang/System.getSecurityManager
+ 0 311481/2 4790257391969 7 <- java/lang/System.getSecurityManager
+ 0 311481/2 4790257391978 8 -> java/util/HashSet.add
+ 0 311481/2 4790257391986 8 -> java/util/HashMap.put
+ 0 311481/2 4790257391994 7 -> java/lang/Object.hashCode
+ 0 311481/2 4790257392001 7 <- java/lang/Object.hashCode
+ 0 311481/2 4790257392009 8 -> java/util/HashMap.hash
+ 0 311481/2 4790257392017 7 <- java/util/HashMap.hash
+ 0 311481/2 4790257392025 7 -> java/util/HashMap.indexFor
+ 0 311481/2 4790257392032 7 <- java/util/HashMap.indexFor
+ 0 311481/2 4790257392040 8 <- java/util/HashMap.put
+ 0 311481/2 4790257392048 7 <- java/util/HashSet.add
+ 0 311481/2 4790257392055 7 <- java/lang/ClassLoader.checkPackageAccess
+ 0 311481/2 4790257392076 20 -> java/lang/Thread.currentThread
+ 0 311481/2 4790257392084 8 <- java/lang/Thread.currentThread
+ 0 311481/2 4790257392094 10 -> java/lang/Thread.sleep
+ 0 311481/2 4790258400253 1008158 <- java/lang/Thread.sleep
+ 0 311481/2 4790258400299 45 -> Func_abc.func_b
+ 0 311481/2 4790258400329 30 -> java/io/PrintStream.println
+ 0 311481/2 4790258400338 8 -> java/io/PrintStream.print
+ 0 311481/2 4790258400345 7 -> java/io/PrintStream.write
+ 0 311481/2 4790258400353 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790258400361 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790258400369 8 -> java/io/Writer.write
+ 0 311481/2 4790258400378 8 -> java/io/BufferedWriter.write
+ 0 311481/2 4790258400386 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790258400393 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790258400402 9 -> java/io/BufferedWriter.min
+ 0 311481/2 4790258400410 7 <- java/io/BufferedWriter.min
+ 0 311481/2 4790258400418 8 -> java/lang/String.getChars
+ 0 311481/2 4790258400426 8 -> java/lang/System.arraycopy
+ 0 311481/2 4790258400435 8 <- java/lang/System.arraycopy
+ 0 311481/2 4790258400442 7 <- java/lang/String.getChars
+ 0 311481/2 4790258400451 8 <- java/io/BufferedWriter.write
+ 0 311481/2 4790258400458 7 <- java/io/Writer.write
+ 0 311481/2 4790258400466 7 -> java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790258400474 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790258400481 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790258400489 8 -> java/io/OutputStreamWriter.write
+ 0 311481/2 4790258400497 7 -> sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790258400504 7 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790258400511 7 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790258400520 8 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790258400528 7 -> java/nio/CharBuffer.wrap
+ 0 311481/2 4790258400536 7 -> java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790258400544 7 -> java/nio/CharBuffer.<init>
+ 0 311481/2 4790258400551 7 -> java/nio/Buffer.<init>
+ 0 311481/2 4790258400559 7 -> java/lang/Object.<init>
+ 0 311481/2 4790258400566 7 <- java/lang/Object.<init>
+ 0 311481/2 4790258400574 8 -> java/nio/Buffer.limit
+ 0 311481/2 4790258400582 7 <- java/nio/Buffer.limit
+ 0 311481/2 4790258400590 7 -> java/nio/Buffer.position
+ 0 311481/2 4790258400597 7 <- java/nio/Buffer.position
+ 0 311481/2 4790258400604 7 <- java/nio/Buffer.<init>
+ 0 311481/2 4790258400612 7 <- java/nio/CharBuffer.<init>
+ 0 311481/2 4790258400620 7 <- java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790258400627 7 <- java/nio/CharBuffer.wrap
+ 0 311481/2 4790258400635 8 -> java/nio/Buffer.hasRemaining
+ 0 311481/2 4790258400643 7 <- java/nio/Buffer.hasRemaining
+ 0 311481/2 4790258400651 8 -> java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790258400659 8 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790258400667 7 -> java/nio/CharBuffer.hasArray
+ 0 311481/2 4790258400675 7 <- java/nio/CharBuffer.hasArray
+ 0 311481/2 4790258400683 8 -> java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790258400690 7 <- java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790258400698 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790258400706 7 -> java/nio/CharBuffer.array
+ 0 311481/2 4790258400713 7 <- java/nio/CharBuffer.array
+ 0 311481/2 4790258400721 7 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258400728 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258400736 7 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258400743 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258400752 8 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790258400759 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790258400766 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258400774 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258400781 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258400789 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258400799 9 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258400806 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258400813 7 -> java/nio/Buffer.position
+ 0 311481/2 4790258400821 7 <- java/nio/Buffer.position
+ 0 311481/2 4790258400828 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258400836 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258400843 7 -> java/nio/Buffer.position
+ 0 311481/2 4790258400850 7 <- java/nio/Buffer.position
+ 0 311481/2 4790258400858 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790258400866 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790258400874 8 -> java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790258400881 7 <- java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790258400889 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790258400896 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790258400904 7 <- java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790258400912 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790258400919 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790258400927 8 -> java/nio/Buffer.remaining
+ 0 311481/2 4790258400934 7 <- java/nio/Buffer.remaining
+ 0 311481/2 4790258400942 7 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790258400950 7 <- sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790258400957 7 <- java/io/OutputStreamWriter.write
+ 0 311481/2 4790258400965 7 <- java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790258400973 8 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790258400981 7 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790258400988 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790258400996 7 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790258401004 7 -> java/nio/Buffer.flip
+ 0 311481/2 4790258401011 6 <- java/nio/Buffer.flip
+ 0 311481/2 4790258401019 8 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790258401026 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790258401033 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401041 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401049 7 -> java/io/PrintStream.write
+ 0 311481/2 4790258401056 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790258401063 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790258401071 8 -> java/io/BufferedOutputStream.write
+ 0 311481/2 4790258401079 7 -> java/lang/System.arraycopy
+ 0 311481/2 4790258401087 7 <- java/lang/System.arraycopy
+ 0 311481/2 4790258401094 7 <- java/io/BufferedOutputStream.write
+ 0 311481/2 4790258401103 8 -> java/io/BufferedOutputStream.flush
+ 0 311481/2 4790258401110 7 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790258401118 7 -> java/io/FileOutputStream.write
+ 0 311481/2 4790258401125 7 -> java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790258401164 39 <- java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790258401173 8 <- java/io/FileOutputStream.write
+ 0 311481/2 4790258401181 7 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790258401189 7 <- java/io/BufferedOutputStream.flush
+ 0 311481/2 4790258401196 7 <- java/io/PrintStream.write
+ 0 311481/2 4790258401204 7 -> java/nio/Buffer.clear
+ 0 311481/2 4790258401212 7 <- java/nio/Buffer.clear
+ 0 311481/2 4790258401219 7 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790258401227 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790258401235 7 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790258401242 7 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790258401251 8 -> java/lang/String.indexOf
+ 0 311481/2 4790258401258 7 -> java/lang/String.indexOf
+ 0 311481/2 4790258401266 8 <- java/lang/String.indexOf
+ 0 311481/2 4790258401274 7 <- java/lang/String.indexOf
+ 0 311481/2 4790258401281 7 <- java/io/PrintStream.write
+ 0 311481/2 4790258401289 7 <- java/io/PrintStream.print
+ 0 311481/2 4790258401297 7 -> java/io/PrintStream.newLine
+ 0 311481/2 4790258401304 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790258401311 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790258401319 7 -> java/io/BufferedWriter.newLine
+ 0 311481/2 4790258401326 7 -> java/io/Writer.write
+ 0 311481/2 4790258401334 7 -> java/io/BufferedWriter.write
+ 0 311481/2 4790258401341 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790258401348 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790258401356 7 -> java/io/BufferedWriter.min
+ 0 311481/2 4790258401363 7 <- java/io/BufferedWriter.min
+ 0 311481/2 4790258401371 7 -> java/lang/String.getChars
+ 0 311481/2 4790258401378 7 -> java/lang/System.arraycopy
+ 0 311481/2 4790258401385 7 <- java/lang/System.arraycopy
+ 0 311481/2 4790258401393 7 <- java/lang/String.getChars
+ 0 311481/2 4790258401401 7 <- java/io/BufferedWriter.write
+ 0 311481/2 4790258401408 7 <- java/io/Writer.write
+ 0 311481/2 4790258401416 7 <- java/io/BufferedWriter.newLine
+ 0 311481/2 4790258401423 7 -> java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790258401430 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790258401438 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790258401446 7 -> java/io/OutputStreamWriter.write
+ 0 311481/2 4790258401453 7 -> sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790258401460 7 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790258401467 7 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790258401475 7 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790258401482 7 -> java/nio/CharBuffer.wrap
+ 0 311481/2 4790258401490 7 -> java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790258401497 7 -> java/nio/CharBuffer.<init>
+ 0 311481/2 4790258401504 7 -> java/nio/Buffer.<init>
+ 0 311481/2 4790258401511 7 -> java/lang/Object.<init>
+ 0 311481/2 4790258401518 7 <- java/lang/Object.<init>
+ 0 311481/2 4790258401526 7 -> java/nio/Buffer.limit
+ 0 311481/2 4790258401533 7 <- java/nio/Buffer.limit
+ 0 311481/2 4790258401541 7 -> java/nio/Buffer.position
+ 0 311481/2 4790258401548 7 <- java/nio/Buffer.position
+ 0 311481/2 4790258401556 7 <- java/nio/Buffer.<init>
+ 0 311481/2 4790258401563 7 <- java/nio/CharBuffer.<init>
+ 0 311481/2 4790258401570 7 <- java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790258401578 7 <- java/nio/CharBuffer.wrap
+ 0 311481/2 4790258401586 7 -> java/nio/Buffer.hasRemaining
+ 0 311481/2 4790258401593 7 <- java/nio/Buffer.hasRemaining
+ 0 311481/2 4790258401601 7 -> java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790258401608 7 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790258401615 7 -> java/nio/CharBuffer.hasArray
+ 0 311481/2 4790258401623 7 <- java/nio/CharBuffer.hasArray
+ 0 311481/2 4790258401630 7 -> java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790258401638 7 <- java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790258401645 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790258401653 7 -> java/nio/CharBuffer.array
+ 0 311481/2 4790258401660 7 <- java/nio/CharBuffer.array
+ 0 311481/2 4790258401667 7 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258401675 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258401682 7 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258401690 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258401697 7 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790258401705 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790258401712 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401719 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401727 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401734 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401743 8 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258401750 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790258401757 7 -> java/nio/Buffer.position
+ 0 311481/2 4790258401765 7 <- java/nio/Buffer.position
+ 0 311481/2 4790258401772 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401780 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401787 7 -> java/nio/Buffer.position
+ 0 311481/2 4790258401794 7 <- java/nio/Buffer.position
+ 0 311481/2 4790258401802 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790258401809 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790258401817 7 -> java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790258401825 7 <- java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790258401832 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790258401840 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790258401848 7 <- java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790258401855 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790258401863 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790258401871 7 -> java/nio/Buffer.remaining
+ 0 311481/2 4790258401878 7 <- java/nio/Buffer.remaining
+ 0 311481/2 4790258401885 7 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790258401893 7 <- sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790258401901 7 <- java/io/OutputStreamWriter.write
+ 0 311481/2 4790258401908 7 <- java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790258401916 7 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790258401923 7 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790258401931 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790258401938 7 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790258401945 7 -> java/nio/Buffer.flip
+ 0 311481/2 4790258401952 7 <- java/nio/Buffer.flip
+ 0 311481/2 4790258401960 7 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790258401967 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790258401975 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401982 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790258401990 7 -> java/io/PrintStream.write
+ 0 311481/2 4790258401997 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790258402004 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790258402012 7 -> java/io/BufferedOutputStream.write
+ 0 311481/2 4790258402020 7 -> java/lang/System.arraycopy
+ 0 311481/2 4790258402027 7 <- java/lang/System.arraycopy
+ 0 311481/2 4790258402035 7 <- java/io/BufferedOutputStream.write
+ 0 311481/2 4790258402042 7 -> java/io/BufferedOutputStream.flush
+ 0 311481/2 4790258402050 7 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790258402057 7 -> java/io/FileOutputStream.write
+ 0 311481/2 4790258402064 7 -> java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790258402082 17 <- java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790258402090 8 <- java/io/FileOutputStream.write
+ 0 311481/2 4790258402098 7 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790258402106 7 <- java/io/BufferedOutputStream.flush
+ 0 311481/2 4790258402113 7 <- java/io/PrintStream.write
+ 0 311481/2 4790258402121 7 -> java/nio/Buffer.clear
+ 0 311481/2 4790258402128 7 <- java/nio/Buffer.clear
+ 0 311481/2 4790258402136 7 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790258402143 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790258402151 7 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790258402159 7 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790258402166 7 -> java/io/BufferedOutputStream.flush
+ 0 311481/2 4790258402174 7 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790258402181 7 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790258402189 7 <- java/io/BufferedOutputStream.flush
+ 0 311481/2 4790258402196 7 <- java/io/PrintStream.newLine
+ 0 311481/2 4790258402204 7 <- java/io/PrintStream.println
+ 0 311481/2 4790258402212 7 -> java/lang/Thread.currentThread
+ 0 311481/2 4790258402220 7 <- java/lang/Thread.currentThread
+ 0 311481/2 4790258402228 7 -> java/lang/Thread.sleep
+ 0 311481/2 4790259410328 1008099 <- java/lang/Thread.sleep
+ 0 311481/2 4790259410374 46 -> Func_abc.func_c
+ 0 311481/2 4790259410404 29 -> java/io/PrintStream.println
+ 0 311481/2 4790259410412 8 -> java/io/PrintStream.print
+ 0 311481/2 4790259410420 7 -> java/io/PrintStream.write
+ 0 311481/2 4790259410428 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790259410435 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790259410444 8 -> java/io/Writer.write
+ 0 311481/2 4790259410453 8 -> java/io/BufferedWriter.write
+ 0 311481/2 4790259410460 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790259410467 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790259410477 9 -> java/io/BufferedWriter.min
+ 0 311481/2 4790259410484 7 <- java/io/BufferedWriter.min
+ 0 311481/2 4790259410492 8 -> java/lang/String.getChars
+ 0 311481/2 4790259410501 8 -> java/lang/System.arraycopy
+ 0 311481/2 4790259410509 8 <- java/lang/System.arraycopy
+ 0 311481/2 4790259410517 7 <- java/lang/String.getChars
+ 0 311481/2 4790259410525 8 <- java/io/BufferedWriter.write
+ 0 311481/2 4790259410533 7 <- java/io/Writer.write
+ 0 311481/2 4790259410541 7 -> java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790259410548 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790259410555 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790259410563 8 -> java/io/OutputStreamWriter.write
+ 0 311481/2 4790259410571 7 -> sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790259410579 7 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790259410586 7 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790259410595 8 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790259410602 7 -> java/nio/CharBuffer.wrap
+ 0 311481/2 4790259410610 7 -> java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790259410618 7 -> java/nio/CharBuffer.<init>
+ 0 311481/2 4790259410625 7 -> java/nio/Buffer.<init>
+ 0 311481/2 4790259410633 7 -> java/lang/Object.<init>
+ 0 311481/2 4790259410640 7 <- java/lang/Object.<init>
+ 0 311481/2 4790259410648 8 -> java/nio/Buffer.limit
+ 0 311481/2 4790259410656 7 <- java/nio/Buffer.limit
+ 0 311481/2 4790259410664 7 -> java/nio/Buffer.position
+ 0 311481/2 4790259410671 7 <- java/nio/Buffer.position
+ 0 311481/2 4790259410678 7 <- java/nio/Buffer.<init>
+ 0 311481/2 4790259410686 7 <- java/nio/CharBuffer.<init>
+ 0 311481/2 4790259410694 7 <- java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790259410701 7 <- java/nio/CharBuffer.wrap
+ 0 311481/2 4790259410710 8 -> java/nio/Buffer.hasRemaining
+ 0 311481/2 4790259410717 7 <- java/nio/Buffer.hasRemaining
+ 0 311481/2 4790259410725 8 -> java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790259410733 8 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790259410741 7 -> java/nio/CharBuffer.hasArray
+ 0 311481/2 4790259410749 7 <- java/nio/CharBuffer.hasArray
+ 0 311481/2 4790259410757 8 -> java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790259410764 7 <- java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790259410772 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790259410780 7 -> java/nio/CharBuffer.array
+ 0 311481/2 4790259410787 7 <- java/nio/CharBuffer.array
+ 0 311481/2 4790259410795 7 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259410802 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259410810 7 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259410817 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259410826 8 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790259410833 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790259410841 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259410848 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259410855 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259410863 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259410873 9 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259410880 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259410888 7 -> java/nio/Buffer.position
+ 0 311481/2 4790259410895 7 <- java/nio/Buffer.position
+ 0 311481/2 4790259410902 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259410910 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259410917 7 -> java/nio/Buffer.position
+ 0 311481/2 4790259410924 7 <- java/nio/Buffer.position
+ 0 311481/2 4790259410932 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790259410940 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790259410948 8 -> java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790259410955 7 <- java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790259410963 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790259410970 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790259410978 7 <- java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790259410986 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790259410993 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790259411001 8 -> java/nio/Buffer.remaining
+ 0 311481/2 4790259411008 7 <- java/nio/Buffer.remaining
+ 0 311481/2 4790259411016 7 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790259411024 7 <- sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790259411031 7 <- java/io/OutputStreamWriter.write
+ 0 311481/2 4790259411039 7 <- java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790259411047 8 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790259411055 7 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790259411062 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790259411070 7 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790259411077 7 -> java/nio/Buffer.flip
+ 0 311481/2 4790259411084 6 <- java/nio/Buffer.flip
+ 0 311481/2 4790259411092 8 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790259411100 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790259411107 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259411114 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259411122 7 -> java/io/PrintStream.write
+ 0 311481/2 4790259411130 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790259411137 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790259411145 8 -> java/io/BufferedOutputStream.write
+ 0 311481/2 4790259411153 7 -> java/lang/System.arraycopy
+ 0 311481/2 4790259411160 7 <- java/lang/System.arraycopy
+ 0 311481/2 4790259411168 7 <- java/io/BufferedOutputStream.write
+ 0 311481/2 4790259411176 8 -> java/io/BufferedOutputStream.flush
+ 0 311481/2 4790259411184 7 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790259411192 7 -> java/io/FileOutputStream.write
+ 0 311481/2 4790259411199 7 -> java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790259411241 41 <- java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790259411249 8 <- java/io/FileOutputStream.write
+ 0 311481/2 4790259411257 7 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790259411265 7 <- java/io/BufferedOutputStream.flush
+ 0 311481/2 4790259411272 7 <- java/io/PrintStream.write
+ 0 311481/2 4790259411280 7 -> java/nio/Buffer.clear
+ 0 311481/2 4790259411288 7 <- java/nio/Buffer.clear
+ 0 311481/2 4790259411295 7 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790259411303 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790259411310 7 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790259411318 7 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790259411326 8 -> java/lang/String.indexOf
+ 0 311481/2 4790259411334 7 -> java/lang/String.indexOf
+ 0 311481/2 4790259411342 8 <- java/lang/String.indexOf
+ 0 311481/2 4790259411349 7 <- java/lang/String.indexOf
+ 0 311481/2 4790259411357 7 <- java/io/PrintStream.write
+ 0 311481/2 4790259411365 7 <- java/io/PrintStream.print
+ 0 311481/2 4790259411372 7 -> java/io/PrintStream.newLine
+ 0 311481/2 4790259411380 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790259411387 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790259411395 7 -> java/io/BufferedWriter.newLine
+ 0 311481/2 4790259411402 7 -> java/io/Writer.write
+ 0 311481/2 4790259411409 7 -> java/io/BufferedWriter.write
+ 0 311481/2 4790259411416 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790259411423 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790259411431 7 -> java/io/BufferedWriter.min
+ 0 311481/2 4790259411439 7 <- java/io/BufferedWriter.min
+ 0 311481/2 4790259411446 7 -> java/lang/String.getChars
+ 0 311481/2 4790259411454 7 -> java/lang/System.arraycopy
+ 0 311481/2 4790259411461 7 <- java/lang/System.arraycopy
+ 0 311481/2 4790259411468 7 <- java/lang/String.getChars
+ 0 311481/2 4790259411476 7 <- java/io/BufferedWriter.write
+ 0 311481/2 4790259411484 7 <- java/io/Writer.write
+ 0 311481/2 4790259411491 7 <- java/io/BufferedWriter.newLine
+ 0 311481/2 4790259411499 7 -> java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790259411506 7 -> java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790259411513 7 <- java/io/BufferedWriter.ensureOpen
+ 0 311481/2 4790259411521 7 -> java/io/OutputStreamWriter.write
+ 0 311481/2 4790259411528 7 -> sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790259411535 7 -> sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790259411543 7 <- sun/nio/cs/StreamEncoder.ensureOpen
+ 0 311481/2 4790259411550 7 -> sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790259411558 7 -> java/nio/CharBuffer.wrap
+ 0 311481/2 4790259411565 7 -> java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790259411572 7 -> java/nio/CharBuffer.<init>
+ 0 311481/2 4790259411579 7 -> java/nio/Buffer.<init>
+ 0 311481/2 4790259411586 6 -> java/lang/Object.<init>
+ 0 311481/2 4790259411594 7 <- java/lang/Object.<init>
+ 0 311481/2 4790259411601 7 -> java/nio/Buffer.limit
+ 0 311481/2 4790259411608 7 <- java/nio/Buffer.limit
+ 0 311481/2 4790259411616 7 -> java/nio/Buffer.position
+ 0 311481/2 4790259411623 7 <- java/nio/Buffer.position
+ 0 311481/2 4790259411631 7 <- java/nio/Buffer.<init>
+ 0 311481/2 4790259411638 7 <- java/nio/CharBuffer.<init>
+ 0 311481/2 4790259411646 7 <- java/nio/HeapCharBuffer.<init>
+ 0 311481/2 4790259411653 7 <- java/nio/CharBuffer.wrap
+ 0 311481/2 4790259411661 7 -> java/nio/Buffer.hasRemaining
+ 0 311481/2 4790259411668 7 <- java/nio/Buffer.hasRemaining
+ 0 311481/2 4790259411676 7 -> java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790259411684 7 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790259411691 7 -> java/nio/CharBuffer.hasArray
+ 0 311481/2 4790259411698 7 <- java/nio/CharBuffer.hasArray
+ 0 311481/2 4790259411706 7 -> java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790259411713 7 <- java/nio/ByteBuffer.hasArray
+ 0 311481/2 4790259411721 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790259411728 7 -> java/nio/CharBuffer.array
+ 0 311481/2 4790259411735 7 <- java/nio/CharBuffer.array
+ 0 311481/2 4790259411743 7 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259411750 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259411758 7 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259411765 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259411773 7 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790259411780 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790259411787 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259411795 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259411802 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259411809 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259411818 8 -> java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259411825 7 <- java/nio/CharBuffer.arrayOffset
+ 0 311481/2 4790259411833 7 -> java/nio/Buffer.position
+ 0 311481/2 4790259411840 7 <- java/nio/Buffer.position
+ 0 311481/2 4790259411847 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259411855 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259411862 7 -> java/nio/Buffer.position
+ 0 311481/2 4790259411869 7 <- java/nio/Buffer.position
+ 0 311481/2 4790259411877 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 0 311481/2 4790259411885 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 0 311481/2 4790259411893 8 -> java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790259411900 7 <- java/nio/charset/CoderResult.isOverflow
+ 0 311481/2 4790259411908 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790259411915 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790259411923 7 <- java/nio/charset/CharsetEncoder.encode
+ 0 311481/2 4790259411931 7 -> java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790259411938 7 <- java/nio/charset/CoderResult.isUnderflow
+ 0 311481/2 4790259411946 7 -> java/nio/Buffer.remaining
+ 0 311481/2 4790259411953 7 <- java/nio/Buffer.remaining
+ 0 311481/2 4790259411960 7 <- sun/nio/cs/StreamEncoder.implWrite
+ 0 311481/2 4790259411968 7 <- sun/nio/cs/StreamEncoder.write
+ 0 311481/2 4790259411976 7 <- java/io/OutputStreamWriter.write
+ 0 311481/2 4790259411983 7 <- java/io/BufferedWriter.flushBuffer
+ 0 311481/2 4790259411991 7 -> java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790259411999 7 -> sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790259412006 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790259412013 7 -> sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790259412021 7 -> java/nio/Buffer.flip
+ 0 311481/2 4790259412028 6 <- java/nio/Buffer.flip
+ 0 311481/2 4790259412035 7 -> java/nio/ByteBuffer.array
+ 0 311481/2 4790259412043 7 <- java/nio/ByteBuffer.array
+ 0 311481/2 4790259412050 7 -> java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259412057 7 <- java/nio/ByteBuffer.arrayOffset
+ 0 311481/2 4790259412065 7 -> java/io/PrintStream.write
+ 0 311481/2 4790259412072 7 -> java/io/PrintStream.ensureOpen
+ 0 311481/2 4790259412080 7 <- java/io/PrintStream.ensureOpen
+ 0 311481/2 4790259412087 7 -> java/io/BufferedOutputStream.write
+ 0 311481/2 4790259412095 7 -> java/lang/System.arraycopy
+ 0 311481/2 4790259412102 7 <- java/lang/System.arraycopy
+ 0 311481/2 4790259412110 7 <- java/io/BufferedOutputStream.write
+ 0 311481/2 4790259412118 7 -> java/io/BufferedOutputStream.flush
+ 0 311481/2 4790259412125 7 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790259412132 7 -> java/io/FileOutputStream.write
+ 0 311481/2 4790259412140 7 -> java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790259412157 17 <- java/io/FileOutputStream.writeBytes
+ 0 311481/2 4790259412165 8 <- java/io/FileOutputStream.write
+ 0 311481/2 4790259412172 7 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790259412180 7 <- java/io/BufferedOutputStream.flush
+ 0 311481/2 4790259412188 7 <- java/io/PrintStream.write
+ 0 311481/2 4790259412195 7 -> java/nio/Buffer.clear
+ 0 311481/2 4790259412203 7 <- java/nio/Buffer.clear
+ 0 311481/2 4790259412210 7 <- sun/nio/cs/StreamEncoder.writeBytes
+ 0 311481/2 4790259412218 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer
+ 0 311481/2 4790259412226 7 <- sun/nio/cs/StreamEncoder.flushBuffer
+ 0 311481/2 4790259412233 7 <- java/io/OutputStreamWriter.flushBuffer
+ 0 311481/2 4790259412241 7 -> java/io/BufferedOutputStream.flush
+ 0 311481/2 4790259412248 7 -> java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790259412256 7 <- java/io/BufferedOutputStream.flushBuffer
+ 0 311481/2 4790259412263 7 <- java/io/BufferedOutputStream.flush
+ 0 311481/2 4790259412271 7 <- java/io/PrintStream.newLine
+ 0 311481/2 4790259412279 7 <- java/io/PrintStream.println
+ 0 311481/2 4790259412287 8 -> java/lang/Thread.currentThread
+ 0 311481/2 4790259412294 7 <- java/lang/Thread.currentThread
+ 0 311481/2 4790259412302 7 -> java/lang/Thread.sleep
+ 0 311481/2 4790260420044 1007741 <- java/lang/Thread.sleep
+ 0 311481/2 4790260420073 29 <- Func_abc.func_c
+ 0 311481/2 4790260420081 7 <- Func_abc.func_b
+ 0 311481/2 4790260420088 7 <- Func_abc.func_a
+ 0 311481/2 4790260420096 7 <- Func_abc.main
+ 0 311481/2 4790260420121 24 -> java/lang/Thread.exit
+ 0 311481/2 4790260420153 32 -> java/lang/ThreadGroup.remove
+ 0 311481/2 4790260420169 15 -> java/lang/System.arraycopy
+ 0 311481/2 4790260420178 8 <- java/lang/System.arraycopy
+ 0 311481/2 4790260420190 11 -> java/lang/Object.notifyAll
+ 0 311481/2 4790260420203 13 <- java/lang/Object.notifyAll
+ 0 311481/2 4790260420211 8 <- java/lang/ThreadGroup.remove
+ 0 311481/2 4790260420225 13 <- java/lang/Thread.exit
+ 0 311481/2 4790260420438 212 -> java/lang/Thread.<init>
+ 0 311481/2 4790260420447 8 -> java/lang/Object.<init>
+ 0 311481/2 4790260420454 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260420464 9 -> java/lang/Object.<init>
+ 0 311481/2 4790260420471 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260420479 8 -> java/lang/Thread.init
+ 0 311481/2 4790260420486 7 -> java/lang/Thread.currentThread
+ 0 311481/2 4790260420494 7 <- java/lang/Thread.currentThread
+ 0 311481/2 4790260420503 8 -> java/lang/System.getSecurityManager
+ 0 311481/2 4790260420511 7 <- java/lang/System.getSecurityManager
+ 0 311481/2 4790260420519 8 -> java/lang/ThreadGroup.checkAccess
+ 0 311481/2 4790260420526 7 -> java/lang/System.getSecurityManager
+ 0 311481/2 4790260420534 7 <- java/lang/System.getSecurityManager
+ 0 311481/2 4790260420542 8 <- java/lang/ThreadGroup.checkAccess
+ 0 311481/2 4790260420550 8 -> java/lang/ThreadGroup.addUnstarted
+ 0 311481/2 4790260420558 7 <- java/lang/ThreadGroup.addUnstarted
+ 0 311481/2 4790260420567 9 -> java/lang/String.toCharArray
+ 0 311481/2 4790260420575 8 -> java/lang/String.getChars
+ 0 311481/2 4790260420584 8 -> java/lang/System.arraycopy
+ 0 311481/2 4790260420592 8 <- java/lang/System.arraycopy
+ 0 311481/2 4790260420599 7 <- java/lang/String.getChars
+ 0 311481/2 4790260420607 7 <- java/lang/String.toCharArray
+ 0 311481/2 4790260420615 7 -> java/lang/Thread.getContextClassLoader
+ 0 311481/2 4790260420622 7 <- java/lang/Thread.getContextClassLoader
+ 0 311481/2 4790260420631 8 -> java/security/AccessController.getContext
+ 0 311481/2 4790260420638 7 -> java/security/AccessController.getStackAccessControlContext
+ 0 311481/2 4790260420653 14 <- java/security/AccessController.getStackAccessControlContext
+ 0 311481/2 4790260420662 8 -> java/security/AccessControlContext.optimize
+ 0 311481/2 4790260420670 8 -> java/security/AccessController.getInheritedAccessControlContext
+ 0 311481/2 4790260420678 8 <- java/security/AccessController.getInheritedAccessControlContext
+ 0 311481/2 4790260420687 8 <- java/security/AccessControlContext.optimize
+ 0 311481/2 4790260420695 7 <- java/security/AccessController.getContext
+ 0 311481/2 4790260420703 8 -> java/lang/Thread.setPriority
+ 0 311481/2 4790260420710 7 -> java/lang/Thread.checkAccess
+ 0 311481/2 4790260420718 7 -> java/lang/System.getSecurityManager
+ 0 311481/2 4790260420725 7 <- java/lang/System.getSecurityManager
+ 0 311481/2 4790260420732 7 <- java/lang/Thread.checkAccess
+ 0 311481/2 4790260420741 8 -> java/lang/Thread.setPriority0
+ 0 311481/2 4790260420760 19 <- java/lang/Thread.setPriority0
+ 0 311481/2 4790260420768 8 <- java/lang/Thread.setPriority
+ 0 311481/2 4790260420777 8 -> java/lang/Thread.nextThreadID
+ 0 311481/2 4790260420785 8 <- java/lang/Thread.nextThreadID
+ 0 311481/2 4790260420793 7 <- java/lang/Thread.init
+ 0 311481/2 4790260420801 7 <- java/lang/Thread.<init>
+ 0 311481/2 4790260420810 9 -> java/lang/ThreadGroup.add
+ 0 311481/2 4790260420819 8 <- java/lang/ThreadGroup.add
+ 0 311481/2 4790260420834 15 -> java/lang/Shutdown.shutdown
+ 0 311481/2 4790260420846 12 -> java/lang/Shutdown.sequence
+ 0 311481/2 4790260420855 9 -> java/lang/Shutdown.runHooks
+ 0 311481/2 4790260420867 11 -> java/util/AbstractList.iterator
+ 0 311481/2 4790260421144 277 -> java/util/AbstractList$Itr.<init>
+ 0 311481/2 4790260421156 12 -> java/util/AbstractList$Itr.<init>
+ 0 311481/2 4790260421168 11 -> java/lang/Object.<init>
+ 0 311481/2 4790260421175 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260421189 13 <- java/util/AbstractList$Itr.<init>
+ 0 311481/2 4790260421197 7 <- java/util/AbstractList$Itr.<init>
+ 0 311481/2 4790260421205 7 <- java/util/AbstractList.iterator
+ 0 311481/2 4790260421218 13 -> java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260421229 11 <- java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260421240 10 -> java/util/AbstractList$Itr.next
+ 0 311481/2 4790260421249 9 -> java/util/AbstractList$Itr.checkForComodification
+ 0 311481/2 4790260421256 7 <- java/util/AbstractList$Itr.checkForComodification
+ 0 311481/2 4790260421267 10 -> java/util/ArrayList.get
+ 0 311481/2 4790260421274 7 -> java/util/ArrayList.RangeCheck
+ 0 311481/2 4790260421282 7 <- java/util/ArrayList.RangeCheck
+ 0 311481/2 4790260421290 7 <- java/util/ArrayList.get
+ 0 311481/2 4790260421297 7 <- java/util/AbstractList$Itr.next
+ 0 311481/2 4790260421310 12 -> java/io/Console$1$1.run
+ 0 311481/2 4790260421321 10 -> java/io/Console.access$600
+ 0 311481/2 4790260421330 9 <- java/io/Console.access$600
+ 0 311481/2 4790260421338 7 <- java/io/Console$1$1.run
+ 0 311481/2 4790260421346 7 -> java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260421353 7 <- java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260421361 7 -> java/util/AbstractList$Itr.next
+ 0 311481/2 4790260421368 7 -> java/util/AbstractList$Itr.checkForComodification
+ 0 311481/2 4790260421376 7 <- java/util/AbstractList$Itr.checkForComodification
+ 0 311481/2 4790260421384 8 -> java/util/ArrayList.get
+ 0 311481/2 4790260421391 7 -> java/util/ArrayList.RangeCheck
+ 0 311481/2 4790260421398 7 <- java/util/ArrayList.RangeCheck
+ 0 311481/2 4790260421406 7 <- java/util/ArrayList.get
+ 0 311481/2 4790260421414 7 <- java/util/AbstractList$Itr.next
+ 0 311481/2 4790260421422 8 -> java/lang/ApplicationShutdownHooks.run
+ 0 311481/2 4790260421435 13 -> java/util/IdentityHashMap.keySet
+ 0 311481/2 4790260421598 163 -> java/util/IdentityHashMap$KeySet.<init>
+ 0 311481/2 4790260421610 11 -> java/util/IdentityHashMap$KeySet.<init>
+ 0 311481/2 4790260421622 11 -> java/util/AbstractSet.<init>
+ 0 311481/2 4790260421629 7 -> java/util/AbstractCollection.<init>
+ 0 311481/2 4790260421637 7 -> java/lang/Object.<init>
+ 0 311481/2 4790260421644 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260421652 8 <- java/util/AbstractCollection.<init>
+ 0 311481/2 4790260421660 7 <- java/util/AbstractSet.<init>
+ 0 311481/2 4790260421668 7 <- java/util/IdentityHashMap$KeySet.<init>
+ 0 311481/2 4790260421675 7 <- java/util/IdentityHashMap$KeySet.<init>
+ 0 311481/2 4790260421683 7 <- java/util/IdentityHashMap.keySet
+ 0 311481/2 4790260421695 11 -> java/util/IdentityHashMap$KeySet.iterator
+ 0 311481/2 4790260421882 187 -> java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311481/2 4790260421894 11 -> java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311481/2 4790260421905 11 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311481/2 4790260421915 10 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311481/2 4790260421926 10 -> java/lang/Object.<init>
+ 0 311481/2 4790260421934 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260421945 11 -> java/util/IdentityHashMap.access$000
+ 0 311481/2 4790260421954 8 <- java/util/IdentityHashMap.access$000
+ 0 311481/2 4790260421967 12 -> java/util/IdentityHashMap.access$200
+ 0 311481/2 4790260421975 8 <- java/util/IdentityHashMap.access$200
+ 0 311481/2 4790260421986 10 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311481/2 4790260421994 8 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311481/2 4790260422002 7 <- java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311481/2 4790260422010 7 <- java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311481/2 4790260422018 7 <- java/util/IdentityHashMap$KeySet.iterator
+ 0 311481/2 4790260422029 11 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+ 0 311481/2 4790260422037 8 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+ 0 311481/2 4790260422045 8 -> java/util/IdentityHashMap$KeySet.iterator
+ 0 311481/2 4790260422053 7 -> java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311481/2 4790260422060 7 -> java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311481/2 4790260422068 7 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311481/2 4790260422075 7 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311481/2 4790260422083 7 -> java/lang/Object.<init>
+ 0 311481/2 4790260422090 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260422098 8 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311481/2 4790260422106 8 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 0 311481/2 4790260422114 7 <- java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311481/2 4790260422121 7 <- java/util/IdentityHashMap$KeyIterator.<init>
+ 0 311481/2 4790260422129 7 <- java/util/IdentityHashMap$KeySet.iterator
+ 0 311481/2 4790260422137 7 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+ 0 311481/2 4790260422145 7 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+ 0 311481/2 4790260422153 8 <- java/lang/ApplicationShutdownHooks.run
+ 0 311481/2 4790260422161 7 -> java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260422168 7 <- java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260422176 7 -> java/util/AbstractList$Itr.next
+ 0 311481/2 4790260422183 7 -> java/util/AbstractList$Itr.checkForComodification
+ 0 311481/2 4790260422191 7 <- java/util/AbstractList$Itr.checkForComodification
+ 0 311481/2 4790260422199 8 -> java/util/ArrayList.get
+ 0 311481/2 4790260422206 7 -> java/util/ArrayList.RangeCheck
+ 0 311481/2 4790260422213 7 <- java/util/ArrayList.RangeCheck
+ 0 311481/2 4790260422221 7 <- java/util/ArrayList.get
+ 0 311481/2 4790260422229 7 <- java/util/AbstractList$Itr.next
+ 0 311481/2 4790260422237 8 -> java/io/File$1.run
+ 0 311481/2 4790260422318 81 -> java/io/DeleteOnExitHook.<clinit>
+ 0 311481/2 4790260422461 143 -> java/util/LinkedHashSet.<init>
+ 0 311481/2 4790260422473 12 -> java/util/HashSet.<init>
+ 0 311481/2 4790260422481 7 -> java/util/AbstractSet.<init>
+ 0 311481/2 4790260422488 7 -> java/util/AbstractCollection.<init>
+ 0 311481/2 4790260422495 7 -> java/lang/Object.<init>
+ 0 311481/2 4790260422502 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260422511 8 <- java/util/AbstractCollection.<init>
+ 0 311481/2 4790260422519 7 <- java/util/AbstractSet.<init>
+ 0 311481/2 4790260422531 12 -> java/util/LinkedHashMap.<init>
+ 0 311481/2 4790260422541 10 -> java/util/HashMap.<init>
+ 0 311481/2 4790260422549 7 -> java/util/AbstractMap.<init>
+ 0 311481/2 4790260422556 7 -> java/lang/Object.<init>
+ 0 311481/2 4790260422563 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260422571 7 <- java/util/AbstractMap.<init>
+ 0 311481/2 4790260422580 9 -> java/lang/Float.isNaN
+ 0 311481/2 4790260422588 7 <- java/lang/Float.isNaN
+ 0 311481/2 4790260422600 12 -> java/util/LinkedHashMap.init
+ 0 311481/2 4790260422608 8 -> java/util/LinkedHashMap$Entry.<init>
+ 0 311481/2 4790260422615 7 -> java/util/HashMap$Entry.<init>
+ 0 311481/2 4790260422623 7 -> java/lang/Object.<init>
+ 0 311481/2 4790260422630 6 <- java/lang/Object.<init>
+ 0 311481/2 4790260422638 7 <- java/util/HashMap$Entry.<init>
+ 0 311481/2 4790260422645 7 <- java/util/LinkedHashMap$Entry.<init>
+ 0 311481/2 4790260422653 7 <- java/util/LinkedHashMap.init
+ 0 311481/2 4790260422660 7 <- java/util/HashMap.<init>
+ 0 311481/2 4790260422668 7 <- java/util/LinkedHashMap.<init>
+ 0 311481/2 4790260422676 7 <- java/util/HashSet.<init>
+ 0 311481/2 4790260422683 7 <- java/util/LinkedHashSet.<init>
+ 0 311481/2 4790260422692 9 <- java/io/DeleteOnExitHook.<clinit>
+ 0 311481/2 4790260422703 10 -> java/io/DeleteOnExitHook.hook
+ 0 311481/2 4790260422713 10 -> java/io/DeleteOnExitHook.<init>
+ 0 311481/2 4790260422723 9 -> java/lang/Object.<init>
+ 0 311481/2 4790260422730 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260422738 7 <- java/io/DeleteOnExitHook.<init>
+ 0 311481/2 4790260422746 7 <- java/io/DeleteOnExitHook.hook
+ 0 311481/2 4790260422756 10 -> java/io/DeleteOnExitHook.run
+ 0 311481/2 4790260422768 12 -> java/util/ArrayList.<init>
+ 0 311481/2 4790260422775 7 -> java/util/AbstractList.<init>
+ 0 311481/2 4790260422783 7 -> java/util/AbstractCollection.<init>
+ 0 311481/2 4790260422790 7 -> java/lang/Object.<init>
+ 0 311481/2 4790260422797 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260422805 7 <- java/util/AbstractCollection.<init>
+ 0 311481/2 4790260422813 7 <- java/util/AbstractList.<init>
+ 0 311481/2 4790260422824 11 -> java/util/AbstractCollection.toArray
+ 0 311481/2 4790260422835 10 -> java/util/HashSet.size
+ 0 311481/2 4790260422844 9 <- java/util/HashSet.size
+ 0 311481/2 4790260422855 10 -> java/util/HashSet.iterator
+ 0 311481/2 4790260422865 9 -> java/util/HashMap.keySet
+ 0 311481/2 4790260422956 91 -> java/util/HashMap$KeySet.<init>
+ 0 311481/2 4790260422967 10 -> java/util/HashMap$KeySet.<init>
+ 0 311481/2 4790260422978 10 -> java/util/AbstractSet.<init>
+ 0 311481/2 4790260422985 7 -> java/util/AbstractCollection.<init>
+ 0 311481/2 4790260422993 7 -> java/lang/Object.<init>
+ 0 311481/2 4790260423000 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260423008 7 <- java/util/AbstractCollection.<init>
+ 0 311481/2 4790260423015 7 <- java/util/AbstractSet.<init>
+ 0 311481/2 4790260423023 7 <- java/util/HashMap$KeySet.<init>
+ 0 311481/2 4790260423031 7 <- java/util/HashMap$KeySet.<init>
+ 0 311481/2 4790260423038 7 <- java/util/HashMap.keySet
+ 0 311481/2 4790260423049 10 -> java/util/HashMap$KeySet.iterator
+ 0 311481/2 4790260423060 11 -> java/util/LinkedHashMap.newKeyIterator
+ 0 311481/2 4790260423243 182 -> java/util/LinkedHashMap$KeyIterator.<init>
+ 0 311481/2 4790260423254 11 -> java/util/LinkedHashMap$KeyIterator.<init>
+ 0 311481/2 4790260423266 11 -> java/util/LinkedHashMap$LinkedHashIterator.<init>
+ 0 311481/2 4790260423276 9 -> java/util/LinkedHashMap$LinkedHashIterator.<init>
+ 0 311481/2 4790260423286 10 -> java/lang/Object.<init>
+ 0 311481/2 4790260423294 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260423311 16 <- java/util/LinkedHashMap$LinkedHashIterator.<init>
+ 0 311481/2 4790260423319 8 <- java/util/LinkedHashMap$LinkedHashIterator.<init>
+ 0 311481/2 4790260423327 7 <- java/util/LinkedHashMap$KeyIterator.<init>
+ 0 311481/2 4790260423334 7 <- java/util/LinkedHashMap$KeyIterator.<init>
+ 0 311481/2 4790260423342 7 <- java/util/LinkedHashMap.newKeyIterator
+ 0 311481/2 4790260423350 7 <- java/util/HashMap$KeySet.iterator
+ 0 311481/2 4790260423357 7 <- java/util/HashSet.iterator
+ 0 311481/2 4790260423369 11 -> java/util/LinkedHashMap$LinkedHashIterator.hasNext
+ 0 311481/2 4790260423377 8 <- java/util/LinkedHashMap$LinkedHashIterator.hasNext
+ 0 311481/2 4790260423385 8 <- java/util/AbstractCollection.toArray
+ 0 311481/2 4790260423393 8 -> java/lang/Object.getClass
+ 0 311481/2 4790260423402 8 <- java/lang/Object.getClass
+ 0 311481/2 4790260423410 8 <- java/util/ArrayList.<init>
+ 0 311481/2 4790260423422 11 -> java/util/Collections.reverse
+ 0 311481/2 4790260423435 13 <- java/util/Collections.reverse
+ 0 311481/2 4790260423445 10 -> java/util/AbstractList.iterator
+ 0 311481/2 4790260423453 8 -> java/util/AbstractList$Itr.<init>
+ 0 311481/2 4790260423460 7 -> java/util/AbstractList$Itr.<init>
+ 0 311481/2 4790260423468 7 -> java/lang/Object.<init>
+ 0 311481/2 4790260423475 7 <- java/lang/Object.<init>
+ 0 311481/2 4790260423483 7 <- java/util/AbstractList$Itr.<init>
+ 0 311481/2 4790260423490 7 <- java/util/AbstractList$Itr.<init>
+ 0 311481/2 4790260423498 7 <- java/util/AbstractList.iterator
+ 0 311481/2 4790260423508 10 -> java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260423516 7 <- java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260423524 8 <- java/io/DeleteOnExitHook.run
+ 0 311481/2 4790260423532 7 <- java/io/File$1.run
+ 0 311481/2 4790260423539 7 -> java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260423547 7 <- java/util/AbstractList$Itr.hasNext
+ 0 311481/2 4790260423554 7 <- java/lang/Shutdown.runHooks
+ 0 311481/2 4790260423564 9 <- java/lang/Shutdown.sequence
+ 0 311481/2 4790260423572 7 <- java/lang/Shutdown.shutdown
+
+I truncated 22800 lines from the above output to make it fit here.
+
+The fifth column is indented by 2 spaces to show when a new method begins.
+This shows which method is calling which.
+
+The TIME(us) column shows time since boot.
+
+The DELTA(us) column shows time from that line to the previous line, and
+so can be a bit tricky to read.
+
+The FILE column shows file that was being executed.
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+Try skimming down the "DELTA(us)" column to find the largest delta time,
+and see what lines it corresponds with.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
+If you see "drops" warnings, see the Notes/ALLjava_notes.txt file for details.
+
diff --git a/Examples/j_methodcalls_example.txt b/Examples/j_methodcalls_example.txt
new file mode 100644
index 000000000000..22a2b4d1a7e9
--- /dev/null
+++ b/Examples/j_methodcalls_example.txt
@@ -0,0 +1,999 @@
+The following are examples of running the j_methodcalls.d script.
+
+This traces calls to methods from all Java processes on the system with hotspot
+provider support (1.6.0). Method calls are only visible when using the flag
+"+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+
+Here we see it running on Code/Java/Func_abc
+
+# j_methodcalls_example.txt
+Tracing... Hit Ctrl-C to end.
+
+ PID COUNT CLASS.METHOD
+ 311492 1 Func_abc.func_a
+ 311492 1 Func_abc.func_b
+ 311492 1 Func_abc.func_c
+ 311492 1 Func_abc.main
+ 311492 1 java/io/BufferedInputStream.<clinit>
+ 311492 1 java/io/BufferedReader.<clinit>
+ 311492 1 java/io/BufferedReader.close
+ 311492 1 java/io/BufferedWriter.<clinit>
+ 311492 1 java/io/Console$1$1.<init>
+ 311492 1 java/io/Console$1$1.run
+ 311492 1 java/io/Console$1.<init>
+ 311492 1 java/io/Console$1.consoleRestoreHook
+ 311492 1 java/io/Console.<clinit>
+ 311492 1 java/io/Console.access$600
+ 311492 1 java/io/DataInputStream.<init>
+ 311492 1 java/io/DataInputStream.readFully
+ 311492 1 java/io/DeleteOnExitHook.<clinit>
+ 311492 1 java/io/DeleteOnExitHook.<init>
+ 311492 1 java/io/DeleteOnExitHook.hook
+ 311492 1 java/io/DeleteOnExitHook.run
+ 311492 1 java/io/File$1.<init>
+ 311492 1 java/io/File$1.run
+ 311492 1 java/io/File.<clinit>
+ 311492 1 java/io/File.lastModified
+ 311492 1 java/io/File.length
+ 311492 1 java/io/FileDescriptor.<clinit>
+ 311492 1 java/io/FileDescriptor.initIDs
+ 311492 1 java/io/FileInputStream.<clinit>
+ 311492 1 java/io/FileInputStream.available
+ 311492 1 java/io/FileInputStream.initIDs
+ 311492 1 java/io/FileOutputStream.<clinit>
+ 311492 1 java/io/FileOutputStream.initIDs
+ 311492 1 java/io/FilePermission.newPermissionCollection
+ 311492 1 java/io/FilePermissionCollection.<clinit>
+ 311492 1 java/io/FilePermissionCollection.<init>
+ 311492 1 java/io/FilePermissionCollection.add
+ 311492 1 java/io/FileReader.<init>
+ 311492 1 java/io/FileSystem.<clinit>
+ 311492 1 java/io/FileSystem.<init>
+ 311492 1 java/io/FileSystem.getFileSystem
+ 311492 1 java/io/FilterInputStream.close
+ 311492 1 java/io/InputStreamReader.<init>
+ 311492 1 java/io/InputStreamReader.close
+ 311492 1 java/io/ObjectStreamClass.<clinit>
+ 311492 1 java/io/ObjectStreamClass.initNative
+ 311492 1 java/io/UnixFileSystem.<clinit>
+ 311492 1 java/io/UnixFileSystem.<init>
+ 311492 1 java/io/UnixFileSystem.getLastModifiedTime
+ 311492 1 java/io/UnixFileSystem.getLength
+ 311492 1 java/io/UnixFileSystem.initIDs
+ 311492 1 java/lang/AbstractStringBuilder.<clinit>
+ 311492 1 java/lang/ApplicationShutdownHooks.<clinit>
+ 311492 1 java/lang/ApplicationShutdownHooks.<init>
+ 311492 1 java/lang/ApplicationShutdownHooks.hook
+ 311492 1 java/lang/ApplicationShutdownHooks.run
+ 311492 1 java/lang/Boolean.<clinit>
+ 311492 1 java/lang/Byte.<clinit>
+ 311492 1 java/lang/Character.<clinit>
+ 311492 1 java/lang/CharacterDataLatin1.<clinit>
+ 311492 1 java/lang/Class.<clinit>
+ 311492 1 java/lang/Class.access$302
+ 311492 1 java/lang/Class.registerNatives
+ 311492 1 java/lang/ClassLoader$3.<init>
+ 311492 1 java/lang/ClassLoader$3.run
+ 311492 1 java/lang/ClassLoader$NativeLibrary.<init>
+ 311492 1 java/lang/ClassLoader$NativeLibrary.getFromClass
+ 311492 1 java/lang/ClassLoader$NativeLibrary.load
+ 311492 1 java/lang/ClassLoader.<clinit>
+ 311492 1 java/lang/ClassLoader.access$100
+ 311492 1 java/lang/ClassLoader.addClass
+ 311492 1 java/lang/ClassLoader.checkCerts
+ 311492 1 java/lang/ClassLoader.defineClass
+ 311492 1 java/lang/ClassLoader.defineClass1
+ 311492 1 java/lang/ClassLoader.defineClassSourceLocation
+ 311492 1 java/lang/ClassLoader.getSystemClassLoader
+ 311492 1 java/lang/ClassLoader.initSystemClassLoader
+ 311492 1 java/lang/ClassLoader.loadLibrary
+ 311492 1 java/lang/ClassLoader.loadLibrary0
+ 311492 1 java/lang/ClassLoader.postDefineClass
+ 311492 1 java/lang/ClassLoader.preDefineClass
+ 311492 1 java/lang/ClassLoader.registerNatives
+ 311492 1 java/lang/Compiler$1.<init>
+ 311492 1 java/lang/Compiler$1.run
+ 311492 1 java/lang/Compiler.<clinit>
+ 311492 1 java/lang/Compiler.registerNatives
+ 311492 1 java/lang/Double.<clinit>
+ 311492 1 java/lang/Double.doubleToLongBits
+ 311492 1 java/lang/Double.doubleToRawLongBits
+ 311492 1 java/lang/Error.<init>
+ 311492 1 java/lang/Float.<clinit>
+ 311492 1 java/lang/Float.floatToIntBits
+ 311492 1 java/lang/Float.floatToRawIntBits
+ 311492 1 java/lang/IncompatibleClassChangeError.<init>
+ 311492 1 java/lang/Integer.<clinit>
+ 311492 1 java/lang/LinkageError.<init>
+ 311492 1 java/lang/Long.<clinit>
+ 311492 1 java/lang/Math.<clinit>
+ 311492 1 java/lang/NoSuchMethodError.<init>
+ 311492 1 java/lang/Object.<clinit>
+ 311492 1 java/lang/Object.notifyAll
+ 311492 1 java/lang/Object.registerNatives
+ 311492 1 java/lang/Runtime.<clinit>
+ 311492 1 java/lang/Runtime.<init>
+ 311492 1 java/lang/Runtime.loadLibrary0
+ 311492 1 java/lang/Runtime.maxMemory
+ 311492 1 java/lang/Short.<clinit>
+ 311492 1 java/lang/Shutdown.<clinit>
+ 311492 1 java/lang/Shutdown.runHooks
+ 311492 1 java/lang/Shutdown.sequence
+ 311492 1 java/lang/Shutdown.shutdown
+ 311492 1 java/lang/String.<clinit>
+ 311492 1 java/lang/String.checkBounds
+ 311492 1 java/lang/String.length
+ 311492 1 java/lang/String.trim
+ 311492 1 java/lang/StringBuffer.<clinit>
+ 311492 1 java/lang/StringCoding$StringDecoder.decode
+ 311492 1 java/lang/StringCoding.<clinit>
+ 311492 1 java/lang/StringCoding.access$000
+ 311492 1 java/lang/StringCoding.access$100
+ 311492 1 java/lang/StringCoding.decode
+ 311492 1 java/lang/StringCoding.deref
+ 311492 1 java/lang/StringCoding.lookupCharset
+ 311492 1 java/lang/StringCoding.safeTrim
+ 311492 1 java/lang/StringCoding.scale
+ 311492 1 java/lang/StringCoding.set
+ 311492 1 java/lang/System$2.<init>
+ 311492 1 java/lang/System.<clinit>
+ 311492 1 java/lang/System.getCallerClass
+ 311492 1 java/lang/System.initProperties
+ 311492 1 java/lang/System.initializeSystemClass
+ 311492 1 java/lang/System.loadLibrary
+ 311492 1 java/lang/System.mapLibraryName
+ 311492 1 java/lang/System.nullInputStream
+ 311492 1 java/lang/System.registerNatives
+ 311492 1 java/lang/System.setErr0
+ 311492 1 java/lang/System.setIn0
+ 311492 1 java/lang/System.setOut0
+ 311492 1 java/lang/SystemClassLoaderAction.<init>
+ 311492 1 java/lang/SystemClassLoaderAction.run
+ 311492 1 java/lang/Terminator$1.<init>
+ 311492 1 java/lang/Terminator.<clinit>
+ 311492 1 java/lang/Terminator.setup
+ 311492 1 java/lang/Thread.<clinit>
+ 311492 1 java/lang/Thread.exit
+ 311492 1 java/lang/Thread.getPriority
+ 311492 1 java/lang/Thread.interrupted
+ 311492 1 java/lang/Thread.isInterrupted
+ 311492 1 java/lang/Thread.registerNatives
+ 311492 1 java/lang/Thread.setContextClassLoader
+ 311492 1 java/lang/ThreadGroup.remove
+ 311492 1 java/lang/ThreadLocal$ThreadLocalMap$Entry.<init>
+ 311492 1 java/lang/ThreadLocal$ThreadLocalMap.<init>
+ 311492 1 java/lang/ThreadLocal$ThreadLocalMap.access$100
+ 311492 1 java/lang/ThreadLocal$ThreadLocalMap.set
+ 311492 1 java/lang/ThreadLocal$ThreadLocalMap.setThreshold
+ 311492 1 java/lang/ThreadLocal.<clinit>
+ 311492 1 java/lang/ThreadLocal.createMap
+ 311492 1 java/lang/ThreadLocal.get
+ 311492 1 java/lang/ThreadLocal.initialValue
+ 311492 1 java/lang/ThreadLocal.set
+ 311492 1 java/lang/ThreadLocal.setInitialValue
+ 311492 1 java/lang/ref/Finalizer$FinalizerThread.<init>
+ 311492 1 java/lang/ref/Finalizer$FinalizerThread.run
+ 311492 1 java/lang/ref/Finalizer.<clinit>
+ 311492 1 java/lang/ref/Finalizer.access$000
+ 311492 1 java/lang/ref/Reference$ReferenceHandler.<init>
+ 311492 1 java/lang/ref/Reference$ReferenceHandler.run
+ 311492 1 java/lang/ref/Reference.<clinit>
+ 311492 1 java/lang/ref/Reference.access$200
+ 311492 1 java/lang/ref/ReferenceQueue.<clinit>
+ 311492 1 java/lang/ref/ReferenceQueue.reallyPoll
+ 311492 1 java/lang/reflect/AccessibleObject.<clinit>
+ 311492 1 java/lang/reflect/Constructor.<clinit>
+ 311492 1 java/lang/reflect/Field.<clinit>
+ 311492 1 java/lang/reflect/Field.getName
+ 311492 1 java/lang/reflect/Method.<clinit>
+ 311492 1 java/lang/reflect/Method.getModifiers
+ 311492 1 java/lang/reflect/Modifier.<clinit>
+ 311492 1 java/lang/reflect/Modifier.isVolatile
+ 311492 1 java/lang/reflect/ReflectAccess.<init>
+ 311492 1 java/lang/reflect/ReflectPermission.<init>
+ 311492 1 java/net/ContentHandler.<init>
+ 311492 1 java/net/Parts.getQuery
+ 311492 1 java/net/URL.<clinit>
+ 311492 1 java/net/URL.openConnection
+ 311492 1 java/net/URLClassLoader$7.<init>
+ 311492 1 java/net/URLClassLoader.<clinit>
+ 311492 1 java/net/URLClassLoader.access$000
+ 311492 1 java/net/URLClassLoader.defineClass
+ 311492 1 java/net/URLClassLoader.getPermissions
+ 311492 1 java/net/URLConnection.<clinit>
+ 311492 1 java/net/URLConnection.<init>
+ 311492 1 java/net/UnknownContentHandler.<init>
+ 311492 1 java/nio/Bits.<clinit>
+ 311492 1 java/nio/ByteOrder.<clinit>
+ 311492 1 java/nio/charset/Charset.<clinit>
+ 311492 1 java/nio/charset/Charset.<init>
+ 311492 1 java/nio/charset/CharsetDecoder.<clinit>
+ 311492 1 java/nio/charset/CharsetDecoder.flush
+ 311492 1 java/nio/charset/CharsetDecoder.implFlush
+ 311492 1 java/nio/charset/CharsetEncoder.<clinit>
+ 311492 1 java/nio/charset/CoderResult$1.<init>
+ 311492 1 java/nio/charset/CoderResult$2.<init>
+ 311492 1 java/nio/charset/CoderResult.<clinit>
+ 311492 1 java/nio/charset/CodingErrorAction.<clinit>
+ 311492 1 java/nio/charset/spi/CharsetProvider.<init>
+ 311492 1 java/security/AccessControlContext.<clinit>
+ 311492 1 java/security/BasicPermission.newPermissionCollection
+ 311492 1 java/security/BasicPermissionCollection.<clinit>
+ 311492 1 java/security/BasicPermissionCollection.<init>
+ 311492 1 java/security/BasicPermissionCollection.add
+ 311492 1 java/security/CodeSource.<init>
+ 311492 1 java/security/Permissions.<clinit>
+ 311492 1 java/security/Policy$UnsupportedEmptyCollection.<init>
+ 311492 1 java/security/Policy.<clinit>
+ 311492 1 java/security/PrivilegedActionException.<init>
+ 311492 1 java/security/ProtectionDomain.<clinit>
+ 311492 1 java/security/ProtectionDomain.<init>
+ 311492 1 java/security/SecureClassLoader.<clinit>
+ 311492 1 java/security/SecureClassLoader.check
+ 311492 1 java/security/SecureClassLoader.defineClass
+ 311492 1 java/security/SecureClassLoader.getPermissions
+ 311492 1 java/security/SecureClassLoader.getProtectionDomain
+ 311492 1 java/util/AbstractCollection.toArray
+ 311492 1 java/util/BitSet.<clinit>
+ 311492 1 java/util/BitSet.<init>
+ 311492 1 java/util/BitSet.initWords
+ 311492 1 java/util/Collections$SynchronizedMap.<init>
+ 311492 1 java/util/Collections.<clinit>
+ 311492 1 java/util/Collections.reverse
+ 311492 1 java/util/Collections.synchronizedMap
+ 311492 1 java/util/HashMap$KeySet.iterator
+ 311492 1 java/util/HashMap.keySet
+ 311492 1 java/util/HashMap.size
+ 311492 1 java/util/HashSet.<clinit>
+ 311492 1 java/util/HashSet.iterator
+ 311492 1 java/util/HashSet.size
+ 311492 1 java/util/Hashtable$EmptyEnumerator.<init>
+ 311492 1 java/util/Hashtable$EmptyIterator.<init>
+ 311492 1 java/util/Hashtable.<clinit>
+ 311492 1 java/util/IdentityHashMap.<clinit>
+ 311492 1 java/util/IdentityHashMap.<init>
+ 311492 1 java/util/IdentityHashMap.access$000
+ 311492 1 java/util/IdentityHashMap.access$200
+ 311492 1 java/util/IdentityHashMap.init
+ 311492 1 java/util/IdentityHashMap.keySet
+ 311492 1 java/util/LinkedHashMap$LinkedHashIterator.hasNext
+ 311492 1 java/util/LinkedHashMap.newKeyIterator
+ 311492 1 java/util/LinkedHashSet.<init>
+ 311492 1 java/util/Locale.<clinit>
+ 311492 1 java/util/Locale.getInstance
+ 311492 1 java/util/Properties.<clinit>
+ 311492 1 java/util/StringTokenizer.countTokens
+ 311492 1 java/util/StringTokenizer.hasMoreTokens
+ 311492 1 java/util/Vector.contains
+ 311492 1 java/util/Vector.copyInto
+ 311492 1 java/util/Vector.indexOf
+ 311492 1 java/util/concurrent/ConcurrentHashMap$Segment.get
+ 311492 1 java/util/concurrent/ConcurrentHashMap$Segment.getFirst
+ 311492 1 java/util/concurrent/ConcurrentHashMap$Segment.newArray
+ 311492 1 java/util/concurrent/ConcurrentHashMap.get
+ 311492 1 java/util/concurrent/atomic/AtomicInteger.<clinit>
+ 311492 1 java/util/concurrent/atomic/AtomicInteger.<init>
+ 311492 1 java/util/concurrent/atomic/AtomicInteger.get
+ 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<clinit>
+ 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<init>
+ 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater.<init>
+ 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater.newUpdater
+ 311492 1 java/util/concurrent/locks/AbstractQueuedSynchronizer.<clinit>
+ 311492 1 java/util/concurrent/locks/AbstractQueuedSynchronizer.getState
+ 311492 1 java/util/jar/JarEntry.<init>
+ 311492 1 java/util/jar/JarFile$JarFileEntry.<init>
+ 311492 1 java/util/jar/JarFile.<clinit>
+ 311492 1 java/util/jar/JarFile.getManEntry
+ 311492 1 java/util/jar/JarFile.hasClassPathAttribute
+ 311492 1 java/util/jar/JarFile.isKnownToNotHaveClassPathAttribute
+ 311492 1 java/util/jar/JavaUtilJarAccessImpl.<init>
+ 311492 1 java/util/jar/JavaUtilJarAccessImpl.jarFileHasClassPathAttribute
+ 311492 1 java/util/zip/Inflater.<clinit>
+ 311492 1 java/util/zip/Inflater.<init>
+ 311492 1 java/util/zip/Inflater.finished
+ 311492 1 java/util/zip/Inflater.init
+ 311492 1 java/util/zip/Inflater.initIDs
+ 311492 1 java/util/zip/Inflater.needsDictionary
+ 311492 1 java/util/zip/Inflater.needsInput
+ 311492 1 java/util/zip/Inflater.setInput
+ 311492 1 java/util/zip/InflaterInputStream.<init>
+ 311492 1 java/util/zip/InflaterInputStream.ensureOpen
+ 311492 1 java/util/zip/InflaterInputStream.read
+ 311492 1 java/util/zip/ZipEntry.<clinit>
+ 311492 1 java/util/zip/ZipEntry.getSize
+ 311492 1 java/util/zip/ZipEntry.initFields
+ 311492 1 java/util/zip/ZipEntry.initIDs
+ 311492 1 java/util/zip/ZipFile$1.<init>
+ 311492 1 java/util/zip/ZipFile$1.close
+ 311492 1 java/util/zip/ZipFile$1.fill
+ 311492 1 java/util/zip/ZipFile$ZipFileInputStream.<init>
+ 311492 1 java/util/zip/ZipFile$ZipFileInputStream.read
+ 311492 1 java/util/zip/ZipFile.<clinit>
+ 311492 1 java/util/zip/ZipFile.<init>
+ 311492 1 java/util/zip/ZipFile.access$000
+ 311492 1 java/util/zip/ZipFile.access$1000
+ 311492 1 java/util/zip/ZipFile.access$1100
+ 311492 1 java/util/zip/ZipFile.access$1200
+ 311492 1 java/util/zip/ZipFile.access$800
+ 311492 1 java/util/zip/ZipFile.access$900
+ 311492 1 java/util/zip/ZipFile.ensureOpenOrZipException
+ 311492 1 java/util/zip/ZipFile.getCSize
+ 311492 1 java/util/zip/ZipFile.getInflater
+ 311492 1 java/util/zip/ZipFile.getMethod
+ 311492 1 java/util/zip/ZipFile.getTotal
+ 311492 1 java/util/zip/ZipFile.initIDs
+ 311492 1 java/util/zip/ZipFile.open
+ 311492 1 java/util/zip/ZipFile.read
+ 311492 1 java/util/zip/ZipFile.releaseInflater
+ 311492 1 sun/misc/ExtensionDependency.checkExtensionsDependencies
+ 311492 1 sun/misc/FileURLMapper.<init>
+ 311492 1 sun/misc/FileURLMapper.exists
+ 311492 1 sun/misc/JarIndex.getJarIndex
+ 311492 1 sun/misc/Launcher$AppClassLoader$1.<init>
+ 311492 1 sun/misc/Launcher$AppClassLoader$1.run
+ 311492 1 sun/misc/Launcher$AppClassLoader.<clinit>
+ 311492 1 sun/misc/Launcher$AppClassLoader.<init>
+ 311492 1 sun/misc/Launcher$AppClassLoader.getAppClassLoader
+ 311492 1 sun/misc/Launcher$AppClassLoader.getPermissions
+ 311492 1 sun/misc/Launcher$ExtClassLoader$1.<init>
+ 311492 1 sun/misc/Launcher$ExtClassLoader$1.run
+ 311492 1 sun/misc/Launcher$ExtClassLoader.<init>
+ 311492 1 sun/misc/Launcher$ExtClassLoader.getExtClassLoader
+ 311492 1 sun/misc/Launcher$ExtClassLoader.getExtDirs
+ 311492 1 sun/misc/Launcher$ExtClassLoader.getExtURLs
+ 311492 1 sun/misc/Launcher$Factory.<clinit>
+ 311492 1 sun/misc/Launcher.<clinit>
+ 311492 1 sun/misc/Launcher.<init>
+ 311492 1 sun/misc/Launcher.access$200
+ 311492 1 sun/misc/Launcher.access$300
+ 311492 1 sun/misc/Launcher.getClassPath
+ 311492 1 sun/misc/Launcher.getLauncher
+ 311492 1 sun/misc/Launcher.pathToURLs
+ 311492 1 sun/misc/MetaIndex.<clinit>
+ 311492 1 sun/misc/Resource.<init>
+ 311492 1 sun/misc/Resource.getByteBuffer
+ 311492 1 sun/misc/Resource.getBytes
+ 311492 1 sun/misc/Resource.getCodeSigners
+ 311492 1 sun/misc/SharedSecrets.<clinit>
+ 311492 1 sun/misc/SharedSecrets.getJavaIOAccess
+ 311492 1 sun/misc/SharedSecrets.getJavaIODeleteOnExitAccess
+ 311492 1 sun/misc/SharedSecrets.javaUtilJarAccess
+ 311492 1 sun/misc/SharedSecrets.setJavaIOAccess
+ 311492 1 sun/misc/SharedSecrets.setJavaIODeleteOnExitAccess
+ 311492 1 sun/misc/SharedSecrets.setJavaLangAccess
+ 311492 1 sun/misc/SharedSecrets.setJavaNetAccess
+ 311492 1 sun/misc/SharedSecrets.setJavaUtilJarAccess
+ 311492 1 sun/misc/Signal.<clinit>
+ 311492 1 sun/misc/SignalHandler.<clinit>
+ 311492 1 sun/misc/SoftCache.<init>
+ 311492 1 sun/misc/URLClassPath$FileLoader$1.<init>
+ 311492 1 sun/misc/URLClassPath$FileLoader$1.getCodeSourceURL
+ 311492 1 sun/misc/URLClassPath$FileLoader$1.getContentLength
+ 311492 1 sun/misc/URLClassPath$FileLoader$1.getInputStream
+ 311492 1 sun/misc/URLClassPath$FileLoader.<init>
+ 311492 1 sun/misc/URLClassPath$FileLoader.getResource
+ 311492 1 sun/misc/URLClassPath$JarLoader$1.<init>
+ 311492 1 sun/misc/URLClassPath$JarLoader$1.run
+ 311492 1 sun/misc/URLClassPath$JarLoader.access$502
+ 311492 1 sun/misc/URLClassPath$JarLoader.access$600
+ 311492 1 sun/misc/URLClassPath$JarLoader.access$702
+ 311492 1 sun/misc/URLClassPath$JarLoader.getJarFile
+ 311492 1 sun/misc/URLClassPath$JarLoader.parseExtensionsDependencies
+ 311492 1 sun/misc/URLClassPath$Loader.getClassPath
+ 311492 1 sun/misc/URLClassPath.<clinit>
+ 311492 1 sun/misc/URLClassPath.access$300
+ 311492 1 sun/misc/Unsafe.<clinit>
+ 311492 1 sun/misc/Unsafe.<init>
+ 311492 1 sun/misc/Unsafe.allocateMemory
+ 311492 1 sun/misc/Unsafe.ensureClassInitialized
+ 311492 1 sun/misc/Unsafe.freeMemory
+ 311492 1 sun/misc/Unsafe.getByte
+ 311492 1 sun/misc/Unsafe.putLong
+ 311492 1 sun/misc/Unsafe.registerNatives
+ 311492 1 sun/misc/VM.<clinit>
+ 311492 1 sun/misc/VM.booted
+ 311492 1 sun/misc/VM.initialize
+ 311492 1 sun/misc/VM.initializeOSEnvironment
+ 311492 1 sun/misc/Version.<clinit>
+ 311492 1 sun/net/www/MessageHeader.<init>
+ 311492 1 sun/net/www/MessageHeader.grow
+ 311492 1 sun/net/www/ParseUtil.<clinit>
+ 311492 1 sun/net/www/URLConnection.<init>
+ 311492 1 sun/net/www/protocol/file/FileURLConnection.<clinit>
+ 311492 1 sun/net/www/protocol/file/FileURLConnection.<init>
+ 311492 1 sun/net/www/protocol/file/FileURLConnection.getPermission
+ 311492 1 sun/net/www/protocol/file/Handler.<init>
+ 311492 1 sun/net/www/protocol/file/Handler.createFileURLConnection
+ 311492 1 sun/nio/cs/FastCharsetProvider.<init>
+ 311492 1 sun/nio/cs/StandardCharsets$Aliases.init
+ 311492 1 sun/nio/cs/StandardCharsets$Cache.init
+ 311492 1 sun/nio/cs/StandardCharsets$Classes.init
+ 311492 1 sun/nio/cs/StandardCharsets.<clinit>
+ 311492 1 sun/nio/cs/StandardCharsets.<init>
+ 311492 1 sun/nio/cs/StreamDecoder.<clinit>
+ 311492 1 sun/nio/cs/StreamDecoder.close
+ 311492 1 sun/nio/cs/StreamDecoder.forInputStreamReader
+ 311492 1 sun/nio/cs/StreamDecoder.implClose
+ 311492 1 sun/nio/cs/StreamDecoder.inReady
+ 311492 1 sun/nio/cs/StreamEncoder.<clinit>
+ 311492 1 sun/nio/cs/Surrogate$Parser.<clinit>
+ 311492 1 sun/nio/cs/US_ASCII$Decoder.<clinit>
+ 311492 1 sun/nio/cs/US_ASCII$Encoder.<clinit>
+ 311492 1 sun/nio/cs/US_ASCII.<init>
+ 311492 1 sun/reflect/Reflection.<clinit>
+ 311492 1 sun/reflect/ReflectionFactory$1.<init>
+ 311492 1 sun/reflect/ReflectionFactory$1.run
+ 311492 1 sun/reflect/ReflectionFactory.<clinit>
+ 311492 1 sun/reflect/ReflectionFactory.<init>
+ 311492 1 sun/reflect/ReflectionFactory.access$202
+ 311492 1 sun/reflect/ReflectionFactory.setLangReflectAccess
+ 311492 1 sun/reflect/misc/ReflectUtil.ensureMemberAccess
+ 311492 1 sun/security/provider/PolicyFile.<clinit>
+ 311492 1 sun/security/util/Debug.<clinit>
+ 311492 2 java/io/BufferedInputStream.<init>
+ 311492 2 java/io/BufferedOutputStream.<init>
+ 311492 2 java/io/BufferedReader.<init>
+ 311492 2 java/io/BufferedReader.fill
+ 311492 2 java/io/ExpiringCache$1.<init>
+ 311492 2 java/io/File.list
+ 311492 2 java/io/FileInputStream.close
+ 311492 2 java/io/FileInputStream.close0
+ 311492 2 java/io/FileInputStream.open
+ 311492 2 java/io/FileOutputStream.<init>
+ 311492 2 java/io/FilePermission$1.<init>
+ 311492 2 java/io/FilePermission.<init>
+ 311492 2 java/io/FilePermission.getMask
+ 311492 2 java/io/FilePermission.init
+ 311492 2 java/io/FileSystem.getBooleanProperty
+ 311492 2 java/io/InputStreamReader.read
+ 311492 2 java/io/OutputStreamWriter.<init>
+ 311492 2 java/io/PrintStream.init
+ 311492 2 java/io/UnixFileSystem.list
+ 311492 2 java/lang/Character.charCount
+ 311492 2 java/lang/CharacterDataLatin1.toUpperCase
+ 311492 2 java/lang/Class$1.<init>
+ 311492 2 java/lang/Class$1.run
+ 311492 2 java/lang/Class.arrayContentsEq
+ 311492 2 java/lang/Class.getConstructor0
+ 311492 2 java/lang/Class.getDeclaredConstructors0
+ 311492 2 java/lang/Class.isInterface
+ 311492 2 java/lang/Class.privateGetDeclaredConstructors
+ 311492 2 java/lang/ClassLoader.<init>
+ 311492 2 java/lang/ClassLoader.initializePath
+ 311492 2 java/lang/ClassNotFoundException.<init>
+ 311492 2 java/lang/Object.clone
+ 311492 2 java/lang/Runtime.getRuntime
+ 311492 2 java/lang/String$CaseInsensitiveComparator.<init>
+ 311492 2 java/lang/String.concat
+ 311492 2 java/lang/String.regionMatches
+ 311492 2 java/lang/StringCoding$StringDecoder.<init>
+ 311492 2 java/lang/System.getProperties
+ 311492 2 java/lang/System.nullPrintStream
+ 311492 2 java/lang/System.setProperties
+ 311492 2 java/lang/Thread.isAlive
+ 311492 2 java/lang/Thread.setDaemon
+ 311492 2 java/lang/Thread.start
+ 311492 2 java/lang/Thread.start0
+ 311492 2 java/lang/ThreadGroup.<init>
+ 311492 2 java/lang/ref/Reference$Lock.<init>
+ 311492 2 java/lang/ref/Reference.access$100
+ 311492 2 java/lang/ref/ReferenceQueue.remove
+ 311492 2 java/lang/ref/SoftReference.get
+ 311492 2 java/lang/reflect/AccessibleObject.setAccessible
+ 311492 2 java/lang/reflect/AccessibleObject.setAccessible0
+ 311492 2 java/lang/reflect/Constructor.<init>
+ 311492 2 java/lang/reflect/Constructor.acquireConstructorAccessor
+ 311492 2 java/lang/reflect/Constructor.copy
+ 311492 2 java/lang/reflect/Constructor.getParameterTypes
+ 311492 2 java/lang/reflect/Modifier.isAbstract
+ 311492 2 java/lang/reflect/Modifier.isProtected
+ 311492 2 java/lang/reflect/ReflectAccess.copyConstructor
+ 311492 2 java/net/URL.set
+ 311492 2 java/net/URLClassLoader$1.<init>
+ 311492 2 java/net/URLClassLoader$1.run
+ 311492 2 java/net/URLClassLoader.<init>
+ 311492 2 java/net/URLClassLoader.findClass
+ 311492 2 java/net/URLStreamHandler.parseURL
+ 311492 2 java/net/URLStreamHandler.setURL
+ 311492 2 java/nio/ByteOrder.<init>
+ 311492 2 java/nio/CharBuffer.allocate
+ 311492 2 java/nio/HeapByteBuffer.compact
+ 311492 2 java/nio/charset/Charset.cache
+ 311492 2 java/nio/charset/CharsetDecoder.reset
+ 311492 2 java/nio/charset/CharsetEncoder.isLegalReplacement
+ 311492 2 java/nio/charset/CharsetEncoder.onMalformedInput
+ 311492 2 java/nio/charset/CharsetEncoder.onUnmappableCharacter
+ 311492 2 java/nio/charset/CharsetEncoder.replaceWith
+ 311492 2 java/nio/charset/CoderResult.<init>
+ 311492 2 java/nio/charset/CoderResult.isError
+ 311492 2 java/security/AccessControlContext.<init>
+ 311492 2 java/security/BasicPermission.getCanonicalName
+ 311492 2 java/security/CodeSource.getCertificates
+ 311492 2 java/security/CodeSource.hashCode
+ 311492 2 java/security/PermissionCollection.setReadOnly
+ 311492 2 java/security/Permissions.<init>
+ 311492 2 java/security/Permissions.add
+ 311492 2 java/security/Permissions.getPermissionCollection
+ 311492 2 java/security/SecureClassLoader.<init>
+ 311492 2 java/util/AbstractList.iterator
+ 311492 2 java/util/BitSet.ensureCapacity
+ 311492 2 java/util/Collections$EmptyList.<init>
+ 311492 2 java/util/Collections$EmptyMap.<init>
+ 311492 2 java/util/Collections$EmptySet.<init>
+ 311492 2 java/util/Collections$ReverseComparator.<init>
+ 311492 2 java/util/HashMap$KeySet.<init>
+ 311492 2 java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+ 311492 2 java/util/IdentityHashMap$KeySet.<init>
+ 311492 2 java/util/IdentityHashMap$KeySet.iterator
+ 311492 2 java/util/LinkedHashMap$KeyIterator.<init>
+ 311492 2 java/util/LinkedHashMap$LinkedHashIterator.<init>
+ 311492 2 java/util/Properties.<init>
+ 311492 2 java/util/StringTokenizer.setMaxDelimCodePoint
+ 311492 2 java/util/concurrent/ConcurrentHashMap.<init>
+ 311492 2 java/util/jar/JarFile.<init>
+ 311492 2 java/util/zip/Inflater.inflate
+ 311492 2 java/util/zip/Inflater.inflateBytes
+ 311492 2 java/util/zip/ZipEntry.<init>
+ 311492 2 java/util/zip/ZipFile$ZipFileInputStream.close
+ 311492 2 java/util/zip/ZipFile.freeEntry
+ 311492 2 java/util/zip/ZipFile.getInputStream
+ 311492 2 java/util/zip/ZipFile.getSize
+ 311492 2 sun/misc/FileURLMapper.getPath
+ 311492 2 sun/misc/Launcher$Factory.<init>
+ 311492 2 sun/misc/Launcher$Factory.createURLStreamHandler
+ 311492 2 sun/misc/Launcher.access$100
+ 311492 2 sun/misc/MetaIndex.registerDirectory
+ 311492 2 sun/misc/NativeSignalHandler.<init>
+ 311492 2 sun/misc/Resource.cachedInputStream
+ 311492 2 sun/misc/URLClassPath.<init>
+ 311492 2 sun/misc/URLClassPath.getResource
+ 311492 2 sun/misc/URLClassPath.push
+ 311492 2 sun/misc/VM.maxDirectMemory
+ 311492 2 sun/misc/Version.init
+ 311492 2 sun/net/www/protocol/file/Handler.openConnection
+ 311492 2 sun/net/www/protocol/file/Handler.parseURL
+ 311492 2 sun/net/www/protocol/jar/Handler.<init>
+ 311492 2 sun/nio/cs/FastCharsetProvider.charsetForName
+ 311492 2 sun/nio/cs/FastCharsetProvider.lookup
+ 311492 2 sun/nio/cs/FastCharsetProvider.toLower
+ 311492 2 sun/nio/cs/StandardCharsets$Aliases.<init>
+ 311492 2 sun/nio/cs/StandardCharsets$Cache.<init>
+ 311492 2 sun/nio/cs/StandardCharsets$Classes.<init>
+ 311492 2 sun/nio/cs/StreamDecoder.<init>
+ 311492 2 sun/nio/cs/StreamDecoder.ensureOpen
+ 311492 2 sun/nio/cs/StreamDecoder.implRead
+ 311492 2 sun/nio/cs/StreamDecoder.read
+ 311492 2 sun/nio/cs/StreamDecoder.readBytes
+ 311492 2 sun/nio/cs/StreamEncoder.forOutputStreamWriter
+ 311492 2 sun/nio/cs/Surrogate$Parser.<init>
+ 311492 2 sun/nio/cs/US_ASCII.newEncoder
+ 311492 2 sun/reflect/DelegatingConstructorAccessorImpl.<init>
+ 311492 2 sun/reflect/DelegatingConstructorAccessorImpl.setDelegate
+ 311492 2 sun/reflect/NativeConstructorAccessorImpl.<init>
+ 311492 2 sun/reflect/NativeConstructorAccessorImpl.setParent
+ 311492 2 sun/reflect/Reflection.ensureMemberAccess
+ 311492 2 sun/reflect/Reflection.isSubclassOf
+ 311492 2 sun/reflect/Reflection.verifyMemberAccess
+ 311492 2 sun/reflect/ReflectionFactory.checkInitted
+ 311492 2 sun/reflect/ReflectionFactory.copyConstructor
+ 311492 2 sun/reflect/ReflectionFactory.newConstructorAccessor
+ 311492 2 sun/reflect/misc/ReflectUtil.checkPackageAccess
+ 311492 2 sun/security/provider/PolicyFile.canonPath
+ 311492 2 sun/util/PreHashedMap.put
+ 311492 3 java/io/BufferedWriter.newLine
+ 311492 3 java/io/FileInputStream.<init>
+ 311492 3 java/io/FileInputStream.read
+ 311492 3 java/io/FileInputStream.readBytes
+ 311492 3 java/io/FilterInputStream.<init>
+ 311492 3 java/io/PrintStream.newLine
+ 311492 3 java/io/PrintStream.print
+ 311492 3 java/io/PrintStream.println
+ 311492 3 java/io/Reader.<init>
+ 311492 3 java/lang/Boolean.<init>
+ 311492 3 java/lang/Class$3.<init>
+ 311492 3 java/lang/Class$3.run
+ 311492 3 java/lang/Class.forName
+ 311492 3 java/lang/Class.forName0
+ 311492 3 java/lang/Class.newInstance
+ 311492 3 java/lang/Class.newInstance0
+ 311492 3 java/lang/Exception.<init>
+ 311492 3 java/lang/Integer.<init>
+ 311492 3 java/lang/Object.wait
+ 311492 3 java/lang/RuntimePermission.<init>
+ 311492 3 java/lang/Shutdown.add
+ 311492 3 java/lang/Thread.sleep
+ 311492 3 java/lang/ThreadLocal.<init>
+ 311492 3 java/lang/ThreadLocal.getMap
+ 311492 3 java/lang/ThreadLocal.nextHashCode
+ 311492 3 java/lang/ref/WeakReference.<init>
+ 311492 3 java/lang/reflect/Constructor.newInstance
+ 311492 3 java/net/URLStreamHandler.<init>
+ 311492 3 java/nio/ByteBuffer.allocate
+ 311492 3 java/nio/charset/Charset.defaultCharset
+ 311492 3 java/nio/charset/Charset.lookup2
+ 311492 3 java/nio/charset/CharsetDecoder.maxCharsPerByte
+ 311492 3 java/nio/charset/CodingErrorAction.<init>
+ 311492 3 java/util/AbstractList$Itr.checkForComodification
+ 311492 3 java/util/AbstractList$Itr.next
+ 311492 3 java/util/ArrayList.clear
+ 311492 3 java/util/HashSet.<init>
+ 311492 3 java/util/Hashtable.rehash
+ 311492 3 java/util/LinkedHashMap.<init>
+ 311492 3 java/util/LinkedHashMap.init
+ 311492 3 java/util/Stack.<init>
+ 311492 3 java/util/StringTokenizer.nextToken
+ 311492 3 java/util/concurrent/atomic/AtomicInteger.compareAndSet
+ 311492 3 java/util/concurrent/atomic/AtomicInteger.getAndAdd
+ 311492 3 java/util/jar/JarFile.getEntry
+ 311492 3 java/util/jar/JarFile.getJarEntry
+ 311492 3 java/util/zip/ZipFile.access$300
+ 311492 3 sun/misc/Signal.<init>
+ 311492 3 sun/misc/Signal.findSignal
+ 311492 3 sun/misc/Signal.handle
+ 311492 3 sun/misc/Signal.handle0
+ 311492 3 sun/misc/URLClassPath$JarLoader.ensureOpen
+ 311492 3 sun/reflect/DelegatingConstructorAccessorImpl.newInstance
+ 311492 3 sun/reflect/NativeConstructorAccessorImpl.newInstance
+ 311492 3 sun/reflect/NativeConstructorAccessorImpl.newInstance0
+ 311492 3 sun/reflect/Reflection.getClassAccessFlags
+ 311492 3 sun/reflect/Reflection.quickCheckMemberAccess
+ 311492 3 sun/reflect/ReflectionFactory.inflationThreshold
+ 311492 3 sun/util/PreHashedMap.<init>
+ 311492 4 java/io/BufferedWriter.<init>
+ 311492 4 java/io/ExpiringCache$Entry.timestamp
+ 311492 4 java/io/ExpiringCache.<init>
+ 311492 4 java/io/File.compareTo
+ 311492 4 java/io/File.equals
+ 311492 4 java/io/FilePermission$1.run
+ 311492 4 java/io/FilterOutputStream.<init>
+ 311492 4 java/io/PrintStream.<init>
+ 311492 4 java/io/UnixFileSystem.compare
+ 311492 4 java/lang/Character.toUpperCase
+ 311492 4 java/lang/Class.getDeclaredFields0
+ 311492 4 java/lang/Number.<init>
+ 311492 4 java/lang/Shutdown$Lock.<init>
+ 311492 4 java/lang/String.compareTo
+ 311492 4 java/lang/ThreadGroup.getParent
+ 311492 4 java/lang/Throwable.<init>
+ 311492 4 java/lang/Throwable.fillInStackTrace
+ 311492 4 java/lang/ref/ReferenceQueue$Null.<init>
+ 311492 4 java/lang/ref/ReferenceQueue.<init>
+ 311492 4 java/lang/reflect/Array.newArray
+ 311492 4 java/lang/reflect/Array.newInstance
+ 311492 4 java/lang/reflect/Constructor.setConstructorAccessor
+ 311492 4 java/lang/reflect/Modifier.isPublic
+ 311492 4 java/nio/HeapByteBuffer.ix
+ 311492 4 java/nio/charset/Charset.forName
+ 311492 4 java/nio/charset/CharsetDecoder.onMalformedInput
+ 311492 4 java/nio/charset/CharsetDecoder.onUnmappableCharacter
+ 311492 4 java/nio/charset/CharsetDecoder.replaceWith
+ 311492 4 java/nio/charset/CharsetEncoder.<init>
+ 311492 4 java/nio/charset/CoderResult$Cache.<init>
+ 311492 4 java/security/BasicPermission.<init>
+ 311492 4 java/security/BasicPermission.init
+ 311492 4 java/util/AbstractList$Itr.<init>
+ 311492 4 java/util/ArrayList.toArray
+ 311492 4 java/util/Collections$SynchronizedMap.get
+ 311492 4 java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+ 311492 4 java/util/IdentityHashMap$KeyIterator.<init>
+ 311492 4 java/util/LinkedHashMap$Entry.recordAccess
+ 311492 4 java/util/StringTokenizer.<init>
+ 311492 4 java/util/zip/ZipFile.ensureOpen
+ 311492 4 sun/misc/MetaIndex.<init>
+ 311492 4 sun/misc/MetaIndex.mayContain
+ 311492 4 sun/nio/cs/FastCharsetProvider.canonicalize
+ 311492 4 sun/nio/cs/StreamEncoder.<init>
+ 311492 4 sun/nio/cs/US_ASCII$Encoder.<init>
+ 311492 4 sun/nio/cs/US_ASCII.newDecoder
+ 311492 4 sun/reflect/ConstructorAccessorImpl.<init>
+ 311492 4 sun/reflect/MagicAccessorImpl.<init>
+ 311492 4 sun/reflect/Reflection.filterFields
+ 311492 4 sun/reflect/ReflectionFactory$GetReflectionFactoryAction.<init>
+ 311492 4 sun/reflect/ReflectionFactory$GetReflectionFactoryAction.run
+ 311492 4 sun/reflect/ReflectionFactory.getReflectionFactory
+ 311492 4 sun/security/util/Debug.isOn
+ 311492 5 java/io/FileDescriptor.<init>
+ 311492 5 java/lang/Class.getModifiers
+ 311492 5 java/lang/Class.getName0
+ 311492 5 java/lang/String.valueOf
+ 311492 5 java/nio/ByteBuffer.wrap
+ 311492 5 java/nio/charset/Charset.isSupported
+ 311492 5 java/security/PermissionCollection.<init>
+ 311492 5 java/util/AbstractList$Itr.hasNext
+ 311492 5 java/util/Hashtable.remove
+ 311492 5 java/util/StringTokenizer.scanToken
+ 311492 5 java/util/StringTokenizer.skipDelimiters
+ 311492 5 sun/misc/MetaIndex.forJar
+ 311492 5 sun/misc/URLClassPath$JarLoader.<init>
+ 311492 5 sun/misc/URLClassPath$JarLoader.getClassPath
+ 311492 5 sun/misc/URLClassPath$JarLoader.getResource
+ 311492 5 sun/misc/Unsafe.getUnsafe
+ 311492 5 sun/util/PreHashedMap.toV
+ 311492 6 java/io/BufferedOutputStream.write
+ 311492 6 java/io/BufferedWriter.flushBuffer
+ 311492 6 java/io/BufferedWriter.min
+ 311492 6 java/io/BufferedWriter.write
+ 311492 6 java/io/File.getAbsolutePath
+ 311492 6 java/io/FileOutputStream.write
+ 311492 6 java/io/FileOutputStream.writeBytes
+ 311492 6 java/io/OutputStream.<init>
+ 311492 6 java/io/OutputStreamWriter.flushBuffer
+ 311492 6 java/io/OutputStreamWriter.write
+ 311492 6 java/io/UnixFileSystem.canonicalize0
+ 311492 6 java/io/Writer.<init>
+ 311492 6 java/io/Writer.write
+ 311492 6 java/lang/Class.checkMemberAccess
+ 311492 6 java/lang/Class.getComponentType
+ 311492 6 java/lang/Class.getDeclaredField
+ 311492 6 java/lang/Class.getName
+ 311492 6 java/lang/Class.getSuperclass
+ 311492 6 java/lang/Class.privateGetDeclaredFields
+ 311492 6 java/lang/Class.searchFields
+ 311492 6 java/lang/ThreadGroup.add
+ 311492 6 java/lang/reflect/Field.<init>
+ 311492 6 java/lang/reflect/Field.copy
+ 311492 6 java/lang/reflect/ReflectAccess.copyField
+ 311492 6 java/net/URL.getURLStreamHandler
+ 311492 6 java/net/URL.toExternalForm
+ 311492 6 java/net/URL.toString
+ 311492 6 java/net/URLStreamHandler.getDefaultPort
+ 311492 6 java/net/URLStreamHandler.getHostAddress
+ 311492 6 java/net/URLStreamHandler.hashCode
+ 311492 6 java/net/URLStreamHandler.toExternalForm
+ 311492 6 java/nio/Bits.byteOrder
+ 311492 6 java/nio/Buffer.clear
+ 311492 6 java/nio/ByteBuffer.<init>
+ 311492 6 java/nio/HeapByteBuffer.<init>
+ 311492 6 java/nio/charset/CharsetDecoder.decode
+ 311492 6 java/nio/charset/CharsetEncoder.encode
+ 311492 6 java/security/Permission.<init>
+ 311492 6 java/util/AbstractSet.<init>
+ 311492 6 java/util/HashMap.containsKey
+ 311492 6 java/util/Vector.add
+ 311492 6 java/util/concurrent/ConcurrentHashMap$Segment.rehash
+ 311492 6 sun/misc/Launcher.getFileURL
+ 311492 6 sun/misc/MetaIndex.getJarMap
+ 311492 6 sun/misc/URLClassPath$3.<init>
+ 311492 6 sun/misc/URLClassPath$3.run
+ 311492 6 sun/misc/URLClassPath$JarLoader.isOptimizable
+ 311492 6 sun/misc/URLClassPath$Loader.<init>
+ 311492 6 sun/misc/Unsafe.objectFieldOffset
+ 311492 6 sun/net/www/ParseUtil.fileToEncodedURL
+ 311492 6 sun/nio/cs/StreamEncoder.ensureOpen
+ 311492 6 sun/nio/cs/StreamEncoder.flushBuffer
+ 311492 6 sun/nio/cs/StreamEncoder.implFlushBuffer
+ 311492 6 sun/nio/cs/StreamEncoder.implWrite
+ 311492 6 sun/nio/cs/StreamEncoder.write
+ 311492 6 sun/nio/cs/StreamEncoder.writeBytes
+ 311492 6 sun/nio/cs/US_ASCII$Decoder.decodeArrayLoop
+ 311492 6 sun/nio/cs/US_ASCII$Decoder.decodeLoop
+ 311492 6 sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+ 311492 6 sun/nio/cs/US_ASCII$Encoder.encodeLoop
+ 311492 6 sun/reflect/ReflectionFactory.copyField
+ 311492 7 java/io/File.getCanonicalFile
+ 311492 7 java/io/InputStream.<init>
+ 311492 7 java/lang/ClassLoader.checkPackageAccess
+ 311492 7 java/lang/ref/SoftReference.<init>
+ 311492 7 java/util/Dictionary.<init>
+ 311492 7 java/util/HashSet.add
+ 311492 7 java/util/Stack.empty
+ 311492 7 java/util/Stack.pop
+ 311492 7 java/util/Stack.push
+ 311492 7 java/util/Vector.removeElementAt
+ 311492 7 java/util/zip/ZipFile.getEntry
+ 311492 7 sun/util/PreHashedMap.get
+ 311492 8 java/lang/Class.checkInitted
+ 311492 8 java/lang/Class.clearCachesOnClassRedefinition
+ 311492 8 java/lang/Class.getPrimitiveClass
+ 311492 8 java/lang/Class.getReflectionFactory
+ 311492 8 java/lang/Object.getClass
+ 311492 8 java/lang/System.setProperty
+ 311492 8 java/lang/Thread.<init>
+ 311492 8 java/lang/Thread.getContextClassLoader
+ 311492 8 java/lang/Thread.init
+ 311492 8 java/lang/Thread.nextThreadID
+ 311492 8 java/lang/ThreadGroup.addUnstarted
+ 311492 8 java/lang/ref/FinalReference.<init>
+ 311492 8 java/lang/ref/Finalizer.<init>
+ 311492 8 java/lang/ref/Finalizer.add
+ 311492 8 java/lang/ref/Finalizer.register
+ 311492 8 java/lang/ref/ReferenceQueue$Lock.<init>
+ 311492 8 java/lang/reflect/AccessibleObject.<init>
+ 311492 8 java/nio/charset/CharsetDecoder.<init>
+ 311492 8 java/security/AccessControlContext.optimize
+ 311492 8 java/security/AccessController.getInheritedAccessControlContext
+ 311492 8 java/util/Properties.setProperty
+ 311492 8 java/util/Stack.peek
+ 311492 8 sun/nio/cs/US_ASCII$Decoder.<init>
+ 311492 8 sun/reflect/ReflectionFactory.langReflectAccess
+ 311492 8 sun/security/util/Debug.getInstance
+ 311492 9 java/io/BufferedOutputStream.flush
+ 311492 9 java/io/BufferedOutputStream.flushBuffer
+ 311492 9 java/io/File.hashCode
+ 311492 9 java/io/File.isDirectory
+ 311492 9 java/io/PrintStream.write
+ 311492 9 java/io/UnixFileSystem.hashCode
+ 311492 9 java/lang/ClassLoader.findBootstrapClass
+ 311492 9 java/lang/ClassLoader.findBootstrapClass0
+ 311492 9 java/lang/ClassLoader.getCallerClassLoader
+ 311492 9 java/lang/ClassLoader.loadClassInternal
+ 311492 9 java/lang/StringBuffer.<init>
+ 311492 9 java/lang/StringBuffer.toString
+ 311492 9 java/nio/Buffer.flip
+ 311492 9 java/util/ArrayList.RangeCheck
+ 311492 9 java/util/ArrayList.get
+ 311492 9 sun/misc/Launcher$AppClassLoader.loadClass
+ 311492 9 sun/net/www/ParseUtil.decode
+ 311492 9 sun/net/www/ParseUtil.lowMask
+ 311492 10 java/io/File.getCanonicalPath
+ 311492 10 java/io/ObjectStreamClass.getClassSignature
+ 311492 10 java/io/UnixFileSystem.canonicalize
+ 311492 10 java/lang/Class.isPrimitive
+ 311492 10 java/lang/Thread.setPriority
+ 311492 10 java/lang/Thread.setPriority0
+ 311492 10 java/nio/CharBuffer.wrap
+ 311492 10 java/nio/charset/Charset.lookup
+ 311492 10 java/security/AccessController.getContext
+ 311492 10 java/security/AccessController.getStackAccessControlContext
+ 311492 10 java/util/Vector.addElement
+ 311492 11 java/lang/String.replace
+ 311492 11 java/lang/ThreadGroup.checkAccess
+ 311492 11 java/net/Parts.<init>
+ 311492 11 java/nio/CharBuffer.<init>
+ 311492 11 java/nio/HeapCharBuffer.<init>
+ 311492 12 java/io/BufferedWriter.ensureOpen
+ 311492 12 java/io/ExpiringCache$1.removeEldestEntry
+ 311492 12 java/io/ExpiringCache$Entry.<init>
+ 311492 12 java/io/ExpiringCache.put
+ 311492 12 java/io/File.exists
+ 311492 12 java/io/PrintStream.ensureOpen
+ 311492 12 java/lang/Class.isArray
+ 311492 12 java/lang/Thread.checkAccess
+ 311492 12 java/nio/ByteBuffer.hasArray
+ 311492 12 java/nio/CharBuffer.array
+ 311492 12 java/nio/CharBuffer.hasArray
+ 311492 12 java/nio/charset/CoderResult.isOverflow
+ 311492 12 java/util/HashMap.get
+ 311492 12 java/util/LinkedHashMap$Entry.access$600
+ 311492 12 java/util/LinkedHashMap$Entry.addBefore
+ 311492 12 java/util/LinkedHashMap.addEntry
+ 311492 12 java/util/LinkedHashMap.createEntry
+ 311492 12 sun/net/www/ParseUtil.highMask
+ 311492 13 java/io/UnixFileSystem.parentOrNull
+ 311492 13 java/nio/Buffer.hasRemaining
+ 311492 13 java/nio/Buffer.remaining
+ 311492 13 sun/misc/URLClassPath.getLoader
+ 311492 13 sun/net/www/ParseUtil.encodePath
+ 311492 14 java/lang/Float.isNaN
+ 311492 14 java/net/URL.hashCode
+ 311492 14 java/util/Hashtable.<init>
+ 311492 15 java/lang/Object.hashCode
+ 311492 15 java/nio/charset/Charset.checkName
+ 311492 15 java/util/ArrayList.<init>
+ 311492 15 java/util/HashMap.addEntry
+ 311492 15 java/util/LinkedHashMap$Entry.<init>
+ 311492 16 java/io/UnixFileSystem.isAbsolute
+ 311492 16 java/lang/ClassLoader$NativeLibrary.find
+ 311492 16 java/lang/String.intern
+ 311492 16 java/util/Vector.ensureCapacityHelper
+ 311492 16 java/util/concurrent/ConcurrentHashMap$Segment.<init>
+ 311492 16 java/util/concurrent/ConcurrentHashMap$Segment.setTable
+ 311492 16 java/util/concurrent/locks/AbstractOwnableSynchronizer.<init>
+ 311492 16 java/util/concurrent/locks/AbstractQueuedSynchronizer.<init>
+ 311492 16 java/util/concurrent/locks/ReentrantLock$NonfairSync.<init>
+ 311492 16 java/util/concurrent/locks/ReentrantLock$Sync.<init>
+ 311492 16 java/util/concurrent/locks/ReentrantLock.<init>
+ 311492 16 sun/reflect/Reflection.getCallerClass
+ 311492 17 java/lang/ClassLoader.findNative
+ 311492 17 java/lang/Math.max
+ 311492 17 java/lang/String.toCharArray
+ 311492 17 java/nio/Buffer.<init>
+ 311492 17 java/util/Locale.getDefault
+ 311492 17 sun/security/action/GetPropertyAction.<init>
+ 311492 18 java/io/ExpiringCache.get
+ 311492 18 java/lang/Class.desiredAssertionStatus
+ 311492 18 java/lang/Class.desiredAssertionStatus0
+ 311492 18 java/lang/ClassLoader.findLoadedClass
+ 311492 18 java/lang/ClassLoader.findLoadedClass0
+ 311492 19 java/io/BufferedReader.ensureOpen
+ 311492 19 java/lang/System.currentTimeMillis
+ 311492 19 java/nio/Buffer.limit
+ 311492 19 java/util/Locale.<init>
+ 311492 19 java/util/Locale.createSingleton
+ 311492 19 java/util/concurrent/ConcurrentHashMap$Segment.put
+ 311492 19 java/util/concurrent/ConcurrentHashMap.put
+ 311492 19 java/util/concurrent/locks/AbstractQueuedSynchronizer.compareAndSetState
+ 311492 19 java/util/concurrent/locks/AbstractQueuedSynchronizer.release
+ 311492 19 java/util/concurrent/locks/AbstractQueuedSynchronizer.setState
+ 311492 19 java/util/concurrent/locks/ReentrantLock$NonfairSync.lock
+ 311492 19 java/util/concurrent/locks/ReentrantLock$Sync.tryRelease
+ 311492 19 java/util/concurrent/locks/ReentrantLock.lock
+ 311492 19 java/util/concurrent/locks/ReentrantLock.unlock
+ 311492 20 java/io/ObjectStreamField.<init>
+ 311492 20 java/nio/ByteBuffer.array
+ 311492 20 java/util/AbstractList.<init>
+ 311492 20 java/util/BitSet.get
+ 311492 20 java/util/concurrent/ConcurrentHashMap.hash
+ 311492 20 java/util/concurrent/ConcurrentHashMap.segmentFor
+ 311492 20 sun/misc/VM.isBooted
+ 311492 21 java/io/File.getName
+ 311492 21 java/io/UnixFileSystem.getBooleanAttributes
+ 311492 21 java/io/UnixFileSystem.getBooleanAttributes0
+ 311492 21 java/lang/StringBuffer.append
+ 311492 21 java/nio/charset/Charset.atBugLevel
+ 311492 22 java/util/concurrent/ConcurrentHashMap$HashEntry.newArray
+ 311492 22 sun/misc/Unsafe.compareAndSwapInt
+ 311492 23 java/util/HashMap.<init>
+ 311492 23 java/util/concurrent/ConcurrentHashMap$HashEntry.<init>
+ 311492 24 java/nio/charset/CoderResult.isUnderflow
+ 311492 24 java/util/AbstractMap.<init>
+ 311492 24 java/util/Vector.elementAt
+ 311492 25 java/lang/Class.getClassLoader
+ 311492 26 java/util/AbstractCollection.<init>
+ 311492 26 java/util/ArrayList.add
+ 311492 26 java/util/ArrayList.ensureCapacity
+ 311492 27 java/lang/ClassLoader.loadClass
+ 311492 27 java/net/URL.<init>
+ 311492 28 java/lang/ClassLoader.check
+ 311492 28 java/lang/ClassLoader.checkName
+ 311492 28 java/lang/ref/Reference.<init>
+ 311492 29 java/lang/String.endsWith
+ 311492 29 sun/misc/VM.allowArraySyntax
+ 311492 30 java/io/ExpiringCache.entryFor
+ 311492 30 java/io/UnixFileSystem.resolve
+ 311492 30 java/util/HashMap$Entry.<init>
+ 311492 30 java/util/LinkedHashMap.get
+ 311492 33 java/util/HashMap.put
+ 311492 33 java/util/Vector.<init>
+ 311492 34 java/io/UnixFileSystem.normalize
+ 311492 34 java/lang/Class.getClassLoader0
+ 311492 34 java/lang/String.toLowerCase
+ 311492 34 sun/security/action/GetPropertyAction.run
+ 311492 36 java/nio/CharBuffer.arrayOffset
+ 311492 36 java/util/HashMap.getEntry
+ 311492 37 java/io/File.<init>
+ 311492 37 java/io/UnixFileSystem.prefixLength
+ 311492 38 java/io/BufferedReader.readLine
+ 311492 38 java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread
+ 311492 41 java/lang/CharacterDataLatin1.toLowerCase
+ 311492 43 java/lang/CharacterDataLatin1.getProperties
+ 311492 43 java/security/AccessController.doPrivileged
+ 311492 43 java/util/Vector.size
+ 311492 44 java/nio/Buffer.position
+ 311492 44 java/nio/ByteBuffer.arrayOffset
+ 311492 48 java/lang/System.getProperty
+ 311492 50 java/util/Properties.getProperty
+ 311492 51 java/util/BitSet.expandTo
+ 311492 51 java/util/BitSet.set
+ 311492 56 java/lang/System.checkKey
+ 311492 57 java/lang/Thread.currentThread
+ 311492 57 java/util/Hashtable$Entry.<init>
+ 311492 59 java/util/Hashtable.get
+ 311492 63 java/util/Hashtable.put
+ 311492 71 java/util/BitSet.checkInvariants
+ 311492 72 java/util/BitSet.wordIndex
+ 311492 73 java/lang/StringBuilder.<init>
+ 311492 73 java/lang/StringBuilder.toString
+ 311492 81 java/lang/AbstractStringBuilder.expandCapacity
+ 311492 81 java/util/HashMap.hash
+ 311492 81 java/util/HashMap.indexFor
+ 311492 82 java/lang/AbstractStringBuilder.<init>
+ 311492 82 java/lang/Character.toLowerCase
+ 311492 83 java/lang/String.startsWith
+ 311492 87 java/util/Arrays.copyOf
+ 311492 90 java/lang/String.lastIndexOf
+ 311492 94 java/lang/String.substring
+ 311492 107 java/util/Arrays.copyOfRange
+ 311492 156 java/lang/String.getChars
+ 311492 174 java/lang/System.getSecurityManager
+ 311492 175 java/lang/String.<init>
+ 311492 202 java/lang/String.equals
+ 311492 208 java/lang/Math.min
+ 311492 213 java/lang/String.hashCode
+ 311492 302 java/lang/String.indexOf
+ 311492 360 java/lang/System.arraycopy
+ 311492 533 java/lang/StringBuilder.append
+ 311492 549 java/lang/AbstractStringBuilder.append
+ 311492 823 java/lang/Object.<init>
+ 311492 1960 java/lang/String.charAt
+
diff --git a/Examples/j_objnew_example.txt b/Examples/j_objnew_example.txt
new file mode 100644
index 000000000000..433c38fcd880
--- /dev/null
+++ b/Examples/j_objnew_example.txt
@@ -0,0 +1,1460 @@
+The following are examples of j_objnew.d.
+
+This traces activity of object allocation by Java. It will print a histogram
+of the byte size of allocation of different type, followed by a count of each
+type of allocation.
+
+Here you can see it running on Code/Java/Func_abc
+
+# j_objnew.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Java object allocation byte distributions by pid and class,
+
+ 311496 java/io/Console$1
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/io/DeleteOnExitHook
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/io/File$1
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/lang/ApplicationShutdownHooks
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/lang/Compiler$1
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/lang/Runtime
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/lang/String$CaseInsensitiveComparator
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/lang/System$2
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/lang/Terminator$1
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/lang/ref/Reference$Lock
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/lang/reflect/ReflectAccess
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/net/URLClassLoader$7
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/net/UnknownContentHandler
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/util/Collections$EmptySet
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/util/Collections$ReverseComparator
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/util/Hashtable$EmptyEnumerator
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/util/Hashtable$EmptyIterator
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 java/util/jar/JavaUtilJarAccessImpl
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 sun/misc/Launcher$Factory
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 sun/misc/Unsafe
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 sun/net/www/protocol/file/Handler
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 sun/reflect/ReflectionFactory
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 sun/reflect/ReflectionFactory$1
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ 311496 [Ljava/lang/StackTraceElement;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 [Ljava/security/Principal;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 [Ljava/security/cert/Certificate;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/io/Console$1$1
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/io/FilePermissionCollection
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/io/FileReader
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/io/UnixFileSystem
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/ArithmeticException
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/ClassLoader$3
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/NoSuchMethodError
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/NullPointerException
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/Shutdown$Lock
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 16 | 0
+
+ 311496 java/lang/StringCoding$StringDecoder
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/SystemClassLoaderAction
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/ThreadLocal$ThreadLocalMap
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/VirtualMachineError
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/reflect/ReflectPermission
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/nio/charset/CoderResult$1
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/nio/charset/CoderResult$2
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/security/BasicPermissionCollection
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/security/Policy$UnsupportedEmptyCollection
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/util/BitSet
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/util/Collections$EmptyList
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/util/Collections$EmptyMap
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/util/HashMap$KeySet
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/util/IdentityHashMap$KeySet
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/util/LinkedHashSet
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/util/concurrent/atomic/AtomicInteger
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 sun/misc/FileURLMapper
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 sun/misc/Launcher
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 sun/misc/Launcher$AppClassLoader$1
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 sun/misc/Launcher$ExtClassLoader$1
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 sun/misc/URLClassPath$FileLoader
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 sun/misc/URLClassPath$JarLoader$1
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 sun/net/www/MessageHeader
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 sun/net/www/protocol/jar/Handler
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 16 | 0
+
+ 311496 sun/nio/cs/StandardCharsets
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 sun/nio/cs/US_ASCII
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ 311496 java/lang/Class$3
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 16 | 0
+
+ 311496 [J
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 [Ljava/io/File;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 [Ljava/lang/OutOfMemoryError;
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 [Ljava/lang/ThreadGroup;
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 [Ljava/lang/reflect/Constructor;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/io/BufferedInputStream
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/io/BufferedOutputStream
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/io/BufferedReader
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/io/DataInputStream
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/io/FileOutputStream
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/io/FilePermission$1
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/io/OutputStreamWriter
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/lang/Class$1
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/lang/ClassLoader$NativeLibrary
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/lang/ThreadLocal$ThreadLocalMap$Entry
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/lang/ref/ReferenceQueue
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/lang/ref/ReferenceQueue$Lock
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 16 | 0
+
+ 311496 java/lang/ref/ReferenceQueue$Null
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/lang/ref/WeakReference
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/net/URLClassLoader$1
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/nio/ByteOrder
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/nio/charset/CoderResult
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/security/CodeSource
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/security/Permissions
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/security/PrivilegedActionException
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/security/ProtectionDomain
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/AbstractList$Itr
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/util/Collections$SynchronizedMap
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/HashSet
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 java/util/IdentityHashMap
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/LinkedHashMap
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/LinkedHashMap$KeyIterator
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/Properties
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/concurrent/ConcurrentHashMap
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/jar/JarFile
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/zip/Inflater
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/zip/ZipFile$1
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/util/zip/ZipFile$ZipFileInputStream
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 sun/misc/NativeSignalHandler
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 sun/misc/SoftCache
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 sun/misc/URLClassPath$FileLoader$1
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 sun/nio/cs/StandardCharsets$Aliases
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 sun/nio/cs/StandardCharsets$Cache
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 sun/nio/cs/StandardCharsets$Classes
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 sun/nio/cs/StreamDecoder
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 sun/nio/cs/Surrogate$Parser
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 sun/reflect/DelegatingConstructorAccessorImpl
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 sun/reflect/NativeConstructorAccessorImpl
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ 311496 sun/reflect/ReflectionFactory$GetReflectionFactoryAction
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 16 | 0
+
+ 311496 [Ljava/net/URL;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32 |@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ 311496 java/io/FileInputStream
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+ 311496 java/lang/Boolean
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+ 311496 java/lang/Integer
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+ 311496 java/lang/RuntimePermission
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+ 311496 java/lang/ThreadLocal
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+ 311496 java/nio/charset/CodingErrorAction
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+ 311496 java/util/Stack
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+ 311496 sun/misc/Signal
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+ 311496 [Ljava/lang/Thread;
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 [Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 [Ljava/lang/annotation/Annotation;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 32 | 0
+
+ 311496 [Ljava/util/concurrent/ConcurrentHashMap$Segment;
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 java/io/BufferedWriter
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/io/ExpiringCache
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/io/ExpiringCache$1
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/io/FilePermission
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/io/PrintStream
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/lang/ClassNotFoundException
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/lang/ThreadGroup
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/lang/ref/Finalizer$FinalizerThread
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 java/lang/ref/Reference$ReferenceHandler
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 java/lang/reflect/Method
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 java/util/IdentityHashMap$KeyIterator
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/util/StringTokenizer
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/util/jar/JarFile$JarFileEntry
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 java/util/zip/ZipEntry
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 sun/misc/Launcher$AppClassLoader
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 sun/misc/Launcher$ExtClassLoader
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 sun/misc/MetaIndex
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 32 | 0
+
+ 311496 sun/misc/URLClassPath
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 sun/net/www/protocol/file/FileURLConnection
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ 311496 sun/nio/cs/StreamEncoder
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 sun/nio/cs/US_ASCII$Encoder
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ 311496 java/io/FileDescriptor
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 32 | 0
+
+ 311496 sun/misc/URLClassPath$3
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 32 | 0
+
+ 311496 [Ljava/io/ObjectStreamField;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 32 | 0
+
+ 311496 [Ljava/lang/reflect/Field;
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 64 | 0
+
+ 311496 java/lang/Object
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16
+ 16 | 0
+
+ 311496 java/lang/OutOfMemoryError
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 32 | 0
+
+ 311496 java/util/ArrayList
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 32 | 0
+
+ 311496 java/util/Vector
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 32 | 0
+
+ 311496 sun/nio/cs/US_ASCII$Decoder
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 64 | 0
+
+ 311496 java/lang/StringBuffer
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9
+ 32 | 0
+
+ 311496 java/security/AccessControlContext
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 32 | 0
+
+ 311496 sun/misc/URLClassPath$JarLoader
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 64 | 0
+
+ 311496 java/net/Parts
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 11
+ 32 | 0
+
+ 311496 [Ljava/lang/Class;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 12
+ 32 | 0
+
+ 311496 java/io/ExpiringCache$Entry
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 12
+ 32 | 0
+
+ 311496 java/nio/HeapByteBuffer
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 64 | 0
+
+ 311496 java/util/Hashtable
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 64 | 0
+
+ 311496 java/lang/ref/SoftReference
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7
+ 64 | 0
+
+ 311496 java/util/HashMap$Entry
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15
+ 32 | 0
+
+ 311496 java/lang/ref/Finalizer
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 64 | 0
+
+ 311496 java/lang/reflect/Constructor
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 128 | 0
+
+ 311496 java/util/concurrent/locks/ReentrantLock$NonfairSync
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16
+ 32 | 0
+
+ 311496 sun/security/action/GetPropertyAction
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 17
+ 32 | 0
+
+ 311496 java/io/ObjectStreamField
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 64 | 0
+
+ 311496 java/nio/HeapCharBuffer
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 11
+ 64 | 0
+
+ 311496 java/util/concurrent/ConcurrentHashMap$HashEntry
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 23
+ 32 | 0
+
+ 311496 java/lang/Thread
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 128 | 0
+
+ 311496 java/net/URL
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 13
+ 64 | 0
+
+ 311496 java/util/HashMap
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14
+ 64 | 0
+
+ 311496 java/util/LinkedHashMap$Entry
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15
+ 64 | 0
+
+ 311496 [Ljava/util/concurrent/ConcurrentHashMap$HashEntry;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16
+ 32 |@@@@@@@ 4
+ 64 |@@@@ 2
+ 128 | 0
+
+ 311496 java/util/concurrent/ConcurrentHashMap$Segment
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16
+ 64 | 0
+
+ 311496 java/io/File
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 37
+ 32 | 0
+
+ 311496 java/util/Locale
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 19
+ 64 | 0
+
+ 311496 [Ljava/util/Hashtable$Entry;
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7
+ 64 |@@@@ 1
+ 128 |@@@@ 1
+ 256 |@@@@ 1
+ 512 | 0
+
+ 311496 java/util/Hashtable$Entry
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 57
+ 32 | 0
+
+ 311496 [Ljava/util/HashMap$Entry;
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 17
+ 128 | 0
+
+ 311496 java/lang/StringBuilder
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 73
+ 32 | 0
+
+ 311496 [Ljava/lang/String;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@ 26
+ 32 |@@@@@@@@@@@@@@@ 22
+ 64 |@@@@@@ 9
+ 128 | 0
+
+ 311496 java/lang/reflect/Field
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 37
+ 128 | 0
+
+ 311496 [Ljava/lang/Object;
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 296
+ 32 |@@ 18
+ 64 | 0
+ 128 |@ 10
+ 256 | 1
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 1
+ 8192 | 0
+
+ 311496 java/lang/String
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 931
+ 32 | 0
+
+ 311496 [S
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@ 161
+ 32 |@@@@@@@@@@@@@@@@ 189
+ 64 |@@@@@@@ 82
+ 128 |@@@ 38
+ 256 |@ 12
+ 512 | 4
+ 1024 | 0
+
+ 311496 [[I
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 270
+ 32 |@@@@@@@@@@ 129
+ 64 |@@@@@@ 85
+ 128 |@@@ 34
+ 256 |@@ 22
+ 512 | 1
+ 1024 | 0
+
+ 311496 java/lang/Class
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 395
+ 128 | 0
+
+ 311496 [I
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 | 3
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 276
+ 64 |@@@@@@@@@ 87
+ 128 | 3
+ 256 | 1
+ 512 | 1
+ 1024 | 1
+ 2048 | 0
+ 4096 | 1
+ 8192 | 0
+ 16384 | 1
+ 32768 | 0
+
+ 311496 [B
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@ 87
+ 32 |@@@@@@@@@@ 100
+ 64 |@@@@@@@@ 83
+ 128 |@@@@@@@ 71
+ 256 |@@@@@ 47
+ 512 |@ 14
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 | 4
+ 16384 | 0
+
+ 311496 [C
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@ 271
+ 32 |@@@@@@@@@@@@@@@@@@@@@ 573
+ 64 |@@@@@@ 150
+ 128 |@@@ 68
+ 256 | 8
+ 512 | 1
+ 1024 | 2
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 | 3
+ 32768 | 0
+
+Java object allocation count by pid and class,
+
+ PID OBJS CLASS
+ 311496 1 [J
+ 311496 1 [Ljava/lang/OutOfMemoryError;
+ 311496 1 [Ljava/lang/StackTraceElement;
+ 311496 1 [Ljava/lang/ThreadGroup;
+ 311496 1 [Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
+ 311496 1 [Ljava/security/Principal;
+ 311496 1 [Ljava/security/cert/Certificate;
+ 311496 1 [Ljava/util/concurrent/ConcurrentHashMap$Segment;
+ 311496 1 java/io/BufferedInputStream
+ 311496 1 java/io/BufferedReader
+ 311496 1 java/io/Console$1
+ 311496 1 java/io/Console$1$1
+ 311496 1 java/io/DataInputStream
+ 311496 1 java/io/DeleteOnExitHook
+ 311496 1 java/io/File$1
+ 311496 1 java/io/FilePermissionCollection
+ 311496 1 java/io/FileReader
+ 311496 1 java/io/UnixFileSystem
+ 311496 1 java/lang/ApplicationShutdownHooks
+ 311496 1 java/lang/ArithmeticException
+ 311496 1 java/lang/ClassLoader$3
+ 311496 1 java/lang/ClassLoader$NativeLibrary
+ 311496 1 java/lang/Compiler$1
+ 311496 1 java/lang/NoSuchMethodError
+ 311496 1 java/lang/NullPointerException
+ 311496 1 java/lang/Runtime
+ 311496 1 java/lang/String$CaseInsensitiveComparator
+ 311496 1 java/lang/StringCoding$StringDecoder
+ 311496 1 java/lang/System$2
+ 311496 1 java/lang/SystemClassLoaderAction
+ 311496 1 java/lang/Terminator$1
+ 311496 1 java/lang/ThreadLocal$ThreadLocalMap
+ 311496 1 java/lang/ThreadLocal$ThreadLocalMap$Entry
+ 311496 1 java/lang/VirtualMachineError
+ 311496 1 java/lang/ref/Finalizer$FinalizerThread
+ 311496 1 java/lang/ref/Reference$Lock
+ 311496 1 java/lang/ref/Reference$ReferenceHandler
+ 311496 1 java/lang/reflect/Method
+ 311496 1 java/lang/reflect/ReflectAccess
+ 311496 1 java/lang/reflect/ReflectPermission
+ 311496 1 java/net/URLClassLoader$7
+ 311496 1 java/net/UnknownContentHandler
+ 311496 1 java/nio/charset/CoderResult$1
+ 311496 1 java/nio/charset/CoderResult$2
+ 311496 1 java/security/BasicPermissionCollection
+ 311496 1 java/security/CodeSource
+ 311496 1 java/security/Policy$UnsupportedEmptyCollection
+ 311496 1 java/security/PrivilegedActionException
+ 311496 1 java/security/ProtectionDomain
+ 311496 1 java/util/BitSet
+ 311496 1 java/util/Collections$EmptyList
+ 311496 1 java/util/Collections$EmptyMap
+ 311496 1 java/util/Collections$EmptySet
+ 311496 1 java/util/Collections$ReverseComparator
+ 311496 1 java/util/Collections$SynchronizedMap
+ 311496 1 java/util/HashMap$KeySet
+ 311496 1 java/util/Hashtable$EmptyEnumerator
+ 311496 1 java/util/Hashtable$EmptyIterator
+ 311496 1 java/util/IdentityHashMap
+ 311496 1 java/util/IdentityHashMap$KeySet
+ 311496 1 java/util/LinkedHashMap
+ 311496 1 java/util/LinkedHashMap$KeyIterator
+ 311496 1 java/util/LinkedHashSet
+ 311496 1 java/util/Properties
+ 311496 1 java/util/concurrent/ConcurrentHashMap
+ 311496 1 java/util/concurrent/atomic/AtomicInteger
+ 311496 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
+ 311496 1 java/util/jar/JarFile
+ 311496 1 java/util/jar/JarFile$JarFileEntry
+ 311496 1 java/util/jar/JavaUtilJarAccessImpl
+ 311496 1 java/util/zip/Inflater
+ 311496 1 java/util/zip/ZipEntry
+ 311496 1 java/util/zip/ZipFile$1
+ 311496 1 java/util/zip/ZipFile$ZipFileInputStream
+ 311496 1 sun/misc/FileURLMapper
+ 311496 1 sun/misc/Launcher
+ 311496 1 sun/misc/Launcher$AppClassLoader
+ 311496 1 sun/misc/Launcher$AppClassLoader$1
+ 311496 1 sun/misc/Launcher$ExtClassLoader
+ 311496 1 sun/misc/Launcher$ExtClassLoader$1
+ 311496 1 sun/misc/Launcher$Factory
+ 311496 1 sun/misc/SoftCache
+ 311496 1 sun/misc/URLClassPath$FileLoader
+ 311496 1 sun/misc/URLClassPath$FileLoader$1
+ 311496 1 sun/misc/URLClassPath$JarLoader$1
+ 311496 1 sun/misc/Unsafe
+ 311496 1 sun/net/www/MessageHeader
+ 311496 1 sun/net/www/protocol/file/FileURLConnection
+ 311496 1 sun/net/www/protocol/file/Handler
+ 311496 1 sun/nio/cs/StandardCharsets
+ 311496 1 sun/nio/cs/StandardCharsets$Aliases
+ 311496 1 sun/nio/cs/StandardCharsets$Cache
+ 311496 1 sun/nio/cs/StandardCharsets$Classes
+ 311496 1 sun/nio/cs/StreamDecoder
+ 311496 1 sun/nio/cs/US_ASCII
+ 311496 1 sun/reflect/ReflectionFactory
+ 311496 1 sun/reflect/ReflectionFactory$1
+ 311496 2 [Ljava/io/File;
+ 311496 2 [Ljava/lang/Thread;
+ 311496 2 [Ljava/lang/reflect/Constructor;
+ 311496 2 [Ljava/net/URL;
+ 311496 2 java/io/BufferedOutputStream
+ 311496 2 java/io/BufferedWriter
+ 311496 2 java/io/ExpiringCache
+ 311496 2 java/io/ExpiringCache$1
+ 311496 2 java/io/FileOutputStream
+ 311496 2 java/io/FilePermission
+ 311496 2 java/io/FilePermission$1
+ 311496 2 java/io/OutputStreamWriter
+ 311496 2 java/io/PrintStream
+ 311496 2 java/lang/Class$1
+ 311496 2 java/lang/ClassNotFoundException
+ 311496 2 java/lang/Shutdown$Lock
+ 311496 2 java/lang/ThreadGroup
+ 311496 2 java/lang/ref/ReferenceQueue
+ 311496 2 java/lang/ref/ReferenceQueue$Null
+ 311496 2 java/lang/ref/WeakReference
+ 311496 2 java/net/URLClassLoader$1
+ 311496 2 java/nio/ByteOrder
+ 311496 2 java/nio/charset/CoderResult
+ 311496 2 java/security/Permissions
+ 311496 2 java/util/AbstractList$Itr
+ 311496 2 java/util/HashSet
+ 311496 2 java/util/IdentityHashMap$KeyIterator
+ 311496 2 java/util/StringTokenizer
+ 311496 2 sun/misc/NativeSignalHandler
+ 311496 2 sun/misc/URLClassPath
+ 311496 2 sun/net/www/protocol/jar/Handler
+ 311496 2 sun/nio/cs/StreamEncoder
+ 311496 2 sun/nio/cs/Surrogate$Parser
+ 311496 2 sun/nio/cs/US_ASCII$Encoder
+ 311496 2 sun/reflect/DelegatingConstructorAccessorImpl
+ 311496 2 sun/reflect/NativeConstructorAccessorImpl
+ 311496 3 java/io/FileInputStream
+ 311496 3 java/lang/Boolean
+ 311496 3 java/lang/Class$3
+ 311496 3 java/lang/Integer
+ 311496 3 java/lang/RuntimePermission
+ 311496 3 java/lang/ThreadLocal
+ 311496 3 java/nio/charset/CodingErrorAction
+ 311496 3 java/util/Stack
+ 311496 3 sun/misc/Signal
+ 311496 4 [Ljava/lang/annotation/Annotation;
+ 311496 4 [Ljava/lang/reflect/Field;
+ 311496 4 java/lang/ref/ReferenceQueue$Lock
+ 311496 4 java/lang/reflect/Constructor
+ 311496 4 sun/misc/MetaIndex
+ 311496 4 sun/nio/cs/US_ASCII$Decoder
+ 311496 4 sun/reflect/ReflectionFactory$GetReflectionFactoryAction
+ 311496 5 java/io/FileDescriptor
+ 311496 5 sun/misc/URLClassPath$JarLoader
+ 311496 6 java/lang/Thread
+ 311496 6 java/nio/HeapByteBuffer
+ 311496 6 java/util/Hashtable
+ 311496 6 sun/misc/URLClassPath$3
+ 311496 7 java/lang/ref/SoftReference
+ 311496 8 [Ljava/io/ObjectStreamField;
+ 311496 8 java/lang/OutOfMemoryError
+ 311496 8 java/lang/ref/Finalizer
+ 311496 8 java/util/ArrayList
+ 311496 8 java/util/Vector
+ 311496 9 java/lang/StringBuffer
+ 311496 10 [Ljava/util/Hashtable$Entry;
+ 311496 10 java/io/ObjectStreamField
+ 311496 10 java/security/AccessControlContext
+ 311496 11 java/net/Parts
+ 311496 11 java/nio/HeapCharBuffer
+ 311496 12 [Ljava/lang/Class;
+ 311496 12 java/io/ExpiringCache$Entry
+ 311496 13 java/net/URL
+ 311496 14 java/util/HashMap
+ 311496 15 java/util/HashMap$Entry
+ 311496 15 java/util/LinkedHashMap$Entry
+ 311496 16 java/lang/Object
+ 311496 16 java/util/concurrent/ConcurrentHashMap$Segment
+ 311496 16 java/util/concurrent/locks/ReentrantLock$NonfairSync
+ 311496 17 [Ljava/util/HashMap$Entry;
+ 311496 17 sun/security/action/GetPropertyAction
+ 311496 19 java/util/Locale
+ 311496 22 [Ljava/util/concurrent/ConcurrentHashMap$HashEntry;
+ 311496 23 java/util/concurrent/ConcurrentHashMap$HashEntry
+ 311496 37 java/io/File
+ 311496 37 java/lang/reflect/Field
+ 311496 57 [Ljava/lang/String;
+ 311496 57 java/util/Hashtable$Entry
+ 311496 73 java/lang/StringBuilder
+ 311496 326 [Ljava/lang/Object;
+ 311496 374 [I
+ 311496 395 java/lang/Class
+ 311496 406 [B
+ 311496 486 [S
+ 311496 541 [[I
+ 311496 931 java/lang/String
+ 311496 1076 [C
+
+In the first section - Java object allocation byte distributions by PID and
+class, you can see in graphical form the range of sizes of each type of
+object. For example:
+
+ 311496 [C
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@ 271
+ 32 |@@@@@@@@@@@@@@@@@@@@@ 573
+ 64 |@@@@@@ 150
+ 128 |@@@ 68
+ 256 | 8
+ 512 | 1
+ 1024 | 2
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 | 3
+ 32768 | 0
+
+shows that there were 271 objects of type [C and size 16 bytes to 31 bytes
+created. It is important to pay close attention to the third column,
+"count" as this will indicate if there were any instances in a particular
+size, even if the number is too small to show up on the histogram scale.
+
+In the second section - Java object allocation count by pid and class, you can
+easily see that there were 395 objects of java/lang/Class created, and 931
+objects of java/lang/String.
+
diff --git a/Examples/j_package_example.txt b/Examples/j_package_example.txt
new file mode 100644
index 000000000000..0d4da29d9e90
--- /dev/null
+++ b/Examples/j_package_example.txt
@@ -0,0 +1,44 @@
+The following are examples of j_package.d.
+
+This script will show you the number of times a class is loaded from
+particular packages.
+
+Here you can see it running when Code/Java/Func_abc runs.
+
+# j_package.d
+Tracing... Hit Ctrl-C to end.
+
+ PID LOADS PACKAGE
+ 311500 1 .
+ 311500 1 java/lang/annotation
+ 311500 1 java/nio/charset/spi
+ 311500 1 java/security/cert
+ 311500 1 sun/net/www/protocol/jar
+ 311500 1 sun/nio
+ 311500 1 sun/reflect/misc
+ 311500 1 sun/security/action
+ 311500 1 sun/security/provider
+ 311500 1 sun/security/util
+ 311500 1 sun/util
+ 311500 2 sun/net/www/protocol/file
+ 311500 3 java/util/concurrent/atomic
+ 311500 3 sun/net/www
+ 311500 4 java/util/concurrent
+ 311500 4 java/util/jar
+ 311500 7 java/nio
+ 311500 7 java/util/concurrent/locks
+ 311500 7 java/util/zip
+ 311500 8 java/nio/charset
+ 311500 10 java/net
+ 311500 12 java/lang/ref
+ 311500 12 java/lang/reflect
+ 311500 13 sun/nio/cs
+ 311500 18 sun/reflect
+ 311500 19 java/security
+ 311500 34 sun/misc
+ 311500 38 java/io
+ 311500 46 java/util
+ 311500 69 java/lang
+
+You can see that 69 classes from the java/lang package were loaded during the
+time this script was running.
diff --git a/Examples/j_profile_example.txt b/Examples/j_profile_example.txt
new file mode 100644
index 000000000000..bb45c4b3f759
--- /dev/null
+++ b/Examples/j_profile_example.txt
@@ -0,0 +1,209 @@
+The following are examples of j_profile.d.
+
+This script samples on-CPU stack traces and prints them with Java
+translations. With DTrace, as well as tracing events, you can also sample
+them. Each approach has its own advantages and disadvantages and you are
+encouraged to try both when investigating performance issues (especially
+tracing). Sampling is inaccurate and can miss events, yet is a quick and
+easy way to discover a certain set of performance issues involving on-CPU
+load.
+
+This script samples at 101 Hertz, printing out the 25 most frequently seen
+stack traces down to 10 lines deep. All of these values can be tweaked in
+the script.
+
+Here we run the script on Code/Java/Func_loop. The argument fed to the script
+is the PID of the Java program we wish to investigate. Here the raw output is
+show, then again after filtering using c++filt.
+
+# j_profile.d -p 1312
+Sampling 10-level stacks at 101 Hertz... Hit Ctrl-C to end.
+^C
+
+Top 25 most frequently sampled stacks,
+
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3
+ libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27
+ libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f
+ libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 30
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3
+ libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27
+ libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f
+ libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 31
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3
+ libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27
+ libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f
+ libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 32
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3
+ libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27
+ libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f
+ libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 33
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3
+ libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27
+ libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f
+ libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 41
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3
+ libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27
+ libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f
+ libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 72
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x1a3
+ libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v2468_v_+0x27
+ libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJavaCallArguments_pnGThread__v_+0x2f
+ libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_jobject_nLJNICallType_pnK_jmethodID_pnSJNI_ArgumentPusher_pnGThread__v_+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 116
+
+
+The most frequent stacks had Func_loop.func_c() on CPU, with a stack trace
+showing func_b() and func_a() - as expected from the source to Func_loop.java.
+
+
+Now passing that output through c++filt to translate the compiled C++ symbols
+of the JVM.
+
+# j_profile.d -p 1312 -o out.j_profile
+# c++filt out.j_profile
+Sampling 10-level stacks at 101 Hertz... Hit Ctrl-C to end.
+
+Top 25 most frequently sampled stacks,
+
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3
+ libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27
+ libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f
+ libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 10
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3
+ libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27
+ libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f
+ libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 13
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3
+ libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27
+ libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f
+ libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 19
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3
+ libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27
+ libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f
+ libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 21
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3
+ libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27
+ libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f
+ libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 29
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3
+ libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27
+ libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f
+ libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 53
+
+ Func_loop.func_c()V
+ Func_loop.func_b()V
+ Func_loop.func_a()V
+ Func_loop.main([Ljava/lang/String;)V
+ StubRoutines (1)
+ libjvm.so`void JavaCalls::call_helper(JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x1a3
+ libjvm.so`void os::os_exception_wrapper(void(*)(JavaValue*,methodHandle*,JavaCallArguments*,Thread*),JavaValue*,methodHandle*,JavaCallArguments*,Thread*)+0x27
+ libjvm.so`void JavaCalls::call(JavaValue*,methodHandle,JavaCallArguments*,Thread*)+0x2f
+ libjvm.so`void jni_invoke_static(JNIEnv_*,JavaValue*,_jobject*,JNICallType,_jmethodID*,JNI_ArgumentPusher*,Thread*)+0x1df
+ libjvm.so`jni_CallStaticVoidMethod+0x15d
+ 74
+
+
diff --git a/Examples/j_stat_example.txt b/Examples/j_stat_example.txt
new file mode 100644
index 000000000000..6c7e12e99cfa
--- /dev/null
+++ b/Examples/j_stat_example.txt
@@ -0,0 +1,33 @@
+The following are examples of running j_stat.d.
+
+j_stat.d shows you the number of events per second that have happened since
+the last line output. The default interval is 1 second, but you can specify
+other intervals as arguments to the script.
+
+This shows the j_stat.d script reflecting the Code/Ruby/Func_abc script.
+
+# j_stat.d
+TIME EXEC/s THREAD/s METHOD/s OBJNEW/s CLOAD/s EXCP/s GC/s
+2007 Sep 24 04:00:34 0 0 0 0 0 0 0
+2007 Sep 24 04:00:35 2 6 11660 5306 318 41 0
+2007 Sep 24 04:00:36 0 0 124 4 0 2 0
+2007 Sep 24 04:00:37 0 0 124 4 0 2 0
+2007 Sep 24 04:00:38 0 0 123 75 9 1 0
+2007 Sep 24 04:00:39 0 0 0 0 0 0 0
+2007 Sep 24 04:00:40 0 0 0 0 0 0 0
+^C
+
+Here we can see that at 2007 Sep 24 04:00:35 there were 2 Java programs
+executed, (this number will include those without Java provider support),
+there were 6 threads created, 11,660 methods called, 5306 new objects created,
+318 class loads, 41 exceptions raised and no garbage collects.
+
+The numbers are per second counts for the interval specified. The default
+interval is 1 second.
+
+If you see a count in "EXECS" but not in the other columns, then your Java
+software is probably not running with the DTrace hotspot provider.
+
+If you see counts in "CLOAD" but not in "METHODS", then you Java software
+probably isn't running with "+ExtendedDTraceProbes".
+
diff --git a/Examples/j_syscalls_example.txt b/Examples/j_syscalls_example.txt
new file mode 100644
index 000000000000..911d4b0ec5c5
--- /dev/null
+++ b/Examples/j_syscalls_example.txt
@@ -0,0 +1,165 @@
+The following are examples of j_syscalls.d.
+
+This is a simple script to count executed Java methods and system calls.
+Here it traces an example program, Code/Java/Func_abc.
+
+# j_syscalls.d -c 'java -XX:+ExtendedDTraceProbes Func_abc'
+Tracing... Hit Ctrl-C to end.
+Function A
+Function B
+Function C
+ PID TYPE NAME COUNT
+ 311536 method Func_abc.func_a 1
+ 311536 method Func_abc.func_b 1
+ 311536 method Func_abc.func_c 1
+ 311536 method Func_abc.main 1
+ 311536 method java/io/BufferedInputStream.<clinit> 1
+ 311536 method java/io/BufferedReader.<clinit> 1
+ 311536 method java/io/BufferedReader.close 1
+ 311536 method java/io/BufferedWriter.<clinit> 1
+ 311536 method java/io/Console$1$1.<init> 1
+ 311536 method java/io/Console$1$1.run 1
+ 311536 method java/io/Console$1.<init> 1
+ 311536 method java/io/Console$1.consoleRestoreHook 1
+ 311536 method java/io/Console.<clinit> 1
+ 311536 method java/io/Console.access$600 1
+ 311536 method java/io/DataInputStream.<init> 1
+ 311536 method java/io/DataInputStream.readFully 1
+ 311536 method java/io/DeleteOnExitHook.<clinit> 1
+ 311536 method java/io/DeleteOnExitHook.<init> 1
+ 311536 method java/io/DeleteOnExitHook.hook 1
+ 311536 method java/io/DeleteOnExitHook.run 1
+[... 900 lines truncated ...]
+ 311536 method java/io/ExpiringCache.get 18
+ 311536 method java/lang/Class.desiredAssertionStatus 18
+ 311536 method java/lang/Class.desiredAssertionStatus0 18
+ 311536 method java/lang/ClassLoader.findLoadedClass 18
+ 311536 method java/lang/ClassLoader.findLoadedClass0 18
+ 311536 method java/io/BufferedReader.ensureOpen 19
+ 311536 method java/lang/System.currentTimeMillis 19
+ 311536 method java/nio/Buffer.limit 19
+ 311536 method java/util/Locale.<init> 19
+ 311536 method java/util/Locale.createSingleton 19
+ 311536 method java/util/concurrent/ConcurrentHashMap$Segment.put 19
+ 311536 method java/util/concurrent/ConcurrentHashMap.put 19
+ 311536 method java/util/concurrent/locks/AbstractQueuedSynchronizer.compareAndSetState 19
+ 311536 method java/util/concurrent/locks/AbstractQueuedSynchronizer.release 19
+ 311536 method java/util/concurrent/locks/AbstractQueuedSynchronizer.setState 19
+ 311536 method java/util/concurrent/locks/ReentrantLock$NonfairSync.lock 19
+ 311536 method java/util/concurrent/locks/ReentrantLock$Sync.tryRelease 19
+ 311536 method java/util/concurrent/locks/ReentrantLock.lock 19
+ 311536 method java/util/concurrent/locks/ReentrantLock.unlock 19
+ 311536 method java/io/ObjectStreamField.<init> 20
+ 311536 method java/nio/ByteBuffer.array 20
+ 311536 method java/util/AbstractList.<init> 20
+ 311536 method java/util/BitSet.get 20
+ 311536 method java/util/concurrent/ConcurrentHashMap.hash 20
+ 311536 method java/util/concurrent/ConcurrentHashMap.segmentFor 20
+ 311536 method sun/misc/VM.isBooted 20
+ 311536 syscall memcntl 20
+ 311536 method java/io/File.getName 21
+ 311536 method java/io/UnixFileSystem.getBooleanAttributes 21
+ 311536 method java/io/UnixFileSystem.getBooleanAttributes0 21
+ 311536 method java/lang/StringBuffer.append 21
+ 311536 method java/nio/charset/Charset.atBugLevel 21
+ 311536 method java/util/concurrent/ConcurrentHashMap$HashEntry.newArray 22
+ 311536 method sun/misc/Unsafe.compareAndSwapInt 22
+ 311536 method java/util/HashMap.<init> 23
+ 311536 method java/util/concurrent/ConcurrentHashMap$HashEntry.<init> 23
+ 311536 syscall stat64 23
+ 311536 method java/nio/charset/CoderResult.isUnderflow 24
+ 311536 method java/util/AbstractMap.<init> 24
+ 311536 method java/util/Vector.elementAt 24
+ 311536 syscall munmap 24
+ 311536 method java/lang/Class.getClassLoader 25
+ 311536 syscall lwp_sigmask 25
+ 311536 syscall sigaction 25
+ 311536 method java/util/AbstractCollection.<init> 26
+ 311536 method java/util/ArrayList.add 26
+ 311536 method java/util/ArrayList.ensureCapacity 26
+ 311536 method java/lang/ClassLoader.loadClass 27
+ 311536 method java/net/URL.<init> 27
+ 311536 method java/lang/ClassLoader.check 28
+ 311536 method java/lang/ClassLoader.checkName 28
+ 311536 method java/lang/ref/Reference.<init> 28
+ 311536 method java/lang/String.endsWith 29
+ 311536 method sun/misc/VM.allowArraySyntax 29
+ 311536 method java/io/ExpiringCache.entryFor 30
+ 311536 method java/io/UnixFileSystem.resolve 30
+ 311536 method java/util/HashMap$Entry.<init> 30
+ 311536 method java/util/LinkedHashMap.get 30
+ 311536 syscall priocntlsys 30
+ 311536 method java/util/HashMap.put 33
+ 311536 method java/util/Vector.<init> 33
+ 311536 method java/io/UnixFileSystem.normalize 34
+ 311536 method java/lang/Class.getClassLoader0 34
+ 311536 method java/lang/String.toLowerCase 34
+ 311536 method sun/security/action/GetPropertyAction.run 34
+ 311536 method java/nio/CharBuffer.arrayOffset 36
+ 311536 method java/util/HashMap.getEntry 36
+ 311536 method java/io/File.<init> 37
+ 311536 method java/io/UnixFileSystem.prefixLength 37
+ 311536 method java/io/BufferedReader.readLine 38
+ 311536 method java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread 38
+ 311536 syscall resolvepath 38
+ 311536 method java/lang/CharacterDataLatin1.toLowerCase 41
+ 311536 method java/lang/CharacterDataLatin1.getProperties 43
+ 311536 method java/security/AccessController.doPrivileged 43
+ 311536 method java/util/Vector.size 43
+ 311536 method java/nio/Buffer.position 44
+ 311536 method java/nio/ByteBuffer.arrayOffset 44
+ 311536 method java/lang/System.getProperty 48
+ 311536 method java/util/Properties.getProperty 50
+ 311536 method java/util/BitSet.expandTo 51
+ 311536 method java/util/BitSet.set 51
+ 311536 syscall pollsys 55
+ 311536 method java/lang/System.checkKey 56
+ 311536 method java/lang/Thread.currentThread 57
+ 311536 method java/util/Hashtable$Entry.<init> 57
+ 311536 method java/util/Hashtable.get 59
+ 311536 method java/util/Hashtable.put 63
+ 311536 method java/util/BitSet.checkInvariants 71
+ 311536 method java/util/BitSet.wordIndex 72
+ 311536 method java/lang/StringBuilder.<init> 73
+ 311536 method java/lang/StringBuilder.toString 73
+ 311536 method java/lang/AbstractStringBuilder.expandCapacity 81
+ 311536 method java/util/HashMap.hash 81
+ 311536 method java/util/HashMap.indexFor 81
+ 311536 method java/lang/AbstractStringBuilder.<init> 82
+ 311536 method java/lang/Character.toLowerCase 82
+ 311536 method java/lang/String.startsWith 83
+ 311536 method java/util/Arrays.copyOf 87
+ 311536 method java/lang/String.lastIndexOf 90
+ 311536 method java/lang/String.substring 94
+ 311536 syscall brk 102
+ 311536 syscall ioctl 103
+ 311536 method java/util/Arrays.copyOfRange 107
+ 311536 syscall mmap 127
+ 311536 syscall open 129
+ 311536 syscall close 133
+ 311536 method java/lang/String.getChars 156
+ 311536 method java/lang/System.getSecurityManager 174
+ 311536 method java/lang/String.<init> 175
+ 311536 syscall xstat 188
+ 311536 method java/lang/String.equals 202
+ 311536 method java/lang/Math.min 208
+ 311536 method java/lang/String.hashCode 213
+ 311536 syscall lwp_exit 291
+ 311536 method java/lang/String.indexOf 302
+ 311536 method java/lang/System.arraycopy 360
+ 311536 method java/lang/StringBuilder.append 545
+ 311536 method java/lang/AbstractStringBuilder.append 561
+ 311536 syscall llseek 664
+ 311536 syscall read 668
+ 311536 method java/lang/Object.<init> 823
+ 311536 method java/lang/String.charAt 1987
+
+While tracing there were numerous system calls made, including 668 reads()'s,
+and 664 llseek()'s. Many Java methods were also called, with 1987
+java/lang/String.charAt being the most of a particular kind.
+
+This script can provide an insight to how an application is interacting
+with the system, by providing both application method calls and
+system calls in the same output.
+
+
diff --git a/Examples/j_syscolors_example.txt b/Examples/j_syscolors_example.txt
new file mode 100644
index 000000000000..3b130ee8883b
--- /dev/null
+++ b/Examples/j_syscolors_example.txt
@@ -0,0 +1,1550 @@
+The following are examples of j_syscolors.d.
+
+This is a simple script to trace the method flow of Java methods within a
+program, and the system calls made. It watches Java method entries and
+returns, and indents child * method calls. It renders the output in color
+("colour") using terminal escape sequences (which you can tweak by modifying
+the script).
+
+Here it traces the example program, Code/Java/Func_abc.
+
+WARNING: This output is full of terminal escape sequences, so if you are
+trying to view this through an editor or web browser - it may look awful.
+Try viewing this using "more" (although, depending on your terminal, it
+still may look awful).
+
+The fields in the output are, in order; CPU-id, Process ID/Thread ID, Elapsed
+time from previous line to current line, Type of call (func/syscall) and name
+of Java method or syscall.
+
+If the flow appears to jump, check the TID column - the JVM may have switched
+to another thread.
+
+WARNING: Watch the first column carefully, it prints the CPU-id. If it changes,
+then it is very likely that the output has been shuffled. Changes in TID will
+appear to shuffle output, as we change from one thread depth to the next. See
+Docs/Notes/ALLjavaflow.txt for additional notes.
+
+# j_syscolors.d -c 'java -XX:+ExtendedDTraceProbes Func_abc'
+C PID/TID DELTA(us) TYPE -- NAME
+0 311542/1 2 syscall -> munmap
+0 311542/1 33 syscall <- munmap
+0 311542/1 52 syscall -> mmap
+0 311542/1 16 syscall <- mmap
+0 311542/1 34 syscall -> setcontext
+0 311542/1 7 syscall <- setcontext
+0 311542/1 7 syscall -> getrlimit
+0 311542/1 7 syscall <- getrlimit
+0 311542/1 7 syscall -> getpid
+0 311542/1 6 syscall <- getpid
+0 311542/1 58 syscall -> setcontext
+0 311542/1 6 syscall <- setcontext
+0 311542/1 975 syscall -> sysi86
+0 311542/1 9 syscall <- sysi86
+0 311542/1 134 syscall -> brk
+0 311542/1 8 syscall <- brk
+0 311542/1 7 syscall -> brk
+0 311542/1 10 syscall <- brk
+0 311542/1 47 syscall -> sysconfig
+0 311542/1 6 syscall <- sysconfig
+0 311542/1 36 syscall -> resolvepath
+0 311542/1 31 syscall <- resolvepath
+0 311542/1 9 syscall -> resolvepath
+0 311542/1 18 syscall <- resolvepath
+0 311542/1 85 syscall -> access
+0 311542/1 20 syscall <- access
+0 311542/1 8 syscall -> access
+0 311542/1 24 syscall <- access
+0 311542/1 115 syscall -> open
+0 311542/1 27 syscall <- open
+0 311542/1 14 syscall -> fstat64
+0 311542/1 7 syscall <- fstat64
+0 311542/1 11 syscall -> fstat64
+0 311542/1 6 syscall <- fstat64
+0 311542/1 22 syscall -> ioctl
+0 311542/1 7 syscall <- ioctl
+0 311542/1 11 syscall -> read
+0 311542/1 43 syscall <- read
+0 311542/1 39 syscall -> read
+0 311542/1 7 syscall <- read
+0 311542/1 10 syscall -> llseek
+0 311542/1 7 syscall <- llseek
+0 311542/1 8 syscall -> close
+0 311542/1 9 syscall <- close
+0 311542/1 12 syscall -> sysconfig
+0 311542/1 6 syscall <- sysconfig
+0 311542/1 7 syscall -> sysconfig
+0 311542/1 6 syscall <- sysconfig
+0 311542/1 6 syscall -> sysconfig
+0 311542/1 6 syscall <- sysconfig
+0 311542/1 11 syscall -> xstat
+0 311542/1 27 syscall <- xstat
+0 311542/1 19 syscall -> exece
+0 311542/1 684 syscall <- exece
+0 311542/1 3320 syscall -> mmap
+0 311542/1 22 syscall <- mmap
+0 311542/1 26 syscall -> resolvepath
+0 311542/1 52 syscall <- resolvepath
+0 311542/1 8 syscall -> resolvepath
+0 311542/1 25 syscall <- resolvepath
+0 311542/1 7 syscall -> sysconfig
+0 311542/1 6 syscall <- sysconfig
+0 311542/1 9 syscall -> xstat
+0 311542/1 18 syscall <- xstat
+0 311542/1 7 syscall -> open
+0 311542/1 18 syscall <- open
+0 311542/1 7 syscall -> fxstat
+0 311542/1 7 syscall <- fxstat
+0 311542/1 6 syscall -> mmap
+0 311542/1 11 syscall <- mmap
+0 311542/1 7 syscall -> close
+0 311542/1 10 syscall <- close
+0 311542/1 42 syscall -> xstat
+0 311542/1 27 syscall <- xstat
+0 311542/1 8 syscall -> xstat
+0 311542/1 19 syscall <- xstat
+0 311542/1 7 syscall -> xstat
+0 311542/1 25 syscall <- xstat
+[... 31000 lines truncated ...]
+0 311542/2 10 method <- java/util/HashSet.add
+0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess
+0 311542/2 28 method -> java/lang/reflect/Method.getModifiers
+0 311542/2 14 method <- java/lang/reflect/Method.getModifiers
+0 311542/2 17 method -> Func_abc.main
+0 311542/2 14 method -> Func_abc.func_a
+0 311542/2 12 method -> java/lang/ClassLoader.checkPackageAccess
+0 311542/2 10 method -> java/lang/System.getSecurityManager
+0 311542/2 10 method <- java/lang/System.getSecurityManager
+0 311542/2 11 method -> java/util/HashSet.add
+0 311542/2 10 method -> java/util/HashMap.put
+0 311542/2 9 method -> java/lang/Object.hashCode
+0 311542/2 10 method <- java/lang/Object.hashCode
+0 311542/2 10 method -> java/util/HashMap.hash
+0 311542/2 10 method <- java/util/HashMap.hash
+0 311542/2 10 method -> java/util/HashMap.indexFor
+0 311542/2 10 method <- java/util/HashMap.indexFor
+0 311542/2 10 method <- java/util/HashMap.put
+0 311542/2 10 method <- java/util/HashSet.add
+0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess
+0 311542/2 20 syscall -> brk
+0 311542/2 15 syscall <- brk
+0 311542/2 13 syscall -> brk
+0 311542/2 17 syscall <- brk
+0 311542/2 47 method -> java/lang/ClassLoader.loadClassInternal
+0 311542/2 12 method -> java/lang/ClassLoader.loadClass
+0 311542/2 10 method -> sun/misc/Launcher$AppClassLoader.loadClass
+0 311542/2 10 method -> java/lang/String.lastIndexOf
+0 311542/2 10 method -> java/lang/String.lastIndexOf
+0 311542/2 11 method <- java/lang/String.lastIndexOf
+0 311542/2 10 method <- java/lang/String.lastIndexOf
+0 311542/2 10 method -> java/lang/System.getSecurityManager
+0 311542/2 10 method <- java/lang/System.getSecurityManager
+0 311542/2 10 method -> java/lang/ClassLoader.loadClass
+0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass
+0 311542/2 10 method -> java/lang/ClassLoader.check
+0 311542/2 9 method <- java/lang/ClassLoader.check
+0 311542/2 10 method -> java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 11 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method -> sun/misc/VM.allowArraySyntax
+0 311542/2 10 method <- sun/misc/VM.allowArraySyntax
+0 311542/2 10 method -> java/lang/String.charAt
+0 311542/2 10 method <- java/lang/String.charAt
+0 311542/2 10 method <- java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0
+0 311542/2 12 method <- java/lang/ClassLoader.findLoadedClass0
+0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass
+0 311542/2 11 method -> java/lang/ClassLoader.loadClass
+0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass
+0 311542/2 10 method -> java/lang/ClassLoader.check
+0 311542/2 9 method <- java/lang/ClassLoader.check
+0 311542/2 10 method -> java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method -> sun/misc/VM.allowArraySyntax
+0 311542/2 10 method <- sun/misc/VM.allowArraySyntax
+0 311542/2 10 method -> java/lang/String.charAt
+0 311542/2 9 method <- java/lang/String.charAt
+0 311542/2 10 method <- java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0
+0 311542/2 11 method <- java/lang/ClassLoader.findLoadedClass0
+0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass
+0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass0
+0 311542/2 10 method -> java/lang/ClassLoader.check
+0 311542/2 10 method <- java/lang/ClassLoader.check
+0 311542/2 10 method -> java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method -> sun/misc/VM.allowArraySyntax
+0 311542/2 10 method <- sun/misc/VM.allowArraySyntax
+0 311542/2 10 method -> java/lang/String.charAt
+0 311542/2 9 method <- java/lang/String.charAt
+0 311542/2 10 method <- java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass
+0 311542/2 12 method <- java/lang/ClassLoader.findBootstrapClass
+0 311542/2 10 method <- java/lang/ClassLoader.findBootstrapClass0
+0 311542/2 11 method <- java/lang/ClassLoader.loadClass
+0 311542/2 10 method <- java/lang/ClassLoader.loadClass
+0 311542/2 10 method <- sun/misc/Launcher$AppClassLoader.loadClass
+0 311542/2 10 method <- java/lang/ClassLoader.loadClass
+0 311542/2 10 method <- java/lang/ClassLoader.loadClassInternal
+0 311542/2 14 method -> java/lang/ClassLoader.checkPackageAccess
+0 311542/2 10 method -> java/lang/System.getSecurityManager
+0 311542/2 10 method <- java/lang/System.getSecurityManager
+0 311542/2 10 method -> java/util/HashSet.add
+0 311542/2 10 method -> java/util/HashMap.put
+0 311542/2 10 method -> java/lang/Object.hashCode
+0 311542/2 9 method <- java/lang/Object.hashCode
+0 311542/2 10 method -> java/util/HashMap.hash
+0 311542/2 10 method <- java/util/HashMap.hash
+0 311542/2 10 method -> java/util/HashMap.indexFor
+0 311542/2 10 method <- java/util/HashMap.indexFor
+0 311542/2 11 method <- java/util/HashMap.put
+0 311542/2 10 method <- java/util/HashSet.add
+0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess
+0 311542/2 18 method -> java/io/PrintStream.println
+0 311542/2 13 method -> java/io/PrintStream.print
+0 311542/2 12 method -> java/io/PrintStream.write
+0 311542/2 12 method -> java/io/PrintStream.ensureOpen
+0 311542/2 13 method <- java/io/PrintStream.ensureOpen
+0 311542/2 15 method -> java/io/Writer.write
+0 311542/2 16 method -> java/io/BufferedWriter.write
+0 311542/2 13 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 12 method -> java/io/BufferedWriter.min
+0 311542/2 10 method <- java/io/BufferedWriter.min
+0 311542/2 13 method -> java/lang/String.getChars
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 11 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/String.getChars
+0 311542/2 10 method <- java/io/BufferedWriter.write
+0 311542/2 10 method <- java/io/Writer.write
+0 311542/2 13 method -> java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 13 method -> java/io/OutputStreamWriter.write
+0 311542/2 13 method -> sun/nio/cs/StreamEncoder.write
+0 311542/2 13 method -> sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 13 method -> sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 14 method -> java/nio/CharBuffer.wrap
+0 311542/2 11 method -> java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method -> java/nio/CharBuffer.<init>
+0 311542/2 10 method -> java/nio/Buffer.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 11 method -> java/nio/Buffer.limit
+0 311542/2 10 method <- java/nio/Buffer.limit
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.<init>
+0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.wrap
+0 311542/2 13 method -> java/nio/Buffer.hasRemaining
+0 311542/2 10 method <- java/nio/Buffer.hasRemaining
+0 311542/2 14 method -> java/nio/charset/CharsetEncoder.encode
+0 311542/2 13 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 13 method -> java/nio/CharBuffer.hasArray
+0 311542/2 10 method <- java/nio/CharBuffer.hasArray
+0 311542/2 14 method -> java/nio/ByteBuffer.hasArray
+0 311542/2 10 method <- java/nio/ByteBuffer.hasArray
+0 311542/2 13 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 56 method -> java/nio/CharBuffer.array
+0 311542/2 11 method <- java/nio/CharBuffer.array
+0 311542/2 12 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 13 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 16 method -> java/nio/ByteBuffer.array
+0 311542/2 10 method <- java/nio/ByteBuffer.array
+0 311542/2 12 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 12 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 17 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 12 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 12 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 12 method -> java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow
+0 311542/2 12 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode
+0 311542/2 13 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 14 method -> java/nio/Buffer.remaining
+0 311542/2 10 method <- java/nio/Buffer.remaining
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method <- java/io/OutputStreamWriter.write
+0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer
+0 311542/2 13 method -> java/io/OutputStreamWriter.flushBuffer
+0 311542/2 12 method -> sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 13 method -> sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 13 method -> sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 12 method -> java/nio/Buffer.flip
+0 311542/2 10 method <- java/nio/Buffer.flip
+0 311542/2 14 method -> java/nio/ByteBuffer.array
+0 311542/2 10 method <- java/nio/ByteBuffer.array
+0 311542/2 12 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 14 method -> java/io/PrintStream.write
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 10 method <- java/io/PrintStream.ensureOpen
+0 311542/2 13 method -> java/io/BufferedOutputStream.write
+0 311542/2 15 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/io/BufferedOutputStream.write
+0 311542/2 12 method -> java/io/BufferedOutputStream.flush
+0 311542/2 12 method -> java/io/BufferedOutputStream.flushBuffer
+0 311542/2 15 method -> java/io/FileOutputStream.write
+0 311542/2 12 method -> java/io/FileOutputStream.writeBytes
+0 311542/2 55 syscall -> write
+0 311542/2 160 syscall <- write
+0 311542/2 12 method <- java/io/FileOutputStream.writeBytes
+0 311542/2 12 method <- java/io/FileOutputStream.write
+0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer
+0 311542/2 13 method <- java/io/BufferedOutputStream.flush
+0 311542/2 11 method <- java/io/PrintStream.write
+0 311542/2 13 method -> java/nio/Buffer.clear
+0 311542/2 11 method <- java/nio/Buffer.clear
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer
+0 311542/2 15 method -> java/lang/String.indexOf
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/io/PrintStream.write
+0 311542/2 10 method <- java/io/PrintStream.print
+0 311542/2 12 method -> java/io/PrintStream.newLine
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 10 method <- java/io/PrintStream.ensureOpen
+0 311542/2 12 method -> java/io/BufferedWriter.newLine
+0 311542/2 12 method -> java/io/Writer.write
+0 311542/2 10 method -> java/io/BufferedWriter.write
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 11 method -> java/io/BufferedWriter.min
+0 311542/2 10 method <- java/io/BufferedWriter.min
+0 311542/2 10 method -> java/lang/String.getChars
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/String.getChars
+0 311542/2 10 method <- java/io/BufferedWriter.write
+0 311542/2 10 method <- java/io/Writer.write
+0 311542/2 10 method <- java/io/BufferedWriter.newLine
+0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method -> java/io/OutputStreamWriter.write
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write
+0 311542/2 9 method -> sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method -> java/nio/CharBuffer.wrap
+0 311542/2 10 method -> java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method -> java/nio/CharBuffer.<init>
+0 311542/2 10 method -> java/nio/Buffer.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 9 method <- java/lang/Object.<init>
+0 311542/2 10 method -> java/nio/Buffer.limit
+0 311542/2 10 method <- java/nio/Buffer.limit
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.<init>
+0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.wrap
+0 311542/2 10 method -> java/nio/Buffer.hasRemaining
+0 311542/2 10 method <- java/nio/Buffer.hasRemaining
+0 311542/2 10 method -> java/nio/charset/CharsetEncoder.encode
+0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 10 method -> java/nio/CharBuffer.hasArray
+0 311542/2 9 method <- java/nio/CharBuffer.hasArray
+0 311542/2 10 method -> java/nio/ByteBuffer.hasArray
+0 311542/2 9 method <- java/nio/ByteBuffer.hasArray
+0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method -> java/nio/CharBuffer.array
+0 311542/2 9 method <- java/nio/CharBuffer.array
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/ByteBuffer.array
+0 311542/2 10 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 9 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 11 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 10 method -> java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method -> java/nio/Buffer.remaining
+0 311542/2 10 method <- java/nio/Buffer.remaining
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method <- java/io/OutputStreamWriter.write
+0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method -> java/nio/Buffer.flip
+0 311542/2 9 method <- java/nio/Buffer.flip
+0 311542/2 11 method -> java/nio/ByteBuffer.array
+0 311542/2 9 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/io/PrintStream.write
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 9 method <- java/io/PrintStream.ensureOpen
+0 311542/2 10 method -> java/io/BufferedOutputStream.write
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/io/BufferedOutputStream.write
+0 311542/2 10 method -> java/io/BufferedOutputStream.flush
+0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method -> java/io/FileOutputStream.write
+0 311542/2 10 method -> java/io/FileOutputStream.writeBytes
+0 311542/2 12 syscall -> write
+0 311542/2 63 syscall <- write
+0 311542/2 8 method <- java/io/FileOutputStream.writeBytes
+0 311542/2 11 method <- java/io/FileOutputStream.write
+0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flush
+0 311542/2 10 method <- java/io/PrintStream.write
+0 311542/2 10 method -> java/nio/Buffer.clear
+0 311542/2 10 method <- java/nio/Buffer.clear
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer
+0 311542/2 10 method -> java/io/BufferedOutputStream.flush
+0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flush
+0 311542/2 10 method <- java/io/PrintStream.newLine
+0 311542/2 10 method <- java/io/PrintStream.println
+0 311542/2 23 method -> java/lang/ClassLoader.loadClassInternal
+0 311542/2 11 method -> java/lang/ClassLoader.loadClass
+0 311542/2 10 method -> sun/misc/Launcher$AppClassLoader.loadClass
+0 311542/2 10 method -> java/lang/String.lastIndexOf
+0 311542/2 10 method -> java/lang/String.lastIndexOf
+0 311542/2 10 method <- java/lang/String.lastIndexOf
+0 311542/2 10 method <- java/lang/String.lastIndexOf
+0 311542/2 10 method -> java/lang/System.getSecurityManager
+0 311542/2 10 method <- java/lang/System.getSecurityManager
+0 311542/2 10 method -> java/lang/ClassLoader.loadClass
+0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass
+0 311542/2 10 method -> java/lang/ClassLoader.check
+0 311542/2 10 method <- java/lang/ClassLoader.check
+0 311542/2 10 method -> java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method -> sun/misc/VM.allowArraySyntax
+0 311542/2 9 method <- sun/misc/VM.allowArraySyntax
+0 311542/2 10 method -> java/lang/String.charAt
+0 311542/2 10 method <- java/lang/String.charAt
+0 311542/2 10 method <- java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0
+0 311542/2 14 method <- java/lang/ClassLoader.findLoadedClass0
+0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass
+0 311542/2 12 method -> java/lang/ClassLoader.loadClass
+0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass
+0 311542/2 10 method -> java/lang/ClassLoader.check
+0 311542/2 9 method <- java/lang/ClassLoader.check
+0 311542/2 10 method -> java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 9 method -> java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method -> sun/misc/VM.allowArraySyntax
+0 311542/2 10 method <- sun/misc/VM.allowArraySyntax
+0 311542/2 10 method -> java/lang/String.charAt
+0 311542/2 9 method <- java/lang/String.charAt
+0 311542/2 10 method <- java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0
+0 311542/2 12 method <- java/lang/ClassLoader.findLoadedClass0
+0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass
+0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass0
+0 311542/2 10 method -> java/lang/ClassLoader.check
+0 311542/2 9 method <- java/lang/ClassLoader.check
+0 311542/2 10 method -> java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 9 method -> java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method -> sun/misc/VM.allowArraySyntax
+0 311542/2 10 method <- sun/misc/VM.allowArraySyntax
+0 311542/2 10 method -> java/lang/String.charAt
+0 311542/2 10 method <- java/lang/String.charAt
+0 311542/2 10 method <- java/lang/ClassLoader.checkName
+0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass
+0 311542/2 15 method <- java/lang/ClassLoader.findBootstrapClass
+0 311542/2 10 method <- java/lang/ClassLoader.findBootstrapClass0
+0 311542/2 11 method <- java/lang/ClassLoader.loadClass
+0 311542/2 10 method <- java/lang/ClassLoader.loadClass
+0 311542/2 10 method <- sun/misc/Launcher$AppClassLoader.loadClass
+0 311542/2 10 method <- java/lang/ClassLoader.loadClass
+0 311542/2 10 method <- java/lang/ClassLoader.loadClassInternal
+0 311542/2 17 method -> java/lang/ClassLoader.checkPackageAccess
+0 311542/2 10 method -> java/lang/System.getSecurityManager
+0 311542/2 10 method <- java/lang/System.getSecurityManager
+0 311542/2 11 method -> java/util/HashSet.add
+0 311542/2 10 method -> java/util/HashMap.put
+0 311542/2 10 method -> java/lang/Object.hashCode
+0 311542/2 10 method <- java/lang/Object.hashCode
+0 311542/2 10 method -> java/util/HashMap.hash
+0 311542/2 10 method <- java/util/HashMap.hash
+0 311542/2 10 method -> java/util/HashMap.indexFor
+0 311542/2 10 method <- java/util/HashMap.indexFor
+0 311542/2 11 method <- java/util/HashMap.put
+0 311542/2 10 method <- java/util/HashSet.add
+0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess
+0 311542/2 20 method -> java/lang/Thread.currentThread
+0 311542/2 11 method <- java/lang/Thread.currentThread
+0 311542/2 13 method -> java/lang/Thread.sleep
+0 311542/2 21 syscall -> pollsys
+0 311542/10 59827 syscall <- pollsys
+0 311542/10 31 syscall -> pollsys
+0 311542/10 59842 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 60087 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59871 syscall <- pollsys
+0 311542/10 26 syscall -> pollsys
+0 311542/3 1008044 syscall <- lwp_cond_wait
+0 311542/3 37 syscall -> lwp_cond_wait
+0 311542/10 59402 syscall <- pollsys
+0 311542/10 18 syscall -> pollsys
+0 311542/10 59999 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59965 syscall <- pollsys
+0 311542/10 25 syscall -> pollsys
+0 311542/10 59979 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 51241 syscall <- pollsys
+0 311542/10 31 syscall -> pollsys
+0 311542/10 58679 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 50215 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59734 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59977 syscall <- pollsys
+0 311542/10 26 syscall -> pollsys
+0 311542/10 59970 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59966 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 60013 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59924 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+Function B
+0 311542/2 1003741 syscall <- pollsys
+0 311542/2 28 method <- java/lang/Thread.sleep
+0 311542/2 45 method -> Func_abc.func_b
+0 311542/2 36 method -> java/io/PrintStream.println
+0 311542/2 11 method -> java/io/PrintStream.print
+0 311542/2 10 method -> java/io/PrintStream.write
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 10 method <- java/io/PrintStream.ensureOpen
+0 311542/2 11 method -> java/io/Writer.write
+0 311542/2 11 method -> java/io/BufferedWriter.write
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 12 method -> java/io/BufferedWriter.min
+0 311542/2 10 method <- java/io/BufferedWriter.min
+0 311542/2 11 method -> java/lang/String.getChars
+0 311542/2 11 method -> java/lang/System.arraycopy
+0 311542/2 11 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/String.getChars
+0 311542/2 11 method <- java/io/BufferedWriter.write
+0 311542/2 10 method <- java/io/Writer.write
+0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 11 method -> java/io/OutputStreamWriter.write
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 11 method -> sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method -> java/nio/CharBuffer.wrap
+0 311542/2 10 method -> java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method -> java/nio/CharBuffer.<init>
+0 311542/2 10 method -> java/nio/Buffer.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 11 method -> java/nio/Buffer.limit
+0 311542/2 10 method <- java/nio/Buffer.limit
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.<init>
+0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.wrap
+0 311542/2 11 method -> java/nio/Buffer.hasRemaining
+0 311542/2 10 method <- java/nio/Buffer.hasRemaining
+0 311542/2 11 method -> java/nio/charset/CharsetEncoder.encode
+0 311542/2 11 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 10 method -> java/nio/CharBuffer.hasArray
+0 311542/2 10 method <- java/nio/CharBuffer.hasArray
+0 311542/2 11 method -> java/nio/ByteBuffer.hasArray
+0 311542/2 10 method <- java/nio/ByteBuffer.hasArray
+0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method -> java/nio/CharBuffer.array
+0 311542/2 10 method <- java/nio/CharBuffer.array
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 11 method -> java/nio/ByteBuffer.array
+0 311542/2 10 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 9 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 12 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 11 method -> java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method -> java/nio/Buffer.remaining
+0 311542/2 10 method <- java/nio/Buffer.remaining
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method <- java/io/OutputStreamWriter.write
+0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method -> java/nio/Buffer.flip
+0 311542/2 9 method <- java/nio/Buffer.flip
+0 311542/2 11 method -> java/nio/ByteBuffer.array
+0 311542/2 9 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/io/PrintStream.write
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 9 method <- java/io/PrintStream.ensureOpen
+0 311542/2 11 method -> java/io/BufferedOutputStream.write
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/io/BufferedOutputStream.write
+0 311542/2 10 method -> java/io/BufferedOutputStream.flush
+0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method -> java/io/FileOutputStream.write
+0 311542/2 10 method -> java/io/FileOutputStream.writeBytes
+0 311542/2 17 syscall -> write
+0 311542/2 104 syscall <- write
+0 311542/2 9 method <- java/io/FileOutputStream.writeBytes
+0 311542/2 11 method <- java/io/FileOutputStream.write
+0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flush
+0 311542/2 10 method <- java/io/PrintStream.write
+0 311542/2 10 method -> java/nio/Buffer.clear
+0 311542/2 10 method <- java/nio/Buffer.clear
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer
+0 311542/2 11 method -> java/lang/String.indexOf
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 11 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/io/PrintStream.write
+0 311542/2 10 method <- java/io/PrintStream.print
+0 311542/2 10 method -> java/io/PrintStream.newLine
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 10 method <- java/io/PrintStream.ensureOpen
+0 311542/2 10 method -> java/io/BufferedWriter.newLine
+0 311542/2 10 method -> java/io/Writer.write
+0 311542/2 10 method -> java/io/BufferedWriter.write
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 9 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method -> java/io/BufferedWriter.min
+0 311542/2 9 method <- java/io/BufferedWriter.min
+0 311542/2 10 method -> java/lang/String.getChars
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/String.getChars
+0 311542/2 10 method <- java/io/BufferedWriter.write
+0 311542/2 10 method <- java/io/Writer.write
+0 311542/2 10 method <- java/io/BufferedWriter.newLine
+0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 9 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method -> java/io/OutputStreamWriter.write
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method -> java/nio/CharBuffer.wrap
+0 311542/2 10 method -> java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method -> java/nio/CharBuffer.<init>
+0 311542/2 10 method -> java/nio/Buffer.<init>
+0 311542/2 9 method -> java/lang/Object.<init>
+0 311542/2 9 method <- java/lang/Object.<init>
+0 311542/2 10 method -> java/nio/Buffer.limit
+0 311542/2 10 method <- java/nio/Buffer.limit
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.<init>
+0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.wrap
+0 311542/2 10 method -> java/nio/Buffer.hasRemaining
+0 311542/2 10 method <- java/nio/Buffer.hasRemaining
+0 311542/2 10 method -> java/nio/charset/CharsetEncoder.encode
+0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 10 method -> java/nio/CharBuffer.hasArray
+0 311542/2 10 method <- java/nio/CharBuffer.hasArray
+0 311542/2 10 method -> java/nio/ByteBuffer.hasArray
+0 311542/2 10 method <- java/nio/ByteBuffer.hasArray
+0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method -> java/nio/CharBuffer.array
+0 311542/2 10 method <- java/nio/CharBuffer.array
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 11 method -> java/nio/ByteBuffer.array
+0 311542/2 9 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 11 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 9 method <- java/nio/Buffer.position
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 10 method -> java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method -> java/nio/Buffer.remaining
+0 311542/2 10 method <- java/nio/Buffer.remaining
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method <- java/io/OutputStreamWriter.write
+0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method -> java/nio/Buffer.flip
+0 311542/2 10 method <- java/nio/Buffer.flip
+0 311542/2 10 method -> java/nio/ByteBuffer.array
+0 311542/2 9 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/io/PrintStream.write
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 9 method <- java/io/PrintStream.ensureOpen
+0 311542/2 10 method -> java/io/BufferedOutputStream.write
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/io/BufferedOutputStream.write
+0 311542/2 10 method -> java/io/BufferedOutputStream.flush
+0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method -> java/io/FileOutputStream.write
+0 311542/2 10 method -> java/io/FileOutputStream.writeBytes
+0 311542/2 11 syscall -> write
+0 311542/2 64 syscall <- write
+0 311542/2 8 method <- java/io/FileOutputStream.writeBytes
+0 311542/2 11 method <- java/io/FileOutputStream.write
+0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flush
+0 311542/2 10 method <- java/io/PrintStream.write
+0 311542/2 10 method -> java/nio/Buffer.clear
+0 311542/2 10 method <- java/nio/Buffer.clear
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer
+0 311542/2 10 method -> java/io/BufferedOutputStream.flush
+0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flush
+0 311542/2 10 method <- java/io/PrintStream.newLine
+0 311542/2 10 method <- java/io/PrintStream.println
+0 311542/2 10 method -> java/lang/Thread.currentThread
+0 311542/2 10 method <- java/lang/Thread.currentThread
+0 311542/2 10 method -> java/lang/Thread.sleep
+0 311542/2 14 syscall -> pollsys
+0 311542/10 59985 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59968 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59981 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59960 syscall <- pollsys
+0 311542/10 28 syscall -> pollsys
+0 311542/10 59967 syscall <- pollsys
+0 311542/10 22 syscall -> pollsys
+0 311542/3 1050003 syscall <- lwp_cond_wait
+0 311542/3 14 syscall -> lwp_cond_wait
+0 311542/10 59985 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59969 syscall <- pollsys
+0 311542/10 25 syscall -> pollsys
+0 311542/10 59980 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 51269 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 58678 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 50207 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59714 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59967 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59965 syscall <- pollsys
+0 311542/10 28 syscall -> pollsys
+0 311542/10 59970 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59952 syscall <- pollsys
+0 311542/10 31 syscall -> pollsys
+0 311542/10 59969 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+Function C
+0 311542/2 1006879 syscall <- pollsys
+0 311542/2 29 method <- java/lang/Thread.sleep
+0 311542/2 45 method -> Func_abc.func_c
+0 311542/2 36 method -> java/io/PrintStream.println
+0 311542/2 11 method -> java/io/PrintStream.print
+0 311542/2 10 method -> java/io/PrintStream.write
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 10 method <- java/io/PrintStream.ensureOpen
+0 311542/2 11 method -> java/io/Writer.write
+0 311542/2 11 method -> java/io/BufferedWriter.write
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 12 method -> java/io/BufferedWriter.min
+0 311542/2 10 method <- java/io/BufferedWriter.min
+0 311542/2 11 method -> java/lang/String.getChars
+0 311542/2 11 method -> java/lang/System.arraycopy
+0 311542/2 11 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/String.getChars
+0 311542/2 11 method <- java/io/BufferedWriter.write
+0 311542/2 10 method <- java/io/Writer.write
+0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 11 method -> java/io/OutputStreamWriter.write
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 11 method -> sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method -> java/nio/CharBuffer.wrap
+0 311542/2 11 method -> java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method -> java/nio/CharBuffer.<init>
+0 311542/2 10 method -> java/nio/Buffer.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 11 method -> java/nio/Buffer.limit
+0 311542/2 10 method <- java/nio/Buffer.limit
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.<init>
+0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.wrap
+0 311542/2 11 method -> java/nio/Buffer.hasRemaining
+0 311542/2 10 method <- java/nio/Buffer.hasRemaining
+0 311542/2 11 method -> java/nio/charset/CharsetEncoder.encode
+0 311542/2 11 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 10 method -> java/nio/CharBuffer.hasArray
+0 311542/2 10 method <- java/nio/CharBuffer.hasArray
+0 311542/2 11 method -> java/nio/ByteBuffer.hasArray
+0 311542/2 10 method <- java/nio/ByteBuffer.hasArray
+0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method -> java/nio/CharBuffer.array
+0 311542/2 9 method <- java/nio/CharBuffer.array
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 11 method -> java/nio/ByteBuffer.array
+0 311542/2 10 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 12 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 11 method -> java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method -> java/nio/Buffer.remaining
+0 311542/2 10 method <- java/nio/Buffer.remaining
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method <- java/io/OutputStreamWriter.write
+0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method -> java/nio/Buffer.flip
+0 311542/2 9 method <- java/nio/Buffer.flip
+0 311542/2 11 method -> java/nio/ByteBuffer.array
+0 311542/2 9 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 11 method -> java/io/PrintStream.write
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 9 method <- java/io/PrintStream.ensureOpen
+0 311542/2 11 method -> java/io/BufferedOutputStream.write
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/io/BufferedOutputStream.write
+0 311542/2 11 method -> java/io/BufferedOutputStream.flush
+0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method -> java/io/FileOutputStream.write
+0 311542/2 10 method -> java/io/FileOutputStream.writeBytes
+0 311542/2 17 syscall -> write
+0 311542/2 143 syscall <- write
+0 311542/2 9 method <- java/io/FileOutputStream.writeBytes
+0 311542/2 11 method <- java/io/FileOutputStream.write
+0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flush
+0 311542/2 10 method <- java/io/PrintStream.write
+0 311542/2 10 method -> java/nio/Buffer.clear
+0 311542/2 10 method <- java/nio/Buffer.clear
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer
+0 311542/2 11 method -> java/lang/String.indexOf
+0 311542/2 10 method -> java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/lang/String.indexOf
+0 311542/2 10 method <- java/io/PrintStream.write
+0 311542/2 10 method <- java/io/PrintStream.print
+0 311542/2 10 method -> java/io/PrintStream.newLine
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 10 method <- java/io/PrintStream.ensureOpen
+0 311542/2 10 method -> java/io/BufferedWriter.newLine
+0 311542/2 10 method -> java/io/Writer.write
+0 311542/2 10 method -> java/io/BufferedWriter.write
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 9 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method -> java/io/BufferedWriter.min
+0 311542/2 9 method <- java/io/BufferedWriter.min
+0 311542/2 10 method -> java/lang/String.getChars
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/String.getChars
+0 311542/2 10 method <- java/io/BufferedWriter.write
+0 311542/2 10 method <- java/io/Writer.write
+0 311542/2 10 method <- java/io/BufferedWriter.newLine
+0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen
+0 311542/2 10 method -> java/io/OutputStreamWriter.write
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method -> java/nio/CharBuffer.wrap
+0 311542/2 10 method -> java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method -> java/nio/CharBuffer.<init>
+0 311542/2 10 method -> java/nio/Buffer.<init>
+0 311542/2 9 method -> java/lang/Object.<init>
+0 311542/2 9 method <- java/lang/Object.<init>
+0 311542/2 10 method -> java/nio/Buffer.limit
+0 311542/2 10 method <- java/nio/Buffer.limit
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.<init>
+0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>
+0 311542/2 10 method <- java/nio/CharBuffer.wrap
+0 311542/2 10 method -> java/nio/Buffer.hasRemaining
+0 311542/2 10 method <- java/nio/Buffer.hasRemaining
+0 311542/2 10 method -> java/nio/charset/CharsetEncoder.encode
+0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 10 method -> java/nio/CharBuffer.hasArray
+0 311542/2 10 method <- java/nio/CharBuffer.hasArray
+0 311542/2 10 method -> java/nio/ByteBuffer.hasArray
+0 311542/2 10 method <- java/nio/ByteBuffer.hasArray
+0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method -> java/nio/CharBuffer.array
+0 311542/2 10 method <- java/nio/CharBuffer.array
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 11 method -> java/nio/ByteBuffer.array
+0 311542/2 9 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 11 method -> java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 9 method <- java/nio/Buffer.position
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/nio/Buffer.position
+0 311542/2 10 method <- java/nio/Buffer.position
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop
+0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop
+0 311542/2 10 method -> java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode
+0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow
+0 311542/2 10 method -> java/nio/Buffer.remaining
+0 311542/2 10 method <- java/nio/Buffer.remaining
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write
+0 311542/2 10 method <- java/io/OutputStreamWriter.write
+0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer
+0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method -> java/nio/Buffer.flip
+0 311542/2 10 method <- java/nio/Buffer.flip
+0 311542/2 10 method -> java/nio/ByteBuffer.array
+0 311542/2 9 method <- java/nio/ByteBuffer.array
+0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset
+0 311542/2 9 method <- java/nio/ByteBuffer.arrayOffset
+0 311542/2 10 method -> java/io/PrintStream.write
+0 311542/2 10 method -> java/io/PrintStream.ensureOpen
+0 311542/2 9 method <- java/io/PrintStream.ensureOpen
+0 311542/2 10 method -> java/io/BufferedOutputStream.write
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/io/BufferedOutputStream.write
+0 311542/2 10 method -> java/io/BufferedOutputStream.flush
+0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method -> java/io/FileOutputStream.write
+0 311542/2 10 method -> java/io/FileOutputStream.writeBytes
+0 311542/2 11 syscall -> write
+0 311542/2 63 syscall <- write
+0 311542/2 8 method <- java/io/FileOutputStream.writeBytes
+0 311542/2 11 method <- java/io/FileOutputStream.write
+0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flush
+0 311542/2 10 method <- java/io/PrintStream.write
+0 311542/2 10 method -> java/nio/Buffer.clear
+0 311542/2 10 method <- java/nio/Buffer.clear
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer
+0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer
+0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer
+0 311542/2 10 method -> java/io/BufferedOutputStream.flush
+0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer
+0 311542/2 10 method <- java/io/BufferedOutputStream.flush
+0 311542/2 10 method <- java/io/PrintStream.newLine
+0 311542/2 10 method <- java/io/PrintStream.println
+0 311542/2 10 method -> java/lang/Thread.currentThread
+0 311542/2 10 method <- java/lang/Thread.currentThread
+0 311542/2 11 method -> java/lang/Thread.sleep
+0 311542/2 14 syscall -> pollsys
+0 311542/10 59975 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59963 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59976 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59961 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 59968 syscall <- pollsys
+0 311542/10 22 syscall -> pollsys
+0 311542/3 1009924 syscall <- lwp_cond_wait
+0 311542/3 17 syscall -> lwp_cond_wait
+0 311542/10 50021 syscall <- pollsys
+0 311542/10 31 syscall -> pollsys
+0 311542/10 59941 syscall <- pollsys
+0 311542/10 27 syscall -> pollsys
+0 311542/10 60034 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 61298 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 58590 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 50205 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59723 syscall <- pollsys
+0 311542/10 29 syscall -> pollsys
+0 311542/10 60208 syscall <- pollsys
+0 311542/10 28 syscall -> pollsys
+0 311542/10 59733 syscall <- pollsys
+0 311542/10 28 syscall -> pollsys
+0 311542/10 59986 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59938 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/10 59968 syscall <- pollsys
+0 311542/10 30 syscall -> pollsys
+0 311542/2 1007088 syscall <- pollsys
+0 311542/2 30 method <- java/lang/Thread.sleep
+0 311542/2 28 method <- Func_abc.func_c
+0 311542/2 10 method <- Func_abc.func_b
+0 311542/2 10 method <- Func_abc.func_a
+0 311542/2 10 method <- Func_abc.main
+0 311542/2 27 method -> java/lang/Thread.exit
+0 311542/2 38 method -> java/lang/ThreadGroup.remove
+0 311542/2 19 method -> java/lang/System.arraycopy
+0 311542/2 11 method <- java/lang/System.arraycopy
+0 311542/2 14 method -> java/lang/Object.notifyAll
+0 311542/2 16 method <- java/lang/Object.notifyAll
+0 311542/2 11 method <- java/lang/ThreadGroup.remove
+0 311542/2 16 method <- java/lang/Thread.exit
+0 311542/2 22 syscall -> mprotect
+0 311542/2 19 syscall <- mprotect
+0 311542/2 19 syscall -> lwp_sigmask
+0 311542/2 7 syscall <- lwp_sigmask
+0 311542/2 25 syscall -> lwp_self
+0 311542/2 6 syscall <- lwp_self
+0 311542/2 7 syscall -> lwp_sigmask
+0 311542/2 5 syscall <- lwp_sigmask
+0 311542/2 6 syscall -> lwp_sigmask
+0 311542/2 6 syscall <- lwp_sigmask
+0 311542/2 124 method -> java/lang/Thread.<init>
+0 311542/2 12 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 11 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 11 method -> java/lang/Thread.init
+0 311542/2 10 method -> java/lang/Thread.currentThread
+0 311542/2 10 method <- java/lang/Thread.currentThread
+0 311542/2 11 method -> java/lang/System.getSecurityManager
+0 311542/2 10 method <- java/lang/System.getSecurityManager
+0 311542/2 11 method -> java/lang/ThreadGroup.checkAccess
+0 311542/2 10 method -> java/lang/System.getSecurityManager
+0 311542/2 10 method <- java/lang/System.getSecurityManager
+0 311542/2 10 method <- java/lang/ThreadGroup.checkAccess
+0 311542/2 10 method -> java/lang/ThreadGroup.addUnstarted
+0 311542/2 10 method <- java/lang/ThreadGroup.addUnstarted
+0 311542/2 11 method -> java/lang/String.toCharArray
+0 311542/2 11 method -> java/lang/String.getChars
+0 311542/2 10 method -> java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/System.arraycopy
+0 311542/2 10 method <- java/lang/String.getChars
+0 311542/2 10 method <- java/lang/String.toCharArray
+0 311542/2 10 method -> java/lang/Thread.getContextClassLoader
+0 311542/2 10 method <- java/lang/Thread.getContextClassLoader
+0 311542/2 11 method -> java/security/AccessController.getContext
+0 311542/2 10 method -> java/security/AccessController.getStackAccessControlContext
+0 311542/2 17 method <- java/security/AccessController.getStackAccessControlContext
+0 311542/2 11 method -> java/security/AccessControlContext.optimize
+0 311542/2 10 method -> java/security/AccessController.getInheritedAccessControlContext
+0 311542/2 11 method <- java/security/AccessController.getInheritedAccessControlContext
+0 311542/2 11 method <- java/security/AccessControlContext.optimize
+0 311542/2 10 method <- java/security/AccessController.getContext
+0 311542/2 10 method -> java/lang/Thread.setPriority
+0 311542/2 10 method -> java/lang/Thread.checkAccess
+0 311542/2 9 method -> java/lang/System.getSecurityManager
+0 311542/2 9 method <- java/lang/System.getSecurityManager
+0 311542/2 10 method <- java/lang/Thread.checkAccess
+0 311542/2 11 method -> java/lang/Thread.setPriority0
+0 311542/2 15 syscall -> priocntlsys
+0 311542/2 9 syscall <- priocntlsys
+0 311542/2 7 syscall -> priocntlsys
+0 311542/2 8 syscall <- priocntlsys
+0 311542/2 7 method <- java/lang/Thread.setPriority0
+0 311542/2 10 method <- java/lang/Thread.setPriority
+0 311542/2 11 method -> java/lang/Thread.nextThreadID
+0 311542/2 11 method <- java/lang/Thread.nextThreadID
+0 311542/2 10 method <- java/lang/Thread.init
+0 311542/2 10 method <- java/lang/Thread.<init>
+0 311542/2 12 method -> java/lang/ThreadGroup.add
+0 311542/2 11 method <- java/lang/ThreadGroup.add
+0 311542/2 10 syscall -> mprotect
+0 311542/2 7 syscall <- mprotect
+0 311542/2 12 method -> java/lang/Shutdown.shutdown
+0 311542/2 15 method -> java/lang/Shutdown.sequence
+0 311542/2 12 method -> java/lang/Shutdown.runHooks
+0 311542/2 14 method -> java/util/AbstractList.iterator
+0 311542/2 30 syscall -> llseek
+0 311542/2 9 syscall <- llseek
+0 311542/2 8 syscall -> read
+0 311542/2 1709 syscall <- read
+0 311542/2 27 syscall -> llseek
+0 311542/2 14 syscall <- llseek
+0 311542/2 7 syscall -> read
+0 311542/2 23 syscall <- read
+0 311542/2 280 method -> java/util/AbstractList$Itr.<init>
+0 311542/2 28 method -> java/util/AbstractList$Itr.<init>
+0 311542/2 17 method -> java/lang/Object.<init>
+0 311542/2 12 method <- java/lang/Object.<init>
+0 311542/2 25 method <- java/util/AbstractList$Itr.<init>
+0 311542/2 11 method <- java/util/AbstractList$Itr.<init>
+0 311542/2 10 method <- java/util/AbstractList.iterator
+0 311542/2 17 method -> java/util/AbstractList$Itr.hasNext
+0 311542/2 16 method <- java/util/AbstractList$Itr.hasNext
+0 311542/2 13 method -> java/util/AbstractList$Itr.next
+0 311542/2 12 method -> java/util/AbstractList$Itr.checkForComodification
+0 311542/2 10 method <- java/util/AbstractList$Itr.checkForComodification
+0 311542/2 13 method -> java/util/ArrayList.get
+0 311542/2 11 method -> java/util/ArrayList.RangeCheck
+0 311542/2 10 method <- java/util/ArrayList.RangeCheck
+0 311542/2 10 method <- java/util/ArrayList.get
+0 311542/2 10 method <- java/util/AbstractList$Itr.next
+0 311542/2 15 method -> java/io/Console$1$1.run
+0 311542/2 14 method -> java/io/Console.access$600
+0 311542/2 12 method <- java/io/Console.access$600
+0 311542/2 10 method <- java/io/Console$1$1.run
+0 311542/2 10 method -> java/util/AbstractList$Itr.hasNext
+0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext
+0 311542/2 10 method -> java/util/AbstractList$Itr.next
+0 311542/2 10 method -> java/util/AbstractList$Itr.checkForComodification
+0 311542/2 10 method <- java/util/AbstractList$Itr.checkForComodification
+0 311542/2 11 method -> java/util/ArrayList.get
+0 311542/2 10 method -> java/util/ArrayList.RangeCheck
+0 311542/2 10 method <- java/util/ArrayList.RangeCheck
+0 311542/2 10 method <- java/util/ArrayList.get
+0 311542/2 10 method <- java/util/AbstractList$Itr.next
+0 311542/2 11 method -> java/lang/ApplicationShutdownHooks.run
+0 311542/2 16 method -> java/util/IdentityHashMap.keySet
+0 311542/2 27 syscall -> llseek
+0 311542/2 7 syscall <- llseek
+0 311542/2 8 syscall -> read
+0 311542/2 18 syscall <- read
+0 311542/2 7 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 6 syscall -> read
+0 311542/2 17 syscall <- read
+0 311542/2 139 method -> java/util/IdentityHashMap$KeySet.<init>
+0 311542/2 14 method -> java/util/IdentityHashMap$KeySet.<init>
+0 311542/2 14 method -> java/util/AbstractSet.<init>
+0 311542/2 10 method -> java/util/AbstractCollection.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 11 method <- java/util/AbstractCollection.<init>
+0 311542/2 10 method <- java/util/AbstractSet.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap.keySet
+0 311542/2 14 method -> java/util/IdentityHashMap$KeySet.iterator
+0 311542/2 17 syscall -> llseek
+0 311542/2 7 syscall <- llseek
+0 311542/2 7 syscall -> read
+0 311542/2 15 syscall <- read
+0 311542/2 7 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 6 syscall -> read
+0 311542/2 12 syscall <- read
+0 311542/2 30 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 7 syscall -> read
+0 311542/2 14 syscall <- read
+0 311542/2 7 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 6 syscall -> read
+0 311542/2 17 syscall <- read
+0 311542/2 125 method -> java/util/IdentityHashMap$KeyIterator.<init>
+0 311542/2 14 method -> java/util/IdentityHashMap$KeyIterator.<init>
+0 311542/2 14 method -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+0 311542/2 13 method -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+0 311542/2 57 method -> java/lang/Object.<init>
+0 311542/2 11 method <- java/lang/Object.<init>
+0 311542/2 15 method -> java/util/IdentityHashMap.access$000
+0 311542/2 11 method <- java/util/IdentityHashMap.access$000
+0 311542/2 15 method -> java/util/IdentityHashMap.access$200
+0 311542/2 11 method <- java/util/IdentityHashMap.access$200
+0 311542/2 13 method <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.iterator
+0 311542/2 14 method -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+0 311542/2 11 method <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+0 311542/2 11 method -> java/util/IdentityHashMap$KeySet.iterator
+0 311542/2 10 method -> java/util/IdentityHashMap$KeyIterator.<init>
+0 311542/2 10 method -> java/util/IdentityHashMap$KeyIterator.<init>
+0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator.<init>
+0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.iterator
+0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext
+0 311542/2 11 method <- java/lang/ApplicationShutdownHooks.run
+0 311542/2 10 method -> java/util/AbstractList$Itr.hasNext
+0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext
+0 311542/2 10 method -> java/util/AbstractList$Itr.next
+0 311542/2 10 method -> java/util/AbstractList$Itr.checkForComodification
+0 311542/2 10 method <- java/util/AbstractList$Itr.checkForComodification
+0 311542/2 11 method -> java/util/ArrayList.get
+0 311542/2 10 method -> java/util/ArrayList.RangeCheck
+0 311542/2 10 method <- java/util/ArrayList.RangeCheck
+0 311542/2 10 method <- java/util/ArrayList.get
+0 311542/2 10 method <- java/util/AbstractList$Itr.next
+0 311542/2 11 method -> java/io/File$1.run
+0 311542/2 17 syscall -> llseek
+0 311542/2 8 syscall <- llseek
+0 311542/2 8 syscall -> read
+0 311542/2 17 syscall <- read
+0 311542/2 7 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 6 syscall -> read
+0 311542/2 12 syscall <- read
+0 311542/2 62 method -> java/io/DeleteOnExitHook.<clinit>
+0 311542/2 19 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 7 syscall -> read
+0 311542/2 14 syscall <- read
+0 311542/2 7 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 6 syscall -> read
+0 311542/2 12 syscall <- read
+0 311542/2 130 method -> java/util/LinkedHashSet.<init>
+0 311542/2 15 method -> java/util/HashSet.<init>
+0 311542/2 10 method -> java/util/AbstractSet.<init>
+0 311542/2 10 method -> java/util/AbstractCollection.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 11 method <- java/util/AbstractCollection.<init>
+0 311542/2 10 method <- java/util/AbstractSet.<init>
+0 311542/2 15 method -> java/util/LinkedHashMap.<init>
+0 311542/2 13 method -> java/util/HashMap.<init>
+0 311542/2 10 method -> java/util/AbstractMap.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 10 method <- java/util/AbstractMap.<init>
+0 311542/2 12 method -> java/lang/Float.isNaN
+0 311542/2 10 method <- java/lang/Float.isNaN
+0 311542/2 15 method -> java/util/LinkedHashMap.init
+0 311542/2 10 method -> java/util/LinkedHashMap$Entry.<init>
+0 311542/2 10 method -> java/util/HashMap$Entry.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 9 method <- java/lang/Object.<init>
+0 311542/2 10 method <- java/util/HashMap$Entry.<init>
+0 311542/2 10 method <- java/util/LinkedHashMap$Entry.<init>
+0 311542/2 10 method <- java/util/LinkedHashMap.init
+0 311542/2 10 method <- java/util/HashMap.<init>
+0 311542/2 10 method <- java/util/LinkedHashMap.<init>
+0 311542/2 10 method <- java/util/HashSet.<init>
+0 311542/2 10 method <- java/util/LinkedHashSet.<init>
+0 311542/2 12 method <- java/io/DeleteOnExitHook.<clinit>
+0 311542/2 13 method -> java/io/DeleteOnExitHook.hook
+0 311542/2 13 method -> java/io/DeleteOnExitHook.<init>
+0 311542/2 12 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 10 method <- java/io/DeleteOnExitHook.<init>
+0 311542/2 10 method <- java/io/DeleteOnExitHook.hook
+0 311542/2 13 method -> java/io/DeleteOnExitHook.run
+0 311542/2 15 method -> java/util/ArrayList.<init>
+0 311542/2 10 method -> java/util/AbstractList.<init>
+0 311542/2 10 method -> java/util/AbstractCollection.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 9 method <- java/lang/Object.<init>
+0 311542/2 10 method <- java/util/AbstractCollection.<init>
+0 311542/2 10 method <- java/util/AbstractList.<init>
+0 311542/2 15 method -> java/util/AbstractCollection.toArray
+0 311542/2 13 method -> java/util/HashSet.size
+0 311542/2 12 method <- java/util/HashSet.size
+0 311542/2 13 method -> java/util/HashSet.iterator
+0 311542/2 12 method -> java/util/HashMap.keySet
+0 311542/2 19 syscall -> llseek
+0 311542/2 7 syscall <- llseek
+0 311542/2 8 syscall -> read
+0 311542/2 17 syscall <- read
+0 311542/2 7 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 6 syscall -> read
+0 311542/2 12 syscall <- read
+0 311542/2 68 method -> java/util/HashMap$KeySet.<init>
+0 311542/2 14 method -> java/util/HashMap$KeySet.<init>
+0 311542/2 14 method -> java/util/AbstractSet.<init>
+0 311542/2 10 method -> java/util/AbstractCollection.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 11 method <- java/util/AbstractCollection.<init>
+0 311542/2 10 method <- java/util/AbstractSet.<init>
+0 311542/2 10 method <- java/util/HashMap$KeySet.<init>
+0 311542/2 10 method <- java/util/HashMap$KeySet.<init>
+0 311542/2 10 method <- java/util/HashMap.keySet
+0 311542/2 13 method -> java/util/HashMap$KeySet.iterator
+0 311542/2 14 method -> java/util/LinkedHashMap.newKeyIterator
+0 311542/2 16 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 7 syscall -> read
+0 311542/2 14 syscall <- read
+0 311542/2 7 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 6 syscall -> read
+0 311542/2 16 syscall <- read
+0 311542/2 81 syscall -> llseek
+0 311542/2 7 syscall <- llseek
+0 311542/2 7 syscall -> read
+0 311542/2 14 syscall <- read
+0 311542/2 7 syscall -> llseek
+0 311542/2 6 syscall <- llseek
+0 311542/2 6 syscall -> read
+0 311542/2 12 syscall <- read
+0 311542/2 77 method -> java/util/LinkedHashMap$KeyIterator.<init>
+0 311542/2 14 method -> java/util/LinkedHashMap$KeyIterator.<init>
+0 311542/2 14 method -> java/util/LinkedHashMap$LinkedHashIterator.<init>
+0 311542/2 12 method -> java/util/LinkedHashMap$LinkedHashIterator.<init>
+0 311542/2 13 method -> java/lang/Object.<init>
+0 311542/2 10 method <- java/lang/Object.<init>
+0 311542/2 19 method <- java/util/LinkedHashMap$LinkedHashIterator.<init>
+0 311542/2 11 method <- java/util/LinkedHashMap$LinkedHashIterator.<init>
+0 311542/2 10 method <- java/util/LinkedHashMap$KeyIterator.<init>
+0 311542/2 10 method <- java/util/LinkedHashMap$KeyIterator.<init>
+0 311542/2 10 method <- java/util/LinkedHashMap.newKeyIterator
+0 311542/2 10 method <- java/util/HashMap$KeySet.iterator
+0 311542/2 10 method <- java/util/HashSet.iterator
+0 311542/2 14 method -> java/util/LinkedHashMap$LinkedHashIterator.hasNext
+0 311542/2 11 method <- java/util/LinkedHashMap$LinkedHashIterator.hasNext
+0 311542/2 11 method <- java/util/AbstractCollection.toArray
+0 311542/2 11 method -> java/lang/Object.getClass
+0 311542/2 12 method <- java/lang/Object.getClass
+0 311542/2 11 method <- java/util/ArrayList.<init>
+0 311542/2 14 method -> java/util/Collections.reverse
+0 311542/2 15 method <- java/util/Collections.reverse
+0 311542/2 13 method -> java/util/AbstractList.iterator
+0 311542/2 11 method -> java/util/AbstractList$Itr.<init>
+0 311542/2 10 method -> java/util/AbstractList$Itr.<init>
+0 311542/2 10 method -> java/lang/Object.<init>
+0 311542/2 9 method <- java/lang/Object.<init>
+0 311542/2 10 method <- java/util/AbstractList$Itr.<init>
+0 311542/2 10 method <- java/util/AbstractList$Itr.<init>
+0 311542/2 10 method <- java/util/AbstractList.iterator
+0 311542/2 13 method -> java/util/AbstractList$Itr.hasNext
+0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext
+0 311542/2 10 method <- java/io/DeleteOnExitHook.run
+0 311542/2 10 method <- java/io/File$1.run
+0 311542/2 10 method -> java/util/AbstractList$Itr.hasNext
+0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext
+0 311542/2 10 method <- java/lang/Shutdown.runHooks
+0 311542/2 12 method <- java/lang/Shutdown.sequence
+0 311542/2 10 method <- java/lang/Shutdown.shutdown
+0 311542/2 16 syscall -> lwp_cond_wait
+0 311542/10 59973 syscall <- pollsys
+0 311542/10 31 syscall -> lwp_cond_signal
+0 311542/10 15 syscall <- lwp_cond_signal
+0 311542/10 12 syscall -> lwp_sigmask
+0 311542/10 7 syscall <- lwp_sigmask
+0 311542/10 29 syscall -> lwp_exit
+0 311542/2 13322 syscall <- lwp_cond_wait
+0 311542/2 22 syscall -> lwp_park
+0 311542/2 8 syscall <- lwp_park
+0 311542/2 17 syscall -> mprotect
+0 311542/2 16 syscall <- mprotect
+0 311542/2 12 syscall -> lwp_cond_signal
+0 311542/2 7 syscall <- lwp_cond_signal
+0 311542/2 8 syscall -> lwp_cond_wait
+0 311542/3 750221 syscall <- lwp_cond_wait
+0 311542/3 36 syscall -> mprotect
+0 311542/3 9 syscall <- mprotect
+0 311542/3 7 syscall -> mprotect
+0 311542/3 8 syscall <- mprotect
+0 311542/3 14 syscall -> mprotect
+0 311542/3 6 syscall <- mprotect
+0 311542/3 40 syscall -> lwp_cond_signal
+0 311542/3 7 syscall <- lwp_cond_signal
+0 311542/3 7 syscall -> lwp_sigmask
+0 311542/3 6 syscall <- lwp_sigmask
+0 311542/3 11 syscall -> lwp_exit
+0 311542/2 184 syscall <- lwp_cond_wait
+0 311542/2 16 syscall -> lwp_sigmask
+0 311542/2 6 syscall <- lwp_sigmask
+0 311542/2 108 syscall -> unlink
+0 311542/2 36 syscall <- unlink
+0 311542/2 9 syscall -> lwp_sigmask
+0 311542/2 6 syscall <- lwp_sigmask
+0 311542/2 50 syscall -> lwp_exit
+0 311542/1 6423404 syscall <- lwp_wait
+0 311542/1 40 syscall -> open64
+0 311542/1 101 syscall <- open64
+0 311542/1 8 syscall -> ioctl
+0 311542/1 14 syscall <- ioctl
+0 311542/1 10 syscall -> close
+0 311542/1 14 syscall <- close
+0 311542/1 8 syscall -> open64
+0 311542/1 31 syscall <- open64
+0 311542/1 7 syscall -> ioctl
+0 311542/1 7 syscall <- ioctl
+0 311542/1 7 syscall -> close
+0 311542/1 9 syscall <- close
+0 311542/1 27 syscall -> rexit
+0 311542/9 3298915 syscall <- lwp_cond_wait
+0 311542/8 3375816 syscall <- lwp_cond_wait
+0 311542/7 3376775 syscall <- lwp_cond_wait
+0 311542/5 3738267 syscall <- lwp_cond_wait
+0 311542/4 3760581 syscall <- lwp_cond_wait
+0 311542/6 3376767 syscall <- lwp_park
+
diff --git a/Examples/j_thread_example.txt b/Examples/j_thread_example.txt
new file mode 100644
index 000000000000..3c5e83c6ee02
--- /dev/null
+++ b/Examples/j_thread_example.txt
@@ -0,0 +1,20 @@
+Following we see examples of the results of running j_thread.d.
+
+Here it is running while Code/Java/Func_abc is executing.
+
+# j_thread.d
+TIME PID/TID -- THREAD
+2007 Sep 24 04:01:34 311512/5 => Finalizer
+2007 Sep 24 04:01:34 311512/4 => Reference Handler
+2007 Sep 24 04:01:34 311512/7 => CompilerThread0
+2007 Sep 24 04:01:34 311512/6 => Signal Dispatcher
+2007 Sep 24 04:01:34 311512/8 => CompilerThread1
+2007 Sep 24 04:01:34 311512/9 => Low Memory Detector
+^C
+
+The fields of the output are, in order, Event time, Process ID/Thread ID,
+entry (=>) or exit (<=) and Thread name.
+
+In this example we see six different threads starting, but we do not see
+thread exit events as the JVM exited when the program stopped.
+
diff --git a/Examples/j_who_example.txt b/Examples/j_who_example.txt
new file mode 100644
index 000000000000..f765d4852b8b
--- /dev/null
+++ b/Examples/j_who_example.txt
@@ -0,0 +1,17 @@
+In many cases, in order to get interesting or in-depth results the
+ExtendedDTraceProbes flag needs to be set when DTracing Java programs. In
+this case, because of the probes we have chosen to trace, running the program
+Code/Java/Func_abc, both with (PID 311517) and without (311526) this flag,
+and we can see that it has made no difference, with each reporting 35 lines
+executed.
+
+# j_who.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID UID CALLS ARGS
+ 194441 100 18 /usr/local/lib/opera/9.02-20060919.1/opera
+ 309790 100 20 java_vm
+ 311517 100 35 java -XX:+ExtendedDTraceProbes Func_abc
+ 311526 100 35 java Func_abc
+
+
diff --git a/Examples/js_calldist_example.txt b/Examples/js_calldist_example.txt
new file mode 100644
index 000000000000..57058b7d9a77
--- /dev/null
+++ b/Examples/js_calldist_example.txt
@@ -0,0 +1,110 @@
+The following are examples of running js_calldist.d.
+
+Here it is running while the code at Code/JavaScript/func_clock.html is
+being executed.
+
+# js_calldist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Elapsed times (us),
+ func_clock.html, obj-new, Date
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 16 | 0
+
+
+Exclusive function elapsed times (us),
+ func_clock.html, func, setTimeout
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 128 | 0
+
+ func_clock.html, func, getElementById
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@ 1
+ 16 |@@@@@@@@@@@@@@@@@@ 9
+ 32 |@@@@@@@@@@@@@@@@@@@@ 10
+ 64 | 0
+
+ func_clock.html, func, start
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 2048 | 0
+
+ func_clock.html, func, func_a
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 32768 | 0
+
+ func_clock.html, func, func_b
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 65536 | 0
+
+ func_clock.html, func, func_c
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 65536 | 0
+
+
+Inclusive function elapsed times (us),
+ func_clock.html, func, setTimeout
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 128 | 0
+
+ func_clock.html, func, getElementById
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@ 1
+ 16 |@@@@@@@@@@@@@@@@@@ 9
+ 32 |@@@@@@@@@@@@@@@@@@@@ 10
+ 64 | 0
+
+ func_clock.html, func, func_c
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 65536 | 0
+
+ func_clock.html, func, func_a
+ value ------------- Distribution ------------- count
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 131072 | 0
+
+ func_clock.html, func, func_b
+ value ------------- Distribution ------------- count
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 131072 | 0
+
+ func_clock.html, func, start
+ value ------------- Distribution ------------- count
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 131072 | 0
+
+The elapsed times show us that the script spent some small amount of time
+processing various events that were not functions. In this case there was
+five new Date objects, and each event took between 8 microseconds and 15
+microseconds.
+
+The exclusive function elapsed times show the time each of our functions
+takes, excluding the time spent in subroutines called by that function. We
+can see in this example that func_a took between 16384 microseconds and 32767
+microseconds.
+
+The inclusive function elapsed times show that func_a took between 65536
+microseconds and 131071 microseconds, including the time spent in any
+subroutines it calls.
+
diff --git a/Examples/js_calls_example.txt b/Examples/js_calls_example.txt
new file mode 100644
index 000000000000..848e4362c9d9
--- /dev/null
+++ b/Examples/js_calls_example.txt
@@ -0,0 +1,312 @@
+The following are examples of the results of running js_calls.d
+
+A JavaScript program that behaves like a clock is frequently used by these
+examples, since it can be left running in the background without browser
+input. Browser input, such as hitting the reload button or using menus,
+triggers many other JavaScript events since much of the browser uses
+JavaScript.
+
+With Code/JavaScript/func_clock.html loaded, we trace one second of activity:
+
+# js_calls.d
+Tracing... Hit Ctrl-C to end.
+^C
+ FILE TYPE NAME CALLS
+ func_clock.html exec . 1
+ func_clock.html func func_a 1
+ func_clock.html func func_b 1
+ func_clock.html func func_c 1
+ func_clock.html func setTimeout 1
+ func_clock.html func start 1
+ func_clock.html obj-new Date 1
+ func_clock.html func getElementById 4
+
+This shows the type of calls made, 1 exec, one obj-new, several func; a more
+descriptive name of each call; and a count of how many times a particular call
+was made.
+
+
+The following demonstrates what happens when a different program -
+Code/JavaScript/func_slow.html is reloaded by hitting the reload button on the
+browser. Apart from the func_slow.html JavaScript events, all those events
+from the browser caused by moving the mouse pointer over the screen etc. have
+been traced as well.
+
+# js_calls.d
+Tracing... Hit Ctrl-C to end.
+
+ FILE TYPE NAME CALLS
+ <null> obj-free BarProp 1
+ <null> obj-free CSSStyleDeclaration 1
+ <null> obj-free Global Scope Polluter 1
+ <null> obj-free HTMLCollection 1
+ <null> obj-free HTMLDocument 1
+ <null> obj-free HTMLHtmlElement 1
+ <null> obj-free KeyboardEvent 1
+ <null> obj-free Location 1
+ <null> obj-free NodeList 1
+ <null> obj-free StyleSheetList 1
+ <null> obj-free TreeSelection 1
+ <null> obj-free Window 1
+ <null> obj-free XULCommandDispatcher 1
+ <null> obj-free chrome://global/content/bindings/scrollbar.xml#scrollbar 8c35ec2 1
+ <null> obj-free nsXPCComponents_Classes 1
+ <null> obj-free xpcTempGlobalClass 1
+ <null> obj-new BarProp 1
+ <null> obj-new CSSStyleDeclaration 1
+ <null> obj-new Global Scope Polluter 1
+ <null> obj-new HTMLCollection 1
+ <null> obj-new HTMLDocument 1
+ <null> obj-new HTMLHtmlElement 1
+ <null> obj-new KeyboardEvent 1
+ <null> obj-new NodeList 1
+ <null> obj-new StyleSheetList 1
+ <null> obj-new TreeSelection 1
+ <null> obj-new Window 1
+ <null> obj-new XULCommandDispatcher 1
+ <null> obj-new chrome://global/content/bindings/popup.xml#popup 8befc22 1
+ <null> obj-new chrome://global/content/bindings/popup.xml#popup 8befcea 1
+ <null> obj-new chrome://global/content/bindings/scrollbar.xml#scrollbar 8ce1c1a 1
+ <null> obj-new nsXPCComponents_Classes 1
+ <null> obj-new xpcTempGlobalClass 1
+ autocomplete.xml func apply 1
+ autocomplete.xml func attachController 1
+ autocomplete.xml func detachController 1
+ autocomplete.xml func fireEvent 1
+ autocomplete.xml func getPreventDefault 1
+ autocomplete.xml func handleEnter 1
+ autocomplete.xml func onKeyPress 1
+ autocomplete.xml obj-new Object 1
+ browser.js func BrowserLoadURL 1
+ browser.js func SetPageProxyState 1
+ browser.js func URLBarFocusHandler 1
+ browser.js func UpdateBackForwardButtons 1
+ browser.js func addEventListener 1
+ browser.js func addToUrlbarHistory 1
+ browser.js func canonizeUrl 1
+ browser.js func charsetLoadListener 1
+ browser.js func checkForDirectoryListing 1
+ browser.js func contentAreaClick 1
+ browser.js func createExposableURI 1
+ browser.js func createFixupURI 1
+ browser.js func getShortcutOrURI 1
+ browser.js func getWebNavigation 1
+ browser.js func handleURLBarCommand 1
+ browser.js func isSuccessCode 1
+ browser.js func markPageAsTyped 1
+ browser.js func resolveKeyword 1
+ browser.js func search 1
+ browser.js func test 1
+ browser.js func updateLastVisitedDate 1
+ browser.js obj-new Object 1
+ browser.js obj-new XPC_WN_NoMods_Proto_JSClass 1
+ browser.js obj-new nsJSCID 1
+ browser.xml func attachFormFill 1
+ browser.xml func getAttribute 1
+ browser.xml func getBoolPref 1
+ consoleAPI.js obj-new Call 1
+ findBar.js func getElementById 1
+ firebug.js func addEventListener 1
+ firebug.js obj-new Constructor 1
+ firebug.js obj-new Location 1
+ firebug.js obj-new Object 1
+ firebug.js obj-new XPC_WN_ModsAllowed_Proto_JSClass 1
+ func_slow.html exec . 1
+ func_slow.html func func_a 1
+ func_slow.html func func_b 1
+ func_slow.html func func_c 1
+ func_slow.html obj-new Function 1
+ preferences.js obj-new nsJSCID 1
+ reporterOverlay.js func getElementById 1
+ reporterOverlay.js func setAttribute 1
+ tabbox.xml func getAttribute 1
+ tabbrowser.xml func QueryInterface 1
+ tabbrowser.xml func getAnonymousElementByAttribute 1
+ tabbrowser.xml func getBrowserIndexForDocument 1
+ tabbrowser.xml func indexOf 1
+ tabbrowser.xml func push 1
+ tabbrowser.xml func setIcon 1
+ tabbrowser.xml func setTabTitle 1
+ tabbrowser.xml func shouldLoadFavIcon 1
+ tabbrowser.xml func updateTitlebar 1
+ tabbrowser.xml func useDefaultIcon 1
+ tabbrowser.xml obj-new Array 1
+ tabbrowser.xml obj-new String 1
+ textbox.xml func hasAttribute 1
+ textbox.xml func setAttribute 1
+ webdeveloper.js func getAttribute 1
+ webdeveloper.js func hasAttribute 1
+ webdeveloper.js func toLowerCase 1
+ webdeveloper.js func webdeveloper_changeOptions 1
+ webdeveloper.js func webdeveloper_configureElement 1
+ webdeveloper.js func webdeveloper_openToolbarButton 1
+ webdeveloper.js func webdeveloper_updateMetaRedirects 1
+ webdeveloper.js func webdeveloper_updateRenderMode 1
+ webdeveloper.js obj-new Array 1
+ webdeveloper.js obj-new String 1
+ <null> obj-free BoxObject 2
+ <null> obj-free HTMLBodyElement 2
+ <null> obj-free JSOptions 2
+ <null> obj-free JavaArray 2
+ <null> obj-free JavaClass 2
+ <null> obj-free JavaMember 2
+ <null> obj-free JavaObject 2
+ <null> obj-free PageTransitionEvent 2
+ <null> obj-free nsJSCID 2
+ <null> obj-new BoxObject 2
+ <null> obj-new HTMLBodyElement 2
+ <null> obj-new JSOptions 2
+ <null> obj-new JavaArray 2
+ <null> obj-new JavaClass 2
+ <null> obj-new JavaMember 2
+ <null> obj-new JavaObject 2
+ <null> obj-new PageTransitionEvent 2
+ autocomplete.xml func ensureRowIsVisible 2
+ autocomplete.xml func initSearchNames 2
+ autocomplete.xml func select 2
+ autocomplete.xml obj-new Function 2
+ browser.js func PageProxyClearIcon 2
+ browser.js func PageProxySetIcon 2
+ browser.js func URLBarClickHandler 2
+ browser.js func URLBarMouseDownHandler 2
+ browser.js func XPCNativeWrapper function wrapper 2
+ browser.js func getService 2
+ browser.js func loadURI 2
+ browser.js func notifyObservers 2
+ css.js func <null> 2
+ dom.js func <null> 2
+ events.js func <null> 2
+ firebug.js func appendChild 2
+ firebug.js obj-new XPC_WN_NoMods_Proto_JSClass 2
+ general.xml func getAttribute 2
+ layout.js func <null> 2
+ preferences.js func webdeveloper_getStringPreference 2
+ progressmeter.xml func createEvent 2
+ progressmeter.xml func dispatchEvent 2
+ progressmeter.xml func initEvent 2
+ progressmeter.xml func setAttribute 2
+ reporterOverlay.js obj-new Function 2
+ scrollbar.xml func indexOf 2
+ source.js func <null> 2
+ style.js func <null> 2
+ tabbox.xml func setAttribute 2
+ tabbrowser.xml func getBoolPref 2
+ tabbrowser.xml func getBrowserAtIndex 2
+ tabbrowser.xml func schemeIs 2
+ tabbrowser.xml func setAttribute 2
+ textbox.xml func setSelectionRange 2
+ toolbar.xml func updateStatusText 2
+ tree.xml obj-new Function 2
+ webdeveloper.js func getElementsByTagName 2
+ webdeveloper.js func removeAttribute 2
+ <null> obj-free DOM Constructor.prototype 3
+ <null> obj-free With 3
+ <null> obj-free nsXPCComponents 3
+ <null> obj-new Array 3
+ <null> obj-new DOM Constructor.prototype 3
+ <null> obj-new With 3
+ <null> obj-new XPC_WN_NoMods_Proto_JSClass 3
+ <null> obj-new nsXPCComponents 3
+ autocomplete.xml func getAttribute 3
+ browser.js func QueryInterface 3
+ func_slow.html func write 3
+ globalOverlay.js obj-new Function 3
+ progressmeter.xml func getAttribute 3
+ progressmeter.xml func round 3
+ scrollbar.xml obj-new String 3
+ tabbrowser.xml func <null> 3
+ tabbrowser.xml func hasAttribute 3
+ tabbrowser.xml func updateIcon 3
+ text.xml func setAttribute 3
+ textbox.xml func removeAttribute 3
+ utils.js func join 3
+ utils.js func splice 3
+ utils.js func toLowerCase 3
+ utils.js obj-new Array 3
+ utils.js obj-new String 3
+ autocomplete.xml func closePopup 4
+ browser.js func indexOf 4
+ browser.js obj-new Call 4
+ browser.xml func getInterface 4
+ preferences.js func webdeveloper_getBooleanPreference 4
+ tabbrowser.xml func getAttribute 4
+ tabbrowser.xml func removeAttribute 4
+ utilityOverlay.js func goUpdateGlobalEditMenuItems 4
+ utils.js func isElement 4
+ <null> obj-free Call 5
+ view.js func <null> 5
+ <null> obj-free XPCNativeWrapper 6
+ <null> obj-free XPC_WN_NoMods_Proto_JSClass 6
+ <null> obj-new XPCNativeWrapper 6
+ XStringBundle func GetStringFromName 6
+ XStringBundle func getString 6
+ autocomplete.xml func createEvent 6
+ autocomplete.xml func dispatchEvent 6
+ autocomplete.xml func initEvent 6
+ browser.js func getBrowser 6
+ browser.js func setTimeout 6
+ browser.js obj-new String 6
+ preferences.js func getBranch 6
+ preferences.js func getService 6
+ preferences.js func prefHasUserValue 6
+ preferences.js func webdeveloper_isPreferenceSet 6
+ tabbrowser.xml func getBrowserForTab 6
+ utils.js func <null> 6
+ webdeveloper.js obj-new Function 6
+ <null> obj-new Object 7
+ firebug.js func removeAttribute 7
+ tabbrowser.xml obj-new Function 7
+ tree.xml func QueryInterface 7
+ <null> obj-free Array 8
+ browser.js func hasAttribute 8
+ globalOverlay.js func removeAttribute 8
+ reporterOverlay.js func <null> 8
+ browser.js func getElementById 9
+ browser.js func setAttribute 9
+ browser.xml obj-new Function 9
+ webdeveloper.js func getElementById 9
+ <null> obj-free Constructor 10
+ <null> obj-free Object 10
+ <null> obj-free XPC_WN_ModsAllowed_Proto_JSClass 10
+ <null> obj-new Constructor 10
+ <null> obj-new XPC_WN_ModsAllowed_Proto_JSClass 10
+ browser.js func removeAttribute 10
+ firebug.js obj-new Function 10
+ text.xml obj-new String 12
+ webdeveloper.js func item 14
+ firebug.js func getElementById 15
+ <null> obj-free XULElement 16
+ button.xml func hasAttribute 16
+ <null> obj-free Event 17
+ browser.js func <null> 17
+ <null> obj-new Event 18
+ text.xml func getAttribute 19
+ firebug.js func getAttribute 20
+ globalOverlay.js func setAttribute 20
+ <null> obj-free MouseEvent 22
+ <null> obj-new MouseEvent 22
+ globalOverlay.js func isCommandEnabled 22
+ webdeveloper.js func setAttribute 22
+ <null> obj-free String 26
+ firebug.js func setAttribute 26
+ <null> obj-free RegExp 28
+ <null> obj-new RegExp 28
+ globalOverlay.js func getControllerForCommand 28
+ globalOverlay.js func getElementById 28
+ globalOverlay.js func goSetCommandEnabled 28
+ globalOverlay.js func goUpdateCommand 28
+ text.xml func test 28
+ browser.js obj-new Function 30
+ <null> obj-free XPCWrappedNative_NoHelper 32
+ <null> obj-new XPCWrappedNative_NoHelper 32
+ consoleAPI.js obj-new Function 33
+ browser.xml func QueryInterface 38
+ <null> obj-free JavaPackage 41
+ <null> obj-new JavaPackage 41
+ scrollbar.xml obj-new Function 61
+ firebug.js func <null> 62
+ text.xml exec . 84
+ <null> obj-new XULElement 85
+ <null> obj-new Function 172
+ <null> obj-free Function 310
+
diff --git a/Examples/js_calltime_example.txt b/Examples/js_calltime_example.txt
new file mode 100644
index 000000000000..0b69b76e0a7a
--- /dev/null
+++ b/Examples/js_calltime_example.txt
@@ -0,0 +1,60 @@
+The following are examples of js_calltime.d.
+
+This script traces the elapsed time of JavaScript functions and
+prints a report. Here it traces the example program,
+Code/JavaScript/func_clock.html
+
+# js_calltime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ func_clock.html func func_a 3
+ func_clock.html func func_b 3
+ func_clock.html func func_c 3
+ func_clock.html func setTimeout 3
+ func_clock.html func start 3
+ func_clock.html obj-new Date 3
+ func_clock.html func getElementById 12
+ - total - 30
+
+Elapsed times (us),
+ FILE TYPE NAME TOTAL
+ - total - 29
+ func_clock.html obj-new Date 29
+
+Exclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_clock.html func setTimeout 229
+ func_clock.html func getElementById 378
+ func_clock.html func start 4061
+ func_clock.html func func_a 51080
+ func_clock.html func func_b 102943
+ func_clock.html func func_c 153330
+ - total - 312024
+
+Inclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_clock.html func setTimeout 229
+ func_clock.html func getElementById 378
+ func_clock.html func func_c 153454
+ func_clock.html func func_b 256470
+ func_clock.html func func_a 307601
+ func_clock.html func start 312054
+
+Counts shows us how many times each different function was called, and how
+many functions were called in total.
+
+The elapsed time shows us the time spent not in a JavaScript function.
+
+The exclusive function elapsed times show the time that each function spent
+processing code - while not in other functions.
+
+The inclusive function elapsed times show the time that each function spent
+processing code, including the time spent in other calls.
+
+These elapsed times are the absolute time from when the function began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc.
+
diff --git a/Examples/js_cpudist_example.txt b/Examples/js_cpudist_example.txt
new file mode 100644
index 000000000000..c71a2ad82a2e
--- /dev/null
+++ b/Examples/js_cpudist_example.txt
@@ -0,0 +1,112 @@
+The following are examples of js_cpudist.d.
+
+This script traces the on-CPU time of JavaScript functions and prints a report
+in the form of a histogram. Here it traces the example program,
+Code/JavaScript/func_clock.html
+
+# js_cpudist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Elapsed times (us),
+ func_clock.html, obj-new, Date
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 8 | 0
+
+
+Exclusive function on-CPU times (us),
+ func_clock.html, func, setTimeout
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@ 2
+ 64 |@@@@@@@@@@@@@@@@@@@@ 2
+ 128 | 0
+
+ func_clock.html, func, getElementById
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@ 4
+ 16 |@@@@@@@@@@ 4
+ 32 |@@@@@@@@@@@@@@@@@@@@ 8
+ 64 | 0
+
+ func_clock.html, func, start
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 1024 | 0
+
+ func_clock.html, func, func_a
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 32768 | 0
+
+ func_clock.html, func, func_b
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 65536 | 0
+
+ func_clock.html, func, func_c
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 65536 | 0
+
+
+Inclusive function on-CPU times (us),
+ func_clock.html, func, setTimeout
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@ 2
+ 64 |@@@@@@@@@@@@@@@@@@@@ 2
+ 128 | 0
+
+ func_clock.html, func, getElementById
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@ 4
+ 16 |@@@@@@@@@@ 4
+ 32 |@@@@@@@@@@@@@@@@@@@@ 8
+ 64 | 0
+
+ func_clock.html, func, func_c
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 65536 | 0
+
+ func_clock.html, func, func_a
+ value ------------- Distribution ------------- count
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 131072 | 0
+
+ func_clock.html, func, func_b
+ value ------------- Distribution ------------- count
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 131072 | 0
+
+ func_clock.html, func, start
+ value ------------- Distribution ------------- count
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 131072 | 0
+
+The first section, Exclusive function on-CPU times, shows us the time spent
+on-CPU by various functions, not including time spent in subroutines. You can
+see here that func_a had four instances of being on-CPU between 16384
+microseconds and 32767 microseconds.
+
+The second section, Inclusive function on-CPU times, shows us the time spent
+on-CPU by various functions, including that time spent in subroutines called
+by those functions. You can see that here func_a had four instances of being
+on-CPU between 65536 microseconds and 131071 microseconds.
+
+It is important to pay close attention to the third column, "count" as this
+will indicate if there were any instances in a particular timeframe, even if
+the number is too small to show up on the histogram clearly.
diff --git a/Examples/js_cputime_example.txt b/Examples/js_cputime_example.txt
new file mode 100644
index 000000000000..dff42fdca9fa
--- /dev/null
+++ b/Examples/js_cputime_example.txt
@@ -0,0 +1,69 @@
+The following are examples of js_cputime.d.
+
+This script traces the on-CPU time of JavaScript functions and prints a report.
+Here it traces the example program, Code/JavaScript/func_clock.html
+
+# js_cputime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ func_clock.html func func_a 5
+ func_clock.html func func_b 5
+ func_clock.html func func_c 5
+ func_clock.html func setTimeout 5
+ func_clock.html func start 5
+ func_clock.html obj-new Date 5
+ func_clock.html func getElementById 20
+ - total - 50
+
+Elapsed times (us),
+ FILE TYPE NAME TOTAL
+ - total - 37
+ func_clock.html obj-new Date 37
+
+Exclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_clock.html func setTimeout 316
+ func_clock.html func getElementById 588
+ func_clock.html func start 4734
+ func_clock.html func func_a 83465
+ func_clock.html func func_b 166613
+ func_clock.html func func_c 247683
+ - total - 503402
+
+Inclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_clock.html func setTimeout 316
+ func_clock.html func getElementById 588
+ func_clock.html func func_c 247872
+ func_clock.html func func_b 414601
+ func_clock.html func func_a 498142
+ func_clock.html func start 503439
+
+You can see the results are printed in four sections.
+
+The first section reports how many times each subroutine was called, and it's
+type.
+
+The second section reports on the on-CPU time of anything that was not of type
+"func", in this case the only elements reported here are Date obj-new.
+
+The exclusive subroutine on-CPU times shows, amongst other results, that func_a
+spent around 83,000 microseconds on-CPU. This time excludes time spent in
+other subroutines.
+
+The inclusive subroutine on-CPU times show that func_a spent around 0.5
+seconds on-CPU. This includes the time spent in other subroutines
+called.
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the subroutine began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
diff --git a/Examples/js_execs_example.txt b/Examples/js_execs_example.txt
new file mode 100644
index 000000000000..d555c1a1c27d
--- /dev/null
+++ b/Examples/js_execs_example.txt
@@ -0,0 +1,15 @@
+The following examples show the results of running the script js_execs.d.
+
+Here it runs on the program Code/JavaScript/func_clock.html. The script will
+show you every time something is executed, including page reloads and
+timeouts.
+
+# js_execs.d
+TIME FILE:LINENO
+2007 Sep 23 22:54:31 func_clock.html:32
+2007 Sep 23 22:54:32 func_clock.html:32
+2007 Sep 23 22:54:34 func_clock.html:32
+2007 Sep 23 22:54:35 func_clock.html:32
+2007 Sep 23 22:54:36 func_clock.html:32
+^C
+
diff --git a/Examples/js_flow_example.txt b/Examples/js_flow_example.txt
new file mode 100644
index 000000000000..7a9278d7ce6b
--- /dev/null
+++ b/Examples/js_flow_example.txt
@@ -0,0 +1,41 @@
+The following are examples of js_flow.d.
+
+This is a simple script to trace the flow of JavaScript functions.
+Here it traces the example program, Code/JavaScript/func_clock.html
+
+# js_flow.d
+ C TIME(us) FILE -- FUNC
+ 0 3650471830941 func_clock.html -> start
+ 0 3650471831005 func_clock.html -> getElementById
+ 0 3650471831058 func_clock.html <- getElementById
+ 0 3650471831890 func_clock.html -> func_a
+ 0 3650471831906 func_clock.html -> getElementById
+ 0 3650471831929 func_clock.html <- getElementById
+ 0 3650471850084 func_clock.html -> func_b
+ 0 3650471850111 func_clock.html -> getElementById
+ 0 3650471850146 func_clock.html <- getElementById
+ 0 3650471886534 func_clock.html -> func_c
+ 0 3650471886573 func_clock.html -> getElementById
+ 0 3650471886624 func_clock.html <- getElementById
+ 0 3650471942212 func_clock.html <- func_c
+ 0 3650471942231 func_clock.html <- func_b
+ 0 3650471942242 func_clock.html <- func_a
+ 0 3650471942300 func_clock.html -> setTimeout
+ 0 3650471942392 func_clock.html <- setTimeout
+ 0 3650471942404 func_clock.html <- start
+^C
+
+The fourth column is indented by 2 spaces to show when a new function begins.
+This shows which function is calling which - the output above shows that
+func_a called func_b, which in turn called func_c.
+
+The TIME(us) column shows time from boot in microseconds.
+
+The FILE column shows the file that was being executed.
+
+If the output looks strange, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/js_flowinfo_example.txt b/Examples/js_flowinfo_example.txt
new file mode 100644
index 000000000000..45970c1f9e64
--- /dev/null
+++ b/Examples/js_flowinfo_example.txt
@@ -0,0 +1,42 @@
+Following are examples of js_flowinfo.d.
+
+This is a simple script to trace the flow of JavaScript functions. Here it
+traces the example program Code/JavaScript/func_clock.html
+
+# js_flowinfo.d
+ C PID DELTA(us) FILE:LINE TYPE -- FUNC
+ 0 11651 2 .:0 func -> start
+ 0 11651 75 func_clock.html:30 func -> getElementById
+ 0 11651 51 func_clock.html:- func <- getElementById
+ 0 11651 479 func_clock.html:31 func -> func_a
+ 0 11651 25 func_clock.html:21 func -> getElementById
+ 0 11651 23 func_clock.html:- func <- getElementById
+ 0 11651 30611 func_clock.html:25 func -> func_b
+ 0 11651 79 func_clock.html:13 func -> getElementById
+ 0 11651 51 func_clock.html:- func <- getElementById
+ 0 11651 33922 func_clock.html:17 func -> func_c
+ 0 11651 75 func_clock.html:6 func -> getElementById
+ 0 11651 50 func_clock.html:- func <- getElementById
+ 0 11651 50481 func_clock.html:- func <- func_c
+ 0 11651 24 func_clock.html:- func <- func_b
+ 0 11651 10 func_clock.html:- func <- func_a
+ 0 11651 39 func_clock.html:32 func -> setTimeout
+ 0 11651 118 func_clock.html:- func <- setTimeout
+ 0 11651 11 func_clock.html:- func <- start
+^C
+
+As each function is entered, the last column is indented by 2 spaces. This
+shows which function is calling which.
+
+The DELTA(us) column shows the change in time from the previous line to the
+current line.
+
+The FILE::LINE column shows which line in which file was being executed. Refer
+to the source program to see what this line refers to.
+
+If the output looks shuffled, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/js_flowtime_example.txt b/Examples/js_flowtime_example.txt
new file mode 100644
index 000000000000..46b2f2f12b28
--- /dev/null
+++ b/Examples/js_flowtime_example.txt
@@ -0,0 +1,42 @@
+The following are examples of js_flowtime.d.
+
+This is a simple script to trace the flow of JavaScript functions.
+Here it traces the example program, Code/JavaScript/func_clock.html
+
+# js_flowtime.d
+ C TIME(us) FILE DELTA(us) -- FUNC
+ 0 3650523390654 func_clock.html 2 -> start
+ 0 3650523390721 func_clock.html 67 -> getElementById
+ 0 3650523390773 func_clock.html 51 <- getElementById
+ 0 3650523391609 func_clock.html 835 -> func_a
+ 0 3650523391627 func_clock.html 18 -> getElementById
+ 0 3650523391651 func_clock.html 23 <- getElementById
+ 0 3650523409735 func_clock.html 18084 -> func_b
+ 0 3650523409763 func_clock.html 27 -> getElementById
+ 0 3650523409795 func_clock.html 32 <- getElementById
+ 0 3650523445921 func_clock.html 36125 -> func_c
+ 0 3650523445959 func_clock.html 38 -> getElementById
+ 0 3650523446004 func_clock.html 44 <- getElementById
+ 0 3650523500557 func_clock.html 54552 <- func_c
+ 0 3650523500581 func_clock.html 24 <- func_b
+ 0 3650523500593 func_clock.html 11 <- func_a
+ 0 3650523500648 func_clock.html 54 -> setTimeout
+ 0 3650523500736 func_clock.html 88 <- setTimeout
+ 0 3650523500749 func_clock.html 12 <- start
+^C
+
+The fifth column is indented by 2 spaces to show when a new function begins.
+This shows which function is calling which.
+
+The TIME(us) column shows time since boot.
+
+The DELTA(us) column shows time from that line to the previous line, and
+so can be a bit tricky to read. For example, the second line of data output
+shows that a getElementById function happened 67 microseconds after start.
+
+The FILE column shows file that was being executed.
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
diff --git a/Examples/js_objcpu_example.txt b/Examples/js_objcpu_example.txt
new file mode 100644
index 000000000000..9e9a957ff9b9
--- /dev/null
+++ b/Examples/js_objcpu_example.txt
@@ -0,0 +1,317 @@
+The following are examples of running js_objcpu.d.
+
+This script will show the time on-CPU of object creation events in graphical
+format.
+
+Here we see it running on Code/JavaScript/func_clock.html
+
+# js_objcpu.d
+Tracing... Hit Ctrl-C to end.
+^C
+Total object creation on-CPU time (ms): 0
+
+Object creation on-CPU time distributions (us),
+
+ Date
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 16 | 0
+
+We can see that there were two object creation events, both of type 'Date'
+that spent between 8 microseconds and 15 microseconds on-CPU each.
+
+
+Here we see the results of having Code/JavaScript/func_slow.html in a browser
+window and hitting reload. This includes events that happen due to mouse
+movement.
+
+# js_objcpu.d
+Tracing... Hit Ctrl-C to end.
+^C
+Total object creation on-CPU time (ms): 2
+
+Object creation on-CPU time distributions (us),
+
+ HTMLBodyElement
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ HTMLCollection
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ HTMLDocument
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ HTMLHtmlElement
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ Location
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ NodeList
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ StyleSheetList
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ Window
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ chrome://global/content/bindings/popup.xml#popup 8830492
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ chrome://global/content/bindings/scrollbar.xml#scrollbar 8beef52
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ BarProp
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ BoxObject
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ CSSStyleDeclaration
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ chrome://global/content/bindings/popup.xml#popup 8bef592
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ nsXPCComponents_Classes
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ nsJSCID
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ nsXPCComponents
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 | 0
+
+ Global Scope Polluter
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ JavaArray
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ JavaClass
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ JavaMember
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ JavaObject
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ KeyboardEvent
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ XPC_WN_NoMods_Proto_JSClass
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 |@@@@@@@@@@ 1
+ 8 | 0
+
+ PageTransitionEvent
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ JSOptions
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 16 | 0
+
+ Call
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 8 | 0
+
+ DOM Constructor.prototype
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 | 0
+ 8 | 0
+ 16 |@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ With
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@ 1
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 16 | 0
+
+ Constructor
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9
+ 4 |@@@@ 1
+ 8 | 0
+
+ Object
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@ 3
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 8 | 0
+
+ XPCNativeWrapper
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 8 |@@@@@@@ 1
+ 16 | 0
+
+ XULElement
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@ 5
+ 4 |@@@@@@@@@@@@@@@@@@ 4
+ 8 | 0
+
+ Array
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@ 2
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 8 | 0
+
+ XPCWrappedNative_NoHelper
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@ 3
+ 4 |@@@@@@@@@@@@@@@@@@@@ 4
+ 8 |@@@@@ 1
+ 16 | 0
+
+ XPC_WN_ModsAllowed_Proto_JSClass
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 4 |@@@@@@@@@@@@ 3
+ 8 |@@@@ 1
+ 16 | 0
+
+ MouseEvent
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@ 3
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 16 | 0
+
+ String
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 11
+ 8 | 0
+
+ Event
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@ 1
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 8 |@@@@@@@@@ 3
+ 16 | 0
+
+ JavaPackage
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 40
+ 4 | 0
+ 8 |@ 1
+ 16 | 0
+
+ Function
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 246
+ 4 |@@@@@@@ 58
+ 8 |@ 8
+ 16 |@ 9
+ 32 | 0
+
+
diff --git a/Examples/js_objgc_example.txt b/Examples/js_objgc_example.txt
new file mode 100644
index 000000000000..711b223d08e6
--- /dev/null
+++ b/Examples/js_objgc_example.txt
@@ -0,0 +1,230 @@
+Following are examples of running js_objgc.d.
+
+This script reports on the garbage collection of Java objects. That is it
+will keep track of when resources are allocated to an object, and when
+resources are freed from an object. It is useful for providing information on
+when garbage collection is not working correctly, as this can cause the
+browser to have a memory leak.
+
+We trace object creation (+1) and destruction (-1), and provide a summary
+each second of the running tally of the object class and originating filename.
+
+Here we can see it running on Code/JavaScript/func_clock.html
+
+# js_objgc.d
+Tracing... Hit Ctrl-C to end.
+
+ FILE TOTAL CLASS 2007 Sep 23 22:59:24
+ func_clock.html 1 Date
+
+ FILE TOTAL CLASS 2007 Sep 23 22:59:25
+ func_clock.html 2 Date
+
+ FILE TOTAL CLASS 2007 Sep 23 22:59:26
+ func_clock.html 3 Date
+
+ FILE TOTAL CLASS 2007 Sep 23 22:59:27
+ func_clock.html 4 Date
+
+ FILE TOTAL CLASS 2007 Sep 23 22:59:28
+ func_clock.html 5 Date
+
+ FILE TOTAL CLASS 2007 Sep 23 22:59:29
+ browser.js 3 Function
+ <null> 5 Function
+ func_clock.html 6 Date
+ <null> 7 MouseEvent
+
+ FILE TOTAL CLASS 2007 Sep 23 22:59:30
+ browser.js 3 Function
+ <null> 5 Function
+ func_clock.html 7 Date
+ <null> 10 MouseEvent
+
+ FILE TOTAL CLASS 2007 Sep 23 22:59:31
+ <null> 1 Constructor
+ <null> 1 HTMLBodyElement
+ <null> 1 XPCNativeWrapper
+ <null> 1 XPC_WN_ModsAllowed_Proto_JSClass
+ browser.js 1 Array
+ browser.js 1 XPCNativeWrapper
+ popup.xml 1 Array
+ func_clock.html 7 Date
+ <null> 13 MouseEvent
+ <null> 18 Function
+ browser.js 20 Function
+
+ FILE TOTAL CLASS 2007 Sep 23 22:59:32
+ <null> 1 BoxObject
+ <null> 1 Constructor
+ <null> 1 HTMLBodyElement
+ <null> 1 NodeList
+ <null> 1 UIEvent
+ <null> 1 XPCNativeWrapper
+ <null> 1 XPC_WN_ModsAllowed_Proto_JSClass
+ <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a
+ <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba
+ bookmarksMenu.js 1 Function
+ browser.js 1 Array
+ browser.js 1 XPCNativeWrapper
+ popup.xml 1 Function
+ scrollbox.xml 1 Function
+ <null> 2 Event
+ popup.xml 2 Array
+ bookmarks.js 3 With
+ firebug-service.js 3 Object
+ bookmarks.js 6 Object
+ bookmarks.js 6 XPCWrappedNative_NoHelper
+ func_clock.html 8 Date
+ firebug-service.js 10 Function
+ <null> 15 MouseEvent
+ bookmarks.js 19 Error
+ browser.js 20 Function
+ bookmarks.js 22 Function
+ <null> 39 XPCWrappedNative_NoHelper
+ <null> 44 Function
+ <null> 60 RegExp
+ <null> 191 XULElement
+
+[... 39 seconds deleted ...]
+
+ FILE TOTAL CLASS 2007 Sep 23 23:00:10
+ <null> 1 HTMLBodyElement
+ <null> 1 HTMLCollection
+ <null> 1 TreeColumns
+ <null> 1 XPCNativeWrapper
+ <null> 1 XPC_WN_NoMods_Proto_JSClass
+ <null> 1 XULTreeBuilder
+ <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a
+ <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba
+ <null> 1 chrome://global/content/bindings/tree.xml#treebody 84caa3a
+ <null> 1 chrome://global/content/bindings/tree.xml#treebody 84e3a72
+ <null> 1 nsXPCComponents_Interfaces
+ <null> 1 nsXPCComponents_Results
+ bookmarksMenu.js 1 Function
+ browser.js 1 Array
+ browser.js 1 XPCNativeWrapper
+ browser.js 1 XPC_WN_NoMods_Proto_JSClass
+ nsUpdateService.js 1 XPC_WN_NoMods_Proto_JSClass
+ nsUpdateService.js 1 nsJSCID
+ popup.xml 1 Function
+ scrollbar.xml 1 String
+ scrollbox.xml 1 Function
+ tree.xml 1 Array
+ <null> 2 Constructor
+ <null> 2 UIEvent
+ <null> 2 XPC_WN_ModsAllowed_Proto_JSClass
+ <null> 2 nsXPCComponents_Classes
+ browser.js 2 nsJSCID
+ browser.js 2 nsJSIID
+ utilityOverlay.js 2 nsJSCID
+ utilityOverlay.js 2 nsJSIID
+ <null> 3 Array
+ <null> 3 NodeList
+ nsUpdateService.js 3 Array
+ nsUpdateService.js 3 Object
+ nsUpdateService.js 3 With
+ utilityOverlay.js 3 Call
+ tree.xml 4 Function
+ utilityOverlay.js 4 Function
+ nsUpdateService.js 7 nsJSIID
+ nsUpdateService.js 15 Function
+ bookmarks.js 22 Function
+ text.xml 23 String
+ <null> 36 BoxObject
+ func_clock.html 42 Date
+ bookmarks.js 57 With
+ firebug-service.js 57 Object
+ bookmarks.js 73 Error
+ browser.js 78 Function
+ popup.xml 82 Array
+ bookmarks.js 114 Object
+ bookmarks.js 114 XPCWrappedNative_NoHelper
+ <null> 157 MouseEvent
+ firebug-service.js 172 Function
+ <null> 307 XPCWrappedNative_NoHelper
+ <null> 388 RegExp
+ <null> 488 Event
+ <null> 876 XULElement
+ <null> 1221 Function
+
+ FILE TOTAL CLASS 2007 Sep 23 23:00:11
+ <missed> -94 Date
+ <missed> -34 Function
+ <missed> -4 MouseEvent
+ <missed> -2 Array
+ <missed> -1 HTMLBodyElement
+ <missed> -1 HTMLCollection
+ <missed> -1 XPCNativeWrapper
+ <missed> -1 XPC_WN_ModsAllowed_Proto_JSClass
+ <null> 0 Array
+ <null> 0 HTMLBodyElement
+ <null> 0 HTMLCollection
+ <null> 0 RegExp
+ <null> 0 TreeColumns
+ <null> 0 UIEvent
+ <null> 0 XPC_WN_NoMods_Proto_JSClass
+ <null> 0 XULTreeBuilder
+ <null> 0 nsXPCComponents_Classes
+ <null> 0 nsXPCComponents_Interfaces
+ <null> 0 nsXPCComponents_Results
+ browser.js 0 Array
+ browser.js 0 XPCNativeWrapper
+ browser.js 0 XPC_WN_NoMods_Proto_JSClass
+ browser.js 0 nsJSCID
+ nsUpdateService.js 0 Array
+ nsUpdateService.js 0 Function
+ nsUpdateService.js 0 Object
+ nsUpdateService.js 0 With
+ nsUpdateService.js 0 XPC_WN_NoMods_Proto_JSClass
+ nsUpdateService.js 0 nsJSCID
+ nsUpdateService.js 0 nsJSIID
+ scrollbar.xml 0 String
+ text.xml 0 String
+ tree.xml 0 Array
+ utilityOverlay.js 0 Call
+ utilityOverlay.js 0 Function
+ utilityOverlay.js 0 nsJSCID
+ <null> 1 NodeList
+ <null> 1 XPCNativeWrapper
+ <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a
+ <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba
+ <null> 1 chrome://global/content/bindings/tree.xml#treebody 84caa3a
+ <null> 1 chrome://global/content/bindings/tree.xml#treebody 84e3a72
+ bookmarksMenu.js 1 Function
+ browser.xul 1 Function
+ func_clock.html 1 Date
+ popup.xml 1 Function
+ scrollbox.xml 1 XULElement
+ scrollbox.xml 1 nsJSIID
+ <null> 2 Constructor
+ <null> 2 XPC_WN_ModsAllowed_Proto_JSClass
+ browser.js 2 nsJSIID
+ scrollbox.xml 2 Function
+ tree.xml 2 Function
+ utilityOverlay.js 2 nsJSIID
+ popup.xml 3 Array
+ bookmarks.js 5 With
+ firebug-service.js 5 Object
+ <null> 6 Event
+ <null> 6 MouseEvent
+ bookmarks.js 9 XPCWrappedNative_NoHelper
+ <null> 10 XPCWrappedNative_NoHelper
+ bookmarks.js 10 Object
+ browser.js 10 Function
+ bookmarks.js 15 Function
+ firebug-service.js 16 Function
+ <null> 18 BoxObject
+ bookmarks.js 75 Error
+ <null> 79 Function
+ <null> 315 XULElement
+^C
+
+Just after time 23:00:10, garbage collection fired cleaning up many objects.
+The final output shows a much reduced object count including a negative
+count for objects created before this script was tracing.
+
+If over the period of several minutes an object type is still steadily
+increasing, then that would be of interest. Be patient, depending on the rate
+of object creation it can take over ten minutes for garbage collect to kick in.
+
diff --git a/Examples/js_objnew_example.txt b/Examples/js_objnew_example.txt
new file mode 100644
index 000000000000..c3a888120f78
--- /dev/null
+++ b/Examples/js_objnew_example.txt
@@ -0,0 +1,100 @@
+The following are examples of the results of running js_objnew.d.
+
+It reports on the class type of new objects created.
+
+Here we can see it running on the program Code/JavaScript/func_clock.html.
+
+# js_objnew.d
+Tracing... Hit Ctrl-C to end.
+^C
+ FILE CLASS COUNT
+ func_clock.html Date 2
+
+The results are very simple, func_clock.html caused two new objects to be
+created, both of type 'Date'.
+
+
+Here is a more complicated example, running on the program
+Code/JavaScript/func_slow.html, with the results of that plus JavaScript caused
+by hitting reload on the browser.
+
+
+# js_objnew.d
+Tracing... Hit Ctrl-C to end.
+^C
+ FILE CLASS COUNT
+ <null> BarProp 1
+ <null> CSSStyleDeclaration 1
+ <null> Global Scope Polluter 1
+ <null> HTMLBodyElement 1
+ <null> HTMLDocument 1
+ <null> HTMLHtmlElement 1
+ <null> NodeList 1
+ <null> StyleSheetList 1
+ <null> TreeSelection 1
+ <null> Window 1
+ <null> XULCommandDispatcher 1
+ <null> chrome://global/content/bindings/popup.xml#popup 8c35c92 1
+ <null> chrome://global/content/bindings/popup.xml#popup 8fb299a 1
+ <null> chrome://global/content/bindings/scrollbar.xml#scrollbar 8fb2ea2 1
+ <null> nsXPCComponents_Classes 1
+ <null> xpcTempGlobalClass 1
+ autocomplete.xml Object 1
+ browser.js Array 1
+ browser.js Object 1
+ browser.js XPC_WN_NoMods_Proto_JSClass 1
+ browser.js nsJSCID 1
+ consoleAPI.js Call 1
+ firebug.js Constructor 1
+ firebug.js Location 1
+ firebug.js Object 1
+ firebug.js XPC_WN_ModsAllowed_Proto_JSClass 1
+ func_slow.html Function 1
+ popup.xml Array 1
+ preferences.js nsJSCID 1
+ tabbrowser.xml Array 1
+ tabbrowser.xml String 1
+ webdeveloper.js Array 1
+ webdeveloper.js String 1
+ <null> BoxObject 2
+ <null> JSOptions 2
+ <null> JavaArray 2
+ <null> JavaClass 2
+ <null> JavaMember 2
+ <null> JavaObject 2
+ <null> PageTransitionEvent 2
+ autocomplete.xml Function 2
+ firebug.js XPC_WN_NoMods_Proto_JSClass 2
+ reporterOverlay.js Function 2
+ tree.xml Function 2
+ <null> Array 3
+ <null> DOM Constructor.prototype 3
+ <null> With 3
+ <null> XPC_WN_NoMods_Proto_JSClass 3
+ <null> nsXPCComponents 3
+ globalOverlay.js Function 3
+ scrollbar.xml String 3
+ utils.js Array 3
+ utils.js String 3
+ browser.js Call 4
+ func_clock.html Date 4
+ webdeveloper.js Function 4
+ <null> XPCNativeWrapper 5
+ browser.js String 6
+ <null> Object 7
+ tabbrowser.xml Function 7
+ <null> XPC_WN_ModsAllowed_Proto_JSClass 8
+ <null> Constructor 9
+ browser.xml Function 9
+ firebug.js Function 10
+ <null> MouseEvent 12
+ <null> XPCWrappedNative_NoHelper 13
+ <null> KeyboardEvent 14
+ <null> XULElement 16
+ <null> Event 29
+ browser.js Function 33
+ consoleAPI.js Function 33
+ <null> JavaPackage 41
+ scrollbar.xml Function 61
+ <null> Function 211
+
diff --git a/Examples/js_stat_example.txt b/Examples/js_stat_example.txt
new file mode 100644
index 000000000000..b658b4f05422
--- /dev/null
+++ b/Examples/js_stat_example.txt
@@ -0,0 +1,35 @@
+The following are examples of running js_stat.d
+
+Here is the result after running the program Code/JavaScript/func_clock.html.
+
+# js_stat.d
+TIME EXEC/s FUNC/s OBJNEW/s OBJFRE/s
+2007 Sep 23 23:04:59 1 9 1 0
+2007 Sep 23 23:05:00 1 9 1 0
+2007 Sep 23 23:05:01 1 9 1 0
+2007 Sep 23 23:05:02 1 6 1 0
+2007 Sep 23 23:05:03 0 3 0 0
+2007 Sep 23 23:05:04 1 9 1 0
+2007 Sep 23 23:05:05 1 9 1 0
+2007 Sep 23 23:05:06 1 9 1 0
+^C
+
+We can see that at 2007 Sep 23 23:05:02 there was one JavaScript program
+executed, six functions called, one new object created and no objects freed.
+
+
+Here is the result after running the program Code/JavaScript/func_slow.html.
+This also includes browser JavaScript.
+
+# js_stat.d
+TIME EXEC/s FUNC/s OBJNEW/s OBJFRE/s
+2007 Sep 23 23:05:48 1 124 41 0
+2007 Sep 23 23:05:49 1 29 19 0
+2007 Sep 23 23:05:50 1 29 25 0
+2007 Sep 23 23:05:51 1 670 497 0
+2007 Sep 23 23:05:52 0 62 11 0
+2007 Sep 23 23:05:53 0 0 6 617
+2007 Sep 23 23:05:54 0 0 0 0
+2007 Sep 23 23:05:55 0 0 0 0
+^C
+
diff --git a/Examples/js_who_example.txt b/Examples/js_who_example.txt
new file mode 100644
index 000000000000..06e3e31c6020
--- /dev/null
+++ b/Examples/js_who_example.txt
@@ -0,0 +1,59 @@
+The following examples are the results of running the js_who.d script while
+various JavaScript events happen.
+
+A JavaScript program that behaves like a clock is frequently used by these
+examples, since it can be left running in the background without browser
+input. Browser input, such as hitting the reload button or using menus,
+triggers many other JavaScript events since much of the browser uses
+JavaScript. This makes for interesting longer examples, but would be
+overwhelming for example #1.
+
+In the first example, we can see what happens when we run this program,
+Code/JavaScript/func_clock.html
+
+# js_who.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID UID FUNCS FILE
+ 10530 100 18 file:///export/home/brendan/Lang/JavaScript/func_clock.html
+
+
+The second example is more complex, the reason for this is that the program
+Code/Javascript/func_slow.html was loaded in the browser, and the reload
+button was pressed. This output captured the many browser events that occured
+when moving the mouse pointer to do so.
+
+# js_who.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID UID FUNCS FILE
+ 10530 100 2 chrome://firebug/content/views/css.js
+ 10530 100 2 chrome://firebug/content/views/dom.js
+ 10530 100 2 chrome://firebug/content/views/events.js
+ 10530 100 2 chrome://firebug/content/views/layout.js
+ 10530 100 2 chrome://firebug/content/views/source.js
+ 10530 100 2 chrome://firebug/content/views/style.js
+ 10530 100 2 chrome://global/content/bindings/scrollbar.xml
+ 10530 100 3 chrome://global/content/bindings/general.xml
+ 10530 100 3 chrome://global/content/bindings/tabbox.xml
+ 10530 100 3 chrome://global/content/bindings/text.xml
+ 10530 100 4 chrome://browser/content/utilityOverlay.js
+ 10530 100 5 chrome://firebug/content/views/view.js
+ 10530 100 6 file:///export/home/brendan/Lang/JavaScript/func_slow.html
+ 10530 100 7 chrome://global/content/bindings/textbox.xml
+ 10530 100 7 chrome://global/content/bindings/tree.xml
+ 10530 100 10 chrome://reporter/content/reporterOverlay.js
+ 10530 100 12 XStringBundle
+ 10530 100 14 chrome://global/content/bindings/progressmeter.xml
+ 10530 100 18 file:///export/home/brendan/Lang/JavaScript/func_clock.html
+ 10530 100 19 chrome://firebug/content/utils.js
+ 10530 100 30 chrome://webdeveloper/content/common/preferences.js
+ 10530 100 43 chrome://global/content/bindings/browser.xml
+ 10530 100 44 chrome://global/content/bindings/tabbrowser.xml
+ 10530 100 72 chrome://global/content/bindings/button.xml
+ 10530 100 88 chrome://global/content/bindings/autocomplete.xml
+ 10530 100 110 chrome://browser/content/browser.js
+ 10530 100 121 chrome://webdeveloper/content/webdeveloper.js
+ 10530 100 133 chrome://firebug/content/firebug.js
+ 10530 100 162 chrome://global/content/globalOverlay.js
+
diff --git a/Examples/kill_example.txt b/Examples/kill_example.txt
new file mode 100644
index 000000000000..f73621c6d252
--- /dev/null
+++ b/Examples/kill_example.txt
@@ -0,0 +1,12 @@
+This is an example of the kill.d DTrace script,
+
+ # kill.d
+ FROM COMMAND SIG TO RESULT
+ 2344 bash 2 3117 0
+ 2344 bash 9 12345 -1
+ ^C
+
+In the above output, a kill -2 (Ctrl-C) was sent from the bash command
+to PID 3177. Then a kill -9 (SIGKILL) was sent to PID 12345 - which
+returned a "-1" for failure.
+
diff --git a/Examples/kstat_types_example.txt b/Examples/kstat_types_example.txt
new file mode 100644
index 000000000000..8ffecbff70eb
--- /dev/null
+++ b/Examples/kstat_types_example.txt
@@ -0,0 +1,1358 @@
+The following are demonstrations of the kstat_types.d script.
+
+
+Here kstat_types.d is used to trace the kstat activity of the vmstat command,
+
+ # ./kstat_types.d
+ CMD CLASS TYPE MOD:INS:NAME
+ vmstat . raw :0:kstat_headers
+ vmstat . raw :0:kstat_headers
+ vmstat misc named cpu_info:0:cpu_info0
+ vmstat misc named cpu:0:vm
+ vmstat misc named cpu:0:sys
+ vmstat disk io cmdk:0:cmdk0
+ vmstat disk io sd:0:sd0
+ vmstat misc raw unix:0:sysinfo
+ vmstat vm raw unix:0:vminfo
+ vmstat misc named unix:0:dnlcstats
+ vmstat misc named unix:0:system_misc
+ ^C
+
+Details of each lookup can be seen, including each disk device that
+was read.
+
+
+
+This is mpstat on a single CPU server,
+
+ # ./kstat_types.d
+ CMD CLASS TYPE MOD:INS:NAME
+ mpstat . raw :0:kstat_headers
+ mpstat . raw :0:kstat_headers
+ mpstat misc named cpu_info:0:cpu_info0
+ mpstat misc named cpu:0:vm
+ mpstat misc named cpu:0:sys
+ ^C
+
+The output shows that the focus was CPU statistics, as expected.
+
+
+
+The following has caught in.routed reading some statistics,
+
+ # ./kstat_types.d
+ CMD CLASS TYPE MOD:INS:NAME
+ in.routed . raw :0:kstat_headers
+ in.routed . raw :0:kstat_headers
+ in.routed net named lo:0:lo0
+ in.routed . raw :0:kstat_headers
+ in.routed . raw :0:kstat_headers
+ in.routed net named rtls:0:rtls0
+ in.routed . raw :0:kstat_headers
+ in.routed . raw :0:kstat_headers
+ in.routed net named rtls:0:rtls0
+ ^C
+
+Which shows that the network interfaces were checked.
+
+
+
+Finally, this is the kstats used when a "sar -u 1 1" command is run.
+ie, this thing,
+
+ $ sar -u 1 1
+
+ SunOS jupiter 5.10 Generic i86pc 04/21/2006
+
+ 23:28:53 %usr %sys %wio %idle
+ 23:28:54 1 3 0 96
+
+sar actually forks a child "sadc" to do the lookups. sadc caused the
+following kstat lookups (I'm not making this up),
+
+ # ./kstat_types.d
+ CMD CLASS TYPE MOD:INS:NAME
+ sadc . raw :0:kstat_headers
+ sadc . raw :0:kstat_headers
+ sadc misc named unix:0:system_misc
+ sadc kmem_cache named unix:0:file_cache
+ sadc vmem named vmem:16:kmem_oversize
+ sadc ufs named ufs:0:inode_cache
+ sadc misc raw unix:0:var
+ sadc kmem_cache named unix:0:kmem_magazine_1
+ sadc kmem_cache named unix:0:kmem_magazine_3
+ sadc kmem_cache named unix:0:kmem_magazine_7
+ sadc kmem_cache named unix:0:kmem_magazine_15
+ sadc kmem_cache named unix:0:kmem_magazine_31
+ sadc kmem_cache named unix:0:kmem_magazine_47
+ sadc kmem_cache named unix:0:kmem_magazine_63
+ sadc kmem_cache named unix:0:kmem_magazine_95
+ sadc kmem_cache named unix:0:kmem_magazine_143
+ sadc kmem_cache named unix:0:kmem_slab_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_audit_cache
+ sadc kmem_cache named unix:0:kmem_va_4096
+ sadc kmem_cache named unix:0:kmem_va_8192
+ sadc kmem_cache named unix:0:kmem_va_12288
+ sadc kmem_cache named unix:0:kmem_va_16384
+ sadc kmem_cache named unix:0:kmem_va_20480
+ sadc kmem_cache named unix:0:kmem_va_24576
+ sadc kmem_cache named unix:0:kmem_va_28672
+ sadc kmem_cache named unix:0:kmem_va_32768
+ sadc kmem_cache named unix:0:kmem_alloc_8
+ sadc kmem_cache named unix:0:kmem_alloc_16
+ sadc kmem_cache named unix:0:kmem_alloc_24
+ sadc kmem_cache named unix:0:kmem_alloc_32
+ sadc kmem_cache named unix:0:kmem_alloc_40
+ sadc kmem_cache named unix:0:kmem_alloc_48
+ sadc kmem_cache named unix:0:kmem_alloc_56
+ sadc kmem_cache named unix:0:kmem_alloc_64
+ sadc kmem_cache named unix:0:kmem_alloc_80
+ sadc kmem_cache named unix:0:kmem_alloc_96
+ sadc kmem_cache named unix:0:kmem_alloc_112
+ sadc kmem_cache named unix:0:kmem_alloc_128
+ sadc kmem_cache named unix:0:kmem_alloc_160
+ sadc kmem_cache named unix:0:kmem_alloc_192
+ sadc kmem_cache named unix:0:kmem_alloc_224
+ sadc kmem_cache named unix:0:kmem_alloc_256
+ sadc kmem_cache named unix:0:kmem_alloc_320
+ sadc kmem_cache named unix:0:kmem_alloc_384
+ sadc kmem_cache named unix:0:kmem_alloc_448
+ sadc kmem_cache named unix:0:kmem_alloc_512
+ sadc kmem_cache named unix:0:kmem_alloc_640
+ sadc kmem_cache named unix:0:kmem_alloc_768
+ sadc kmem_cache named unix:0:kmem_alloc_896
+ sadc kmem_cache named unix:0:kmem_alloc_1152
+ sadc kmem_cache named unix:0:kmem_alloc_1344
+ sadc kmem_cache named unix:0:kmem_alloc_1600
+ sadc kmem_cache named unix:0:kmem_alloc_2048
+ sadc kmem_cache named unix:0:kmem_alloc_2688
+ sadc kmem_cache named unix:0:kmem_alloc_4096
+ sadc kmem_cache named unix:0:kmem_alloc_8192
+ sadc kmem_cache named unix:0:kmem_alloc_12288
+ sadc kmem_cache named unix:0:kmem_alloc_16384
+ sadc kmem_cache named unix:0:streams_mblk
+ sadc kmem_cache named unix:0:streams_dblk_64
+ sadc kmem_cache named unix:0:streams_dblk_128
+ sadc kmem_cache named unix:0:streams_dblk_320
+ sadc kmem_cache named unix:0:streams_dblk_576
+ sadc kmem_cache named unix:0:streams_dblk_1088
+ sadc kmem_cache named unix:0:streams_dblk_1536
+ sadc kmem_cache named unix:0:streams_dblk_1984
+ sadc kmem_cache named unix:0:streams_dblk_2624
+ sadc kmem_cache named unix:0:streams_dblk_3968
+ sadc kmem_cache named unix:0:streams_dblk_8192
+ sadc kmem_cache named unix:0:streams_dblk_12160
+ sadc kmem_cache named unix:0:streams_dblk_16384
+ sadc kmem_cache named unix:0:streams_dblk_20352
+ sadc kmem_cache named unix:0:streams_dblk_24576
+ sadc kmem_cache named unix:0:streams_dblk_28544
+ sadc kmem_cache named unix:0:streams_dblk_32768
+ sadc kmem_cache named unix:0:streams_dblk_36736
+ sadc kmem_cache named unix:0:streams_dblk_40960
+ sadc kmem_cache named unix:0:streams_dblk_44928
+ sadc kmem_cache named unix:0:streams_dblk_49152
+ sadc kmem_cache named unix:0:streams_dblk_53120
+ sadc kmem_cache named unix:0:streams_dblk_57344
+ sadc kmem_cache named unix:0:streams_dblk_61312
+ sadc kmem_cache named unix:0:streams_dblk_65536
+ sadc kmem_cache named unix:0:streams_dblk_69504
+ sadc kmem_cache named unix:0:streams_dblk_73728
+ sadc kmem_cache named unix:0:streams_dblk_esb
+ sadc kmem_cache named unix:0:streams_fthdr
+ sadc kmem_cache named unix:0:streams_ftblk
+ sadc kmem_cache named unix:0:multidata
+ sadc kmem_cache named unix:0:multidata_pdslab
+ sadc kmem_cache named unix:0:multidata_pattbl
+ sadc kmem_cache named unix:0:taskq_ent_cache
+ sadc kmem_cache named unix:0:taskq_cache
+ sadc kmem_cache named unix:0:kmem_io_512M_128
+ sadc kmem_cache named unix:0:kmem_io_512M_256
+ sadc kmem_cache named unix:0:kmem_io_512M_512
+ sadc kmem_cache named unix:0:kmem_io_512M_1024
+ sadc kmem_cache named unix:0:kmem_io_512M_2048
+ sadc kmem_cache named unix:0:kmem_io_512M_4096
+ sadc kmem_cache named unix:0:kmem_io_16M_128
+ sadc kmem_cache named unix:0:kmem_io_16M_256
+ sadc kmem_cache named unix:0:kmem_io_16M_512
+ sadc kmem_cache named unix:0:kmem_io_16M_1024
+ sadc kmem_cache named unix:0:kmem_io_16M_2048
+ sadc kmem_cache named unix:0:kmem_io_16M_4096
+ sadc kmem_cache named unix:0:id32_cache
+ sadc kmem_cache named unix:0:bp_map_4096
+ sadc kmem_cache named unix:0:bp_map_8192
+ sadc kmem_cache named unix:0:bp_map_12288
+ sadc kmem_cache named unix:0:bp_map_16384
+ sadc kmem_cache named unix:0:bp_map_20480
+ sadc kmem_cache named unix:0:bp_map_24576
+ sadc kmem_cache named unix:0:bp_map_28672
+ sadc kmem_cache named unix:0:bp_map_32768
+ sadc kmem_cache named unix:0:mod_hash_entries
+ sadc kmem_cache named unix:0:ipp_mod
+ sadc kmem_cache named unix:0:ipp_action
+ sadc kmem_cache named unix:0:ipp_packet
+ sadc kmem_cache named unix:0:htable_t
+ sadc kmem_cache named unix:0:hment_t
+ sadc kmem_cache named unix:0:hat_t
+ sadc kmem_cache named unix:0:HatHash
+ sadc kmem_cache named unix:0:seg_cache
+ sadc kmem_cache named unix:0:snode_cache
+ sadc kmem_cache named unix:0:dv_node_cache
+ sadc kmem_cache named unix:0:dev_info_node_cache
+ sadc kmem_cache named unix:0:segkp_4096
+ sadc kmem_cache named unix:0:segkp_8192
+ sadc kmem_cache named unix:0:segkp_12288
+ sadc kmem_cache named unix:0:segkp_16384
+ sadc kmem_cache named unix:0:segkp_20480
+ sadc kmem_cache named unix:0:thread_cache
+ sadc kmem_cache named unix:0:lwp_cache
+ sadc kmem_cache named unix:0:turnstile_cache
+ sadc kmem_cache named unix:0:cred_cache
+ sadc kmem_cache named unix:0:rctl_cache
+ sadc kmem_cache named unix:0:rctl_val_cache
+ sadc kmem_cache named unix:0:task_cache
+ sadc kmem_cache named unix:0:cyclic_id_cache
+ sadc kmem_cache named unix:0:dnlc_space_cache
+ sadc kmem_cache named unix:0:vn_cache
+ sadc kmem_cache named unix:0:file_cache
+ sadc kmem_cache named unix:0:stream_head_cache
+ sadc kmem_cache named unix:0:queue_cache
+ sadc kmem_cache named unix:0:syncq_cache
+ sadc kmem_cache named unix:0:qband_cache
+ sadc kmem_cache named unix:0:linkinfo_cache
+ sadc kmem_cache named unix:0:ciputctrl_cache
+ sadc kmem_cache named unix:0:serializer_cache
+ sadc kmem_cache named unix:0:as_cache
+ sadc kmem_cache named unix:0:marker_cache
+ sadc kmem_cache named unix:0:anon_cache
+ sadc kmem_cache named unix:0:anonmap_cache
+ sadc kmem_cache named unix:0:segvn_cache
+ sadc kmem_cache named unix:0:flk_edges
+ sadc kmem_cache named unix:0:fdb_cache
+ sadc kmem_cache named unix:0:timer_cache
+ sadc kmem_cache named unix:0:physio_buf_cache
+ sadc kmem_cache named unix:0:ufs_inode_cache
+ sadc kmem_cache named unix:0:directio_buf_cache
+ sadc kmem_cache named unix:0:lufs_save
+ sadc kmem_cache named unix:0:lufs_bufs
+ sadc kmem_cache named unix:0:lufs_mapentry_cache
+ sadc misc raw cpu_stat:0:cpu_stat0
+ sadc kmem_cache named unix:0:kcf_sreq_cache
+ sadc kmem_cache named unix:0:kcf_areq_cache
+ sadc kmem_cache named unix:0:kcf_context_cache
+ sadc kmem_cache named unix:0:ipsec_actions
+ sadc kmem_cache named unix:0:ipsec_selectors
+ sadc kmem_cache named unix:0:ipsec_policy
+ sadc kmem_cache named unix:0:ipsec_info
+ sadc kmem_cache named unix:0:ip_minor_arena_1
+ sadc kmem_cache named unix:0:ipcl_conn_cache
+ sadc kmem_cache named unix:0:ipcl_tcpconn_cache
+ sadc kmem_cache named unix:0:ire_cache
+ sadc kmem_cache named unix:0:tcp_timercache
+ sadc kmem_cache named unix:0:tcp_sack_info_cache
+ sadc kmem_cache named unix:0:tcp_iphc_cache
+ sadc kmem_cache named unix:0:squeue_cache
+ sadc kmem_cache named unix:0:sctp_conn_cache
+ sadc kmem_cache named unix:0:sctp_faddr_cache
+ sadc kmem_cache named unix:0:sctp_set_cache
+ sadc kmem_cache named unix:0:sctp_ftsn_set_cache
+ sadc kmem_cache named unix:0:sctpsock
+ sadc kmem_cache named unix:0:sctp_assoc
+ sadc kmem_cache named unix:0:socktpi_cache
+ sadc kmem_cache named unix:0:socktpi_unix_cache
+ sadc kmem_cache named unix:0:ncafs_cache
+ sadc kmem_cache named unix:0:process_cache
+ sadc kmem_cache named unix:0:exacct_object_cache
+ sadc kmem_cache named unix:0:fctl_cache
+ sadc kmem_cache named unix:0:tl_cache
+ sadc kmem_cache named unix:0:keysock_1
+ sadc kmem_cache named unix:0:spdsock_1
+ sadc kmem_cache named unix:0:fnode_cache
+ sadc kmem_cache named unix:0:pipe_cache
+ sadc kmem_cache named unix:0:namefs_inodes_1
+ sadc kmem_cache named unix:0:port_cache
+ sadc kmem_cache named unix:0:lnode_cache
+ sadc kmem_cache named unix:0:clnt_clts_endpnt_cache
+ sadc kmem_cache named unix:0:pty_map
+ sadc kmem_cache named unix:0:sppptun_map
+ sadc kmem_cache named unix:0:dtrace_state_cache
+ sadc kmem_cache named unix:0:qif_head_cache
+ sadc kmem_cache named unix:0:udp_minor_1
+ sadc kmem_cache named unix:0:authkern_cache
+ sadc kmem_cache named unix:0:authloopback_cache
+ sadc kmem_cache named unix:0:authdes_cache_handle
+ sadc kmem_cache named unix:0:rnode_cache
+ sadc kmem_cache named unix:0:nfs_access_cache
+ sadc kmem_cache named unix:0:client_handle_cache
+ sadc kmem_cache named unix:0:rnode4_cache
+ sadc kmem_cache named unix:0:svnode_cache
+ sadc kmem_cache named unix:0:nfs4_access_cache
+ sadc kmem_cache named unix:0:client_handle4_cache
+ sadc kmem_cache named unix:0:nfs4_ace4vals_cache
+ sadc kmem_cache named unix:0:nfs4_ace4_list_cache
+ sadc kmem_cache named unix:0:NFS_idmap_cache
+ sadc kmem_cache named unix:0:lm_vnode
+ sadc kmem_cache named unix:0:lm_xprt
+ sadc kmem_cache named unix:0:lm_sysid
+ sadc kmem_cache named unix:0:lm_client
+ sadc kmem_cache named unix:0:lm_async
+ sadc kmem_cache named unix:0:lm_sleep
+ sadc kmem_cache named unix:0:lm_config
+ sadc kmem_cache named unix:0:nfslog_small_rec
+ sadc kmem_cache named unix:0:nfslog_medium_rec
+ sadc kmem_cache named unix:0:nfslog_large_rec
+ sadc kmem_cache named unix:0:exi_cache_handle
+ sadc kmem_cache named unix:0:Client_entry_cache
+ sadc kmem_cache named unix:0:OpenOwner_entry_cache
+ sadc kmem_cache named unix:0:OpenStateID_entry_cache
+ sadc kmem_cache named unix:0:LockStateID_entry_cache
+ sadc kmem_cache named unix:0:Lockowner_entry_cache
+ sadc kmem_cache named unix:0:File_entry_cache
+ sadc kmem_cache named unix:0:DelegStateID_entry_cache
+ sadc kmem_cache named unix:0:ip_minor_1
+ sadc kmem_cache named unix:0:ar_minor_1
+ sadc kmem_cache named unix:0:icmp_minor_1
+ sadc kmem_cache named unix:0:crypto_session_cache
+ sadc kmem_cache named unix:0:fcsm_job_cache
+ sadc kmem_cache named unix:0:sd0_cache
+ sadc kmem_cache named unix:0:hsfs_hsnode_cache
+ sadc kmem_cache named unix:0:kmem_magazine_1
+ sadc misc named unix:0:system_misc
+ sadc kmem_cache named unix:0:file_cache
+ sadc vmem named vmem:16:kmem_oversize
+ sadc ufs named ufs:0:inode_cache
+ sadc misc raw unix:0:var
+ sadc kmem_cache named unix:0:kmem_magazine_1
+ sadc kmem_cache named unix:0:kmem_magazine_3
+ sadc kmem_cache named unix:0:kmem_magazine_7
+ sadc kmem_cache named unix:0:kmem_magazine_15
+ sadc kmem_cache named unix:0:kmem_magazine_31
+ sadc kmem_cache named unix:0:kmem_magazine_47
+ sadc kmem_cache named unix:0:kmem_magazine_63
+ sadc kmem_cache named unix:0:kmem_magazine_95
+ sadc kmem_cache named unix:0:kmem_magazine_143
+ sadc kmem_cache named unix:0:kmem_slab_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_audit_cache
+ sadc kmem_cache named unix:0:kmem_va_4096
+ sadc kmem_cache named unix:0:kmem_va_8192
+ sadc kmem_cache named unix:0:kmem_va_12288
+ sadc kmem_cache named unix:0:kmem_va_16384
+ sadc kmem_cache named unix:0:kmem_va_20480
+ sadc kmem_cache named unix:0:kmem_va_24576
+ sadc kmem_cache named unix:0:kmem_va_28672
+ sadc kmem_cache named unix:0:kmem_va_32768
+ sadc kmem_cache named unix:0:kmem_alloc_8
+ sadc kmem_cache named unix:0:kmem_alloc_16
+ sadc kmem_cache named unix:0:kmem_alloc_24
+ sadc kmem_cache named unix:0:kmem_alloc_32
+ sadc kmem_cache named unix:0:kmem_alloc_40
+ sadc kmem_cache named unix:0:kmem_alloc_48
+ sadc kmem_cache named unix:0:kmem_alloc_56
+ sadc kmem_cache named unix:0:kmem_alloc_64
+ sadc kmem_cache named unix:0:kmem_alloc_80
+ sadc kmem_cache named unix:0:kmem_alloc_96
+ sadc kmem_cache named unix:0:kmem_alloc_112
+ sadc kmem_cache named unix:0:kmem_alloc_128
+ sadc kmem_cache named unix:0:kmem_alloc_160
+ sadc kmem_cache named unix:0:kmem_alloc_192
+ sadc kmem_cache named unix:0:kmem_alloc_224
+ sadc kmem_cache named unix:0:kmem_alloc_256
+ sadc kmem_cache named unix:0:kmem_alloc_320
+ sadc kmem_cache named unix:0:kmem_alloc_384
+ sadc kmem_cache named unix:0:kmem_alloc_448
+ sadc kmem_cache named unix:0:kmem_alloc_512
+ sadc kmem_cache named unix:0:kmem_alloc_640
+ sadc kmem_cache named unix:0:kmem_alloc_768
+ sadc kmem_cache named unix:0:kmem_alloc_896
+ sadc kmem_cache named unix:0:kmem_alloc_1152
+ sadc kmem_cache named unix:0:kmem_alloc_1344
+ sadc kmem_cache named unix:0:kmem_alloc_1600
+ sadc kmem_cache named unix:0:kmem_alloc_2048
+ sadc kmem_cache named unix:0:kmem_alloc_2688
+ sadc kmem_cache named unix:0:kmem_alloc_4096
+ sadc kmem_cache named unix:0:kmem_alloc_8192
+ sadc kmem_cache named unix:0:kmem_alloc_12288
+ sadc kmem_cache named unix:0:kmem_alloc_16384
+ sadc kmem_cache named unix:0:streams_mblk
+ sadc kmem_cache named unix:0:streams_dblk_64
+ sadc kmem_cache named unix:0:streams_dblk_128
+ sadc kmem_cache named unix:0:streams_dblk_320
+ sadc kmem_cache named unix:0:streams_dblk_576
+ sadc kmem_cache named unix:0:streams_dblk_1088
+ sadc kmem_cache named unix:0:streams_dblk_1536
+ sadc kmem_cache named unix:0:streams_dblk_1984
+ sadc kmem_cache named unix:0:streams_dblk_2624
+ sadc kmem_cache named unix:0:streams_dblk_3968
+ sadc kmem_cache named unix:0:streams_dblk_8192
+ sadc kmem_cache named unix:0:streams_dblk_12160
+ sadc kmem_cache named unix:0:streams_dblk_16384
+ sadc kmem_cache named unix:0:streams_dblk_20352
+ sadc kmem_cache named unix:0:streams_dblk_24576
+ sadc kmem_cache named unix:0:streams_dblk_28544
+ sadc kmem_cache named unix:0:streams_dblk_32768
+ sadc kmem_cache named unix:0:streams_dblk_36736
+ sadc kmem_cache named unix:0:streams_dblk_40960
+ sadc kmem_cache named unix:0:streams_dblk_44928
+ sadc kmem_cache named unix:0:streams_dblk_49152
+ sadc kmem_cache named unix:0:streams_dblk_53120
+ sadc kmem_cache named unix:0:streams_dblk_57344
+ sadc kmem_cache named unix:0:streams_dblk_61312
+ sadc kmem_cache named unix:0:streams_dblk_65536
+ sadc kmem_cache named unix:0:streams_dblk_69504
+ sadc kmem_cache named unix:0:streams_dblk_73728
+ sadc kmem_cache named unix:0:streams_dblk_esb
+ sadc kmem_cache named unix:0:streams_fthdr
+ sadc kmem_cache named unix:0:streams_ftblk
+ sadc kmem_cache named unix:0:multidata
+ sadc kmem_cache named unix:0:multidata_pdslab
+ sadc kmem_cache named unix:0:multidata_pattbl
+ sadc kmem_cache named unix:0:taskq_ent_cache
+ sadc kmem_cache named unix:0:taskq_cache
+ sadc kmem_cache named unix:0:kmem_io_512M_128
+ sadc kmem_cache named unix:0:kmem_io_512M_256
+ sadc kmem_cache named unix:0:kmem_io_512M_512
+ sadc kmem_cache named unix:0:kmem_io_512M_1024
+ sadc kmem_cache named unix:0:kmem_io_512M_2048
+ sadc kmem_cache named unix:0:kmem_io_512M_4096
+ sadc kmem_cache named unix:0:kmem_io_16M_128
+ sadc kmem_cache named unix:0:kmem_io_16M_256
+ sadc kmem_cache named unix:0:kmem_io_16M_512
+ sadc kmem_cache named unix:0:kmem_io_16M_1024
+ sadc kmem_cache named unix:0:kmem_io_16M_2048
+ sadc kmem_cache named unix:0:kmem_io_16M_4096
+ sadc kmem_cache named unix:0:id32_cache
+ sadc kmem_cache named unix:0:bp_map_4096
+ sadc kmem_cache named unix:0:bp_map_8192
+ sadc kmem_cache named unix:0:bp_map_12288
+ sadc kmem_cache named unix:0:bp_map_16384
+ sadc kmem_cache named unix:0:bp_map_20480
+ sadc kmem_cache named unix:0:bp_map_24576
+ sadc kmem_cache named unix:0:bp_map_28672
+ sadc kmem_cache named unix:0:bp_map_32768
+ sadc kmem_cache named unix:0:mod_hash_entries
+ sadc kmem_cache named unix:0:ipp_mod
+ sadc kmem_cache named unix:0:ipp_action
+ sadc kmem_cache named unix:0:ipp_packet
+ sadc kmem_cache named unix:0:htable_t
+ sadc kmem_cache named unix:0:hment_t
+ sadc kmem_cache named unix:0:hat_t
+ sadc kmem_cache named unix:0:HatHash
+ sadc kmem_cache named unix:0:seg_cache
+ sadc kmem_cache named unix:0:snode_cache
+ sadc kmem_cache named unix:0:dv_node_cache
+ sadc kmem_cache named unix:0:dev_info_node_cache
+ sadc kmem_cache named unix:0:segkp_4096
+ sadc kmem_cache named unix:0:segkp_8192
+ sadc kmem_cache named unix:0:segkp_12288
+ sadc kmem_cache named unix:0:segkp_16384
+ sadc kmem_cache named unix:0:segkp_20480
+ sadc kmem_cache named unix:0:thread_cache
+ sadc kmem_cache named unix:0:lwp_cache
+ sadc kmem_cache named unix:0:turnstile_cache
+ sadc kmem_cache named unix:0:cred_cache
+ sadc kmem_cache named unix:0:rctl_cache
+ sadc kmem_cache named unix:0:rctl_val_cache
+ sadc kmem_cache named unix:0:task_cache
+ sadc kmem_cache named unix:0:cyclic_id_cache
+ sadc kmem_cache named unix:0:dnlc_space_cache
+ sadc kmem_cache named unix:0:vn_cache
+ sadc kmem_cache named unix:0:file_cache
+ sadc kmem_cache named unix:0:stream_head_cache
+ sadc kmem_cache named unix:0:queue_cache
+ sadc kmem_cache named unix:0:syncq_cache
+ sadc kmem_cache named unix:0:qband_cache
+ sadc kmem_cache named unix:0:linkinfo_cache
+ sadc kmem_cache named unix:0:ciputctrl_cache
+ sadc kmem_cache named unix:0:serializer_cache
+ sadc kmem_cache named unix:0:as_cache
+ sadc kmem_cache named unix:0:marker_cache
+ sadc kmem_cache named unix:0:anon_cache
+ sadc kmem_cache named unix:0:anonmap_cache
+ sadc kmem_cache named unix:0:segvn_cache
+ sadc kmem_cache named unix:0:flk_edges
+ sadc kmem_cache named unix:0:fdb_cache
+ sadc kmem_cache named unix:0:timer_cache
+ sadc kmem_cache named unix:0:physio_buf_cache
+ sadc kmem_cache named unix:0:ufs_inode_cache
+ sadc kmem_cache named unix:0:directio_buf_cache
+ sadc kmem_cache named unix:0:lufs_save
+ sadc kmem_cache named unix:0:lufs_bufs
+ sadc kmem_cache named unix:0:lufs_mapentry_cache
+ sadc misc raw cpu_stat:0:cpu_stat0
+ sadc kmem_cache named unix:0:kcf_sreq_cache
+ sadc kmem_cache named unix:0:kcf_areq_cache
+ sadc kmem_cache named unix:0:kcf_context_cache
+ sadc kmem_cache named unix:0:ipsec_actions
+ sadc kmem_cache named unix:0:ipsec_selectors
+ sadc kmem_cache named unix:0:ipsec_policy
+ sadc kmem_cache named unix:0:ipsec_info
+ sadc kmem_cache named unix:0:ip_minor_arena_1
+ sadc kmem_cache named unix:0:ipcl_conn_cache
+ sadc kmem_cache named unix:0:ipcl_tcpconn_cache
+ sadc kmem_cache named unix:0:ire_cache
+ sadc kmem_cache named unix:0:tcp_timercache
+ sadc kmem_cache named unix:0:tcp_sack_info_cache
+ sadc kmem_cache named unix:0:tcp_iphc_cache
+ sadc kmem_cache named unix:0:squeue_cache
+ sadc kmem_cache named unix:0:sctp_conn_cache
+ sadc kmem_cache named unix:0:sctp_faddr_cache
+ sadc kmem_cache named unix:0:sctp_set_cache
+ sadc kmem_cache named unix:0:sctp_ftsn_set_cache
+ sadc kmem_cache named unix:0:sctpsock
+ sadc kmem_cache named unix:0:sctp_assoc
+ sadc kmem_cache named unix:0:socktpi_cache
+ sadc kmem_cache named unix:0:socktpi_unix_cache
+ sadc kmem_cache named unix:0:ncafs_cache
+ sadc kmem_cache named unix:0:process_cache
+ sadc kmem_cache named unix:0:exacct_object_cache
+ sadc kmem_cache named unix:0:fctl_cache
+ sadc kmem_cache named unix:0:tl_cache
+ sadc kmem_cache named unix:0:keysock_1
+ sadc kmem_cache named unix:0:spdsock_1
+ sadc kmem_cache named unix:0:fnode_cache
+ sadc kmem_cache named unix:0:pipe_cache
+ sadc kmem_cache named unix:0:namefs_inodes_1
+ sadc kmem_cache named unix:0:port_cache
+ sadc kmem_cache named unix:0:lnode_cache
+ sadc kmem_cache named unix:0:clnt_clts_endpnt_cache
+ sadc kmem_cache named unix:0:pty_map
+ sadc kmem_cache named unix:0:sppptun_map
+ sadc kmem_cache named unix:0:dtrace_state_cache
+ sadc kmem_cache named unix:0:qif_head_cache
+ sadc kmem_cache named unix:0:udp_minor_1
+ sadc kmem_cache named unix:0:authkern_cache
+ sadc kmem_cache named unix:0:authloopback_cache
+ sadc kmem_cache named unix:0:authdes_cache_handle
+ sadc kmem_cache named unix:0:rnode_cache
+ sadc kmem_cache named unix:0:nfs_access_cache
+ sadc kmem_cache named unix:0:client_handle_cache
+ sadc kmem_cache named unix:0:rnode4_cache
+ sadc kmem_cache named unix:0:svnode_cache
+ sadc kmem_cache named unix:0:nfs4_access_cache
+ sadc kmem_cache named unix:0:client_handle4_cache
+ sadc kmem_cache named unix:0:nfs4_ace4vals_cache
+ sadc kmem_cache named unix:0:nfs4_ace4_list_cache
+ sadc kmem_cache named unix:0:NFS_idmap_cache
+ sadc kmem_cache named unix:0:lm_vnode
+ sadc kmem_cache named unix:0:lm_xprt
+ sadc kmem_cache named unix:0:lm_sysid
+ sadc kmem_cache named unix:0:lm_client
+ sadc kmem_cache named unix:0:lm_async
+ sadc kmem_cache named unix:0:lm_sleep
+ sadc kmem_cache named unix:0:lm_config
+ sadc kmem_cache named unix:0:nfslog_small_rec
+ sadc kmem_cache named unix:0:nfslog_medium_rec
+ sadc kmem_cache named unix:0:nfslog_large_rec
+ sadc kmem_cache named unix:0:exi_cache_handle
+ sadc kmem_cache named unix:0:Client_entry_cache
+ sadc kmem_cache named unix:0:OpenOwner_entry_cache
+ sadc kmem_cache named unix:0:OpenStateID_entry_cache
+ sadc kmem_cache named unix:0:LockStateID_entry_cache
+ sadc kmem_cache named unix:0:Lockowner_entry_cache
+ sadc kmem_cache named unix:0:File_entry_cache
+ sadc kmem_cache named unix:0:DelegStateID_entry_cache
+ sadc kmem_cache named unix:0:ip_minor_1
+ sadc kmem_cache named unix:0:ar_minor_1
+ sadc kmem_cache named unix:0:icmp_minor_1
+ sadc kmem_cache named unix:0:crypto_session_cache
+ sadc kmem_cache named unix:0:fcsm_job_cache
+ sadc kmem_cache named unix:0:sd0_cache
+ sadc kmem_cache named unix:0:hsfs_hsnode_cache
+ sadc kmem_cache named unix:0:kmem_magazine_1
+ sadc misc raw unix:0:sysinfo
+ sadc vm raw unix:0:vminfo
+ sadc misc named unix:0:system_misc
+ sadc kmem_cache named unix:0:file_cache
+ sadc ufs named ufs:0:inode_cache
+ sadc misc raw cpu_stat:0:cpu_stat0
+ sadc kmem_cache named unix:0:kmem_magazine_1
+ sadc kmem_cache named unix:0:kmem_magazine_3
+ sadc kmem_cache named unix:0:kmem_magazine_7
+ sadc kmem_cache named unix:0:kmem_magazine_15
+ sadc kmem_cache named unix:0:kmem_magazine_31
+ sadc kmem_cache named unix:0:kmem_magazine_47
+ sadc kmem_cache named unix:0:kmem_magazine_63
+ sadc kmem_cache named unix:0:kmem_magazine_95
+ sadc kmem_cache named unix:0:kmem_magazine_143
+ sadc kmem_cache named unix:0:kmem_slab_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_audit_cache
+ sadc kmem_cache named unix:0:kmem_va_4096
+ sadc kmem_cache named unix:0:kmem_va_8192
+ sadc kmem_cache named unix:0:kmem_va_12288
+ sadc kmem_cache named unix:0:kmem_va_16384
+ sadc kmem_cache named unix:0:kmem_va_20480
+ sadc kmem_cache named unix:0:kmem_va_24576
+ sadc kmem_cache named unix:0:kmem_va_28672
+ sadc kmem_cache named unix:0:kmem_va_32768
+ sadc kmem_cache named unix:0:kmem_alloc_8
+ sadc kmem_cache named unix:0:kmem_alloc_16
+ sadc kmem_cache named unix:0:kmem_alloc_24
+ sadc kmem_cache named unix:0:kmem_alloc_32
+ sadc kmem_cache named unix:0:kmem_alloc_40
+ sadc kmem_cache named unix:0:kmem_alloc_48
+ sadc kmem_cache named unix:0:kmem_alloc_56
+ sadc kmem_cache named unix:0:kmem_alloc_64
+ sadc kmem_cache named unix:0:kmem_alloc_80
+ sadc kmem_cache named unix:0:kmem_alloc_96
+ sadc kmem_cache named unix:0:kmem_alloc_112
+ sadc kmem_cache named unix:0:kmem_alloc_128
+ sadc kmem_cache named unix:0:kmem_alloc_160
+ sadc kmem_cache named unix:0:kmem_alloc_192
+ sadc kmem_cache named unix:0:kmem_alloc_224
+ sadc kmem_cache named unix:0:kmem_alloc_256
+ sadc kmem_cache named unix:0:kmem_alloc_320
+ sadc kmem_cache named unix:0:kmem_alloc_384
+ sadc kmem_cache named unix:0:kmem_alloc_448
+ sadc kmem_cache named unix:0:kmem_alloc_512
+ sadc kmem_cache named unix:0:kmem_alloc_640
+ sadc kmem_cache named unix:0:kmem_alloc_768
+ sadc kmem_cache named unix:0:kmem_alloc_896
+ sadc kmem_cache named unix:0:kmem_alloc_1152
+ sadc kmem_cache named unix:0:kmem_alloc_1344
+ sadc kmem_cache named unix:0:kmem_alloc_1600
+ sadc kmem_cache named unix:0:kmem_alloc_2048
+ sadc kmem_cache named unix:0:kmem_alloc_2688
+ sadc kmem_cache named unix:0:kmem_alloc_4096
+ sadc kmem_cache named unix:0:kmem_alloc_8192
+ sadc kmem_cache named unix:0:kmem_alloc_12288
+ sadc kmem_cache named unix:0:kmem_alloc_16384
+ sadc kmem_cache named unix:0:streams_mblk
+ sadc kmem_cache named unix:0:streams_dblk_64
+ sadc kmem_cache named unix:0:streams_dblk_128
+ sadc kmem_cache named unix:0:streams_dblk_320
+ sadc kmem_cache named unix:0:streams_dblk_576
+ sadc kmem_cache named unix:0:streams_dblk_1088
+ sadc kmem_cache named unix:0:streams_dblk_1536
+ sadc kmem_cache named unix:0:streams_dblk_1984
+ sadc kmem_cache named unix:0:streams_dblk_2624
+ sadc kmem_cache named unix:0:streams_dblk_3968
+ sadc kmem_cache named unix:0:streams_dblk_8192
+ sadc kmem_cache named unix:0:streams_dblk_12160
+ sadc kmem_cache named unix:0:streams_dblk_16384
+ sadc kmem_cache named unix:0:streams_dblk_20352
+ sadc kmem_cache named unix:0:streams_dblk_24576
+ sadc kmem_cache named unix:0:streams_dblk_28544
+ sadc kmem_cache named unix:0:streams_dblk_32768
+ sadc kmem_cache named unix:0:streams_dblk_36736
+ sadc kmem_cache named unix:0:streams_dblk_40960
+ sadc kmem_cache named unix:0:streams_dblk_44928
+ sadc kmem_cache named unix:0:streams_dblk_49152
+ sadc kmem_cache named unix:0:streams_dblk_53120
+ sadc kmem_cache named unix:0:streams_dblk_57344
+ sadc kmem_cache named unix:0:streams_dblk_61312
+ sadc kmem_cache named unix:0:streams_dblk_65536
+ sadc kmem_cache named unix:0:streams_dblk_69504
+ sadc kmem_cache named unix:0:streams_dblk_73728
+ sadc kmem_cache named unix:0:streams_dblk_esb
+ sadc kmem_cache named unix:0:streams_fthdr
+ sadc kmem_cache named unix:0:streams_ftblk
+ sadc kmem_cache named unix:0:multidata
+ sadc kmem_cache named unix:0:multidata_pdslab
+ sadc kmem_cache named unix:0:multidata_pattbl
+ sadc kmem_cache named unix:0:taskq_ent_cache
+ sadc kmem_cache named unix:0:taskq_cache
+ sadc kmem_cache named unix:0:kmem_io_512M_128
+ sadc kmem_cache named unix:0:kmem_io_512M_256
+ sadc kmem_cache named unix:0:kmem_io_512M_512
+ sadc kmem_cache named unix:0:kmem_io_512M_1024
+ sadc kmem_cache named unix:0:kmem_io_512M_2048
+ sadc kmem_cache named unix:0:kmem_io_512M_4096
+ sadc kmem_cache named unix:0:kmem_io_16M_128
+ sadc kmem_cache named unix:0:kmem_io_16M_256
+ sadc kmem_cache named unix:0:kmem_io_16M_512
+ sadc kmem_cache named unix:0:kmem_io_16M_1024
+ sadc kmem_cache named unix:0:kmem_io_16M_2048
+ sadc kmem_cache named unix:0:kmem_io_16M_4096
+ sadc kmem_cache named unix:0:id32_cache
+ sadc kmem_cache named unix:0:bp_map_4096
+ sadc kmem_cache named unix:0:bp_map_8192
+ sadc kmem_cache named unix:0:bp_map_12288
+ sadc kmem_cache named unix:0:bp_map_16384
+ sadc kmem_cache named unix:0:bp_map_20480
+ sadc kmem_cache named unix:0:bp_map_24576
+ sadc kmem_cache named unix:0:bp_map_28672
+ sadc kmem_cache named unix:0:bp_map_32768
+ sadc kmem_cache named unix:0:mod_hash_entries
+ sadc kmem_cache named unix:0:ipp_mod
+ sadc kmem_cache named unix:0:ipp_action
+ sadc kmem_cache named unix:0:ipp_packet
+ sadc kmem_cache named unix:0:htable_t
+ sadc kmem_cache named unix:0:hment_t
+ sadc kmem_cache named unix:0:hat_t
+ sadc kmem_cache named unix:0:HatHash
+ sadc kmem_cache named unix:0:seg_cache
+ sadc kmem_cache named unix:0:snode_cache
+ sadc kmem_cache named unix:0:dv_node_cache
+ sadc kmem_cache named unix:0:dev_info_node_cache
+ sadc kmem_cache named unix:0:segkp_4096
+ sadc kmem_cache named unix:0:segkp_8192
+ sadc kmem_cache named unix:0:segkp_12288
+ sadc kmem_cache named unix:0:segkp_16384
+ sadc kmem_cache named unix:0:segkp_20480
+ sadc kmem_cache named unix:0:thread_cache
+ sadc kmem_cache named unix:0:lwp_cache
+ sadc kmem_cache named unix:0:turnstile_cache
+ sadc kmem_cache named unix:0:cred_cache
+ sadc kmem_cache named unix:0:rctl_cache
+ sadc kmem_cache named unix:0:rctl_val_cache
+ sadc kmem_cache named unix:0:task_cache
+ sadc kmem_cache named unix:0:cyclic_id_cache
+ sadc kmem_cache named unix:0:dnlc_space_cache
+ sadc kmem_cache named unix:0:vn_cache
+ sadc kmem_cache named unix:0:file_cache
+ sadc kmem_cache named unix:0:stream_head_cache
+ sadc kmem_cache named unix:0:queue_cache
+ sadc kmem_cache named unix:0:syncq_cache
+ sadc kmem_cache named unix:0:qband_cache
+ sadc kmem_cache named unix:0:linkinfo_cache
+ sadc kmem_cache named unix:0:ciputctrl_cache
+ sadc kmem_cache named unix:0:serializer_cache
+ sadc kmem_cache named unix:0:as_cache
+ sadc kmem_cache named unix:0:marker_cache
+ sadc kmem_cache named unix:0:anon_cache
+ sadc kmem_cache named unix:0:anonmap_cache
+ sadc kmem_cache named unix:0:segvn_cache
+ sadc kmem_cache named unix:0:flk_edges
+ sadc kmem_cache named unix:0:fdb_cache
+ sadc kmem_cache named unix:0:timer_cache
+ sadc kmem_cache named unix:0:physio_buf_cache
+ sadc kmem_cache named unix:0:ufs_inode_cache
+ sadc kmem_cache named unix:0:directio_buf_cache
+ sadc kmem_cache named unix:0:lufs_save
+ sadc kmem_cache named unix:0:lufs_bufs
+ sadc kmem_cache named unix:0:lufs_mapentry_cache
+ sadc kmem_cache named unix:0:kcf_sreq_cache
+ sadc kmem_cache named unix:0:kcf_areq_cache
+ sadc kmem_cache named unix:0:kcf_context_cache
+ sadc kmem_cache named unix:0:ipsec_actions
+ sadc kmem_cache named unix:0:ipsec_selectors
+ sadc kmem_cache named unix:0:ipsec_policy
+ sadc kmem_cache named unix:0:ipsec_info
+ sadc kmem_cache named unix:0:ip_minor_arena_1
+ sadc kmem_cache named unix:0:ipcl_conn_cache
+ sadc kmem_cache named unix:0:ipcl_tcpconn_cache
+ sadc kmem_cache named unix:0:ire_cache
+ sadc kmem_cache named unix:0:tcp_timercache
+ sadc kmem_cache named unix:0:tcp_sack_info_cache
+ sadc kmem_cache named unix:0:tcp_iphc_cache
+ sadc kmem_cache named unix:0:squeue_cache
+ sadc kmem_cache named unix:0:sctp_conn_cache
+ sadc kmem_cache named unix:0:sctp_faddr_cache
+ sadc kmem_cache named unix:0:sctp_set_cache
+ sadc kmem_cache named unix:0:sctp_ftsn_set_cache
+ sadc kmem_cache named unix:0:sctpsock
+ sadc kmem_cache named unix:0:sctp_assoc
+ sadc kmem_cache named unix:0:socktpi_cache
+ sadc kmem_cache named unix:0:socktpi_unix_cache
+ sadc kmem_cache named unix:0:ncafs_cache
+ sadc kmem_cache named unix:0:process_cache
+ sadc kmem_cache named unix:0:exacct_object_cache
+ sadc kmem_cache named unix:0:fctl_cache
+ sadc kmem_cache named unix:0:tl_cache
+ sadc kmem_cache named unix:0:keysock_1
+ sadc kmem_cache named unix:0:spdsock_1
+ sadc kmem_cache named unix:0:fnode_cache
+ sadc kmem_cache named unix:0:pipe_cache
+ sadc kmem_cache named unix:0:namefs_inodes_1
+ sadc kmem_cache named unix:0:port_cache
+ sadc kmem_cache named unix:0:lnode_cache
+ sadc kmem_cache named unix:0:clnt_clts_endpnt_cache
+ sadc kmem_cache named unix:0:pty_map
+ sadc kmem_cache named unix:0:sppptun_map
+ sadc kmem_cache named unix:0:dtrace_state_cache
+ sadc kmem_cache named unix:0:qif_head_cache
+ sadc kmem_cache named unix:0:udp_minor_1
+ sadc kmem_cache named unix:0:authkern_cache
+ sadc kmem_cache named unix:0:authloopback_cache
+ sadc kmem_cache named unix:0:authdes_cache_handle
+ sadc kmem_cache named unix:0:rnode_cache
+ sadc kmem_cache named unix:0:nfs_access_cache
+ sadc kmem_cache named unix:0:client_handle_cache
+ sadc kmem_cache named unix:0:rnode4_cache
+ sadc kmem_cache named unix:0:svnode_cache
+ sadc kmem_cache named unix:0:nfs4_access_cache
+ sadc kmem_cache named unix:0:client_handle4_cache
+ sadc kmem_cache named unix:0:nfs4_ace4vals_cache
+ sadc kmem_cache named unix:0:nfs4_ace4_list_cache
+ sadc kmem_cache named unix:0:NFS_idmap_cache
+ sadc kmem_cache named unix:0:lm_vnode
+ sadc kmem_cache named unix:0:lm_xprt
+ sadc kmem_cache named unix:0:lm_sysid
+ sadc kmem_cache named unix:0:lm_client
+ sadc kmem_cache named unix:0:lm_async
+ sadc kmem_cache named unix:0:lm_sleep
+ sadc kmem_cache named unix:0:lm_config
+ sadc kmem_cache named unix:0:nfslog_small_rec
+ sadc kmem_cache named unix:0:nfslog_medium_rec
+ sadc kmem_cache named unix:0:nfslog_large_rec
+ sadc kmem_cache named unix:0:exi_cache_handle
+ sadc kmem_cache named unix:0:Client_entry_cache
+ sadc kmem_cache named unix:0:OpenOwner_entry_cache
+ sadc kmem_cache named unix:0:OpenStateID_entry_cache
+ sadc kmem_cache named unix:0:LockStateID_entry_cache
+ sadc kmem_cache named unix:0:Lockowner_entry_cache
+ sadc kmem_cache named unix:0:File_entry_cache
+ sadc kmem_cache named unix:0:DelegStateID_entry_cache
+ sadc kmem_cache named unix:0:ip_minor_1
+ sadc kmem_cache named unix:0:ar_minor_1
+ sadc kmem_cache named unix:0:icmp_minor_1
+ sadc kmem_cache named unix:0:crypto_session_cache
+ sadc kmem_cache named unix:0:fcsm_job_cache
+ sadc kmem_cache named unix:0:sd0_cache
+ sadc kmem_cache named unix:0:hsfs_hsnode_cache
+ sadc vmem named vmem:16:kmem_oversize
+ sadc disk io cmdk:0:cmdk0
+ sadc nfs io nfs:1:nfs1
+ sadc disk io sd:0:sd0
+ sadc usb_byte_count io usba:0:uhci0,bulk
+ sadc usb_byte_count io usba:0:uhci0,ctrl
+ sadc usb_byte_count io usba:0:uhci0,intr
+ sadc usb_byte_count io usba:0:uhci0,isoch
+ sadc usb_byte_count io usba:0:uhci0,total
+ sadc usb_byte_count io usba:1:uhci1,bulk
+ sadc usb_byte_count io usba:1:uhci1,ctrl
+ sadc usb_byte_count io usba:1:uhci1,intr
+ sadc usb_byte_count io usba:1:uhci1,isoch
+ sadc usb_byte_count io usba:1:uhci1,total
+ sadc misc named unix:0:system_misc
+ sadc kmem_cache named unix:0:file_cache
+ sadc vmem named vmem:16:kmem_oversize
+ sadc ufs named ufs:0:inode_cache
+ sadc misc raw unix:0:var
+ sadc kmem_cache named unix:0:kmem_magazine_1
+ sadc kmem_cache named unix:0:kmem_magazine_3
+ sadc kmem_cache named unix:0:kmem_magazine_7
+ sadc kmem_cache named unix:0:kmem_magazine_15
+ sadc kmem_cache named unix:0:kmem_magazine_31
+ sadc kmem_cache named unix:0:kmem_magazine_47
+ sadc kmem_cache named unix:0:kmem_magazine_63
+ sadc kmem_cache named unix:0:kmem_magazine_95
+ sadc kmem_cache named unix:0:kmem_magazine_143
+ sadc kmem_cache named unix:0:kmem_slab_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_audit_cache
+ sadc kmem_cache named unix:0:kmem_va_4096
+ sadc kmem_cache named unix:0:kmem_va_8192
+ sadc kmem_cache named unix:0:kmem_va_12288
+ sadc kmem_cache named unix:0:kmem_va_16384
+ sadc kmem_cache named unix:0:kmem_va_20480
+ sadc kmem_cache named unix:0:kmem_va_24576
+ sadc kmem_cache named unix:0:kmem_va_28672
+ sadc kmem_cache named unix:0:kmem_va_32768
+ sadc kmem_cache named unix:0:kmem_alloc_8
+ sadc kmem_cache named unix:0:kmem_alloc_16
+ sadc kmem_cache named unix:0:kmem_alloc_24
+ sadc kmem_cache named unix:0:kmem_alloc_32
+ sadc kmem_cache named unix:0:kmem_alloc_40
+ sadc kmem_cache named unix:0:kmem_alloc_48
+ sadc kmem_cache named unix:0:kmem_alloc_56
+ sadc kmem_cache named unix:0:kmem_alloc_64
+ sadc kmem_cache named unix:0:kmem_alloc_80
+ sadc kmem_cache named unix:0:kmem_alloc_96
+ sadc kmem_cache named unix:0:kmem_alloc_112
+ sadc kmem_cache named unix:0:kmem_alloc_128
+ sadc kmem_cache named unix:0:kmem_alloc_160
+ sadc kmem_cache named unix:0:kmem_alloc_192
+ sadc kmem_cache named unix:0:kmem_alloc_224
+ sadc kmem_cache named unix:0:kmem_alloc_256
+ sadc kmem_cache named unix:0:kmem_alloc_320
+ sadc kmem_cache named unix:0:kmem_alloc_384
+ sadc kmem_cache named unix:0:kmem_alloc_448
+ sadc kmem_cache named unix:0:kmem_alloc_512
+ sadc kmem_cache named unix:0:kmem_alloc_640
+ sadc kmem_cache named unix:0:kmem_alloc_768
+ sadc kmem_cache named unix:0:kmem_alloc_896
+ sadc kmem_cache named unix:0:kmem_alloc_1152
+ sadc kmem_cache named unix:0:kmem_alloc_1344
+ sadc kmem_cache named unix:0:kmem_alloc_1600
+ sadc kmem_cache named unix:0:kmem_alloc_2048
+ sadc kmem_cache named unix:0:kmem_alloc_2688
+ sadc kmem_cache named unix:0:kmem_alloc_4096
+ sadc kmem_cache named unix:0:kmem_alloc_8192
+ sadc kmem_cache named unix:0:kmem_alloc_12288
+ sadc kmem_cache named unix:0:kmem_alloc_16384
+ sadc kmem_cache named unix:0:streams_mblk
+ sadc kmem_cache named unix:0:streams_dblk_64
+ sadc kmem_cache named unix:0:streams_dblk_128
+ sadc kmem_cache named unix:0:streams_dblk_320
+ sadc kmem_cache named unix:0:streams_dblk_576
+ sadc kmem_cache named unix:0:streams_dblk_1088
+ sadc kmem_cache named unix:0:streams_dblk_1536
+ sadc kmem_cache named unix:0:streams_dblk_1984
+ sadc kmem_cache named unix:0:streams_dblk_2624
+ sadc kmem_cache named unix:0:streams_dblk_3968
+ sadc kmem_cache named unix:0:streams_dblk_8192
+ sadc kmem_cache named unix:0:streams_dblk_12160
+ sadc kmem_cache named unix:0:streams_dblk_16384
+ sadc kmem_cache named unix:0:streams_dblk_20352
+ sadc kmem_cache named unix:0:streams_dblk_24576
+ sadc kmem_cache named unix:0:streams_dblk_28544
+ sadc kmem_cache named unix:0:streams_dblk_32768
+ sadc kmem_cache named unix:0:streams_dblk_36736
+ sadc kmem_cache named unix:0:streams_dblk_40960
+ sadc kmem_cache named unix:0:streams_dblk_44928
+ sadc kmem_cache named unix:0:streams_dblk_49152
+ sadc kmem_cache named unix:0:streams_dblk_53120
+ sadc kmem_cache named unix:0:streams_dblk_57344
+ sadc kmem_cache named unix:0:streams_dblk_61312
+ sadc kmem_cache named unix:0:streams_dblk_65536
+ sadc kmem_cache named unix:0:streams_dblk_69504
+ sadc kmem_cache named unix:0:streams_dblk_73728
+ sadc kmem_cache named unix:0:streams_dblk_esb
+ sadc kmem_cache named unix:0:streams_fthdr
+ sadc kmem_cache named unix:0:streams_ftblk
+ sadc kmem_cache named unix:0:multidata
+ sadc kmem_cache named unix:0:multidata_pdslab
+ sadc kmem_cache named unix:0:multidata_pattbl
+ sadc kmem_cache named unix:0:taskq_ent_cache
+ sadc kmem_cache named unix:0:taskq_cache
+ sadc kmem_cache named unix:0:kmem_io_512M_128
+ sadc kmem_cache named unix:0:kmem_io_512M_256
+ sadc kmem_cache named unix:0:kmem_io_512M_512
+ sadc kmem_cache named unix:0:kmem_io_512M_1024
+ sadc kmem_cache named unix:0:kmem_io_512M_2048
+ sadc kmem_cache named unix:0:kmem_io_512M_4096
+ sadc kmem_cache named unix:0:kmem_io_16M_128
+ sadc kmem_cache named unix:0:kmem_io_16M_256
+ sadc kmem_cache named unix:0:kmem_io_16M_512
+ sadc kmem_cache named unix:0:kmem_io_16M_1024
+ sadc kmem_cache named unix:0:kmem_io_16M_2048
+ sadc kmem_cache named unix:0:kmem_io_16M_4096
+ sadc kmem_cache named unix:0:id32_cache
+ sadc kmem_cache named unix:0:bp_map_4096
+ sadc kmem_cache named unix:0:bp_map_8192
+ sadc kmem_cache named unix:0:bp_map_12288
+ sadc kmem_cache named unix:0:bp_map_16384
+ sadc kmem_cache named unix:0:bp_map_20480
+ sadc kmem_cache named unix:0:bp_map_24576
+ sadc kmem_cache named unix:0:bp_map_28672
+ sadc kmem_cache named unix:0:bp_map_32768
+ sadc kmem_cache named unix:0:mod_hash_entries
+ sadc kmem_cache named unix:0:ipp_mod
+ sadc kmem_cache named unix:0:ipp_action
+ sadc kmem_cache named unix:0:ipp_packet
+ sadc kmem_cache named unix:0:htable_t
+ sadc kmem_cache named unix:0:hment_t
+ sadc kmem_cache named unix:0:hat_t
+ sadc kmem_cache named unix:0:HatHash
+ sadc kmem_cache named unix:0:seg_cache
+ sadc kmem_cache named unix:0:snode_cache
+ sadc kmem_cache named unix:0:dv_node_cache
+ sadc kmem_cache named unix:0:dev_info_node_cache
+ sadc kmem_cache named unix:0:segkp_4096
+ sadc kmem_cache named unix:0:segkp_8192
+ sadc kmem_cache named unix:0:segkp_12288
+ sadc kmem_cache named unix:0:segkp_16384
+ sadc kmem_cache named unix:0:segkp_20480
+ sadc kmem_cache named unix:0:thread_cache
+ sadc kmem_cache named unix:0:lwp_cache
+ sadc kmem_cache named unix:0:turnstile_cache
+ sadc kmem_cache named unix:0:cred_cache
+ sadc kmem_cache named unix:0:rctl_cache
+ sadc kmem_cache named unix:0:rctl_val_cache
+ sadc kmem_cache named unix:0:task_cache
+ sadc kmem_cache named unix:0:cyclic_id_cache
+ sadc kmem_cache named unix:0:dnlc_space_cache
+ sadc kmem_cache named unix:0:vn_cache
+ sadc kmem_cache named unix:0:file_cache
+ sadc kmem_cache named unix:0:stream_head_cache
+ sadc kmem_cache named unix:0:queue_cache
+ sadc kmem_cache named unix:0:syncq_cache
+ sadc kmem_cache named unix:0:qband_cache
+ sadc kmem_cache named unix:0:linkinfo_cache
+ sadc kmem_cache named unix:0:ciputctrl_cache
+ sadc kmem_cache named unix:0:serializer_cache
+ sadc kmem_cache named unix:0:as_cache
+ sadc kmem_cache named unix:0:marker_cache
+ sadc kmem_cache named unix:0:anon_cache
+ sadc kmem_cache named unix:0:anonmap_cache
+ sadc kmem_cache named unix:0:segvn_cache
+ sadc kmem_cache named unix:0:flk_edges
+ sadc kmem_cache named unix:0:fdb_cache
+ sadc kmem_cache named unix:0:timer_cache
+ sadc kmem_cache named unix:0:physio_buf_cache
+ sadc kmem_cache named unix:0:ufs_inode_cache
+ sadc kmem_cache named unix:0:directio_buf_cache
+ sadc kmem_cache named unix:0:lufs_save
+ sadc kmem_cache named unix:0:lufs_bufs
+ sadc kmem_cache named unix:0:lufs_mapentry_cache
+ sadc misc raw cpu_stat:0:cpu_stat0
+ sadc kmem_cache named unix:0:kcf_sreq_cache
+ sadc kmem_cache named unix:0:kcf_areq_cache
+ sadc kmem_cache named unix:0:kcf_context_cache
+ sadc kmem_cache named unix:0:ipsec_actions
+ sadc kmem_cache named unix:0:ipsec_selectors
+ sadc kmem_cache named unix:0:ipsec_policy
+ sadc kmem_cache named unix:0:ipsec_info
+ sadc kmem_cache named unix:0:ip_minor_arena_1
+ sadc kmem_cache named unix:0:ipcl_conn_cache
+ sadc kmem_cache named unix:0:ipcl_tcpconn_cache
+ sadc kmem_cache named unix:0:ire_cache
+ sadc kmem_cache named unix:0:tcp_timercache
+ sadc kmem_cache named unix:0:tcp_sack_info_cache
+ sadc kmem_cache named unix:0:tcp_iphc_cache
+ sadc kmem_cache named unix:0:squeue_cache
+ sadc kmem_cache named unix:0:sctp_conn_cache
+ sadc kmem_cache named unix:0:sctp_faddr_cache
+ sadc kmem_cache named unix:0:sctp_set_cache
+ sadc kmem_cache named unix:0:sctp_ftsn_set_cache
+ sadc kmem_cache named unix:0:sctpsock
+ sadc kmem_cache named unix:0:sctp_assoc
+ sadc kmem_cache named unix:0:socktpi_cache
+ sadc kmem_cache named unix:0:socktpi_unix_cache
+ sadc kmem_cache named unix:0:ncafs_cache
+ sadc kmem_cache named unix:0:process_cache
+ sadc kmem_cache named unix:0:exacct_object_cache
+ sadc kmem_cache named unix:0:fctl_cache
+ sadc kmem_cache named unix:0:tl_cache
+ sadc kmem_cache named unix:0:keysock_1
+ sadc kmem_cache named unix:0:spdsock_1
+ sadc kmem_cache named unix:0:fnode_cache
+ sadc kmem_cache named unix:0:pipe_cache
+ sadc kmem_cache named unix:0:namefs_inodes_1
+ sadc kmem_cache named unix:0:port_cache
+ sadc kmem_cache named unix:0:lnode_cache
+ sadc kmem_cache named unix:0:clnt_clts_endpnt_cache
+ sadc kmem_cache named unix:0:pty_map
+ sadc kmem_cache named unix:0:sppptun_map
+ sadc kmem_cache named unix:0:dtrace_state_cache
+ sadc kmem_cache named unix:0:qif_head_cache
+ sadc kmem_cache named unix:0:udp_minor_1
+ sadc kmem_cache named unix:0:authkern_cache
+ sadc kmem_cache named unix:0:authloopback_cache
+ sadc kmem_cache named unix:0:authdes_cache_handle
+ sadc kmem_cache named unix:0:rnode_cache
+ sadc kmem_cache named unix:0:nfs_access_cache
+ sadc kmem_cache named unix:0:client_handle_cache
+ sadc kmem_cache named unix:0:rnode4_cache
+ sadc kmem_cache named unix:0:svnode_cache
+ sadc kmem_cache named unix:0:nfs4_access_cache
+ sadc kmem_cache named unix:0:client_handle4_cache
+ sadc kmem_cache named unix:0:nfs4_ace4vals_cache
+ sadc kmem_cache named unix:0:nfs4_ace4_list_cache
+ sadc kmem_cache named unix:0:NFS_idmap_cache
+ sadc kmem_cache named unix:0:lm_vnode
+ sadc kmem_cache named unix:0:lm_xprt
+ sadc kmem_cache named unix:0:lm_sysid
+ sadc kmem_cache named unix:0:lm_client
+ sadc kmem_cache named unix:0:lm_async
+ sadc kmem_cache named unix:0:lm_sleep
+ sadc kmem_cache named unix:0:lm_config
+ sadc kmem_cache named unix:0:nfslog_small_rec
+ sadc kmem_cache named unix:0:nfslog_medium_rec
+ sadc kmem_cache named unix:0:nfslog_large_rec
+ sadc kmem_cache named unix:0:exi_cache_handle
+ sadc kmem_cache named unix:0:Client_entry_cache
+ sadc kmem_cache named unix:0:OpenOwner_entry_cache
+ sadc kmem_cache named unix:0:OpenStateID_entry_cache
+ sadc kmem_cache named unix:0:LockStateID_entry_cache
+ sadc kmem_cache named unix:0:Lockowner_entry_cache
+ sadc kmem_cache named unix:0:File_entry_cache
+ sadc kmem_cache named unix:0:DelegStateID_entry_cache
+ sadc kmem_cache named unix:0:ip_minor_1
+ sadc kmem_cache named unix:0:ar_minor_1
+ sadc kmem_cache named unix:0:icmp_minor_1
+ sadc kmem_cache named unix:0:crypto_session_cache
+ sadc kmem_cache named unix:0:fcsm_job_cache
+ sadc kmem_cache named unix:0:sd0_cache
+ sadc kmem_cache named unix:0:hsfs_hsnode_cache
+ sadc kmem_cache named unix:0:kmem_magazine_1
+ sadc misc raw unix:0:sysinfo
+ sadc vm raw unix:0:vminfo
+ sadc misc named unix:0:system_misc
+ sadc kmem_cache named unix:0:file_cache
+ sadc ufs named ufs:0:inode_cache
+ sadc misc raw cpu_stat:0:cpu_stat0
+ sadc kmem_cache named unix:0:kmem_magazine_1
+ sadc kmem_cache named unix:0:kmem_magazine_3
+ sadc kmem_cache named unix:0:kmem_magazine_7
+ sadc kmem_cache named unix:0:kmem_magazine_15
+ sadc kmem_cache named unix:0:kmem_magazine_31
+ sadc kmem_cache named unix:0:kmem_magazine_47
+ sadc kmem_cache named unix:0:kmem_magazine_63
+ sadc kmem_cache named unix:0:kmem_magazine_95
+ sadc kmem_cache named unix:0:kmem_magazine_143
+ sadc kmem_cache named unix:0:kmem_slab_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_cache
+ sadc kmem_cache named unix:0:kmem_bufctl_audit_cache
+ sadc kmem_cache named unix:0:kmem_va_4096
+ sadc kmem_cache named unix:0:kmem_va_8192
+ sadc kmem_cache named unix:0:kmem_va_12288
+ sadc kmem_cache named unix:0:kmem_va_16384
+ sadc kmem_cache named unix:0:kmem_va_20480
+ sadc kmem_cache named unix:0:kmem_va_24576
+ sadc kmem_cache named unix:0:kmem_va_28672
+ sadc kmem_cache named unix:0:kmem_va_32768
+ sadc kmem_cache named unix:0:kmem_alloc_8
+ sadc kmem_cache named unix:0:kmem_alloc_16
+ sadc kmem_cache named unix:0:kmem_alloc_24
+ sadc kmem_cache named unix:0:kmem_alloc_32
+ sadc kmem_cache named unix:0:kmem_alloc_40
+ sadc kmem_cache named unix:0:kmem_alloc_48
+ sadc kmem_cache named unix:0:kmem_alloc_56
+ sadc kmem_cache named unix:0:kmem_alloc_64
+ sadc kmem_cache named unix:0:kmem_alloc_80
+ sadc kmem_cache named unix:0:kmem_alloc_96
+ sadc kmem_cache named unix:0:kmem_alloc_112
+ sadc kmem_cache named unix:0:kmem_alloc_128
+ sadc kmem_cache named unix:0:kmem_alloc_160
+ sadc kmem_cache named unix:0:kmem_alloc_192
+ sadc kmem_cache named unix:0:kmem_alloc_224
+ sadc kmem_cache named unix:0:kmem_alloc_256
+ sadc kmem_cache named unix:0:kmem_alloc_320
+ sadc kmem_cache named unix:0:kmem_alloc_384
+ sadc kmem_cache named unix:0:kmem_alloc_448
+ sadc kmem_cache named unix:0:kmem_alloc_512
+ sadc kmem_cache named unix:0:kmem_alloc_640
+ sadc kmem_cache named unix:0:kmem_alloc_768
+ sadc kmem_cache named unix:0:kmem_alloc_896
+ sadc kmem_cache named unix:0:kmem_alloc_1152
+ sadc kmem_cache named unix:0:kmem_alloc_1344
+ sadc kmem_cache named unix:0:kmem_alloc_1600
+ sadc kmem_cache named unix:0:kmem_alloc_2048
+ sadc kmem_cache named unix:0:kmem_alloc_2688
+ sadc kmem_cache named unix:0:kmem_alloc_4096
+ sadc kmem_cache named unix:0:kmem_alloc_8192
+ sadc kmem_cache named unix:0:kmem_alloc_12288
+ sadc kmem_cache named unix:0:kmem_alloc_16384
+ sadc kmem_cache named unix:0:streams_mblk
+ sadc kmem_cache named unix:0:streams_dblk_64
+ sadc kmem_cache named unix:0:streams_dblk_128
+ sadc kmem_cache named unix:0:streams_dblk_320
+ sadc kmem_cache named unix:0:streams_dblk_576
+ sadc kmem_cache named unix:0:streams_dblk_1088
+ sadc kmem_cache named unix:0:streams_dblk_1536
+ sadc kmem_cache named unix:0:streams_dblk_1984
+ sadc kmem_cache named unix:0:streams_dblk_2624
+ sadc kmem_cache named unix:0:streams_dblk_3968
+ sadc kmem_cache named unix:0:streams_dblk_8192
+ sadc kmem_cache named unix:0:streams_dblk_12160
+ sadc kmem_cache named unix:0:streams_dblk_16384
+ sadc kmem_cache named unix:0:streams_dblk_20352
+ sadc kmem_cache named unix:0:streams_dblk_24576
+ sadc kmem_cache named unix:0:streams_dblk_28544
+ sadc kmem_cache named unix:0:streams_dblk_32768
+ sadc kmem_cache named unix:0:streams_dblk_36736
+ sadc kmem_cache named unix:0:streams_dblk_40960
+ sadc kmem_cache named unix:0:streams_dblk_44928
+ sadc kmem_cache named unix:0:streams_dblk_49152
+ sadc kmem_cache named unix:0:streams_dblk_53120
+ sadc kmem_cache named unix:0:streams_dblk_57344
+ sadc kmem_cache named unix:0:streams_dblk_61312
+ sadc kmem_cache named unix:0:streams_dblk_65536
+ sadc kmem_cache named unix:0:streams_dblk_69504
+ sadc kmem_cache named unix:0:streams_dblk_73728
+ sadc kmem_cache named unix:0:streams_dblk_esb
+ sadc kmem_cache named unix:0:streams_fthdr
+ sadc kmem_cache named unix:0:streams_ftblk
+ sadc kmem_cache named unix:0:multidata
+ sadc kmem_cache named unix:0:multidata_pdslab
+ sadc kmem_cache named unix:0:multidata_pattbl
+ sadc kmem_cache named unix:0:taskq_ent_cache
+ sadc kmem_cache named unix:0:taskq_cache
+ sadc kmem_cache named unix:0:kmem_io_512M_128
+ sadc kmem_cache named unix:0:kmem_io_512M_256
+ sadc kmem_cache named unix:0:kmem_io_512M_512
+ sadc kmem_cache named unix:0:kmem_io_512M_1024
+ sadc kmem_cache named unix:0:kmem_io_512M_2048
+ sadc kmem_cache named unix:0:kmem_io_512M_4096
+ sadc kmem_cache named unix:0:kmem_io_16M_128
+ sadc kmem_cache named unix:0:kmem_io_16M_256
+ sadc kmem_cache named unix:0:kmem_io_16M_512
+ sadc kmem_cache named unix:0:kmem_io_16M_1024
+ sadc kmem_cache named unix:0:kmem_io_16M_2048
+ sadc kmem_cache named unix:0:kmem_io_16M_4096
+ sadc kmem_cache named unix:0:id32_cache
+ sadc kmem_cache named unix:0:bp_map_4096
+ sadc kmem_cache named unix:0:bp_map_8192
+ sadc kmem_cache named unix:0:bp_map_12288
+ sadc kmem_cache named unix:0:bp_map_16384
+ sadc kmem_cache named unix:0:bp_map_20480
+ sadc kmem_cache named unix:0:bp_map_24576
+ sadc kmem_cache named unix:0:bp_map_28672
+ sadc kmem_cache named unix:0:bp_map_32768
+ sadc kmem_cache named unix:0:mod_hash_entries
+ sadc kmem_cache named unix:0:ipp_mod
+ sadc kmem_cache named unix:0:ipp_action
+ sadc kmem_cache named unix:0:ipp_packet
+ sadc kmem_cache named unix:0:htable_t
+ sadc kmem_cache named unix:0:hment_t
+ sadc kmem_cache named unix:0:hat_t
+ sadc kmem_cache named unix:0:HatHash
+ sadc kmem_cache named unix:0:seg_cache
+ sadc kmem_cache named unix:0:snode_cache
+ sadc kmem_cache named unix:0:dv_node_cache
+ sadc kmem_cache named unix:0:dev_info_node_cache
+ sadc kmem_cache named unix:0:segkp_4096
+ sadc kmem_cache named unix:0:segkp_8192
+ sadc kmem_cache named unix:0:segkp_12288
+ sadc kmem_cache named unix:0:segkp_16384
+ sadc kmem_cache named unix:0:segkp_20480
+ sadc kmem_cache named unix:0:thread_cache
+ sadc kmem_cache named unix:0:lwp_cache
+ sadc kmem_cache named unix:0:turnstile_cache
+ sadc kmem_cache named unix:0:cred_cache
+ sadc kmem_cache named unix:0:rctl_cache
+ sadc kmem_cache named unix:0:rctl_val_cache
+ sadc kmem_cache named unix:0:task_cache
+ sadc kmem_cache named unix:0:cyclic_id_cache
+ sadc kmem_cache named unix:0:dnlc_space_cache
+ sadc kmem_cache named unix:0:vn_cache
+ sadc kmem_cache named unix:0:file_cache
+ sadc kmem_cache named unix:0:stream_head_cache
+ sadc kmem_cache named unix:0:queue_cache
+ sadc kmem_cache named unix:0:syncq_cache
+ sadc kmem_cache named unix:0:qband_cache
+ sadc kmem_cache named unix:0:linkinfo_cache
+ sadc kmem_cache named unix:0:ciputctrl_cache
+ sadc kmem_cache named unix:0:serializer_cache
+ sadc kmem_cache named unix:0:as_cache
+ sadc kmem_cache named unix:0:marker_cache
+ sadc kmem_cache named unix:0:anon_cache
+ sadc kmem_cache named unix:0:anonmap_cache
+ sadc kmem_cache named unix:0:segvn_cache
+ sadc kmem_cache named unix:0:flk_edges
+ sadc kmem_cache named unix:0:fdb_cache
+ sadc kmem_cache named unix:0:timer_cache
+ sadc kmem_cache named unix:0:physio_buf_cache
+ sadc kmem_cache named unix:0:ufs_inode_cache
+ sadc kmem_cache named unix:0:directio_buf_cache
+ sadc kmem_cache named unix:0:lufs_save
+ sadc kmem_cache named unix:0:lufs_bufs
+ sadc kmem_cache named unix:0:lufs_mapentry_cache
+ sadc kmem_cache named unix:0:kcf_sreq_cache
+ sadc kmem_cache named unix:0:kcf_areq_cache
+ sadc kmem_cache named unix:0:kcf_context_cache
+ sadc kmem_cache named unix:0:ipsec_actions
+ sadc kmem_cache named unix:0:ipsec_selectors
+ sadc kmem_cache named unix:0:ipsec_policy
+ sadc kmem_cache named unix:0:ipsec_info
+ sadc kmem_cache named unix:0:ip_minor_arena_1
+ sadc kmem_cache named unix:0:ipcl_conn_cache
+ sadc kmem_cache named unix:0:ipcl_tcpconn_cache
+ sadc kmem_cache named unix:0:ire_cache
+ sadc kmem_cache named unix:0:tcp_timercache
+ sadc kmem_cache named unix:0:tcp_sack_info_cache
+ sadc kmem_cache named unix:0:tcp_iphc_cache
+ sadc kmem_cache named unix:0:squeue_cache
+ sadc kmem_cache named unix:0:sctp_conn_cache
+ sadc kmem_cache named unix:0:sctp_faddr_cache
+ sadc kmem_cache named unix:0:sctp_set_cache
+ sadc kmem_cache named unix:0:sctp_ftsn_set_cache
+ sadc kmem_cache named unix:0:sctpsock
+ sadc kmem_cache named unix:0:sctp_assoc
+ sadc kmem_cache named unix:0:socktpi_cache
+ sadc kmem_cache named unix:0:socktpi_unix_cache
+ sadc kmem_cache named unix:0:ncafs_cache
+ sadc kmem_cache named unix:0:process_cache
+ sadc kmem_cache named unix:0:exacct_object_cache
+ sadc kmem_cache named unix:0:fctl_cache
+ sadc kmem_cache named unix:0:tl_cache
+ sadc kmem_cache named unix:0:keysock_1
+ sadc kmem_cache named unix:0:spdsock_1
+ sadc kmem_cache named unix:0:fnode_cache
+ sadc kmem_cache named unix:0:pipe_cache
+ sadc kmem_cache named unix:0:namefs_inodes_1
+ sadc kmem_cache named unix:0:port_cache
+ sadc kmem_cache named unix:0:lnode_cache
+ sadc kmem_cache named unix:0:clnt_clts_endpnt_cache
+ sadc kmem_cache named unix:0:pty_map
+ sadc kmem_cache named unix:0:sppptun_map
+ sadc kmem_cache named unix:0:dtrace_state_cache
+ sadc kmem_cache named unix:0:qif_head_cache
+ sadc kmem_cache named unix:0:udp_minor_1
+ sadc kmem_cache named unix:0:authkern_cache
+ sadc kmem_cache named unix:0:authloopback_cache
+ sadc kmem_cache named unix:0:authdes_cache_handle
+ sadc kmem_cache named unix:0:rnode_cache
+ sadc kmem_cache named unix:0:nfs_access_cache
+ sadc kmem_cache named unix:0:client_handle_cache
+ sadc kmem_cache named unix:0:rnode4_cache
+ sadc kmem_cache named unix:0:svnode_cache
+ sadc kmem_cache named unix:0:nfs4_access_cache
+ sadc kmem_cache named unix:0:client_handle4_cache
+ sadc kmem_cache named unix:0:nfs4_ace4vals_cache
+ sadc kmem_cache named unix:0:nfs4_ace4_list_cache
+ sadc kmem_cache named unix:0:NFS_idmap_cache
+ sadc kmem_cache named unix:0:lm_vnode
+ sadc kmem_cache named unix:0:lm_xprt
+ sadc kmem_cache named unix:0:lm_sysid
+ sadc kmem_cache named unix:0:lm_client
+ sadc kmem_cache named unix:0:lm_async
+ sadc kmem_cache named unix:0:lm_sleep
+ sadc kmem_cache named unix:0:lm_config
+ sadc kmem_cache named unix:0:nfslog_small_rec
+ sadc kmem_cache named unix:0:nfslog_medium_rec
+ sadc kmem_cache named unix:0:nfslog_large_rec
+ sadc kmem_cache named unix:0:exi_cache_handle
+ sadc kmem_cache named unix:0:Client_entry_cache
+ sadc kmem_cache named unix:0:OpenOwner_entry_cache
+ sadc kmem_cache named unix:0:OpenStateID_entry_cache
+ sadc kmem_cache named unix:0:LockStateID_entry_cache
+ sadc kmem_cache named unix:0:Lockowner_entry_cache
+ sadc kmem_cache named unix:0:File_entry_cache
+ sadc kmem_cache named unix:0:DelegStateID_entry_cache
+ sadc kmem_cache named unix:0:ip_minor_1
+ sadc kmem_cache named unix:0:ar_minor_1
+ sadc kmem_cache named unix:0:icmp_minor_1
+ sadc kmem_cache named unix:0:crypto_session_cache
+ sadc kmem_cache named unix:0:fcsm_job_cache
+ sadc kmem_cache named unix:0:sd0_cache
+ sadc kmem_cache named unix:0:hsfs_hsnode_cache
+ sadc vmem named vmem:16:kmem_oversize
+ sadc disk io cmdk:0:cmdk0
+ sadc nfs io nfs:1:nfs1
+ sadc disk io sd:0:sd0
+ sadc usb_byte_count io usba:0:uhci0,bulk
+ sadc usb_byte_count io usba:0:uhci0,ctrl
+ sadc usb_byte_count io usba:0:uhci0,intr
+ sadc usb_byte_count io usba:0:uhci0,isoch
+ sadc usb_byte_count io usba:0:uhci0,total
+ sadc usb_byte_count io usba:1:uhci1,bulk
+ sadc usb_byte_count io usba:1:uhci1,ctrl
+ sadc usb_byte_count io usba:1:uhci1,intr
+ sadc usb_byte_count io usba:1:uhci1,isoch
+ sadc usb_byte_count io usba:1:uhci1,total
+
+Yep, to print the four fields from "sar -u 1 1", sadc read the ENTIRE
+KSTAT TREE FIVE TIMES.
+
+Comparing the effect of this to vmstat,
+
+ # ptime vmstat 1 6
+ kthr memory page disk faults cpu
+ r b w swap free re mf pi po fr de sr cd s0 -- -- in sy cs us sy id
+ 0 0 43 907784 115324 29 124 34 1 1 0 4 2 0 0 0 277 470 210 1 2 97
+ 0 0 38 750856 172304 1 40 0 0 0 0 0 0 0 0 0 230 224 130 1 1 98
+ 0 0 38 750856 172304 0 0 0 0 0 0 0 0 0 0 0 219 168 111 0 1 99
+ 0 0 38 750856 172304 0 0 0 0 0 0 0 0 0 0 0 226 109 113 0 0 100
+ 0 0 38 750856 172304 0 0 0 0 0 0 0 0 0 0 0 225 246 137 1 1 98
+ 0 0 38 750856 172304 0 0 0 0 0 0 0 0 0 0 0 222 175 119 0 1 99
+
+ real 5.060
+ user 0.006
+ sys 0.013
+
+Ok, so vmstat causes a total of 13 ms of sys time - much of which would
+be the fork and exec. Now lets try sar,
+
+ # ptime sar -u 1 5
+
+ SunOS jupiter 5.10 Generic i86pc 04/21/2006
+
+ 23:42:55 %usr %sys %wio %idle
+ 23:42:56 0 3 0 97
+ 23:42:57 1 2 0 97
+ 23:42:58 0 2 0 98
+ 23:42:59 1 3 0 96
+ 23:43:00 0 2 0 98
+
+ Average 0 2 0 97
+
+ real 5.148
+ user 0.010
+ sys 0.127
+
+Phwaorr - 127 ms of sys time to measure 5 samples. That is a LOT.
diff --git a/Examples/lastwords_example.txt b/Examples/lastwords_example.txt
new file mode 100644
index 000000000000..5452d2e36f25
--- /dev/null
+++ b/Examples/lastwords_example.txt
@@ -0,0 +1,81 @@
+The following is a demonstration of the lastwords command,
+
+
+Here we run lastwords to catch syscalls from processes named "bash" as they
+exit,
+
+ # ./lastwords bash
+ Tracing... Waiting for bash to exit...
+ 1091567219163679 1861 bash sigaction 0 0
+ 1091567219177487 1861 bash sigaction 0 0
+ 1091567219189692 1861 bash sigaction 0 0
+ 1091567219202085 1861 bash sigaction 0 0
+ 1091567219214553 1861 bash sigaction 0 0
+ 1091567219226690 1861 bash sigaction 0 0
+ 1091567219238786 1861 bash sigaction 0 0
+ 1091567219251697 1861 bash sigaction 0 0
+ 1091567219265770 1861 bash sigaction 0 0
+ 1091567219294110 1861 bash gtime 42a7c194 0
+ 1091567219428305 1861 bash write 5 0
+ 1091567219451138 1861 bash setcontext 0 0
+ 1091567219473911 1861 bash sigaction 0 0
+ 1091567219516487 1861 bash stat64 0 0
+ 1091567219547973 1861 bash open64 4 0
+ 1091567219638345 1861 bash write 5 0
+ 1091567219658886 1861 bash close 0 0
+ 1091567219689094 1861 bash open64 4 0
+ 1091567219704301 1861 bash fstat64 0 0
+ 1091567219731796 1861 bash read 2fe 0
+ 1091567219745541 1861 bash close 0 0
+ 1091567219768536 1861 bash lwp_sigmask ffbffeff 0
+ 1091567219787494 1861 bash ioctl 0 0
+ 1091567219801338 1861 bash setpgrp 6a3 0
+ 1091567219814067 1861 bash ioctl 0 0
+ 1091567219825791 1861 bash lwp_sigmask ffbffeff 0
+ 1091567219847778 1861 bash setpgrp 0 0
+ TIME PID EXEC SYSCALL RETURN ERR
+
+In another window, a bash shell was executed and then exited normally. The
+last few system calls that the bash shell made can be seen above.
+
+
+
+
+In the following example we moniter the exit of bash shells again, but this
+time the bash shell sends itself a "kill -8",
+
+ # ./lastwords bash
+ Tracing... Waiting for bash to exit...
+ 1091650185555391 1865 bash sigaction 0 0
+ 1091650185567963 1865 bash sigaction 0 0
+ 1091650185580316 1865 bash sigaction 0 0
+ 1091650185592381 1865 bash sigaction 0 0
+ 1091650185605046 1865 bash sigaction 0 0
+ 1091650185618451 1865 bash sigaction 0 0
+ 1091650185647663 1865 bash gtime 42a7c1e7 0
+ 1091650185794626 1865 bash kill 0 0
+ 1091650185836941 1865 bash lwp_sigmask ffbffeff 0
+ 1091650185884145 1865 bash stat64 0 0
+ 1091650185916135 1865 bash open64 4 0
+ 1091650186005673 1865 bash write b 0
+ 1091650186025782 1865 bash close 0 0
+ 1091650186052002 1865 bash open64 4 0
+ 1091650186067538 1865 bash fstat64 0 0
+ 1091650186094289 1865 bash read 309 0
+ 1091650186108086 1865 bash close 0 0
+ 1091650186129965 1865 bash lwp_sigmask ffbffeff 0
+ 1091650186149092 1865 bash ioctl 0 0
+ 1091650186162614 1865 bash setpgrp 6a3 0
+ 1091650186175457 1865 bash ioctl 0 0
+ 1091650186187206 1865 bash lwp_sigmask ffbffeff 0
+ 1091650186209514 1865 bash setpgrp 0 0
+ 1091650186225307 1865 bash sigaction 0 0
+ 1091650186238832 1865 bash getpid 749 0
+ 1091650186260149 1865 bash kill 0 0
+ 1091650186277925 1865 bash setcontext 0 0
+ TIME PID EXEC SYSCALL RETURN ERR
+
+The last few system calls are different, we can see the kill system call
+before bash exits.
+
+
diff --git a/Examples/loads_example.txt b/Examples/loads_example.txt
new file mode 100644
index 000000000000..f369f960ad8d
--- /dev/null
+++ b/Examples/loads_example.txt
@@ -0,0 +1,19 @@
+The following is a demonstration of the loads.d script.
+
+
+Here we run both loads.d and the uptime command for comparison,
+
+ # uptime
+ 1:30am up 14 day(s), 2:27, 3 users, load average: 3.52, 3.45, 3.05
+
+ # ./loads.d
+ 2005 Jun 11 01:30:49, load average: 3.52, 3.45, 3.05
+
+Both have returned the same load average, confirming that loads.d is
+behaving as expected.
+
+
+The point of loads.d is to demonstrate fetching the same data as uptime
+does, in the DTrace language. It is not intended as a replacement
+or substitute to the uptime(1) command.
+
diff --git a/Examples/lockbydist_example.txt b/Examples/lockbydist_example.txt
new file mode 100644
index 000000000000..7310e5adde26
--- /dev/null
+++ b/Examples/lockbydist_example.txt
@@ -0,0 +1,114 @@
+The following is a demonstration of the lockbyproc.d script,
+
+ # lockbydist.d
+ dtrace: description 'lockstat:::adaptive-block ' matched 1 probe
+ ^C
+
+ metadata-manager
+ value ------------- Distribution ------------- count
+ 131072 | 0
+ 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 524288 | 0
+
+ sched
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9
+ 65536 | 0
+
+ oracle
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@ 9
+ 65536 |@@@@@@@@@@@@@@@@@@@@@ 10
+ 131072 | 0
+
+In the above output, oracle can be seen to have blocked 10 times from
+65 to 131 microseconds, and 9 times from 32 to 65 microseconds. sched,
+the kernel, has blocked several times also. metadata-manager only
+blocked once, which was at least 262 microseconds.
+
+
+
+The following is a longer sample,
+
+ # lockbydist.d
+ dtrace: description 'lockstat:::adaptive-block ' matched 1 probe
+ ^C
+
+ svc.startd
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32768 | 0
+
+ java
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+ oracle
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 65536 |@@@@@@@@@@@@@ 2
+ 131072 | 0
+
+ mysql-test-run
+ value ------------- Distribution ------------- count
+ 65536 | 0
+ 131072 |@@@@@@@@@@@@@@@@@@@@ 1
+ 262144 |@@@@@@@@@@@@@@@@@@@@ 1
+ 524288 | 0
+
+ pageout
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@ 1
+ 65536 | 0
+ 131072 | 0
+ 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 524288 | 0
+
+ mysqltest
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@ 1
+ 65536 |@@@@@@@@@@@ 2
+ 131072 |@@@@@@@@@@@ 2
+ 262144 |@@@@@@@@@@@ 2
+ 524288 | 0
+
+ sched
+ value ------------- Distribution ------------- count
+ 8192 | 0
+ 16384 |@@@@@@@@@@@ 11
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@ 25
+ 65536 | 0
+ 131072 |@ 1
+ 262144 |@@ 2
+ 524288 | 0
+
+ mysqld
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@ 22
+ 65536 |@@@@@@@@@ 9
+ 131072 | 0
+ 262144 |@@@@ 4
+ 524288 | 0
+ 1048576 | 0
+ 2097152 | 0
+ 4194304 |@@ 2
+ 8388608 |@@@@ 4
+ 16777216 | 0
+
+The length of time threads were blocked, and the number of such blocks
+can be easily observed from the above output.
+
+mysqld can be seen to have many short blocks: 22 from 32 -> 65 microseconds,
+and a few larger blocks: 4 from 8 -> 16 ms.
+
+
+
diff --git a/Examples/lockbyproc_example.txt b/Examples/lockbyproc_example.txt
new file mode 100644
index 000000000000..11092353fdf3
--- /dev/null
+++ b/Examples/lockbyproc_example.txt
@@ -0,0 +1,42 @@
+The following is a demonstration of the lockbyproc.d script,
+
+ # lockbyproc.d
+ dtrace: description 'lockstat:::adaptive-block ' matched 1 probe
+ ^C
+
+ pageout 49438
+ mysql-test-run 96414
+ oracle 149086
+ sched 220601
+
+The above output shows that threads belonging to sched, the kernel, spent
+a total of 220 microseconds waiting for an adaptive mutex lock.
+
+
+
+
+This example sampled for a longer interval,
+
+ # lockbyproc.d
+ dtrace: description 'lockstat:::adaptive-block ' matched 1 probe
+ ^C
+
+ init 136228
+ java 371896
+ oracle 783402
+ sched 2315779
+ mysqltest 9428277
+ mysql-test-run 10093658
+ mysqld 17412999
+ fsflush 19676738
+
+Here we can see threads belonging to fsflush have spent a total of 19.7 ms
+waiting for an adaptive mutex. Note: it's not easy to say that it means a
+19.7 ms delay in the completion of the fsflush program, as this value is
+the sum of the block times across all the threads. So it is possible that
+many threads were blocked at the same time, eg, it could have been 19 threads
+blocked during the same 1 ms.
+
+
+
+
diff --git a/Examples/minfbypid_example.txt b/Examples/minfbypid_example.txt
new file mode 100644
index 000000000000..c2fffb4c6f26
--- /dev/null
+++ b/Examples/minfbypid_example.txt
@@ -0,0 +1,20 @@
+The following is a demonstration of the minfbypid.d script,
+
+
+Here we run it for a few seconds then hit Ctrl-C,
+
+ # minfbypid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD MINFAULTS
+ 11021 dtrace 54
+ 11023 ls 56
+ 11024 df 57
+ 11023 bash 75
+ 11022 bash 75
+ 11024 bash 76
+ 11022 find 91
+
+In the above output, we can see that each of the bash shells had about 75
+minor faults each. Minor faults are an indication of memory consumption.
+
diff --git a/Examples/minfbyproc_example.txt b/Examples/minfbyproc_example.txt
new file mode 100644
index 000000000000..0c1ce8401c82
--- /dev/null
+++ b/Examples/minfbyproc_example.txt
@@ -0,0 +1,14 @@
+The following is an example of the minfbyproc.d script,
+
+ # minfbyproc.d
+ dtrace: description 'vminfo:::as_fault ' matched 1 probe
+ ^C
+
+ mozilla-bin 18
+ dtrace 57
+ find 64
+ bash 150
+ tar 501
+
+In the above output, tar processes caused 501 minor faults.
+
diff --git a/Examples/mmapfiles_example.txt b/Examples/mmapfiles_example.txt
new file mode 100644
index 000000000000..eca437056040
--- /dev/null
+++ b/Examples/mmapfiles_example.txt
@@ -0,0 +1,109 @@
+The following is a demonstration of the mmapfiles.d script.
+
+Here we run mmapfiles.d while in another window a new bash shell is started.
+The files that were mapped in aren't suprising, they are the common shared
+librarios,
+
+ # mmapfiles.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ MMAPS CMD PATHNAME
+ 1 bash /lib/libdl.so.1
+ 3 bash /lib/libsocket.so.1
+ 3 bash /lib/libnsl.so.1
+ 3 bash /lib/libc.so.1
+ 3 bash /lib/libcurses.so.1
+
+
+
+Now we examine zsh. This time a number of extra libraries are mapped,
+
+ # mmapfiles.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ MMAPS CMD PATHNAME
+ 1 zsh /lib/libdl.so.1
+ 3 getent /lib/libc.so.1
+ 3 getent /lib/libnsl.so.1
+ 3 getent /lib/libsocket.so.1
+ 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/parameter.so
+ 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/zutil.so
+ 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/complete.so
+ 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/stat.so
+ 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/zle.so
+ 3 tset /lib/libc.so.1
+ 3 tset /opt/sfw/lib/libncurses.so.5.2
+ 3 zsh /lib/libc.so.1
+ 3 zsh /lib/libm.so.2
+ 3 zsh /lib/libcurses.so.1
+ 3 zsh /lib/libnsl.so.1
+ 3 zsh /usr/sfw/lib/zsh/4.2.1/zsh/complist.so
+ 3 zsh /lib/libsocket.so.1
+
+
+
+Sometimes the output can be quite suprising. The following shows the mmaps
+caused by the "sdtaudiocontrol" tool, a java tool to change the volume levels
+on Solaris,
+
+ # mmapfiles.d
+ Tracing... Hit Ctrl-C to end.
+
+ MMAPS CMD PATHNAME
+ 1 java /usr/jdk/packages/jmf/lib/ext/jmplay.jar
+ 1 java /usr/dt/appconfig/sdtaudiocontrol/classes/SDtAudioControl.jar
+ 1 java /usr/dt/classes/xservices.jar
+ 1 java /usr/dt/classes/jhall.jar
+ 1 java /usr/dt/classes/jsearch.jar
+ 1 java /usr/jdk/packages/jmf/lib/ext/mp3plugin.jar
+ 1 java /usr/jdk/packages/jmf/lib/ext/jmfmp3.jar
+ 1 java /usr/jdk/packages/jmf/lib/ext/multiplayer.jar
+ 1 java /usr/jdk/packages/jmf/lib/ext/mediaplayer.jar
+ 1 java /usr/jdk/packages/jmf/lib/ext/jmf.jar
+ 1 java /usr/jdk/packages/jai-imageio/lib/ext/jai_imageio.jar
+ 1 java /usr/jdk/packages/jai-imageio/lib/ext/clibwrapper_jiio.jar
+ 1 java /usr/jdk/packages/jai/lib/ext/mlibwrapper_jai.jar
+ 1 java /usr/jdk/packages/jai/lib/ext/jai_core.jar
+ 1 java /usr/jdk/packages/jai/lib/ext/jai_codec.jar
+ 1 java /usr/jdk/packages/javax.help-2.0/lib/jhall.jar
+ 1 java /usr/jdk/instances/jdk1.5.0/jre/lib/ext/sunpkcs11.jar
+ 1 java /usr/jdk/instances/jdk1.5.0/jre/lib/ext/sunjce_provider.jar
+ 1 java /usr/jdk/instances/jdk1.5.0/jre/lib/ext/localedata.jar
+ 1 java /usr/jdk/instances/jdk1.5.0/jre/lib/ext/dnsns.jar
+ 1 java /tmp/hsperfdata_root/6464
+ 1 java /tmp/hsperfdata_root/6455
+ 2 java /usr/lib/libsched.so.1
+ 2 java /usr/jdk/instances/jdk1.5.0/jre/lib/charsets.jar
+ 2 java /usr/jdk/instances/jdk1.5.0/jre/lib/jce.jar
+ 2 java /usr/jdk/instances/jdk1.5.0/jre/lib/jsse.jar
+ 2 java /usr/jdk/instances/jdk1.5.0/jre/lib/rt.jar
+ 3 sdtaudiocontrol /lib/libc.so.1
+ 3 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/headless/libmawt.so
+ 3 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libmlib_image.so
+ 3 ls /lib/libc.so.1
+ 3 rm /lib/libc.so.1
+ 3 java /usr/dt/appconfig/sdtaudiocontrol/lib/libAudioControl.so
+ 3 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libawt.so
+ 4 java /lib/libdl.so.1
+ 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libzip.so
+ 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libjava.so
+ 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/libverify.so
+ 6 java /lib/libscf.so.1
+ 6 java /usr/lib/libCrun.so.1
+ 6 java /lib/libnsl.so.1
+ 6 java /lib/libm.so.1
+ 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/client/libjvm.so
+ 6 java /lib/libsocket.so.1
+ 6 java /lib/libuutil.so.1
+ 6 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/native_threads/libhpi.so
+ 6 java /lib/libmp.so.2
+ 6 java /lib/libmd5.so.1
+ 6 java /lib/libm.so.2
+ 6 java /lib/libdoor.so.1
+ 8 java /usr/jdk/instances/jdk1.5.0/jre/lib/i386/client/classes.jsa
+ 8 java /lib/libthread.so.1
+ 12 java /lib/libc.so.1
+ 21 awk /lib/libm.so.2
+ 21 awk /lib/libc.so.1
+ 65 java /devices/pseudo/mm@0:zero
+
diff --git a/Examples/modcalls_example.txt b/Examples/modcalls_example.txt
new file mode 100644
index 000000000000..f920d20581bf
--- /dev/null
+++ b/Examples/modcalls_example.txt
@@ -0,0 +1,47 @@
+The following is an example of the modcalls.d oneliner,
+
+
+Here we run it for a few seconds then hit Ctrl-C,
+
+ # modcalls.d
+ dtrace: script './modcalls.d' matched 18437 probes
+ ^C
+
+ ptm 2
+ mntfs 2
+ pool 2
+ kcf 4
+ pts 5
+ portfs 6
+ pset 6
+ ttcompat 9
+ ptem 9
+ devfs 13
+ ipf 15
+ namefs 20
+ ctfs 22
+ procfs 22
+ ldterm 23
+ ipgpc 48
+ sockfs 58
+ flowacct 69
+ ata 70
+ gld 75
+ rtls 76
+ specfs 83
+ ip 201
+ uhci 294
+ TS 333
+ tmpfs 694
+ doorfs 897
+ ufs 1329
+ uppc 5617
+ unix 49794
+ genunix 53445
+
+The output lists kernel modules, and the number of function calls for
+each module. For example, "rtls" - the network driver, called 76 functions.
+
+This script may be useful to determine whether drivers are "thinking" when
+troubleshooting driver issues.
+
diff --git a/Examples/newproc_example.txt b/Examples/newproc_example.txt
new file mode 100644
index 000000000000..f392b050f88a
--- /dev/null
+++ b/Examples/newproc_example.txt
@@ -0,0 +1,19 @@
+The following is an example of the newproc.d script,
+
+ # ./newproc.d
+ dtrace: description 'proc:::exec-success ' matched 1 probe
+ CPU ID FUNCTION:NAME
+ 0 3297 exec_common:exec-success man ls
+ 0 3297 exec_common:exec-success sh -c cd /usr/share/man; tbl /usr/share/man/man1/ls.1 |neqn /usr/share/lib/pub/
+ 0 3297 exec_common:exec-success tbl /usr/share/man/man1/ls.1
+ 0 3297 exec_common:exec-success neqn /usr/share/lib/pub/eqnchar -
+ 0 3297 exec_common:exec-success nroff -u0 -Tlp -man -
+ 0 3297 exec_common:exec-success col -x
+ 0 3297 exec_common:exec-success sh -c trap '' 1 15; /usr/bin/mv -f/tmp/mpzIaOZF /usr/share/man/cat1/ls.1 2> /d
+ 0 3297 exec_common:exec-success /usr/bin/mv -f /tmp/mpzIaOZF /usr/share/man/cat1/ls.1
+ 0 3297 exec_common:exec-success sh -c more -s /tmp/mpzIaOZF
+ 0 3297 exec_common:exec-success more -s /tmp/mpzIaOZF
+
+The above output was caught when running "man ls". This identifies all the
+commands responsible for processing the man page.
+
diff --git a/Examples/nfswizard_example.txt b/Examples/nfswizard_example.txt
new file mode 100644
index 000000000000..68fb18542377
--- /dev/null
+++ b/Examples/nfswizard_example.txt
@@ -0,0 +1,67 @@
+The following is a demonstration of the NFS client wizard tool, nfswizard.d,
+
+
+
+ # nfswizard.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ NFS Client Wizard. 2005 Dec 2 14:59:07 -> 2005 Dec 2 14:59:14
+
+ Read: 4591616 bytes (4 Mb)
+ Write: 0 bytes (0 Mb)
+
+ Read: 640 Kb/sec
+ Write: 0 Kb/sec
+
+ NFS I/O events: 166
+ Avg response time: 8 ms
+ Max response time: 14 ms
+
+ Response times (us):
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 | 1
+ 512 |@@@ 14
+ 1024 |@ 4
+ 2048 |@@@@@@@ 30
+ 4096 |@@@@@ 20
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@ 97
+ 16384 | 0
+
+ Top 25 files accessed (bytes):
+ PATHNAME BYTES
+ /net/mars/var/tmp/adm/vold.log 4096
+ /net/mars/var/tmp/adm/uptime 4096
+ /net/mars/var/tmp/adm/mail 4096
+ /net/mars/var/tmp/adm/authlog.5 4096
+ /net/mars/var/tmp/adm/ftpd 12288
+ /net/mars/var/tmp/adm/spellhist 16384
+ /net/mars/var/tmp/adm/messages 16384
+ /net/mars/var/tmp/adm/utmpx 20480
+ /net/mars/var/tmp/adm/ftpd.2 20480
+ /net/mars/var/tmp/adm/ftpd.3 20480
+ /net/mars/var/tmp/adm/ftpd.1 24576
+ /net/mars/var/tmp/adm/ftpd.0 24576
+ /net/mars/var/tmp/adm/lastlog 28672
+ /net/mars/var/tmp/adm/ipf 61440
+ /net/mars/var/tmp/adm/loginlog 69632
+ /net/mars/var/tmp/adm/ipf.4 73728
+ /net/mars/var/tmp/adm/messages.20040906 81920
+ /net/mars/var/tmp/adm/ipf.3 102400
+ /net/mars/var/tmp/adm/ipf.1 110592
+ /net/mars/var/tmp/adm/ipf.5 114688
+ /net/mars/var/tmp/adm/ipf.2 114688
+ /net/mars/var/tmp/adm/ipf.0 122880
+ /net/mars/var/tmp/adm/route.log 266240
+ /net/mars/var/tmp/adm/pppd.log 425984
+ /net/mars/var/tmp/adm/wtmpx 2842624
+
+
+
+In the above demonstration, we run nfswizard.d for several seconds then hit
+Ctrl-C. The report contains useful information about NFS client activity,
+including response time statistics and file access details.
+
+Note: this is measuring activity caused by NFS client processes (which must
+be on the same server). It is not examining NFS server processes.
+
diff --git a/Examples/oneliners_examples.txt b/Examples/oneliners_examples.txt
new file mode 100644
index 000000000000..9ca0fa62f671
--- /dev/null
+++ b/Examples/oneliners_examples.txt
@@ -0,0 +1,307 @@
+#
+# DTrace OneLiners Examples
+#
+
+### New processes with arguments,
+
+# dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }'
+dtrace: description 'proc:::exec-success ' matched 1 probe
+CPU ID FUNCTION:NAME
+ 0 3297 exec_common:exec-success man ls
+ 0 3297 exec_common:exec-success sh -c cd /usr/share/man; tbl /usr/share/man/man1/ls.1 |neqn /usr/share/lib/pub/
+ 0 3297 exec_common:exec-success tbl /usr/share/man/man1/ls.1
+ 0 3297 exec_common:exec-success neqn /usr/share/lib/pub/eqnchar -
+ 0 3297 exec_common:exec-success nroff -u0 -Tlp -man -
+ 0 3297 exec_common:exec-success col -x
+ 0 3297 exec_common:exec-success sh -c trap '' 1 15; /usr/bin/mv -f /tmp/mpzIaOZF /usr/share/man/cat1/ls.1 2> /d
+ 0 3297 exec_common:exec-success /usr/bin/mv -f /tmp/mpzIaOZF /usr/share/man/cat1/ls.1
+ 0 3297 exec_common:exec-success sh -c more -s /tmp/mpzIaOZF
+ 0 3297 exec_common:exec-success more -s /tmp/mpzIaOZF
+
+
+### Files opened by process,
+
+# dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
+dtrace: description 'syscall::open*:entry ' matched 2 probes
+CPU ID FUNCTION:NAME
+ 0 14 open:entry gnome-netstatus- /dev/kstat
+ 0 14 open:entry man /var/ld/ld.config
+ 0 14 open:entry man /lib/libc.so.1
+ 0 14 open:entry man /usr/share/man/man.cf
+ 0 14 open:entry man /usr/share/man/windex
+ 0 14 open:entry man /usr/share/man/man1/ls.1
+ 0 14 open:entry man /usr/share/man/man1/ls.1
+ 0 14 open:entry man /tmp/mpqea4RF
+ 0 14 open:entry sh /var/ld/ld.config
+ 0 14 open:entry sh /lib/libc.so.1
+ 0 14 open:entry neqn /var/ld/ld.config
+ 0 14 open:entry neqn /lib/libc.so.1
+ 0 14 open:entry neqn /usr/share/lib/pub/eqnchar
+ 0 14 open:entry tbl /var/ld/ld.config
+ 0 14 open:entry tbl /lib/libc.so.1
+ 0 14 open:entry tbl /usr/share/man/man1/ls.1
+ 0 14 open:entry nroff /var/ld/ld.config
+[...]
+
+
+### Syscall count by program,
+
+# dtrace -n 'syscall:::entry { @num[execname] = count(); }'
+dtrace: description 'syscall:::entry ' matched 228 probes
+^C
+ snmpd 1
+ utmpd 2
+ inetd 2
+ nscd 7
+ svc.startd 11
+ sendmail 31
+ poold 133
+ dtrace 1720
+
+
+### Syscall count by syscall,
+
+# dtrace -n 'syscall:::entry { @num[probefunc] = count(); }'
+dtrace: description 'syscall:::entry ' matched 228 probes
+^C
+ fstat 1
+ setcontext 1
+ lwp_park 1
+ schedctl 1
+ mmap 1
+ sigaction 2
+ pset 2
+ lwp_sigmask 2
+ gtime 3
+ sysconfig 3
+ write 4
+ brk 6
+ pollsys 7
+ p_online 558
+ ioctl 579
+
+
+### Syscall count by process,
+
+# dtrace -n 'syscall:::entry { @num[pid,execname] = count(); }'
+dtrace: description 'syscall:::entry ' matched 228 probes
+^C
+ 1109 svc.startd 1
+ 4588 svc.startd 2
+ 7 svc.startd 2
+ 3950 svc.startd 2
+ 1626 nscd 2
+ 870 svc.startd 2
+ 82 nscd 6
+ 5011 sendmail 10
+ 6010 poold 74
+ 8707 dtrace 1720
+
+
+### Read bytes by process,
+
+# dtrace -n 'sysinfo:::readch { @bytes[execname] = sum(arg0); }'
+dtrace: description 'sysinfo:::readch ' matched 4 probes
+^C
+
+ mozilla-bin 16
+ gnome-smproxy 64
+ metacity 64
+ dsdm 64
+ wnck-applet 64
+ xscreensaver 96
+ gnome-terminal 900
+ ttymon 5952
+ Xorg 17544
+
+
+### Write bytes by process,
+
+# dtrace -n 'sysinfo:::writech { @bytes[execname] = sum(arg0); }'
+dtrace: description 'sysinfo:::writech ' matched 4 probes
+^C
+
+ dtrace 1
+ gnome-settings-d 8
+ xscreensaver 8
+ gnome-panel 8
+ nautilus 8
+ date 29
+ wnck-applet 120
+ bash 210
+ mozilla-bin 1497
+ ls 1947
+ metacity 3172
+ Xorg 7424
+ gnome-terminal 51955
+
+
+### Read size distribution by process,
+
+# dtrace -n 'sysinfo:::readch { @dist[execname] = quantize(arg0); }'
+dtrace: description 'sysinfo:::readch ' matched 4 probes
+^C
+[...]
+ gnome-terminal
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15
+ 64 |@@@ 1
+ 128 | 0
+
+ Xorg
+ value ------------- Distribution ------------- count
+ -1 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@ 26
+ 1 | 0
+ 2 | 0
+ 4 | 0
+ 8 |@@@@ 6
+ 16 |@ 2
+ 32 |@ 2
+ 64 | 0
+ 128 |@@@@@@@@ 11
+ 256 |@@@ 4
+ 512 | 0
+
+
+### Write size distribution by process,
+
+# dtrace -n 'sysinfo:::writech { @dist[execname] = quantize(arg0); }'
+dtrace: description 'sysinfo:::writech ' matched 4 probes
+^C
+[...]
+ Xorg
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 169
+ 64 |@@@ 16
+ 128 |@@ 10
+ 256 | 0
+
+ gnome-terminal
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@ 6
+ 2 | 0
+ 4 | 0
+ 8 | 1
+ 16 |@ 2
+ 32 |@@@ 7
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@ 63
+ 256 |@@@@ 10
+ 512 | 1
+ 1024 |@@@@@ 13
+ 2048 |@ 2
+ 4096 |@@@ 7
+
+
+### Disk size by process,
+
+# dtrace -n 'io:::start { printf("%d %s %d",pid,execname,args[0]->b_bcount); }'
+ 0 3271 bdev_strategy:start 16459 tar 1024
+ 0 3271 bdev_strategy:start 16459 tar 1024
+ 0 3271 bdev_strategy:start 16459 tar 2048
+ 0 3271 bdev_strategy:start 16459 tar 1024
+ 0 3271 bdev_strategy:start 16459 tar 1024
+ 0 3271 bdev_strategy:start 16459 tar 1024
+ 0 3271 bdev_strategy:start 16459 tar 8192
+ 0 3271 bdev_strategy:start 16459 tar 8192
+ 0 3271 bdev_strategy:start 16459 tar 16384
+ 0 3271 bdev_strategy:start 16459 tar 2048
+ 0 3271 bdev_strategy:start 16459 tar 1024
+ 0 3271 bdev_strategy:start 16459 tar 1024
+
+
+### Pages paged in by process,
+
+# dtrace -n 'vminfo:::pgpgin { @pg[execname] = sum(arg0); }'
+dtrace: description 'vminfo:::pgpgin ' matched 1 probe
+^C
+
+ ttymon 1
+ bash 1
+ mozilla-bin 36
+ tar 6661
+
+
+### Minor faults by process,
+
+# dtrace -n 'vminfo:::as_fault { @mem[execname] = sum(arg0); }'
+dtrace: description 'vminfo:::as_fault ' matched 1 probe
+^C
+
+ mozilla-bin 18
+ dtrace 57
+ find 64
+ bash 150
+ tar 501
+
+
+### Interrupts by CPU,
+
+# dtrace -n 'sdt:::interrupt-start { @num[cpu] = count(); }'
+dtrace: description 'sdt:::interrupt-start ' matched 1 probe
+^C
+
+ 513 2
+ 515 4
+ 3 39
+ 2 39
+
+
+### New processes with arguments and time,
+
+# dtrace -qn 'syscall::exec*:return { printf("%Y %s\n",walltimestamp,curpsinfo->pr_psargs); }'
+2005 Apr 25 19:15:09 man ls
+2005 Apr 25 19:15:09 sh -c cd /usr/share/man; tbl /usr/share/man/man1/ls.1 |...
+2005 Apr 25 19:15:09 neqn /usr/share/lib/pub/eqnchar -
+2005 Apr 25 19:15:09 tbl /usr/share/man/man1/ls.1
+2005 Apr 25 19:15:09 nroff -u0 -Tlp -man -
+2005 Apr 25 19:15:09 col -x
+2005 Apr 25 19:15:10 sh -c trap '' 1 15; /usr/bin/mv -f /tmp/mpRZaqTF /usr/s...
+2005 Apr 25 19:15:10 /usr/bin/mv -f /tmp/mpRZaqTF /usr/share/man/cat1/ls.1
+2005 Apr 25 19:15:10 sh -c more -s /tmp/mpRZaqTF
+2005 Apr 25 19:15:10 more -s /tmp/mpRZaqTF
+[...]
+
+
+### Successful signal details,
+
+# dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'
+dtrace: description 'proc:::signal-send ' matched 1 probe
+CPU ID FUNCTION:NAME
+ 0 3303 sigtoproc:signal-send bash -15 16442
+ 0 3303 sigtoproc:signal-send bash -9 16443
+^C
+
+
+### Kernel function calls by module,
+
+# dtrace -n 'fbt:::entry { @calls[probemod] = count(); }'
+dtrace: description 'fbt:::entry ' matched 18437 probes
+^C
+
+ devfs 2
+ ptm 2
+ ipf 5
+ pts 5
+ ttcompat 9
+ ptem 9
+ ldterm 23
+ ipgpc 24
+ ufs 24
+ ata 25
+ sockfs 27
+ gld 32
+ rtls 34
+ flowacct 38
+ specfs 50
+ ip 84
+ TS 92
+ uhci 101
+ uppc 1758
+ unix 6347
+ genunix 10023
+
diff --git a/Examples/opensnoop_example.txt b/Examples/opensnoop_example.txt
new file mode 100644
index 000000000000..329d09b50340
--- /dev/null
+++ b/Examples/opensnoop_example.txt
@@ -0,0 +1,110 @@
+The following are examples of opensnoop. File open events are traced
+along with some process details.
+
+
+This first example is of the default output. The commands "cat", "cal",
+"ls" and "uname" were run. The returned file descriptor (or -1 for error) are
+shown, along with the filenames.
+
+ # ./opensnoop
+ UID PID COMM FD PATH
+ 100 3504 cat -1 /var/ld/ld.config
+ 100 3504 cat 3 /usr/lib/libc.so.1
+ 100 3504 cat 3 /etc/passwd
+ 100 3505 cal -1 /var/ld/ld.config
+ 100 3505 cal 3 /usr/lib/libc.so.1
+ 100 3505 cal 3 /usr/share/lib/zoneinfo/Australia/NSW
+ 100 3506 ls -1 /var/ld/ld.config
+ 100 3506 ls 3 /usr/lib/libc.so.1
+ 100 3507 uname -1 /var/ld/ld.config
+ 100 3507 uname 3 /usr/lib/libc.so.1
+ [...]
+
+
+Full command arguments can be fetched using -g,
+
+ # ./opensnoop -g
+ UID PID PATH FD ARGS
+ 100 3528 /var/ld/ld.config -1 cat /etc/passwd
+ 100 3528 /usr/lib/libc.so.1 3 cat /etc/passwd
+ 100 3528 /etc/passwd 3 cat /etc/passwd
+ 100 3529 /var/ld/ld.config -1 cal
+ 100 3529 /usr/lib/libc.so.1 3 cal
+ 100 3529 /usr/share/lib/zoneinfo/Australia/NSW 3 cal
+ 100 3530 /var/ld/ld.config -1 ls -l
+ 100 3530 /usr/lib/libc.so.1 3 ls -l
+ 100 3530 /var/run/name_service_door 3 ls -l
+ 100 3530 /usr/share/lib/zoneinfo/Australia/NSW 4 ls -l
+ 100 3531 /var/ld/ld.config -1 uname -a
+ 100 3531 /usr/lib/libc.so.1 3 uname -a
+ [...]
+
+
+
+The verbose option prints human readable timestamps,
+
+ # ./opensnoop -v
+ STRTIME UID PID COMM FD PATH
+ 2005 Jan 22 01:22:50 0 23212 df -1 /var/ld/ld.config
+ 2005 Jan 22 01:22:50 0 23212 df 3 /lib/libcmd.so.1
+ 2005 Jan 22 01:22:50 0 23212 df 3 /lib/libc.so.1
+ 2005 Jan 22 01:22:50 0 23212 df 3 /platform/SUNW,Sun-Fire-V210/lib/libc_psr.so.1
+ 2005 Jan 22 01:22:50 0 23212 df 3 /etc/mnttab
+ 2005 Jan 22 01:22:50 0 23211 dtrace 4 /usr/share/lib/zoneinfo/Australia/NSW
+ 2005 Jan 22 01:22:51 0 23213 uname -1 /var/ld/ld.config
+ 2005 Jan 22 01:22:51 0 23213 uname 3 /lib/libc.so.1
+ 2005 Jan 22 01:22:51 0 23213 uname 3 /platform/SUNW,Sun-Fire-V210/lib/libc_psr.so.1
+ [...]
+
+
+
+Particular files can be monitored using -f. For example,
+
+ # ./opensnoop -vgf /etc/passwd
+ STRTIME UID PID PATH FD ARGS
+ 2005 Jan 22 01:28:50 0 23242 /etc/passwd 3 cat /etc/passwd
+ 2005 Jan 22 01:28:54 0 23243 /etc/passwd 4 vi /etc/passwd
+ 2005 Jan 22 01:29:06 0 23244 /etc/passwd 3 passwd brendan
+ [...]
+
+
+
+This example is of opensnoop running on a quiet system. We can see as
+various daemons are opening files,
+
+ # ./opensnoop
+ UID PID COMM FD PATH
+ 0 253 nscd 5 /etc/user_attr
+ 0 253 nscd 5 /etc/hosts
+ 0 419 mibiisa 2 /dev/kstat
+ 0 419 mibiisa 2 /dev/rtls
+ 0 419 mibiisa 2 /dev/kstat
+ 0 419 mibiisa 2 /dev/kstat
+ 0 419 mibiisa 2 /dev/rtls
+ 0 419 mibiisa 2 /dev/kstat
+ 0 253 nscd 5 /etc/user_attr
+ 0 419 mibiisa 2 /dev/kstat
+ 0 419 mibiisa 2 /dev/rtls
+ 0 419 mibiisa 2 /dev/kstat
+ 0 174 in.routed 8 /dev/kstat
+ 0 174 in.routed 8 /dev/kstat
+ 0 174 in.routed 6 /dev/ip
+ 0 419 mibiisa 2 /dev/kstat
+ 0 419 mibiisa 2 /dev/rtls
+ 0 419 mibiisa 2 /dev/kstat
+ 0 293 utmpd 4 /var/adm/utmpx
+ 0 293 utmpd 5 /var/adm/utmpx
+ 0 293 utmpd 6 /proc/442/psinfo
+ 0 293 utmpd 6 /proc/567/psinfo
+ 0 293 utmpd 6 /proc/567/psinfo
+ 0 293 utmpd 6 /proc/567/psinfo
+ 0 293 utmpd 6 /proc/567/psinfo
+ 0 293 utmpd 6 /proc/567/psinfo
+ 0 293 utmpd 6 /proc/567/psinfo
+ 0 293 utmpd 6 /proc/567/psinfo
+ 0 293 utmpd 6 /proc/567/psinfo
+ 0 293 utmpd 6 /proc/3013/psinfo
+ 0 419 mibiisa 2 /dev/kstat
+ 0 419 mibiisa 2 /dev/rtls
+ 0 419 mibiisa 2 /dev/kstat
+ [...]
diff --git a/Examples/pathopens_example.txt b/Examples/pathopens_example.txt
new file mode 100644
index 000000000000..b5004dd3fc93
--- /dev/null
+++ b/Examples/pathopens_example.txt
@@ -0,0 +1,32 @@
+The following is a demonstration of the pathopens.d script,
+
+
+Here we run it for a few seconds then hit Ctrl-C,
+
+ # pathopens.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ COUNT PATHNAME
+ 1 /lib/libcmd.so.1
+ 1 /export/home/root/DTrace/Dexplorer/dexplorer
+ 1 /lib/libmd5.so.1
+ 1 /lib/libaio.so.1
+ 1 /lib/librt.so.1
+ 1 /etc/security/prof_attr
+ 1 /etc/mnttab
+ 2 /devices/pseudo/devinfo@0:devinfo
+ 2 /dev/kstat
+ 2 /lib/libnvpair.so.1
+ 2 /lib/libkstat.so.1
+ 2 /lib/libdevinfo.so.1
+ 2 /lib/libnsl.so.1
+ 4 /lib/libc.so.1
+ 4 /var/ld/ld.config
+ 8 /export/home/brendan/Utils_solx86/setiathome-3.08.i386-pc-solaris2.6/outfile.sah
+
+In the above output, many of the files would have been opened using
+absolute pathnames. However the "dexplorer" file was opened using a relative
+pathname - and the pathopens.d script has correctly printed the full path.
+
+The above shows that the outfile.sah file was opened successfully 8 times.
+
diff --git a/Examples/pfilestat_example.txt b/Examples/pfilestat_example.txt
new file mode 100644
index 000000000000..b2c54a031f0c
--- /dev/null
+++ b/Examples/pfilestat_example.txt
@@ -0,0 +1,200 @@
+The following are sample outputs of the pfilestat tool for various scenarios.
+
+
+
+Starting with something simple,
+
+Running: dd if=/dev/rdsk/c0d0s0 of=/dev/null bs=56k # x86, 32-bit
+
+ # ./pfilestat `pgrep -x dd`
+
+ STATE FDNUM Time Filename
+ read 3 2% /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
+ write 4 3% /devices/pseudo/mm@0:null
+ waitcpu 0 7%
+ running 0 16%
+ sleep-r 0 69%
+
+ STATE FDNUM KB/s Filename
+ write 4 53479 /devices/pseudo/mm@0:null
+ read 3 53479 /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
+
+ Total event time (ms): 4999 Total Mbytes/sec: 104
+
+Most of the time we are sleeping on read, which is to be expected as dd on
+the raw device is simple -> read:entry, strategy, biodone, read:return.
+CPU time in read() itself is small.
+
+
+
+Now for the dsk device,
+
+Running: dd if=/dev/dsk/c0d0s0 of=/dev/null bs=56k # x86, 32-bit
+
+ # ./pfilestat `pgrep -x dd`
+
+ STATE FDNUM Time Filename
+ write 4 5% /devices/pseudo/mm@0:null
+ waitcpu 0 8%
+ running 0 15%
+ sleep-r 0 18%
+ read 3 53% /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
+
+ STATE FDNUM KB/s Filename
+ read 3 53492 /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
+ write 4 53492 /devices/pseudo/mm@0:null
+
+ Total event time (ms): 4914 Total Mbytes/sec: 102
+
+Woah, we are now spending much more time in read()! I imagine segmap is
+a busy bee. The "running" and "write" times are hardly different.
+
+
+
+Now for a SPARC demo of the same,
+
+Running: dd if=/dev/dsk/c0d0s0 of=/dev/null bs=56k # SPARC, 64-bit
+
+ # ./pfilestat `pgrep -x dd`
+
+ STATE FDNUM Time Filename
+ write 4 3% /devices/pseudo/mm@0:zero
+ waitcpu 0 7%
+ running 0 17%
+ read 3 24% /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a
+ sleep-r 0 54%
+
+ STATE FDNUM KB/s Filename
+ read 3 13594 /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a
+ write 4 13606 /devices/pseudo/mm@0:zero
+
+ Total event time (ms): 4741 Total Mbytes/sec: 25
+
+I did prime the cache by running this a few times first. There is less
+read() time than with the x86 32-bit demo, as I would guess that the
+process is more often exhausting the (faster) segmap cache and getting
+to the point where it must sleep. (However, do take this comparison with
+a grain of salt - my development servers aren't ideal for comparing
+statistics: one is a 867 MHz Pentium, and the other a 360 MHz Ultra 5).
+
+The file system cache is faster on 64-bit systems due to the segkpm
+enhancement in Solaris 10. For details see,
+http://blogs.sun.com/roller/page/rmc?entry=solaris_10_fast_filesystem_cache
+
+
+
+Now, back to x86.
+
+Running: tar cf /dev/null /
+
+ # ./pfilestat `pgrep -x tar`
+
+ STATE FDNUM Time Filename
+ read 11 0% /extra1/test/amd64/libCstd.so.1
+ read 11 0% /extra1/test/amd64/libXm.so
+ read 11 0% /extra1/test/amd64/libXm.so.4
+ read 11 1% /extra1/test/amd64/libgtk-x11-2.0.so
+ read 11 2% /extra1/test/amd64/libgtk-x11-2.0.so.0
+ waitcpu 0 2%
+ read 9 4% /extra1/5000
+ write 3 7% /devices/pseudo/mm@0:null
+ running 0 19%
+ sleep-r 0 46%
+
+ STATE FDNUM KB/s Filename
+ read 11 293 /extra1/test/amd64/libgdk-x11-2.0.so
+ read 11 295 /extra1/test/amd64/libgdk-x11-2.0.so.0
+ read 9 476 /extra1/1000
+ read 11 526 /extra1/test/amd64/libCstd.so.1
+ read 11 594 /extra1/test/amd64/libXm.so.4
+ read 11 594 /extra1/test/amd64/libXm.so
+ read 11 1603 /extra1/test/amd64/libgtk-x11-2.0.so.0
+ read 11 1606 /extra1/test/amd64/libgtk-x11-2.0.so
+ read 9 4078 /extra1/5000
+ write 3 21254 /devices/pseudo/mm@0:null
+
+ Total event time (ms): 4903 Total Mbytes/sec: 41
+
+Fair enough. tar is crusing along at 21 Mbytes/sec (writes to fd 3!).
+
+
+
+More interesting is to do the following,
+
+Running: tar cf - / | gzip > /dev/null
+
+ # ./pfilestat `pgrep -x tar`
+
+ STATE FDNUM Time Filename
+ read 11 0% /extra1/test/amd64/libm.so
+ read 11 0% /extra1/test/amd64/libm.so.2
+ read 11 0% /extra1/test/amd64/libnsl.so
+ read 11 0% /extra1/test/amd64/libnsl.so.1
+ read 11 0% /extra1/test/amd64/libc.so.1
+ write 3 2% <none>
+ waitcpu 0 4%
+ sleep-r 0 4%
+ running 0 6%
+ sleep-w 0 78%
+
+ STATE FDNUM KB/s Filename
+ read 11 74 /extra1/test/amd64/libldap.so
+ read 11 75 /extra1/test/amd64/libldap.so.5
+ read 11 75 /extra1/test/amd64/libresolv.so.2
+ read 11 76 /extra1/test/amd64/libresolv.so
+ read 11 97 /extra1/test/amd64/libm.so.2
+ read 11 98 /extra1/test/amd64/libm.so
+ read 11 174 /extra1/test/amd64/libnsl.so
+ read 11 176 /extra1/test/amd64/libnsl.so.1
+ read 11 216 /extra1/test/amd64/libc.so.1
+ write 3 3022 <none>
+
+ Total event time (ms): 4911 Total Mbytes/sec: 6
+
+Woah now, tar is writing 3 Mbytes/sec - AND spending 78% of it's time on
+sleep-w, sleeping on writes! Of course, this is because we are piping the
+output to gzip, which is spending a while compressing the data. 78%
+matches the time gzip was on the CPU (using either "prstat -m" or dtrace
+to measure; procfs's pr_pctcpu would take too long to catch up).
+
+
+
+
+Also interesting is,
+
+Running: perl -e 'while (1) {;}' &
+Running: perl -e 'while (1) {;}' &
+Running: perl -e 'while (1) {;}' &
+Running: perl -e 'while (1) {;}' &
+Running: tar cf /dev/null /
+
+ # ./pfilestat `pgrep -x tar`
+
+ STATE FDNUM Time Filename
+ read 11 0% /extra1/test/amd64/libxml2.so.2
+ read 11 0% /extra1/test/amd64/libgdk-x11-2.0.so.0
+ read 11 0% /extra1/test/amd64/libgdk-x11-2.0.so
+ read 11 0% /extra1/test/amd64/libCstd.so.1
+ read 11 0% /extra1/test/amd64/libgtk-x11-2.0.so.0
+ read 11 2% /extra1/test/amd64/libgtk-x11-2.0.so
+ write 3 2% /devices/pseudo/mm@0:null
+ running 0 8%
+ sleep-r 0 22%
+ waitcpu 0 65%
+
+ STATE FDNUM KB/s Filename
+ read 11 182 /extra1/test/amd64/libsun_fc.so
+ read 11 264 /extra1/test/amd64/libglib-2.0.so
+ read 11 266 /extra1/test/amd64/libglib-2.0.so.0
+ read 11 280 /extra1/test/amd64/libxml2.so.2
+ read 11 293 /extra1/test/amd64/libgdk-x11-2.0.so
+ read 11 295 /extra1/test/amd64/libgdk-x11-2.0.so.0
+ read 11 526 /extra1/test/amd64/libCstd.so.1
+ read 11 761 /extra1/test/amd64/libgtk-x11-2.0.so.0
+ read 11 1606 /extra1/test/amd64/libgtk-x11-2.0.so
+ write 3 7881 /devices/pseudo/mm@0:null
+
+ Total event time (ms): 4596 Total Mbytes/sec: 13
+
+Now we have "waitcpu" as tar competes for CPU cycles along with the greedy
+infinite perl processes.
diff --git a/Examples/pgpginbypid_example.txt b/Examples/pgpginbypid_example.txt
new file mode 100644
index 000000000000..8326b904d94c
--- /dev/null
+++ b/Examples/pgpginbypid_example.txt
@@ -0,0 +1,14 @@
+The following is a demonstration of the pgpginbypid.d script,
+
+
+Here we run it for a few seconds then hit Ctrl-C,
+
+ # pgpginbypid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD PAGES
+ 10692 find 128
+ 10693 tar 11928
+
+In the output above, we can see which processes are responsible for page ins,
+as well as the number of pages paged in.
diff --git a/Examples/pgpginbyproc_example.txt b/Examples/pgpginbyproc_example.txt
new file mode 100644
index 000000000000..e8bb8217a138
--- /dev/null
+++ b/Examples/pgpginbyproc_example.txt
@@ -0,0 +1,13 @@
+The following is a demonstration of the pgpginbyproc.d script,
+
+ # pgpginbyproc.d
+ dtrace: description 'vminfo:::pgpgin ' matched 1 probe
+ ^C
+
+ ttymon 1
+ bash 1
+ mozilla-bin 36
+ tar 6661
+
+In the above output, tar processes have paged in 6661 pages from the filesystem.
+
diff --git a/Examples/php_calldist_example.txt b/Examples/php_calldist_example.txt
new file mode 100644
index 000000000000..db3b0af9d542
--- /dev/null
+++ b/Examples/php_calldist_example.txt
@@ -0,0 +1,84 @@
+The following are examples of php_calldist.d.
+
+This script traces the elapsed time of PHP functions and prints a report
+containing distribution plots per subroutine. Here it traces the example program
+Code/Php/func_abc.php.
+
+# php_calldist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Exclusive function elapsed times (us),
+ func_abc.php, func, func_a
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ func_abc.php, func, func_b
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ func_abc.php, func, func_c
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ func_abc.php, func, sleep
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 1048576 | 0
+
+
+Inclusive function elapsed times (us),
+ func_abc.php, func, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_abc.php, func, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_abc.php, func, sleep
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 1048576 | 0
+
+ func_abc.php, func, func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+In total, 3 subroutines were called, one each of func_a(), func_b() and
+func_c(), and sleep was called 3 times. You can see this reflected in the
+"count" column on the right.
+
+The exclusive subroutine elapsed times show that each subroutine spent
+between 256 and 512 microseconds. This time excludes the time spent in
+other subroutines.
+
+The inclusive subroutine elapsed times show that func_c() took between 0.5
+seconds and 1 second, func_b() took between 1 second and 2.1 seconds, and
+func_a() took between 2.1 seconds and 4.2 seconds to execute. This time
+includes the time spent in other subroutines called, and since func_a() called
+func_b() which called func_c(), these times make sense.
+
+These elapsed times are the absolute time from when the subroutine began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc.
+
+Elapsed times are useful for identifying where latencies are.
+See Notes/ALLelapsed_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
diff --git a/Examples/php_calltime_example.txt b/Examples/php_calltime_example.txt
new file mode 100644
index 000000000000..d76cb6e02581
--- /dev/null
+++ b/Examples/php_calltime_example.txt
@@ -0,0 +1,51 @@
+The following is an example of running php_calltime.d and tracing the elapsed
+times for functions.
+
+We run php_calltime.d while running the program Code/Php/func_abc.php. We can
+see that there are three sections in the DTrace output
+
+# php_calltime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ func_abc.php func func_a 1
+ func_abc.php func func_b 1
+ func_abc.php func func_c 1
+ func_abc.php func sleep 3
+ - total - 6
+
+Exclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.php func func_c 330
+ func_abc.php func func_b 367
+ func_abc.php func func_a 418
+ func_abc.php func sleep 3025644
+ - total - 3026761
+
+Inclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.php func func_c 1010119
+ func_abc.php func func_b 2020118
+ func_abc.php func sleep 3025644
+ func_abc.php func func_a 3026761
+
+Section 1 - Count shows us how many times each function was called in the
+Code/Php/func_abc.php program, with the last line giving us a total number of
+functions called (in this case, six).
+
+Section 2 - These elapsed times shows us how many microseconds the program
+spends in each function. This does not include the time spent in any
+sub-functions called by that particular function. Again the last line gives
+us the total time in microseconds.
+
+Section 3 - These elapsed times are the absolute time from when the function began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc. In particular, for this case it has
+included the time waiting for the sleep commands.
+
+Elapsed times are useful for identifying where latencies are.
+See Notes/ALLelapsed_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive function time.
diff --git a/Examples/php_cpudist_example.txt b/Examples/php_cpudist_example.txt
new file mode 100644
index 000000000000..6da7d29d8f4d
--- /dev/null
+++ b/Examples/php_cpudist_example.txt
@@ -0,0 +1,84 @@
+The following are examples of php_cpudist.d.
+
+This script traces the on-CPU time of PHP functions and prints a report
+containing distribution plots per subroutine. Here it traces the example
+program Code/Php/func_abc.php.
+
+# php_cpudist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Exclusive function on-CPU times (us),
+ func_abc.php, func, func_a
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ func_abc.php, func, func_b
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ func_abc.php, func, func_c
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ func_abc.php, func, sleep
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+
+Inclusive function on-CPU times (us),
+ func_abc.php, func, func_c
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ func_abc.php, func, sleep
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 32 | 0
+
+ func_abc.php, func, func_b
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ func_abc.php, func, func_a
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+In total, 3 subroutines were called, one each of func_a(), func_b() and
+func_c(), and sleep was called 3 times. You can see this reflected in the
+"count" column on the right.
+
+The exclusive subroutine elapsed times show that each subroutine spent
+between 16 and 31 microseconds on CPU. This time excludes the time spent in
+other subroutines.
+
+The inclusive subroutine elapsed times show that func_c() took between 32
+microseconds and 63 microseconds on CPU; sleep ran three times and each time
+took between 16 and 31 microseconds on CPU; func_b() took between 64 and 127
+microseconds on CPU; and func_a() took between 128 and 255 microseconds on
+CPU. This time includes the time spent in other subroutines called, and since
+func_a() called func_b() which called func_c(), these times make sense.
+
+These elapsed times are the on CPU time from when the subroutine began to
+when it completed.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLelapsed_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
diff --git a/Examples/php_cputime_example.txt b/Examples/php_cputime_example.txt
new file mode 100644
index 000000000000..db218e1d1f53
--- /dev/null
+++ b/Examples/php_cputime_example.txt
@@ -0,0 +1,58 @@
+The following are examples of php_cputime.d.
+
+This script traces the on-CPU time of PHP functions and prints a report.
+Here it traces the example program, Code/Php/func_abc.php.
+
+# php_cputime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ func_abc.php func func_a 1
+ func_abc.php func func_b 1
+ func_abc.php func func_c 1
+ func_abc.php func sleep 3
+ - total - 6
+
+Exclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.php func func_c 17
+ func_abc.php func func_b 25
+ func_abc.php func func_a 74
+ func_abc.php func sleep 93
+ - total - 210
+
+Inclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.php func func_c 39
+ func_abc.php func func_b 87
+ func_abc.php func sleep 93
+ func_abc.php func func_a 210
+
+In total, six functions were called; sleep was called three times and there
+was one call each of func_a(), func_b() and func_c().
+
+The exclusive subroutine on-CPU times show that func_a() spent around 74
+microseconds on-CPU, func_b() spent 25 microseconds on-CPU, and func_c() spent
+17 microseconds on-CPU. This exclusive times excludes time spent in other
+subroutines.
+
+The inclusive subroutine on-CPU times show that func_c() spent around 39
+microseconds on-CPU, func_b() spent around 87 microseconds on-CPU and
+func_a() spent around 210 microseconds. This inclusive time includes the time
+spent in other functions called (including sleep), and since func_a() called
+func_b() which called func_c(), these times make perfect sense.
+
+These on-CPU times are the time the program spent running on a CPU, from when
+the function began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
+If you study the func_abc.php program alongside the above output, the numbers
+should make sense.
+
diff --git a/Examples/php_flow_example.txt b/Examples/php_flow_example.txt
new file mode 100644
index 000000000000..6470daf087b3
--- /dev/null
+++ b/Examples/php_flow_example.txt
@@ -0,0 +1,36 @@
+The following are examples of php_flow.d.
+
+This is a simple script to trace the flow of PHP functions.
+Here it traces the example program, Code/Php/func_abc.php
+
+# php_flow.d
+ C TIME(us) FILE -- FUNC
+ 0 3645535409575 func_abc.php -> func_a
+ 0 3645535409653 func_abc.php -> sleep
+ 0 3645536410511 func_abc.php <- sleep
+ 0 3645536410536 func_abc.php -> func_b
+ 0 3645536410557 func_abc.php -> sleep
+ 0 3645537420627 func_abc.php <- sleep
+ 0 3645537420652 func_abc.php -> func_c
+ 0 3645537420673 func_abc.php -> sleep
+ 0 3645538430106 func_abc.php <- sleep
+ 0 3645538430125 func_abc.php <- func_c
+ 0 3645538430134 func_abc.php <- func_b
+ 0 3645538430143 func_abc.php <- func_a
+^C
+
+The fourth column is indented by 2 spaces to show when a new function begins.
+This shows which function is calling which - the output above begins by
+showing that func_a() began; slept, and returned from sleep; and then called
+func_b().
+
+The TIME(us) column shows time from boot in microseconds.
+
+The FILE column shows the file that was being executed.
+
+If the output looks strange, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/php_flowinfo_example.txt b/Examples/php_flowinfo_example.txt
new file mode 100644
index 000000000000..3b2e3c1f314c
--- /dev/null
+++ b/Examples/php_flowinfo_example.txt
@@ -0,0 +1,40 @@
+The following are examples of php_flowinfo.d.
+
+This is a simple script to trace the flow of PHP functions.
+Here it traces the example program, Code/Php/func_abc.php
+
+# php_flowinfo.d
+C PID/TID DELTA(us) FILE:LINE TYPE -- FUNC
+0 18422/1 9 func_abc.php:22 func -> func_a
+0 18422/1 35 func_abc.php:18 func -> sleep
+0 18422/1 1009146 func_abc.php:18 func <- sleep
+0 18422/1 35 func_abc.php:19 func -> func_b
+0 18422/1 24 func_abc.php:11 func -> sleep
+0 18422/1 1009803 func_abc.php:11 func <- sleep
+0 18422/1 34 func_abc.php:12 func -> func_c
+0 18422/1 24 func_abc.php:5 func -> sleep
+0 18422/1 1009953 func_abc.php:5 func <- sleep
+0 18422/1 28 func_abc.php:6 func <- func_c
+0 18422/1 11 func_abc.php:13 func <- func_b
+0 18422/1 10 func_abc.php:20 func <- func_a
+^C
+
+The third column is indented by 2 spaces to show when a new function begins.
+This shows which function is calling which - the output above begins by
+showing that func_a() began; slept, and returned from sleep; and then called
+func_b().
+
+The DELTA(us) column shows time from that line to the previous line, and
+so can be a bit tricky to read. For example, the second line of data output
+(skipping the header) reads as "the time from func_a() beginning to
+calling the sleep function beginning was 35 microseconds".
+
+The LINE column shows the line in the file what was being executed. Refer
+to the source program to see what this line refers to.
+
+If the output looks shuffled, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/php_flowtime_example.txt b/Examples/php_flowtime_example.txt
new file mode 100644
index 000000000000..57eb69c6dc64
--- /dev/null
+++ b/Examples/php_flowtime_example.txt
@@ -0,0 +1,41 @@
+The following are examples of php_flowtime.d.
+
+This is a simple script to trace the flow of PHP functions.
+Here it traces the example program, Code/Php/func_abc.php
+
+# php_flowtime.d
+ C TIME(us) FILE DELTA(us) -- FUNC
+ 0 3646108339057 func_abc.php 9 -> func_a
+ 0 3646108339090 func_abc.php 32 -> sleep
+ 0 3646109341043 func_abc.php 1001953 <- sleep
+ 0 3646109341074 func_abc.php 31 -> func_b
+ 0 3646109341098 func_abc.php 23 -> sleep
+ 0 3646110350712 func_abc.php 1009614 <- sleep
+ 0 3646110350745 func_abc.php 32 -> func_c
+ 0 3646110350768 func_abc.php 23 -> sleep
+ 0 3646111362323 func_abc.php 1011554 <- sleep
+ 0 3646111362351 func_abc.php 27 <- func_c
+ 0 3646111362361 func_abc.php 10 <- func_b
+ 0 3646111362370 func_abc.php 9 <- func_a
+^C
+
+The fifth column is indented by 2 spaces to show when a new function begins.
+This shows which function is calling which - the output above begins by
+showing that func_a() began; slept, and returned from sleep; and then called
+func_b().
+
+The TIME(us) column shows time since boot.
+
+The DELTA(us) column shows time from that line to the previous line, and
+so can be a bit tricky to read. For example, the second line of data output
+(skipping the header) reads as "the time from func_a() beginning to
+calling the sleep function beginning was 32 microseconds".
+
+The FILE column shows file that was being executed.
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
+
diff --git a/Examples/php_funccalls_example.txt b/Examples/php_funccalls_example.txt
new file mode 100644
index 000000000000..7155a7139b92
--- /dev/null
+++ b/Examples/php_funccalls_example.txt
@@ -0,0 +1,17 @@
+The following are examples of php_funccalls.d.
+
+This is a simple script to count executed PHP functions. Here it traces
+an example program, Code/Php/func_abc.php
+
+# php_funccalls.d
+Tracing... Hit Ctrl-C to end.
+^C
+ FILE FUNC CALLS
+ func_abc.php func_a 1
+ func_abc.php func_b 1
+ func_abc.php func_c 1
+ func_abc.php sleep 3
+
+While tracing, func_a() from the program "func_abc.php" was executed once,
+as were func_b() and func_c(). sleep was executed three times.
+
diff --git a/Examples/php_malloc_example.txt b/Examples/php_malloc_example.txt
new file mode 100644
index 000000000000..853d08299314
--- /dev/null
+++ b/Examples/php_malloc_example.txt
@@ -0,0 +1,23 @@
+Following are examples of running php_malloc.d.
+
+Here it is running on Code/Php/func_abc.php
+
+ # php_malloc.d -p 18523
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ PHP malloc byte distributions by engine caller,
+
+
+ PHP malloc byte distributions by PHP file and function,
+
+
+Theoretically this should show you mallocs. However there weren't any in this
+example. The rest of these example files would have been so much easier to
+write if they were all like this. I would have been finished by now and would
+have been flicking through the TV channels with a nice, cold beer in hand.
+
+
+... Fixing this example is on my todo list. Check for newer versions of the
+toolkit.
+
diff --git a/Examples/php_syscalls_example.txt b/Examples/php_syscalls_example.txt
new file mode 100644
index 000000000000..c783420fc0fb
--- /dev/null
+++ b/Examples/php_syscalls_example.txt
@@ -0,0 +1,22 @@
+The following are examples of php_syscalls.d.
+
+This is a simple script to count executed PHP functions and system calls.
+Here it traces an example program, Code/Php/func_abc.php
+
+# php_syscalls.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID FILE TYPE NAME COUNT
+ 18419 func_abc.php func func_a 1
+ 18419 func_abc.php func func_b 1
+ 18419 func_abc.php func func_c 1
+ 18419 func_abc.php func sleep 3
+ 18419 httpd syscall nanosleep 3
+
+While tracing, four functions were called - func_a(), func_b(), func_c(), and
+sleep. There were also three instances of the system call nanosleep().
+
+This script can provide an insight to how a PHP application is interacting
+with the system, by providing both application function calls and system calls
+in the same output.
+
diff --git a/Examples/php_syscolors_example.txt b/Examples/php_syscolors_example.txt
new file mode 100644
index 000000000000..96b26a8877df
--- /dev/null
+++ b/Examples/php_syscolors_example.txt
@@ -0,0 +1,63 @@
+The following are examples of php_syscolors.d.
+
+This is a simple script to trace the flow of PHP functions and system
+calls made, and renders the output in color ("colour") using terminal
+escape sequences (which you can tweak by modifying the script).
+
+Here it traces the example program, Code/Php/func_abc.php.
+
+WARNING: This output is full of terminal escape sequences, so if you are
+trying to view this through an editor or web browser - it may look awful.
+Try viewing this using "more" (although, depending on your terminal, it
+still may look awful).
+
+# php_syscolors.d
+C PID/TID DELTA(us) FILE:LINE TYPE -- NAME
+0 18426/1 8 func_abc.php:22 func -> func_a
+0 18426/1 41 func_abc.php:18 func -> sleep
+0 18426/1 15 ":- syscall -> nanosleep
+0 18426/1 1008700 ":- syscall <- nanosleep
+0 18426/1 30 func_abc.php:18 func <- sleep
+0 18426/1 42 func_abc.php:19 func -> func_b
+0 18426/1 28 func_abc.php:11 func -> sleep
+0 18426/1 14 ":- syscall -> nanosleep
+0 18426/1 1010083 ":- syscall <- nanosleep
+0 18426/1 29 func_abc.php:11 func <- sleep
+0 18426/1 43 func_abc.php:12 func -> func_c
+0 18426/1 28 func_abc.php:5 func -> sleep
+0 18426/1 14 ":- syscall -> nanosleep
+0 18426/1 1009794 ":- syscall <- nanosleep
+0 18426/1 28 func_abc.php:5 func <- sleep
+0 18426/1 34 func_abc.php:6 func <- func_c
+0 18426/1 18 func_abc.php:13 func <- func_b
+0 18426/1 17 func_abc.php:20 func <- func_a
+0 18426/1 21 ":- syscall -> fchdir
+0 18426/1 19 ":- syscall <- fchdir
+0 18426/1 9 ":- syscall -> close
+0 18426/1 13 ":- syscall <- close
+0 18426/1 35 ":- syscall -> semsys
+0 18426/1 12 ":- syscall <- semsys
+0 18426/1 7 ":- syscall -> semsys
+0 18426/1 7 ":- syscall <- semsys
+0 18426/1 66 ":- syscall -> setitimer
+0 18426/1 8 ":- syscall <- setitimer
+0 18426/1 39 ":- syscall -> read
+0 18426/1 14 ":- syscall <- read
+0 18426/1 11 ":- syscall -> writev
+0 18426/1 22 ":- syscall <- writev
+0 18426/1 23 ":- syscall -> write
+0 18426/1 110 ":- syscall <- write
+0 18426/1 61 ":- syscall -> pollsys
+
+In this excerpt:
+0 18426/1 43 func_abc.php:12 func -> func_c
+0 18426/1 28 func_abc.php:5 func -> sleep
+0 18426/1 14 ":- syscall -> nanosleep
+0 18426/1 1009794 ":- syscall <- nanosleep
+0 18426/1 28 func_abc.php:5 func <- sleep
+0 18426/1 34 func_abc.php:6 func <- func_c
+
+we can see that we are at Line 12 of the program which invokes func_c. func_c
+then invokes sleep, which uses the syscall nanosleep. Approximately one
+second later nanosleep returns, then sleep finishes, then func_c finishes.
+
diff --git a/Examples/php_who_example.txt b/Examples/php_who_example.txt
new file mode 100644
index 000000000000..cee32b2f8494
--- /dev/null
+++ b/Examples/php_who_example.txt
@@ -0,0 +1,10 @@
+The following are examples of the results of running php_who.d.
+
+# php_who.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID UID FUNCS FILE
+ 158525 80 7 /opt/coolstack/apache2/htdocs/php/func_abc.php
+
+Running the php_who.d while the func_abc.php program runs, we can see that
+while func_abc.php was running, it called seven functions.
diff --git a/Examples/pidpersec_example.txt b/Examples/pidpersec_example.txt
new file mode 100644
index 000000000000..11f6bd7c1fc9
--- /dev/null
+++ b/Examples/pidpersec_example.txt
@@ -0,0 +1,33 @@
+The following is a demonstration of the pidpersec.d script.
+
+
+Here the program is run on an idle system,
+
+ # ./pidpersec.d
+ TIME LASTPID PID/s
+ 2005 Jun 9 22:15:09 3010 0
+ 2005 Jun 9 22:15:10 3010 0
+ 2005 Jun 9 22:15:11 3010 0
+ 2005 Jun 9 22:15:12 3010 0
+ 2005 Jun 9 22:15:13 3010 0
+ ^C
+
+This shows that there are now new processes being created.
+
+
+
+Now the script is run on a busy system, that is creating many processes
+(which happen to be short-lived),
+
+ # ./pidpersec.d
+ TIME LASTPID PID/s
+ 2005 Jun 9 22:16:30 3051 13
+ 2005 Jun 9 22:16:31 3063 12
+ 2005 Jun 9 22:16:32 3073 10
+ 2005 Jun 9 22:16:33 3084 11
+ 2005 Jun 9 22:16:34 3096 12
+ ^C
+
+Now we can see that there are over 10 new processes created each second.
+The value for lastpid confirms the rates printed.
+
diff --git a/Examples/pl_calldist_example.txt b/Examples/pl_calldist_example.txt
new file mode 100644
index 000000000000..f53b7f54777d
--- /dev/null
+++ b/Examples/pl_calldist_example.txt
@@ -0,0 +1,456 @@
+The following are examples of pl_calldist.d.
+
+This script traces the elapsed time of Perl subroutines (functions) and
+prints a report containing distribution plots per subroutine. Here it
+traces the example program, Code/Perl/func_abc.pl.
+
+ # pl_calldist.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ Exclusive subroutine elapsed times (us),
+ func_abc.pl, sub, func_a
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_abc.pl, sub, func_b
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_abc.pl, sub, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+
+ Inclusive subroutine elapsed times (us),
+ func_abc.pl, sub, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_abc.pl, sub, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_abc.pl, sub, func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+In total, 3 subroutines were called - func_a(), func_b(), and func_c().
+
+The exclusive subroutine elapsed times show that each subroutine spent
+between 524 and 1048 ms. This exclusive time excludes the time spent in
+other subroutines.
+
+The inclusive subroutine elapsed times show that func_c() took between 0.5 and
+1.0 seconds, func_b() took between 1.0 and 2.1 seconds, and func_a() took
+between 2.1 and 4.2 seconds to execute. This inclusive time includes the
+time spent in other subroutines called, and since func_a() called func_b()
+which called func_c(), these times make sense.
+
+These elapsed times are the absolute time from when the subroutine began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc.
+
+Elapsed times are useful for identifying where latencies are.
+See Notes/ALLelapsed_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
+
+
+The following traces a Perl network interface statistics tool, "nicstat"
+version 0.99,
+
+# pl_calldist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Exclusive subroutine elapsed times (us),
+ DynaLoader.pm, sub, dl_load_flags
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ Config.pm, sub, TIEHASH
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ Config.pm, sub, DESTROY
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ Config.pm, sub, import
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ register.pm, sub, mkMask
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 8 | 0
+
+ Config.pm, sub, FETCH
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 2
+ 4 |@@@@@@@@@@@@@@@@@@@@ 2
+ 8 | 0
+
+ Config.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ strict.pm, sub, import
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@ 2
+ 8 |@@@@@@@@ 1
+ 16 |@@@@@@@@ 1
+ 32 | 0
+
+ strict.pm, sub, bits
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 8 |@@@@@@@ 1
+ 16 |@@@@@@@ 1
+ 32 | 0
+
+ strict.pm, sub, unimport
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 16 |@@@@@@@@@@ 1
+ 32 | 0
+
+ AutoLoader.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@ 1
+ 4 |@@@@@@@ 1
+ 8 |@@@@@@@@@@@@@@@@@@@@ 3
+ 16 |@@@@@@@ 1
+ 32 | 0
+
+ Std.pm, sub, getopts
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ register.pm, sub, import
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ vars.pm, sub, import
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ Exporter.pm, sub, import
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@ 1
+ 64 |@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ DynaLoader.pm, sub, bootstrap
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ warnings.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ DynaLoader.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ nicstat, sub, print_neat
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@ 10
+ 128 |@@@@@@@@@@@@@@@@@@ 8
+ 256 | 0
+
+ vars.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 |@@@@@@@@@@@@@ 1
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ Kstat.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ nicstat, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@ 1
+ 512 |@@@@@@@@@@@@@ 1
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ nicstat, sub, fetch_net_data
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+ nicstat, sub, find_nets
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+
+Inclusive subroutine elapsed times (us),
+ DynaLoader.pm, sub, dl_load_flags
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ Config.pm, sub, TIEHASH
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ Config.pm, sub, DESTROY
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ Config.pm, sub, import
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ register.pm, sub, mkMask
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 8 | 0
+
+ Config.pm, sub, FETCH
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 2
+ 4 |@@@@@@@@@@@@@@@@@@@@ 2
+ 8 | 0
+
+ strict.pm, sub, bits
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 8 |@@@@@@@ 1
+ 16 |@@@@@@@ 1
+ 32 | 0
+
+ strict.pm, sub, import
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@ 2
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ Config.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32 |@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ Std.pm, sub, getopts
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ register.pm, sub, import
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ strict.pm, sub, unimport
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 32 | 0
+
+ vars.pm, sub, import
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ AutoLoader.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@ 1
+ 4 |@@@@@@@ 1
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 3
+ 32 |@@@@@@@ 1
+ 64 | 0
+
+ Exporter.pm, sub, import
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@ 1
+ 64 |@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ DynaLoader.pm, sub, bootstrap
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ warnings.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ nicstat, sub, print_neat
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@ 10
+ 128 |@@@@@@@@@@@@@@@@@@ 8
+ 256 | 0
+
+ vars.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 | 0
+ 16 | 0
+ 32 |@@@@@@@@@@@@@ 1
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ DynaLoader.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ Kstat.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@ 1
+ 32 |@@@@@@@@@@@@@ 1
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@ 1
+ 16384 | 0
+
+ nicstat, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@ 1
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@ 1
+ 16384 | 0
+
+ nicstat, sub, fetch_net_data
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+ nicstat, sub, find_nets
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+As an example of interpreting the output: the inclusive elapsed time for
+the "print_neat" subroutine in "nicstat",
+
+ nicstat, sub, print_neat
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@ 10
+ 128 |@@@@@@@@@@@@@@@@@@ 8
+ 256 | 0
+
+shows that "print_neat" was called 18 times, 10 of which took between 64
+and 127 microseconds, and 8 of which took between 128 and 255 microseconds.
+
diff --git a/Examples/pl_calltime_example.txt b/Examples/pl_calltime_example.txt
new file mode 100644
index 000000000000..3cc5480fdc2d
--- /dev/null
+++ b/Examples/pl_calltime_example.txt
@@ -0,0 +1,150 @@
+The following are examples of pl_calltime.d.
+
+This script traces the elapsed time of Perl subroutines (functions) and
+prints a report. Here it traces the example program, Code/Perl/func_abc.pl.
+
+ # pl_calltime.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ Count,
+ FILE TYPE NAME COUNT
+ func_abc.pl sub func_a 1
+ func_abc.pl sub func_b 1
+ func_abc.pl sub func_c 1
+ - total - 3
+
+ Exclusive subroutine elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.pl sub func_a 1006119
+ func_abc.pl sub func_c 1009978
+ func_abc.pl sub func_b 1010273
+ - total - 3026371
+
+ Inclusive subroutine elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.pl sub func_c 1009978
+ func_abc.pl sub func_b 2020252
+ func_abc.pl sub func_a 3026371
+
+In total, 3 subroutines were called, one of each.
+
+The exclusive subroutine elapsed times show that each subroutine spent around
+1.0 seconds of time (~1000000 us) processing code - while not in other
+subroutines.
+
+The inclusive subroutine elapsed times show that func_a() took around 3.0
+seconds to execute, followed by func_b() at 2.0 seconds, and func_c() at 1.0.
+The inclusive time includes the time spent in other subroutines called, and
+since func_a() called func_b() which called func_c(), these times make
+perfect sense.
+
+These elapsed times are the absolute time from when the subroutine began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc.
+
+Elapsed times are useful for identifying where latencies are.
+See Notes/ALLelapsed_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
+If you study the func_abc.pl program alongside the above output, the numbers
+should make sense.
+
+
+
+The following traces a Perl network interface statistics tool, "nicstat"
+version 0.99,
+
+# pl_calltime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ Config.pm sub DESTROY 1
+ Config.pm sub TIEHASH 1
+ Config.pm sub import 1
+ DynaLoader.pm sub bootstrap 1
+ DynaLoader.pm sub dl_load_flags 1
+ Std.pm sub getopts 1
+ nicstat sub fetch_net_data 1
+ nicstat sub find_nets 1
+ register.pm sub import 1
+ warnings.pm sub BEGIN 1
+ Config.pm sub BEGIN 2
+ DynaLoader.pm sub BEGIN 2
+ Exporter.pm sub import 2
+ register.pm sub mkMask 2
+ vars.pm sub import 2
+ Kstat.pm sub BEGIN 3
+ nicstat sub BEGIN 3
+ vars.pm sub BEGIN 3
+ Config.pm sub FETCH 4
+ strict.pm sub unimport 4
+ strict.pm sub import 5
+ AutoLoader.pm sub BEGIN 6
+ strict.pm sub bits 6
+ nicstat sub print_neat 18
+ - total - 72
+
+Exclusive subroutine elapsed times (us),
+ FILE TYPE NAME TOTAL
+ DynaLoader.pm sub dl_load_flags 2
+ Config.pm sub TIEHASH 3
+ Config.pm sub DESTROY 9
+ register.pm sub mkMask 11
+ Config.pm sub import 12
+ Config.pm sub FETCH 17
+ strict.pm sub import 38
+ Config.pm sub BEGIN 38
+ strict.pm sub bits 49
+ vars.pm sub import 59
+ strict.pm sub unimport 65
+ AutoLoader.pm sub BEGIN 70
+ Std.pm sub getopts 78
+ register.pm sub import 86
+ Exporter.pm sub import 112
+ warnings.pm sub BEGIN 680
+ DynaLoader.pm sub BEGIN 1131
+ DynaLoader.pm sub bootstrap 1221
+ nicstat sub print_neat 2450
+ vars.pm sub BEGIN 2608
+ Kstat.pm sub BEGIN 3171
+ nicstat sub BEGIN 3963
+ nicstat sub fetch_net_data 45424
+ nicstat sub find_nets 55737
+ - total - 117047
+
+Inclusive subroutine elapsed times (us),
+ FILE TYPE NAME TOTAL
+ DynaLoader.pm sub dl_load_flags 2
+ Config.pm sub TIEHASH 3
+ Config.pm sub DESTROY 9
+ register.pm sub mkMask 11
+ Config.pm sub import 12
+ Config.pm sub FETCH 17
+ strict.pm sub import 46
+ strict.pm sub bits 49
+ vars.pm sub import 59
+ Config.pm sub BEGIN 64
+ strict.pm sub unimport 87
+ register.pm sub import 97
+ Std.pm sub getopts 112
+ Exporter.pm sub import 112
+ AutoLoader.pm sub BEGIN 140
+ warnings.pm sub BEGIN 680
+ DynaLoader.pm sub bootstrap 1224
+ nicstat sub print_neat 2450
+ vars.pm sub BEGIN 3412
+ DynaLoader.pm sub BEGIN 4656
+ Kstat.pm sub BEGIN 8020
+ nicstat sub BEGIN 13313
+ nicstat sub fetch_net_data 45424
+ nicstat sub find_nets 55737
+
+The output showed that the most time was spent in the subroutine find_nets(),
+with a total exclusive elapsed time of 55.7 ms. This also matches the
+total inclusive time, suggesting that find_nets() didn't call other
+subroutines.
+
diff --git a/Examples/pl_cpudist_example.txt b/Examples/pl_cpudist_example.txt
new file mode 100644
index 000000000000..a2ccff83f4ed
--- /dev/null
+++ b/Examples/pl_cpudist_example.txt
@@ -0,0 +1,470 @@
+The following are examples of pl_cpudist.d.
+
+This script traces the on-CPU time of Perl subroutines (functions) and
+prints a report containing distribution plots per subroutine. Here it
+traces the example program, Code/Perl/func_slow.pl.
+
+ # pl_cpudist.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ Exclusive subroutine on-CPU times (us),
+ func_slow.pl, sub, func_a
+ value ------------- Distribution ------------- count
+ 131072 | 0
+ 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 524288 | 0
+
+ func_slow.pl, sub, func_b
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_slow.pl, sub, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+
+ Inclusive subroutine on-CPU times (us),
+ func_slow.pl, sub, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_slow.pl, sub, func_a
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_slow.pl, sub, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+The exclusive subroutine on-CPU times show that func_a() spent between
+262 ms and 524 ms on-CPU, while func_b() and func_c() both spent between
+524 ms and 1048 ms on-CPU.
+
+The inclusive subroutine on-CPU times show that func_c() spent between 0.5 and
+1.0 seconds, and both func_b() and func_a() spent between 1.0 and 2.1 seconds
+of CPU time. This inclusive time includes the time spent in other subroutines
+called, and since func_a() called func_b() which called func_c(), these times
+make sense.
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the subroutine began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
+
+The following traces a Perl network interface statistics tool, "nicstat"
+version 0.99,
+
+# pl_cpudist.pl
+Tracing... Hit Ctrl-C to end.
+^C
+
+Exclusive subroutine on-CPU times (us),
+ Config.pm, sub, TIEHASH
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ DynaLoader.pm, sub, dl_load_flags
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ Config.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 | 0
+
+ Config.pm, sub, DESTROY
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ register.pm, sub, mkMask
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ Config.pm, sub, import
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ Config.pm, sub, FETCH
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 |@@@@@@@@@@ 1
+ 8 | 0
+
+ strict.pm, sub, unimport
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 8 |@@@@@@@@@@ 1
+ 16 | 0
+
+ Std.pm, sub, getopts
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ register.pm, sub, import
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ strict.pm, sub, import
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@ 2
+ 4 |@@@@@@@@ 1
+ 8 |@@@@@@@@ 1
+ 16 |@@@@@@@@ 1
+ 32 | 0
+
+ strict.pm, sub, bits
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 8 |@@@@@@@ 1
+ 16 |@@@@@@@ 1
+ 32 | 0
+
+ AutoLoader.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@ 1
+ 2 |@@@@@@@@@@@@@ 2
+ 4 |@@@@@@@@@@@@@ 2
+ 8 | 0
+ 16 | 0
+ 32 |@@@@@@@ 1
+ 64 | 0
+
+ vars.pm, sub, import
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ Exporter.pm, sub, import
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ nicstat, sub, print_neat
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16
+ 32 |@@ 1
+ 64 |@@ 1
+ 128 | 0
+
+ DynaLoader.pm, sub, bootstrap
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ warnings.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ DynaLoader.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@ 1
+ 512 |@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ vars.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@ 1
+ 2 |@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ Kstat.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 | 0
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ nicstat, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ nicstat, sub, fetch_net_data
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+ nicstat, sub, find_nets
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+
+Inclusive subroutine on-CPU times (us),
+ Config.pm, sub, TIEHASH
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ DynaLoader.pm, sub, dl_load_flags
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ Config.pm, sub, DESTROY
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ register.pm, sub, mkMask
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ Config.pm, sub, import
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ Config.pm, sub, FETCH
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 |@@@@@@@@@@ 1
+ 8 | 0
+
+ Config.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ strict.pm, sub, unimport
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 16 | 0
+
+ strict.pm, sub, import
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@ 2
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@ 2
+ 16 |@@@@@@@@ 1
+ 32 | 0
+
+ strict.pm, sub, bits
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 8 |@@@@@@@ 1
+ 16 |@@@@@@@ 1
+ 32 | 0
+
+ Std.pm, sub, getopts
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ register.pm, sub, import
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ vars.pm, sub, import
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ AutoLoader.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@ 1
+ 2 | 0
+ 4 |@@@@@@@ 1
+ 8 |@@@@@@@@@@@@@ 2
+ 16 |@@@@@@@ 1
+ 32 |@@@@@@@ 1
+ 64 | 0
+
+ Exporter.pm, sub, import
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ nicstat, sub, print_neat
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16
+ 32 |@@ 1
+ 64 |@@ 1
+ 128 | 0
+
+ DynaLoader.pm, sub, bootstrap
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ warnings.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ vars.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@ 1
+ 2 | 0
+ 4 | 0
+ 8 | 0
+ 16 |@@@@@@@@@@@@@ 1
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ DynaLoader.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ Kstat.pm, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@ 1
+ 8 | 0
+ 16 | 0
+ 32 |@@@@@@@@@@@@@ 1
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@ 1
+ 8192 | 0
+
+ nicstat, sub, BEGIN
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@ 1
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@ 1
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@ 1
+ 16384 | 0
+
+ nicstat, sub, fetch_net_data
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+ nicstat, sub, find_nets
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+As an example of interpreting the output: the inclusive on-CPU time for
+the "print_neat" subroutine in "nicstat",
+
+ nicstat, sub, print_neat
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16
+ 32 |@@ 1
+ 64 |@@ 1
+ 128 | 0
+
+shows that "print_neat" was called 18 times, 16 of which spent between 16
+and 31 microseconds on-CPU, once between 32 and 63 microseconds, and once
+between 64 and 127 microseconds.
+
diff --git a/Examples/pl_cputime_example.txt b/Examples/pl_cputime_example.txt
new file mode 100644
index 000000000000..5dc56eead288
--- /dev/null
+++ b/Examples/pl_cputime_example.txt
@@ -0,0 +1,151 @@
+The following are examples of pl_cputime.d.
+
+This script traces the on-CPU time of Perl subroutines (functions) and
+prints a report. Here it traces the example program, Code/Perl/func_slow.pl.
+
+ # pl_cputime.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ Count,
+ FILE TYPE NAME COUNT
+ func_slow.pl sub func_a 1
+ func_slow.pl sub func_b 1
+ func_slow.pl sub func_c 1
+ - total - 3
+
+ Exclusive subroutine on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_slow.pl sub func_a 264193
+ func_slow.pl sub func_b 538498
+ func_slow.pl sub func_c 798961
+ - total - 1601653
+
+ Inclusive subroutine on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_slow.pl sub func_c 798961
+ func_slow.pl sub func_b 1337459
+ func_slow.pl sub func_a 1601653
+
+In total, 3 subroutines were called, one each of func_a(), func_b() and
+func_c().
+
+The exclusive subroutine on-CPU times show that func_a() spent around 264.2 ms
+on-CPU, func_b() spent 538.5 ms, and func_c() spent 799.0 ms. This exclusive
+times excludes time spent in other subroutines.
+
+The inclusive subroutine on-CPU times show that func_c() spent around 799.0 ms
+on-CPU, func_b() spent around 1.3 seconds, and func_a() spent around 1.6
+seconds. This inclusive time includes the time spent in other subroutines
+called, and since func_a() called func_b() which called func_c(), these
+times make perfect sense.
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the subroutine began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
+If you study the func_slow.pl program alongside the above output, the numbers
+should make sense.
+
+
+
+The following traces a Perl network interface statistics tool, "nicstat"
+version 0.99,
+
+# pl_cputime.pl
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ Config.pm sub DESTROY 1
+ Config.pm sub TIEHASH 1
+ Config.pm sub import 1
+ DynaLoader.pm sub bootstrap 1
+ DynaLoader.pm sub dl_load_flags 1
+ Std.pm sub getopts 1
+ nicstat sub fetch_net_data 1
+ nicstat sub find_nets 1
+ register.pm sub import 1
+ warnings.pm sub BEGIN 1
+ Config.pm sub BEGIN 2
+ DynaLoader.pm sub BEGIN 2
+ Exporter.pm sub import 2
+ register.pm sub mkMask 2
+ vars.pm sub import 2
+ Kstat.pm sub BEGIN 3
+ nicstat sub BEGIN 3
+ vars.pm sub BEGIN 3
+ Config.pm sub FETCH 4
+ strict.pm sub unimport 4
+ strict.pm sub import 5
+ AutoLoader.pm sub BEGIN 6
+ strict.pm sub bits 6
+ nicstat sub print_neat 18
+ - total - 72
+
+Exclusive subroutine on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ DynaLoader.pm sub dl_load_flags 2
+ Config.pm sub TIEHASH 2
+ Config.pm sub DESTROY 6
+ Config.pm sub BEGIN 7
+ register.pm sub mkMask 8
+ Config.pm sub import 11
+ Config.pm sub FETCH 12
+ strict.pm sub unimport 17
+ strict.pm sub import 21
+ AutoLoader.pm sub BEGIN 22
+ Std.pm sub getopts 33
+ strict.pm sub bits 40
+ register.pm sub import 51
+ vars.pm sub import 65
+ Exporter.pm sub import 88
+ nicstat sub print_neat 426
+ warnings.pm sub BEGIN 598
+ DynaLoader.pm sub bootstrap 677
+ DynaLoader.pm sub BEGIN 1015
+ Kstat.pm sub BEGIN 2627
+ vars.pm sub BEGIN 2642
+ nicstat sub BEGIN 3033
+ nicstat sub fetch_net_data 42018
+ nicstat sub find_nets 52094
+ - total - 105526
+
+Inclusive subroutine on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ DynaLoader.pm sub dl_load_flags 2
+ Config.pm sub TIEHASH 2
+ Config.pm sub DESTROY 6
+ register.pm sub mkMask 8
+ Config.pm sub import 11
+ Config.pm sub FETCH 12
+ Config.pm sub BEGIN 19
+ strict.pm sub import 28
+ strict.pm sub unimport 35
+ strict.pm sub bits 40
+ AutoLoader.pm sub BEGIN 51
+ register.pm sub import 59
+ Std.pm sub getopts 63
+ vars.pm sub import 65
+ Exporter.pm sub import 88
+ nicstat sub print_neat 426
+ warnings.pm sub BEGIN 598
+ DynaLoader.pm sub bootstrap 680
+ vars.pm sub BEGIN 3313
+ DynaLoader.pm sub BEGIN 4401
+ Kstat.pm sub BEGIN 7124
+ nicstat sub BEGIN 10916
+ nicstat sub fetch_net_data 42018
+ nicstat sub find_nets 52094
+
+The output showed that the most CPU time was spent in the subroutine
+find_nets(), with a total exclusive on-CPU time of 52.1 ms. This also matches
+the total inclusive time, suggesting that find_nets() didn't call other
+subroutines.
+
diff --git a/Examples/pl_flow_example.txt b/Examples/pl_flow_example.txt
new file mode 100644
index 000000000000..dcce6e04de03
--- /dev/null
+++ b/Examples/pl_flow_example.txt
@@ -0,0 +1,179 @@
+The following are examples of pl_flow.d.
+
+This is a simple script to trace the flow of Perl subroutines (functions).
+Here it traces the example program, Code/Perl/func_abc.pl.
+
+ # pl_flow.d
+ C TIME(us) FILE -- SUB
+ 0 2979519183757 func_abc.pl -> func_a
+ 0 2979520190159 func_abc.pl -> func_b
+ 0 2979521200166 func_abc.pl -> func_c
+ 0 2979522210184 func_abc.pl <- func_c
+ 0 2979522210199 func_abc.pl <- func_b
+ 0 2979522210207 func_abc.pl <- func_a
+ ^C
+
+As each subroutine is entered, the third column is indented by 2 spaces. This
+shows which subroutine is calling who - the output abovebegins by showing that
+func_a() began, and then called func_b().
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
+
+
+The following traces a Perl network interface statistics tool, "nicstat"
+version 0.99,
+
+# pl_flow.d
+ C TIME(us) FILE -- SUB
+ 0 4181899422549 nicstat -> BEGIN
+ 0 4181899423048 strict.pm -> bits
+ 0 4181899423081 strict.pm <- bits
+ 0 4181899423105 strict.pm -> import
+ 0 4181899423126 strict.pm <- import
+ 0 4181899423133 nicstat <- BEGIN
+ 0 4181899423157 nicstat -> BEGIN
+ 0 4181899445634 Exporter.pm -> import
+ 0 4181899445730 Exporter.pm <- import
+ 0 4181899445743 nicstat <- BEGIN
+ 0 4181899445770 nicstat -> BEGIN
+ 0 4181899446066 Kstat.pm -> BEGIN
+ 0 4181899446076 strict.pm -> import
+ 0 4181899446087 strict.pm <- import
+ 0 4181899446094 Kstat.pm <- BEGIN
+ 0 4181899446116 Kstat.pm -> BEGIN
+ 0 4181899453669 DynaLoader.pm -> BEGIN
+ 0 4181899453810 vars.pm -> BEGIN
+ 0 4181899453821 vars.pm <- BEGIN
+ 0 4181899453921 vars.pm -> BEGIN
+ 0 4181899454494 warnings.pm -> BEGIN
+ 0 4181899455149 warnings.pm <- BEGIN
+ 0 4181899457183 register.pm -> import
+ 0 4181899457202 register.pm -> mkMask
+ 0 4181899457214 register.pm <- mkMask
+ 0 4181899457264 register.pm -> mkMask
+ 0 4181899457274 register.pm <- mkMask
+ 0 4181899457283 register.pm <- import
+ 0 4181899457290 vars.pm <- BEGIN
+ 0 4181899457316 vars.pm -> BEGIN
+ 0 4181899457324 strict.pm -> import
+ 0 4181899457332 strict.pm -> bits
+ 0 4181899457345 strict.pm <- bits
+ 0 4181899457353 strict.pm <- import
+ 0 4181899457359 vars.pm <- BEGIN
+ 0 4181899457652 vars.pm -> import
+ 0 4181899457703 vars.pm <- import
+ 0 4181899457710 DynaLoader.pm <- BEGIN
+ 0 4181899457758 DynaLoader.pm -> BEGIN
+ 0 4181899457883 Config.pm -> BEGIN
+ 0 4181899457890 strict.pm -> import
+ 0 4181899457899 strict.pm <- import
+ 0 4181899457906 Config.pm <- BEGIN
+ 0 4181899458038 Config.pm -> BEGIN
+ 0 4181899458045 strict.pm -> unimport
+ 0 4181899458053 strict.pm -> bits
+ 0 4181899458063 strict.pm <- bits
+ 0 4181899458077 strict.pm <- unimport
+ 0 4181899458084 Config.pm <- BEGIN
+ 0 4181899458426 Config.pm -> TIEHASH
+ 0 4181899458435 Config.pm <- TIEHASH
+ 0 4181899458476 Config.pm -> import
+ 0 4181899458493 Config.pm <- import
+ 0 4181899458500 DynaLoader.pm <- BEGIN
+ 0 4181899459978 AutoLoader.pm -> BEGIN
+ 0 4181899459990 strict.pm -> import
+ 0 4181899460033 strict.pm <- import
+ 0 4181899460064 AutoLoader.pm <- BEGIN
+ 0 4181899460088 AutoLoader.pm -> BEGIN
+ 0 4181899460096 AutoLoader.pm <- BEGIN
+ 0 4181899460187 AutoLoader.pm -> BEGIN
+ 0 4181899460199 AutoLoader.pm <- BEGIN
+ 0 4181899460582 AutoLoader.pm -> BEGIN
+ 0 4181899460590 strict.pm -> unimport
+ 0 4181899460598 strict.pm -> bits
+ 0 4181899460611 strict.pm <- bits
+ 0 4181899460619 strict.pm <- unimport
+ 0 4181899460625 AutoLoader.pm <- BEGIN
+ 0 4181899460830 AutoLoader.pm -> BEGIN
+ 0 4181899460838 strict.pm -> unimport
+ 0 4181899460845 strict.pm -> bits
+ 0 4181899460855 strict.pm <- bits
+ 0 4181899460862 strict.pm <- unimport
+ 0 4181899460869 AutoLoader.pm <- BEGIN
+ 0 4181899461092 AutoLoader.pm -> BEGIN
+ 0 4181899461100 strict.pm -> unimport
+ 0 4181899461107 strict.pm -> bits
+ 0 4181899461116 strict.pm <- bits
+ 0 4181899461124 strict.pm <- unimport
+ 0 4181899461130 AutoLoader.pm <- BEGIN
+ 0 4181899461238 Config.pm -> FETCH
+ 0 4181899461250 Config.pm <- FETCH
+ 0 4181899461264 Config.pm -> FETCH
+ 0 4181899461272 Config.pm <- FETCH
+ 0 4181899461282 Config.pm -> FETCH
+ 0 4181899461290 Config.pm <- FETCH
+ 0 4181899461299 Config.pm -> FETCH
+ 0 4181899461307 Config.pm <- FETCH
+ 0 4181899461403 Kstat.pm <- BEGIN
+ 0 4181899461432 Kstat.pm -> BEGIN
+ 0 4181899461440 vars.pm -> import
+ 0 4181899461476 vars.pm <- import
+ 0 4181899461483 Kstat.pm <- BEGIN
+ 0 4181899461539 DynaLoader.pm -> bootstrap
+ 0 4181899461769 DynaLoader.pm -> dl_load_flags
+ 0 4181899461777 DynaLoader.pm <- dl_load_flags
+ 0 4181899462208 DynaLoader.pm <- bootstrap
+ 0 4181899462231 nicstat <- BEGIN
+ 0 4181899468306 Std.pm -> getopts
+ 0 4181899468351 Exporter.pm -> import
+ 0 4181899468390 Exporter.pm <- import
+ 0 4181899468405 Std.pm <- getopts
+ 0 4181899468426 nicstat -> find_nets
+ 0 4181899521011 nicstat <- find_nets
+ 0 4181899521415 nicstat -> fetch_net_data
+ 0 4181899564973 nicstat <- fetch_net_data
+ 0 4181899565526 nicstat -> print_neat
+ 0 4181899565672 nicstat <- print_neat
+ 0 4181899565680 nicstat -> print_neat
+ 0 4181899565902 nicstat <- print_neat
+ 0 4181899565909 nicstat -> print_neat
+ 0 4181899566033 nicstat <- print_neat
+ 0 4181899566039 nicstat -> print_neat
+ 0 4181899566165 nicstat <- print_neat
+ 0 4181899566172 nicstat -> print_neat
+ 0 4181899566331 nicstat <- print_neat
+ 0 4181899566338 nicstat -> print_neat
+ 0 4181899566494 nicstat <- print_neat
+ 0 4181899566791 nicstat -> print_neat
+ 0 4181899566953 nicstat <- print_neat
+ 0 4181899566961 nicstat -> print_neat
+ 0 4181899567085 nicstat <- print_neat
+ 0 4181899567091 nicstat -> print_neat
+ 0 4181899567247 nicstat <- print_neat
+ 0 4181899567254 nicstat -> print_neat
+ 0 4181899567377 nicstat <- print_neat
+ 0 4181899567383 nicstat -> print_neat
+ 0 4181899567538 nicstat <- print_neat
+ 0 4181899567544 nicstat -> print_neat
+ 0 4181899567666 nicstat <- print_neat
+ 0 4181899567977 nicstat -> print_neat
+ 0 4181899568232 nicstat <- print_neat
+ 0 4181899568240 nicstat -> print_neat
+ 0 4181899568397 nicstat <- print_neat
+ 0 4181899568404 nicstat -> print_neat
+ 0 4181899568528 nicstat <- print_neat
+ 0 4181899568535 nicstat -> print_neat
+ 0 4181899568656 nicstat <- print_neat
+ 0 4181899568663 nicstat -> print_neat
+ 0 4181899568819 nicstat <- print_neat
+ 0 4181899568826 nicstat -> print_neat
+ 0 4181899568947 nicstat <- print_neat
+ 0 4181899572708 Config.pm -> DESTROY
+ 0 4181899572735 Config.pm <- DESTROY
+
+After initialising Perl libraries and modules, the "nicstat" program ran,
+the output matching what was expected from the source.
+
diff --git a/Examples/pl_flowinfo_example.txt b/Examples/pl_flowinfo_example.txt
new file mode 100644
index 000000000000..e4b406f14c49
--- /dev/null
+++ b/Examples/pl_flowinfo_example.txt
@@ -0,0 +1,188 @@
+The following are examples of pl_flowinfo.d.
+
+This is a simple script to trace the flow of Perl subroutines (functions).
+Here it traces the example program, Code/Perl/func_abc.pl.
+
+ # pl_flowinfo.d
+ C PID DELTA(us) FILE:LINE TYPE -- SUB
+ 0 305127 2 func_abc.pl:15 sub -> func_a
+ 0 305127 1008776 func_abc.pl:9 sub -> func_b
+ 0 305127 1010019 func_abc.pl:4 sub -> func_c
+ 0 305127 1009979 func_abc.pl:4 sub <- func_c
+ 0 305127 26 func_abc.pl:9 sub <- func_b
+ 0 305127 9 func_abc.pl:15 sub <- func_a
+ ^C
+
+As each subroutine is entered, the third column is indented by 2 spaces. This
+shows which subroutine is calling who - the output abovebegins by showing that
+func_a() began, and then called func_b().
+
+The DELTA(us) column shows time from that line to the previous line, and
+so can be a bit tricky to read. For example, the second line of data output
+(skipping the header) reads as "the time from func_a() beginning to
+func_b() beginning was 1008776 us, or 1.01 seconds".
+
+The LINE column shows the line in the file what was being executed. Refer
+to the source program to see what this line refers to.
+
+If the output looks shuffled, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
+
+
+The following traces a Perl network interface statistics tool, "nicstat"
+version 0.99,
+
+# pl_flowinfo.d
+C PID DELTA(us) FILE:LINE TYPE -- SUB
+0 305132 2 nicstat:83 sub -> BEGIN
+0 305132 444 strict.pm:12 sub -> bits
+0 305132 34 strict.pm:12 sub <- bits
+0 305132 32 strict.pm:28 sub -> import
+0 305132 22 strict.pm:28 sub <- import
+0 305132 8 nicstat:83 sub <- BEGIN
+0 305132 26 nicstat:84 sub -> BEGIN
+0 305132 2339 Exporter.pm:30 sub -> import
+0 305132 83 Exporter.pm:30 sub <- import
+0 305132 14 nicstat:84 sub <- BEGIN
+0 305132 27 nicstat:85 sub -> BEGIN
+0 305132 205 Kstat.pm:34 sub -> BEGIN
+0 305132 11 strict.pm:28 sub -> import
+0 305132 11 strict.pm:28 sub <- import
+0 305132 8 Kstat.pm:34 sub <- BEGIN
+0 305132 23 Kstat.pm:35 sub -> BEGIN
+0 305132 187 DynaLoader.pm:18 sub -> BEGIN
+0 305132 73 vars.pm:3 sub -> BEGIN
+0 305132 9 vars.pm:3 sub <- BEGIN
+0 305132 34 vars.pm:7 sub -> BEGIN
+0 305132 470 warnings.pm:134 sub -> BEGIN
+0 305132 598 warnings.pm:134 sub <- BEGIN
+0 305132 2151 register.pm:37 sub -> import
+0 305132 23 register.pm:28 sub -> mkMask
+0 305132 13 register.pm:28 sub <- mkMask
+0 305132 53 register.pm:28 sub -> mkMask
+0 305132 11 register.pm:28 sub <- mkMask
+0 305132 11 register.pm:37 sub <- import
+0 305132 8 vars.pm:7 sub <- BEGIN
+0 305132 28 vars.pm:8 sub -> BEGIN
+0 305132 9 strict.pm:28 sub -> import
+0 305132 8 strict.pm:12 sub -> bits
+0 305132 13 strict.pm:12 sub <- bits
+0 305132 9 strict.pm:28 sub <- import
+0 305132 8 vars.pm:8 sub <- BEGIN
+0 305132 294 vars.pm:11 sub -> import
+0 305132 52 vars.pm:11 sub <- import
+0 305132 8 DynaLoader.pm:18 sub <- BEGIN
+0 305132 48 DynaLoader.pm:25 sub -> BEGIN
+0 305132 97 Config.pm:5 sub -> BEGIN
+0 305132 9 strict.pm:28 sub -> import
+0 305132 9 strict.pm:28 sub <- import
+0 305132 8 Config.pm:5 sub <- BEGIN
+0 305132 134 Config.pm:31 sub -> BEGIN
+0 305132 9 strict.pm:33 sub -> unimport
+0 305132 8 strict.pm:12 sub -> bits
+0 305132 11 strict.pm:12 sub <- bits
+0 305132 16 strict.pm:33 sub <- unimport
+0 305132 8 Config.pm:31 sub <- BEGIN
+0 305132 343 Config.pm:60 sub -> TIEHASH
+0 305132 10 Config.pm:60 sub <- TIEHASH
+0 305132 44 Config.pm:25 sub -> import
+0 305132 18 Config.pm:25 sub <- import
+0 305132 9 DynaLoader.pm:25 sub <- BEGIN
+0 305132 1301 AutoLoader.pm:3 sub -> BEGIN
+0 305132 11 strict.pm:28 sub -> import
+0 305132 10 strict.pm:28 sub <- import
+0 305132 9 AutoLoader.pm:3 sub <- BEGIN
+0 305132 22 AutoLoader.pm:4 sub -> BEGIN
+0 305132 9 AutoLoader.pm:4 sub <- BEGIN
+0 305132 89 AutoLoader.pm:14 sub -> BEGIN
+0 305132 13 AutoLoader.pm:14 sub <- BEGIN
+0 305132 375 AutoLoader.pm:95 sub -> BEGIN
+0 305132 9 strict.pm:33 sub -> unimport
+0 305132 8 strict.pm:12 sub -> bits
+0 305132 11 strict.pm:12 sub <- bits
+0 305132 9 strict.pm:33 sub <- unimport
+0 305132 8 AutoLoader.pm:95 sub <- BEGIN
+0 305132 203 AutoLoader.pm:128 sub -> BEGIN
+0 305132 9 strict.pm:33 sub -> unimport
+0 305132 8 strict.pm:12 sub -> bits
+0 305132 11 strict.pm:12 sub <- bits
+0 305132 9 strict.pm:33 sub <- unimport
+0 305132 8 AutoLoader.pm:128 sub <- BEGIN
+0 305132 220 AutoLoader.pm:173 sub -> BEGIN
+0 305132 9 strict.pm:33 sub -> unimport
+0 305132 8 strict.pm:12 sub -> bits
+0 305132 10 strict.pm:12 sub <- bits
+0 305132 9 strict.pm:33 sub <- unimport
+0 305132 8 AutoLoader.pm:173 sub <- BEGIN
+0 305132 103 Config.pm:52 sub -> FETCH
+0 305132 12 Config.pm:52 sub <- FETCH
+0 305132 16 Config.pm:52 sub -> FETCH
+0 305132 9 Config.pm:52 sub <- FETCH
+0 305132 11 Config.pm:52 sub -> FETCH
+0 305132 9 Config.pm:52 sub <- FETCH
+0 305132 11 Config.pm:52 sub -> FETCH
+0 305132 9 Config.pm:52 sub <- FETCH
+0 305132 95 Kstat.pm:35 sub <- BEGIN
+0 305132 29 Kstat.pm:36 sub -> BEGIN
+0 305132 10 vars.pm:11 sub -> import
+0 305132 33 vars.pm:11 sub <- import
+0 305132 8 Kstat.pm:36 sub <- BEGIN
+0 305132 56 DynaLoader.pm:133 sub -> bootstrap
+0 305132 314 DynaLoader.pm:48 sub -> dl_load_flags
+0 305132 11 DynaLoader.pm:48 sub <- dl_load_flags
+0 305132 1113 DynaLoader.pm:133 sub <- bootstrap
+0 305132 41 nicstat:85 sub <- BEGIN
+0 305132 6102 Std.pm:219 sub -> getopts
+0 305132 52 Exporter.pm:30 sub -> import
+0 305132 40 Exporter.pm:30 sub <- import
+0 305132 22 Std.pm:219 sub <- getopts
+0 305132 24 nicstat:264 sub -> find_nets
+0 305132 79662 nicstat:264 sub <- find_nets
+0 305132 420 nicstat:304 sub -> fetch_net_data
+0 305132 43871 nicstat:304 sub <- fetch_net_data
+0 305132 479 nicstat:372 sub -> print_neat
+0 305132 150 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 220 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 126 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 125 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 157 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 171 nicstat:372 sub <- print_neat
+0 305132 343 nicstat:372 sub -> print_neat
+0 305132 128 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 157 nicstat:372 sub <- print_neat
+0 305132 9 nicstat:372 sub -> print_neat
+0 305132 125 nicstat:372 sub <- print_neat
+0 305132 9 nicstat:372 sub -> print_neat
+0 305132 123 nicstat:372 sub <- print_neat
+0 305132 9 nicstat:372 sub -> print_neat
+0 305132 160 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 124 nicstat:372 sub <- print_neat
+0 305132 342 nicstat:372 sub -> print_neat
+0 305132 126 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 123 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 156 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 153 nicstat:372 sub <- print_neat
+0 305132 10 nicstat:372 sub -> print_neat
+0 305132 123 nicstat:372 sub <- print_neat
+0 305132 9 nicstat:372 sub -> print_neat
+0 305132 123 nicstat:372 sub <- print_neat
+0 305132 3736 Config.pm:63 sub -> DESTROY
+0 305132 32 Config.pm:63 sub <- DESTROY
+
+After initialising Perl libraries and modules, the "nicstat" program ran,
+the output matching what was expected from the source.
+
diff --git a/Examples/pl_flowtime_example.txt b/Examples/pl_flowtime_example.txt
new file mode 100644
index 000000000000..24c53838a9e6
--- /dev/null
+++ b/Examples/pl_flowtime_example.txt
@@ -0,0 +1,199 @@
+The following are examples of pl_flowtime.d.
+
+This is a simple script to trace the flow of Perl subroutines (functions).
+Here it traces the example program, Code/Perl/func_abc.pl.
+
+ # pl_flowtime.d
+ C TIME(us) FILE DELTA(us) -- SUB
+ 0 4201460363351 func_abc.pl 2 -> func_a
+ 0 4201461370041 func_abc.pl 1006689 -> func_b
+ 0 4201462380038 func_abc.pl 1009997 -> func_c
+ 0 4201463390094 func_abc.pl 1010055 <- func_c
+ 0 4201463390117 func_abc.pl 23 <- func_b
+ 0 4201463390126 func_abc.pl 8 <- func_a
+ ^C
+
+As each subroutine is entered, the third column is indented by 2 spaces. This
+shows which subroutine is calling who - the output above begins by showing that
+func_a() began, and then called func_b().
+
+The DELTA(us) column shows time from that line to the previous line, and
+so can be a bit tricky to read. For example, the second line of data output
+(skipping the header) reads as "the time from func_a() beginning to
+func_b() beginning was 1006689 us, or 1.01 seconds".
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
+
+
+The following traces a Perl network interface statistics tool, "nicstat"
+version 0.99,
+
+# pl_flowtime.d
+ C TIME(us) FILE DELTA(us) -- SUB
+ 0 4201691465151 nicstat 2 -> BEGIN
+ 0 4201691465593 strict.pm 441 -> bits
+ 0 4201691465625 strict.pm 32 <- bits
+ 0 4201691465655 strict.pm 29 -> import
+ 0 4201691465676 strict.pm 21 <- import
+ 0 4201691465684 nicstat 7 <- BEGIN
+ 0 4201691465710 nicstat 25 -> BEGIN
+ 0 4201691468038 Exporter.pm 2328 -> import
+ 0 4201691468121 Exporter.pm 82 <- import
+ 0 4201691468133 nicstat 12 <- BEGIN
+ 0 4201691468160 nicstat 26 -> BEGIN
+ 0 4201691468367 Kstat.pm 207 -> BEGIN
+ 0 4201691468378 strict.pm 10 -> import
+ 0 4201691468388 strict.pm 10 <- import
+ 0 4201691468396 Kstat.pm 8 <- BEGIN
+ 0 4201691468419 Kstat.pm 23 -> BEGIN
+ 0 4201691468612 DynaLoader.pm 192 -> BEGIN
+ 0 4201691468685 vars.pm 73 -> BEGIN
+ 0 4201691468694 vars.pm 8 <- BEGIN
+ 0 4201691468727 vars.pm 33 -> BEGIN
+ 0 4201691469199 warnings.pm 471 -> BEGIN
+ 0 4201691469863 warnings.pm 663 <- BEGIN
+ 0 4201691471965 register.pm 2102 -> import
+ 0 4201691471986 register.pm 21 -> mkMask
+ 0 4201691472000 register.pm 13 <- mkMask
+ 0 4201691472052 register.pm 52 -> mkMask
+ 0 4201691472063 register.pm 10 <- mkMask
+ 0 4201691472074 register.pm 10 <- import
+ 0 4201691472081 vars.pm 7 <- BEGIN
+ 0 4201691472109 vars.pm 28 -> BEGIN
+ 0 4201691472118 strict.pm 8 -> import
+ 0 4201691472126 strict.pm 8 -> bits
+ 0 4201691472139 strict.pm 12 <- bits
+ 0 4201691472148 strict.pm 9 <- import
+ 0 4201691472155 vars.pm 7 <- BEGIN
+ 0 4201691472450 vars.pm 294 -> import
+ 0 4201691472501 vars.pm 51 <- import
+ 0 4201691472509 DynaLoader.pm 7 <- BEGIN
+ 0 4201691472557 DynaLoader.pm 48 -> BEGIN
+ 0 4201691472650 Config.pm 92 -> BEGIN
+ 0 4201691472658 strict.pm 8 -> import
+ 0 4201691472667 strict.pm 8 <- import
+ 0 4201691472675 Config.pm 7 <- BEGIN
+ 0 4201691472809 Config.pm 133 -> BEGIN
+ 0 4201691472817 strict.pm 8 -> unimport
+ 0 4201691472825 strict.pm 8 -> bits
+ 0 4201691472852 strict.pm 26 <- bits
+ 0 4201691472868 strict.pm 16 <- unimport
+ 0 4201691472876 Config.pm 7 <- BEGIN
+ 0 4201691473222 Config.pm 345 -> TIEHASH
+ 0 4201691473231 Config.pm 9 <- TIEHASH
+ 0 4201691473275 Config.pm 43 -> import
+ 0 4201691473292 Config.pm 17 <- import
+ 0 4201691473301 DynaLoader.pm 8 <- BEGIN
+ 0 4201691474650 AutoLoader.pm 1349 -> BEGIN
+ 0 4201691474661 strict.pm 10 -> import
+ 0 4201691474670 strict.pm 9 <- import
+ 0 4201691474679 AutoLoader.pm 8 <- BEGIN
+ 0 4201691474701 AutoLoader.pm 21 -> BEGIN
+ 0 4201691474709 AutoLoader.pm 8 <- BEGIN
+ 0 4201691474797 AutoLoader.pm 88 -> BEGIN
+ 0 4201691474810 AutoLoader.pm 12 <- BEGIN
+ 0 4201691475186 AutoLoader.pm 376 -> BEGIN
+ 0 4201691475195 strict.pm 9 -> unimport
+ 0 4201691475203 strict.pm 7 -> bits
+ 0 4201691475214 strict.pm 10 <- bits
+ 0 4201691475223 strict.pm 8 <- unimport
+ 0 4201691475230 AutoLoader.pm 7 <- BEGIN
+ 0 4201691475435 AutoLoader.pm 204 -> BEGIN
+ 0 4201691475444 strict.pm 8 -> unimport
+ 0 4201691475451 strict.pm 7 -> bits
+ 0 4201691475462 strict.pm 10 <- bits
+ 0 4201691475470 strict.pm 8 <- unimport
+ 0 4201691475478 AutoLoader.pm 7 <- BEGIN
+ 0 4201691475697 AutoLoader.pm 219 -> BEGIN
+ 0 4201691475706 strict.pm 8 -> unimport
+ 0 4201691475714 strict.pm 7 -> bits
+ 0 4201691475724 strict.pm 10 <- bits
+ 0 4201691475732 strict.pm 8 <- unimport
+ 0 4201691475739 AutoLoader.pm 7 <- BEGIN
+ 0 4201691475842 Config.pm 102 -> FETCH
+ 0 4201691475854 Config.pm 11 <- FETCH
+ 0 4201691475870 Config.pm 15 -> FETCH
+ 0 4201691475879 Config.pm 9 <- FETCH
+ 0 4201691475890 Config.pm 10 -> FETCH
+ 0 4201691475898 Config.pm 8 <- FETCH
+ 0 4201691475909 Config.pm 10 -> FETCH
+ 0 4201691475917 Config.pm 8 <- FETCH
+ 0 4201691476012 Kstat.pm 94 <- BEGIN
+ 0 4201691476041 Kstat.pm 29 -> BEGIN
+ 0 4201691476051 vars.pm 9 -> import
+ 0 4201691476084 vars.pm 32 <- import
+ 0 4201691476091 Kstat.pm 7 <- BEGIN
+ 0 4201691476147 DynaLoader.pm 56 -> bootstrap
+ 0 4201691476373 DynaLoader.pm 225 -> dl_load_flags
+ 0 4201691476383 DynaLoader.pm 9 <- dl_load_flags
+ 0 4201691476813 DynaLoader.pm 430 <- bootstrap
+ 0 4201691476837 nicstat 23 <- BEGIN
+ 0 4201691483648 Std.pm 6811 -> getopts
+ 0 4201691483697 Exporter.pm 49 -> import
+ 0 4201691483737 Exporter.pm 39 <- import
+ 0 4201691483756 Std.pm 19 <- getopts
+ 0 4201691483780 nicstat 24 -> find_nets
+ 0 4201691539198 nicstat 55418 <- find_nets
+ 0 4201691539610 nicstat 411 -> fetch_net_data
+ 0 4201691583290 nicstat 43679 <- fetch_net_data
+ 0 4201691583781 nicstat 491 -> print_neat
+ 0 4201691583930 nicstat 149 <- print_neat
+ 0 4201691583996 nicstat 65 -> print_neat
+ 0 4201691584165 nicstat 169 <- print_neat
+ 0 4201691584174 nicstat 9 -> print_neat
+ 0 4201691584298 nicstat 124 <- print_neat
+ 0 4201691584308 nicstat 9 -> print_neat
+ 0 4201691584432 nicstat 124 <- print_neat
+ 0 4201691584473 nicstat 41 -> print_neat
+ 0 4201691584597 nicstat 123 <- print_neat
+ 0 4201691584607 nicstat 9 -> print_neat
+ 0 4201691584730 nicstat 123 <- print_neat
+ 0 4201691585091 nicstat 361 -> print_neat
+ 0 4201691585217 nicstat 125 <- print_neat
+ 0 4201691585226 nicstat 9 -> print_neat
+ 0 4201691585379 nicstat 152 <- print_neat
+ 0 4201691585389 nicstat 9 -> print_neat
+ 0 4201691585512 nicstat 123 <- print_neat
+ 0 4201691585521 nicstat 9 -> print_neat
+ 0 4201691585644 nicstat 123 <- print_neat
+ 0 4201691585653 nicstat 9 -> print_neat
+ 0 4201691585825 nicstat 171 <- print_neat
+ 0 4201691585834 nicstat 9 -> print_neat
+ 0 4201691585988 nicstat 154 <- print_neat
+ 0 4201691586274 nicstat 285 -> print_neat
+ 0 4201691586434 nicstat 160 <- print_neat
+ 0 4201691586443 nicstat 9 -> print_neat
+ 0 4201691586567 nicstat 123 <- print_neat
+ 0 4201691586576 nicstat 9 -> print_neat
+ 0 4201691586731 nicstat 154 <- print_neat
+ 0 4201691586740 nicstat 8 -> print_neat
+ 0 4201691586892 nicstat 151 <- print_neat
+ 0 4201691586901 nicstat 9 -> print_neat
+ 0 4201691587025 nicstat 123 <- print_neat
+ 0 4201691587034 nicstat 9 -> print_neat
+ 0 4201691587157 nicstat 123 <- print_neat
+ 0 4201691590909 Config.pm 3751 -> DESTROY
+ 0 4201691590938 Config.pm 29 <- DESTROY
+
+After initialising Perl libraries and modules, the "nicstat" program ran,
+the output matching what was expected from the source.
+
+The DELTA column shows that most time is spent in the find_nets() and
+fetch_nets_data() subroutines, with 55.4 ms and 44.7 ms of elapsed
+function time respectively. Those particular times were easy to interpret,
+since there were no child subroutines called, and the delta spanned
+the subroutine entry to its return.
+
+Some times get trickier to comprehend. The 2nd last line with a DELTA time
+of 3751 us, means "the time from the print_neat() subroutine completing
+to the DESTROY() subroutine starting, took 3751 us.". What is happening
+during this time? It is hard to say based on this output - since it isn't
+time within a function, rather it is time that Perl spent processing the
+main program. Since we have the last function called, we may guess where
+the program was at; or we could enhance this script to trace Perl engine
+internals as well (and/or syscalls).
+
diff --git a/Examples/pl_malloc_example.txt b/Examples/pl_malloc_example.txt
new file mode 100644
index 000000000000..a22a0082309d
--- /dev/null
+++ b/Examples/pl_malloc_example.txt
@@ -0,0 +1,79 @@
+The following are examples of pl_malloc.d.
+
+This is an expiremental script that attepmts to identify who is calling
+malloc() from Perl, and to print byte distribution plots.
+
+Here it traces the example program, Code/Perl/func_malloc.pl.
+
+# pl_malloc.d -c ./func_malloc.pl
+Function A
+Function B
+Function C
+Tracing... Hit Ctrl-C to end.
+
+Perl malloc byte distributions by engine caller,
+
+ perl`perl_alloc, total bytes = 1
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ libc.so.1`_findbuf, total bytes = 520
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ perl`Perl_safesysmalloc, total bytes = 72106
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@ 26
+ 4 |@@@@@ 72
+ 8 |@@@@@@ 101
+ 16 |@@@@@@@@@@@@@@ 216
+ 32 |@@@@@@@@@@@ 178
+ 64 |@ 21
+ 128 | 6
+ 256 | 2
+ 512 | 4
+ 1024 | 1
+ 2048 |@ 11
+ 4096 | 1
+ 8192 | 0
+
+
+Perl malloc byte distributions by Perl file and subroutine,
+
+ func_malloc.pl, func_a, bytes total = 42504
+ value ------------- Distribution ------------- count
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+ func_malloc.pl, func_b, bytes total = 100008
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 | 0
+ 32768 | 0
+ 65536 |@@@@@@@@@@@@@@@@@@@@ 1
+ 131072 | 0
+
+The func_malloc.pl program allocated around 100 Kbytes by creating a
+variable ($b) and populating it with 100,000 "b" characters. This has been
+identified in the last distribution plot printed, with one malloc event
+of between 64 Kbytes and 128 Kbytes in size. There was also a malloc event
+of between 4 and 7 bytes in size.
+
diff --git a/Examples/pl_subcalls_example.txt b/Examples/pl_subcalls_example.txt
new file mode 100644
index 000000000000..1ea0369f4ed2
--- /dev/null
+++ b/Examples/pl_subcalls_example.txt
@@ -0,0 +1,53 @@
+The following are examples of pl_subcalls.d.
+
+This is a simple script to count executed Perl subroutines. Here it traces
+an example program, Code/Perl/func_abc.pl.
+
+ # pl_subcalls.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ FILE SUB CALLS
+ func_abc.pl func_a 1
+ func_abc.pl func_b 1
+ func_abc.pl func_c 1
+
+While tracing, func_a() from the program "func_abc.pl" was executed once,
+along with func_b() and func_c().
+
+
+
+The following traces a Perl network interface statistics tool, "nicstat"
+version 0.99,
+
+ # pl_subcalls.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ FILE SUB CALLS
+ Config.pm DESTROY 1
+ Config.pm TIEHASH 1
+ Config.pm import 1
+ DynaLoader.pm bootstrap 1
+ DynaLoader.pm dl_load_flags 1
+ Std.pm getopts 1
+ nicstat fetch_net_data 1
+ nicstat find_nets 1
+ register.pm import 1
+ warnings.pm BEGIN 1
+ Config.pm BEGIN 2
+ DynaLoader.pm BEGIN 2
+ Exporter.pm import 2
+ register.pm mkMask 2
+ vars.pm import 2
+ Kstat.pm BEGIN 3
+ nicstat BEGIN 3
+ vars.pm BEGIN 3
+ Config.pm FETCH 4
+ strict.pm unimport 4
+ strict.pm import 5
+ AutoLoader.pm BEGIN 6
+ strict.pm bits 6
+ nicstat print_neat 18
+
+The number of subroutines called by nicstat can be seen above, which includes
+subroutines from libraries and modules that the program used.
+
diff --git a/Examples/pl_syscalls_example.txt b/Examples/pl_syscalls_example.txt
new file mode 100644
index 000000000000..8cd509401708
--- /dev/null
+++ b/Examples/pl_syscalls_example.txt
@@ -0,0 +1,50 @@
+The following are examples of pl_syscalls.d.
+
+This is a simple script to count executed Perl subroutines and system calls.
+Here it traces an example program, Code/Perl/func_abc.pl.
+
+ # pl_syscalls.d -c ./func_abc.pl
+ Function A
+ Tracing... Hit Ctrl-C to end.
+ Function B
+ Function C
+
+ Calls for PID 305173,
+
+ FILE TYPE NAME COUNT
+ func_abc.pl sub func_a 1
+ func_abc.pl sub func_b 1
+ func_abc.pl sub func_c 1
+ func_abc.pl syscall fcntl 1
+ func_abc.pl syscall getrlimit 1
+ func_abc.pl syscall mmap 1
+ func_abc.pl syscall munmap 1
+ func_abc.pl syscall rexit 1
+ func_abc.pl syscall schedctl 1
+ func_abc.pl syscall sigpending 1
+ func_abc.pl syscall sysi86 1
+ func_abc.pl syscall getgid 2
+ func_abc.pl syscall getpid 2
+ func_abc.pl syscall getuid 2
+ func_abc.pl syscall sigaction 2
+ func_abc.pl syscall sysconfig 2
+ func_abc.pl syscall fstat64 3
+ func_abc.pl syscall nanosleep 3
+ func_abc.pl syscall read 3
+ func_abc.pl syscall setcontext 3
+ func_abc.pl syscall write 3
+ func_abc.pl syscall close 4
+ func_abc.pl syscall ioctl 4
+ func_abc.pl syscall open64 4
+ func_abc.pl syscall llseek 5
+ func_abc.pl syscall gtime 7
+ func_abc.pl syscall brk 20
+
+While tracing, three subroutines were called - func_a(), func_b() and func_c().
+There were numerous system calls made, including 20 brk()'s, 7 gtime()'s
+and 5 llseek()'s.
+
+This script can provide an insight to how an application is interacting
+with the system, by providing both application subroutine calls and
+system calls in the same output.
+
diff --git a/Examples/pl_syscolors_example.txt b/Examples/pl_syscolors_example.txt
new file mode 100644
index 000000000000..3a5f249c9175
--- /dev/null
+++ b/Examples/pl_syscolors_example.txt
@@ -0,0 +1,183 @@
+The following are examples of pl_syscolors.d.
+
+This is a simple script to trace the flow of Perl subroutines and system
+calls made, and renders the output in color ("colour") using terminal
+escape sequences (which you can tweak by modifying the script).
+
+Here it traces the example program, Code/Perl/func_abc.pl.
+
+WARNING: This output is full of terminal escape sequences, so if you are
+trying to view this through an editor or web browser - it may look awful.
+Try viewing this using "more" (although, depending on your terminal, it
+still may look awful).
+
+# pl_syscolors.d
+C PID DELTA(us) FILE:LINE TYPE -- NAME
+0 305181 2 ":- syscall -> munmap
+0 305181 33 ":- syscall <- munmap
+0 305181 59 ":- syscall -> mmap
+0 305181 18 ":- syscall <- mmap
+0 305181 35 ":- syscall -> setcontext
+0 305181 8 ":- syscall <- setcontext
+0 305181 8 ":- syscall -> getrlimit
+0 305181 9 ":- syscall <- getrlimit
+0 305181 8 ":- syscall -> getpid
+0 305181 7 ":- syscall <- getpid
+0 305181 64 ":- syscall -> setcontext
+0 305181 6 ":- syscall <- setcontext
+0 305181 137 ":- syscall -> sigpending
+0 305181 8 ":- syscall <- sigpending
+0 305181 1148 ":- syscall -> sysi86
+0 305181 11 ":- syscall <- sysi86
+0 305181 105 ":- syscall -> open64
+0 305181 96 ":- syscall <- open64
+0 305181 13 ":- syscall -> ioctl
+0 305181 18 ":- syscall <- ioctl
+0 305181 14 ":- syscall -> close
+0 305181 14 ":- syscall <- close
+0 305181 123 ":- syscall -> sigaction
+0 305181 9 ":- syscall <- sigaction
+0 305181 49 ":- syscall -> brk
+0 305181 9 ":- syscall <- brk
+0 305181 8 ":- syscall -> brk
+0 305181 16 ":- syscall <- brk
+0 305181 63 ":- syscall -> brk
+0 305181 7 ":- syscall <- brk
+0 305181 7 ":- syscall -> brk
+0 305181 8 ":- syscall <- brk
+0 305181 43 ":- syscall -> brk
+0 305181 7 ":- syscall <- brk
+0 305181 7 ":- syscall -> brk
+0 305181 8 ":- syscall <- brk
+0 305181 141 ":- syscall -> brk
+0 305181 7 ":- syscall <- brk
+0 305181 8 ":- syscall -> brk
+0 305181 9 ":- syscall <- brk
+0 305181 24 ":- syscall -> brk
+0 305181 7 ":- syscall <- brk
+0 305181 7 ":- syscall -> brk
+0 305181 8 ":- syscall <- brk
+0 305181 30 ":- syscall -> getuid
+0 305181 7 ":- syscall <- getuid
+0 305181 10 ":- syscall -> getuid
+0 305181 6 ":- syscall <- getuid
+0 305181 10 ":- syscall -> getgid
+0 305181 7 ":- syscall <- getgid
+0 305181 9 ":- syscall -> getgid
+0 305181 6 ":- syscall <- getgid
+0 305181 117 ":- syscall -> sysconfig
+0 305181 9 ":- syscall <- sysconfig
+0 305181 19 ":- syscall -> open64
+0 305181 59 ":- syscall <- open64
+0 305181 15 ":- syscall -> read
+0 305181 11 ":- syscall <- read
+0 305181 8 ":- syscall -> close
+0 305181 8 ":- syscall <- close
+0 305181 34 ":- syscall -> gtime
+0 305181 7 ":- syscall <- gtime
+0 305181 34 ":- syscall -> brk
+0 305181 7 ":- syscall <- brk
+0 305181 7 ":- syscall -> brk
+0 305181 9 ":- syscall <- brk
+0 305181 44 ":- syscall -> sysconfig
+0 305181 7 ":- syscall <- sysconfig
+0 305181 9 ":- syscall -> brk
+0 305181 6 ":- syscall <- brk
+0 305181 7 ":- syscall -> brk
+0 305181 8 ":- syscall <- brk
+0 305181 145 ":- syscall -> open64
+0 305181 16 ":- syscall <- open64
+0 305181 16 ":- syscall -> fcntl
+0 305181 7 ":- syscall <- fcntl
+0 305181 10 ":- syscall -> sigaction
+0 305181 7 ":- syscall <- sigaction
+0 305181 8 ":- syscall -> brk
+0 305181 7 ":- syscall <- brk
+0 305181 7 ":- syscall -> brk
+0 305181 9 ":- syscall <- brk
+0 305181 104 ":- syscall -> brk
+0 305181 7 ":- syscall <- brk
+0 305181 7 ":- syscall -> brk
+0 305181 8 ":- syscall <- brk
+0 305181 88 ":- syscall -> getpid
+0 305181 7 ":- syscall <- getpid
+0 305181 8 ":- syscall -> brk
+0 305181 6 ":- syscall <- brk
+0 305181 7 ":- syscall -> brk
+0 305181 8 ":- syscall <- brk
+0 305181 105 ":- syscall -> fstat64
+0 305181 10 ":- syscall <- fstat64
+0 305181 16 ":- syscall -> fstat64
+0 305181 7 ":- syscall <- fstat64
+0 305181 25 ":- syscall -> ioctl
+0 305181 8 ":- syscall <- ioctl
+0 305181 7 ":- syscall -> read
+0 305181 23 ":- syscall <- read
+0 305181 18 ":- syscall -> llseek
+0 305181 8 ":- syscall <- llseek
+0 305181 126 ":- syscall -> llseek
+0 305181 7 ":- syscall <- llseek
+0 305181 34 ":- syscall -> llseek
+0 305181 7 ":- syscall <- llseek
+0 305181 30 ":- syscall -> llseek
+0 305181 7 ":- syscall <- llseek
+0 305181 12 ":- syscall -> read
+0 305181 8 ":- syscall <- read
+0 305181 11 ":- syscall -> llseek
+0 305181 6 ":- syscall <- llseek
+0 305181 7 ":- syscall -> close
+0 305181 8 ":- syscall <- close
+0 305181 27 func_a:15 sub -> ./func_abc.pl
+0 305181 36 ":- syscall -> ioctl
+0 305181 7 ":- syscall <- ioctl
+0 305181 8 ":- syscall -> fstat64
+0 305181 8 ":- syscall <- fstat64
+0 305181 8 ":- syscall -> brk
+0 305181 7 ":- syscall <- brk
+0 305181 7 ":- syscall -> brk
+0 305181 9 ":- syscall <- brk
+0 305181 23 ":- syscall -> fstat64
+0 305181 7 ":- syscall <- fstat64
+0 305181 13 ":- syscall -> gtime
+0 305181 7 ":- syscall <- gtime
+0 305181 11 ":- syscall -> nanosleep
+0 305181 1007250 ":- syscall <- nanosleep
+0 305181 24 ":- syscall -> gtime
+0 305181 15 ":- syscall <- gtime
+0 305181 21 func_b:9 sub -> ./func_abc.pl
+0 305181 27 ":- syscall -> gtime
+0 305181 6 ":- syscall <- gtime
+0 305181 8 ":- syscall -> nanosleep
+0 305181 1009847 ":- syscall <- nanosleep
+0 305181 24 ":- syscall -> gtime
+0 305181 15 ":- syscall <- gtime
+0 305181 21 func_c:4 sub -> ./func_abc.pl
+0 305181 27 ":- syscall -> gtime
+0 305181 6 ":- syscall <- gtime
+0 305181 8 ":- syscall -> nanosleep
+Function A
+Function B
+Function C
+0 305181 1009916 ":- syscall <- nanosleep
+0 305181 24 ":- syscall -> gtime
+0 305181 15 ":- syscall <- gtime
+0 305181 20 func_c:4 sub <- ./func_abc.pl
+0 305181 29 func_b:9 sub <- ./func_abc.pl
+0 305181 12 func_a:15 sub <- ./func_abc.pl
+0 305181 51 ":- syscall -> schedctl
+0 305181 53 ":- syscall <- schedctl
+0 305181 16 ":- syscall -> setcontext
+0 305181 8 ":- syscall <- setcontext
+0 305181 21 ":- syscall -> write
+0 305181 97 ":- syscall <- write
+0 305181 28 ":- syscall -> open64
+0 305181 101 ":- syscall <- open64
+0 305181 9 ":- syscall -> ioctl
+0 305181 10 ":- syscall <- ioctl
+0 305181 10 ":- syscall -> close
+0 305181 15 ":- syscall <- close
+0 305181 35 ":- syscall -> rexit
+
+If the colors don't suit you (or you'd rather HTML colored output), it
+should be trivial to modify the script to do so.
+
diff --git a/Examples/pl_who_example.txt b/Examples/pl_who_example.txt
new file mode 100644
index 000000000000..4ef361d69d01
--- /dev/null
+++ b/Examples/pl_who_example.txt
@@ -0,0 +1,41 @@
+The following are examples of pl_who.d.
+
+This is a simple script to see who is executing Perl subroutines. Here it
+traces as a few examples programs are executed (from Code/Perl/*.pl).
+
+ # pl_who.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID UID SUBS FILE
+ 30817 100 3 ./func_abc.pl
+ 30818 100 3 ./func_slow.pl
+ 30819 100 3 ./func_slow.pl
+
+While tracing, the user with UID 100 executed three Perl programs;
+"func_abc.pl" once getting PID 130817, and "func_slow.pl" twice. All
+programs called three subroutines.
+
+
+
+The following traces a Perl network interface statistics tool, "nicstat"
+version 0.99,
+
+ # pl_who.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID UID SUBS FILE
+ 14977 100 1 lib/Getopt/Std.pm
+ 14977 100 1 lib/warnings.pm
+ 14977 100 2 lib/Exporter.pm
+ 14977 100 3 /usr/perl5/5.8.4/lib/Sun/Solaris/Kstat.pm
+ 14977 100 3 lib/warnings/register.pm
+ 14977 100 4 lib/DynaLoader.pm
+ 14977 100 5 lib/vars.pm
+ 14977 100 6 lib/AutoLoader.pm
+ 14977 100 9 lib/Config.pm
+ 14977 100 15 lib/strict.pm
+ 14977 100 23 /tmp/nicstat
+
+This shows the location of libraries and modules from where subroutines were
+called.
+
diff --git a/Examples/priclass_example.txt b/Examples/priclass_example.txt
new file mode 100644
index 000000000000..bf63e098e62e
--- /dev/null
+++ b/Examples/priclass_example.txt
@@ -0,0 +1,82 @@
+The following is a demonstration of the priclass.d script.
+
+
+The script was run for several seconds then Ctrl-C was hit. During
+this time, other processes in different scheduling classes were
+running.
+
+ # ./priclass.d
+ Sampling... Hit Ctrl-C to end.
+ ^C
+
+ IA
+ value ------------- Distribution ------------- count
+ 40 | 0
+ 50 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 30
+ 60 | 0
+
+ SYS
+ value ------------- Distribution ------------- count
+ < 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4959
+ 0 | 0
+ 10 | 0
+ 20 | 0
+ 30 | 0
+ 40 | 0
+ 50 | 0
+ 60 | 30
+ 70 | 0
+ 80 | 0
+ 90 | 0
+ 100 | 0
+ 110 | 0
+ 120 | 0
+ 130 | 0
+ 140 | 0
+ 150 | 0
+ 160 | 50
+ >= 170 | 0
+
+ RT
+ value ------------- Distribution ------------- count
+ 90 | 0
+ 100 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 110
+ 110 | 0
+
+ TS
+ value ------------- Distribution ------------- count
+ < 0 | 0
+ 0 |@@@@@@@@@@@@@@@ 2880
+ 10 |@@@@@@@ 1280
+ 20 |@@@@@ 990
+ 30 |@@@@@ 920
+ 40 |@@@@ 670
+ 50 |@@@@ 730
+ 60 | 0
+
+The output is quite interesting, and illustrates neatly the behaviour
+of different scheduling classes.
+
+The IA interactive class had 30 samples of a 50 to 59 priority, a fairly
+high priority. This class is used for interactive processes, such as
+the windowing system. I had clicked on a few windows to create this
+activity.
+
+The SYS system class has had 4959 samples at a < 0 priority - the lowest,
+which was for the idle thread. There are a few samples at higher
+priorities, including some in the 160 to 169 range (the highest), which
+are for interrupt threads. The system class is used by the kernel.
+
+The RT real time class had 110 samples in the 100 to 109 priority range.
+This class is designed for real-time applications, those that must have
+a consistant response time regardless of other process activity. For that
+reason, the RT class trumps both TS and IA. I created these events by
+running "prstat -R" as root, which runs prstat in the real time class.
+
+The TS time sharing class is the default scheduling class for the processes
+on a Solaris system. I ran an infinite shell loop to create heavy activity,
+"while :; do :; done", which shows a profile that leans towards lower
+priorities. This is deliberate behaivour from the time sharing class, which
+reduces the priority of CPU bound processes so that they interefere less
+with I/O bound processes. The result is more samples in the lower priority
+ranges.
diff --git a/Examples/pridist_example.txt b/Examples/pridist_example.txt
new file mode 100644
index 000000000000..1f930ab03ce5
--- /dev/null
+++ b/Examples/pridist_example.txt
@@ -0,0 +1,238 @@
+The following are demonstrations of the pridist.d script.
+
+
+Here we run pridist.d for a few seconds then hit Ctrl-C,
+
+ # pridist.d
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ CMD: setiathome PID: 2190
+
+ value ------------- Distribution ------------- count
+ -5 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6629
+ 5 | 0
+
+ CMD: sshd PID: 9172
+
+ value ------------- Distribution ------------- count
+ 50 | 0
+ 55 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 60 | 0
+
+ CMD: mozilla-bin PID: 3164
+
+ value ------------- Distribution ------------- count
+ 40 | 0
+ 45 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20
+ 50 | 0
+
+ CMD: perl PID: 11544
+
+ value ------------- Distribution ------------- count
+ 10 | 0
+ 15 |@@@@@@@@ 60
+ 20 | 0
+ 25 |@@@@@@@@@@@@@@@ 120
+ 30 | 0
+ 35 |@@@@@@@@@@ 80
+ 40 | 0
+ 45 |@@@@@ 40
+ 50 | 0
+ 55 |@@@ 20
+ 60 | 0
+
+During this sample there was a CPU bound process called "setiathome"
+running, and a new CPU bound "perl" process was executed.
+
+perl, executing an infinite loop, begins with a high priority of 55 to 59
+where it is sampled 20 times. pridist.d samples 1000 times per second,
+so this equates to 20 ms. The perl process has also been sampled for 40 ms
+at priority 45 to 49, for 80 ms at priority 35 to 39, down to 60 ms at a
+priority 15 to 19 - at which point I had hit Ctrl-C to end sampling.
+
+The output is spectacular as it matches the behaviour of the dispatcher
+table for the time sharing class perfectly!
+
+setiathome is running with the lowest priority, in the 0 to 4 range.
+
+... ok, so when I say 20 samples equates 20 ms, we know that's only an
+estimate. It really means that for 20 samples that process was the one on
+the CPU. In between the samples anything may have occured (I/O bound
+processes will context switch off the CPU). DTrace can certainly be used
+to measure this based on schedular events not samples (eg, cpudist),
+however DTrace can then sometimes consume a noticable portion of the CPUs
+(for example, 2%).
+
+
+
+
+The following is a longer sample. Again, I start a new CPU bound perl
+process,
+
+ # pridist.d
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ CMD: setiathome PID: 2190
+
+ value ------------- Distribution ------------- count
+ -5 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1820
+ 5 | 0
+
+ CMD: mozilla-bin PID: 3164
+
+ value ------------- Distribution ------------- count
+ 40 | 0
+ 45 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 50 | 0
+
+ CMD: bash PID: 9185
+
+ value ------------- Distribution ------------- count
+ 50 | 0
+ 55 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 60 | 0
+
+ CMD: perl PID: 11547
+
+ value ------------- Distribution ------------- count
+ -5 | 0
+ 0 |@@@@@@@@@@@@@@@ 2020
+ 5 |@@ 200
+ 10 |@@@@@@@ 960
+ 15 |@ 160
+ 20 |@@@@@ 720
+ 25 |@ 120
+ 30 |@@@@ 480
+ 35 |@ 80
+ 40 |@@ 240
+ 45 | 40
+ 50 |@@ 240
+ 55 | 10
+ 60 | 0
+
+Now other behaviour can be observed as the perl process runs. The effect
+here is due to ts_maxwait triggering a priority boot to avoid CPU starvation;
+the priority is boosted to the 50 to 54 range, then decreases by 10 until
+it reaches 0 and another ts_maxwait is triggered. The process spends
+more time at lower priorities, as that is exactly how the TS dispatch table
+has been configured.
+
+
+
+
+Now we run prdist.d for a considerable time,
+
+ # pridist.d
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ CMD: setiathome PID: 2190
+
+ value ------------- Distribution ------------- count
+ -5 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3060
+ 5 | 0
+
+ CMD: mozilla-bin PID: 3164
+
+ value ------------- Distribution ------------- count
+ 40 | 0
+ 45 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20
+ 50 | 0
+
+ CMD: perl PID: 11549
+
+ value ------------- Distribution ------------- count
+ -5 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@ 7680
+ 5 | 0
+ 10 |@@@@@@@ 3040
+ 15 | 70
+ 20 |@@@@@@ 2280
+ 25 | 120
+ 30 |@@@@ 1580
+ 35 | 80
+ 40 |@@ 800
+ 45 | 40
+ 50 |@@ 800
+ 55 | 20
+ 60 | 0
+
+The process has settled to a pattern of 0 priority, ts_maxwait boot to 50,
+drop back to 0.
+
+Run "dispadmin -c TS -g" for a printout of the time sharing dispatcher table.
+
+
+
+
+
+The following shows running pridist.d on a completely idle system,
+
+ # pridist.d
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ CMD: sched PID: 0
+
+ value ------------- Distribution ------------- count
+ -10 | 0
+ -5 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1190
+ 0 | 0
+
+Only the kernel "sched" was sampled. It would have been running the idle
+thread.
+
+
+
+
+The following is an unusual output that is worth mentioning,
+
+ # pridist.d
+ Sampling... Hit Ctrl-C to end.
+ ^C
+ CMD: sched PID: 0
+
+ value ------------- Distribution ------------- count
+ -10 | 0
+ -5 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 940
+ 0 | 0
+ 5 | 0
+ 10 | 0
+ 15 | 0
+ 20 | 0
+ 25 | 0
+ 30 | 0
+ 35 | 0
+ 40 | 0
+ 45 | 0
+ 50 | 0
+ 55 | 0
+ 60 | 0
+ 65 | 0
+ 70 | 0
+ 75 | 0
+ 80 | 0
+ 85 | 0
+ 90 | 0
+ 95 | 0
+ 100 | 0
+ 105 | 0
+ 110 | 0
+ 115 | 0
+ 120 | 0
+ 125 | 0
+ 130 | 0
+ 135 | 0
+ 140 | 0
+ 145 | 0
+ 150 | 0
+ 155 | 0
+ 160 | 0
+ 165 | 10
+ >= 170 | 0
+
+Here we have sampled the kernel running at a priority of 165 to 169. This
+is the interrupt priority range, and would be an interrupt servicing thread.
+Eg, a network interrupt.
+
diff --git a/Examples/procsystime_example.txt b/Examples/procsystime_example.txt
new file mode 100644
index 000000000000..89f98bbca7dc
--- /dev/null
+++ b/Examples/procsystime_example.txt
@@ -0,0 +1,149 @@
+This is a demonstration of the procsystime tool, which can give details
+on how processes make use of system calls.
+
+Here we run procsystime on processes which have the name "bash",
+
+ # procsystime -n bash
+ Tracing... Hit Ctrl-C to end...
+ ^C
+
+ Elapsed Times for process bash,
+
+ SYSCALL TIME (ns)
+ setpgrp 27768
+ gtime 28692
+ lwp_sigmask 148074
+ write 235814
+ sigaction 553556
+ ioctl 776691
+ read 857401243
+
+By default procsystime prints elapsed times, the time from when the syscall
+was issued to it's completion. In the above output, we can see the read()
+syscall took the most time for this process - 8.57 seconds for all the
+reads combined. This is because the read syscall is waiting for keystrokes.
+
+
+
+Here we try the "-o" option to print CPU overhead times on "bash",
+
+ # procsystime -o -n bash
+ Tracing... Hit Ctrl-C to end...
+ ^C
+
+ CPU Times for process bash,
+
+ SYSCALL TIME (ns)
+ setpgrp 6994
+ gtime 8054
+ lwp_sigmask 33865
+ read 154895
+ sigaction 259899
+ write 343825
+ ioctl 932280
+
+This identifies which syscall type from bash is consuming the most CPU time.
+This is ioctl, at 932 microseconds. Compare this output to the default in
+the first example - both are useful for different reasons, this CPU overhead
+output helps us see why processes are consuming a lot of sys time.
+
+
+
+This demonstrates using the "-a" for all details, this time with "ssh",
+
+ # procsystime -a -n ssh
+ Tracing... Hit Ctrl-C to end...
+ ^C
+
+ Elapsed Times for processes ssh,
+
+ SYSCALL TIME (ns)
+ read 115833
+ write 302419
+ pollsys 114616076
+ TOTAL: 115034328
+
+ CPU Times for processes ssh,
+
+ SYSCALL TIME (ns)
+ read 82381
+ pollsys 201818
+ write 280390
+ TOTAL: 564589
+
+ Syscall Counts for processes ssh,
+
+ SYSCALL COUNT
+ read 4
+ write 4
+ pollsys 8
+ TOTAL: 16
+
+Now we can see elapsed times, overhead times, and syscall counts in one
+report. Very handy. We can also see totals printed as "TOTAL:".
+
+
+
+procsystime also lets us just examine one PID. For example,
+
+ # procsystime -p 1304
+ Tracing... Hit Ctrl-C to end...
+ ^C
+
+ Elapsed Times for PID 1304,
+
+ SYSCALL TIME (ns)
+ fcntl 7323
+ fstat64 21349
+ ioctl 190683
+ read 238197
+ write 1276169
+ pollsys 1005360640
+
+
+
+Here is a longer example of running procsystime on mozilla,
+
+ # procsystime -a -n mozilla-bin
+ Tracing... Hit Ctrl-C to end...
+ ^C
+
+ Elapsed Times for processes mozilla-bin,
+
+ SYSCALL TIME (ns)
+ readv 677958
+ writev 1159088
+ yield 1298742
+ read 18019194
+ write 35679619
+ ioctl 108845685
+ lwp_park 38090969432
+ pollsys 65955258781
+ TOTAL: 104211908499
+
+ CPU Times for processes mozilla-bin,
+
+ SYSCALL TIME (ns)
+ yield 120345
+ readv 398046
+ writev 1117178
+ lwp_park 8591428
+ read 9752315
+ write 29043460
+ ioctl 37089349
+ pollsys 189933470
+ TOTAL: 276045591
+
+ Syscall Counts for processes mozilla-bin,
+
+ SYSCALL COUNT
+ writev 3
+ yield 9
+ readv 58
+ lwp_park 280
+ write 1317
+ read 1744
+ pollsys 8268
+ ioctl 16434
+ TOTAL: 28113
+
diff --git a/Examples/putnexts_example.txt b/Examples/putnexts_example.txt
new file mode 100644
index 000000000000..fd7fc3db40df
--- /dev/null
+++ b/Examples/putnexts_example.txt
@@ -0,0 +1,520 @@
+The following is an example of the putnexts.d script.
+
+
+When investigating the operation of kernel streams, it can be extreamly
+useful to trace who (which stack trace) is calling putnext to who (the
+kernel modele). This script does that,
+
+# putnexts.d
+dtrace: script './putnexts.d' matched 1 probe
+^C
+
+ bufmod
+ bufmod`sbrput+0xb9
+ unix`putnext+0x1b7
+ pts`ptswput+0x1e1
+ unix`putnext+0x1b7
+ ptem`ptemwput+0x22f
+ 1
+ ip
+ ip`ip_fanout_proto+0x4d2
+ ip`ip_proto_input+0x616
+ ip`ip_fanout_proto_again+0x160
+ ip`ip_proto_input+0x530
+ ip`ip_rput+0x50d
+ 1
+ ip
+ ip`ip_wput_ipsec_out+0x60a
+ ip`ipsec_out_process+0x322
+ ip`ip_wput_ire+0x18d0
+ ip`ip_output+0x70a
+ ip`ip_wput+0x14
+ 1
+ ip
+ ip`ip_wput_ire+0x17d1
+ ip`ip_output+0x70a
+ ip`tcp_send_data+0x68c
+ ip`tcp_ack_timer+0xb0
+ ip`tcp_timer_handler+0x1d
+ 1
+ ip
+ ip`ip_udp_input+0x4e4
+ ip`ip_rput+0x540
+ unix`putnext+0x1b7
+ gld`gld_recv_tagged+0xed
+ gld`gld_recv+0x10
+ 1
+ ldterm
+ genunix`putnextctl1+0x52
+ ldterm`ldterm_dosig+0x7b
+ ldterm`ldtermrput+0x6fe
+ unix`putnext+0x1b7
+ ptem`ptemrput+0xff
+ 1
+ ldterm
+ ldterm`ldterm_ioctl_reply+0x93
+ ldterm`ldtermrput+0x186
+ genunix`qdrain_syncq+0x68
+ genunix`drain_syncq+0x1a4
+ genunix`putnext_tail+0x88
+ 1
+ ldterm
+ ldterm`ldtermrput+0x12a
+ unix`putnext+0x1b7
+ ptem`ptemrput+0xff
+ genunix`qdrain_syncq+0x68
+ genunix`drain_syncq+0x1a4
+ 1
+ ldterm
+ ldterm`ldterm_dosig+0x16f
+ ldterm`ldtermrput+0x6fe
+ unix`putnext+0x1b7
+ ptem`ptemrput+0xff
+ unix`putnext+0x1b7
+ 1
+ ldterm
+ genunix`putnextctl1+0x52
+ ldterm`ldterm_dosig+0x124
+ ldterm`ldtermrput+0x6fe
+ unix`putnext+0x1b7
+ ptem`ptemrput+0xff
+ 1
+ ldterm
+ ldterm`ldterm_do_ioctl+0xd8b
+ ldterm`ldtermwmsg+0x41
+ ldterm`ldtermwput+0x8e
+ unix`putnext+0x1b7
+ ttcompat`ttcompat_do_ioctl+0x425
+ 1
+ ldterm
+ genunix`putnextctl1+0x52
+ ldterm`ldterm_dosig+0xe3
+ ldterm`ldtermrput+0x6fe
+ unix`putnext+0x1b7
+ ptem`ptemrput+0xff
+ 1
+ ptem
+ genunix`qreply+0x23
+ ptem`ptemwmsg+0x2b9
+ ptem`ptemwput+0xe1
+ unix`putnext+0x1b7
+ ldterm`ldterm_do_ioctl+0xd8b
+ 1
+ ptem
+ ptem`ptemwput+0x22f
+ genunix`qdrain_syncq+0x68
+ genunix`drain_syncq+0x1a4
+ genunix`putnext_tail+0x88
+ unix`putnext+0x38e
+ 1
+ ptem
+ ptem`ptemrput+0xff
+ genunix`qdrain_syncq+0x68
+ genunix`drain_syncq+0x1a4
+ genunix`putnext_tail+0x88
+ unix`putnext+0x38e
+ 1
+ ptem
+ ptem`ptemwmsg+0x44d
+ ptem`ptemwput+0xe1
+ genunix`qdrain_syncq+0x68
+ genunix`drain_syncq+0x1a4
+ genunix`putnext_tail+0x88
+ 1
+ ptm
+ pts`ptswsrv+0x7c
+ genunix`runservice+0x2a
+ genunix`queue_service+0x30
+ genunix`stream_service+0x69
+ genunix`taskq_d_thread+0x8a
+ 1
+ ptm
+ pts`ptswput+0x1e1
+ unix`putnext+0x1b7
+ ptem`ptemwput+0x22f
+ genunix`qdrain_syncq+0x68
+ genunix`drain_syncq+0x1a4
+ 1
+ pts
+ genunix`qreply+0x23
+ pts`ptswput+0x201
+ unix`putnext+0x1b7
+ ptem`ptemwput+0x22f
+ genunix`qdrain_syncq+0x68
+ 1
+ strwhead
+ genunix`qreply+0x23
+ genunix`strrput_nondata+0x22d
+ genunix`strrput+0x256
+ unix`putnext+0x1b7
+ ttcompat`ttcompatrput+0x1d
+ 1
+ strwhead
+ genunix`strdoioctl+0x30d
+ genunix`strioctl+0x6ae
+ specfs`spec_ioctl+0x48
+ genunix`fop_ioctl+0x1e
+ genunix`ioctl+0x199
+ 1
+ tcp
+ ip`tcp_rput_data+0x2221
+ ip`tcp_input+0x39
+ ip`squeue_enter+0x1bf
+ ip`ip_tcp_input+0x9f8
+ ip`ip_rput+0x583
+ 1
+ ttcompat
+ ttcompat`ttcompat_ioctl_ack+0x398
+ ttcompat`ttcompatrput+0x39
+ genunix`qdrain_syncq+0x68
+ genunix`drain_syncq+0x1a4
+ genunix`putnext_tail+0x88
+ 1
+ ttcompat
+ ttcompat`ttcompatrput+0x1d
+ unix`putnext+0x1b7
+ ldterm`ldtermrput+0x12a
+ unix`putnext+0x1b7
+ ptem`ptemrput+0xff
+ 1
+ ttcompat
+ ttcompat`ttcompatrput+0x1d
+ unix`putnext+0x1b7
+ genunix`putnextctl1+0x52
+ ldterm`ldterm_dosig+0x124
+ ldterm`ldtermrput+0x6fe
+ 1
+ ttcompat
+ ttcompat`ttcompatwput+0x32
+ genunix`qdrain_syncq+0x68
+ genunix`drain_syncq+0x1a4
+ genunix`putnext_tail+0x88
+ unix`putnext+0x38e
+ 1
+ ttcompat
+ ttcompat`ttcompat_do_ioctl+0x425
+ ttcompat`ttcompatwput+0x152
+ unix`putnext+0x1b7
+ genunix`strdoioctl+0x30d
+ genunix`strioctl+0x6ae
+ 1
+ ttcompat
+ ttcompat`ttcompatrput+0x1d
+ unix`putnext+0x1b7
+ genunix`putnextctl1+0x52
+ ldterm`ldterm_dosig+0xe3
+ ldterm`ldtermrput+0x6fe
+ 1
+ tun
+ tun`tun_rdata_v4+0x58c
+ tun`tun_rproc+0x256
+ tun`tun_rput+0x23
+ unix`putnext+0x1b7
+ ip`ip_fanout_proto+0x4d2
+ 1
+ tun
+ tun`tun_wputnext_v4+0x1f8
+ tun`tun_wproc_mdata+0x71
+ tun`tun_wproc+0xdf
+ tun`tun_wput+0x23
+ unix`putnext+0x1b7
+ 1
+ udp
+ udp`udp_rput+0x975
+ unix`putnext+0x1b7
+ ip`ip_udp_input+0x4e4
+ ip`ip_rput+0x540
+ unix`putnext+0x1b7
+ 1
+ conskbd
+ genunix`qreply+0x23
+ conskbd`conskbd_mux_upstream_msg+0x24f
+ conskbd`conskbd_lqs_ack_complete+0x65
+ conskbd`conskbdlrput+0x9d
+ unix`putnext+0x1b7
+ 2
+ conskbd
+ conskbd`conskbdlwserv+0x2d
+ genunix`runservice+0x2a
+ genunix`queue_service+0x30
+ genunix`stream_service+0x69
+ genunix`taskq_d_thread+0x8a
+ 2
+ kb8042
+ genunix`qreply+0x23
+ genunix`miocack+0x2a
+ kb8042`kb8042_ioctlmsg+0x281
+ kb8042`kb8042_wsrv+0xcb
+ genunix`runservice+0x2a
+ 2
+ strwhead
+ genunix`strdoioctl+0x30d
+ genunix`strioctl+0x587
+ specfs`spec_ioctl+0x48
+ genunix`fop_ioctl+0x1e
+ genunix`ioctl+0x199
+ 2
+ consms
+ consms`consmslrput+0x15a
+ unix`putnext+0x1b7
+ vuid3ps2`vuid3ps2_putnext+0x94
+ vuid3ps2`sendButtonEvent+0x58
+ vuid3ps2`vuid3ps2+0x8ee
+ 4
+ vuid3ps2
+ vuid3ps2`vuid3ps2_putnext+0x94
+ vuid3ps2`sendButtonEvent+0x58
+ vuid3ps2`vuid3ps2+0x8ee
+ vuid3ps2`vuidmice_rsrv+0x69
+ genunix`runservice+0x2a
+ 4
+ ip
+ ip`tcp_send_data+0x55d
+ ip`tcp_ack_timer+0xb0
+ ip`tcp_timer_handler+0x1d
+ ip`squeue_drain+0xbb
+ ip`squeue_worker+0xeb
+ 10
+ ip
+ ip`tcp_send_data+0x55d
+ ip`tcp_rput_data+0x259e
+ ip`squeue_enter+0x1bf
+ ip`ip_tcp_input+0xcfb
+ ip`ip_rput+0x583
+ 11
+ ip
+ ip`ip_fanout_udp_conn+0x14b
+ ip`ip_fanout_udp+0x373
+ ip`ip_wput_local+0x16f
+ ip`ip_wput_ire+0x1436
+ ip`ip_output+0x70a
+ 14
+ strwhead
+ genunix`strput+0x168
+ genunix`strputmsg+0x1d5
+ genunix`msgio+0x142
+ genunix`putmsg+0x6e
+ unix`sys_sysenter+0xdc
+ 14
+ timod
+ timod`timodwput+0xea
+ unix`putnext+0x1b7
+ genunix`strput+0x168
+ genunix`strputmsg+0x1d5
+ genunix`msgio+0x142
+ 14
+ timod
+ timod`timodrput+0xa9
+ unix`putnext+0x1b7
+ udp`udp_rput+0x975
+ unix`putnext+0x1b7
+ ip`ip_fanout_udp_conn+0x14b
+ 14
+ udp
+ udp`udp_rput+0x975
+ unix`putnext+0x1b7
+ ip`ip_fanout_udp_conn+0x14b
+ ip`ip_fanout_udp+0x373
+ ip`ip_wput_local+0x16f
+ 14
+ udp
+ udp`udp_wput+0x378
+ unix`putnext+0x1b7
+ timod`timodwput+0xea
+ unix`putnext+0x1b7
+ genunix`strput+0x168
+ 14
+ bufmod
+ bufmod`sbsendit+0x5a
+ bufmod`sbclosechunk+0x2e
+ bufmod`sbrput+0xee
+ genunix`qdrain_syncq+0x68
+ genunix`drain_syncq+0x1a4
+ 21
+ conskbd
+ kbtrans`kbtrans_queueevent+0x5c
+ kbtrans`kbtrans_keyreleased+0x3d
+ kbtrans`kbtrans_untrans_keyreleased_raw+0x10
+ kbtrans`kbtrans_processkey+0x20
+ kbtrans`kbtrans_streams_key+0x95
+ 22
+ kb8042
+ kbtrans`kbtrans_queueevent+0x5c
+ kbtrans`kbtrans_keyreleased+0x3d
+ kbtrans`kbtrans_untrans_keyreleased_raw+0x10
+ kbtrans`kbtrans_processkey+0x20
+ kbtrans`kbtrans_streams_key+0x95
+ 22
+ ldterm
+ ldterm`ldterm_msg_upstream+0x2c
+ ldterm`vmin_satisfied+0x5e
+ ldterm`ldterm_dononcanon+0x230
+ ldterm`ldtermrmsg+0x252
+ ldterm`ldtermrput+0x7e9
+ 22
+ ttcompat
+ ttcompat`ttcompatrput+0x1d
+ unix`putnext+0x1b7
+ ldterm`ldterm_msg_upstream+0x2c
+ ldterm`vmin_satisfied+0x5e
+ ldterm`ldterm_dononcanon+0x230
+ 22
+ bufmod
+ bufmod`sbwput+0x33
+ unix`putnext+0x1b7
+ genunix`strput+0x168
+ genunix`strwrite+0x151
+ specfs`spec_write+0x4e
+ 23
+ ptem
+ ptem`ptemrput+0xff
+ unix`putnext+0x1b7
+ ptm`ptmwsrv+0x90
+ genunix`runservice+0x2a
+ genunix`queue_service+0x30
+ 23
+ pts
+ ptm`ptmwsrv+0x90
+ genunix`runservice+0x2a
+ genunix`queue_service+0x30
+ genunix`stream_runservice+0x96
+ genunix`strput+0x171
+ 23
+ conskbd
+ kbtrans`kbtrans_queueevent+0x5c
+ kbtrans`kbtrans_queuepress+0x5f
+ kbtrans`kbtrans_untrans_keypressed_raw+0x36
+ kbtrans`kbtrans_processkey+0x30
+ kbtrans`kbtrans_streams_key+0x95
+ 24
+ kb8042
+ kbtrans`kbtrans_queueevent+0x5c
+ kbtrans`kbtrans_queuepress+0x5f
+ kbtrans`kbtrans_untrans_keypressed_raw+0x36
+ kbtrans`kbtrans_processkey+0x30
+ kbtrans`kbtrans_streams_key+0x95
+ 24
+ ip
+ ip`tcp_send_data+0x55d
+ ip`tcp_output+0x562
+ ip`squeue_enter+0x1bf
+ ip`tcp_wput+0x234
+ unix`putnext+0x1b7
+ 32
+ ldterm
+ ldterm`ldtermwmsg+0x100
+ ldterm`ldtermwput+0x8e
+ unix`putnext+0x1b7
+ ttcompat`ttcompatwput+0x32
+ unix`putnext+0x1b7
+ 36
+ ptem
+ ptem`ptemwmsg+0x44d
+ ptem`ptemwput+0xe1
+ unix`putnext+0x1b7
+ ldterm`ldtermwmsg+0x100
+ ldterm`ldtermwput+0x8e
+ 36
+ ptm
+ pts`ptswsrv+0x7c
+ genunix`runservice+0x2a
+ genunix`queue_service+0x30
+ genunix`stream_runservice+0x96
+ genunix`strput+0x171
+ 36
+ ttcompat
+ ttcompat`ttcompatwput+0x32
+ unix`putnext+0x1b7
+ genunix`strput+0x168
+ genunix`strwrite+0x151
+ specfs`spec_write+0x4e
+ 36
+ tcp
+ ip`tcp_rput_data+0x2221
+ ip`squeue_enter+0x1bf
+ ip`ip_tcp_input+0xcfb
+ ip`ip_rput+0x583
+ unix`putnext+0x1b7
+ 40
+ rtls
+ gld`gld_recv_tagged+0xed
+ gld`gld_recv+0x10
+ rtls`rtls_receive+0x18f
+ rtls`rtls_gld_intr+0x133
+ gld`gld_intr+0x1e
+ 46
+ consms
+ consms`consmslrput+0x15a
+ unix`putnext+0x1b7
+ vuid3ps2`vuid3ps2_putnext+0x94
+ vuid3ps2`vuid3ps2+0x82b
+ vuid3ps2`vuidmice_rsrv+0x69
+ 59
+ strwhead
+ genunix`strput+0x168
+ genunix`strwrite+0x151
+ specfs`spec_write+0x4e
+ genunix`fop_write+0x1b
+ genunix`write+0x29a
+ 59
+ vuid3ps2
+ vuid3ps2`vuid3ps2_putnext+0x94
+ vuid3ps2`vuid3ps2+0x82b
+ vuid3ps2`vuidmice_rsrv+0x69
+ genunix`runservice+0x2a
+ genunix`queue_service+0x30
+ 59
+ consms
+ consms`consmslrput+0x15a
+ unix`putnext+0x1b7
+ vuid3ps2`vuid3ps2_putnext+0x94
+ vuid3ps2`vuid3ps2+0x809
+ vuid3ps2`vuidmice_rsrv+0x69
+ 77
+ vuid3ps2
+ vuid3ps2`vuid3ps2_putnext+0x94
+ vuid3ps2`vuid3ps2+0x809
+ vuid3ps2`vuidmice_rsrv+0x69
+ genunix`runservice+0x2a
+ genunix`queue_service+0x30
+ 77
+ strwhead
+ genunix`strput+0x168
+ genunix`strwrite+0x151
+ sockfs`socktpi_write+0xcb
+ genunix`fop_write+0x1b
+ genunix`writev+0x308
+ 108
+ rtls
+ gld`gld_passon+0x9e
+ gld`gld_sendup+0xfc
+ gld`gld_recv_tagged+0x15f
+ gld`gld_recv+0x10
+ rtls`rtls_receive+0x18f
+ 124
+ strwhead
+ genunix`strput+0x168
+ genunix`strwrite+0x151
+ sockfs`socktpi_write+0xcb
+ genunix`fop_write+0x1b
+ genunix`write+0x29a
+ 138
+ tl
+ tl`tl_wput_data_ser+0x5e
+ genunix`serializer_exec+0x1d
+ genunix`serializer_enter+0x81
+ tl`tl_serializer_enter+0x40
+ tl`tl_wput+0x1c7
+ 214
+ mouse8042
+ mouse8042`mouse8042_intr+0x68
+ i8042`i8042_intr+0xa6
+ unix`intr_thread+0x107
+ 261
+
+Highlights of the above output include,
+
+- gld calling putnext to rtls (my laptop network device driver)
+- ip receive path calling putnext to tcp
+- tcp_send_data() calling putnext to ip
+
diff --git a/Examples/py_calldist_example.txt b/Examples/py_calldist_example.txt
new file mode 100644
index 000000000000..da44430213a2
--- /dev/null
+++ b/Examples/py_calldist_example.txt
@@ -0,0 +1,966 @@
+The following are examples of py_calldist.d.
+
+This script traces the elapsed time of Python functions and prints a report in
+the form of a histogram. Here it traces the example program,
+Code/Python/func_abc.py
+
+The results are displayed in two sections, the first, Exclusive function
+elapsed times, shows us the time spent in each functions, not including time
+spent in subroutines.
+
+The third section, Inclusive function elapsed times, shows us the time spent
+in each function, this time including that time spent in subroutines called
+by those functions.
+
+It is important to pay close attention to the third column, "count" as this
+will indicate if there were any instances in a particular timeframe, even if
+the number is too small to show up on the histogram clearly.
+
+# py_calldist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Exclusive function elapsed times (us),
+ UserDict.py, func, IterableUserDict
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ __init__.py, func, CodecRegistryError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, Codec
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, StreamConverter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, StreamReader
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, StreamWriter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, getregentry
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, _Helper
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, aliasmbcs
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, setencoding
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, sethelper
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ types.py, func, _C
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ warnings.py, func, _OptionError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ warnings.py, func, _processoptions
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ UserDict.py, func, __init__
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, Codec
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamReader
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamReaderWriter
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamRecoder
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamWriter
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ os.py, func, _Environ
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ site.py, func, _Printer
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ site.py, func, setquit
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ copy_reg.py, func, constructor
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 | 0
+
+ site.py, func, __init__
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 | 0
+
+ warnings.py, func, simplefilter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ __init__.py, func, normalize_encoding
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ linecache.py, func, ?
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ posixpath.py, func, dirname
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ posixpath.py, func, split
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 8 | 0
+
+ stat.py, func, ?
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ stat.py, func, S_IFMT
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 4 | 0
+
+ UserDict.py, func, UserDict
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ os.py, func, __init__
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ posixpath.py, func, basename
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ posixpath.py, func, normcase
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@ 6
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 4 | 0
+
+ aliases.py, func, ?
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ copy_reg.py, func, pickle
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 16 |@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ posixpath.py, func, exists
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ <string>, func, ?
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 4 | 0
+ 8 | 0
+ 16 |@@@@ 1
+ 32 | 0
+
+ posixpath.py, func, isabs
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21
+ 4 |@@ 1
+ 8 | 0
+
+ stat.py, func, S_ISDIR
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 16 |@@@@@@@ 1
+ 32 | 0
+
+ UserDict.py, func, ?
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ ascii.py, func, ?
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ site.py, func, addsitepackages
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ site.py, func, removeduppaths
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ site.py, func, setcopyright
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ types.py, func, ?
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ posixpath.py, func, join
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@ 12
+ 4 |@@@@@@@@@@@@ 6
+ 8 |@@ 1
+ 16 | 0
+ 32 |@@ 1
+ 64 | 0
+
+ UserDict.py, func, DictMixin
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ __init__.py, func, search_function
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ codecs.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ copy_reg.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ os.py, func, _get_exports_list
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ site.py, func, _init_pathinfo
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ site.py, func, abs__file__
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ site.py, func, main
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ warnings.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ posixpath.py, func, normpath
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22
+ 16 | 0
+
+ posixpath.py, func, isdir
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 32 |@@@@@ 1
+ 64 |@@@@@ 1
+ 128 | 0
+
+ site.py, func, addpackage
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@ 1
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 256 | 0
+
+ posixpath.py, func, abspath
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21
+ 32 |@@ 1
+ 64 | 0
+
+ site.py, func, makepath
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14
+ 64 | 0
+
+ posixpath.py, func, ?
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ site.py, func, ?
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ site.py, func, execsitecustomize
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ site.py, func, addsitedir
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ os.py, func, _exists
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7
+ 32 |@@@@@@@@ 2
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 |@@@@ 1
+ 1024 | 0
+
+ __init__.py, func, ?
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ os.py, func, ?
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ func_abc.py, func, ?
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ func_abc.py, func, func_a
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_abc.py, func, func_b
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_abc.py, func, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+
+Inclusive function elapsed times (us),
+ UserDict.py, func, IterableUserDict
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ __init__.py, func, CodecRegistryError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, Codec
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, StreamConverter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, StreamReader
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, StreamWriter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, getregentry
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, _Helper
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, aliasmbcs
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, setencoding
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, sethelper
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ types.py, func, _C
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ warnings.py, func, _OptionError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ warnings.py, func, _processoptions
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ UserDict.py, func, __init__
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, Codec
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamReader
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamReaderWriter
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamRecoder
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamWriter
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ os.py, func, _Environ
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ site.py, func, _Printer
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ site.py, func, setquit
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ copy_reg.py, func, constructor
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 | 0
+
+ site.py, func, __init__
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 | 0
+
+ warnings.py, func, simplefilter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ __init__.py, func, normalize_encoding
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ linecache.py, func, ?
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ posixpath.py, func, split
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 8 | 0
+
+ stat.py, func, ?
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ stat.py, func, S_IFMT
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 4 | 0
+
+ UserDict.py, func, UserDict
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ os.py, func, __init__
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ posixpath.py, func, basename
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ posixpath.py, func, dirname
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ posixpath.py, func, normcase
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@ 6
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 4 | 0
+
+ aliases.py, func, ?
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ posixpath.py, func, exists
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ copy_reg.py, func, pickle
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@ 1
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ posixpath.py, func, isabs
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21
+ 4 |@@ 1
+ 8 | 0
+
+ ascii.py, func, ?
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ site.py, func, setcopyright
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ stat.py, func, S_ISDIR
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 16 |@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ types.py, func, ?
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ posixpath.py, func, join
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@ 12
+ 4 |@@@@@@@@@@@@ 6
+ 8 |@@ 1
+ 16 | 0
+ 32 |@@ 1
+ 64 | 0
+
+ UserDict.py, func, DictMixin
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ codecs.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ os.py, func, _get_exports_list
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ posixpath.py, func, normpath
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22
+ 16 | 0
+
+ UserDict.py, func, ?
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ __init__.py, func, search_function
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ copy_reg.py, func, ?
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ site.py, func, abs__file__
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ site.py, func, removeduppaths
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ warnings.py, func, ?
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ posixpath.py, func, isdir
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@ 1
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 64 |@@@@@@@@@@ 2
+ 128 | 0
+
+ posixpath.py, func, ?
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ site.py, func, _init_pathinfo
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ site.py, func, execsitecustomize
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ posixpath.py, func, abspath
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22
+ 64 | 0
+
+ os.py, func, _exists
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@ 4
+ 32 |@@@@@@@@@@@@@@@@@@@@ 5
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 |@@@@ 1
+ 1024 | 0
+
+ site.py, func, makepath
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14
+ 128 | 0
+
+ __init__.py, func, ?
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ <string>, func, ?
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
+ 4 | 0
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 |@@@@ 1
+ 2048 | 0
+
+ site.py, func, addpackage
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@ 1
+ 256 |@@@@@@@@@@@@@ 1
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ os.py, func, ?
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ site.py, func, addsitepackages
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ site.py, func, addsitedir
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ site.py, func, main
+ value ------------- Distribution ------------- count
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8192 | 0
+
+ site.py, func, ?
+ value ------------- Distribution ------------- count
+ 4096 | 0
+ 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16384 | 0
+
+ func_abc.py, func, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_abc.py, func, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_abc.py, func, ?
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+ func_abc.py, func, func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+
diff --git a/Examples/py_calltime_example.txt b/Examples/py_calltime_example.txt
new file mode 100644
index 000000000000..bda8ea898826
--- /dev/null
+++ b/Examples/py_calltime_example.txt
@@ -0,0 +1,255 @@
+The following are examples of py_calltime.d.
+
+This script traces the elapsed time of Python functions and prints a report.
+Here it traces the example program, Code/Python/func_abc.py
+
+# py_calltime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ UserDict.py func ? 1
+ UserDict.py func DictMixin 1
+ UserDict.py func IterableUserDict 1
+ UserDict.py func UserDict 1
+ UserDict.py func __init__ 1
+ __init__.py func ? 1
+ __init__.py func CodecRegistryError 1
+ __init__.py func normalize_encoding 1
+ __init__.py func search_function 1
+ aliases.py func ? 1
+ ascii.py func ? 1
+ ascii.py func Codec 1
+ ascii.py func StreamConverter 1
+ ascii.py func StreamReader 1
+ ascii.py func StreamWriter 1
+ ascii.py func getregentry 1
+ codecs.py func ? 1
+ codecs.py func Codec 1
+ codecs.py func StreamReader 1
+ codecs.py func StreamReaderWriter 1
+ codecs.py func StreamRecoder 1
+ codecs.py func StreamWriter 1
+ copy_reg.py func ? 1
+ func_abc.py func ? 1
+ func_abc.py func func_a 1
+ func_abc.py func func_b 1
+ func_abc.py func func_c 1
+ linecache.py func ? 1
+ os.py func ? 1
+ os.py func _Environ 1
+ os.py func __init__ 1
+ os.py func _get_exports_list 1
+ posixpath.py func ? 1
+ posixpath.py func basename 1
+ posixpath.py func dirname 1
+ site.py func ? 1
+ site.py func _Helper 1
+ site.py func _Printer 1
+ site.py func _init_pathinfo 1
+ site.py func abs__file__ 1
+ site.py func addsitepackages 1
+ site.py func aliasmbcs 1
+ site.py func execsitecustomize 1
+ site.py func main 1
+ site.py func removeduppaths 1
+ site.py func setcopyright 1
+ site.py func setencoding 1
+ site.py func sethelper 1
+ site.py func setquit 1
+ stat.py func ? 1
+ types.py func ? 1
+ types.py func _C 1
+ warnings.py func ? 1
+ warnings.py func _OptionError 1
+ warnings.py func _processoptions 1
+ posixpath.py func exists 2
+ posixpath.py func split 2
+ site.py func addsitedir 2
+ warnings.py func simplefilter 2
+ copy_reg.py func constructor 3
+ copy_reg.py func pickle 3
+ site.py func __init__ 3
+ site.py func addpackage 3
+ stat.py func S_IFMT 6
+ stat.py func S_ISDIR 6
+ posixpath.py func isdir 8
+ os.py func _exists 10
+ <string> func ? 11
+ posixpath.py func normcase 14
+ site.py func makepath 14
+ posixpath.py func join 20
+ posixpath.py func abspath 22
+ posixpath.py func isabs 22
+ posixpath.py func normpath 22
+ - total - 230
+
+Exclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ ascii.py func StreamWriter 2
+ ascii.py func StreamReader 2
+ site.py func setencoding 2
+ UserDict.py func IterableUserDict 2
+ __init__.py func CodecRegistryError 2
+ ascii.py func getregentry 2
+ site.py func aliasmbcs 2
+ warnings.py func _OptionError 3
+ types.py func _C 3
+ site.py func sethelper 3
+ warnings.py func _processoptions 3
+ ascii.py func StreamConverter 3
+ ascii.py func Codec 3
+ site.py func _Helper 3
+ site.py func setquit 4
+ codecs.py func StreamWriter 4
+ UserDict.py func __init__ 4
+ site.py func _Printer 4
+ codecs.py func Codec 4
+ os.py func _Environ 4
+ codecs.py func StreamRecoder 5
+ codecs.py func StreamReaderWriter 6
+ codecs.py func StreamReader 6
+ copy_reg.py func constructor 7
+ __init__.py func normalize_encoding 9
+ site.py func __init__ 10
+ warnings.py func simplefilter 11
+ linecache.py func ? 11
+ posixpath.py func split 13
+ stat.py func ? 14
+ stat.py func S_IFMT 14
+ posixpath.py func dirname 16
+ posixpath.py func basename 24
+ os.py func __init__ 26
+ posixpath.py func normcase 29
+ UserDict.py func UserDict 32
+ posixpath.py func exists 37
+ aliases.py func ? 46
+ <string> func ? 56
+ copy_reg.py func pickle 59
+ UserDict.py func ? 84
+ site.py func addsitepackages 85
+ posixpath.py func isabs 87
+ site.py func setcopyright 94
+ stat.py func S_ISDIR 98
+ posixpath.py func join 105
+ types.py func ? 106
+ site.py func removeduppaths 115
+ ascii.py func ? 122
+ os.py func _get_exports_list 136
+ site.py func _init_pathinfo 155
+ site.py func abs__file__ 158
+ codecs.py func ? 182
+ UserDict.py func DictMixin 184
+ __init__.py func search_function 205
+ site.py func main 218
+ posixpath.py func normpath 231
+ copy_reg.py func ? 239
+ posixpath.py func isdir 285
+ site.py func addpackage 419
+ site.py func addsitedir 473
+ warnings.py func ? 500
+ posixpath.py func ? 546
+ site.py func execsitecustomize 558
+ site.py func makepath 608
+ posixpath.py func abspath 646
+ os.py func _exists 925
+ __init__.py func ? 1289
+ os.py func ? 1473
+ site.py func ? 1510
+ func_abc.py func ? 1517
+ func_abc.py func func_c 1000071
+ func_abc.py func func_a 1005706
+ func_abc.py func func_b 1010158
+ - total - 3029815
+
+Inclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ ascii.py func StreamWriter 2
+ ascii.py func StreamReader 2
+ site.py func setencoding 2
+ UserDict.py func IterableUserDict 2
+ __init__.py func CodecRegistryError 2
+ ascii.py func getregentry 2
+ site.py func aliasmbcs 2
+ warnings.py func _OptionError 3
+ types.py func _C 3
+ site.py func sethelper 3
+ warnings.py func _processoptions 3
+ ascii.py func StreamConverter 3
+ ascii.py func Codec 3
+ site.py func _Helper 3
+ site.py func setquit 4
+ codecs.py func StreamWriter 4
+ UserDict.py func __init__ 4
+ site.py func _Printer 4
+ codecs.py func Codec 4
+ os.py func _Environ 4
+ codecs.py func StreamRecoder 5
+ codecs.py func StreamReaderWriter 6
+ codecs.py func StreamReader 6
+ copy_reg.py func constructor 7
+ __init__.py func normalize_encoding 9
+ site.py func __init__ 10
+ warnings.py func simplefilter 11
+ linecache.py func ? 11
+ posixpath.py func split 13
+ stat.py func ? 14
+ stat.py func S_IFMT 14
+ posixpath.py func dirname 22
+ posixpath.py func normcase 29
+ os.py func __init__ 31
+ posixpath.py func basename 31
+ UserDict.py func UserDict 32
+ posixpath.py func exists 37
+ aliases.py func ? 46
+ copy_reg.py func pickle 66
+ posixpath.py func isabs 87
+ posixpath.py func join 105
+ types.py func ? 109
+ stat.py func S_ISDIR 113
+ site.py func setcopyright 132
+ ascii.py func ? 133
+ os.py func _get_exports_list 136
+ UserDict.py func DictMixin 184
+ codecs.py func ? 210
+ posixpath.py func normpath 231
+ UserDict.py func ? 303
+ __init__.py func search_function 350
+ copy_reg.py func ? 377
+ posixpath.py func isdir 399
+ warnings.py func ? 530
+ site.py func abs__file__ 540
+ site.py func execsitecustomize 558
+ posixpath.py func ? 560
+ site.py func removeduppaths 565
+ site.py func _init_pathinfo 899
+ os.py func _exists 953
+ posixpath.py func abspath 966
+ site.py func makepath 1296
+ __init__.py func ? 1548
+ <string> func ? 1808
+ site.py func addsitepackages 2471
+ site.py func addpackage 2475
+ os.py func ? 3879
+ site.py func addsitedir 4026
+ site.py func main 4532
+ site.py func ? 9930
+ func_abc.py func func_c 1000071
+ func_abc.py func func_b 2010230
+ func_abc.py func func_a 3015936
+ func_abc.py func ? 3017454
+
+Counts shows us how many times each different function was called, and how
+many functions were called in total.
+
+The exclusive function elapsed times show the time that each function spent
+processing code - while not in other functions.
+
+The inclusive function elapsed times show the time that each function spent
+processing code, including the time spent in other calls.
+
+These elapsed times are the absolute time from when the function began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc.
+
diff --git a/Examples/py_cpudist_example.txt b/Examples/py_cpudist_example.txt
new file mode 100644
index 000000000000..3272e904387f
--- /dev/null
+++ b/Examples/py_cpudist_example.txt
@@ -0,0 +1,966 @@
+The following are examples of py_cpudist.d.
+
+This script traces the on-CPU time of Python functions and prints a report
+in the form of a histogram. Here it traces the example program,
+Code/Python/func_slow.py
+
+# py_cpudist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Exclusive function on-CPU times (us),
+ UserDict.py, func, IterableUserDict
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ __init__.py, func, CodecRegistryError
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ ascii.py, func, StreamReader
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ ascii.py, func, StreamWriter
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ ascii.py, func, getregentry
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ site.py, func, aliasmbcs
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ site.py, func, sethelper
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ types.py, func, _C
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ warnings.py, func, _OptionError
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ UserDict.py, func, __init__
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, Codec
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, StreamConverter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ codecs.py, func, Codec
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ codecs.py, func, StreamWriter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ os.py, func, _Environ
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ posixpath.py, func, basename
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ posixpath.py, func, dirname
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, _Helper
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, _Printer
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, setencoding
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, setquit
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ warnings.py, func, _processoptions
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ copy_reg.py, func, constructor
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 2 | 0
+
+ codecs.py, func, StreamReader
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamReaderWriter
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamRecoder
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ func_slow.py, func, ?
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ os.py, func, __init__
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ site.py, func, __init__
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 | 0
+
+ stat.py, func, S_IFMT
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 2 | 0
+
+ warnings.py, func, simplefilter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ __init__.py, func, normalize_encoding
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ copy_reg.py, func, pickle
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 |@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ linecache.py, func, ?
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ posixpath.py, func, split
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 8 | 0
+
+ stat.py, func, ?
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ stat.py, func, S_ISDIR
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 4 | 0
+
+ posixpath.py, func, normcase
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14
+ 2 | 0
+
+ UserDict.py, func, ?
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ UserDict.py, func, UserDict
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ site.py, func, _init_pathinfo
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ site.py, func, addsitepackages
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ site.py, func, setcopyright
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ <string>, func, ?
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@ 5
+ 2 |@@@@@@@@@@@@@@@@@@ 5
+ 4 |@@@@ 1
+ 8 | 0
+
+ posixpath.py, func, isabs
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20
+ 2 |@@@@ 2
+ 4 | 0
+
+ aliases.py, func, ?
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ ascii.py, func, ?
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ posixpath.py, func, exists
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ site.py, func, abs__file__
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ site.py, func, removeduppaths
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ site.py, func, makepath
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14
+ 8 | 0
+
+ posixpath.py, func, join
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@ 12
+ 2 |@@@@@@@@@@ 5
+ 4 |@@@@ 2
+ 8 | 0
+ 16 | 0
+ 32 |@@ 1
+ 64 | 0
+
+ codecs.py, func, ?
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ site.py, func, main
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ types.py, func, ?
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ posixpath.py, func, abspath
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22
+ 8 | 0
+
+ UserDict.py, func, DictMixin
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ __init__.py, func, search_function
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ copy_reg.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ os.py, func, _get_exports_list
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ posixpath.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ warnings.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ posixpath.py, func, isdir
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@ 1
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 32 | 0
+ 64 |@@@@@ 1
+ 128 | 0
+
+ posixpath.py, func, normpath
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@ 1
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21
+ 16 | 0
+
+ site.py, func, addpackage
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 128 |@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ site.py, func, addsitedir
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 256 | 0
+
+ site.py, func, ?
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ site.py, func, execsitecustomize
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ os.py, func, _exists
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 |@@@@ 1
+ 1024 | 0
+
+ __init__.py, func, ?
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ os.py, func, ?
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ func_slow.py, func, func_a
+ value ------------- Distribution ------------- count
+ 65536 | 0
+ 131072 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 262144 | 0
+
+ func_slow.py, func, func_b
+ value ------------- Distribution ------------- count
+ 131072 | 0
+ 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 524288 | 0
+
+ func_slow.py, func, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+
+Inclusive function on-CPU times (us),
+ UserDict.py, func, IterableUserDict
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ __init__.py, func, CodecRegistryError
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ ascii.py, func, StreamReader
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ ascii.py, func, StreamWriter
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ ascii.py, func, getregentry
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ site.py, func, aliasmbcs
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ site.py, func, sethelper
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ types.py, func, _C
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ warnings.py, func, _OptionError
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ UserDict.py, func, __init__
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, Codec
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ascii.py, func, StreamConverter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ codecs.py, func, Codec
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ codecs.py, func, StreamWriter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ os.py, func, _Environ
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, _Helper
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, _Printer
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, setencoding
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ site.py, func, setquit
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ warnings.py, func, _processoptions
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ copy_reg.py, func, constructor
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 2 | 0
+
+ codecs.py, func, StreamReader
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamReaderWriter
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ codecs.py, func, StreamRecoder
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ site.py, func, __init__
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4 | 0
+
+ stat.py, func, S_IFMT
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 2 | 0
+
+ warnings.py, func, simplefilter
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ __init__.py, func, normalize_encoding
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ linecache.py, func, ?
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ os.py, func, __init__
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ posixpath.py, func, basename
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ posixpath.py, func, dirname
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ posixpath.py, func, split
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 8 | 0
+
+ stat.py, func, ?
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ copy_reg.py, func, pickle
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 8 | 0
+
+ posixpath.py, func, normcase
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14
+ 2 | 0
+
+ UserDict.py, func, UserDict
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ stat.py, func, S_ISDIR
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 4 |@@@@@@@@@@@@@ 2
+ 8 | 0
+
+ posixpath.py, func, isabs
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20
+ 2 |@@@@ 2
+ 4 | 0
+
+ aliases.py, func, ?
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ ascii.py, func, ?
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ posixpath.py, func, exists
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ site.py, func, setcopyright
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ posixpath.py, func, join
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@ 12
+ 2 |@@@@@@@@@@ 5
+ 4 |@@@@ 2
+ 8 | 0
+ 16 | 0
+ 32 |@@ 1
+ 64 | 0
+
+ codecs.py, func, ?
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ types.py, func, ?
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ UserDict.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ UserDict.py, func, DictMixin
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ __init__.py, func, search_function
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ os.py, func, _get_exports_list
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ posixpath.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ site.py, func, abs__file__
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ site.py, func, removeduppaths
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ warnings.py, func, ?
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ posixpath.py, func, normpath
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@ 1
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21
+ 16 | 0
+
+ posixpath.py, func, isdir
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7
+ 32 | 0
+ 64 |@@@@@ 1
+ 128 | 0
+
+ posixpath.py, func, abspath
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 17
+ 16 |@@@@@@@@@ 5
+ 32 | 0
+
+ copy_reg.py, func, ?
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ site.py, func, _init_pathinfo
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ site.py, func, makepath
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 13
+ 32 | 0
+ 64 |@@@ 1
+ 128 | 0
+
+ site.py, func, execsitecustomize
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ <string>, func, ?
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@ 5
+ 2 |@@@@@@@@@@@@@@@@@@ 5
+ 4 | 0
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 |@@@@ 1
+ 1024 | 0
+
+ os.py, func, _exists
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8
+ 32 |@@@@ 1
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 |@@@@ 1
+ 1024 | 0
+
+ site.py, func, addpackage
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 256 | 0
+ 512 |@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ __init__.py, func, ?
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ site.py, func, addsitepackages
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ site.py, func, addsitedir
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 |@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ os.py, func, ?
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ site.py, func, main
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ site.py, func, ?
+ value ------------- Distribution ------------- count
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8192 | 0
+
+ func_slow.py, func, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_slow.py, func, ?
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_slow.py, func, func_a
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_slow.py, func, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+The first section, Exclusive function on-CPU times, shows us the time spent
+on-CPU by various functions, not including time spent in subroutines. You can
+see here that func_a had one instance of being on-CPU between 0.13 seconds and
+0.25 seconds.
+
+The second section, Inclusive function on-CPU times, shows us the time spent
+on-CPU by various functions, including that time spent in subroutines called
+by those functions. You can see that here func_a had an instance of being
+on-CPU between 1.0 seconds and 2.1 seconds.
+
+It is important to pay close attention to the third column, "count" as this
+will indicate if there were any instances in a particular timeframe, even if
+the number is too small to show up on the histogram clearly.
+
diff --git a/Examples/py_cputime_example.txt b/Examples/py_cputime_example.txt
new file mode 100644
index 000000000000..2f25922adc2a
--- /dev/null
+++ b/Examples/py_cputime_example.txt
@@ -0,0 +1,262 @@
+The following are examples of py_cputime.d.
+
+This script traces the on-CPU time of JavaScript functions and prints a
+report. Here it traces the example program, Code/Python/func_slow.py
+
+# py_cputime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ UserDict.py func ? 1
+ UserDict.py func DictMixin 1
+ UserDict.py func IterableUserDict 1
+ UserDict.py func UserDict 1
+ UserDict.py func __init__ 1
+ __init__.py func ? 1
+ __init__.py func CodecRegistryError 1
+ __init__.py func normalize_encoding 1
+ __init__.py func search_function 1
+ aliases.py func ? 1
+ ascii.py func ? 1
+ ascii.py func Codec 1
+ ascii.py func StreamConverter 1
+ ascii.py func StreamReader 1
+ ascii.py func StreamWriter 1
+ ascii.py func getregentry 1
+ codecs.py func ? 1
+ codecs.py func Codec 1
+ codecs.py func StreamReader 1
+ codecs.py func StreamReaderWriter 1
+ codecs.py func StreamRecoder 1
+ codecs.py func StreamWriter 1
+ copy_reg.py func ? 1
+ func_slow.py func ? 1
+ func_slow.py func func_a 1
+ func_slow.py func func_b 1
+ func_slow.py func func_c 1
+ linecache.py func ? 1
+ os.py func ? 1
+ os.py func _Environ 1
+ os.py func __init__ 1
+ os.py func _get_exports_list 1
+ posixpath.py func ? 1
+ posixpath.py func basename 1
+ posixpath.py func dirname 1
+ site.py func ? 1
+ site.py func _Helper 1
+ site.py func _Printer 1
+ site.py func _init_pathinfo 1
+ site.py func abs__file__ 1
+ site.py func addsitepackages 1
+ site.py func aliasmbcs 1
+ site.py func execsitecustomize 1
+ site.py func main 1
+ site.py func removeduppaths 1
+ site.py func setcopyright 1
+ site.py func setencoding 1
+ site.py func sethelper 1
+ site.py func setquit 1
+ stat.py func ? 1
+ types.py func ? 1
+ types.py func _C 1
+ warnings.py func ? 1
+ warnings.py func _OptionError 1
+ warnings.py func _processoptions 1
+ posixpath.py func exists 2
+ posixpath.py func split 2
+ site.py func addsitedir 2
+ warnings.py func simplefilter 2
+ copy_reg.py func constructor 3
+ copy_reg.py func pickle 3
+ site.py func __init__ 3
+ site.py func addpackage 3
+ stat.py func S_IFMT 6
+ stat.py func S_ISDIR 6
+ posixpath.py func isdir 8
+ os.py func _exists 10
+ <string> func ? 11
+ posixpath.py func normcase 14
+ site.py func makepath 14
+ posixpath.py func join 20
+ posixpath.py func abspath 22
+ posixpath.py func isabs 22
+ posixpath.py func normpath 22
+ - total - 230
+
+Exclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ ascii.py func StreamWriter 1
+ __init__.py func CodecRegistryError 1
+ ascii.py func StreamReader 1
+ site.py func setencoding 1
+ warnings.py func _OptionError 1
+ UserDict.py func IterableUserDict 1
+ site.py func aliasmbcs 1
+ warnings.py func _processoptions 1
+ types.py func _C 1
+ ascii.py func getregentry 1
+ site.py func _Helper 2
+ ascii.py func Codec 2
+ ascii.py func StreamConverter 2
+ site.py func sethelper 2
+ codecs.py func Codec 2
+ UserDict.py func __init__ 3
+ posixpath.py func dirname 3
+ posixpath.py func basename 3
+ site.py func _Printer 3
+ os.py func _Environ 3
+ codecs.py func StreamWriter 3
+ site.py func setquit 3
+ copy_reg.py func constructor 3
+ codecs.py func StreamRecoder 4
+ codecs.py func StreamReaderWriter 5
+ codecs.py func StreamReader 5
+ os.py func __init__ 6
+ func_slow.py func ? 6
+ __init__.py func normalize_encoding 7
+ site.py func __init__ 7
+ linecache.py func ? 7
+ warnings.py func simplefilter 7
+ stat.py func S_IFMT 9
+ stat.py func ? 10
+ copy_reg.py func pickle 12
+ posixpath.py func split 12
+ posixpath.py func normcase 15
+ stat.py func S_ISDIR 17
+ site.py func addsitepackages 20
+ UserDict.py func ? 20
+ site.py func setcopyright 23
+ site.py func main 24
+ <string> func ? 28
+ UserDict.py func UserDict 31
+ site.py func _init_pathinfo 33
+ posixpath.py func exists 35
+ ascii.py func ? 38
+ posixpath.py func isabs 42
+ aliases.py func ? 43
+ site.py func removeduppaths 51
+ site.py func abs__file__ 56
+ codecs.py func ? 75
+ types.py func ? 83
+ posixpath.py func join 85
+ site.py func makepath 97
+ posixpath.py func abspath 99
+ os.py func _get_exports_list 132
+ __init__.py func search_function 142
+ warnings.py func ? 171
+ UserDict.py func DictMixin 182
+ posixpath.py func ? 192
+ copy_reg.py func ? 196
+ posixpath.py func normpath 209
+ posixpath.py func isdir 255
+ site.py func addpackage 375
+ site.py func addsitedir 506
+ site.py func execsitecustomize 540
+ site.py func ? 725
+ os.py func _exists 802
+ os.py func ? 1138
+ __init__.py func ? 1199
+ func_slow.py func func_a 229669
+ func_slow.py func func_b 456371
+ func_slow.py func func_c 686056
+ - total - 1379951
+
+Inclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ ascii.py func StreamWriter 1
+ __init__.py func CodecRegistryError 1
+ ascii.py func StreamReader 1
+ site.py func setencoding 1
+ warnings.py func _OptionError 1
+ UserDict.py func IterableUserDict 1
+ site.py func aliasmbcs 1
+ warnings.py func _processoptions 1
+ types.py func _C 1
+ ascii.py func getregentry 1
+ site.py func _Helper 2
+ ascii.py func Codec 2
+ ascii.py func StreamConverter 2
+ site.py func sethelper 2
+ codecs.py func Codec 2
+ UserDict.py func __init__ 3
+ site.py func _Printer 3
+ os.py func _Environ 3
+ codecs.py func StreamWriter 3
+ site.py func setquit 3
+ copy_reg.py func constructor 3
+ codecs.py func StreamRecoder 4
+ codecs.py func StreamReaderWriter 5
+ codecs.py func StreamReader 5
+ __init__.py func normalize_encoding 7
+ site.py func __init__ 7
+ linecache.py func ? 7
+ warnings.py func simplefilter 7
+ stat.py func S_IFMT 9
+ os.py func __init__ 9
+ posixpath.py func basename 9
+ posixpath.py func dirname 10
+ stat.py func ? 10
+ posixpath.py func split 12
+ posixpath.py func normcase 15
+ copy_reg.py func pickle 15
+ stat.py func S_ISDIR 26
+ UserDict.py func UserDict 31
+ posixpath.py func exists 35
+ posixpath.py func isabs 42
+ aliases.py func ? 43
+ site.py func setcopyright 44
+ ascii.py func ? 45
+ types.py func ? 85
+ posixpath.py func join 85
+ codecs.py func ? 97
+ os.py func _get_exports_list 132
+ site.py func removeduppaths 171
+ UserDict.py func DictMixin 182
+ site.py func abs__file__ 184
+ warnings.py func ? 190
+ __init__.py func search_function 196
+ posixpath.py func ? 202
+ posixpath.py func normpath 209
+ UserDict.py func ? 235
+ posixpath.py func isdir 281
+ copy_reg.py func ? 288
+ posixpath.py func abspath 351
+ site.py func _init_pathinfo 392
+ site.py func makepath 395
+ site.py func execsitecustomize 540
+ os.py func _exists 819
+ <string> func ? 973
+ __init__.py func ? 1341
+ site.py func addpackage 1470
+ site.py func addsitepackages 1562
+ site.py func addsitedir 2420
+ site.py func main 2546
+ os.py func ? 2839
+ site.py func ? 6118
+ func_slow.py func func_c 686056
+ func_slow.py func func_b 1142427
+ func_slow.py func func_a 1372097
+ func_slow.py func ? 1372104
+
+You can see the results are printed in three sections.
+
+The first section reports how many times each function was called.
+
+The exclusive function on-CPU times shows, amongst other results that func_a
+spent around 0.22 seconds on-CPU. This times excludes time spent in
+other functions.
+
+The inclusive function on-CPU times show that func_a spent around 1.4
+seconds on-CPU. This includes the time spent in other functions called.
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the subroutine began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
diff --git a/Examples/py_flow_example.txt b/Examples/py_flow_example.txt
new file mode 100644
index 000000000000..d62269e3b03d
--- /dev/null
+++ b/Examples/py_flow_example.txt
@@ -0,0 +1,485 @@
+The following are examples of py_flow.d.
+
+This is a simple script to trace the flow of Python functions.
+Here it traces the example program, Code/Python/func_abc.py
+
+# py_flow.d
+ C TIME(us) FILE -- FUNC
+ 0 3064371810154 site.py -> ?
+ 0 3064371830069 os.py -> ?
+ 0 3064371840076 posixpath.py -> ?
+ 0 3064371840298 stat.py -> ?
+ 0 3064371840319 stat.py <- ?
+ 0 3064371840345 posixpath.py <- ?
+ 0 3064371840364 os.py -> _get_exports_list
+ 0 3064371840510 os.py <- _get_exports_list
+ 0 3064371849994 UserDict.py -> ?
+ 0 3064371850011 UserDict.py -> UserDict
+ 0 3064371850051 UserDict.py <- UserDict
+ 0 3064371850067 UserDict.py -> IterableUserDict
+ 0 3064371850075 UserDict.py <- IterableUserDict
+ 0 3064371850088 UserDict.py -> DictMixin
+ 0 3064371850291 UserDict.py <- DictMixin
+ 0 3064371850300 UserDict.py <- ?
+ 0 3064371850320 os.py -> _Environ
+ 0 3064371850330 os.py <- _Environ
+ 0 3064371850342 os.py -> __init__
+ 0 3064371850353 UserDict.py -> __init__
+ 0 3064371850363 UserDict.py <- __init__
+ 0 3064371850372 os.py <- __init__
+ 0 3064371850381 os.py -> _exists
+ 0 3064371851137 <string> -> ?
+ 0 3064371851146 <string> <- ?
+ 0 3064371851155 os.py <- _exists
+ 0 3064371851162 os.py -> _exists
+ 0 3064371851186 <string> -> ?
+ 0 3064371851195 <string> <- ?
+ 0 3064371851213 os.py <- _exists
+ 0 3064371851220 os.py -> _exists
+ 0 3064371851242 <string> -> ?
+ 0 3064371851249 <string> <- ?
+ 0 3064371851257 os.py <- _exists
+ 0 3064371851266 os.py -> _exists
+ 0 3064371851286 <string> -> ?
+ 0 3064371851293 <string> <- ?
+ 0 3064371851300 os.py <- _exists
+ 0 3064371851310 os.py -> _exists
+ 0 3064371851330 <string> -> ?
+ 0 3064371851337 <string> <- ?
+ 0 3064371851344 os.py <- _exists
+ 0 3064371851354 os.py -> _exists
+ 0 3064371851374 <string> -> ?
+ 0 3064371851381 <string> <- ?
+ 0 3064371851388 os.py <- _exists
+ 0 3064371851395 os.py -> _exists
+ 0 3064371851415 <string> -> ?
+ 0 3064371851423 <string> <- ?
+ 0 3064371851436 os.py <- _exists
+ 0 3064371851445 os.py -> _exists
+ 0 3064371851465 <string> -> ?
+ 0 3064371851473 <string> <- ?
+ 0 3064371851485 os.py <- _exists
+ 0 3064371851493 os.py -> _exists
+ 0 3064371851514 <string> -> ?
+ 0 3064371851522 <string> <- ?
+ 0 3064371851534 os.py <- _exists
+ 0 3064371851785 copy_reg.py -> ?
+ 0 3064371851996 types.py -> ?
+ 0 3064371852063 types.py -> _C
+ 0 3064371852073 types.py <- _C
+ 0 3064371852108 types.py <- ?
+ 0 3064371852129 copy_reg.py -> pickle
+ 0 3064371852139 copy_reg.py -> constructor
+ 0 3064371852147 copy_reg.py <- constructor
+ 0 3064371852155 copy_reg.py <- pickle
+ 0 3064371852166 copy_reg.py <- ?
+ 0 3064371852179 copy_reg.py -> pickle
+ 0 3064371852188 copy_reg.py -> constructor
+ 0 3064371852196 copy_reg.py <- constructor
+ 0 3064371852204 copy_reg.py <- pickle
+ 0 3064371852212 copy_reg.py -> pickle
+ 0 3064371852221 copy_reg.py -> constructor
+ 0 3064371852229 copy_reg.py <- constructor
+ 0 3064371852236 copy_reg.py <- pickle
+ 0 3064371852244 os.py -> _exists
+ 0 3064371852269 <string> -> ?
+ 0 3064371852277 <string> <- ?
+ 0 3064371852289 os.py <- _exists
+ 0 3064371852297 os.py <- ?
+ 0 3064371852330 site.py -> _Printer
+ 0 3064371852340 site.py <- _Printer
+ 0 3064371852376 site.py -> _Helper
+ 0 3064371852384 site.py <- _Helper
+ 0 3064371852416 site.py -> main
+ 0 3064371852423 site.py -> abs__file__
+ 0 3064371852434 posixpath.py -> abspath
+ 0 3064371852442 posixpath.py -> isabs
+ 0 3064371852452 posixpath.py <- isabs
+ 0 3064371852460 posixpath.py -> normpath
+ 0 3064371852482 posixpath.py <- normpath
+ 0 3064371852490 posixpath.py <- abspath
+ 0 3064371852504 posixpath.py -> abspath
+ 0 3064371852511 posixpath.py -> isabs
+ 0 3064371852520 posixpath.py <- isabs
+ 0 3064371852527 posixpath.py -> normpath
+ 0 3064371852543 posixpath.py <- normpath
+ 0 3064371852552 posixpath.py <- abspath
+ 0 3064371852560 posixpath.py -> abspath
+ 0 3064371852567 posixpath.py -> isabs
+ 0 3064371852576 posixpath.py <- isabs
+ 0 3064371852583 posixpath.py -> normpath
+ 0 3064371852598 posixpath.py <- normpath
+ 0 3064371852607 posixpath.py <- abspath
+ 0 3064371852615 posixpath.py -> abspath
+ 0 3064371852622 posixpath.py -> isabs
+ 0 3064371852631 posixpath.py <- isabs
+ 0 3064371852638 posixpath.py -> normpath
+ 0 3064371852653 posixpath.py <- normpath
+ 0 3064371852661 posixpath.py <- abspath
+ 0 3064371852674 posixpath.py -> abspath
+ 0 3064371852682 posixpath.py -> isabs
+ 0 3064371852690 posixpath.py <- isabs
+ 0 3064371852697 posixpath.py -> normpath
+ 0 3064371852713 posixpath.py <- normpath
+ 0 3064371852721 posixpath.py <- abspath
+ 0 3064371852741 posixpath.py -> abspath
+ 0 3064371852748 posixpath.py -> isabs
+ 0 3064371852757 posixpath.py <- isabs
+ 0 3064371852764 posixpath.py -> normpath
+ 0 3064371852779 posixpath.py <- normpath
+ 0 3064371852787 posixpath.py <- abspath
+ 0 3064371852804 posixpath.py -> abspath
+ 0 3064371852811 posixpath.py -> isabs
+ 0 3064371852819 posixpath.py <- isabs
+ 0 3064371852826 posixpath.py -> normpath
+ 0 3064371852842 posixpath.py <- normpath
+ 0 3064371852850 posixpath.py <- abspath
+ 0 3064371852858 posixpath.py -> abspath
+ 0 3064371852865 posixpath.py -> isabs
+ 0 3064371852874 posixpath.py <- isabs
+ 0 3064371852881 posixpath.py -> normpath
+ 0 3064371852896 posixpath.py <- normpath
+ 0 3064371852904 posixpath.py <- abspath
+ 0 3064371852915 site.py <- abs__file__
+ 0 3064371852922 site.py -> removeduppaths
+ 0 3064371852931 site.py -> makepath
+ 0 3064371852940 posixpath.py -> join
+ 0 3064371852948 posixpath.py <- join
+ 0 3064371852955 posixpath.py -> abspath
+ 0 3064371852963 posixpath.py -> isabs
+ 0 3064371852972 posixpath.py <- isabs
+ 0 3064371852980 posixpath.py -> normpath
+ 0 3064371852995 posixpath.py <- normpath
+ 0 3064371853002 posixpath.py <- abspath
+ 0 3064371853010 posixpath.py -> normcase
+ 0 3064371853018 posixpath.py <- normcase
+ 0 3064371853025 site.py <- makepath
+ 0 3064371853065 site.py -> makepath
+ 0 3064371853073 posixpath.py -> join
+ 0 3064371853081 posixpath.py <- join
+ 0 3064371853088 posixpath.py -> abspath
+ 0 3064371853096 posixpath.py -> isabs
+ 0 3064371853104 posixpath.py <- isabs
+ 0 3064371853111 posixpath.py -> normpath
+ 0 3064371853126 posixpath.py <- normpath
+ 0 3064371853134 posixpath.py <- abspath
+ 0 3064371853142 posixpath.py -> normcase
+ 0 3064371853150 posixpath.py <- normcase
+ 0 3064371853157 site.py <- makepath
+ 0 3064371853165 site.py -> makepath
+ 0 3064371853173 posixpath.py -> join
+ 0 3064371853181 posixpath.py <- join
+ 0 3064371853188 posixpath.py -> abspath
+ 0 3064371853195 posixpath.py -> isabs
+ 0 3064371853203 posixpath.py <- isabs
+ 0 3064371853210 posixpath.py -> normpath
+ 0 3064371853226 posixpath.py <- normpath
+ 0 3064371853234 posixpath.py <- abspath
+ 0 3064371853241 posixpath.py -> normcase
+ 0 3064371853249 posixpath.py <- normcase
+ 0 3064371853256 site.py <- makepath
+ 0 3064371853265 site.py -> makepath
+ 0 3064371853272 posixpath.py -> join
+ 0 3064371853280 posixpath.py <- join
+ 0 3064371853287 posixpath.py -> abspath
+ 0 3064371853294 posixpath.py -> isabs
+ 0 3064371853303 posixpath.py <- isabs
+ 0 3064371853310 posixpath.py -> normpath
+ 0 3064371853325 posixpath.py <- normpath
+ 0 3064371853333 posixpath.py <- abspath
+ 0 3064371853341 posixpath.py -> normcase
+ 0 3064371853348 posixpath.py <- normcase
+ 0 3064371853356 site.py <- makepath
+ 0 3064371853364 site.py -> makepath
+ 0 3064371853372 posixpath.py -> join
+ 0 3064371853380 posixpath.py <- join
+ 0 3064371853387 posixpath.py -> abspath
+ 0 3064371853394 posixpath.py -> isabs
+ 0 3064371853402 posixpath.py <- isabs
+ 0 3064371853409 posixpath.py -> normpath
+ 0 3064371853425 posixpath.py <- normpath
+ 0 3064371853433 posixpath.py <- abspath
+ 0 3064371853440 posixpath.py -> normcase
+ 0 3064371853448 posixpath.py <- normcase
+ 0 3064371853455 site.py <- makepath
+ 0 3064371853466 site.py <- removeduppaths
+ 0 3064371853476 posixpath.py -> basename
+ 0 3064371853484 posixpath.py -> split
+ 0 3064371853498 posixpath.py <- split
+ 0 3064371853505 posixpath.py <- basename
+ 0 3064371853513 site.py -> addsitepackages
+ 0 3064371853524 posixpath.py -> join
+ 0 3064371853538 posixpath.py <- join
+ 0 3064371853546 posixpath.py -> join
+ 0 3064371853557 posixpath.py <- join
+ 0 3064371853566 posixpath.py -> isdir
+ 0 3064371853597 stat.py -> S_ISDIR
+ 0 3064371853604 stat.py -> S_IFMT
+ 0 3064371853612 stat.py <- S_IFMT
+ 0 3064371853620 stat.py <- S_ISDIR
+ 0 3064371853627 posixpath.py <- isdir
+ 0 3064371853636 site.py -> addsitedir
+ 0 3064371853643 site.py -> makepath
+ 0 3064371853651 posixpath.py -> join
+ 0 3064371853659 posixpath.py <- join
+ 0 3064371853666 posixpath.py -> abspath
+ 0 3064371853674 posixpath.py -> isabs
+ 0 3064371853683 posixpath.py <- isabs
+ 0 3064371853691 posixpath.py -> normpath
+ 0 3064371853707 posixpath.py <- normpath
+ 0 3064371853715 posixpath.py <- abspath
+ 0 3064371853723 posixpath.py -> normcase
+ 0 3064371853730 posixpath.py <- normcase
+ 0 3064371853738 site.py <- makepath
+ 0 3064371853938 site.py -> addpackage
+ 0 3064371853948 posixpath.py -> join
+ 0 3064371853958 posixpath.py <- join
+ 0 3064371854087 <string> -> ?
+ 0 3064371854098 site.py -> addsitedir
+ 0 3064371854106 site.py -> _init_pathinfo
+ 0 3064371854115 posixpath.py -> isdir
+ 0 3064371854195 posixpath.py <- isdir
+ 0 3064371854204 posixpath.py -> isdir
+ 0 3064371854224 stat.py -> S_ISDIR
+ 0 3064371854232 stat.py -> S_IFMT
+ 0 3064371854240 stat.py <- S_IFMT
+ 0 3064371854247 stat.py <- S_ISDIR
+ 0 3064371854254 posixpath.py <- isdir
+ 0 3064371854262 site.py -> makepath
+ 0 3064371854271 posixpath.py -> join
+ 0 3064371854279 posixpath.py <- join
+ 0 3064371854286 posixpath.py -> abspath
+ 0 3064371854293 posixpath.py -> isabs
+ 0 3064371854302 posixpath.py <- isabs
+ 0 3064371854309 posixpath.py -> normpath
+ 0 3064371854325 posixpath.py <- normpath
+ 0 3064371854333 posixpath.py <- abspath
+ 0 3064371854341 posixpath.py -> normcase
+ 0 3064371854349 posixpath.py <- normcase
+ 0 3064371854356 site.py <- makepath
+ 0 3064371854364 posixpath.py -> isdir
+ 0 3064371854386 stat.py -> S_ISDIR
+ 0 3064371854393 stat.py -> S_IFMT
+ 0 3064371854400 stat.py <- S_IFMT
+ 0 3064371854408 stat.py <- S_ISDIR
+ 0 3064371854415 posixpath.py <- isdir
+ 0 3064371854423 site.py -> makepath
+ 0 3064371854431 posixpath.py -> join
+ 0 3064371854438 posixpath.py <- join
+ 0 3064371854446 posixpath.py -> abspath
+ 0 3064371854453 posixpath.py -> isabs
+ 0 3064371854461 posixpath.py <- isabs
+ 0 3064371854469 posixpath.py -> normpath
+ 0 3064371854485 posixpath.py <- normpath
+ 0 3064371854493 posixpath.py <- abspath
+ 0 3064371854500 posixpath.py -> normcase
+ 0 3064371854508 posixpath.py <- normcase
+ 0 3064371854516 site.py <- makepath
+ 0 3064371854524 posixpath.py -> isdir
+ 0 3064371854556 stat.py -> S_ISDIR
+ 0 3064371854563 stat.py -> S_IFMT
+ 0 3064371854571 stat.py <- S_IFMT
+ 0 3064371854578 stat.py <- S_ISDIR
+ 0 3064371854585 posixpath.py <- isdir
+ 0 3064371854593 site.py -> makepath
+ 0 3064371854601 posixpath.py -> join
+ 0 3064371854609 posixpath.py <- join
+ 0 3064371854616 posixpath.py -> abspath
+ 0 3064371854624 posixpath.py -> isabs
+ 0 3064371854632 posixpath.py <- isabs
+ 0 3064371854639 posixpath.py -> normpath
+ 0 3064371854655 posixpath.py <- normpath
+ 0 3064371854663 posixpath.py <- abspath
+ 0 3064371854671 posixpath.py -> normcase
+ 0 3064371854679 posixpath.py <- normcase
+ 0 3064371854686 site.py <- makepath
+ 0 3064371854694 posixpath.py -> isdir
+ 0 3064371854715 stat.py -> S_ISDIR
+ 0 3064371854722 stat.py -> S_IFMT
+ 0 3064371854730 stat.py <- S_IFMT
+ 0 3064371854737 stat.py <- S_ISDIR
+ 0 3064371854744 posixpath.py <- isdir
+ 0 3064371854752 site.py -> makepath
+ 0 3064371854759 posixpath.py -> join
+ 0 3064371854767 posixpath.py <- join
+ 0 3064371854774 posixpath.py -> abspath
+ 0 3064371854782 posixpath.py -> isabs
+ 0 3064371854790 posixpath.py <- isabs
+ 0 3064371854797 posixpath.py -> normpath
+ 0 3064371854813 posixpath.py <- normpath
+ 0 3064371854821 posixpath.py <- abspath
+ 0 3064371854829 posixpath.py -> normcase
+ 0 3064371854837 posixpath.py <- normcase
+ 0 3064371854844 site.py <- makepath
+ 0 3064371854852 posixpath.py -> isdir
+ 0 3064371854872 stat.py -> S_ISDIR
+ 0 3064371854879 stat.py -> S_IFMT
+ 0 3064371854887 stat.py <- S_IFMT
+ 0 3064371854894 stat.py <- S_ISDIR
+ 0 3064371854901 posixpath.py <- isdir
+ 0 3064371854909 site.py -> makepath
+ 0 3064371854917 posixpath.py -> join
+ 0 3064371854925 posixpath.py <- join
+ 0 3064371854932 posixpath.py -> abspath
+ 0 3064371854939 posixpath.py -> isabs
+ 0 3064371854947 posixpath.py <- isabs
+ 0 3064371854954 posixpath.py -> normpath
+ 0 3064371854970 posixpath.py <- normpath
+ 0 3064371854978 posixpath.py <- abspath
+ 0 3064371854986 posixpath.py -> normcase
+ 0 3064371854994 posixpath.py <- normcase
+ 0 3064371855001 site.py <- makepath
+ 0 3064371855009 site.py <- _init_pathinfo
+ 0 3064371855016 site.py -> makepath
+ 0 3064371855024 posixpath.py -> join
+ 0 3064371855032 posixpath.py <- join
+ 0 3064371855039 posixpath.py -> abspath
+ 0 3064371855047 posixpath.py -> isabs
+ 0 3064371855055 posixpath.py <- isabs
+ 0 3064371855063 posixpath.py -> normpath
+ 0 3064371855078 posixpath.py <- normpath
+ 0 3064371855086 posixpath.py <- abspath
+ 0 3064371855094 posixpath.py -> normcase
+ 0 3064371855101 posixpath.py <- normcase
+ 0 3064371855144 site.py <- makepath
+ 0 3064371855318 site.py -> addpackage
+ 0 3064371855327 posixpath.py -> join
+ 0 3064371855337 posixpath.py <- join
+ 0 3064371855411 site.py -> makepath
+ 0 3064371855420 posixpath.py -> join
+ 0 3064371855430 posixpath.py <- join
+ 0 3064371855437 posixpath.py -> abspath
+ 0 3064371855445 posixpath.py -> isabs
+ 0 3064371855453 posixpath.py <- isabs
+ 0 3064371855460 posixpath.py -> normpath
+ 0 3064371855477 posixpath.py <- normpath
+ 0 3064371855485 posixpath.py <- abspath
+ 0 3064371855493 posixpath.py -> normcase
+ 0 3064371855501 posixpath.py <- normcase
+ 0 3064371855509 site.py <- makepath
+ 0 3064371855517 posixpath.py -> exists
+ 0 3064371855542 posixpath.py <- exists
+ 0 3064371855591 site.py <- addpackage
+ 0 3064371855611 site.py -> addpackage
+ 0 3064371855618 posixpath.py -> join
+ 0 3064371855628 posixpath.py <- join
+ 0 3064371855683 site.py -> makepath
+ 0 3064371855692 posixpath.py -> join
+ 0 3064371855739 posixpath.py <- join
+ 0 3064371855747 posixpath.py -> abspath
+ 0 3064371855754 posixpath.py -> isabs
+ 0 3064371855763 posixpath.py <- isabs
+ 0 3064371855770 posixpath.py -> normpath
+ 0 3064371855788 posixpath.py <- normpath
+ 0 3064371855796 posixpath.py <- abspath
+ 0 3064371855803 posixpath.py -> normcase
+ 0 3064371855811 posixpath.py <- normcase
+ 0 3064371855818 site.py <- makepath
+ 0 3064371855826 posixpath.py -> exists
+ 0 3064371855851 posixpath.py <- exists
+ 0 3064371855880 site.py <- addpackage
+ 0 3064371855892 site.py <- addsitedir
+ 0 3064371855900 <string> <- ?
+ 0 3064371855915 site.py <- addpackage
+ 0 3064371855923 site.py <- addsitedir
+ 0 3064371855932 posixpath.py -> isdir
+ 0 3064371855965 posixpath.py <- isdir
+ 0 3064371855973 site.py <- addsitepackages
+ 0 3064371855982 site.py -> setquit
+ 0 3064371855993 site.py <- setquit
+ 0 3064371856000 site.py -> setcopyright
+ 0 3064371856009 site.py -> __init__
+ 0 3064371856019 site.py <- __init__
+ 0 3064371856028 site.py -> __init__
+ 0 3064371856037 site.py <- __init__
+ 0 3064371856045 posixpath.py -> dirname
+ 0 3064371856052 posixpath.py -> split
+ 0 3064371856065 posixpath.py <- split
+ 0 3064371856073 posixpath.py <- dirname
+ 0 3064371856085 posixpath.py -> join
+ 0 3064371856096 posixpath.py <- join
+ 0 3064371856104 site.py -> __init__
+ 0 3064371856113 site.py <- __init__
+ 0 3064371856121 site.py <- setcopyright
+ 0 3064371856128 site.py -> sethelper
+ 0 3064371856136 site.py <- sethelper
+ 0 3064371856143 site.py -> aliasmbcs
+ 0 3064371856151 site.py <- aliasmbcs
+ 0 3064371856158 site.py -> setencoding
+ 0 3064371856166 site.py <- setencoding
+ 0 3064371856173 site.py -> execsitecustomize
+ 0 3064371871773 site.py <- execsitecustomize
+ 0 3064371871794 site.py <- main
+ 0 3064371871805 site.py <- ?
+ 0 3064371872141 warnings.py -> ?
+ 0 306437187232e linecache.py -> ?
+ 0 3064371872336 linecache.py <- ?
+ 0 3064371872352 warnings.py -> _OptionError
+ 0 3064371872361 warnings.py <- _OptionError
+ 0 3064371872378 warnings.py -> _processoptions
+ 0 3064371872387 warnings.py <- _processoptions
+ 0 3064371872397 warnings.py -> simplefilter
+ 0 3064371872410 warnings.py <- simplefilter
+ 0 3064371872418 warnings.py -> simplefilter
+ 0 3064371872428 warnings.py <- simplefilter
+ 0 3064371872436 warnings.py <- ?
+ 0 3064371886557 __init__.py -> ?
+ 0 3064371891761 codecs.py -> ?
+ 0 3064371891836 codecs.py -> Codec
+ 0 3064371891848 codecs.py <- Codec
+ 0 3064371891864 codecs.py -> StreamWriter
+ 0 3064371891874 codecs.py <- StreamWriter
+ 0 3064371891885 codecs.py -> StreamReader
+ 0 3064371891897 codecs.py <- StreamReader
+ 0 3064371891907 codecs.py -> StreamReaderWriter
+ 0 3064371891918 codecs.py <- StreamReaderWriter
+ 0 3064371891926 codecs.py -> StreamRecoder
+ 0 3064371891938 codecs.py <- StreamRecoder
+ 0 3064371891953 codecs.py <- ?
+ 0 3064371902521 aliases.py -> ?
+ 0 3064371902580 aliases.py <- ?
+ 0 3064371902605 __init__.py -> CodecRegistryError
+ 0 3064371902614 __init__.py <- CodecRegistryError
+ 0 3064371902636 __init__.py <- ?
+ 0 3064371902655 __init__.py -> search_function
+ 0 3064371902666 __init__.py -> normalize_encoding
+ 0 3064371902682 __init__.py <- normalize_encoding
+ 0 3064371902888 ascii.py -> ?
+ 0 3064371902900 ascii.py -> Codec
+ 0 3064371902909 ascii.py <- Codec
+ 0 3064371902922 ascii.py -> StreamWriter
+ 0 3064371902930 ascii.py <- StreamWriter
+ 0 3064371902941 ascii.py -> StreamReader
+ 0 3064371902949 ascii.py <- StreamReader
+ 0 3064371902972 ascii.py -> StreamConverter
+ 0 3064371902981 ascii.py <- StreamConverter
+ 0 3064371902993 ascii.py <- ?
+ 0 3064371903009 ascii.py -> getregentry
+ 0 3064371903018 ascii.py <- getregentry
+ 0 3064371903044 __init__.py <- search_function
+ 0 3064371903414 func_abc.py -> ?
+ 0 3064371933251 func_abc.py -> func_a
+ 0 3064372940696 func_abc.py -> func_b
+ 0 3064373950608 func_abc.py -> func_c
+ 0 3064374960497 func_abc.py <- func_c
+ 0 3064374960512 func_abc.py <- func_b
+ 0 3064374960520 func_abc.py <- func_a
+ 0 3064374960528 func_abc.py <- ?
+^C
+
+Here we can see that Python has done extensive pre-processing before it runs
+the Code/Python/func_abc.py program itself.
+
+This shows which function is calling which - the output above ends by
+showing that func_a called func_b which in turn called func_c etc.
+
+The TIME(us) column shows time from boot in microseconds.
+
+The FILE column shows the file that was being executed.
+
+If the output looks strange, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/py_flowinfo_example.txt b/Examples/py_flowinfo_example.txt
new file mode 100644
index 000000000000..f93dc09b89d8
--- /dev/null
+++ b/Examples/py_flowinfo_example.txt
@@ -0,0 +1,485 @@
+Following are examples of py_flowinfo.d.
+
+This is a simple script to trace the flow of Python functions. Here it traces
+the flow into and out of libraries and the example program,
+Code/Python/func_abc.py.
+
+# py_flowinfo.d
+C PID DELTA(us) FILE:LINE TYPE -- FUNC
+0 145424 3 site.py:58 func -> ?
+0 145424 1375 os.py:22 func -> ?
+0 145424 692 posixpath.py:11 func -> ?
+0 145424 184 stat.py:4 func -> ?
+0 145424 21 stat.py:86 func <- ?
+0 145424 32 posixpath.py:454 func <- ?
+0 145424 18 os.py:34 func -> _get_exports_list
+0 145424 135 os.py:38 func <- _get_exports_list
+0 145424 261 UserDict.py:1 func -> ?
+0 145424 11 UserDict.py:3 func -> UserDict
+0 145424 36 UserDict.py:71 func <- UserDict
+0 145424 16 UserDict.py:73 func -> IterableUserDict
+0 145424 9 UserDict.py:74 func <- IterableUserDict
+0 145424 13 UserDict.py:77 func -> DictMixin
+0 145424 174 UserDict.py:169 func <- DictMixin
+0 145424 11 UserDict.py:77 func <- ?
+0 145424 17 os.py:458 func -> _Environ
+0 145424 11 os.py:489 func <- _Environ
+0 145424 13 os.py:459 func -> __init__
+0 145424 11 UserDict.py:4 func -> __init__
+0 145424 11 UserDict.py:9 func <- __init__
+0 145424 10 os.py:461 func <- __init__
+0 145424 11 os.py:501 func -> _exists
+0 145424 604 <string>:0 func -> ?
+0 145424 10 <string>:0 func <- ?
+0 145424 9 os.py:504 func <- _exists
+0 145424 9 os.py:501 func -> _exists
+0 145424 24 <string>:0 func -> ?
+0 145424 9 <string>:0 func <- ?
+0 145424 15 os.py:506 func <- _exists
+0 145424 9 os.py:501 func -> _exists
+0 145424 23 <string>:0 func -> ?
+0 145424 8 <string>:0 func <- ?
+0 145424 9 os.py:504 func <- _exists
+0 145424 26 os.py:501 func -> _exists
+0 145424 23 <string>:0 func -> ?
+0 145424 8 <string>:0 func <- ?
+0 145424 8 os.py:504 func <- _exists
+0 145424 11 os.py:501 func -> _exists
+0 145424 22 <string>:0 func -> ?
+0 145424 8 <string>:0 func <- ?
+0 145424 8 os.py:504 func <- _exists
+0 145424 11 os.py:501 func -> _exists
+0 145424 22 <string>:0 func -> ?
+0 145424 8 <string>:0 func <- ?
+0 145424 8 os.py:504 func <- _exists
+0 145424 9 os.py:501 func -> _exists
+0 145424 21 <string>:0 func -> ?
+0 145424 9 <string>:0 func <- ?
+0 145424 14 os.py:506 func <- _exists
+0 145424 10 os.py:501 func -> _exists
+0 145424 22 <string>:0 func -> ?
+0 145424 9 <string>:0 func <- ?
+0 145424 13 os.py:506 func <- _exists
+0 145424 11 os.py:501 func -> _exists
+0 145424 22 <string>:0 func -> ?
+0 145424 8 <string>:0 func <- ?
+0 145424 13 os.py:506 func <- _exists
+0 145424 181 copy_reg.py:5 func -> ?
+0 145424 181 types.py:4 func -> ?
+0 145424 64 types.py:55 func -> _C
+0 145424 10 types.py:56 func <- _C
+0 145424 35 types.py:89 func <- ?
+0 145424 22 copy_reg.py:14 func -> pickle
+0 145424 11 copy_reg.py:27 func -> constructor
+0 145424 9 copy_reg.py:29 func <- constructor
+0 145424 9 copy_reg.py:25 func <- pickle
+0 145424 12 copy_reg.py:175 func <- ?
+0 145424 15 copy_reg.py:14 func -> pickle
+0 145424 10 copy_reg.py:27 func -> constructor
+0 145424 9 copy_reg.py:29 func <- constructor
+0 145424 9 copy_reg.py:25 func <- pickle
+0 145424 10 copy_reg.py:14 func -> pickle
+0 145424 10 copy_reg.py:27 func -> constructor
+0 145424 9 copy_reg.py:29 func <- constructor
+0 145424 9 copy_reg.py:25 func <- pickle
+0 145424 9 os.py:501 func -> _exists
+0 145424 26 <string>:0 func -> ?
+0 145424 9 <string>:0 func <- ?
+0 145424 14 os.py:506 func <- _exists
+0 145424 9 os.py:711 func <- ?
+0 145424 33 site.py:238 func -> _Printer
+0 145424 11 site.py:279 func <- _Printer
+0 145424 38 site.py:317 func -> _Helper
+0 145424 9 site.py:326 func <- _Helper
+0 145424 34 site.py:376 func -> main
+0 145424 8 site.py:69 func -> abs__file__
+0 145424 11 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 11 posixpath.py:49 func <- isabs
+0 145424 10 posixpath.py:374 func -> normpath
+0 145424 22 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 16 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 17 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 10 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 10 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 15 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 22 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 18 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 10 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 12 site.py:75 func <- abs__file__
+0 145424 9 site.py:77 func -> removeduppaths
+0 145424 11 site.py:65 func -> makepath
+0 145424 10 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 10 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 9 posixpath.py:39 func -> normcase
+0 145424 9 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 42 site.py:65 func -> makepath
+0 145424 9 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 10 posixpath.py:39 func -> normcase
+0 145424 8 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 site.py:65 func -> makepath
+0 145424 9 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 9 posixpath.py:39 func -> normcase
+0 145424 8 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 site.py:65 func -> makepath
+0 145424 9 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 9 posixpath.py:39 func -> normcase
+0 145424 8 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 site.py:65 func -> makepath
+0 145424 9 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 16 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 9 posixpath.py:39 func -> normcase
+0 145424 8 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 12 site.py:93 func <- removeduppaths
+0 145424 11 posixpath.py:110 func -> basename
+0 145424 10 posixpath.py:74 func -> split
+0 145424 14 posixpath.py:81 func <- split
+0 145424 9 posixpath.py:112 func <- basename
+0 145424 9 site.py:171 func -> addsitepackages
+0 145424 13 posixpath.py:56 func -> join
+0 145424 15 posixpath.py:66 func <- join
+0 145424 10 posixpath.py:56 func -> join
+0 145424 12 posixpath.py:66 func <- join
+0 145424 11 posixpath.py:192 func -> isdir
+0 145424 34 stat.py:45 func -> S_ISDIR
+0 145424 9 stat.py:29 func -> S_IFMT
+0 145424 9 stat.py:30 func <- S_IFMT
+0 145424 9 stat.py:46 func <- S_ISDIR
+0 145424 9 posixpath.py:198 func <- isdir
+0 145424 11 site.py:148 func -> addsitedir
+0 145424 9 site.py:65 func -> makepath
+0 145424 9 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 10 posixpath.py:374 func -> normpath
+0 145424 17 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 9 posixpath.py:39 func -> normcase
+0 145424 9 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 222 site.py:117 func -> addpackage
+0 145424 12 posixpath.py:56 func -> join
+0 145424 12 posixpath.py:66 func <- join
+0 145424 132 <string>:1 func -> ?
+0 145424 13 site.py:148 func -> addsitedir
+0 145424 9 site.py:105 func -> _init_pathinfo
+0 145424 11 posixpath.py:192 func -> isdir
+0 145424 84 posixpath.py:197 func <- isdir
+0 145424 12 posixpath.py:192 func -> isdir
+0 145424 23 stat.py:45 func -> S_ISDIR
+0 145424 9 stat.py:29 func -> S_IFMT
+0 145424 9 stat.py:30 func <- S_IFMT
+0 145424 9 stat.py:46 func <- S_ISDIR
+0 145424 9 posixpath.py:198 func <- isdir
+0 145424 10 site.py:65 func -> makepath
+0 145424 10 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 10 posixpath.py:374 func -> normpath
+0 145424 17 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 10 posixpath.py:39 func -> normcase
+0 145424 9 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 posixpath.py:192 func -> isdir
+0 145424 23 stat.py:45 func -> S_ISDIR
+0 145424 8 stat.py:29 func -> S_IFMT
+0 145424 8 stat.py:30 func <- S_IFMT
+0 145424 9 stat.py:46 func <- S_ISDIR
+0 145424 9 posixpath.py:198 func <- isdir
+0 145424 10 site.py:65 func -> makepath
+0 145424 9 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 17 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 10 posixpath.py:39 func -> normcase
+0 145424 9 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 posixpath.py:192 func -> isdir
+0 145424 24 stat.py:45 func -> S_ISDIR
+0 145424 8 stat.py:29 func -> S_IFMT
+0 145424 8 stat.py:30 func <- S_IFMT
+0 145424 9 stat.py:46 func <- S_ISDIR
+0 145424 8 posixpath.py:198 func <- isdir
+0 145424 10 site.py:65 func -> makepath
+0 145424 9 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 17 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 10 posixpath.py:39 func -> normcase
+0 145424 9 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 posixpath.py:192 func -> isdir
+0 145424 23 stat.py:45 func -> S_ISDIR
+0 145424 8 stat.py:29 func -> S_IFMT
+0 145424 8 stat.py:30 func <- S_IFMT
+0 145424 9 stat.py:46 func <- S_ISDIR
+0 145424 9 posixpath.py:198 func <- isdir
+0 145424 10 site.py:65 func -> makepath
+0 145424 9 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 17 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 9 posixpath.py:39 func -> normcase
+0 145424 9 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 posixpath.py:192 func -> isdir
+0 145424 22 stat.py:45 func -> S_ISDIR
+0 145424 8 stat.py:29 func -> S_IFMT
+0 145424 8 stat.py:30 func <- S_IFMT
+0 145424 9 stat.py:46 func <- S_ISDIR
+0 145424 8 posixpath.py:198 func <- isdir
+0 145424 10 site.py:65 func -> makepath
+0 145424 9 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 17 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 10 posixpath.py:39 func -> normcase
+0 145424 8 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 site.py:115 func <- _init_pathinfo
+0 145424 9 site.py:65 func -> makepath
+0 145424 10 posixpath.py:56 func -> join
+0 145424 9 posixpath.py:66 func <- join
+0 145424 9 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 10 posixpath.py:374 func -> normpath
+0 145424 17 posixpath.py:398 func <- normpath
+0 145424 9 posixpath.py:405 func <- abspath
+0 145424 9 posixpath.py:39 func -> normcase
+0 145424 9 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 170 site.py:117 func -> addpackage
+0 145424 11 posixpath.py:56 func -> join
+0 145424 12 posixpath.py:66 func <- join
+0 145424 73 site.py:65 func -> makepath
+0 145424 11 posixpath.py:56 func -> join
+0 145424 11 posixpath.py:66 func <- join
+0 145424 10 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 19 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 9 posixpath.py:39 func -> normcase
+0 145424 9 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 posixpath.py:168 func -> exists
+0 145424 41 posixpath.py:174 func <- exists
+0 145424 53 site.py:146 func <- addpackage
+0 145424 21 site.py:117 func -> addpackage
+0 145424 9 posixpath.py:56 func -> join
+0 145424 11 posixpath.py:66 func <- join
+0 145424 48 site.py:65 func -> makepath
+0 145424 10 posixpath.py:56 func -> join
+0 145424 47 posixpath.py:66 func <- join
+0 145424 10 posixpath.py:401 func -> abspath
+0 145424 9 posixpath.py:47 func -> isabs
+0 145424 9 posixpath.py:49 func <- isabs
+0 145424 9 posixpath.py:374 func -> normpath
+0 145424 18 posixpath.py:398 func <- normpath
+0 145424 10 posixpath.py:405 func <- abspath
+0 145424 10 posixpath.py:39 func -> normcase
+0 145424 9 posixpath.py:41 func <- normcase
+0 145424 9 site.py:67 func <- makepath
+0 145424 10 posixpath.py:168 func -> exists
+0 145424 25 posixpath.py:174 func <- exists
+0 145424 32 site.py:146 func <- addpackage
+0 145424 14 site.py:169 func <- addsitedir
+0 145424 10 <string>:1 func <- ?
+0 145424 16 site.py:146 func <- addpackage
+0 145424 10 site.py:169 func <- addsitedir
+0 145424 10 posixpath.py:192 func -> isdir
+0 145424 34 posixpath.py:197 func <- isdir
+0 145424 10 site.py:204 func <- addsitepackages
+0 145424 11 site.py:224 func -> setquit
+0 145424 11 site.py:235 func <- setquit
+0 145424 9 site.py:299 func -> setcopyright
+0 145424 11 site.py:244 func -> __init__
+0 145424 10 site.py:249 func <- __init__
+0 145424 12 site.py:244 func -> __init__
+0 145424 9 site.py:249 func <- __init__
+0 145424 10 posixpath.py:117 func -> dirname
+0 145424 9 posixpath.py:74 func -> split
+0 145424 14 posixpath.py:81 func <- split
+0 145424 9 posixpath.py:119 func <- dirname
+0 145424 14 posixpath.py:56 func -> join
+0 145424 11 posixpath.py:66 func <- join
+0 145424 11 site.py:244 func -> __init__
+0 145424 9 site.py:249 func <- __init__
+0 145424 9 site.py:314 func <- setcopyright
+0 145424 9 site.py:330 func -> sethelper
+0 145424 9 site.py:331 func <- sethelper
+0 145424 9 site.py:333 func -> aliasmbcs
+0 145424 9 site.py:346 func <- aliasmbcs
+0 145424 9 site.py:348 func -> setencoding
+0 145424 9 site.py:365 func <- setencoding
+0 145424 9 site.py:368 func -> execsitecustomize
+0 145424 706 site.py:373 func <- execsitecustomize
+0 145424 16 site.py:395 func <- main
+0 145424 12 site.py:406 func <- ?
+0 145424 289 warnings.py:1 func -> ?
+0 145424 158 linecache.py:6 func -> ?
+0 145424 17 linecache.py:66 func <- ?
+0 145424 20 warnings.py:179 func -> _OptionError
+0 145424 9 warnings.py:180 func <- _OptionError
+0 145424 19 warnings.py:184 func -> _processoptions
+0 145424 10 warnings.py:189 func <- _processoptions
+0 145424 12 warnings.py:160 func -> simplefilter
+0 145424 13 warnings.py:173 func <- simplefilter
+0 145424 10 warnings.py:160 func -> simplefilter
+0 145424 11 warnings.py:173 func <- simplefilter
+0 145424 9 warnings.py:259 func <- ?
+0 145424 492 __init__.py:28 func -> ?
+0 145424 599 codecs.py:8 func -> ?
+0 145424 61 codecs.py:76 func -> Codec
+0 145424 12 codecs.py:117 func <- Codec
+0 145424 18 codecs.py:147 func -> StreamWriter
+0 145424 11 codecs.py:200 func <- StreamWriter
+0 145424 13 codecs.py:209 func -> StreamReader
+0 145424 13 codecs.py:436 func <- StreamReader
+0 145424 12 codecs.py:445 func -> StreamReaderWriter
+0 145424 13 codecs.py:509 func <- StreamReaderWriter
+0 145424 11 codecs.py:518 func -> StreamRecoder
+0 145424 12 codecs.py:619 func <- StreamRecoder
+0 145424 17 codecs.py:817 func <- ?
+0 145424 625 aliases.py:17 func -> ?
+0 145424 54 aliases.py:18 func <- ?
+0 145424 21 __init__.py:43 func -> CodecRegistryError
+0 145424 10 __init__.py:45 func <- CodecRegistryError
+0 145424 19 __init__.py:145 func <- ?
+0 145424 18 __init__.py:69 func -> search_function
+0 145424 12 __init__.py:47 func -> normalize_encoding
+0 145424 16 __init__.py:67 func <- normalize_encoding
+0 145424 120 ascii.py:8 func -> ?
+0 145424 14 ascii.py:13 func -> Codec
+0 145424 10 ascii.py:18 func <- Codec
+0 145424 15 ascii.py:20 func -> StreamWriter
+0 145424 9 ascii.py:21 func <- StreamWriter
+0 145424 13 ascii.py:23 func -> StreamReader
+0 145424 9 ascii.py:24 func <- StreamReader
+0 145424 24 ascii.py:26 func -> StreamConverter
+0 145424 10 ascii.py:29 func <- StreamConverter
+0 145424 14 ascii.py:33 func <- ?
+0 145424 17 ascii.py:33 func -> getregentry
+0 145424 10 ascii.py:35 func <- getregentry
+0 145424 26 __init__.py:142 func <- search_function
+0 145424 367 func_abc.py:3 func -> ?
+0 145424 1722 func_abc.py:14 func -> func_a
+0 145424 1005677 func_abc.py:9 func -> func_b
+0 145424 1000271 func_abc.py:5 func -> func_c
+0 145424 1009739 func_abc.py:7 func <- func_c
+0 145424 25 func_abc.py:12 func <- func_b
+0 145424 9 func_abc.py:17 func <- func_a
+0 145424 9 func_abc.py:19 func <- ?
+^C
+
+As each function is entered, the last column is indented by 2 spaces. This
+shows which function is calling which.
+
+The DELTA(us) column shows the change in time from the previous line to the
+current line.
+
+The FILE::LINE column shows which line in which file was being executed. Refer
+to the source program to see what this line refers to.
+
+If the output looks shuffled, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/py_flowtime_example.txt b/Examples/py_flowtime_example.txt
new file mode 100644
index 000000000000..5ac494bba64d
--- /dev/null
+++ b/Examples/py_flowtime_example.txt
@@ -0,0 +1,487 @@
+The following are examples of py_flowtime.d.
+
+This is a simple script to trace the flow of Python functions. Here it traces
+the example program, Code/Python/func_abc.py
+
+# py_flowtime.d
+ C TIME(us) FILE DELTA(us) -- FUNC
+ 0 3064660319556 site.py 3 -> ?
+ 0 3064660320224 os.py 667 -> ?
+ 0 3064660321335 posixpath.py 1111 -> ?
+ 0 3064660321526 stat.py 190 -> ?
+ 0 3064660321546 stat.py 20 <- ?
+ 0 3064660321576 posixpath.py 29 <- ?
+ 0 3064660321593 os.py 17 -> _get_exports_list
+ 0 3064660321728 os.py 134 <- _get_exports_list
+ 0 3064660321989 UserDict.py 260 -> ?
+ 0 3064660322000 UserDict.py 10 -> UserDict
+ 0 3064660322035 UserDict.py 34 <- UserDict
+ 0 3064660322050 UserDict.py 15 -> IterableUserDict
+ 0 3064660322058 UserDict.py 8 <- IterableUserDict
+ 0 3064660322071 UserDict.py 12 -> DictMixin
+ 0 3064660322247 UserDict.py 176 <- DictMixin
+ 0 3064660322258 UserDict.py 10 <- ?
+ 0 3064660322275 os.py 16 -> _Environ
+ 0 3064660322285 os.py 10 <- _Environ
+ 0 3064660322298 os.py 13 -> __init__
+ 0 3064660322308 UserDict.py 10 -> __init__
+ 0 3064660322319 UserDict.py 10 <- __init__
+ 0 3064660322328 os.py 9 <- __init__
+ 0 3064660322338 os.py 10 -> _exists
+ 0 3064660322946 <string> 607 -> ?
+ 0 3064660322955 <string> 8 <- ?
+ 0 3064660322963 os.py 8 <- _exists
+ 0 3064660322972 os.py 8 -> _exists
+ 0 3064660322996 <string> 23 -> ?
+ 0 3064660323005 <string> 8 <- ?
+ 0 3064660323020 os.py 14 <- _exists
+ 0 3064660323029 os.py 8 -> _exists
+ 0 3064660323051 <string> 22 -> ?
+ 0 3064660323059 <string> 7 <- ?
+ 0 3064660323067 os.py 8 <- _exists
+ 0 3064660323077 os.py 10 -> _exists
+ 0 3064660323098 <string> 21 -> ?
+ 0 3064660323106 <string> 7 <- ?
+ 0 3064660323114 os.py 8 <- _exists
+ 0 3064660323125 os.py 10 -> _exists
+ 0 3064660323146 <string> 21 -> ?
+ 0 3064660323154 <string> 7 <- ?
+ 0 3064660323162 os.py 8 <- _exists
+ 0 3064660323173 os.py 10 -> _exists
+ 0 3064660323194 <string> 21 -> ?
+ 0 3064660323202 <string> 7 <- ?
+ 0 3064660323210 os.py 8 <- _exists
+ 0 3064660323218 os.py 8 -> _exists
+ 0 3064660323239 <string> 21 -> ?
+ 0 3064660323247 <string> 8 <- ?
+ 0 3064660323261 os.py 13 <- _exists
+ 0 3064660323271 os.py 10 -> _exists
+ 0 3064660323293 <string> 21 -> ?
+ 0 3064660323301 <string> 8 <- ?
+ 0 3064660323314 os.py 12 <- _exists
+ 0 3064660323324 os.py 10 -> _exists
+ 0 3064660323345 <string> 21 -> ?
+ 0 3064660323354 <string> 8 <- ?
+ 0 3064660323366 os.py 12 <- _exists
+ 0 3064660323545 copy_reg.py 178 -> ?
+ 0 3064660323726 types.py 180 -> ?
+ 0 3064660323790 types.py 64 -> _C
+ 0 3064660323800 types.py 9 <- _C
+ 0 3064660323834 types.py 33 <- ?
+ 0 3064660323855 copy_reg.py 21 -> pickle
+ 0 3064660323866 copy_reg.py 10 -> constructor
+ 0 3064660323874 copy_reg.py 8 <- constructor
+ 0 3064660323883 copy_reg.py 8 <- pickle
+ 0 3064660323895 copy_reg.py 11 <- ?
+ 0 3064660323909 copy_reg.py 14 -> pickle
+ 0 3064660323919 copy_reg.py 9 -> constructor
+ 0 3064660323927 copy_reg.py 8 <- constructor
+ 0 3064660323936 copy_reg.py 8 <- pickle
+ 0 3064660323946 copy_reg.py 9 -> pickle
+ 0 3064660323955 copy_reg.py 9 -> constructor
+ 0 3064660323963 copy_reg.py 8 <- constructor
+ 0 3064660323972 copy_reg.py 8 <- pickle
+ 0 3064660323981 os.py 9 -> _exists
+ 0 3064660324006 <string> 25 -> ?
+ 0 3064660324015 <string> 8 <- ?
+ 0 3064660324028 os.py 13 <- _exists
+ 0 3064660324037 os.py 8 <- ?
+ 0 3064660324069 site.py 31 -> _Printer
+ 0 3064660324080 site.py 10 <- _Printer
+ 0 3064660324118 site.py 38 -> _Helper
+ 0 3064660324127 site.py 9 <- _Helper
+ 0 3064660324160 site.py 33 -> main
+ 0 3064660324168 site.py 8 -> abs__file__
+ 0 3064660324179 posixpath.py 10 -> abspath
+ 0 3064660324187 posixpath.py 8 -> isabs
+ 0 3064660324197 posixpath.py 9 <- isabs
+ 0 3064660324207 posixpath.py 9 -> normpath
+ 0 3064660324228 posixpath.py 21 <- normpath
+ 0 3064660324238 posixpath.py 9 <- abspath
+ 0 3064660324253 posixpath.py 15 -> abspath
+ 0 3064660324261 posixpath.py 8 -> isabs
+ 0 3064660324270 posixpath.py 8 <- isabs
+ 0 3064660324278 posixpath.py 8 -> normpath
+ 0 3064660324295 posixpath.py 16 <- normpath
+ 0 3064660324304 posixpath.py 9 <- abspath
+ 0 3064660324314 posixpath.py 9 -> abspath
+ 0 3064660324322 posixpath.py 8 -> isabs
+ 0 3064660324331 posixpath.py 8 <- isabs
+ 0 3064660324339 posixpath.py 8 -> normpath
+ 0 3064660324355 posixpath.py 15 <- normpath
+ 0 3064660324364 posixpath.py 8 <- abspath
+ 0 3064660324374 posixpath.py 9 -> abspath
+ 0 3064660324382 posixpath.py 8 -> isabs
+ 0 3064660324391 posixpath.py 8 <- isabs
+ 0 3064660324399 posixpath.py 8 -> normpath
+ 0 3064660324415 posixpath.py 15 <- normpath
+ 0 3064660324424 posixpath.py 8 <- abspath
+ 0 3064660324439 posixpath.py 14 -> abspath
+ 0 3064660324447 posixpath.py 8 -> isabs
+ 0 3064660324456 posixpath.py 8 <- isabs
+ 0 3064660324464 posixpath.py 8 -> normpath
+ 0 3064660324480 posixpath.py 15 <- normpath
+ 0 3064660324489 posixpath.py 8 <- abspath
+ 0 3064660324511 posixpath.py 21 -> abspath
+ 0 3064660324519 posixpath.py 8 -> isabs
+ 0 3064660324528 posixpath.py 8 <- isabs
+ 0 3064660324536 posixpath.py 8 -> normpath
+ 0 3064660324552 posixpath.py 15 <- normpath
+ 0 3064660324561 posixpath.py 9 <- abspath
+ 0 3064660324579 posixpath.py 17 -> abspath
+ 0 3064660324588 posixpath.py 8 -> isabs
+ 0 3064660324596 posixpath.py 8 <- isabs
+ 0 3064660324605 posixpath.py 8 -> normpath
+ 0 3064660324621 posixpath.py 15 <- normpath
+ 0 3064660324630 posixpath.py 8 <- abspath
+ 0 3064660324639 posixpath.py 9 -> abspath
+ 0 3064660324648 posixpath.py 8 -> isabs
+ 0 3064660324656 posixpath.py 8 <- isabs
+ 0 3064660324665 posixpath.py 8 -> normpath
+ 0 3064660324681 posixpath.py 15 <- normpath
+ 0 3064660324690 posixpath.py 9 <- abspath
+ 0 3064660324701 site.py 11 <- abs__file__
+ 0 3064660324709 site.py 8 -> removeduppaths
+ 0 3064660324719 site.py 10 -> makepath
+ 0 3064660324729 posixpath.py 9 -> join
+ 0 3064660324738 posixpath.py 8 <- join
+ 0 3064660324746 posixpath.py 8 -> abspath
+ 0 3064660324755 posixpath.py 8 -> isabs
+ 0 3064660324764 posixpath.py 8 <- isabs
+ 0 3064660324773 posixpath.py 9 -> normpath
+ 0 3064660324789 posixpath.py 15 <- normpath
+ 0 3064660324797 posixpath.py 8 <- abspath
+ 0 3064660324806 posixpath.py 8 -> normcase
+ 0 3064660324814 posixpath.py 8 <- normcase
+ 0 3064660324823 site.py 8 <- makepath
+ 0 3064660324864 site.py 40 -> makepath
+ 0 3064660324873 posixpath.py 8 -> join
+ 0 3064660324881 posixpath.py 8 <- join
+ 0 3064660324889 posixpath.py 8 -> abspath
+ 0 3064660324898 posixpath.py 8 -> isabs
+ 0 3064660324906 posixpath.py 8 <- isabs
+ 0 3064660324915 posixpath.py 8 -> normpath
+ 0 3064660324931 posixpath.py 15 <- normpath
+ 0 3064660324939 posixpath.py 8 <- abspath
+ 0 3064660324948 posixpath.py 8 -> normcase
+ 0 3064660324957 posixpath.py 8 <- normcase
+ 0 3064660324965 site.py 8 <- makepath
+ 0 3064660324974 site.py 9 -> makepath
+ 0 3064660324983 posixpath.py 8 -> join
+ 0 3064660324991 posixpath.py 8 <- join
+ 0 3064660325000 posixpath.py 8 -> abspath
+ 0 3064660325008 posixpath.py 8 -> isabs
+ 0 3064660325017 posixpath.py 8 <- isabs
+ 0 3064660325025 posixpath.py 8 -> normpath
+ 0 3064660325041 posixpath.py 15 <- normpath
+ 0 3064660325050 posixpath.py 8 <- abspath
+ 0 3064660325059 posixpath.py 8 -> normcase
+ 0 3064660325067 posixpath.py 8 <- normcase
+ 0 3064660325075 site.py 8 <- makepath
+ 0 3064660325084 site.py 9 -> makepath
+ 0 3064660325093 posixpath.py 8 -> join
+ 0 3064660325102 posixpath.py 8 <- join
+ 0 3064660325110 posixpath.py 8 -> abspath
+ 0 3064660325118 posixpath.py 8 -> isabs
+ 0 3064660325127 posixpath.py 8 <- isabs
+ 0 3064660325135 posixpath.py 8 -> normpath
+ 0 3064660325151 posixpath.py 15 <- normpath
+ 0 3064660325160 posixpath.py 8 <- abspath
+ 0 3064660325169 posixpath.py 8 -> normcase
+ 0 3064660325177 posixpath.py 7 <- normcase
+ 0 3064660325185 site.py 8 <- makepath
+ 0 3064660325194 site.py 9 -> makepath
+ 0 3064660325203 posixpath.py 8 -> join
+ 0 3064660325212 posixpath.py 8 <- join
+ 0 3064660325220 posixpath.py 8 -> abspath
+ 0 3064660325228 posixpath.py 8 -> isabs
+ 0 3064660325237 posixpath.py 8 <- isabs
+ 0 3064660325245 posixpath.py 8 -> normpath
+ 0 3064660325261 posixpath.py 15 <- normpath
+ 0 3064660325270 posixpath.py 8 <- abspath
+ 0 3064660325279 posixpath.py 8 -> normcase
+ 0 3064660325287 posixpath.py 8 <- normcase
+ 0 3064660325295 site.py 8 <- makepath
+ 0 3064660325307 site.py 11 <- removeduppaths
+ 0 3064660325317 posixpath.py 10 -> basename
+ 0 3064660325327 posixpath.py 9 -> split
+ 0 3064660325340 posixpath.py 13 <- split
+ 0 3064660325349 posixpath.py 8 <- basename
+ 0 3064660325358 site.py 8 -> addsitepackages
+ 0 3064660325370 posixpath.py 12 -> join
+ 0 3064660325385 posixpath.py 14 <- join
+ 0 3064660325394 posixpath.py 9 -> join
+ 0 3064660325406 posixpath.py 11 <- join
+ 0 3064660325416 posixpath.py 10 -> isdir
+ 0 3064660325447 stat.py 31 -> S_ISDIR
+ 0 3064660325456 stat.py 8 -> S_IFMT
+ 0 3064660325464 stat.py 8 <- S_IFMT
+ 0 3064660325473 stat.py 8 <- S_ISDIR
+ 0 3064660325481 posixpath.py 7 <- isdir
+ 0 3064660325491 site.py 10 -> addsitedir
+ 0 3064660325500 site.py 8 -> makepath
+ 0 3064660325508 posixpath.py 8 -> join
+ 0 3064660325517 posixpath.py 8 <- join
+ 0 3064660325525 posixpath.py 8 -> abspath
+ 0 3064660325534 posixpath.py 8 -> isabs
+ 0 3064660325543 posixpath.py 8 <- isabs
+ 0 3064660325552 posixpath.py 9 -> normpath
+ 0 3064660325569 posixpath.py 16 <- normpath
+ 0 3064660325578 posixpath.py 8 <- abspath
+ 0 3064660325587 posixpath.py 8 -> normcase
+ 0 3064660325595 posixpath.py 8 <- normcase
+ 0 3064660325604 site.py 8 <- makepath
+ 0 3064660325823 site.py 219 -> addpackage
+ 0 3064660325834 posixpath.py 10 -> join
+ 0 3064660325844 posixpath.py 10 <- join
+ 0 3064660325972 <string> 127 -> ?
+ 0 3064660325985 site.py 13 -> addsitedir
+ 0 3064660325994 site.py 8 -> _init_pathinfo
+ 0 3064660326004 posixpath.py 10 -> isdir
+ 0 3064660326086 posixpath.py 81 <- isdir
+ 0 3064660326097 posixpath.py 10 -> isdir
+ 0 3064660326118 stat.py 21 -> S_ISDIR
+ 0 3064660326127 stat.py 9 -> S_IFMT
+ 0 3064660326136 stat.py 8 <- S_IFMT
+ 0 3064660326144 stat.py 8 <- S_ISDIR
+ 0 3064660326152 posixpath.py 7 <- isdir
+ 0 3064660326161 site.py 9 -> makepath
+ 0 3064660326171 posixpath.py 9 -> join
+ 0 3064660326179 posixpath.py 8 <- join
+ 0 3064660326188 posixpath.py 8 -> abspath
+ 0 3064660326196 posixpath.py 8 -> isabs
+ 0 3064660326205 posixpath.py 9 <- isabs
+ 0 3064660326215 posixpath.py 9 -> normpath
+ 0 3064660326231 posixpath.py 16 <- normpath
+ 0 3064660326240 posixpath.py 8 <- abspath
+ 0 3064660326249 posixpath.py 9 -> normcase
+ 0 3064660326258 posixpath.py 8 <- normcase
+ 0 3064660326266 site.py 8 <- makepath
+ 0 3064660326276 posixpath.py 9 -> isdir
+ 0 3064660326298 stat.py 22 -> S_ISDIR
+ 0 3064660326306 stat.py 8 -> S_IFMT
+ 0 3064660326314 stat.py 7 <- S_IFMT
+ 0 3064660326322 stat.py 8 <- S_ISDIR
+ 0 3064660326330 posixpath.py 8 <- isdir
+ 0 3064660326340 site.py 9 -> makepath
+ 0 3064660326349 posixpath.py 8 -> join
+ 0 3064660326357 posixpath.py 8 <- join
+ 0 3064660326382 posixpath.py 24 -> abspath
+ 0 3064660326390 posixpath.py 8 -> isabs
+ 0 3064660326399 posixpath.py 8 <- isabs
+ 0 3064660326408 posixpath.py 8 -> normpath
+ 0 3064660326425 posixpath.py 16 <- normpath
+ 0 3064660326434 posixpath.py 9 <- abspath
+ 0 3064660326443 posixpath.py 9 -> normcase
+ 0 3064660326451 posixpath.py 8 <- normcase
+ 0 3064660326460 site.py 8 <- makepath
+ 0 3064660326469 posixpath.py 9 -> isdir
+ 0 3064660326493 stat.py 23 -> S_ISDIR
+ 0 3064660326501 stat.py 8 -> S_IFMT
+ 0 3064660326509 stat.py 7 <- S_IFMT
+ 0 3064660326517 stat.py 8 <- S_ISDIR
+ 0 3064660326525 posixpath.py 7 <- isdir
+ 0 3064660326534 site.py 9 -> makepath
+ 0 3064660326542 posixpath.py 8 -> join
+ 0 3064660326551 posixpath.py 8 <- join
+ 0 3064660326559 posixpath.py 8 -> abspath
+ 0 3064660326568 posixpath.py 8 -> isabs
+ 0 3064660326576 posixpath.py 8 <- isabs
+ 0 3064660326585 posixpath.py 8 -> normpath
+ 0 3064660326602 posixpath.py 16 <- normpath
+ 0 3064660326610 posixpath.py 8 <- abspath
+ 0 3064660326619 posixpath.py 8 -> normcase
+ 0 3064660326628 posixpath.py 8 <- normcase
+ 0 3064660326636 site.py 8 <- makepath
+ 0 3064660326646 posixpath.py 9 -> isdir
+ 0 3064660326668 stat.py 22 -> S_ISDIR
+ 0 3064660326676 stat.py 8 -> S_IFMT
+ 0 3064660326684 stat.py 7 <- S_IFMT
+ 0 3064660326692 stat.py 8 <- S_ISDIR
+ 0 3064660326700 posixpath.py 8 <- isdir
+ 0 3064660326709 site.py 9 -> makepath
+ 0 3064660326718 posixpath.py 8 -> join
+ 0 3064660326726 posixpath.py 8 <- join
+ 0 3064660326735 posixpath.py 8 -> abspath
+ 0 3064660326743 posixpath.py 8 -> isabs
+ 0 3064660326752 posixpath.py 8 <- isabs
+ 0 3064660326760 posixpath.py 8 -> normpath
+ 0 3064660326777 posixpath.py 16 <- normpath
+ 0 3064660326786 posixpath.py 9 <- abspath
+ 0 3064660326795 posixpath.py 9 -> normcase
+ 0 3064660326803 posixpath.py 8 <- normcase
+ 0 3064660326811 site.py 8 <- makepath
+ 0 3064660326821 posixpath.py 9 -> isdir
+ 0 3064660326842 stat.py 21 -> S_ISDIR
+ 0 3064660326850 stat.py 8 -> S_IFMT
+ 0 3064660326858 stat.py 7 <- S_IFMT
+ 0 3064660326866 stat.py 8 <- S_ISDIR
+ 0 3064660326874 posixpath.py 7 <- isdir
+ 0 3064660326883 site.py 9 -> makepath
+ 0 3064660326892 posixpath.py 8 -> join
+ 0 3064660326901 posixpath.py 8 <- join
+ 0 3064660326909 posixpath.py 8 -> abspath
+ 0 3064660326917 posixpath.py 8 -> isabs
+ 0 3064660326926 posixpath.py 8 <- isabs
+ 0 3064660326935 posixpath.py 8 -> normpath
+ 0 3064660326951 posixpath.py 16 <- normpath
+ 0 3064660326960 posixpath.py 8 <- abspath
+ 0 3064660326970 posixpath.py 9 -> normcase
+ 0 3064660326978 posixpath.py 8 <- normcase
+ 0 3064660326986 site.py 8 <- makepath
+ 0 3064660326995 site.py 8 <- _init_pathinfo
+ 0 3064660327004 site.py 8 -> makepath
+ 0 3064660327013 posixpath.py 9 -> join
+ 0 3064660327021 posixpath.py 8 <- join
+ 0 3064660327030 posixpath.py 8 -> abspath
+ 0 3064660327038 posixpath.py 8 -> isabs
+ 0 3064660327047 posixpath.py 8 <- isabs
+ 0 3064660327056 posixpath.py 8 -> normpath
+ 0 3064660327072 posixpath.py 15 <- normpath
+ 0 3064660327081 posixpath.py 9 <- abspath
+ 0 3064660327090 posixpath.py 8 -> normcase
+ 0 3064660327098 posixpath.py 8 <- normcase
+ 0 3064660327106 site.py 8 <- makepath
+ 0 3064660327278 site.py 171 -> addpackage
+ 0 3064660327289 posixpath.py 10 -> join
+ 0 3064660327300 posixpath.py 10 <- join
+ 0 3064660327372 site.py 72 -> makepath
+ 0 3064660327382 posixpath.py 10 -> join
+ 0 3064660327393 posixpath.py 10 <- join
+ 0 3064660327402 posixpath.py 9 -> abspath
+ 0 3064660327410 posixpath.py 8 -> isabs
+ 0 3064660327419 posixpath.py 8 <- isabs
+ 0 3064660327427 posixpath.py 8 -> normpath
+ 0 3064660327445 posixpath.py 17 <- normpath
+ 0 3064660327454 posixpath.py 9 <- abspath
+ 0 3064660327463 posixpath.py 9 -> normcase
+ 0 3064660327472 posixpath.py 8 <- normcase
+ 0 3064660327480 site.py 8 <- makepath
+ 0 3064660327489 posixpath.py 9 -> exists
+ 0 3064660327515 posixpath.py 26 <- exists
+ 0 3064660327567 site.py 51 <- addpackage
+ 0 3064660327588 site.py 20 -> addpackage
+ 0 3064660327597 posixpath.py 8 -> join
+ 0 3064660327607 posixpath.py 10 <- join
+ 0 3064660327654 site.py 46 -> makepath
+ 0 3064660327663 posixpath.py 9 -> join
+ 0 3064660327710 posixpath.py 46 <- join
+ 0 3064660327720 posixpath.py 9 -> abspath
+ 0 3064660327728 posixpath.py 8 -> isabs
+ 0 3064660327737 posixpath.py 9 <- isabs
+ 0 3064660327746 posixpath.py 8 -> normpath
+ 0 3064660327764 posixpath.py 17 <- normpath
+ 0 3064660327773 posixpath.py 9 <- abspath
+ 0 3064660327782 posixpath.py 9 -> normcase
+ 0 3064660327791 posixpath.py 8 <- normcase
+ 0 3064660327799 site.py 8 <- makepath
+ 0 3064660327808 posixpath.py 9 -> exists
+ 0 3064660327833 posixpath.py 24 <- exists
+ 0 3064660327864 site.py 31 <- addpackage
+ 0 3064660327878 site.py 13 <- addsitedir
+ 0 3064660327887 <string> 9 <- ?
+ 0 3064660327903 site.py 15 <- addpackage
+ 0 3064660327913 site.py 9 <- addsitedir
+ 0 3064660327923 posixpath.py 10 -> isdir
+ 0 3064660327955 posixpath.py 32 <- isdir
+ 0 3064660327965 site.py 9 <- addsitepackages
+ 0 3064660327976 site.py 10 -> setquit
+ 0 3064660327986 site.py 10 <- setquit
+ 0 3064660327995 site.py 8 -> setcopyright
+ 0 3064660328005 site.py 10 -> __init__
+ 0 3064660328015 site.py 9 <- __init__
+ 0 3064660328026 site.py 11 -> __init__
+ 0 3064660328035 site.py 8 <- __init__
+ 0 3064660328045 posixpath.py 9 -> dirname
+ 0 3064660328053 posixpath.py 8 -> split
+ 0 3064660328066 posixpath.py 13 <- split
+ 0 3064660328075 posixpath.py 8 <- dirname
+ 0 3064660328089 posixpath.py 13 -> join
+ 0 3064660328099 posixpath.py 10 <- join
+ 0 3064660328109 site.py 10 -> __init__
+ 0 3064660328118 site.py 9 <- __init__
+ 0 3064660328127 site.py 8 <- setcopyright
+ 0 3064660328136 site.py 8 -> sethelper
+ 0 3064660328145 site.py 8 <- sethelper
+ 0 3064660328153 site.py 8 -> aliasmbcs
+ 0 3064660328161 site.py 8 <- aliasmbcs
+ 0 3064660328170 site.py 8 -> setencoding
+ 0 3064660328178 site.py 7 <- setencoding
+ 0 3064660328186 site.py 8 -> execsitecustomize
+ 0 3064660328736 site.py 549 <- execsitecustomize
+ 0 3064660328748 site.py 12 <- main
+ 0 3064660328758 site.py 9 <- ?
+ 0 3064660329029 warnings.py 270 -> ?
+ 0 3064660329184 linecache.py 155 -> ?
+ 0 3064660329201 linecache.py 16 <- ?
+ 0 3064660329220 warnings.py 18 -> _OptionError
+ 0 3064660329228 warnings.py 8 <- _OptionError
+ 0 3064660329246 warnings.py 17 -> _processoptions
+ 0 3064660329255 warnings.py 8 <- _processoptions
+ 0 3064660329266 warnings.py 10 -> simplefilter
+ 0 3064660329278 warnings.py 12 <- simplefilter
+ 0 3064660329288 warnings.py 9 -> simplefilter
+ 0 3064660329298 warnings.py 10 <- simplefilter
+ 0 3064660329307 warnings.py 8 <- ?
+ 0 3064660329533 __init__.py 226 -> ?
+ 0 3064660330090 codecs.py 557 -> ?
+ 0 3064660330148 codecs.py 57 -> Codec
+ 0 3064660330158 codecs.py 10 <- Codec
+ 0 3064660330171 codecs.py 13 -> StreamWriter
+ 0 3064660330182 codecs.py 10 <- StreamWriter
+ 0 3064660330194 codecs.py 11 -> StreamReader
+ 0 3064660330206 codecs.py 12 <- StreamReader
+ 0 3064660330217 codecs.py 11 -> StreamReaderWriter
+ 0 3064660330229 codecs.py 11 <- StreamReaderWriter
+ 0 3064660330239 codecs.py 10 -> StreamRecoder
+ 0 3064660330251 codecs.py 11 <- StreamRecoder
+ 0 3064660330267 codecs.py 16 <- ?
+ 0 3064660331439 aliases.py 1171 -> ?
+ 0 3064660331500 aliases.py 61 <- ?
+ 0 3064660331526 __init__.py 25 -> CodecRegistryError
+ 0 3064660331535 __init__.py 9 <- CodecRegistryError
+ 0 3064660331557 __init__.py 21 <- ?
+ 0 3064660331577 __init__.py 20 -> search_function
+ 0 3064660331590 __init__.py 12 -> normalize_encoding
+ 0 3064660331605 __init__.py 15 <- normalize_encoding
+ 0 3064660331728 ascii.py 122 -> ?
+ 0 3064660331742 ascii.py 13 -> Codec
+ 0 3064660331752 ascii.py 9 <- Codec
+ 0 3064660331766 ascii.py 13 -> StreamWriter
+ 0 3064660331774 ascii.py 8 <- StreamWriter
+ 0 3064660331787 ascii.py 13 -> StreamReader
+ 0 3064660331796 ascii.py 8 <- StreamReader
+ 0 3064660331819 ascii.py 23 -> StreamConverter
+ 0 3064660331829 ascii.py 9 <- StreamConverter
+ 0 3064660331842 ascii.py 13 <- ?
+ 0 3064660331860 ascii.py 17 -> getregentry
+ 0 3064660331869 ascii.py 9 <- getregentry
+ 0 3064660331897 __init__.py 27 <- search_function
+ 0 3064660332263 func_abc.py 366 -> ?
+ 0 3064660333735 func_abc.py 1471 -> func_a
+ 0 3064661340597 func_abc.py 1006862 -> func_b
+ 0 3064662350504 func_abc.py 1009906 -> func_c
+ 0 3064663350678 func_abc.py 1000174 <- func_c
+ 0 3064663350700 func_abc.py 22 <- func_b
+ 0 3064663350709 func_abc.py 8 <- func_a
+ 0 3064663350717 func_abc.py 8 <- ?
+^C
+
+The fifth column is indented by 2 spaces to show when a new function begins.
+This shows which function is calling which - first a whole lot of
+pre-processing, then working through the func_abc.py program.
+
+The TIME(us) column shows time since boot.
+
+The DELTA(us) column shows time from that line to the previous line, and
+so can be a bit tricky to read. For example, the third last line of data output
+shows the time elapsing between func_c returning and func_b returning as 22
+microseconds.
+
+The FILE column shows file that was being executed.
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/py_funccalls_example.txt b/Examples/py_funccalls_example.txt
new file mode 100644
index 000000000000..0ac87803fd8d
--- /dev/null
+++ b/Examples/py_funccalls_example.txt
@@ -0,0 +1,89 @@
+The following are examples of py_funccalls.d.
+
+This is a simple script to count executed PHP functions. Here it traces
+an example program, Code/Python/func_abc.py
+
+# py_funccalls.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+ FILE FUNC CALLS
+ UserDict.py ? 1
+ UserDict.py DictMixin 1
+ UserDict.py IterableUserDict 1
+ UserDict.py UserDict 1
+ UserDict.py __init__ 1
+ __init__.py ? 1
+ __init__.py CodecRegistryError 1
+ __init__.py normalize_encoding 1
+ __init__.py search_function 1
+ aliases.py ? 1
+ ascii.py ? 1
+ ascii.py Codec 1
+ ascii.py StreamConverter 1
+ ascii.py StreamReader 1
+ ascii.py StreamWriter 1
+ ascii.py getregentry 1
+ codecs.py ? 1
+ codecs.py Codec 1
+ codecs.py StreamReader 1
+ codecs.py StreamReaderWriter 1
+ codecs.py StreamRecoder 1
+ codecs.py StreamWriter 1
+ copy_reg.py ? 1
+ func_abc.py ? 1
+ func_abc.py func_a 1
+ func_abc.py func_b 1
+ func_abc.py func_c 1
+ linecache.py ? 1
+ os.py ? 1
+ os.py _Environ 1
+ os.py __init__ 1
+ os.py _get_exports_list 1
+ posixpath.py ? 1
+ posixpath.py basename 1
+ posixpath.py dirname 1
+ site.py ? 1
+ site.py _Helper 1
+ site.py _Printer 1
+ site.py _init_pathinfo 1
+ site.py abs__file__ 1
+ site.py addsitepackages 1
+ site.py aliasmbcs 1
+ site.py execsitecustomize 1
+ site.py main 1
+ site.py removeduppaths 1
+ site.py setcopyright 1
+ site.py setencoding 1
+ site.py sethelper 1
+ site.py setquit 1
+ stat.py ? 1
+ types.py ? 1
+ types.py _C 1
+ warnings.py ? 1
+ warnings.py _OptionError 1
+ warnings.py _processoptions 1
+ posixpath.py exists 2
+ posixpath.py split 2
+ site.py addsitedir 2
+ warnings.py simplefilter 2
+ copy_reg.py constructor 3
+ copy_reg.py pickle 3
+ site.py __init__ 3
+ site.py addpackage 3
+ stat.py S_IFMT 6
+ stat.py S_ISDIR 6
+ posixpath.py isdir 8
+ os.py _exists 10
+ <string> ? 11
+ posixpath.py normcase 14
+ site.py makepath 14
+ posixpath.py join 20
+ posixpath.py abspath 22
+ posixpath.py isabs 22
+ posixpath.py normpath 22
+
+It tells you how many times each function was called, and which file this
+function was associated with. In this case you can see most of the function
+calls come from functions within the posixpath.py library.
+
diff --git a/Examples/py_malloc_example.txt b/Examples/py_malloc_example.txt
new file mode 100644
index 000000000000..be8fc25a484f
--- /dev/null
+++ b/Examples/py_malloc_example.txt
@@ -0,0 +1,508 @@
+The following are examples of py_malloc.d
+
+This is an experimental script to identify who is calling malloc() for memory
+allocation, and to print distribution plots of the requested bytes. Here you
+can see it running on Code/Python/func_abc.py
+
+# py_malloc.d -c ./func_abc.py
+Tracing... Hit Ctrl-C to end.
+Function A
+Function B
+Function C
+
+Python malloc byte distributions by engine caller,
+
+ libpython2.4.so.1.0`_PyUnicode_New, total bytes = 2
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ libpython2.4.so.1.0`find_key, total bytes = 16
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ libpython2.4.so.1.0`PyInterpreterState_New, total bytes = 36
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ libpython2.4.so.1.0`_PyImport_Init, total bytes = 60
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ libpython2.4.so.1.0`PyThreadState_New, total bytes = 84
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ libpython2.4.so.1.0`pmerge, total bytes = 132
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@ 1
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 16
+ 16 | 0
+
+ libpython2.4.so.1.0`PyThread_allocate_lock, total bytes = 144
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 64 | 0
+
+ libpython2.4.so.1.0`convertsimple, total bytes = 210
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 64 | 0
+
+ libc.so.1`strdup, total bytes = 451
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@ 1
+ 4 |@@@ 1
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 8
+ 32 |@@@@@@@@@@@@@@@ 6
+ 64 | 0
+
+ libpython2.4.so.1.0`PyList_New, total bytes = 528
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@ 22
+ 8 |@@@@@@@@@@@@@@@@@ 21
+ 16 |@@@@@ 6
+ 32 | 0
+ 64 | 0
+ 128 |@ 1
+ 256 | 0
+
+ libpython2.4.so.1.0`PyTokenizer_FromFile, total bytes = 1024
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ libpython2.4.so.1.0`_PyExc_Init, total bytes = 1058
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 40
+ 32 |@@ 2
+ 64 | 0
+
+ libpython2.4.so.1.0`tok_new, total bytes = 1832
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 1024 | 0
+
+ libpython2.4.so.1.0`fill_free_list, total bytes = 1976
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 1024 | 0
+
+ libpython2.4.so.1.0`PyParser_New, total bytes = 12024
+ value ------------- Distribution ------------- count
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 8192 | 0
+
+ libpython2.4.so.1.0`PyObject_Malloc, total bytes = 35152
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@ 20
+ 512 |@@@@@@@ 7
+ 1024 |@@@@@@@@@@ 11
+ 2048 |@@@@ 4
+ 4096 | 0
+
+ libpython2.4.so.1.0`PyMem_Malloc, total bytes = 50683
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@ 2
+ 16 |@@@@@@@ 4
+ 32 |@@ 1
+ 64 |@@@@@@@@@@@@@ 8
+ 128 |@@@@@ 3
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 |@@@@@@@@@@ 6
+ 16384 | 0
+
+ libc.so.1`_findbuf, total bytes = 51800
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@ 4
+ 1024 |@@@@ 1
+ 2048 | 0
+ 4096 |@@@@@@@ 2
+ 8192 |@@@@@@@@@@@@@@@ 4
+ 16384 | 0
+
+ libpython2.4.so.1.0`dictresize, total bytes = 178752
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@ 1
+ 256 |@@@@@@@@@@@@@@@@@@@@@ 29
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@ 19
+ 2048 |@ 1
+ 4096 |@ 2
+ 8192 | 0
+ 16384 |@ 1
+ 32768 | 0
+ 65536 |@ 1
+ 131072 | 0
+
+ libpython2.4.so.1.0`new_arena, total bytes = 262208
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 | 0
+ 32768 | 0
+ 65536 | 0
+ 131072 | 0
+ 262144 |@@@@@@@@@@@@@@@@@@@@ 1
+ 524288 | 0
+
+
+Python malloc byte distributions by Python file and function,
+
+ site.py, addsitepackages, bytes total = 4
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ site.py, abs__file__, bytes total = 60
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ posixpath.py, exists, bytes total = 83
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ stat.py, S_ISDIR, bytes total = 364
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ site.py, _init_pathinfo, bytes total = 380
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ UserDict.py, DictMixin, bytes total = 384
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ codecs.py, StreamReader, bytes total = 384
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ codecs.py, StreamReaderWriter, bytes total = 384
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ codecs.py, StreamRecoder, bytes total = 384
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ codecs.py, StreamWriter, bytes total = 384
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ os.py, _Environ, bytes total = 384
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ site.py, _Printer, bytes total = 384
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ site.py, addsitedir, bytes total = 388
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ linecache.py, ?, bytes total = 396
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ posixpath.py, isdir, bytes total = 608
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@ 2
+ 4 | 0
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@ 7
+ 32 |@@@@@@@ 2
+ 64 | 0
+ 128 | 0
+ 256 |@@@ 1
+ 512 | 0
+
+ os.py, _get_exports_list, bytes total = 612
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ posixpath.py, abspath, bytes total = 728
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 512 | 0
+
+ site.py, execsitecustomize, bytes total = 790
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9
+ 64 | 0
+ 128 | 0
+ 256 |@@@@ 1
+ 512 | 0
+
+ UserDict.py, UserDict, bytes total = 1920
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ stat.py, ?, bytes total = 1920
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ types.py, ?, bytes total = 2680
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@ 1
+ 8 |@@@@@@@@@@@ 2
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@ 3
+ 512 | 0
+ 1024 |@@@@@@ 1
+ 2048 | 0
+
+ posixpath.py, ?, bytes total = 3306
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@ 2
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@ 1
+ 4096 | 0
+
+ copy_reg.py, ?, bytes total = 3547
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 |@@@@@@@@ 1
+ 512 |@@@@@@@@ 1
+ 1024 | 0
+ 2048 |@@@@@@@@ 1
+ 4096 | 0
+
+ warnings.py, ?, bytes total = 3924
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@ 1
+ 32 |@@@@@@@@ 1
+ 64 | 0
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@ 2
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@ 1
+ 4096 | 0
+
+ func_abc.py, func_a, bytes total = 5100
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@@@@@@@@ 1
+ 8192 | 0
+
+ codecs.py, ?, bytes total = 5612
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@ 1
+ 128 |@@@@@@ 1
+ 256 |@@@@@@@@@@@ 2
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@ 3
+ 2048 | 0
+
+ aliases.py, ?, bytes total = 8064
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@ 1
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@ 1
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@ 1
+ 8192 | 0
+
+ func_abc.py, ?, bytes total = 16105
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@ 1
+ 8 |@@@@@ 2
+ 16 |@@@@@@@@@ 4
+ 32 |@@@@@ 2
+ 64 | 0
+ 128 |@@ 1
+ 256 |@@@@@@@ 3
+ 512 |@@ 1
+ 1024 |@@@@@ 2
+ 2048 | 0
+ 4096 | 0
+ 8192 |@@ 1
+ 16384 | 0
+
+ os.py, ?, bytes total = 58957
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@ 3
+ 8 |@@@@@ 6
+ 16 |@ 1
+ 32 |@@ 2
+ 64 | 0
+ 128 |@ 1
+ 256 |@@@@@@@@@@@@@@@@@@ 23
+ 512 |@@ 3
+ 1024 |@@@@@ 7
+ 2048 | 0
+ 4096 |@@@ 4
+ 8192 |@ 1
+ 16384 | 0
+
+ site.py, ?, bytes total = 62589
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@ 2
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20
+ 512 |@ 1
+ 1024 |@@@ 2
+ 2048 |@ 1
+ 4096 | 0
+ 8192 | 0
+ 16384 |@@@ 2
+ 32768 | 0
+
+ __init__.py, ?, bytes total = 62593
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@ 1
+ 2 | 0
+ 4 | 0
+ 8 | 0
+ 16 |@@@ 2
+ 32 |@@ 1
+ 64 | 0
+ 128 | 0
+ 256 |@@@@@@@@@@@ 7
+ 512 |@@@@@@@@@@@@@@@@ 10
+ 1024 |@@@ 2
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 |@@@ 2
+ 32768 | 0
+
+ posixpath.py, join, bytes total = 262144
+ value ------------- Distribution ------------- count
+ 131072 | 0
+ 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 524288 | 0
+
+ os.py, _exists, bytes total = 362768
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@ 10
+ 8 |@ 10
+ 16 |@@ 20
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 |@ 7
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 447
+ 1024 |@@ 20
+ 2048 | 0
+ 4096 |@ 10
+ 8192 | 0
+
+
+The results are divided into two sections. If a malloc() occurred while in a
+Python function, then that function is identified as responsible; and the
+results will appear in the second section - Python malloc byte distributions
+by Python file and function.
+
+Otherwise the caller of malloc() is identified as responsible - which will be
+a function from the Python engine, and these are noted in the first section -
+Python malloc byte distributions by engine caller.
diff --git a/Examples/py_mallocstk_example.txt b/Examples/py_mallocstk_example.txt
new file mode 100644
index 000000000000..a466737f34b2
--- /dev/null
+++ b/Examples/py_mallocstk_example.txt
@@ -0,0 +1,314 @@
+Following are examples of running py_mallocstk.d. This traces malloc() from
+Python, printing byte distributions by user stack trace.
+
+Here we see the script runnin on the program Code/Python/func_abc.py
+
+# py_mallocstk.d -c ./func_abc.py
+
+Tracing... Hit Ctrl-C to end.
+Function A
+Function B
+Function C
+
+Python malloc byte distributions by stack trace,
+
+
+
+ libc.so.1`malloc
+ libpython2.4.so.1.0`r_object+0x52f
+ libpython2.4.so.1.0`r_object+0x491
+ libpython2.4.so.1.0`r_object+0xd3
+ libpython2.4.so.1.0`r_object+0x491
+ libpython2.4.so.1.0`r_object+0xd3
+ libpython2.4.so.1.0`r_object+0x491
+ libpython2.4.so.1.0`r_object+0xd3
+ libpython2.4.so.1.0`PyMarshal_ReadObjectFromString+0x36
+ libpython2.4.so.1.0`PyMarshal_ReadLastObjectFromFile+0x6a
+ libpython2.4.so.1.0`read_compiled_module+0xf
+ libpython2.4.so.1.0`load_source_module+0x63
+ libpython2.4.so.1.0`load_module+0xac
+ libpython2.4.so.1.0`import_submodule+0xfb
+ libpython2.4.so.1.0`load_next+0xee
+ libpython2.4.so.1.0`import_module_ex+0x48
+ libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d
+ libpython2.4.so.1.0`builtin___import__+0x4e
+ libpython2.4.so.1.0`PyCFunction_Call+0x15f
+ libpython2.4.so.1.0`PyObject_Call+0x1d
+ libpython2.4.so.1.0`PyEval_CallObjectWithKeywords+0xb8
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xd3c
+ [ /usr/lib/python2.4/encodings/__init__.py:28 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0
+ libpython2.4.so.1.0`load_source_module+0xe6
+ libpython2.4.so.1.0`load_module+0xac
+ libpython2.4.so.1.0`load_package+0xef
+ libpython2.4.so.1.0`load_module+0x6a
+ libpython2.4.so.1.0`import_submodule+0xfb
+ libpython2.4.so.1.0`load_next+0xa2
+ libpython2.4.so.1.0`import_module_ex+0x48
+ libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d
+ libpython2.4.so.1.0`_PyCodecRegistry_Init+0xce
+ libpython2.4.so.1.0`_PyCodec_Lookup+0x2a
+ libpython2.4.so.1.0`PyCodec_Encoder+0xf
+ libpython2.4.so.1.0`Py_InitializeEx+0x257
+ libpython2.4.so.1.0`Py_Initialize+0xd
+ libpython2.4.so.1.0`Py_Main+0x4db
+ python`main+0x11
+ python`_start+0x7a
+
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+
+ libc.so.1`malloc
+ libpython2.4.so.1.0`_PyUnicode_New+0xb2
+ libpython2.4.so.1.0`_PyUnicodeUCS2_Init+0x19
+ libpython2.4.so.1.0`Py_InitializeEx+0x11c
+ libpython2.4.so.1.0`Py_Initialize+0xd
+ libpython2.4.so.1.0`Py_Main+0x4db
+ python`main+0x11
+ python`_start+0x7a
+
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+
+ libc.so.1`malloc
+ libc.so.1`_real_gettext_u+0x81
+ libc.so.1`dgettext+0x5e
+ libc.so.1`strerror+0x40
+ libpython2.4.so.1.0`PyErr_SetFromErrnoWithFilenameObject+0x2d
+ libpython2.4.so.1.0`PyErr_SetFromErrnoWithFilename+0x27
+ libpython2.4.so.1.0`posix_error_with_allocated_filename+0x17
+ libpython2.4.so.1.0`posix_do_stat+0x21f
+ libpython2.4.so.1.0`posix_stat+0x1f
+ libpython2.4.so.1.0`PyCFunction_Call+0x15f
+ libpython2.4.so.1.0`call_function+0x406
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/posixpath.py:195 (isdir) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/site.py:202 (addsitepackages) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/site.py:382 (main) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/site.py:397 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0
+ libpython2.4.so.1.0`load_source_module+0xe6
+ libpython2.4.so.1.0`load_module+0xac
+ libpython2.4.so.1.0`import_submodule+0xfb
+ libpython2.4.so.1.0`load_next+0xa2
+ libpython2.4.so.1.0`import_module_ex+0x48
+ libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d
+ libpython2.4.so.1.0`builtin___import__+0x4e
+ libpython2.4.so.1.0`PyCFunction_Call+0x15f
+ libpython2.4.so.1.0`PyObject_Call+0x1d
+ libpython2.4.so.1.0`PyObject_CallFunction+0x90
+ libpython2.4.so.1.0`PyImport_Import+0x163
+ libpython2.4.so.1.0`PyImport_ImportModule+0x1f
+ libpython2.4.so.1.0`initsite+0x10
+ libpython2.4.so.1.0`Py_InitializeEx+0x1ea
+ libpython2.4.so.1.0`Py_Initialize+0xd
+ libpython2.4.so.1.0`Py_Main+0x4db
+ python`main+0x11
+ python`_start+0x7a
+
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+[... around 17000 lines truncated ...]
+
+
+ libc.so.1`malloc
+ libpython2.4.so.1.0`PyObject_Malloc+0x126
+ libpython2.4.so.1.0`fixstate+0x26
+ libpython2.4.so.1.0`fixdfa+0x2a
+ libpython2.4.so.1.0`PyGrammar_AddAccelerators+0x1b
+ libpython2.4.so.1.0`PyParser_New+0x18
+ libpython2.4.so.1.0`parsetok+0x17
+ libpython2.4.so.1.0`PyParser_ParseStringFlagsFilename+0x72
+ libpython2.4.so.1.0`PyParser_ParseStringFlags+0x1c
+ libpython2.4.so.1.0`PyParser_SimpleParseStringFlags+0x23
+ libpython2.4.so.1.0`PyRun_StringFlags+0x2c
+ libpython2.4.so.1.0`builtin_eval+0x273
+ libpython2.4.so.1.0`PyCFunction_Call+0x15f
+ libpython2.4.so.1.0`call_function+0x406
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/os.py:503 (_exists) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/os.py:509 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0
+ libpython2.4.so.1.0`load_source_module+0xe6
+ libpython2.4.so.1.0`load_module+0xac
+ libpython2.4.so.1.0`import_submodule+0xfb
+ libpython2.4.so.1.0`load_next+0xa2
+ libpython2.4.so.1.0`import_module_ex+0x48
+ libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d
+ libpython2.4.so.1.0`builtin___import__+0x4e
+ libpython2.4.so.1.0`PyCFunction_Call+0x15f
+ libpython2.4.so.1.0`PyObject_Call+0x1d
+ libpython2.4.so.1.0`PyEval_CallObjectWithKeywords+0xb8
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xd3c
+ [ /usr/lib/python2.4/site.py:58 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0
+ libpython2.4.so.1.0`load_source_module+0xe6
+ libpython2.4.so.1.0`load_module+0xac
+ libpython2.4.so.1.0`import_submodule+0xfb
+ libpython2.4.so.1.0`load_next+0xa2
+ libpython2.4.so.1.0`import_module_ex+0x48
+ libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d
+ libpython2.4.so.1.0`builtin___import__+0x4e
+ libpython2.4.so.1.0`PyCFunction_Call+0x15f
+ libpython2.4.so.1.0`PyObject_Call+0x1d
+ libpython2.4.so.1.0`PyObject_CallFunction+0x90
+ libpython2.4.so.1.0`PyImport_Import+0x163
+ libpython2.4.so.1.0`PyImport_ImportModule+0x1f
+ libpython2.4.so.1.0`initsite+0x10
+ libpython2.4.so.1.0`Py_InitializeEx+0x1ea
+ libpython2.4.so.1.0`Py_Initialize+0xd
+ libpython2.4.so.1.0`Py_Main+0x4db
+ python`main+0x11
+ python`_start+0x7a
+
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 331
+ 1024 | 0
+
+
+ libc.so.1`malloc
+ libpython2.4.so.1.0`new_arena+0x13
+ libpython2.4.so.1.0`PyObject_Malloc+0x91
+ libpython2.4.so.1.0`string_concat+0x109
+ libpython2.4.so.1.0`PyString_Concat+0x3b
+ libpython2.4.so.1.0`string_concatenate+0x150
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x27cc
+ [ /usr/lib/python2.4/posixpath.py:62 (join) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`function_call+0x15e
+ libpython2.4.so.1.0`PyObject_Call+0x1d
+ libpython2.4.so.1.0`ext_do_call+0xfb
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xb4f
+ [ /usr/lib/python2.4/site.py:66 (makepath) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`fast_function+0x112
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/site.py:138 (addpackage) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`fast_function+0x112
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/site.py:166 (addsitedir) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`fast_function+0x112
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ <string>:1 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ libpython2.4.so.1.0`run_err_node+0x1f
+ libpython2.4.so.1.0`PyRun_String+0x27
+ libpython2.4.so.1.0`exec_statement+0x2b0
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x15d6
+ [ /usr/lib/python2.4/site.py:134 (addpackage) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`fast_function+0x112
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/site.py:166 (addsitedir) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`fast_function+0x112
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/site.py:203 (addsitepackages) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/site.py:382 (main) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ /usr/lib/python2.4/site.py:397 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0
+ libpython2.4.so.1.0`load_source_module+0xe6
+ libpython2.4.so.1.0`load_module+0xac
+ libpython2.4.so.1.0`import_submodule+0xfb
+ libpython2.4.so.1.0`load_next+0xa2
+ libpython2.4.so.1.0`import_module_ex+0x48
+ libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d
+ libpython2.4.so.1.0`builtin___import__+0x4e
+ libpython2.4.so.1.0`PyCFunction_Call+0x15f
+ libpython2.4.so.1.0`PyObject_Call+0x1d
+ libpython2.4.so.1.0`PyObject_CallFunction+0x90
+ libpython2.4.so.1.0`PyImport_Import+0x163
+ libpython2.4.so.1.0`PyImport_ImportModule+0x1f
+ libpython2.4.so.1.0`initsite+0x10
+ libpython2.4.so.1.0`Py_InitializeEx+0x1ea
+ libpython2.4.so.1.0`Py_Initialize+0xd
+ libpython2.4.so.1.0`Py_Main+0x4db
+
+ value ------------- Distribution ------------- count
+ 131072 | 0
+ 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 524288 | 0
+
+
+ libc.so.1`malloc
+ libpython2.4.so.1.0`new_arena+0x13
+ libpython2.4.so.1.0`PyObject_Malloc+0x91
+ libpython2.4.so.1.0`_PyObject_GC_Malloc+0x13
+ libpython2.4.so.1.0`_PyObject_GC_NewVar+0x24
+ libpython2.4.so.1.0`PyTuple_New+0x78
+ libpython2.4.so.1.0`PyType_Ready+0x98
+ libpython2.4.so.1.0`PyType_Ready+0x60
+ libpython2.4.so.1.0`_Py_ReadyTypes+0x10
+ libpython2.4.so.1.0`Py_InitializeEx+0xed
+ libpython2.4.so.1.0`Py_Initialize+0xd
+ libpython2.4.so.1.0`Py_Main+0x4db
+ python`main+0x11
+ python`_start+0x7a
+
+ value ------------- Distribution ------------- count
+ 131072 | 0
+ 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 524288 | 0
+
+
+This output looks a little unusual at first glance, and can be confusing for
+people unfamiliar with stack tracing and Python engine internals.
+
+Start by looking at the distribution plots below each stack trace - each plot
+shows how many bytes were requested as a histogram by byte size. This should
+indicated to you if python is malloc()ing much memory or not, and whether it
+is doing so in a few large malloc()s or many small ones.
+
+With this information in mind you can inspect the stack traces - these explain
+why Python called malloc() in that instance, along with translations of Python
+functions buried in the stack trace. The stack traces can be hard to read at
+first (or even at second or at third) - since you are examining Python engine
+internals. Try looking for lines in square brackets - those are Python language
+frames, and will show where (or if) the malloc() was caused by Python code.
diff --git a/Examples/py_profile_example.txt b/Examples/py_profile_example.txt
new file mode 100644
index 000000000000..04c06886e4c2
--- /dev/null
+++ b/Examples/py_profile_example.txt
@@ -0,0 +1,399 @@
+The following are examples of py_profile.d.
+
+This samples stack traces for the process specified. This stack trace will
+cross the Python engine and system libraries, and insert translations for
+Python stack frames where appropriate. Here you can see it running on
+Code/Python/func_slow.py
+
+# py_profile.d -c ./func_slow.py
+Sampling 10-level stacks at 1001 Hertz... Hit Ctrl-C to end.
+Function A
+Function B
+Function C
+Top 25 most frequently sampled stacks,
+
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x266
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 11
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x278
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 11
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x278a
+ [ ./func_slow.py:10 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ 11
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x205
+ [ ./func_slow.py:18 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ libpython2.4.so.1.0`run_err_node+0x1f
+ libpython2.4.so.1.0`PyRun_FileExFlags+0x5e
+ libpython2.4.so.1.0`PyRun_SimpleFileExFlags+0x12f
+ 12
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x1fe
+ [ ./func_slow.py:10 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ 13
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x35d
+ [ ./func_slow.py:10 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ 13
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x1f5
+ [ ./func_slow.py:10 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ 14
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x149
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 14
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x5aa
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 14
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x58f
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 15
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x58f
+ [ ./func_slow.py:10 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ 15
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x254
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 17
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x286
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 17
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x2fbf
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 17
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x35d
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 18
+
+ libc.so.1`ioctl+0x7
+ libpython2.4.so.1.0`_init+0x25
+ ld.so.1`call_init+0xff
+ ld.so.1`setup+0xf93
+ ld.so.1`_setup+0x310
+ ld.so.1`_rt_boot+0x56
+ 0x8047e5c
+ 19
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x5a4
+ [ ./func_slow.py:18 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ libpython2.4.so.1.0`run_err_node+0x1f
+ libpython2.4.so.1.0`PyRun_FileExFlags+0x5e
+ libpython2.4.so.1.0`PyRun_SimpleFileExFlags+0x12f
+ 20
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x5ba
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 20
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x583
+ [ ./func_slow.py:10 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ 22
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x5a4
+ [ ./func_slow.py:10 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ 22
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x278a
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 24
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x205
+ [ ./func_slow.py:10 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732
+ libpython2.4.so.1.0`PyEval_EvalCode+0x22
+ libpython2.4.so.1.0`run_node+0x35
+ 25
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x583
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 35
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x5a4
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 47
+
+ libpython2.4.so.1.0`PyEval_EvalFrame+0x205
+ [ ./func_slow.py:3 (func_c) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:16 (func_b) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:24 (func_a) ]
+ libpython2.4.so.1.0`fast_function+0xa8
+ libpython2.4.so.1.0`call_function+0xda
+ libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ [ ./func_slow.py:26 (?) ]
+ 50
+
+ The lines in square brackets are the native Python frames, the rest
+ are the Python engine.
+
diff --git a/Examples/py_syscalls_example.txt b/Examples/py_syscalls_example.txt
new file mode 100644
index 000000000000..3aac3d28e882
--- /dev/null
+++ b/Examples/py_syscalls_example.txt
@@ -0,0 +1,129 @@
+The following are examples of py_syscalls.d.
+
+This is a simple script to count executed Python functions and system calls.
+Here it traces an example program, Code/Pythong/func_abc.py.
+
+# py_syscalls.d -c ./func_abc.py
+Tracing... Hit Ctrl-C to end.
+Function A
+Function B
+Function C
+
+Calls for PID 145538,
+
+ FILE TYPE NAME COUNT
+ UserDict.py func ? 1
+ UserDict.py func DictMixin 1
+ UserDict.py func IterableUserDict 1
+ UserDict.py func UserDict 1
+ UserDict.py func __init__ 1
+ __init__.py func ? 1
+ __init__.py func CodecRegistryError 1
+ __init__.py func normalize_encoding 1
+ __init__.py func search_function 1
+ aliases.py func ? 1
+ ascii.py func ? 1
+ ascii.py func Codec 1
+ ascii.py func StreamConverter 1
+ ascii.py func StreamReader 1
+ ascii.py func StreamWriter 1
+ ascii.py func getregentry 1
+ codecs.py func ? 1
+ codecs.py func Codec 1
+ codecs.py func StreamReader 1
+ codecs.py func StreamReaderWriter 1
+ codecs.py func StreamRecoder 1
+ codecs.py func StreamWriter 1
+ copy_reg.py func ? 1
+ func_abc.py func ? 1
+ func_abc.py func func_a 1
+ func_abc.py func func_b 1
+ func_abc.py func func_c 1
+ func_abc.py syscall getrlimit 1
+ func_abc.py syscall gtime 1
+ func_abc.py syscall memcntl 1
+ func_abc.py syscall rexit 1
+ func_abc.py syscall sigpending 1
+ func_abc.py syscall sysi86 1
+ func_abc.py syscall write 1
+ func_abc.py syscall xstat 1
+ linecache.py func ? 1
+ os.py func ? 1
+ os.py func _Environ 1
+ os.py func __init__ 1
+ os.py func _get_exports_list 1
+ posixpath.py func ? 1
+ posixpath.py func basename 1
+ posixpath.py func dirname 1
+ site.py func ? 1
+ site.py func _Helper 1
+ site.py func _Printer 1
+ site.py func _init_pathinfo 1
+ site.py func abs__file__ 1
+ site.py func addsitepackages 1
+ site.py func aliasmbcs 1
+ site.py func execsitecustomize 1
+ site.py func main 1
+ site.py func removeduppaths 1
+ site.py func setcopyright 1
+ site.py func setencoding 1
+ site.py func sethelper 1
+ site.py func setquit 1
+ stat.py func ? 1
+ types.py func ? 1
+ types.py func _C 1
+ warnings.py func ? 1
+ warnings.py func _OptionError 1
+ warnings.py func _processoptions 1
+ func_abc.py syscall fcntl 2
+ func_abc.py syscall fsat 2
+ func_abc.py syscall getcwd 2
+ func_abc.py syscall getpid 2
+ func_abc.py syscall mprotect 2
+ func_abc.py syscall readlink 2
+ func_abc.py syscall resolvepath 2
+ func_abc.py syscall setcontext 2
+ posixpath.py func exists 2
+ posixpath.py func split 2
+ site.py func addsitedir 2
+ warnings.py func simplefilter 2
+ copy_reg.py func constructor 3
+ copy_reg.py func pickle 3
+ func_abc.py syscall munmap 3
+ func_abc.py syscall pollsys 3
+ site.py func __init__ 3
+ site.py func addpackage 3
+ func_abc.py syscall getdents64 4
+ func_abc.py syscall open 4
+ func_abc.py syscall sysconfig 4
+ func_abc.py syscall mmap 5
+ func_abc.py syscall lwp_exit 6
+ stat.py func S_IFMT 6
+ stat.py func S_ISDIR 6
+ posixpath.py func isdir 8
+ os.py func _exists 10
+ <string> func ? 11
+ posixpath.py func normcase 14
+ site.py func makepath 14
+ posixpath.py func join 20
+ posixpath.py func abspath 22
+ posixpath.py func isabs 22
+ posixpath.py func normpath 22
+ func_abc.py syscall ioctl 28
+ func_abc.py syscall llseek 34
+ func_abc.py syscall read 36
+ func_abc.py syscall close 41
+ func_abc.py syscall sigaction 52
+ func_abc.py syscall brk 58
+ func_abc.py syscall fstat64 74
+ func_abc.py syscall stat64 77
+ func_abc.py syscall open64 173
+
+While tracing there were numerous system calls made, including 173 open64()'s,
+and 77 stat64()'s. There were also many functions called, including 22 each
+of abspath, isabs, and normpath by the posixpath.py library.
+
+This script can provide an insight to how an application is interacting
+with the system, by providing both application function calls and
+system calls in the same output.
+
diff --git a/Examples/py_syscolors_example.txt b/Examples/py_syscolors_example.txt
new file mode 100644
index 000000000000..0a6367f9fe6d
--- /dev/null
+++ b/Examples/py_syscolors_example.txt
@@ -0,0 +1,584 @@
+The following are examples of py_syscolors.d.
+
+This is a simple script to trace the flow of Python functons and system
+calls made, and renders the output in color ("colour") using terminal
+escape sequences (which you can tweak by modifying the script).
+
+Here it traces the example program, Code/Python/func_abc.py.
+
+WARNING: This output is full of terminal escape sequences, so if you are
+trying to view this through an editor or web browser - it may look awful.
+Try viewing this using "more" (although, depending on your terminal, it
+still may look awful).
+
+# py_syscolors.d -c ./func_abc.py
+C PID DELTA(us) FILE:LINE TYPE -- NAME
+0 145544 2 ":- syscall -> munmap
+0 145544 34 ":- syscall <- munmap
+0 145544 56 ":- syscall -> mmap
+0 145544 19 ":- syscall <- mmap
+0 145544 42 ":- syscall -> setcontext
+0 145544 10 ":- syscall <- setcontext
+0 145544 9 ":- syscall -> getrlimit
+0 145544 10 ":- syscall <- getrlimit
+0 145544 9 ":- syscall -> getpid
+0 145544 8 ":- syscall <- getpid
+0 145544 68 ":- syscall -> setcontext
+0 145544 8 ":- syscall <- setcontext
+0 145544 121 ":- syscall -> sigpending
+0 145544 9 ":- syscall <- sigpending
+0 145544 172 ":- syscall -> open64
+0 145544 114 ":- syscall <- open64
+0 145544 14 ":- syscall -> ioctl
+0 145544 28209 ":- syscall <- ioctl
+0 145544 285 ":- syscall -> close
+0 145544 31 ":- syscall <- close
+0 145544 41 ":- syscall -> open64
+0 145544 88 ":- syscall <- open64
+0 145544 9 ":- syscall -> ioctl
+0 145544 293 ":- syscall <- ioctl
+0 145544 11 ":- syscall -> close
+0 145544 13 ":- syscall <- close
+0 145544 1182 ":- syscall -> sysi86
+0 145544 12 ":- syscall <- sysi86
+0 145544 143 ":- syscall -> sysconfig
+0 145544 53 ":- syscall <- sysconfig
+0 145544 95 ":- syscall -> open64
+0 145544 22 ":- syscall <- open64
+0 145544 11 ":- syscall -> fstat64
+0 145544 10 ":- syscall <- fstat64
+0 145544 31 ":- syscall -> ioctl
+0 145544 42 ":- syscall <- ioctl
+0 145544 24 ":- syscall -> brk
+0 145544 10 ":- syscall <- brk
+0 145544 8 ":- syscall -> brk
+0 145544 17 ":- syscall <- brk
+0 145544 30 ":- syscall -> sysconfig
+0 145544 8 ":- syscall <- sysconfig
+0 145544 32 ":- syscall -> brk
+0 145544 7 ":- syscall <- brk
+0 145544 8 ":- syscall -> brk
+
+[... 1400 lines truncated ...]
+
+0 145544 8 ":- syscall -> fstat64
+0 145544 7 ":- syscall <- fstat64
+0 145544 11 ":- syscall -> read
+0 145544 8 ":- syscall <- read
+0 145544 29 ":- syscall -> brk
+0 145544 8 ":- syscall <- brk
+0 145544 8 ":- syscall -> brk
+0 145544 10 ":- syscall <- brk
+0 145544 393 ":- syscall -> llseek
+0 145544 8 ":- syscall <- llseek
+0 145544 9 ":- syscall -> close
+0 145544 9 ":- syscall <- close
+0 145544 14 aliases.py:17 func -> ?
+0 145544 57 aliases.py:18 func <- ?
+0 145544 20 ":- syscall -> llseek
+0 145544 8 ":- syscall <- llseek
+0 145544 8 ":- syscall -> close
+0 145544 8 ":- syscall <- close
+0 145544 15 __init__.py:43 func -> CodecRegistryError
+0 145544 12 __init__.py:45 func <- CodecRegistryError
+0 145544 26 __init__.py:145 func <- ?
+0 145544 18 ":- syscall -> llseek
+0 145544 8 ":- syscall <- llseek
+0 145544 8 ":- syscall -> close
+0 145544 9 ":- syscall <- close
+0 145544 13 __init__.py:69 func -> search_function
+0 145544 14 __init__.py:47 func -> normalize_encoding
+0 145544 18 __init__.py:67 func <- normalize_encoding
+0 145544 29 ":- syscall -> stat64
+0 145544 20 ":- syscall <- stat64
+0 145544 10 ":- syscall -> open64
+0 145544 18 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 17 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 18 ":- syscall <- open64
+0 145544 9 ":- syscall -> fstat64
+0 145544 8 ":- syscall <- fstat64
+0 145544 8 ":- syscall -> open64
+0 145544 18 ":- syscall <- open64
+0 145544 8 ":- syscall -> fstat64
+0 145544 8 ":- syscall <- fstat64
+0 145544 9 ":- syscall -> fstat64
+0 145544 7 ":- syscall <- fstat64
+0 145544 8 ":- syscall -> ioctl
+0 145544 7 ":- syscall <- ioctl
+0 145544 8 ":- syscall -> read
+0 145544 19 ":- syscall <- read
+0 145544 8 ":- syscall -> fstat64
+0 145544 8 ":- syscall <- fstat64
+0 145544 8 ":- syscall -> read
+0 145544 8 ":- syscall <- read
+0 145544 22 ":- syscall -> llseek
+0 145544 8 ":- syscall <- llseek
+0 145544 8 ":- syscall -> close
+0 145544 9 ":- syscall <- close
+0 145544 12 ascii.py:8 func -> ?
+0 145544 16 ascii.py:13 func -> Codec
+0 145544 12 ascii.py:18 func <- Codec
+0 145544 22 ascii.py:20 func -> StreamWriter
+0 145544 11 ascii.py:21 func <- StreamWriter
+0 145544 20 ascii.py:23 func -> StreamReader
+0 145544 11 ascii.py:24 func <- StreamReader
+0 145544 32 ascii.py:26 func -> StreamConverter
+0 145544 12 ascii.py:29 func <- StreamConverter
+0 145544 21 ascii.py:33 func <- ?
+0 145544 17 ":- syscall -> llseek
+0 145544 8 ":- syscall <- llseek
+0 145544 8 ":- syscall -> close
+0 145544 8 ":- syscall <- close
+0 145544 13 ascii.py:33 func -> getregentry
+0 145544 12 ascii.py:35 func <- getregentry
+0 145544 34 __init__.py:142 func <- search_function
+0 145544 23 ":- syscall -> ioctl
+0 145544 42 ":- syscall <- ioctl
+0 145544 11 ":- syscall -> ioctl
+0 145544 9 ":- syscall <- ioctl
+0 145544 12 ":- syscall -> readlink
+0 145544 16 ":- syscall <- readlink
+0 145544 20 ":- syscall -> resolvepath
+0 145544 18 ":- syscall <- resolvepath
+0 145544 12 ":- syscall -> getcwd
+0 145544 20 ":- syscall <- getcwd
+0 145544 27 ":- syscall -> ioctl
+0 145544 8 ":- syscall <- ioctl
+0 145544 14 ":- syscall -> llseek
+0 145544 7 ":- syscall <- llseek
+0 145544 8 ":- syscall -> fstat64
+0 145544 8 ":- syscall <- fstat64
+0 145544 8 ":- syscall -> fstat64
+0 145544 7 ":- syscall <- fstat64
+0 145544 8 ":- syscall -> ioctl
+0 145544 7 ":- syscall <- ioctl
+0 145544 8 ":- syscall -> read
+0 145544 19 ":- syscall <- read
+0 145544 9 ":- syscall -> llseek
+0 145544 7 ":- syscall <- llseek
+0 145544 8 ":- syscall -> llseek
+0 145544 7 ":- syscall <- llseek
+0 145544 12 ":- syscall -> read
+0 145544 13 ":- syscall <- read
+0 145544 105 ":- syscall -> read
+0 145544 9 ":- syscall <- read
+0 145544 10 ":- syscall -> llseek
+0 145544 7 ":- syscall <- llseek
+0 145544 8 ":- syscall -> close
+0 145544 9 ":- syscall <- close
+0 145544 117 func_abc.py:3 func -> ?
+0 145544 20 ":- syscall -> stat64
+0 145544 15 ":- syscall <- stat64
+0 145544 10 ":- syscall -> stat64
+0 145544 13 ":- syscall <- stat64
+0 145544 10 ":- syscall -> open64
+0 145544 15 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 13 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 13 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 13 ":- syscall <- open64
+0 145544 9 ":- syscall -> stat64
+0 145544 13 ":- syscall <- stat64
+0 145544 9 ":- syscall -> open64
+0 145544 13 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 13 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 13 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 13 ":- syscall <- open64
+0 145544 9 ":- syscall -> stat64
+0 145544 15 ":- syscall <- stat64
+0 145544 8 ":- syscall -> open64
+0 145544 15 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 15 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 15 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 15 ":- syscall <- open64
+0 145544 9 ":- syscall -> stat64
+0 145544 17 ":- syscall <- stat64
+0 145544 9 ":- syscall -> open64
+0 145544 17 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 16 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 16 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 16 ":- syscall <- open64
+0 145544 8 ":- syscall -> stat64
+0 145544 17 ":- syscall <- stat64
+0 145544 8 ":- syscall -> open64
+0 145544 17 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 16 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 16 ":- syscall <- open64
+0 145544 8 ":- syscall -> open64
+0 145544 16 ":- syscall <- open64
+0 145544 9 ":- syscall -> stat64
+0 145544 17 ":- syscall <- stat64
+0 145544 8 ":- syscall -> open64
+0 145544 19 ":- syscall <- open64
+0 145544 14 ":- syscall -> fstat64
+0 145544 9 ":- syscall <- fstat64
+0 145544 20 ":- syscall -> xstat
+0 145544 18 ":- syscall <- xstat
+0 145544 8 ":- syscall -> resolvepath
+0 145544 19 ":- syscall <- resolvepath
+0 145544 10 ":- syscall -> open
+0 145544 19 ":- syscall <- open
+0 145544 10 ":- syscall -> mmap
+0 145544 21 ":- syscall <- mmap
+0 145544 33 ":- syscall -> mmap
+0 145544 13 ":- syscall <- mmap
+0 145544 9 ":- syscall -> mmap
+0 145544 16 ":- syscall <- mmap
+0 145544 8 ":- syscall -> mmap
+0 145544 11 ":- syscall <- mmap
+0 145544 34 ":- syscall -> munmap
+0 145544 11 ":- syscall <- munmap
+0 145544 43 ":- syscall -> memcntl
+0 145544 13 ":- syscall <- memcntl
+0 145544 8 ":- syscall -> close
+0 145544 9 ":- syscall <- close
+0 145544 30 ":- syscall -> mprotect
+0 145544 13 ":- syscall <- mprotect
+0 145544 169 ":- syscall -> mprotect
+0 145544 13 ":- syscall <- mprotect
+0 145544 2 ":- syscall <- nosys
+0 145544 280 ":- syscall -> open
+0 145544 90 ":- syscall <- open
+0 145544 154 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 214 ":- syscall -> ioctl
+0 145544 301 ":- syscall <- ioctl
+0 145544 186 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 210 ":- syscall -> close
+0 145544 18 ":- syscall <- close
+0 145544 146 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 208 ":- syscall -> open
+0 145544 73 ":- syscall <- open
+0 145544 151 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 209 ":- syscall -> ioctl
+0 145544 45 ":- syscall <- ioctl
+0 145544 171 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 194 ":- syscall -> close
+0 145544 17 ":- syscall <- close
+0 145544 145 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 203 ":- syscall -> open
+0 145544 63 ":- syscall <- open
+0 145544 150 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 209 ":- syscall -> ioctl
+0 145544 280 ":- syscall <- ioctl
+0 145544 185 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 193 ":- syscall -> close
+0 145544 17 ":- syscall <- close
+0 145544 145 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 230 ":- syscall -> open
+0 145544 82 ":- syscall <- open
+0 145544 151 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 210 ":- syscall -> ioctl
+0 145544 45 ":- syscall <- ioctl
+0 145544 171 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 195 ":- syscall -> close
+0 145544 18 ":- syscall <- close
+0 145544 145 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 204 ":- syscall -> open
+0 145544 64 ":- syscall <- open
+0 145544 149 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 208 ":- syscall -> ioctl
+0 145544 283 ":- syscall <- ioctl
+0 145544 184 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 192 ":- syscall -> close
+0 145544 17 ":- syscall <- close
+0 145544 146 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 209 ":- syscall -> open
+0 145544 72 ":- syscall <- open
+0 145544 150 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 209 ":- syscall -> ioctl
+0 145544 45 ":- syscall <- ioctl
+0 145544 171 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 198 ":- syscall -> close
+0 145544 17 ":- syscall <- close
+0 145544 860 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 223 ":- syscall -> open
+0 145544 83 ":- syscall <- open
+0 145544 151 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 213 ":- syscall -> ioctl
+0 145544 281 ":- syscall <- ioctl
+0 145544 187 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 196 ":- syscall -> close
+0 145544 19 ":- syscall <- close
+0 145544 145 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 209 ":- syscall -> open
+0 145544 69 ":- syscall <- open
+0 145544 151 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 213 ":- syscall -> ioctl
+0 145544 47 ":- syscall <- ioctl
+0 145544 173 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 199 ":- syscall -> close
+0 145544 18 ":- syscall <- close
+0 145544 144 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 212 ":- syscall -> open
+0 145544 67 ":- syscall <- open
+0 145544 149 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 213 ":- syscall -> ioctl
+0 145544 282 ":- syscall <- ioctl
+0 145544 187 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 197 ":- syscall -> close
+0 145544 59 ":- syscall <- close
+0 145544 637 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 222 ":- syscall -> open
+0 145544 80 ":- syscall <- open
+0 145544 151 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 214 ":- syscall -> ioctl
+0 145544 47 ":- syscall <- ioctl
+0 145544 172 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 199 ":- syscall -> close
+0 145544 19 ":- syscall <- close
+0 145544 144 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 205 ":- syscall -> open
+0 145544 62 ":- syscall <- open
+0 145544 150 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 211 ":- syscall -> ioctl
+0 145544 304 ":- syscall <- ioctl
+0 145544 190 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 197 ":- syscall -> close
+0 145544 17 ":- syscall <- close
+0 145544 145 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 211 ":- syscall -> open
+0 145544 70 ":- syscall <- open
+0 145544 149 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 211 ":- syscall -> ioctl
+0 145544 46 ":- syscall <- ioctl
+0 145544 172 ":- syscall -> lwp_exit
+0 145544 2 ":- syscall <- nosys
+0 145544 260 ":- syscall -> close
+0 145544 26 ":- syscall <- close
+0 145544 160 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 207 ":- syscall -> open
+0 145544 79 ":- syscall <- open
+0 145544 151 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 216 ":- syscall -> ioctl
+0 145544 274 ":- syscall <- ioctl
+0 145544 187 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 195 ":- syscall -> close
+0 145544 17 ":- syscall <- close
+0 145544 145 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 211 ":- syscall -> open
+0 145544 70 ":- syscall <- open
+0 145544 149 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 214 ":- syscall -> ioctl
+0 145544 48 ":- syscall <- ioctl
+0 145544 173 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 201 ":- syscall -> close
+0 145544 17 ":- syscall <- close
+0 145544 145 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 211 ":- syscall -> open
+0 145544 65 ":- syscall <- open
+0 145544 150 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 213 ":- syscall -> ioctl
+0 145544 324 ":- syscall <- ioctl
+0 145544 342 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 203 ":- syscall -> close
+0 145544 19 ":- syscall <- close
+0 145544 145 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 213 ":- syscall -> open
+0 145544 76 ":- syscall <- open
+0 145544 150 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 214 ":- syscall -> ioctl
+0 145544 48 ":- syscall <- ioctl
+0 145544 174 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 198 ":- syscall -> close
+0 145544 18 ":- syscall <- close
+0 145544 146 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 206 ":- syscall -> open
+0 145544 63 ":- syscall <- open
+0 145544 150 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 213 ":- syscall -> ioctl
+0 145544 272 ":- syscall <- ioctl
+0 145544 185 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 194 ":- syscall -> close
+0 145544 17 ":- syscall <- close
+0 145544 146 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 213 ":- syscall -> open
+0 145544 70 ":- syscall <- open
+0 145544 151 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 214 ":- syscall -> ioctl
+0 145544 47 ":- syscall <- ioctl
+0 145544 173 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 236 ":- syscall -> close
+0 145544 23 ":- syscall <- close
+0 145544 156 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 210 ":- syscall -> open
+0 145544 76 ":- syscall <- open
+0 145544 150 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 214 ":- syscall -> ioctl
+0 145544 276 ":- syscall <- ioctl
+0 145544 187 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 197 ":- syscall -> close
+0 145544 17 ":- syscall <- close
+0 145544 145 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 211 ":- syscall -> open
+0 145544 71 ":- syscall <- open
+0 145544 149 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 214 ":- syscall -> ioctl
+0 145544 47 ":- syscall <- ioctl
+0 145544 172 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 199 ":- syscall -> close
+0 145544 19 ":- syscall <- close
+0 145544 144 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 210 ":- syscall -> open
+0 145544 64 ":- syscall <- open
+0 145544 150 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 212 ":- syscall -> ioctl
+0 145544 297 ":- syscall <- ioctl
+0 145544 522 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 210 ":- syscall -> close
+0 145544 21 ":- syscall <- close
+0 145544 146 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 213 ":- syscall -> open
+0 145544 79 ":- syscall <- open
+0 145544 151 ":- syscall -> lwp_exit
+0 145544 0 ":- syscall <- nosys
+0 145544 213 ":- syscall -> ioctl
+0 145544 47 ":- syscall <- ioctl
+0 145544 173 ":- syscall -> lwp_exit
+0 145544 1 ":- syscall <- nosys
+0 145544 201 ":- syscall -> close
+0 145544 19 ":- syscall <- close
+0 145544 144 ":- syscall -> lwp_exit
+0 145544 91667 ":- syscall -> munmap
+0 145544 34 ":- syscall <- munmap
+0 145544 65 ":- syscall -> gtime
+0 145544 9 ":- syscall <- gtime
+0 145544 13 ":- syscall -> open
+0 145544 42 ":- syscall <- open
+0 145544 10 ":- syscall -> fstat64
+0 145544 9 ":- syscall <- fstat64
+0 145544 8 ":- syscall -> read
+0 145544 31 ":- syscall <- read
+0 145544 9 ":- syscall -> close
+0 145544 11 ":- syscall <- close
+0 145544 65 ":- syscall -> llseek
+0 145544 9 ":- syscall <- llseek
+0 145544 8 ":- syscall -> close
+0 145544 9 ":- syscall <- close
+0 145544 25 func_abc.py:14 func -> func_a
+0 145544 24 ":- syscall -> ioctl
+0 145544 9 ":- syscall <- ioctl
+0 145544 8 ":- syscall -> fstat64
+0 145544 8 ":- syscall <- fstat64
+0 145544 9 ":- syscall -> fstat64
+0 145544 7 ":- syscall <- fstat64
+0 145544 40 ":- syscall -> pollsys
+0 145544 1009424 ":- syscall <- pollsys
+0 145544 35 func_abc.py:9 func -> func_b
+0 145544 40 ":- syscall -> pollsys
+0 145544 1009681 ":- syscall <- pollsys
+0 145544 36 func_abc.py:5 func -> func_c
+0 145544 41 ":- syscall -> pollsys
+Function A
+Function B
+Function C
+0 145544 1000116 ":- syscall <- pollsys
+0 145544 34 func_abc.py:7 func <- func_c
+0 145544 28 func_abc.py:12 func <- func_b
+0 145544 14 func_abc.py:17 func <- func_a
+0 145544 14 func_abc.py:19 func <- ?
+0 145544 26 ":- syscall -> sigaction
+0 145544 15 ":- syscall <- sigaction
+0 145544 1150 ":- syscall -> write
+0 145544 21 ":- syscall <- write
+0 145544 212 ":- syscall -> open64
+0 145544 116 ":- syscall <- open64
+0 145544 11 ":- syscall -> ioctl
+0 145544 24 ":- syscall <- ioctl
+0 145544 10 ":- syscall -> close
+0 145544 16 ":- syscall <- close
+0 145544 8 ":- syscall -> open64
+0 145544 32 ":- syscall <- open64
+0 145544 9 ":- syscall -> ioctl
+0 145544 169 ":- syscall <- ioctl
+0 145544 10 ":- syscall -> close
+0 145544 12 ":- syscall <- close
+0 145544 62 ":- syscall -> rexit
+
+Here you can see the output showing the path the script follows as it is
+executed.
+
+0 145544 35 func_abc.py:9 func -> func_b
+0 145544 40 ":- syscall -> pollsys
+0 145544 1009681 ":- syscall <- pollsys
+0 145544 36 func_abc.py:5 func -> func_c
+
+This excerpt shows line 9 of the script executing. It makes a pollsys syscall
+in order to fulfill the request to sleep for one second, returns and then goes
+to line 5. Checking the logic flow of the example program, this makes sense.
diff --git a/Examples/py_who_example.txt b/Examples/py_who_example.txt
new file mode 100644
index 000000000000..7d1c3f1c27b0
--- /dev/null
+++ b/Examples/py_who_example.txt
@@ -0,0 +1,34 @@
+These are examples of the results after running the py_who.d script.
+
+This script shows which UIDs and PIDs are running Python programs with Python
+provider support, and how active they are. It lists the name of the program,
+along with the number of lines executed per program as recorded by the line
+provider.
+
+Here it runs as the Code/Python/func_abc.py program is executed.
+
+# py_who.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+ PID UID FUNCS FILE
+ 145442 0 1 /usr/lib/python2.4/encodings/aliases.py
+ 145442 0 1 /usr/lib/python2.4/linecache.py
+ 145442 0 2 /usr/lib/python2.4/types.py
+ 145442 0 4 /usr/lib/python2.4/encodings/__init__.py
+ 145442 0 4 func_abc.py
+ 145442 0 5 /usr/lib/python2.4/UserDict.py
+ 145442 0 5 /usr/lib/python2.4/warnings.py
+ 145442 0 6 /usr/lib/python2.4/codecs.py
+ 145442 0 6 /usr/lib/python2.4/encodings/ascii.py
+ 145442 0 7 /usr/lib/python2.4/copy_reg.py
+ 145442 0 11 <string>
+ 145442 0 13 /usr/lib/python2.4/stat.py
+ 145442 0 14 /usr/lib/python2.4/os.py
+ 145442 0 36 /usr/lib/python2.4/site.py
+ 145442 0 115 /usr/lib/python2.4/posixpath.py
+
+You can see that the program itself had four lines executed attributed to it,
+and the other lines in the program were associated with their particular
+Python library calls.
+
diff --git a/Examples/rb_calldist_example.txt b/Examples/rb_calldist_example.txt
new file mode 100644
index 000000000000..088497c56286
--- /dev/null
+++ b/Examples/rb_calldist_example.txt
@@ -0,0 +1,153 @@
+The following is an example of running rb_calldist.d and tracing the elapsed
+times for functions.
+
+We run rb_calldist.d while running the program Code/Ruby/func_abc.rb. We can
+see that there are three sections in the DTrace output
+
+# rb_calldist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Elapsed times (us),
+ ., obj-new, NoMemoryError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ., obj-new, SystemStackError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ., obj-new, ThreadGroup
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ ., obj-new, fatal
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ ., obj-new, Object
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 | 0
+ 8 | 0
+ 16 |@@@@@@@@@@@@@ 1
+ 32 | 0
+
+
+Exclusive function elapsed times (us),
+ func_abc.rb, func, Module::method_added
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 |@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ func_abc.rb, func, Object::print
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 |@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ func_abc.rb, func, IO::write
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 |@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ func_abc.rb, func, Object::func_a
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ func_abc.rb, func, Object::func_b
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ func_abc.rb, func, Object::func_c
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ func_abc.rb, func, Object::sleep
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 1048576 | 0
+
+
+Inclusive function elapsed times (us),
+ func_abc.rb, func, Module::method_added
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 |@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ func_abc.rb, func, IO::write
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 |@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ func_abc.rb, func, Object::print
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 128 |@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ func_abc.rb, func, Object::func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_abc.rb, func, Object::func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_abc.rb, func, Object::sleep
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 1048576 | 0
+
+ func_abc.rb, func, Object::func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+The elapsed times show us that the script spent some small amount of time
+processing various events that were not functions. In this case they were all
+obj-new events, and you can see that the slowest of these was a new Object at
+between 16 microseconds and 31 microseconds.
+
+The exclusive subroutine elapsed times show that each of our user defined
+functions took between 256 and 511 microseconds. This time excludes the time
+spent in other subroutines.
+
+The inclusive subroutine elapsed times show that func_c() took between 0.5
+seconds and 1 second, func_b() took between 1 second and 2.1 seconds, and
+func_a() took between 2.1 seconds and 4.2 seconds to execute. This time
+includes the time spent in other subroutines called, and since func_a() called
+func_b() which called func_c(), these times make sense.
+
diff --git a/Examples/rb_calls_example.txt b/Examples/rb_calls_example.txt
new file mode 100644
index 000000000000..acc0d4d4ef7b
--- /dev/null
+++ b/Examples/rb_calls_example.txt
@@ -0,0 +1,29 @@
+The following are examples of the results of running the rb_calls.d script.
+
+This script traces activity from all Ruby programs on the system that are
+running with Ruby provider support. In this example we see it running while
+the Code/Ruby/func_abc.rb script is run.
+
+# rb_calls.d
+Tracing... Hit Ctrl-C to end.
+^C
+ FILE TYPE NAME CALLS
+ . obj-new NoMemoryError 1
+ . obj-new SystemStackError 1
+ . obj-new ThreadGroup 1
+ . obj-new fatal 1
+ func_abc.rb method Object::func_a 1
+ func_abc.rb method Object::func_b 1
+ func_abc.rb method Object::func_c 1
+ . obj-new Object 3
+ func_abc.rb method IO::write 3
+ func_abc.rb method Module::method_added 3
+ func_abc.rb method Object::print 3
+ func_abc.rb method Object::sleep 3
+
+We can see that the file func_abc.rb called each of the user-defined functions
+included in the script; func_a, func_b, and func_c. It also called the print
+object and sleep amongst other things. Interspersed in the output are calls
+to new objects that are not tied to the program func_abc.rb. They are called
+from the Ruby engine for some other reason.
+
diff --git a/Examples/rb_calltime_example.txt b/Examples/rb_calltime_example.txt
new file mode 100644
index 000000000000..7245fec0e7f8
--- /dev/null
+++ b/Examples/rb_calltime_example.txt
@@ -0,0 +1,77 @@
+The following is an example of running rb_calltime.d and tracing the elapsed
+times for functions.
+
+We run rb_calltime.d while running the program Code/Ruby/func_abc.rb. We can
+see that there are four sections in the DTrace output
+
+# rb_calltime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ . obj-new NoMemoryError 1
+ . obj-new SystemStackError 1
+ . obj-new ThreadGroup 1
+ . obj-new fatal 1
+ func_abc.rb func Object::func_a 1
+ func_abc.rb func Object::func_b 1
+ func_abc.rb func Object::func_c 1
+ . obj-new Object 3
+ func_abc.rb func IO::write 3
+ func_abc.rb func Module::method_added 3
+ func_abc.rb func Object::print 3
+ func_abc.rb func Object::sleep 3
+ - total - 15
+
+Elapsed times (us),
+ FILE TYPE NAME TOTAL
+ . obj-new SystemStackError 3
+ . obj-new NoMemoryError 3
+ . obj-new fatal 11
+ . obj-new ThreadGroup 13
+ . obj-new Object 26
+
+Exclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.rb func Module::method_added 9
+ func_abc.rb func Object::print 92
+ func_abc.rb func IO::write 185
+ func_abc.rb func Object::func_c 344
+ func_abc.rb func Object::func_a 379
+ func_abc.rb func Object::func_b 383
+ func_abc.rb func Object::sleep 3020597
+ - total - 3021992
+
+Inclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.rb func Module::method_added 9
+ func_abc.rb func IO::write 185
+ func_abc.rb func Object::print 277
+ func_abc.rb func Object::func_c 1009829
+ func_abc.rb func Object::func_b 2019781
+ func_abc.rb func Object::sleep 3020597
+ func_abc.rb func Object::func_a 3021983
+
+The first section, Count, shows us how many times each function associated
+with func_abc.rb was called. It also shows other functions called by the Ruby
+engine.
+
+The second section, elapsed times, shows how long each action that was not
+calling a function took.
+
+The third section, exclusive function elapsed times, shows us how many
+microseconds the program spends in each function. This does not include the
+time spent in any sub-functions called by that particular function. The last
+line gives us the total time in microseconds.
+
+The fourth section, inclusive function elapsed times, are the absolute time
+from when the function began to when it completed - which includes off-CPU time
+due to other system events such as I/O, scheduling, interrupts, etc. In
+particular, for this case it has included the time waiting for the sleep
+commands.
+
+Elapsed times are useful for identifying where latencies are.
+See Notes/ALLelapsed_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive function time.
diff --git a/Examples/rb_cpudist_example.txt b/Examples/rb_cpudist_example.txt
new file mode 100644
index 000000000000..718495e394f0
--- /dev/null
+++ b/Examples/rb_cpudist_example.txt
@@ -0,0 +1,199 @@
+The following are examples of rb_cpudist.d.
+
+This script traces the on-CPU time of Ruby functions and prints a report in
+the form of a histogram. Here it traces the example program,
+Code/Ruby/func_slow.rb
+
+# rb_cpudist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+On-CPU times (us),
+ ., obj-new, NoMemoryError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ., obj-new, SystemStackError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ ., obj-new, ThreadGroup
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ ., obj-new, fatal
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ ., obj-new, Object
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 | 0
+ 8 |@@@@@@@@@@@@@ 1
+ 16 | 0
+
+
+Exclusive function on-CPU times (us),
+ func_slow.rb, func, Module::method_added
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 2 | 0
+
+ func_slow.rb, func, Object::print
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 8 |@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ func_slow.rb, func, IO::write
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 |@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ func_slow.rb, func, Object::func_a
+ value ------------- Distribution ------------- count
+ 131072 | 0
+ 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 524288 | 0
+
+ func_slow.rb, func, Object::func_b
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_slow.rb, func, Fixnum::<
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 599556
+ 2 | 72
+ 4 | 35
+ 8 | 128
+ 16 | 158
+ 32 | 49
+ 64 | 3
+ 128 | 2
+ 256 | 0
+
+ func_slow.rb, func, Object::func_c
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_slow.rb, func, Fixnum::+
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1199062
+ 2 | 138
+ 4 | 74
+ 8 | 279
+ 16 | 344
+ 32 | 91
+ 64 | 9
+ 128 | 0
+ 256 | 3
+ 512 | 0
+
+
+Inclusive function on-CPU times (us),
+ func_slow.rb, func, Module::method_added
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 2 | 0
+
+ func_slow.rb, func, IO::write
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 |@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ func_slow.rb, func, Object::print
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 |@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ func_slow.rb, func, Fixnum::<
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 599556
+ 2 | 72
+ 4 | 35
+ 8 | 128
+ 16 | 158
+ 32 | 49
+ 64 | 3
+ 128 | 2
+ 256 | 0
+
+ func_slow.rb, func, Fixnum::+
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1199062
+ 2 | 138
+ 4 | 74
+ 8 | 279
+ 16 | 344
+ 32 | 91
+ 64 | 9
+ 128 | 0
+ 256 | 3
+ 512 | 0
+
+ func_slow.rb, func, Object::func_b
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+ func_slow.rb, func, Object::func_c
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+ func_slow.rb, func, Object::func_a
+ value ------------- Distribution ------------- count
+ 2097152 | 0
+ 4194304 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8388608 | 0
+
+You can see that the results are in three sections.
+
+The first section shows us the on-CPU time for actions that were not of the
+type 'func'.
+
+The second section, Exclusive function on-CPU times, shows us the time spent
+on-CPU by various functions, not including time spent in subroutines. You can
+see here that Object::print had two instances of being on-CPU between 4
+microseconds and 7 microseconds, and once instance of being on-CPU between 8
+microseconds and 15 microseconds.
+
+The third section, Inclusive function on-CPU times, shows us the time spent
+on-CPU by various functions, including that time spent in subroutines called
+by those functions. You can see that here Object::print had two instances
+of being on-CPU between 32 microseconds and 63 microseconds, and one instance
+of being on-CPU between 64 microseconds and 127 microseconds.
+
+It is important to pay close attention to the third column, "count" as this
+will indicate if there were any instances in a particular timeframe, even if
+the number is too small to show up on the histogram clearly. See Inclusive
+function on-CPU time for Fixnum::+ for an example.
+
diff --git a/Examples/rb_cputime_example.txt b/Examples/rb_cputime_example.txt
new file mode 100644
index 000000000000..edfa5aa75da2
--- /dev/null
+++ b/Examples/rb_cputime_example.txt
@@ -0,0 +1,81 @@
+The following are examples of rb_cputime.d.
+
+This script traces the on-CPU time of Ruby functions and prints a report.
+Here it traces the example program, Code/Ruby/func_slow.rb
+
+# rb_cputime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Count,
+ FILE TYPE NAME COUNT
+ . obj-new NoMemoryError 1
+ . obj-new SystemStackError 1
+ . obj-new ThreadGroup 1
+ . obj-new fatal 1
+ func_slow.rb func Object::func_a 1
+ func_slow.rb func Object::func_b 1
+ func_slow.rb func Object::func_c 1
+ . obj-new Object 3
+ func_slow.rb func IO::write 3
+ func_slow.rb func Module::method_added 3
+ func_slow.rb func Object::print 3
+ func_slow.rb func Fixnum::< 600003
+ func_slow.rb func Fixnum::+ 1200000
+ - total - 1800015
+
+Elapsed times (us),
+ FILE TYPE NAME TOTAL
+ . obj-new SystemStackError 2
+ . obj-new NoMemoryError 2
+ . obj-new fatal 11
+ . obj-new ThreadGroup 12
+ . obj-new Object 19
+
+Exclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_slow.rb func Module::method_added 4
+ func_slow.rb func Object::print 57
+ func_slow.rb func IO::write 180
+ func_slow.rb func Object::func_a 405946
+ func_slow.rb func Fixnum::< 691125
+ func_slow.rb func Object::func_b 809970
+ func_slow.rb func Object::func_c 1225235
+ func_slow.rb func Fixnum::+ 1285200
+ - total - 4417721
+
+Inclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_slow.rb func Module::method_added 4
+ func_slow.rb func IO::write 180
+ func_slow.rb func Object::print 238
+ func_slow.rb func Fixnum::< 691125
+ func_slow.rb func Fixnum::+ 1285200
+ func_slow.rb func Object::func_c 2212572
+ func_slow.rb func Object::func_b 3683688
+ func_slow.rb func Object::func_a 4417717
+
+You can see the results are printed in four sections.
+
+The first section reports how many times each subroutine was called, and it's
+type.
+
+The second section reports on the on-CPU time of anything that was not of type
+"func", in this case the only elements reported here are of type obj-new.
+
+The exclusive function on-CPU times shows, amongst other results, that func_a
+spent around 0.4 seconds on-CPU. This time excludes time spent in other
+subroutines.
+
+The inclusive function on-CPU times show that func_a spent around 4.4
+seconds on-CPU. This includes the time spent in other subroutines called.
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the subroutine began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
diff --git a/Examples/rb_flow_example.txt b/Examples/rb_flow_example.txt
new file mode 100644
index 000000000000..6cfa54ff0084
--- /dev/null
+++ b/Examples/rb_flow_example.txt
@@ -0,0 +1,54 @@
+The following are examples of rb_flow.d.
+
+This is a simple script to trace the flow of Ruby functions.
+Here it traces the example program, Code/Ruby/func_abc.rb
+
+# rb_flow.d
+ C TIME(us) FILE -- CLASS::METHOD
+ 0 3066417516583 func_abc.rb -> Module::method_added
+ 0 3066417516640 func_abc.rb <- Module::method_added
+ 0 3066417516658 func_abc.rb -> Module::method_added
+ 0 3066417516668 func_abc.rb <- Module::method_added
+ 0 3066417516680 func_abc.rb -> Module::method_added
+ 0 3066417516689 func_abc.rb <- Module::method_added
+ 0 3066417516701 func_abc.rb -> Object::func_a
+ 0 3066417516711 func_abc.rb -> Object::print
+ 0 3066417516730 func_abc.rb -> IO::write
+ 0 3066417516832 func_abc.rb <- IO::write
+ 0 3066417516841 func_abc.rb <- Object::print
+ 0 3066417516849 func_abc.rb -> Object::sleep
+ 0 3066418520705 func_abc.rb <- Object::sleep
+ 0 3066418520727 func_abc.rb -> Object::func_b
+ 0 3066418520744 func_abc.rb -> Object::print
+ 0 3066418520753 func_abc.rb -> IO::write
+ 0 3066418520796 func_abc.rb <- IO::write
+ 0 3066418520805 func_abc.rb <- Object::print
+ 0 3066418520813 func_abc.rb -> Object::sleep
+ 0 3066419530803 func_abc.rb <- Object::sleep
+ 0 3066419530825 func_abc.rb -> Object::func_c
+ 0 3066419530842 func_abc.rb -> Object::print
+ 0 3066419530852 func_abc.rb -> IO::write
+ 0 3066419530893 func_abc.rb <- IO::write
+ 0 3066419530902 func_abc.rb <- Object::print
+ 0 3066419530910 func_abc.rb -> Object::sleep
+ 0 3066420540804 func_abc.rb <- Object::sleep
+ 0 3066420540822 func_abc.rb <- Object::func_c
+ 0 3066420540831 func_abc.rb <- Object::func_b
+ 0 3066420540840 func_abc.rb <- Object::func_a
+^C
+
+The fourth column is indented by 2 spaces to show when a new function begins.
+This shows which function is calling which - the output above begins by adding
+new methods, then showing that func_a began; did some print IO; slept, and
+returned from sleep; and then called func_b.
+
+The TIME(us) column shows time from boot in microseconds.
+
+The FILE column shows the file that was being executed.
+
+If the output looks illogical, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/rb_flowinfo_example.txt b/Examples/rb_flowinfo_example.txt
new file mode 100644
index 000000000000..14fd851fab4a
--- /dev/null
+++ b/Examples/rb_flowinfo_example.txt
@@ -0,0 +1,54 @@
+Following are examples of rb_flowinfo.d.
+
+This is a simple script to trace the flow of Ruby methods. Here it traces the
+example program, Code/Ruby/func_abc.rb.
+
+# rb_flowinfo.d
+C PID DELTA(us) FILE:LINE TYPE -- NAME
+0 146395 2 func_abc.rb:3 method -> Module::method_added
+0 146395 26 func_abc.rb:3 method <- Module::method_added
+0 146395 25 func_abc.rb:8 method -> Module::method_added
+0 146395 11 func_abc.rb:8 method <- Module::method_added
+0 146395 16 func_abc.rb:14 method -> Module::method_added
+0 146395 10 func_abc.rb:14 method <- Module::method_added
+0 146395 15 func_abc.rb:20 method -> Object::func_a
+0 146395 12 func_abc.rb:15 method -> Object::print
+0 146395 20 func_abc.rb:15 method -> IO::write
+0 146395 110 func_abc.rb:15 method <- IO::write
+0 146395 11 func_abc.rb:15 method <- Object::print
+0 146395 11 func_abc.rb:16 method -> Object::sleep
+0 146395 1003728 func_abc.rb:16 method <- Object::sleep
+0 146395 35 func_abc.rb:17 method -> Object::func_b
+0 146395 20 func_abc.rb:9 method -> Object::print
+0 146395 12 func_abc.rb:9 method -> IO::write
+0 146395 42 func_abc.rb:9 method <- IO::write
+0 146395 11 func_abc.rb:9 method <- Object::print
+0 146395 11 func_abc.rb:10 method -> Object::sleep
+0 146395 1009976 func_abc.rb:10 method <- Object::sleep
+0 146395 35 func_abc.rb:11 method -> Object::func_c
+0 146395 20 func_abc.rb:4 method -> Object::print
+0 146395 12 func_abc.rb:4 method -> IO::write
+0 146395 38 func_abc.rb:4 method <- IO::write
+0 146395 11 func_abc.rb:4 method <- Object::print
+0 146395 11 func_abc.rb:5 method -> Object::sleep
+0 146395 1009883 func_abc.rb:5 method <- Object::sleep
+0 146395 29 func_abc.rb:5 method <- Object::func_c
+0 146395 12 func_abc.rb:11 method <- Object::func_b
+0 146395 11 func_abc.rb:17 method <- Object::func_a
+^C
+
+As each method is entered, the last column is indented by 2 spaces. This
+shows which method is calling which.
+
+The DELTA(us) column shows the change in time from the previous line to the
+current line.
+
+The LINE column shows the line in the file what was being executed. Refer
+to the source program to see what this line refers to.
+
+If the output looks shuffled, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/rb_flowtime_example.txt b/Examples/rb_flowtime_example.txt
new file mode 100644
index 000000000000..27102da8ec35
--- /dev/null
+++ b/Examples/rb_flowtime_example.txt
@@ -0,0 +1,56 @@
+The following are examples of rb_flowtime.d.
+
+This is a simple script to trace the flow of Ruby methods.
+Here it traces the example program, Code/Ruby/func_abc.rb
+
+# rb_flowtime.d
+ C TIME(us) FILE DELTA(us) -- CLASS::METHOD
+ 0 3066547402640 func_abc.rb 2 -> Module::method_added
+ 0 3066547402662 func_abc.rb 22 <- Module::method_added
+ 0 3066547402683 func_abc.rb 20 -> Module::method_added
+ 0 3066547402693 func_abc.rb 9 <- Module::method_added
+ 0 3066547402707 func_abc.rb 14 -> Module::method_added
+ 0 3066547402716 func_abc.rb 9 <- Module::method_added
+ 0 3066547402729 func_abc.rb 12 -> Object::func_a
+ 0 3066547402740 func_abc.rb 10 -> Object::print
+ 0 3066547402759 func_abc.rb 18 -> IO::write
+ 0 3066547402860 func_abc.rb 101 <- IO::write
+ 0 3066547402871 func_abc.rb 10 <- Object::print
+ 0 3066547402881 func_abc.rb 10 -> Object::sleep
+ 0 3066548410630 func_abc.rb 1007749 <- Object::sleep
+ 0 3066548410660 func_abc.rb 30 -> Object::func_b
+ 0 3066548410679 func_abc.rb 18 -> Object::print
+ 0 3066548410689 func_abc.rb 10 -> IO::write
+ 0 3066548410730 func_abc.rb 40 <- IO::write
+ 0 3066548410740 func_abc.rb 9 <- Object::print
+ 0 3066548410749 func_abc.rb 9 -> Object::sleep
+ 0 3066549420724 func_abc.rb 1009974 <- Object::sleep
+ 0 3066549420755 func_abc.rb 30 -> Object::func_c
+ 0 3066549420773 func_abc.rb 18 -> Object::print
+ 0 3066549420783 func_abc.rb 10 -> IO::write
+ 0 3066549420825 func_abc.rb 41 <- IO::write
+ 0 3066549420835 func_abc.rb 9 <- Object::print
+ 0 3066549420844 func_abc.rb 9 -> Object::sleep
+ 0 3066550430611 func_abc.rb 1009766 <- Object::sleep
+ 0 3066550430635 func_abc.rb 24 <- Object::func_c
+ 0 3066550430645 func_abc.rb 10 <- Object::func_b
+ 0 3066550430655 func_abc.rb 9 <- Object::func_a
+^C
+
+The fifth column is indented by 2 spaces to show when a new method begins.
+This shows which method is calling which.
+
+The TIME(us) column shows time since boot.
+
+The DELTA(us) column shows time from that line to the previous line, and
+so can be a bit tricky to read. For example, the seventh line of data output
+(skipping the header) reads as "the time from func_a beginning to
+calling the print method was 10 microseconds".
+
+The FILE column shows file that was being executed.
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/rb_funccalls_example.txt b/Examples/rb_funccalls_example.txt
new file mode 100644
index 000000000000..27c9c0c071e4
--- /dev/null
+++ b/Examples/rb_funccalls_example.txt
@@ -0,0 +1,25 @@
+This is a list of examples of the usage of rb_funccalls.d.
+
+It reports method calls from all Ruby programs on the system that are
+running with Ruby provider support.
+
+Here we run it while the program Code/Ruby/func_abc.rb is executing.
+
+# rb_funccalls.d
+Tracing... Hit Ctrl-C to end.
+^C
+ FILE CLASS METHOD CALLS
+ func_abc.rb Object func_a 1
+ func_abc.rb Object func_b 1
+ func_abc.rb Object func_c 1
+ func_abc.rb IO write 3
+ func_abc.rb Module method_added 3
+ func_abc.rb Object print 3
+ func_abc.rb Object sleep 3
+
+We can see that during that one Ruby program, Our 3 user-defined methods,
+func_a, func_b and func_c are called once each. Amongst other calls we can
+see that a method from class IO - write, was called three times; probably by
+the print method. If you look at the example program Code/Ruby/func_abc.rb,
+you can see that 'print' is used three times, but IO::write is never directly
+called.
diff --git a/Examples/rb_lines_example.txt b/Examples/rb_lines_example.txt
new file mode 100644
index 000000000000..544b508f6282
--- /dev/null
+++ b/Examples/rb_lines_example.txt
@@ -0,0 +1,30 @@
+This simple script uses the line probe to count how many times a line was
+executed in a Ruby program. In this example you can see it running on the
+Code/Ruby/func_slow.rb program.
+
+# rb_lines.d
+Tracing... Hit Ctrl-C to end.
+^C
+ FILE:LINE COUNT
+ func_slow.rb:3 1
+ func_slow.rb:4 1
+ func_slow.rb:5 1
+ func_slow.rb:6 1
+ func_slow.rb:12 1
+ func_slow.rb:13 1
+ func_slow.rb:14 1
+ func_slow.rb:15 1
+ func_slow.rb:19 1
+ func_slow.rb:22 1
+ func_slow.rb:23 1
+ func_slow.rb:24 1
+ func_slow.rb:25 1
+ func_slow.rb:29 1
+ func_slow.rb:32 1
+ func_slow.rb:26 100000
+ func_slow.rb:27 100000
+ func_slow.rb:16 200000
+ func_slow.rb:17 200000
+ func_slow.rb:7 300000
+ func_slow.rb:8 300000
+
diff --git a/Examples/rb_malloc_example.txt b/Examples/rb_malloc_example.txt
new file mode 100644
index 000000000000..e0917c9af7cc
--- /dev/null
+++ b/Examples/rb_malloc_example.txt
@@ -0,0 +1,120 @@
+The following is an example of rb_malloc.d.
+
+WARNING: This script is not 100% accurate; This prints graphical
+representations of libc malloc() byte distributions by "recent" Ruby operation,
+which we hope will be usually correct. This is an experimental script that may
+be improved over time.
+
+Here we can see it running on Code/Ruby/func_abc.rb
+
+# rb_malloc.d -c ./func_abc.rb
+Tracing... Hit Ctrl-C to end.
+Function A
+Function B
+Function C
+Ruby malloc byte distributions by recent Ruby operation,
+ func_abc.rb, method, Object::print
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 1
+ 32 | 0
+
+ func_abc.rb, method, Module::method_added
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ ., objnew, fatal
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@ 1
+ 4 |@ 1
+ 8 |@@@ 2
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22
+ 32 |@@@@@@ 5
+ 64 | 0
+
+ func_abc.rb, method, IO::write
+ value ------------- Distribution ------------- count
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8192 | 0
+
+ ., objnew, SystemStackError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 | 3
+ 4 |@@@@ 32
+ 8 |@@ 15
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 279
+ 32 |@@@ 30
+ 64 | 2
+ 128 | 0
+
+ ., objnew, NoMemoryError
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@ 3
+ 4 |@@@ 17
+ 8 |@@@@@@ 37
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@ 146
+ 32 |@@ 13
+ 64 | 2
+ 128 |@@@ 20
+ 256 | 0
+ 512 | 0
+ 1024 | 1
+ 2048 | 0
+
+ ., objnew, ThreadGroup
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 | 8
+ 4 |@@@ 224
+ 8 |@ 93
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1806
+ 32 |@@@@@@@@ 496
+ 64 | 3
+ 128 | 2
+ 256 | 0
+ 512 | 1
+ 1024 | 0
+
+ ., objnew, Object
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 | 35
+ 4 |@@@ 291
+ 8 |@@@ 300
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2679
+ 32 |@@ 215
+ 64 | 7
+ 128 | 0
+
+ ruby, startup, -
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@ 10
+ 4 |@@@ 34
+ 8 |@@@ 38
+ 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 409
+ 32 |@@ 30
+ 64 | 1
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 2
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 | 0
+ 32768 | 0
+ 65536 | 0
+ 131072 | 1
+ 262144 | 0
+
+
diff --git a/Examples/rb_objcpu_example.txt b/Examples/rb_objcpu_example.txt
new file mode 100644
index 000000000000..48e8a78abbcb
--- /dev/null
+++ b/Examples/rb_objcpu_example.txt
@@ -0,0 +1,51 @@
+The following are examples of running rb_objcpu.d.
+
+The rb_objnew.d script reports the on-CPU time for new Object creation in Ruby
+while the script is tracing. Here we see it running while
+Code/Ruby/func_abc.rb is executed.
+
+# rb_objcpu.d
+Tracing... Hit Ctrl-C to end.
+^C
+Total object creation on-CPU time (ms): 0
+
+Object creation on-CPU time distributions (us),
+
+ NoMemoryError
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ SystemStackError
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ fatal
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ ThreadGroup
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 16 | 0
+
+ Object
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@ 1
+ 2 |@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 |@@@@@@@@@@@@@ 1
+ 16 | 0
+
+We can see that there were several different types of Objects created
+including three of type 'Object', one of which took 1 microsecond, one of
+which took 2 to 3 microseconds, and the last of which took between 8 and 15
+microseconds.
+
diff --git a/Examples/rb_objnew_example.txt b/Examples/rb_objnew_example.txt
new file mode 100644
index 000000000000..340ac9a8cf11
--- /dev/null
+++ b/Examples/rb_objnew_example.txt
@@ -0,0 +1,21 @@
+The following are examples of running rb_objnew.d.
+
+The rb_objnew.d script reports the new Ruby objects created (by filename and
+class) while the script is tracing. Here we see it running while
+Code/Ruby/func_abc.rb is executed.
+
+# rb_objnew.d
+Tracing... Hit Ctrl-C to end.
+^C
+ FILE CLASS COUNT
+ . NoMemoryError 1
+ . SystemStackError 1
+ . ThreadGroup 1
+ . fatal 1
+ . Object 3
+
+Since this is a simple example, not many objects were allocated - a few
+for the ruby engine, and three of class Object. No file was associated
+with these allocations, as they may have been caused by Ruby engine startup,
+and not necessarily lines of code in the example program.
+
diff --git a/Examples/rb_stat_example.txt b/Examples/rb_stat_example.txt
new file mode 100644
index 000000000000..706bf95b15cc
--- /dev/null
+++ b/Examples/rb_stat_example.txt
@@ -0,0 +1,22 @@
+The following are examples of running rb_stat.d on Ruby programs.
+
+rb_stat.d shows you the number of events per second that have happened since
+the last line output. The default interval is 1 second, but you can specify
+other intervals as arguments to the script.
+
+This shows the rb_stat.d script reflecting the Code/Ruby/func_slow.rb script.
+
+# ./rb_stat.d
+TIME EXEC/s METHOD/s OBJNEW/s OBJFRE/s RAIS/s RESC/s GC/s
+2007 Sep 17 03:59:07 0 0 0 0 0 0 0
+2007 Sep 17 03:59:08 0 210426 7 0 0 0 0
+2007 Sep 17 03:59:09 0 724067 0 0 0 0 0
+2007 Sep 17 03:59:10 0 730877 0 0 0 0 0
+2007 Sep 17 03:59:11 0 134645 0 0 0 0 0
+2007 Sep 17 03:59:12 0 0 0 0 0 0 0
+2007 Sep 17 03:59:13 0 0 0 0 0 0 0
+^C
+
+We can see that at 2007 Sep 17 03:59:08 there were 0 new Ruby programs
+executed, 210426 methods called, 7 objects created, 0 objects freed, 0 raises,
+0 rescues and 0 garbage collects.
diff --git a/Examples/rb_syscalls_example.txt b/Examples/rb_syscalls_example.txt
new file mode 100644
index 000000000000..869884b313c3
--- /dev/null
+++ b/Examples/rb_syscalls_example.txt
@@ -0,0 +1,54 @@
+The following are examples of sh_syscalls.d.
+
+This is a simple script to count Ruby methods and system calls. Here we trace
+an example program - Code/Ruby/func_abc.rb
+
+# rb_syscalls.d -c ./func_abc.rb
+Tracing... Hit Ctrl-C to end.
+Function A
+Function B
+Function C
+
+Calls for PID 146493,
+
+ FILE TYPE NAME COUNT
+ func_abc.rb method Object::func_a 1
+ func_abc.rb method Object::func_b 1
+ func_abc.rb method Object::func_c 1
+ func_abc.rb syscall getpid 1
+ func_abc.rb syscall getrlimit 1
+ func_abc.rb syscall getrlimit64 1
+ func_abc.rb syscall mmap 1
+ func_abc.rb syscall munmap 1
+ func_abc.rb syscall rexit 1
+ func_abc.rb syscall schedctl 1
+ func_abc.rb syscall sigpending 1
+ func_abc.rb syscall sysconfig 1
+ func_abc.rb syscall sysi86 1
+ func_abc.rb syscall write 1
+ func_abc.rb syscall llseek 2
+ func_abc.rb syscall read 2
+ func_abc.rb syscall setcontext 2
+ func_abc.rb method IO::write 3
+ func_abc.rb method Module::method_added 3
+ func_abc.rb method Object::print 3
+ func_abc.rb method Object::sleep 3
+ func_abc.rb syscall fstat64 3
+ func_abc.rb syscall getgid 3
+ func_abc.rb syscall getuid 3
+ func_abc.rb syscall ioctl 3
+ func_abc.rb syscall pollsys 3
+ func_abc.rb syscall close 4
+ func_abc.rb syscall lwp_sigmask 4
+ func_abc.rb syscall open64 4
+ func_abc.rb syscall gtime 6
+ func_abc.rb syscall sigaction 12
+ func_abc.rb syscall brk 56
+
+While tracing, three user-defined functions were called - func_a, func_b and
+func_c. There were 3 instances of the IO::write method being called. There
+were also many system calls made, including 56 brk()'s, and 12 sigaction()'s.
+
+This script can provide an insight to how a Ruby program is interacting
+with the system, by providing methods and system calls in the same output.
+
diff --git a/Examples/rb_syscolors_example.txt b/Examples/rb_syscolors_example.txt
new file mode 100644
index 000000000000..854016e07e9a
--- /dev/null
+++ b/Examples/rb_syscolors_example.txt
@@ -0,0 +1,331 @@
+The following are examples of rb_syscolors.d.
+
+This is a simple script to trace the method flow of Ruby functions within a
+program, and the system calls made. It renders the output in color ("colour")
+using terminal escape sequences (which you can tweak by modifying the script).
+
+Here it traces the example program, Code/Ruby/func_abc.rb.
+
+WARNING: This output is full of terminal escape sequences, so if you are
+trying to view this through an editor or web browser - it may look awful.
+Try viewing this using "more" (although, depending on your terminal, it
+still may look awful).
+
+# rb_syscolors.d -c ./func_abc.rb
+C PID DELTA(us) FILE:LINE TYPE -- NAME
+0 146499 2 ":- syscall -> munmap
+0 146499 35 ":- syscall <- munmap
+0 146499 56 ":- syscall -> mmap
+0 146499 18 ":- syscall <- mmap
+0 146499 41 ":- syscall -> setcontext
+0 146499 10 ":- syscall <- setcontext
+0 146499 10 ":- syscall -> getrlimit
+0 146499 11 ":- syscall <- getrlimit
+0 146499 9 ":- syscall -> getpid
+0 146499 8 ":- syscall <- getpid
+0 146499 66 ":- syscall -> setcontext
+0 146499 8 ":- syscall <- setcontext
+0 146499 1125 ":- syscall -> sysi86
+0 146499 12 ":- syscall <- sysi86
+0 146499 86 ":- syscall -> open64
+0 146499 89 ":- syscall <- open64
+0 146499 13 ":- syscall -> ioctl
+0 146499 35 ":- syscall <- ioctl
+0 146499 15 ":- syscall -> close
+0 146499 16 ":- syscall <- close
+0 146499 141 ":- syscall -> getrlimit64
+0 146499 10 ":- syscall <- getrlimit64
+0 146499 37 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 17 ":- syscall <- brk
+0 146499 19 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 11 ":- syscall <- brk
+0 146499 495 ":- syscall -> brk
+0 146499 11 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 55 ":- syscall -> sysconfig
+0 146499 9 ":- syscall <- sysconfig
+0 146499 109 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 189 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 161 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 144 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 184 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 129 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 174 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 145 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 129 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 134 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 135 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 136 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 98 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 132 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 125 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 189 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 413 ":- syscall -> brk
+0 146499 11 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 171 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 137 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 188 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 135 ":- syscall -> sigaction
+0 146499 10 ":- syscall <- sigaction
+0 146499 10 ":- syscall -> sigaction
+0 146499 7 ":- syscall <- sigaction
+0 146499 8 ":- syscall -> sigaction
+0 146499 7 ":- syscall <- sigaction
+0 146499 8 ":- syscall -> sigaction
+0 146499 7 ":- syscall <- sigaction
+0 146499 8 ":- syscall -> sigaction
+0 146499 7 ":- syscall <- sigaction
+0 146499 8 ":- syscall -> sigaction
+0 146499 8 ":- syscall <- sigaction
+0 146499 8 ":- syscall -> sigaction
+0 146499 7 ":- syscall <- sigaction
+0 146499 9 ":- syscall -> sigaction
+0 146499 7 ":- syscall <- sigaction
+0 146499 8 ":- syscall -> sigaction
+0 146499 7 ":- syscall <- sigaction
+0 146499 12 ":- syscall -> sigpending
+0 146499 8 ":- syscall <- sigpending
+0 146499 15 ":- syscall -> schedctl
+0 146499 44 ":- syscall <- schedctl
+0 146499 17 ":- syscall -> lwp_sigmask
+0 146499 8 ":- syscall <- lwp_sigmask
+0 146499 9 ":- syscall -> sigaction
+0 146499 8 ":- syscall <- sigaction
+0 146499 11 ":- syscall -> lwp_sigmask
+0 146499 8 ":- syscall <- lwp_sigmask
+0 146499 9 ":- syscall -> lwp_sigmask
+0 146499 7 ":- syscall <- lwp_sigmask
+0 146499 8 ":- syscall -> sigaction
+0 146499 7 ":- syscall <- sigaction
+0 146499 8 ":- syscall -> lwp_sigmask
+0 146499 7 ":- syscall <- lwp_sigmask
+0 146499 65 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 11 ":- syscall <- brk
+0 146499 149 ":- syscall -> getuid
+0 146499 9 ":- syscall <- getuid
+0 146499 12 ":- syscall -> getgid
+0 146499 8 ":- syscall <- getgid
+0 146499 29 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 184 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 9 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 171 ":- syscall -> brk
+0 146499 9 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 10 ":- syscall <- brk
+0 146499 48 ":- syscall -> getuid
+0 146499 8 ":- syscall <- getuid
+0 146499 9 ":- syscall -> getuid
+0 146499 7 ":- syscall <- getuid
+0 146499 10 ":- syscall -> getgid
+0 146499 7 ":- syscall <- getgid
+0 146499 8 ":- syscall -> getgid
+0 146499 7 ":- syscall <- getgid
+0 146499 79 ":- syscall -> open64
+0 146499 31 ":- syscall <- open64
+0 146499 14 ":- syscall -> llseek
+0 146499 9 ":- syscall <- llseek
+0 146499 9 ":- syscall -> close
+0 146499 12 ":- syscall <- close
+0 146499 15 ":- syscall -> open64
+0 146499 13 ":- syscall <- open64
+0 146499 21 ":- syscall -> fstat64
+0 146499 11 ":- syscall <- fstat64
+0 146499 22 ":- syscall -> read
+0 146499 36 ":- syscall <- read
+0 146499 153 ":- syscall -> read
+0 146499 10 ":- syscall <- read
+0 146499 11 ":- syscall -> llseek
+0 146499 8 ":- syscall <- llseek
+0 146499 8 ":- syscall -> close
+0 146499 9 ":- syscall <- close
+0 146499 23 func_abc.rb:3 line -- 
+0 146499 64 func_abc.rb:3 method -> Module::method_added
+0 146499 24 func_abc.rb:3 method <- Module::method_added
+0 146499 20 func_abc.rb:8 line -- 
+0 146499 15 func_abc.rb:8 method -> Module::method_added
+0 146499 13 func_abc.rb:8 method <- Module::method_added
+0 146499 13 func_abc.rb:14 line -- 
+0 146499 14 func_abc.rb:14 method -> Module::method_added
+0 146499 13 func_abc.rb:14 method <- Module::method_added
+0 146499 12 func_abc.rb:20 line -- 
+0 146499 13 func_abc.rb:20 method -> Object::func_a
+0 146499 12 func_abc.rb:15 line -- 
+0 146499 10 func_abc.rb:15 method -> Object::print
+0 146499 22 func_abc.rb:15 method -> IO::write
+0 146499 38 ":- syscall -> ioctl
+0 146499 11 ":- syscall <- ioctl
+0 146499 20 ":- syscall -> fstat64
+0 146499 9 ":- syscall <- fstat64
+0 146499 9 ":- syscall -> brk
+0 146499 8 ":- syscall <- brk
+0 146499 8 ":- syscall -> brk
+0 146499 11 ":- syscall <- brk
+0 146499 25 ":- syscall -> fstat64
+0 146499 8 ":- syscall <- fstat64
+0 146499 10 func_abc.rb:15 method <- IO::write
+0 146499 13 func_abc.rb:15 method <- Object::print
+0 146499 12 func_abc.rb:16 line -- 
+0 146499 10 func_abc.rb:16 method -> Object::sleep
+0 146499 20 ":- syscall -> gtime
+0 146499 9 ":- syscall <- gtime
+0 146499 24 ":- syscall -> pollsys
+0 146499 1006964 ":- syscall <- pollsys
+0 146499 26 ":- syscall -> gtime
+0 146499 14 ":- syscall <- gtime
+0 146499 18 func_abc.rb:16 method <- Object::sleep
+0 146499 27 func_abc.rb:17 line -- 
+0 146499 21 func_abc.rb:17 method -> Object::func_b
+0 146499 19 func_abc.rb:9 line -- 
+0 146499 12 func_abc.rb:9 method -> Object::print
+0 146499 14 func_abc.rb:9 method -> IO::write
+0 146499 15 func_abc.rb:9 method <- IO::write
+0 146499 12 func_abc.rb:9 method <- Object::print
+0 146499 12 func_abc.rb:10 line -- 
+0 146499 9 func_abc.rb:10 method -> Object::sleep
+0 146499 12 ":- syscall -> gtime
+0 146499 8 ":- syscall <- gtime
+0 146499 11 ":- syscall -> pollsys
+0 146499 1009739 ":- syscall <- pollsys
+0 146499 26 ":- syscall -> gtime
+0 146499 14 ":- syscall <- gtime
+0 146499 18 func_abc.rb:10 method <- Object::sleep
+0 146499 27 func_abc.rb:11 line -- 
+0 146499 21 func_abc.rb:11 method -> Object::func_c
+0 146499 20 func_abc.rb:4 line -- 
+0 146499 12 func_abc.rb:4 method -> Object::print
+0 146499 14 func_abc.rb:4 method -> IO::write
+0 146499 15 func_abc.rb:4 method <- IO::write
+0 146499 12 func_abc.rb:4 method <- Object::print
+0 146499 12 func_abc.rb:5 line -- 
+0 146499 9 func_abc.rb:5 method -> Object::sleep
+0 146499 12 ":- syscall -> gtime
+0 146499 8 ":- syscall <- gtime
+0 146499 11 ":- syscall -> pollsys
+Function A
+Function B
+Function C
+0 146499 1009762 ":- syscall <- pollsys
+0 146499 25 ":- syscall -> gtime
+0 146499 14 ":- syscall <- gtime
+0 146499 19 func_abc.rb:5 method <- Object::sleep
+0 146499 26 func_abc.rb:5 method <- Object::func_c
+0 146499 13 func_abc.rb:11 method <- Object::func_b
+0 146499 13 func_abc.rb:17 method <- Object::func_a
+0 146499 33 ":- syscall -> sigaction
+0 146499 10 ":- syscall <- sigaction
+0 146499 100 ":- syscall -> open64
+0 146499 107 ":- syscall <- open64
+0 146499 10 ":- syscall -> ioctl
+0 146499 10 ":- syscall <- ioctl
+0 146499 11 ":- syscall -> close
+0 146499 17 ":- syscall <- close
+0 146499 28 ":- syscall -> write
+0 146499 20 ":- syscall <- write
+0 146499 11 ":- syscall -> rexit
+
+Here you can see the output showing the path the program follows in its
+execution.
+
+ie:
+0 146499 10 func_abc.rb:16 method -> Object::sleep
+0 146499 20 ":- syscall -> gtime
+0 146499 9 ":- syscall <- gtime
+0 146499 24 ":- syscall -> pollsys
+0 146499 1006964 ":- syscall <- pollsys
+0 146499 26 ":- syscall -> gtime
+0 146499 14 ":- syscall <- gtime
+0 146499 18 func_abc.rb:16 method <- Object::sleep
+0 146499 27 func_abc.rb:17 line -- 
+0 146499 21 func_abc.rb:17 method -> Object::func_b
+0 146499 19 func_abc.rb:9 line -- 
+0 146499 12 func_abc.rb:9 method -> Object::print
+0 146499 14 func_abc.rb:9 method -> IO::write
+0 146499 15 func_abc.rb:9 method <- IO::write
+0 146499 12 func_abc.rb:9 method <- Object::print
+0 146499 12 func_abc.rb:10 line -- 
+
+shows that on cpu 0 the program is running a sleep command at line 16 of the
+func_abc.rb program (the pollsys and gtime syscalls are used in the Ruby
+engine to implement sleep). Then func_b runs, and prints a line
+(using Object::print which uses IO::write). Notice that the 'write' syscall
+does not happen until later. It is probably being buffered by Ruby - you can
+confirm this through further DTracing. Notice also tht you can see the output
+of the program:
+
+Function A
+Function B
+Function C
+
+in the file happening before the write syscall is run. DTrace does not do its
+output in 'real time'. There is a slight delay due to buffering.
diff --git a/Examples/rb_who_example.txt b/Examples/rb_who_example.txt
new file mode 100644
index 000000000000..35c0bb70edef
--- /dev/null
+++ b/Examples/rb_who_example.txt
@@ -0,0 +1,20 @@
+These are examples of the results after running the rb_who.d script.
+
+This script shows which UIDs and PIDs are running Ruby programs with Ruby
+provider support, and how active they are. It lists the name of the program,
+along with the number of lines executed per program as recorded by the line
+provider.
+
+Here it runs as three Ruby programs are executed. Code/Ruby/func_abc.rb runs
+twice and Code/Ruby/func_slow.rb once.
+
+# rb_who.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID UID LINES FILE
+ 146485 0 12 ./func_abc.rb
+ 146486 0 12 ./func_abc.rb
+ 146487 0 1200015 ./func_slow.rb
+
+You can see that func_abc.rb has twelve lines of executable Ruby code, and
+that func_slow.rb has 100,000x that.
diff --git a/Examples/readbytes_example.txt b/Examples/readbytes_example.txt
new file mode 100644
index 000000000000..fa2923b1b649
--- /dev/null
+++ b/Examples/readbytes_example.txt
@@ -0,0 +1,22 @@
+The following is a demonstration of the readbytes.d script,
+
+
+Here the readbytes.d script is run for a few seconds, then Ctrl-C is hit,
+
+ # readbytes.d
+ dtrace: description 'sysinfo:::readch ' matched 4 probes
+ ^C
+
+ mozilla-bin 16
+ gnome-smproxy 64
+ metacity 64
+ dsdm 64
+ wnck-applet 64
+ xscreensaver 96
+ gnome-terminal 900
+ ttymon 5952
+ Xorg 17544
+
+In this interval the Xorg command has successfully read 17.5 Kb, while
+ttymon has read 5952 bytes.
+
diff --git a/Examples/readdist_example.txt b/Examples/readdist_example.txt
new file mode 100644
index 000000000000..42811d8d36ae
--- /dev/null
+++ b/Examples/readdist_example.txt
@@ -0,0 +1,35 @@
+The following is an example of the readdist.d script,
+
+
+Here the readdist.d script is run for a few seconds, then Ctrl-C is hit,
+
+ # readdist.d
+ dtrace: description 'sysinfo:::readch ' matched 4 probes
+ ^C
+ [...]
+ gnome-terminal
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 15
+ 64 |@@@ 1
+ 128 | 0
+
+ Xorg
+ value ------------- Distribution ------------- count
+ -1 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@ 26
+ 1 | 0
+ 2 | 0
+ 4 | 0
+ 8 |@@@@ 6
+ 16 |@ 2
+ 32 |@ 2
+ 64 | 0
+ 128 |@@@@@@@@ 11
+ 256 |@@@ 4
+ 512 | 0
+
+This allows us to understand the read behaviour of each process. The
+Xorg command has executed 26 reads that returned 0 bytes, through
+to 4 reads that were at least 256 bytes (up to 511).
+
diff --git a/Examples/rfileio_example.txt b/Examples/rfileio_example.txt
new file mode 100644
index 000000000000..dcce81ee4da7
--- /dev/null
+++ b/Examples/rfileio_example.txt
@@ -0,0 +1,94 @@
+The following are demonstrations of the rfileio.d script.
+
+
+rfileio.d prints file system statistics by file,
+
+ # ./rfileio.d
+
+ Read IOPS, top 20 (count)
+ /lib/ld.so.1 logical 2
+ /devices/pseudo/clone@0:ptm logical 4
+ /usr/bin/grep logical 4
+ /devices/pseudo/pts@0:3 logical 4
+ /extra1/contents physical 1700
+ /extra1/contents logical 11582
+
+ Read Bandwidth, top 20 (bytes)
+ /devices/pseudo/pts@0:3 logical 3
+ /devices/pseudo/clone@0:ptm logical 92
+ /lib/ld.so.1 logical 212
+ /usr/bin/grep logical 269
+ /extra1/contents physical 48115712
+ /extra1/contents logical 94865162
+
+ Total File System miss-rate: 50%
+ ^C
+
+ $ ls -l /extra1/contents
+ -rw-r--r-- 1 root root 94865162 Nov 2 21:08 /extra1/contents
+
+The /extra1/contents file was read using the grep command. The output shows
+that half of the contents was returned from the cache, the other half from disk
+(50% miss-rate). It is 94,865,162 bytes in size, which can be seen both in
+the ls -l output and the logical read() bytes reported by rfileio.d. There
+were 11,582 logical read() calls, which the disk driver satisfied by using
+1,700 disk events (aggregation).
+
+
+
+The following demonstrates many files being read.
+
+ # ./rfileio.d
+
+ Read IOPS, top 20 (count)
+ /usr/bin/amd64/glib-mkenums logical 4
+ /usr/bin/amd64/glib-genmarshal physical 4
+ /usr/bin/amd64/gdk-pixbuf-query-loaders logical 4
+ /usr/bin/amd64/ls logical 5
+ /usr/bin/amd64/pargs logical 5
+ /usr/bin/amd64/ps logical 5
+ /usr/bin/amd64/gconf-merge-tree physical 6
+ /usr/bin/amd64/cputrack logical 6
+ /usr/bin/amd64/gconftool-2 physical 6
+ /usr/bin/amd64/prctl logical 6
+ /usr/bin/amd64/prstat logical 6
+ /usr/bin/amd64/glib-genmarshal logical 7
+ /usr/bin/amd64/truss physical 8
+ /usr/bin/amd64/sort logical 9
+ /usr/bin/amd64/prex logical 10
+ /usr/bin/amd64/gconf-merge-tree logical 13
+ /usr/bin/amd64/mdb physical 15
+ /usr/bin/amd64/gconftool-2 logical 15
+ /usr/bin/amd64/truss logical 26
+ /usr/bin/amd64/mdb logical 63
+
+ Read Bandwidth, top 20 (bytes)
+ /usr/bin/amd64/prctl logical 36784
+ /usr/bin/amd64/prctl physical 36864
+ /usr/bin/amd64/prstat logical 44760
+ /usr/bin/amd64/prstat physical 45056
+ /usr/bin/amd64/glib-genmarshal logical 46064
+ /usr/bin/amd64/glib-genmarshal physical 46080
+ /usr/bin/amd64/cputrack logical 46912
+ /usr/bin/amd64/cputrack physical 47104
+ /usr/bin/amd64/sort logical 65120
+ /usr/bin/amd64/sort physical 65536
+ /usr/bin/amd64/prex logical 80968
+ /usr/bin/amd64/prex physical 81920
+ /usr/bin/amd64/gconf-merge-tree logical 113592
+ /usr/bin/amd64/gconf-merge-tree physical 122880
+ /usr/bin/amd64/gconftool-2 logical 129208
+ /usr/bin/amd64/gconftool-2 physical 139264
+ /usr/bin/amd64/truss logical 246360
+ /usr/bin/amd64/truss physical 262144
+ /usr/bin/amd64/mdb logical 627456
+ /usr/bin/amd64/mdb physical 638976
+
+ Total File System miss-rate: 81%
+ ^C
+
+The miss-rate was 81%, meaning we are returning around 20% of the data from
+the cache. Details for the top 20 files read by-bytes and by-count are listed;
+this shows the /usr/bin/amd64/mdb file was read() 63 times, causing 15 disk
+reads, and while 627,456 bytes were requested, 638,976 bytes were read from
+disk (the extra bytes are due to read-ahead and file system metadata).
diff --git a/Examples/rfsio_example.txt b/Examples/rfsio_example.txt
new file mode 100644
index 000000000000..858ddf840088
--- /dev/null
+++ b/Examples/rfsio_example.txt
@@ -0,0 +1,82 @@
+The following are demonstrations of the rfsio.d script.
+
+
+
+Here we trace file read() activity that has fully missed the cache and
+must be read from disk,
+
+ # ./rfsio.d
+
+ Read IOPS (count)
+ / logical 7
+ /extra1 physical 162
+ /boot logical 235
+ /boot physical 410
+ /extra1 logical 9514
+
+ Read Bandwidth (bytes)
+ / logical 533
+ /boot logical 1502386
+ /boot physical 1512960
+ /extra1 physical 97153024
+ /extra1 logical 97228668
+
+ Total File System miss-rate: 100%
+ ^C
+
+The miss rate of 100% means that all of the file system activity missed
+the cache, and had to read from disk.
+
+
+
+The following demonstrates file read() activity to the root filesystem
+that mostly returned from the file system cache.
+
+ # ./rfsio.d
+
+ Read IOPS (count)
+ / physical 1
+ /extra1 physical 9
+ /devices logical 9
+ / logical 15
+ /extra1 logical 4096
+
+ Read Bandwidth (bytes)
+ /devices logical 9
+ / logical 949
+ / physical 8192
+ /extra1 physical 917504
+ /extra1 logical 4194304
+
+ Total File System miss-rate: 22%
+ ^C
+
+The total miss-rate was 22%, which is based on the bytes transferred that
+missed the cache.
+
+
+
+
+Now for an unusual demonstration,
+
+ # ./rfsio.d
+
+ Read IOPS (count)
+ /devices logical 1
+ / logical 10
+ /extra1 physical 106
+ /extra1 logical 6337
+
+ Read Bandwidth (bytes)
+ /devices logical 2
+ / logical 961
+ /extra1 logical 64846450
+ /extra1 physical 66151424
+
+ Total File System miss-rate: 102%
+ ^C
+
+Here the miss-rate is 102%, which indicates that more data was read from
+disk than was requested; this can occur due to UFS read-ahead, which
+assists the performance of sequential disk activity at the small risk of
+reading too much data.
diff --git a/Examples/runocc_example.txt b/Examples/runocc_example.txt
new file mode 100644
index 000000000000..53dcb5f96671
--- /dev/null
+++ b/Examples/runocc_example.txt
@@ -0,0 +1,53 @@
+The following are demonstrations of the runocc.d script.
+
+
+
+Here we run it on a single CPU server that is fairly busy,
+
+ # ./runocc.d
+
+ CPU %runocc
+ 0 86
+
+ CPU %runocc
+ 0 85
+
+ CPU %runocc
+ 0 82
+ ^C
+
+The run queue occupancy is around 85%, meaning most of the time there
+are runnable threads queued waiting for CPU.
+
+
+
+This script is more interesting on a multi-CPU server,
+
+ # ./runocc.d
+
+ CPU %runocc
+ 1 16
+ 3 27
+ 0 38
+ 2 75
+
+ CPU %runocc
+ 0 25
+ 2 41
+ 3 42
+ 1 50
+
+ CPU %runocc
+ 3 1
+ 0 17
+ 2 26
+ 1 27
+
+ CPU %runocc
+ 3 2
+ 2 5
+ 0 24
+ 1 25
+ ^C
+
+Here there was some degree of saturation, especially on CPU 2 to start with.
diff --git a/Examples/rwbbypid_example.txt b/Examples/rwbbypid_example.txt
new file mode 100644
index 000000000000..9091adfef859
--- /dev/null
+++ b/Examples/rwbbypid_example.txt
@@ -0,0 +1,26 @@
+The following is a demonstration of the rwbbypid.d script,
+
+
+Here we run it for a few seconds then hit Ctrl-C,
+
+ # rwbbypid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD DIR BYTES
+ 20347 bash R 22
+ 11053 dtrace W 32
+ 1532 Xorg W 64
+ 20317 sshd R 86
+ 20347 bash W 87
+ 20317 sshd W 137
+ 1659 mozilla-bin R 213
+ 20334 sshd R 1232
+ 20334 sshd W 1282
+ 11054 cp W 18652
+ 11054 cp R 18652
+ 1532 Xorg R 51112
+ 1659 mozilla-bin W 51261
+
+In the above output, we can see that mozilla-bin with PID 1659 has written
+51261 bytes, while Xorg has read 51112 bytes.
+
diff --git a/Examples/rwbypid_example.txt b/Examples/rwbypid_example.txt
new file mode 100644
index 000000000000..0c8559b45da9
--- /dev/null
+++ b/Examples/rwbypid_example.txt
@@ -0,0 +1,19 @@
+The following is a demonstration of the rwbypid.d script,
+
+
+Here we run it for a few seconds then hit Ctrl-C,
+
+ # rwbypid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD DIR COUNT
+ 11131 dtrace W 2
+ 20334 sshd W 17
+ 20334 sshd R 24
+ 1532 Xorg W 69
+ 1659 mozilla-bin R 852
+ 1659 mozilla-bin W 1128
+ 1532 Xorg R 1702
+
+In the above output, we can see that Xorg with PID 1532 has made 1702 reads.
+
diff --git a/Examples/rwbytype_example.txt b/Examples/rwbytype_example.txt
new file mode 100644
index 000000000000..118cf1657c64
--- /dev/null
+++ b/Examples/rwbytype_example.txt
@@ -0,0 +1,37 @@
+The following is an example fo the rwbytype.d script.
+
+
+We run rwbytype.d for a few seconds then hit Ctrl-C,
+
+ # rwbytype.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD VTYPE DIR BYTES
+ 1545 sshd chr W 1
+ 10357 more chr R 30
+ 2357 sshd chr W 31
+ 10354 dtrace chr W 32
+ 1545 sshd chr R 34
+ 6778 bash chr W 44
+ 1545 sshd sock R 52
+ 405 poold reg W 68
+ 1545 sshd sock W 136
+ 10357 bash reg R 481
+ 10356 find reg R 481
+ 10355 bash reg R 481
+ 10357 more reg R 1652
+ 2357 sshd sock R 1664
+ 10357 more chr W 96925
+ 10357 more fifo R 97280
+ 2357 sshd chr R 98686
+ 10356 grep fifo W 117760
+ 2357 sshd sock W 118972
+ 10356 grep reg R 147645
+
+Here we can see that the grep process with PID 10356 read 147645 bytes
+from "regular" files. These are I/O bytes at the application level, so
+much of these read bytes would have been cached by the filesystem page cache.
+
+vnode file types are listed in /usr/include/sys/vnode.h, and give an idea of
+what the file descriptor refers to.
+
diff --git a/Examples/rwsnoop_example.txt b/Examples/rwsnoop_example.txt
new file mode 100644
index 000000000000..2ef26ababd94
--- /dev/null
+++ b/Examples/rwsnoop_example.txt
@@ -0,0 +1,98 @@
+The following is a demonstration of the rwsnoop program,
+
+
+Here we run it for about a second,
+
+ # rwsnoop
+ UID PID CMD D BYTES FILE
+ 100 20334 sshd R 52 <unknown>
+ 100 20334 sshd W 1 /devices/pseudo/clone@0:ptm
+ 0 20320 bash W 1 /devices/pseudo/pts@0:12
+ 100 20334 sshd R 2 /devices/pseudo/clone@0:ptm
+ 100 20334 sshd W 52 <unknown>
+ 0 2848 ls W 58 /devices/pseudo/pts@0:12
+ 0 2848 ls W 68 /devices/pseudo/pts@0:12
+ 0 2848 ls W 57 /devices/pseudo/pts@0:12
+ 0 2848 ls W 67 /devices/pseudo/pts@0:12
+ 0 2848 ls W 48 /devices/pseudo/pts@0:12
+ 0 2848 ls W 49 /devices/pseudo/pts@0:12
+ 0 2848 ls W 33 /devices/pseudo/pts@0:12
+ 0 2848 ls W 41 /devices/pseudo/pts@0:12
+ 100 20334 sshd R 429 /devices/pseudo/clone@0:ptm
+ 100 20334 sshd W 468 <unknown>
+ ^C
+
+The output scrolls rather fast. Above, we can see an ls command was run,
+and we can see as ls writes each line. The "<unknown>" read/writes are
+socket activity, which have no corresponding filename.
+
+
+For a summary style output, use the rwtop program.
+
+
+
+If a particular program is of interest, the "-n" option can be used
+to match on process name. Here we match on "bash" during a login where
+the user uses the bash shell as their default,
+
+ # rwsnoop -n bash
+ UID PID CMD D BYTES FILE
+ 100 2854 bash R 757 /etc/nsswitch.conf
+ 100 2854 bash R 0 /etc/nsswitch.conf
+ 100 2854 bash R 668 /etc/passwd
+ 100 2854 bash R 980 /etc/profile
+ 100 2854 bash W 15 /devices/pseudo/pts@0:14
+ 100 2854 bash R 10 /export/home/brendan/.bash_profile
+ 100 2854 bash R 867 /export/home/brendan/.bashrc
+ 100 2854 bash R 980 /etc/profile
+ 100 2854 bash W 15 /devices/pseudo/pts@0:14
+ 100 2854 bash R 8951 /export/home/brendan/.bash_history
+ 100 2854 bash R 8951 /export/home/brendan/.bash_history
+ 100 2854 bash R 1652 /usr/share/lib/terminfo/d/dtterm
+ 100 2854 bash W 41 /devices/pseudo/pts@0:14
+ 100 2854 bash R 1 /devices/pseudo/pts@0:14
+ 100 2854 bash W 1 /devices/pseudo/pts@0:14
+ 100 2854 bash W 41 /devices/pseudo/pts@0:14
+ 100 2854 bash R 1 /devices/pseudo/pts@0:14
+ 100 2854 bash W 7 /devices/pseudo/pts@0:14
+
+In the above, various bash related files such as ".bash_profile" and
+".bash_history" can be seen. The ".bashrc" is also read, as it was sourced
+from the .bash_profile.
+
+
+
+Extra options with rwsnoop allow us to print zone ID, project ID, timestamps,
+etc. Here we use "-v" to see the time printed, and match on "ps" processes,
+
+ # rwsnoop -vn ps
+ TIMESTR UID PID CMD D BYTES FILE
+ 2005 Jul 24 04:23:45 0 2804 ps R 168 /proc/2804/auxv
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/2804/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 1495 /etc/ttysrch
+ 2005 Jul 24 04:23:45 0 2804 ps W 28 /devices/pseudo/pts.
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/0/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/1/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/2/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/3/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/218/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/7/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/9/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/360/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/91/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/112/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/307/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/226/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/242/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/228/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/243/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/234/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/119/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/143/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/361/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/20314/psinfo
+ 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/116/psinfo
+ [...]
+
+
+
diff --git a/Examples/rwtop_example.txt b/Examples/rwtop_example.txt
new file mode 100644
index 000000000000..728431243f87
--- /dev/null
+++ b/Examples/rwtop_example.txt
@@ -0,0 +1,59 @@
+The following is a demonstration of the rwtop program,
+
+
+By default it will refresh the screen every 5 seconds,
+
+ # rwtop
+ 2005 Jul 24 01:00:43, load: 1.02, app_r: 8 KB, app_w: 19 KB
+
+ UID PID PPID CMD D BYTES
+ 0 20320 20347 bash R 10
+ 0 20320 20347 bash W 95
+ 100 20317 20314 sshd R 650
+ 100 20317 20314 sshd W 733
+ 0 2365 20320 ls W 1300
+ 0 2364 20320 vi R 2323
+ 0 2365 20320 ls R 2485
+ 100 20334 20331 sshd R 3010
+ 100 20334 20331 sshd W 3729
+ 0 2364 20320 vi W 14128
+
+In the above output, we can see that a "vi" process wrote 14 Kbytes and
+read 2 Kbytes.
+
+
+
+In the following example, we print the top 5 processes in a scrolling
+output by using "-C" to not clear the screen,
+
+ # rwtop -C -t5
+ Tracing... Please wait.
+ 2005 Jul 24 01:03:27, load: 1.05, app_r: 261 KB, app_w: 348 KB
+
+ UID PID PPID CMD D BYTES
+ 0 2381 20320 svcs W 5801
+ 0 9 1 svc.configd R 115712
+ 0 2380 20320 find W 140003
+ 100 20334 20331 sshd R 150740
+ 100 20334 20331 sshd W 210773
+
+ 2005 Jul 24 01:03:32, load: 1.07, app_r: 110 KB, app_w: 233 KB
+
+ UID PID PPID CMD D BYTES
+ 100 20317 20314 sshd R 419
+ 100 20317 20314 sshd W 468
+ 0 2382 20320 find W 110720
+ 100 20334 20331 sshd R 112835
+ 100 20334 20331 sshd W 128175
+
+ 2005 Jul 24 01:03:37, load: 1.07, app_r: 6 KB, app_w: 7 KB
+
+ UID PID PPID CMD D BYTES
+ 0 2383 20320 df W 1154
+ 0 2385 20320 ls W 1300
+ 0 2385 20320 ls R 2485
+ 100 20334 20331 sshd R 3929
+ 100 20334 20331 sshd W 4339
+
+ ^C
+
diff --git a/Examples/sampleproc_example.txt b/Examples/sampleproc_example.txt
new file mode 100644
index 000000000000..d60d44644b7e
--- /dev/null
+++ b/Examples/sampleproc_example.txt
@@ -0,0 +1,62 @@
+The following is an example of the sampleproc program.
+
+
+Here we run sampleproc for a few seconds on a workstation,
+
+ # ./sampleproc
+ Sampling at 100 hertz... Hit Ctrl-C to end.
+ ^C
+ PID CMD COUNT
+ 1659 mozilla-bin 3
+ 109 nscd 4
+ 2197 prstat 23
+ 2190 setiathome 421
+
+ PID CMD PERCENT
+ 1659 mozilla-bin 0
+ 109 nscd 0
+ 2197 prstat 5
+ 2190 setiathome 93
+
+The first table shows a count of how many times each process was sampled
+on the CPU. The second table gives this as a percentage.
+
+setiathome was on the CPU 421 times, which is 93% of the samples.
+
+
+
+
+The following is sampleproc running on a server with 4 CPUs. A bash shell
+is running in an infinate loop,
+
+ # ./sampleproc
+ Sampling at 100 hertz... Hit Ctrl-C to end.
+ ^C
+ PID CMD COUNT
+ 10140 dtrace 1
+ 28286 java 1
+ 29345 esd 2
+ 29731 esd 3
+ 2 pageout 4
+ 29733 esd 6
+ 10098 bash 1015
+ 0 sched 3028
+
+ PID CMD PERCENT
+ 10140 dtrace 0
+ 28286 java 0
+ 29345 esd 0
+ 29731 esd 0
+ 2 pageout 0
+ 29733 esd 0
+ 10098 bash 24
+ 0 sched 74
+
+The bash shell was on the CPUs for 24% of the time, which is consistant
+with a CPU bound single threaded application on a 4 CPU server.
+
+The above sample was around 10 seconds long. During this time, there were
+around 4000 samples (checking the COUNT column), this is due to
+4000 = CPUs (4) * Hertz (100) * Seconds (10).
+
+
diff --git a/Examples/sar-c_example.txt b/Examples/sar-c_example.txt
new file mode 100644
index 000000000000..7669eba5b61f
--- /dev/null
+++ b/Examples/sar-c_example.txt
@@ -0,0 +1,55 @@
+The following is a demonstration of the sar-c.d script.
+
+
+Here we run both sar-c.d and "sar -c 1 100" at the same time, to compare
+outputs.
+
+The DTrace script,
+
+ # ./sar-c.d
+ Time scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s
+ 2005 Jun 14 02:40:24 1556 82 71 0.00 0.00 10262 10508
+ 2005 Jun 14 02:40:25 1553 88 75 0.00 0.00 15095 15341
+ 2005 Jun 14 02:40:26 1596 89 76 0.00 0.00 14885 15131
+ 2005 Jun 14 02:40:27 5395 290 154 9.00 10.00 185991 77219
+ 2005 Jun 14 02:40:28 1755 91 98 1.00 1.00 15421 16788
+ 2005 Jun 14 02:40:29 1757 100 91 1.00 1.00 17127 17462
+ 2005 Jun 14 02:40:30 1603 95 80 0.00 0.00 16767 16634
+ 2005 Jun 14 02:40:31 14380 83 2420 1.00 1.00 14556 126461
+ 2005 Jun 14 02:40:32 10573 88 1586 0.00 0.00 14222 87888
+ 2005 Jun 14 02:40:33 1645 87 76 0.00 0.00 15320 15608
+ 2005 Jun 14 02:40:34 2099 167 130 0.00 0.00 126295 74281
+ 2005 Jun 14 02:40:35 1559 79 67 0.00 0.00 11663 11977
+ [...]
+
+The original command,
+
+ $ sar -c 1 100
+
+ SunOS jupiter 5.10 Generic i86pc 06/14/2005
+
+ 02:40:23 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s
+ 02:40:24 1549 86 74 0.00 0.00 14799 15040
+ 02:40:25 1552 85 73 0.00 0.00 14475 14719
+ 02:40:26 5479 300 161 9.00 10.00 186755 77983
+ 02:40:27 1725 86 94 0.99 0.99 14819 16172
+ 02:40:28 1596 96 82 0.00 0.00 16521 16762
+ 02:40:29 1716 93 85 1.00 1.00 16395 16730
+ 02:40:30 1579 88 75 0.00 0.00 15324 15192
+ 02:40:32 23036 79 3887 0.99 0.99 10113 193520
+ 02:40:33 1756 94 83 0.00 0.00 14935 15300
+ 02:40:34 2099 165 130 0.00 0.00 125051 73552
+ 02:40:35 1560 82 69 0.00 0.00 15976 16287
+ [...]
+
+We can see that both tools are producing similar data.
+
+The DTrace output lacks the "summary since boot" line, as it is not using
+Kstat to fetch this data.
+
+
+The sar-c.d script is not intended itself as a useful program, rather it
+is intended as a starting point for other DTrace scripts; a starting point
+of familiar statistics to provide the programmer with a "common ground"
+of knowledge.
+
diff --git a/Examples/seeksize_example.txt b/Examples/seeksize_example.txt
new file mode 100644
index 000000000000..ba41a87e847e
--- /dev/null
+++ b/Examples/seeksize_example.txt
@@ -0,0 +1,197 @@
+The following are examples of seeksize.d.
+
+seeksize.d records disk head seek size for each operation by process.
+This allows up to identify processes that are causing "random" disk
+access and those causing "sequential" disk access.
+
+It is desirable for processes to be accesing the disks in large
+sequential operations. By using seeksize.d and bitesize.d we can
+identify this behaviour.
+
+
+
+In this example we read through a large file by copying it to a
+remote server. Most of the seek sizes are zero, indicating sequential
+access - and we would expect good performance from the disks
+under these conditions,
+
+# ./seeksize.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+ 22349 scp /dl/sol-10-b63-x86-v1.iso mars:\0
+
+ value ------------- Distribution ------------- count
+ -1 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 726
+ 1 | 0
+ 2 | 0
+ 4 | 0
+ 8 |@ 13
+ 16 | 4
+ 32 | 0
+ 64 | 0
+ 128 | 2
+ 256 | 3
+ 512 | 4
+ 1024 | 4
+ 2048 | 3
+ 4096 | 0
+ 8192 | 3
+ 16384 | 0
+ 32768 | 1
+ 65536 | 0
+
+
+
+In this example we run find. The disk operations are fairly scattered,
+as illustrated below by the volume of non sequential reads,
+
+# ./seeksize.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+ 22399 find /var/sadm/pkg/\0
+
+ value ------------- Distribution ------------- count
+ -1 | 0
+ 0 |@@@@@@@@@@@@@ 1475
+ 1 | 0
+ 2 | 44
+ 4 |@ 77
+ 8 |@@@ 286
+ 16 |@@ 191
+ 32 |@ 154
+ 64 |@@ 173
+ 128 |@@ 179
+ 256 |@@ 201
+ 512 |@@ 186
+ 1024 |@@ 236
+ 2048 |@@ 201
+ 4096 |@@ 274
+ 8192 |@@ 243
+ 16384 |@ 154
+ 32768 |@ 113
+ 65536 |@@ 182
+ 131072 |@ 81
+ 262144 | 0
+
+
+
+
+I found the following interesting. This time I gzipp'd the large file.
+While zipping, the process is reading from one location and writing
+to another. One might expect that as the program toggles between
+reading from one location and writing to another, that often the
+distance would be the same (depending on where UFS puts the new file),
+
+# ./seeksize.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+ 22368 gzip sol-10-b63-x86-v1.iso\0
+
+ value ------------- Distribution ------------- count
+ -1 | 0
+ 0 |@@@@@@@@@@@@ 353
+ 1 | 0
+ 2 | 0
+ 4 | 0
+ 8 | 7
+ 16 | 4
+ 32 | 2
+ 64 | 4
+ 128 | 14
+ 256 | 3
+ 512 | 3
+ 1024 | 5
+ 2048 | 1
+ 4096 | 0
+ 8192 | 3
+ 16384 | 1
+ 32768 | 1
+ 65536 | 1
+ 131072 | 1
+ 262144 |@@@@@@@@ 249
+ 524288 | 1
+ 1048576 | 2
+ 2097152 | 1
+ 4194304 | 2
+ 8388608 |@@@@@@@@@@@@@@@@@@ 536
+ 16777216 | 0
+
+
+
+
+The following example compares the operation of "find" with "tar".
+Both are reading from the same location, and we would expect that
+both programs would generally need to do the same number of seeks
+to navigate the direttory tree (depending on caching); and tar
+causing extra operations as it reads the file contents as well,
+
+# ./seeksize.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+ PID CMD
+ 22278 find /etc\0
+
+ value ------------- Distribution ------------- count
+ -1 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@ 251
+ 1 | 0
+ 2 |@ 8
+ 4 | 5
+ 8 |@ 10
+ 16 |@ 10
+ 32 |@ 10
+ 64 |@ 9
+ 128 |@ 11
+ 256 |@ 14
+ 512 |@@ 20
+ 1024 |@ 10
+ 2048 | 6
+ 4096 |@ 7
+ 8192 |@ 10
+ 16384 |@ 16
+ 32768 |@@ 21
+ 65536 |@@ 28
+ 131072 |@ 7
+ 262144 |@ 14
+ 524288 | 6
+ 1048576 |@ 15
+ 2097152 |@ 7
+ 4194304 | 0
+
+
+ 22282 tar cf /dev/null /etc\0
+
+ value ------------- Distribution ------------- count
+ -1 | 0
+ 0 |@@@@@@@@@@ 397
+ 1 | 0
+ 2 | 8
+ 4 | 14
+ 8 | 16
+ 16 |@ 24
+ 32 |@ 29
+ 64 |@@ 99
+ 128 |@@ 73
+ 256 |@@ 78
+ 512 |@@@ 109
+ 1024 |@@ 62
+ 2048 |@@ 69
+ 4096 |@@ 73
+ 8192 |@@@ 113
+ 16384 |@@ 81
+ 32768 |@@@ 111
+ 65536 |@@@ 108
+ 131072 |@ 49
+ 262144 |@ 33
+ 524288 | 20
+ 1048576 | 13
+ 2097152 | 7
+ 4194304 | 5
+ 8388608 |@ 30
+ 16777216 | 0
+
diff --git a/Examples/setuids_example.txt b/Examples/setuids_example.txt
new file mode 100644
index 000000000000..be197bf4b566
--- /dev/null
+++ b/Examples/setuids_example.txt
@@ -0,0 +1,28 @@
+The following is an example of setuids.d. Login events in particular can
+be seen, along with use of the "su" command.
+
+ # ./setuids.d
+ UID SUID PPID PID PCMD CMD
+ 0 100 3037 3040 in.telnetd login -p -h mars -d /dev/pts/12
+ 100 0 3040 3045 bash su -
+ 0 102 3045 3051 sh su - fred
+ 0 100 3055 3059 sshd /usr/lib/ssh/sshd
+ 0 100 3065 3067 in.rlogind login -d /dev/pts/12 -r mars
+ 0 100 3071 3073 in.rlogind login -d /dev/pts/12 -r mars
+ 0 102 3078 3081 in.telnetd login -p -h mars -d /dev/pts/12
+ ^C
+
+The first line is a telnet login to the user brendan, UID 100. The parent
+command is "in.telnetd", the telnet daemon spawned by inetd, and the
+command that in.telnetd runs is "login".
+
+The second line shows UID 100 using the "su" command to become root.
+
+The third line has the root user using "su" to become fred, UID 102.
+
+The fourth line is an example of an ssh login.
+
+The fifth and sixth lines are examples of rsh and rlogin.
+
+The last line is another example of a telnet login for fred, UID 102.
+
diff --git a/Examples/sh_calldist_example.txt b/Examples/sh_calldist_example.txt
new file mode 100644
index 000000000000..6c6a01faedb5
--- /dev/null
+++ b/Examples/sh_calldist_example.txt
@@ -0,0 +1,309 @@
+The following are examples of sh_calldist.d.
+
+This script traces the elapsed time of Bourne shell functions and
+prints a report containing distribution plots per function. Here it
+traces the example program, Code/Shell/func_abc.sh.
+
+ # sh_calldist.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ Elapsed times (us),
+
+ func_abc.sh, builtin, echo
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@ 1
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ func_abc.sh, cmd, sleep
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 1048576 | 0
+
+ Exclusive function elapsed times (us),
+
+ func_abc.sh, func, func_a
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ func_abc.sh, func, func_b
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ func_abc.sh, func, func_c
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ Inclusive function elapsed times (us),
+
+ func_abc.sh, func, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_abc.sh, func, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_abc.sh, func, func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+The elapsed times show that the echo builtin takes between 16 and 64 us
+to execute.
+
+The exclusive function elapsed times show that each function spent
+between 2 and 4 ms. This exclusive time excludes the time spent in
+other functions.
+
+The inclusive function elapsed times show that func_c() took between 0.5 and
+1.0 seconds, func_b() took between 1.0 and 2.1 seconds, and func_a() took
+between 2.1 and 4.2 seconds to execute. This inclusive time includes the
+time spent in other functions and commands called, and since func_a()
+calls func_b() which calls func_c(), and, each function is calling "sleep 1",
+these times make sense.
+
+These elapsed times are the absolute time from when the function began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc.
+
+Elapsed times are useful for identifying where latencies are.
+See Notes/ALLelapsed_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive function time.
+
+
+
+The following traces the firefox startup script.
+
+# sh_calldist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Elapsed times (us),
+
+ run-mozilla.sh, builtin, return
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ run-mozilla.sh, builtin, shift
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2 | 0
+
+ run-mozilla.sh, builtin, break
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ firefox, builtin, break
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ run-mozilla.sh, builtin, export
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@ 1
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 | 0
+
+ firefox, builtin, export
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4 |@@@@@@@@@@@@@ 1
+ 8 | 0
+
+ firefox, builtin, :
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 2 | 0
+ 4 |@@@@@@@ 1
+ 8 | 0
+
+ firefox, builtin, pwd
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ firefox, builtin, test
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ firefox, builtin, cd
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@ 1
+ 16 |@@@@@@@@@@@@@ 1
+ 32 |@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ firefox, builtin, [
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@ 3
+ 2 |@@ 1
+ 4 |@@ 1
+ 8 |@@@@@@@ 3
+ 16 |@@@@@@@@@@@ 5
+ 32 |@@@@@@@ 3
+ 64 |@@@@ 2
+ 128 | 0
+
+ run-mozilla.sh, builtin, type
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ run-mozilla.sh, builtin, [
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@ 4
+ 2 |@@@@@@@@@@ 5
+ 4 |@@@@ 2
+ 8 |@@@@@@ 3
+ 16 |@@@@@@@@@@ 5
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 |@@ 1
+ 4096 | 0
+
+ firefox, builtin, echo
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@ 1
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ firefox, cmd, /usr/lib/firefox/run-mozilla.sh
+ value ------------- Distribution ------------- count
+ 2097152 | 0
+ 4194304 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8388608 | 0
+
+ run-mozilla.sh, cmd, /usr/lib/firefox/firefox-bin
+ value ------------- Distribution ------------- count
+ 2097152 | 0
+ 4194304 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8388608 | 0
+
+Exclusive function elapsed times (us),
+
+ run-mozilla.sh, func, moz_test_binary
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 64 | 0
+
+ firefox, func, moz_spc_verbose_echo
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@ 2
+ 8 |@@@@@@@@@@@@@ 2
+ 16 |@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ firefox, func, moz_pis_startstop_scripts
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+ run-mozilla.sh, func, moz_run_program
+ value ------------- Distribution ------------- count
+ 65536 | 0
+ 131072 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 262144 | 0
+
+Inclusive function elapsed times (us),
+
+ firefox, func, moz_spc_verbose_echo
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4
+ 16 |@@@@@@@@@@@@@ 2
+ 32 | 0
+
+ run-mozilla.sh, func, moz_test_binary
+ value ------------- Distribution ------------- count
+ 32 | 0
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ firefox, func, moz_pis_startstop_scripts
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 | 0
+ 32768 |@@@@@@@@@@@@@@@@@@@@ 1
+ 65536 | 0
+
+ run-mozilla.sh, func, moz_run_program
+ value ------------- Distribution ------------- count
+ 2097152 | 0
+ 4194304 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 8388608 | 0
+
+
+As an example of interpreting the output: the inclusive elapsed time for
+the "[" (test) builtin,
+
+ firefox, builtin, [
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@ 3
+ 2 |@@ 1
+ 4 |@@ 1
+ 8 |@@@@@@@ 3
+ 16 |@@@@@@@@@@@ 5
+ 32 |@@@@@@@ 3
+ 64 |@@@@ 2
+ 128 | 0
+
+shows that it was called 17 times (after adding up the counts), 5 of which
+took between 16 and 31 microseconds.
+
diff --git a/Examples/sh_calls_example.txt b/Examples/sh_calls_example.txt
new file mode 100644
index 000000000000..064cf977936f
--- /dev/null
+++ b/Examples/sh_calls_example.txt
@@ -0,0 +1,60 @@
+The following are examples of sh_calls.d.
+
+This is a simple script to count Bourne shell calls. Here it traces an
+example program, Code/Perl/func_abc.sh.
+
+ # sh_calls.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ FILE TYPE NAME COUNT
+ func_abc.sh func func_a 1
+ func_abc.sh func func_b 1
+ func_abc.sh func func_c 1
+ func_abc.sh builtin echo 3
+ func_abc.sh cmd sleep 3
+
+While tracing, function func_a() from the program "func_abc.sh" was executed
+once, along with func_b() and func_c(). The "echo" builtin was called 3
+times, as was the "sleep" command.
+
+
+The following traced the firefox start script,
+
+ # sh_calls.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ FILE TYPE NAME COUNT
+ firefox builtin . 1
+ firefox builtin break 1
+ firefox builtin exit 1
+ firefox builtin pwd 1
+ firefox builtin test 1
+ firefox cmd /usr/lib/firefox/run-mozilla.sh 1
+ run-mozilla.sh builtin break 1
+ run-mozilla.sh builtin exit 1
+ run-mozilla.sh builtin return 1
+ run-mozilla.sh builtin shift 1
+ run-mozilla.sh builtin type 1
+ run-mozilla.sh cmd /usr/lib/firefox/firefox-bin 1
+ run-mozilla.sh func moz_run_program 1
+ run-mozilla.sh func moz_test_binary 1
+ firefox builtin echo 2
+ firefox func moz_pis_startstop_scripts 2
+ firefox builtin cd 3
+ firefox builtin export 3
+ run-mozilla.sh builtin export 3
+ firefox builtin : 6
+ firefox func moz_spc_verbose_echo 6
+ run-mozilla.sh subsh - 9
+ firefox builtin [ 18
+ firefox subsh - 20
+ run-mozilla.sh builtin [ 20
+
+The firefox start script called run-mozilla.sh, which can be seen both
+as a "cmd" call in the above output from the "firefox" script, and as
+additionall calls from the "run-mozilla.sh" script.
+
+The builtin called "[" is the test builtin, and was called 20 times by
+"run-mozilla.sh" and 18 times by "firefox". The "firefox" script also called
+20 subshells.
+
diff --git a/Examples/sh_calltime_example.txt b/Examples/sh_calltime_example.txt
new file mode 100644
index 000000000000..5c39ae404f0d
--- /dev/null
+++ b/Examples/sh_calltime_example.txt
@@ -0,0 +1,144 @@
+The following are examples of sh_calltime.d.
+
+This script traces the elapsed time of Bourne shell functions and
+prints a report. Here it traces the example program, Code/Shell/func_abc.sh.
+
+ # sh_calltime.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ Counts,
+ FILE TYPE NAME COUNT
+ func_abc.sh func func_a 1
+ func_abc.sh func func_b 1
+ func_abc.sh func func_c 1
+ func_abc.sh builtin echo 3
+ func_abc.sh cmd sleep 3
+ - total - 9
+
+ Elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.sh builtin echo 108
+ func_abc.sh cmd sleep 3023760
+ - total - 3023868
+
+ Exclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.sh func func_b 2629
+ func_abc.sh func func_c 2822
+ func_abc.sh func func_a 3249
+ - total - 8702
+
+ Inclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ func_abc.sh func func_c 1009659
+ func_abc.sh func func_b 2020077
+ func_abc.sh func func_a 3032571
+
+In total, three functions were called, one builtin and one command.
+
+The elapsed times show that 3.0 seconds was spent in the sleep command,
+which is what would be expected based on the script.
+
+The exclusive function elapsed times show that each function spent around
+2.7 milliseconds of time processing code - while not in other functions.
+
+The inclusive function elapsed times show that func_a() took around 3.0
+seconds to execute, followed by func_b() at 2.0 seconds, and func_c() at 1.0.
+The inclusive time includes the time spent in other calls, and since
+func_a() called func_b() which called func_c(), and they all call "sleep 1",
+these times make sense.
+
+These elapsed times are the absolute time from when the function began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc. In particular, for this case it has
+included the time waiting for the sleep commands.
+
+Elapsed times are useful for identifying where latencies are.
+See Notes/ALLelapsed_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive function time.
+
+If you study the func_abc.sh program alongside the above output, the numbers
+should make sense.
+
+
+
+The following traces the firefox start script.
+
+# sh_calltime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Counts,
+ FILE TYPE NAME COUNT
+ firefox builtin break 1
+ firefox builtin pwd 1
+ firefox builtin test 1
+ firefox cmd /usr/lib/firefox/run-mozilla.sh 1
+ run-mozilla.sh builtin break 1
+ run-mozilla.sh builtin return 1
+ run-mozilla.sh builtin shift 1
+ run-mozilla.sh builtin type 1
+ run-mozilla.sh cmd /usr/lib/firefox/firefox-bin 1
+ run-mozilla.sh func moz_run_program 1
+ run-mozilla.sh func moz_test_binary 1
+ firefox builtin echo 2
+ firefox func moz_pis_startstop_scripts 2
+ firefox builtin cd 3
+ firefox builtin export 3
+ run-mozilla.sh builtin export 3
+ firefox builtin : 6
+ firefox func moz_spc_verbose_echo 6
+ firefox builtin [ 18
+ run-mozilla.sh builtin [ 20
+ - total - 103
+
+Elapsed times (us),
+ FILE TYPE NAME TOTAL
+ run-mozilla.sh builtin return 1
+ run-mozilla.sh builtin shift 1
+ run-mozilla.sh builtin break 2
+ firefox builtin break 4
+ run-mozilla.sh builtin export 6
+ firefox builtin export 10
+ firefox builtin : 15
+ firefox builtin pwd 50
+ firefox builtin cd 72
+ run-mozilla.sh builtin [ 210
+ firefox builtin echo 323
+ firefox builtin [ 480
+ run-mozilla.sh builtin type 486
+ firefox builtin test 15330
+ run-mozilla.sh cmd /usr/lib/firefox/firefox-bin 8941269
+ firefox cmd /usr/lib/firefox/run-mozilla.sh 9384335
+ - total - 18342766
+
+Exclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ run-mozilla.sh func moz_test_binary 54
+ firefox func moz_spc_verbose_echo 136
+ firefox func moz_pis_startstop_scripts 230221
+ run-mozilla.sh func moz_run_program 402343
+ - total - 632756
+
+Inclusive function elapsed times (us),
+ FILE TYPE NAME TOTAL
+ run-mozilla.sh func moz_test_binary 91
+ firefox func moz_spc_verbose_echo 151
+ firefox func moz_pis_startstop_scripts 230587
+ run-mozilla.sh func moz_run_program 9343826
+
+
+
+The output showed that the most inclusive function elapsed time was in
+moz_run_program() at 9.3 seconds, which comes as little suprise since
+I let firefox run for several seconds before closing it. That same duration
+explains the large command times in the elapsed times report.
+
+Of more interest are the exclusive function elapsed times, where
+moz_pis_startstop_scripts() was the slowest at 230 ms. Other areas of the
+report are also useful to sanity check your software - should it be calling
+these things? Especially if there are any commands called that can be
+builtins instead.
+
diff --git a/Examples/sh_cpudist_example.txt b/Examples/sh_cpudist_example.txt
new file mode 100644
index 000000000000..272e9093d55f
--- /dev/null
+++ b/Examples/sh_cpudist_example.txt
@@ -0,0 +1,92 @@
+The following are examples of sh_cpudist.d.
+
+This script traces the on-CPU time of Bourne shell functions and
+prints a report containing distribution plots per function. Here it
+traces the example program, Code/Shell/func_slow.sh.
+
+ # sh_cpudist.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ On-CPU times (us),
+
+ func_slow.sh, builtin, echo
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@ 1
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+
+ func_slow.sh, builtin, [
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 | 1
+ 2 | 1
+ 4 |@ 22
+ 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 575
+ 16 | 2
+ 32 | 0
+ 64 | 2
+ 128 | 0
+
+ Exclusive function on-CPU times (us),
+
+ func_slow.sh, func, func_a
+ value ------------- Distribution ------------- count
+ 65536 | 0
+ 131072 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 262144 | 0
+
+ func_slow.sh, func, func_b
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ func_slow.sh, func, func_c
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ Inclusive function on-CPU times (us),
+
+ func_slow.sh, func, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_slow.sh, func, func_c
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ func_slow.sh, func, func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+The on-CPU times should that the "[" builtin (test) usually took between
+8 and 15 microseconds to execute, and was called over 500 times.
+
+The exclusive function on-CPU times show that func_a() spent between
+131 ms and 262 ms on-CPU.
+
+The inclusive function on-CPU times show that both func_b() and func_c()
+spent between 1.0 and 2.1 seconds on-CPU, and func_a() spent between 2.1
+and 4.2 seconds on-CPU. This inclusive time includes the time spent in other
+functions called, and since func_a() called func_b() which called func_c(),
+these times make sense.
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the function began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive function time.
+
diff --git a/Examples/sh_cputime_example.txt b/Examples/sh_cputime_example.txt
new file mode 100644
index 000000000000..d3ae5bc50b11
--- /dev/null
+++ b/Examples/sh_cputime_example.txt
@@ -0,0 +1,131 @@
+The following are examples of sh_cputime.d.
+
+This script traces the on-CPU time of Bourne shell functions and
+prints a report. Here it traces the example program, Code/Shell/func_slow.sh.
+
+ # sh_cputime.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ Counts,
+ FILE TYPE NAME COUNT
+ func_slow.sh func func_a 1
+ func_slow.sh func func_b 1
+ func_slow.sh func func_c 1
+ func_slow.sh builtin echo 3
+ func_slow.sh builtin [ 603
+ - total - 609
+
+ On-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_slow.sh builtin echo 162
+ func_slow.sh builtin [ 6279
+ - total - 6441
+
+ Exclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_slow.sh func func_a 269465
+ func_slow.sh func func_b 670372
+ func_slow.sh func func_c 1259073
+ - total - 2198911
+
+ Inclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ func_slow.sh func func_c 1262209
+ func_slow.sh func func_b 1934839
+ func_slow.sh func func_a 2205352
+
+In total, three functions were called, one builtin and one command.
+
+The exclusive function on-CPU times show that func_a() spent around 268.4 ms
+on-CPU, func_b() spent 670.3 ms, and func_c() spent 1259 ms. This exclusive
+times excludes time spent in other functions.
+
+The inclusive function on-CPU times show that func_c() spent around 1.3
+seconds on-CPU, func_b() spent around 1.9 seconds, and func_a() spent around
+2.2 seconds. This inclusive time includes the time spent in other functions
+called, and since func_a() called func_b() which called func_c(), these
+times make sense.
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the function began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive function time.
+
+If you study the func_slow.sh program alongside the above output, the numbers
+should make sense.
+
+
+
+The following traced the firefox start script.
+
+# sh_cputime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Counts,
+ FILE TYPE NAME COUNT
+ firefox builtin break 1
+ firefox builtin pwd 1
+ firefox builtin test 1
+ firefox cmd run-mozilla.sh 1
+ run-mozilla.sh builtin break 1
+ run-mozilla.sh builtin return 1
+ run-mozilla.sh builtin shift 1
+ run-mozilla.sh builtin type 1
+ run-mozilla.sh cmd firefox-bin 1
+ run-mozilla.sh func moz_run_program 1
+ run-mozilla.sh func moz_test_binary 1
+ firefox builtin echo 2
+ firefox func moz_pis_startstop_scripts 2
+ firefox builtin cd 3
+ firefox builtin export 3
+ run-mozilla.sh builtin export 3
+ firefox builtin : 6
+ firefox func moz_spc_verbose_echo 6
+ firefox builtin [ 18
+ run-mozilla.sh builtin [ 20
+ - total - 103
+
+On-CPU times (us),
+ FILE TYPE NAME TOTAL
+ run-mozilla.sh builtin return 0
+ run-mozilla.sh builtin shift 0
+ run-mozilla.sh builtin break 1
+ firefox builtin break 2
+ run-mozilla.sh builtin export 4
+ firefox builtin export 7
+ firefox builtin : 9
+ firefox builtin test 35
+ firefox builtin pwd 49
+ firefox builtin cd 64
+ run-mozilla.sh builtin [ 176
+ firefox builtin echo 309
+ firefox builtin [ 357
+ run-mozilla.sh builtin type 475
+ firefox cmd run-mozilla.sh 17090
+ run-mozilla.sh cmd firefox-bin 1932333
+ - total - 1950979
+
+Exclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ run-mozilla.sh func moz_test_binary 21
+ firefox func moz_spc_verbose_echo 22
+ run-mozilla.sh func moz_run_program 9098
+ firefox func moz_pis_startstop_scripts 12960
+ - total - 22103
+
+Inclusive function on-CPU times (us),
+ FILE TYPE NAME TOTAL
+ firefox func moz_spc_verbose_echo 31
+ run-mozilla.sh func moz_test_binary 56
+ run-mozilla.sh func moz_run_program 9243
+ firefox func moz_pis_startstop_scripts 13133
+
+The output showed that the most CPU time was spent in the firefox-bin command,
+taking 1.9 seconds of on-CPU time.
+
diff --git a/Examples/sh_flow_example.txt b/Examples/sh_flow_example.txt
new file mode 100644
index 000000000000..de7f22b88196
--- /dev/null
+++ b/Examples/sh_flow_example.txt
@@ -0,0 +1,129 @@
+The following are examples of sh_flow.d.
+
+This is a simple script to trace the flow of Bourne shell functions,
+builtins and external commands. Here it traces the example program,
+Code/Shell/func_abc.sh.
+
+ # sh_flow.d
+ C TIME(us) FILE -- NAME
+ 0 3060274370505 func_abc.sh -> func_a
+ 0 3060274370529 func_abc.sh > echo
+ 0 3060274372742 func_abc.sh | sleep
+ 0 3060275381634 func_abc.sh -> func_b
+ 0 3060275381660 func_abc.sh > echo
+ 0 3060275383852 func_abc.sh | sleep
+ 0 3060276391653 func_abc.sh -> func_c
+ 0 3060276391679 func_abc.sh > echo
+ 0 3060276393671 func_abc.sh | sleep
+ 0 3060277401753 func_abc.sh <- func_c
+ 0 3060277401767 func_abc.sh <- func_b
+ 0 3060277401775 func_abc.sh <- func_a
+ ^C
+
+As each function is entered, the third column is indented by 2 spaces. This
+shows which function is calling who - the output abovebegins by showing that
+func_a() began, and then called func_b().
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
+
+
+The following traces the firefox startup script.
+
+# sh_flow.d
+ C TIME(us) FILE -- NAME
+ 0 3060321598138 firefox > test
+ 0 3060321603730 firefox > [
+ 0 3060321603796 firefox > cd
+ 0 3060321603878 firefox > [
+ 0 3060321603900 firefox > [
+ 0 3060321604099 firefox > [
+ 0 3060321609050 firefox > echo
+ 0 3060321620601 firefox > echo
+ 0 3060321626369 firefox > [
+ 0 3060321626432 firefox > export
+ 0 3060321626459 firefox -> moz_pis_startstop_scripts
+ 0 3060321626519 firefox > export
+ 0 3060321626966 firefox > [
+ 0 3060321627031 firefox > .
+ 0 3060321628446 firefox -> moz_spc_verbose_echo
+ 0 3060321628458 firefox > :
+ 0 3060321628467 firefox <- moz_spc_verbose_echo
+ 0 3060321636461 firefox > [
+ 0 3060321636738 firefox -> moz_spc_verbose_echo
+ 0 3060321636751 firefox > :
+ 0 3060321636760 firefox <- moz_spc_verbose_echo
+ 0 3060321636778 firefox > [
+ 0 3060321636793 firefox > [
+ 0 3060321636817 firefox > [
+ 0 3060321637126 firefox -> moz_spc_verbose_echo
+ 0 3060321637136 firefox > :
+ 0 3060321637143 firefox <- moz_spc_verbose_echo
+ 0 3060321666922 firefox -> moz_spc_verbose_echo
+ 0 3060321666952 firefox > :
+ 0 3060321666964 firefox <- moz_spc_verbose_echo
+ 0 3060321674929 firefox > [
+ 0 3060321680246 firefox > [
+ 0 3060321680312 firefox -> moz_spc_verbose_echo
+ 0 3060321680323 firefox > :
+ 0 3060321680331 firefox <- moz_spc_verbose_echo
+ 0 3060321680356 firefox -> moz_spc_verbose_echo
+ 0 3060321680363 firefox > :
+ 0 3060321680370 firefox <- moz_spc_verbose_echo
+ 0 3060321680396 firefox > [
+ 0 3060321680428 firefox <- moz_pis_startstop_scripts
+ 0 3060321680525 firefox > [
+ 0 3060321680580 firefox > [
+ 0 3060321685358 firefox | /usr/lib/firefox/run-mozilla.sh
+ 0 3060321700731 run-mozilla.sh > [
+ 0 3060321700950 run-mozilla.sh > break
+ 0 3060321703259 run-mozilla.sh > [
+ 0 3060321703292 run-mozilla.sh > shift
+ 0 3060321703382 run-mozilla.sh > [
+ 0 3060321703421 run-mozilla.sh > [
+ 0 3060321703493 run-mozilla.sh > [
+ 0 3060321703642 run-mozilla.sh > [
+ 0 3060321703669 run-mozilla.sh > export
+ 0 3060321703706 run-mozilla.sh > [
+ 0 3060321703725 run-mozilla.sh > [
+ 0 3060321703857 run-mozilla.sh > [
+ 0 3060321703880 run-mozilla.sh > export
+ 0 3060321703925 run-mozilla.sh > export
+ 0 3060321703954 run-mozilla.sh > [
+ 0 3060321703982 run-mozilla.sh -> moz_run_program
+ 0 3060321704013 run-mozilla.sh > [
+ 0 3060321704049 run-mozilla.sh -> moz_test_binary
+ 0 3060321704065 run-mozilla.sh > [
+ 0 3060321704097 run-mozilla.sh > [
+ 0 3060321704127 run-mozilla.sh > return
+ 0 3060321704137 run-mozilla.sh <- moz_test_binary
+ 0 3060321704151 run-mozilla.sh > [
+ 0 3060321709953 run-mozilla.sh > type
+ 0 3060321724260 run-mozilla.sh > [
+ 0 3060321724559 run-mozilla.sh > [
+ 0 3060321724574 run-mozilla.sh > [
+ 0 3060321727396 run-mozilla.sh | /usr/lib/firefox/firefox-bin
+ 0 3060325513871 run-mozilla.sh > [
+ 0 3060325513898 run-mozilla.sh > [
+ 0 3060325513929 run-mozilla.sh > [
+ 0 3060325513940 run-mozilla.sh <- moz_run_program
+ 0 3060325513967 run-mozilla.sh > exit
+ 0 3060325515113 firefox -> moz_pis_startstop_scripts
+ 0 3060325515189 firefox > export
+ 0 3060325515431 firefox > [
+ 0 3060325515466 firefox > [
+ 0 3060325515487 firefox <- moz_pis_startstop_scripts
+ 0 3060325515503 firefox > exit
+
+This shows the flow, incluing the handover between the "firefox" script
+and the "run-mozilla.sh" script.
+
+There is a point in the output where flow appears to reverse (at time
+3060321709953, with the entry "> type"). This is due to another instance
+of the run-mozilla.sh script running, which is indistinguishable from
+the other lines in the output. To confirm this for yourself, add a PID
+column to the flow script (or use sh_flowinfo.d).
+
diff --git a/Examples/sh_flowinfo_example.txt b/Examples/sh_flowinfo_example.txt
new file mode 100644
index 000000000000..1fb27cf4ea2d
--- /dev/null
+++ b/Examples/sh_flowinfo_example.txt
@@ -0,0 +1,242 @@
+The following are examples of sh_flowinfo.d.
+
+This is a simple script to trace the flow of Bourne shell functions,
+builtins and external commands. Here it traces the example program,
+Code/Shell/func_abc.sh.
+
+ # sh_flowinfo.d
+ C PID DELTA(us) FILE:LINE TYPE -- NAME
+ 0 19634 2 func_abc.sh:23 func -> func_a
+ 0 19634 24 func_abc.sh:18 builtin -> echo
+ 0 19634 41 func_abc.sh:- builtin <- echo
+ 0 19634 5873 func_abc.sh:19 cmd -> sleep
+ 0 19634 999373 func_abc.sh:- cmd <- sleep
+ 0 19634 39 func_abc.sh:20 func -> func_b
+ 0 19634 22 func_abc.sh:11 builtin -> echo
+ 0 19634 40 func_abc.sh:- builtin <- echo
+ 0 19634 4661 func_abc.sh:12 cmd -> sleep
+ 0 19634 1005349 func_abc.sh:- cmd <- sleep
+ 0 19634 49 func_abc.sh:13 func -> func_c
+ 0 19634 22 func_abc.sh:5 builtin -> echo
+ 0 19634 38 func_abc.sh:- builtin <- echo
+ 0 19634 4949 func_abc.sh:6 cmd -> sleep
+ 0 19634 1004817 func_abc.sh:- cmd <- sleep
+ 0 19634 36 func_abc.sh:- func <- func_c
+ 0 19634 14 func_abc.sh:- func <- func_b
+ 0 19634 8 func_abc.sh:- func <- func_a
+
+As each function is entered, the third column is indented by 2 spaces. This
+shows which function is calling who - the output abovebegins by showing that
+func_a() began, and then called func_b().
+
+The DELTA(us) column shows time from that line to the previous line, and
+so can be a bit tricky to read. For example, the fifth line of data output
+(skipping the header) reads as "the time from the command sleep beginning
+to ending was 999373 us, or 1.0 seconds".
+
+The LINE column shows the line in the file what was being executed. Refer
+to the source program to see what this line refers to.
+
+If the output looks shuffled, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
+
+The following traces the firefox startup script.
+
+# sh_flowinfo.d
+ C PID DELTA(us) FILE:LINE TYPE -- NAME
+ 0 156789 1 firefox:- subsh -> pid 156790
+ 0 156789 20 firefox:- subsh <- = 0
+ 0 156789 31651 firefox:- subsh -> pid 156791
+ 0 156789 20 firefox:- subsh <- = 0
+ 0 156789 10502 firefox:109 builtin -> test
+ 0 156789 59 firefox:- builtin <- test
+ 0 156789 3804 firefox:- subsh -> pid 156792
+ 0 156789 21 firefox:- subsh <- = 0
+ 0 156789 22029 firefox:114 builtin -> [
+ 0 156789 57 firefox:- builtin <- [
+ 0 156789 90910 firefox:- subsh -> pid 156793
+ 0 156789 22 firefox:- subsh <- = 0
+ 0 156789 159492 firefox:- subsh -> pid 156794
+ 0 156789 22 firefox:- subsh <- = 0
+ 0 156789 127 firefox:116 builtin -> cd
+ 0 156789 54 firefox:- builtin <- cd
+ 0 156789 209757 firefox:- subsh -> pid 156795
+ 0 156789 23 firefox:- subsh <- = 0
+ 0 156795 206160 firefox:- subsh -> pid 156796
+ 0 156795 9 firefox:- subsh <- = 0
+ 0 156789 12115 firefox:118 builtin -> [
+ 0 156789 61 firefox:- builtin <- [
+ 0 156789 200529 firefox:- subsh -> pid 156797
+ 0 156789 24 firefox:- subsh <- = 0
+ 0 156789 136 firefox:123 builtin -> [
+ 0 156789 58 firefox:- builtin <- [
+ 0 156789 21 firefox:124 builtin -> cd
+ 0 156789 19 firefox:- builtin <- cd
+ 0 156798 175 firefox:1 builtin -> pwd
+ 0 156798 65 firefox:- builtin <- pwd
+ 0 156789 108835 firefox:- subsh -> pid 156798
+ 0 156789 18 firefox:- subsh <- = 0
+ 0 156789 119 firefox:128 builtin -> break
+ 0 156789 15 firefox:- builtin <- break
+ 0 156789 21 firefox:131 builtin -> cd
+ 0 156789 26 firefox:- builtin <- cd
+ 0 156789 61 firefox:133 builtin -> [
+ 0 156789 9 firefox:- builtin <- [
+ 0 156789 73508 firefox:147 builtin -> [
+ 0 156789 25 firefox:- builtin <- [
+ 0 156800 184 firefox:1 builtin -> echo
+ 0 156800 175 firefox:- builtin <- echo
+ 0 156789 15966 firefox:- subsh -> pid 156799
+ 0 156789 22 firefox:- subsh <- = 0
+ 0 156799 12091 firefox:- subsh -> pid 156800
+ 0 156799 10 firefox:- subsh <- = 0
+ 0 156802 178 firefox:1 builtin -> echo
+ 0 156802 167 firefox:- builtin <- echo
+ 0 156789 13822 firefox:- subsh -> pid 156801
+ 0 156789 18 firefox:- subsh <- = 0
+ 0 156801 81683 firefox:- subsh -> pid 156802
+ 0 156801 21 firefox:- subsh <- = 0
+ 0 156789 78324 firefox:158 builtin -> [
+ 0 156789 37 firefox:- builtin <- [
+ 0 156789 54 firefox:194 builtin -> export
+ 0 156789 9 firefox:- builtin <- export
+ 0 156789 26 firefox:197 func -> moz_pis_startstop_scripts
+ 0 156789 61 firefox:62 builtin -> export
+ 0 156789 9 firefox:- builtin <- export
+ 0 156789 413 firefox:67 builtin -> [
+ 0 156789 34 firefox:- builtin <- [
+ 0 156789 40 firefox:69 builtin -> .
+ 0 156789 20833 firefox:18 func -> moz_spc_verbose_echo
+ 0 156789 26 firefox:15 builtin -> :
+ 0 156789 16 firefox:- builtin <- :
+ 0 156789 15 firefox:- func <- moz_spc_verbose_echo
+ 0 156789 105106 firefox:- subsh -> pid 156803
+ 0 156789 22 firefox:- subsh <- = 0
+ 0 156789 129 firefox:19 builtin -> [
+ 0 156789 17 firefox:- builtin <- [
+ 0 156789 33 firefox:20 func -> moz_spc_verbose_echo
+ 0 156789 14 firefox:15 builtin -> :
+ 0 156789 7 firefox:- builtin <- :
+ 0 156789 9 firefox:- func <- moz_spc_verbose_echo
+ 0 156789 21 firefox:23 builtin -> [
+ 0 156789 8 firefox:- builtin <- [
+ 0 156789 16 firefox:26 builtin -> [
+ 0 156789 8 firefox:- builtin <- [
+ 0 156789 24 firefox:29 builtin -> [
+ 0 156789 43 firefox:- builtin <- [
+ 0 156789 77 firefox:36 func -> moz_spc_verbose_echo
+ 0 156789 9 firefox:15 builtin -> :
+ 0 156789 8 firefox:- builtin <- :
+ 0 156789 8 firefox:- func <- moz_spc_verbose_echo
+ 0 156789 158947 firefox:- subsh -> pid 156804
+ 0 156789 22 firefox:- subsh <- = 0
+ 0 156789 210112 firefox:- subsh -> pid 156805
+ 0 156789 22 firefox:- subsh <- = 0
+ 0 156805 205500 firefox:- subsh -> pid 156806
+ 0 156805 10 firefox:- subsh <- = 0
+ 0 156805 200987 firefox:- subsh -> pid 156807
+ 0 156805 20 firefox:- subsh <- = 0
+ 0 156789 363564 firefox:40 func -> moz_spc_verbose_echo
+ 0 156789 26 firefox:15 builtin -> :
+ 0 156789 17 firefox:- builtin <- :
+ 0 156789 15 firefox:- func <- moz_spc_verbose_echo
+ 0 156809 234 firefox:1 builtin -> [
+ 0 156809 70 firefox:- builtin <- [
+ 0 156789 46950 firefox:- subsh -> pid 156808
+ 0 156789 22 firefox:- subsh <- = 0
+ 0 156808 42371 firefox:- subsh -> pid 156809
+ 0 156808 10 firefox:- subsh <- = 0
+ 0 156789 27278 firefox:43 builtin -> [
+ 0 156789 26 firefox:- builtin <- [
+ 0 156789 62 firefox:44 func -> moz_spc_verbose_echo
+ 0 156789 15 firefox:15 builtin -> :
+ 0 156789 8 firefox:- builtin <- :
+ 0 156789 10 firefox:- func <- moz_spc_verbose_echo
+ 0 156789 30 firefox:67 func -> moz_spc_verbose_echo
+ 0 156789 9 firefox:15 builtin -> :
+ 0 156789 8 firefox:- builtin <- :
+ 0 156789 7 firefox:- func <- moz_spc_verbose_echo
+ 0 156789 8 firefox:- builtin <- .
+ 0 156789 28 firefox:67 builtin -> [
+ 0 156789 31 firefox:- builtin <- [
+ 0 156789 8 firefox:- func <- moz_pis_startstop_scripts
+ 0 156789 97 firefox:199 builtin -> [
+ 0 156789 35 firefox:- builtin <- [
+ 0 156789 29 firefox:205 builtin -> [
+ 0 156789 9 firefox:- builtin <- [
+ 0 156789 72519 firefox:209 cmd -> /usr/lib/firefox/run-mozilla.sh
+ 0 156810 1 run-mozilla.sh:- subsh -> pid 156811
+ 0 156810 15 run-mozilla.sh:- subsh <- = 0
+ 0 156810 129474 run-mozilla.sh:- subsh -> pid 156812
+ 0 156810 24 run-mozilla.sh:- subsh <- = 0
+ 0 156810 743 run-mozilla.sh:258 builtin -> [
+ 0 156810 28 run-mozilla.sh:- builtin <- [
+ 0 156810 212 run-mozilla.sh:275 builtin -> break
+ 0 156810 10 run-mozilla.sh:- builtin <- break
+ 0 156810 31 run-mozilla.sh:283 builtin -> [
+ 0 156810 10 run-mozilla.sh:- builtin <- [
+ 0 156810 16 run-mozilla.sh:286 builtin -> shift
+ 0 156810 9 run-mozilla.sh:- builtin <- shift
+ 0 156810 55 run-mozilla.sh:291 builtin -> [
+ 0 156810 9 run-mozilla.sh:- builtin <- [
+ 0 156810 36 run-mozilla.sh:317 builtin -> [
+ 0 156810 34 run-mozilla.sh:- builtin <- [
+ 0 156810 37 run-mozilla.sh:327 builtin -> [
+ 0 156810 9 run-mozilla.sh:- builtin <- [
+ 0 156810 142 run-mozilla.sh:362 builtin -> [
+ 0 156810 9 run-mozilla.sh:- builtin <- [
+ 0 156810 26 run-mozilla.sh:366 builtin -> export
+ 0 156810 9 run-mozilla.sh:- builtin <- export
+ 0 156810 37 run-mozilla.sh:369 builtin -> [
+ 0 156810 9 run-mozilla.sh:- builtin <- [
+ 0 156810 18 run-mozilla.sh:371 builtin -> [
+ 0 156810 19 run-mozilla.sh:- builtin <- [
+ 0 156810 112 run-mozilla.sh:379 builtin -> [
+ 0 156810 10 run-mozilla.sh:- builtin <- [
+ 0 156810 23 run-mozilla.sh:418 builtin -> export
+ 0 156810 9 run-mozilla.sh:- builtin <- export
+ 0 156810 45 run-mozilla.sh:419 builtin -> export
+ 0 156810 10 run-mozilla.sh:- builtin <- export
+ 0 156810 27 run-mozilla.sh:421 builtin -> [
+ 0 156810 9 run-mozilla.sh:- builtin <- [
+ 0 156810 29 run-mozilla.sh:425 func -> moz_run_program
+ 0 156810 32 run-mozilla.sh:137 builtin -> [
+ 0 156810 25 run-mozilla.sh:- builtin <- [
+ 0 156810 20 run-mozilla.sh:145 func -> moz_test_binary
+ 0 156810 17 run-mozilla.sh:97 builtin -> [
+ 0 156810 23 run-mozilla.sh:- builtin <- [
+ 0 156810 15 run-mozilla.sh:99 builtin -> [
+ 0 156810 26 run-mozilla.sh:- builtin <- [
+ 0 156810 13 run-mozilla.sh:101 builtin -> return
+ 0 156810 9 run-mozilla.sh:- builtin <- return
+ 0 156810 11 run-mozilla.sh:- func <- moz_test_binary
+ 0 156810 18 run-mozilla.sh:146 builtin -> [
+ 0 156810 9 run-mozilla.sh:- builtin <- [
+ 0 156814 185 run-mozilla.sh:1 builtin -> type
+ 0 156814 118188 run-mozilla.sh:- builtin <- type
+ 0 156810 167284 run-mozilla.sh:- subsh -> pid 156813
+ 0 156810 23 run-mozilla.sh:- subsh <- = 0
+ 0 156813 162135 run-mozilla.sh:- subsh -> pid 156814
+ 0 156813 12 run-mozilla.sh:- subsh <- = 0
+ 0 156813 200125 run-mozilla.sh:- subsh -> pid 156815
+ 0 156813 22 run-mozilla.sh:- subsh <- = 0
+ 0 156810 203465 run-mozilla.sh:152 builtin -> [
+ 0 156810 51 run-mozilla.sh:- builtin <- [
+ 0 156810 21 run-mozilla.sh:156 builtin -> [
+ 0 156810 9 run-mozilla.sh:- builtin <- [
+ 0 156810 15 run-mozilla.sh:159 builtin -> [
+ 0 156810 14 run-mozilla.sh:- builtin <- [
+ 0 156810 65752 run-mozilla.sh:- subsh -> pid 156816
+ 0 156810 24 run-mozilla.sh:- subsh <- = 0
+ 0 156816 251788 run-mozilla.sh:- subsh -> pid 156817
+ 0 156816 22 run-mozilla.sh:- subsh <- = 0
+ 0 156810 299677 run-mozilla.sh:167 cmd -> /usr/lib/firefox/firefox-bin
+ 0 156810 5124906 run-mozilla.sh:- cmd <- /usr/lib/firefox/firefox-bin
+ 0 156789 5993798 firefox:- cmd <- /usr/lib/firefox/run-mozilla.sh
+
+Now latencies can investigated by line number.
+
diff --git a/Examples/sh_flowtime_example.txt b/Examples/sh_flowtime_example.txt
new file mode 100644
index 000000000000..03848de62d8e
--- /dev/null
+++ b/Examples/sh_flowtime_example.txt
@@ -0,0 +1,131 @@
+The following are examples of sh_flowtime.d.
+
+This is a simple script to trace the flow of Bourne shell functions,
+builtins and external commands. Here it traces the example program,
+Code/Shell/func_abc.sh.
+
+ # sh_flowtime.d
+ C TIME(us) FILE DELTA(us) -- NAME
+ 0 3060817866026 func_abc.sh 2 -> func_a
+ 0 3060817866086 func_abc.sh 60 > echo
+ 0 3060818871601 func_abc.sh 1005514 | sleep
+ 0 3060818871639 func_abc.sh 38 -> func_b
+ 0 3060818871684 func_abc.sh 44 > echo
+ 0 3060819881597 func_abc.sh 1009912 | sleep
+ 0 3060819881657 func_abc.sh 60 -> func_c
+ 0 3060819881717 func_abc.sh 60 > echo
+ 0 3060820891613 func_abc.sh 1009896 | sleep
+ 0 3060820891661 func_abc.sh 47 <- func_c
+ 0 3060820891675 func_abc.sh 14 <- func_b
+ 0 3060820891683 func_abc.sh 7 <- func_a
+ ^C
+
+As each function is entered, the third column is indented by 2 spaces. This
+shows which function is calling who - the output above begins by showing that
+func_a() began, and then called func_b().
+
+The DELTA(us) column is interpreted as follows,
+
+ -> previous line to the start of this function
+ <- previous line to the end of this function
+ > previous line to the end of this builtin
+ | previous line to the end of this command
+
+And so the above output shows that each sleep command is taking around 1.0
+seconds to execute.
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
+
+
+The following traces the firefox start script.
+
+# sh_flowtime.d
+ C TIME(us) FILE DELTA(us) -- NAME
+ 0 3060994282580 firefox 2 > test
+ 0 3060994286921 firefox 4341 > [
+ 0 3060994286955 firefox 34 > cd
+ 0 3060994287014 firefox 58 > [
+ 0 3060994287059 firefox 45 > [
+ 0 3060994287227 firefox 167 > [
+ 0 3060994293793 firefox 2 > echo
+ 0 3060994305759 firefox 2 > echo
+ 0 3060994309613 firefox 22385 > [
+ 0 3060994309665 firefox 52 > export
+ 0 3060994309691 firefox 25 -> moz_pis_startstop_scripts
+ 0 3060994309752 firefox 61 > export
+ 0 3060994310199 firefox 447 > [
+ 0 3060994314462 firefox 4262 -> moz_spc_verbose_echo
+ 0 3060994314484 firefox 22 > :
+ 0 3060994314497 firefox 12 <- moz_spc_verbose_echo
+ 0 3060994322101 firefox 7604 > [
+ 0 3060994322134 firefox 33 -> moz_spc_verbose_echo
+ 0 3060994322147 firefox 12 > :
+ 0 3060994322155 firefox 7 <- moz_spc_verbose_echo
+ 0 3060994322501 firefox 345 > [
+ 0 3060994322518 firefox 17 > [
+ 0 3060994322578 firefox 59 > [
+ 0 3060994322641 firefox 62 -> moz_spc_verbose_echo
+ 0 3060994322650 firefox 9 > :
+ 0 3060994322656 firefox 6 <- moz_spc_verbose_echo
+ 0 3060994653794 firefox 331137 -> moz_spc_verbose_echo
+ 0 3060994653826 firefox 32 > :
+ 0 3060994653839 firefox 12 <- moz_spc_verbose_echo
+ 0 3060994659534 firefox 2 > [
+ 0 3060994667539 firefox 13699 > [
+ 0 3060994667604 firefox 65 -> moz_spc_verbose_echo
+ 0 3060994667617 firefox 13 > :
+ 0 3060994667625 firefox 8 <- moz_spc_verbose_echo
+ 0 3060994667653 firefox 27 -> moz_spc_verbose_echo
+ 0 3060994667661 firefox 7 > :
+ 0 3060994667668 firefox 6 <- moz_spc_verbose_echo
+ 0 3060994667675 firefox 7 > .
+ 0 3060994667725 firefox 49 > [
+ 0 3060994667732 firefox 6 <- moz_pis_startstop_scripts
+ 0 3060994667853 firefox 121 > [
+ 0 3060994667881 firefox 27 > [
+ 0 3060994804329 run-mozilla.sh 2 > [
+ 0 3060994804524 run-mozilla.sh 194 > break
+ 0 3060994804560 run-mozilla.sh 36 > [
+ 0 3060994804580 run-mozilla.sh 20 > shift
+ 0 3060994804649 run-mozilla.sh 68 > [
+ 0 3060994804710 run-mozilla.sh 61 > [
+ 0 3060994804747 run-mozilla.sh 36 > [
+ 0 3060994804889 run-mozilla.sh 142 > [
+ 0 3060994804915 run-mozilla.sh 26 > export
+ 0 3060994804952 run-mozilla.sh 36 > [
+ 0 3060994804981 run-mozilla.sh 28 > [
+ 0 3060994805093 run-mozilla.sh 112 > [
+ 0 3060994805116 run-mozilla.sh 22 > export
+ 0 3060994805160 run-mozilla.sh 44 > export
+ 0 3060994805187 run-mozilla.sh 27 > [
+ 0 3060994805215 run-mozilla.sh 27 -> moz_run_program
+ 0 3060994805263 run-mozilla.sh 48 > [
+ 0 3060994805283 run-mozilla.sh 19 -> moz_test_binary
+ 0 3060994805314 run-mozilla.sh 31 > [
+ 0 3060994805346 run-mozilla.sh 31 > [
+ 0 3060994805358 run-mozilla.sh 12 > return
+ 0 3060994805367 run-mozilla.sh 9 <- moz_test_binary
+ 0 3060994805385 run-mozilla.sh 17 > [
+ 0 3060994964498 run-mozilla.sh 2 > type
+ 0 3060995520942 run-mozilla.sh 715556 > [
+ 0 3060995520967 run-mozilla.sh 24 > [
+ 0 3060995520987 run-mozilla.sh 20 > [
+ 0 3061000622172 run-mozilla.sh 5101184 | /usr/lib/firefox/firefox-bin
+ 0 3061000622221 run-mozilla.sh 49 > [
+ 0 3061000622252 run-mozilla.sh 30 > [
+ 0 3061000622266 run-mozilla.sh 14 > [
+ 0 3061000622275 run-mozilla.sh 9 <- moz_run_program
+ 0 3061000623686 firefox 5955805 | /usr/lib/firefox/run-mozilla.sh
+ 0 3061000623793 firefox 106 -> moz_pis_startstop_scripts
+ 0 3061000623864 firefox 71 > export
+ 0 3061000624108 firefox 244 > [
+ 0 3061000624138 firefox 30 > [
+ 0 3061000624147 firefox 8 <- moz_pis_startstop_scripts
+
+Points of latency during startup are visible in the output. For more details,
+see Examples/sh_flowinfo_example.txt.
+
diff --git a/Examples/sh_lines_example.txt b/Examples/sh_lines_example.txt
new file mode 100644
index 000000000000..f19487cc624b
--- /dev/null
+++ b/Examples/sh_lines_example.txt
@@ -0,0 +1,32 @@
+The following are examples of sh_lines.d.
+
+This is a simple script to count Bourne shell line execution. Here it traces an
+example program, Code/Shell/func_slow.sh.
+
+ # sh_lines.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+
+ FILE:LINE COUNT
+ func_slow.sh:5 1
+ func_slow.sh:6 1
+ func_slow.sh:15 1
+ func_slow.sh:16 1
+ func_slow.sh:21 1
+ func_slow.sh:26 1
+ func_slow.sh:27 1
+ func_slow.sh:32 1
+ func_slow.sh:35 1
+ func_slow.sh:30 100
+ func_slow.sh:28 101
+ func_slow.sh:19 200
+ func_slow.sh:17 201
+ func_slow.sh:9 300
+ func_slow.sh:7 301
+ func_slow.sh:1 600
+
+The most frequently executed line was line 1 of func_slow.sh - which is actually
+line 1 of func_slow.sh subshells (command substitution, ` `). Apart from
+this slight confusion, the rest of the output should make sense (and most
+scripts only call one line in command substitution anyway).
+
diff --git a/Examples/sh_pidcolors_example.txt b/Examples/sh_pidcolors_example.txt
new file mode 100644
index 000000000000..a6025e49078f
--- /dev/null
+++ b/Examples/sh_pidcolors_example.txt
@@ -0,0 +1,574 @@
+The following are examples of sh_pidcolors.d.
+
+This is the same script as in sh_syscolors.d, except with additional tracing.
+As well as the functions, lines and system calls traced in sh_syscolors.d,
+this also adds some "pid" provider tracing as a starting point for deeper
+analysis. In this case it adds the probes:
+
+ pid$target:a.out:e*:entry,
+ pid$target:a.out:e*:return
+
+which means, all functions from the /usr/bin/sh binary that begin with
+the letter "e". This adds about 34 probes, but you can customize it to be as
+inclusive as you like. It renders the output in color ("colour") using terminal
+escape sequences (which you can tweak by modifying the script).
+
+Here it traces the example program, Code/Shell/func_abc.sh.
+
+WARNING: This output is full of terminal escape sequences, so if you are
+trying to view this through an editor or web browser - it may look awful.
+Try viewing this using "more" (although, depending on your terminal, it
+still may look awful).
+
+# sh_pidcolors.d -c ./func_abc.sh -o /tmp/out
+Function A
+Function B
+Function C
+
+# cat /tmp/out
+C PID DELTA(us) FILE:LINE TYPE -- NAME
+0 12312 2 func_abc.sh:- syscall -> munmap
+0 12312 34 func_abc.sh:- syscall <- munmap
+0 12312 53 func_abc.sh:- syscall -> mmap
+0 12312 19 func_abc.sh:- syscall <- mmap
+0 12312 43 func_abc.sh:- syscall -> setcontext
+0 12312 11 func_abc.sh:- syscall <- setcontext
+0 12312 11 func_abc.sh:- syscall -> getrlimit
+0 12312 11 func_abc.sh:- syscall <- getrlimit
+0 12312 10 func_abc.sh:- syscall -> getpid
+0 12312 9 func_abc.sh:- syscall <- getpid
+0 12312 63 func_abc.sh:- syscall -> setcontext
+0 12312 9 func_abc.sh:- syscall <- setcontext
+0 12312 813 func_abc.sh:- syscall -> sysi86
+0 12312 13 func_abc.sh:- syscall <- sysi86
+0 12312 85 func_abc.sh:- syscall -> open64
+0 12312 88 func_abc.sh:- syscall <- open64
+0 12312 13 func_abc.sh:- syscall -> ioctl
+0 12312 35 func_abc.sh:- syscall <- ioctl
+0 12312 15 func_abc.sh:- syscall -> close
+0 12312 17 func_abc.sh:- syscall <- close
+0 12312 123 func_abc.sh:- syscall -> getpid
+0 12312 9 func_abc.sh:- syscall <- getpid
+0 12312 17 func_abc.sh:- syscall -> setpgrp
+0 12312 9 func_abc.sh:- syscall <- setpgrp
+0 12312 11 func_abc.sh:- syscall -> setpgrp
+0 12312 8 func_abc.sh:- syscall <- setpgrp
+0 12312 11 func_abc.sh:- syscall -> access
+0 12312 19 func_abc.sh:- syscall <- access
+0 12312 14 func_abc.sh:- syscall -> brk
+0 12312 11 func_abc.sh:- syscall <- brk
+0 12312 15 func_abc.sh:- syscall -> sysconfig
+0 12312 9 func_abc.sh:- syscall <- sysconfig
+0 12312 10 func_abc.sh:- syscall -> sysconfig
+0 12312 8 func_abc.sh:- syscall <- sysconfig
+0 12312 11 func_abc.sh:- syscall -> sigaltstack
+0 12312 9 func_abc.sh:- syscall <- sigaltstack
+0 12312 16 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 12 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 9 func_abc.sh:- syscall -> sigaction
+0 12312 9 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 10 func_abc.sh:- syscall -> sigaction
+0 12312 8 func_abc.sh:- syscall <- sigaction
+0 12312 18 func_abc.sh:- sh -> endstak
+0 12312 18 func_abc.sh:- sh <- endstak
+0 12312 60 func_abc.sh:- syscall -> brk
+0 12312 9 func_abc.sh:- syscall <- brk
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 13 func_abc.sh:- syscall -> getuid
+0 12312 9 func_abc.sh:- syscall <- getuid
+0 12312 10 func_abc.sh:- syscall -> getuid
+0 12312 9 func_abc.sh:- syscall <- getuid
+0 12312 11 func_abc.sh:- syscall -> getgid
+0 12312 9 func_abc.sh:- syscall <- getgid
+0 12312 11 func_abc.sh:- syscall -> getgid
+0 12312 8 func_abc.sh:- syscall <- getgid
+0 12312 16 func_abc.sh:- syscall -> open64
+0 12312 20 func_abc.sh:- syscall <- open64
+0 12312 11 func_abc.sh:- sh -> exfile
+0 12312 10 func_abc.sh:- syscall -> close
+0 12312 8 func_abc.sh:- syscall <- close
+0 12312 24 func_abc.sh:- syscall -> fcntl
+0 12312 23 func_abc.sh:- syscall <- fcntl
+0 12312 10 func_abc.sh:- syscall -> close
+0 12312 10 func_abc.sh:- syscall <- close
+0 12312 9 func_abc.sh:- syscall -> fcntl
+0 12312 8 func_abc.sh:- syscall <- fcntl
+0 12312 28 func_abc.sh:- syscall -> ioctl
+0 12312 42 func_abc.sh:- syscall <- ioctl
+0 12312 10 func_abc.sh:- syscall -> ioctl
+0 12312 9 func_abc.sh:- syscall <- ioctl
+0 12312 14 func_abc.sh:- syscall -> read
+0 12312 33 func_abc.sh:- syscall <- read
+0 12312 11 func_abc.sh:- syscall -> brk
+0 12312 20 func_abc.sh:- syscall <- brk
+0 12312 13 func_abc.sh:- sh -> execute
+0 12312 11 func_abc.sh:- sh <- execute
+0 12312 10 func_abc.sh:- syscall -> brk
+0 12312 9 func_abc.sh:- syscall <- brk
+0 12312 10 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh <- execute
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 29 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> execute
+0 12312 10 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- syscall -> brk
+0 12312 9 func_abc.sh:- syscall <- brk
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 10 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- syscall -> brk
+0 12312 9 func_abc.sh:- syscall <- brk
+0 12312 10 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- syscall -> read
+0 12312 16 func_abc.sh:- syscall <- read
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 25 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> execute
+0 12312 10 func_abc.sh:- sh <- execute
+0 12312 10 func_abc.sh:- syscall -> brk
+0 12312 9 func_abc.sh:- syscall <- brk
+0 12312 10 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- syscall -> brk
+0 12312 9 func_abc.sh:- syscall <- brk
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:23 line -- 
+0 12312 14 func_abc.sh:- sh -> estabf
+0 12312 10 func_abc.sh:- sh <- estabf
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 18 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 12 func_abc.sh:- sh -> expand
+0 12312 10 func_abc.sh:- sh <- expand
+0 12312 14 func_abc.sh:23 func -> func_a
+0 12312 14 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 8 func_abc.sh:18 line -- 
+0 12312 8 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 8 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 9 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 8 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 13 func_abc.sh:18 builtin -> echo
+0 12312 15 func_abc.sh:- sh -> echo
+0 12312 14 func_abc.sh:- syscall -> write
+0 12312 35 func_abc.sh:- syscall <- write
+0 12312 321 func_abc.sh:- sh <- echo
+0 12312 13 func_abc.sh:0 builtin <- echo
+0 12312 17 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 8 func_abc.sh:19 line -- 
+0 12312 8 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 9 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 11 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- syscall -> getuid
+0 12312 9 func_abc.sh:- syscall <- getuid
+0 12312 15 func_abc.sh:- syscall -> stat64
+0 12312 27 func_abc.sh:- syscall <- stat64
+0 12312 11 func_abc.sh:- syscall -> access
+0 12312 15 func_abc.sh:- syscall <- access
+0 12312 18 func_abc.sh:- syscall -> schedctl
+0 12312 47 func_abc.sh:- syscall <- schedctl
+0 12312 219 func_abc.sh:- syscall -> fork1
+0 12312 234375 func_abc.sh:- syscall <- fork1
+0 12312 277 func_abc.sh:- syscall -> lwp_sigmask
+0 12312 13 func_abc.sh:- syscall <- lwp_sigmask
+0 12312 33 func_abc.sh:19 cmd -> sleep
+0 12312 59 func_abc.sh:- syscall -> waitsys
+0 12312 870257 func_abc.sh:- syscall <- waitsys
+0 12312 36 func_abc.sh:- syscall -> ioctl
+0 12312 16 func_abc.sh:- syscall <- ioctl
+0 12312 13 func_abc.sh:- syscall -> setpgrp
+0 12312 9 func_abc.sh:- syscall <- setpgrp
+0 12312 9 func_abc.sh:- syscall -> ioctl
+0 12312 9 func_abc.sh:- syscall <- ioctl
+0 12312 11 func_abc.sh:- syscall -> ioctl
+0 12312 33 func_abc.sh:- syscall <- ioctl
+0 12312 12 func_abc.sh:- syscall -> waitsys
+0 12312 25 func_abc.sh:- syscall <- waitsys
+0 12312 15 func_abc.sh:0 cmd <- sleep
+0 12312 20 func_abc.sh:- sh <- execute
+0 12312 15 func_abc.sh:- sh -> execute
+0 12312 14 func_abc.sh:20 line -- 
+0 12312 13 func_abc.sh:- sh -> estabf
+0 12312 10 func_abc.sh:- sh <- estabf
+0 12312 11 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 12 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 11 func_abc.sh:- sh -> expand
+0 12312 10 func_abc.sh:- sh <- expand
+0 12312 17 func_abc.sh:20 func -> func_b
+0 12312 14 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 8 func_abc.sh:11 line -- 
+0 12312 8 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 9 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 13 func_abc.sh:11 builtin -> echo
+0 12312 15 func_abc.sh:- sh -> echo
+0 12312 12 func_abc.sh:- syscall -> write
+0 12312 32 func_abc.sh:- syscall <- write
+0 12312 320 func_abc.sh:- sh <- echo
+0 12312 12 func_abc.sh:0 builtin <- echo
+0 12312 16 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 8 func_abc.sh:12 line -- 
+0 12312 8 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 9 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 225 func_abc.sh:- syscall -> fork1
+0 12312 60940 func_abc.sh:- syscall <- fork1
+0 12312 243 func_abc.sh:- syscall -> lwp_sigmask
+0 12312 15 func_abc.sh:- syscall <- lwp_sigmask
+0 12312 31 func_abc.sh:12 cmd -> sleep
+0 12312 31 func_abc.sh:- syscall -> waitsys
+0 12312 1007422 func_abc.sh:- syscall <- waitsys
+0 12312 28 func_abc.sh:- syscall -> ioctl
+0 12312 17 func_abc.sh:- syscall <- ioctl
+0 12312 11 func_abc.sh:- syscall -> setpgrp
+0 12312 9 func_abc.sh:- syscall <- setpgrp
+0 12312 9 func_abc.sh:- syscall -> ioctl
+0 12312 9 func_abc.sh:- syscall <- ioctl
+0 12312 9 func_abc.sh:- syscall -> ioctl
+0 12312 38 func_abc.sh:- syscall <- ioctl
+0 12312 12 func_abc.sh:- syscall -> waitsys
+0 12312 26 func_abc.sh:- syscall <- waitsys
+0 12312 15 func_abc.sh:0 cmd <- sleep
+0 12312 32 func_abc.sh:- sh <- execute
+0 12312 15 func_abc.sh:- sh -> execute
+0 12312 14 func_abc.sh:13 line -- 
+0 12312 13 func_abc.sh:- sh -> estabf
+0 12312 10 func_abc.sh:- sh <- estabf
+0 12312 12 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 12 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> expand
+0 12312 10 func_abc.sh:- sh <- expand
+0 12312 17 func_abc.sh:13 func -> func_c
+0 12312 13 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 8 func_abc.sh:5 line -- 
+0 12312 8 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 9 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 10 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 13 func_abc.sh:5 builtin -> echo
+0 12312 15 func_abc.sh:- sh -> echo
+0 12312 12 func_abc.sh:- syscall -> write
+0 12312 32 func_abc.sh:- syscall <- write
+0 12312 309 func_abc.sh:- sh <- echo
+0 12312 12 func_abc.sh:0 builtin <- echo
+0 12312 16 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:6 line -- 
+0 12312 8 func_abc.sh:- sh -> estabf
+0 12312 22 func_abc.sh:- sh <- estabf
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 11 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 9 func_abc.sh:- sh -> estabf
+0 12312 9 func_abc.sh:- sh <- estabf
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 9 func_abc.sh:- sh -> expand
+0 12312 9 func_abc.sh:- sh <- expand
+0 12312 220 func_abc.sh:- syscall -> fork1
+0 12312 60982 func_abc.sh:- syscall <- fork1
+0 12312 239 func_abc.sh:- syscall -> lwp_sigmask
+0 12312 15 func_abc.sh:- syscall <- lwp_sigmask
+0 12312 30 func_abc.sh:6 cmd -> sleep
+0 12312 30 func_abc.sh:- syscall -> waitsys
+0 12312 1007259 func_abc.sh:- syscall <- waitsys
+0 12312 29 func_abc.sh:- syscall -> ioctl
+0 12312 17 func_abc.sh:- syscall <- ioctl
+0 12312 11 func_abc.sh:- syscall -> setpgrp
+0 12312 9 func_abc.sh:- syscall <- setpgrp
+0 12312 9 func_abc.sh:- syscall -> ioctl
+0 12312 9 func_abc.sh:- syscall <- ioctl
+0 12312 9 func_abc.sh:- syscall -> ioctl
+0 12312 35 func_abc.sh:- syscall <- ioctl
+0 12312 12 func_abc.sh:- syscall -> waitsys
+0 12312 25 func_abc.sh:- syscall <- waitsys
+0 12312 15 func_abc.sh:0 cmd <- sleep
+0 12312 31 func_abc.sh:- sh <- execute
+0 12312 13 func_abc.sh:- sh <- execute
+0 12312 11 func_abc.sh:- func <- func_c
+0 12312 14 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- func <- func_b
+0 12312 10 func_abc.sh:- sh <- execute
+0 12312 18 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- sh <- execute
+0 12312 9 func_abc.sh:- func <- func_a
+0 12312 9 func_abc.sh:- sh <- execute
+0 12312 12 func_abc.sh:- syscall -> brk
+0 12312 11 func_abc.sh:- syscall <- brk
+0 12312 12 func_abc.sh:- syscall -> read
+0 12312 16 func_abc.sh:- syscall <- read
+0 12312 10 func_abc.sh:- syscall -> ioctl
+0 12312 9 func_abc.sh:- syscall <- ioctl
+0 12312 10 func_abc.sh:- syscall -> ioctl
+0 12312 8 func_abc.sh:- syscall <- ioctl
+0 12312 11 func_abc.sh:- syscall -> close
+0 12312 13 func_abc.sh:- syscall <- close
+0 12312 12 func_abc.sh:- sh -> endjobs
+0 12312 14 func_abc.sh:- sh <- endjobs
+0 12312 10 func_abc.sh:- sh <- exfile
+0 12312 11 func_abc.sh:- sh -> endjobs
+0 12312 9 func_abc.sh:- sh <- endjobs
+0 12312 37 func_abc.sh:- syscall -> open64
+0 12312 103 func_abc.sh:- syscall <- open64
+0 12312 11 func_abc.sh:- syscall -> ioctl
+0 12312 11 func_abc.sh:- syscall <- ioctl
+0 12312 11 func_abc.sh:- syscall -> close
+0 12312 15 func_abc.sh:- syscall <- close
+0 12312 32 func_abc.sh:- syscall -> rexit
+
+Here you can see the output showing the path the script follows as it is
+executed.
+
+At the end of the sh_syscolor_example.txt file, you can see the steps that the
+script goes through when it runs func_a. The output contains the two
+consecutive lines:
+
+0 12979 14 func_abc.sh:23 line -- 
+0 12979 32 func_abc.sh:23 func -> func_a
+
+Here we trace many more events that happen in between these two lines, as seen
+below:
+
+0 12312 9 func_abc.sh:23 line -- 
+0 12312 14 func_abc.sh:- sh -> estabf
+0 12312 10 func_abc.sh:- sh <- estabf
+0 12312 10 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 18 func_abc.sh:- sh -> endstak
+0 12312 9 func_abc.sh:- sh <- endstak
+0 12312 12 func_abc.sh:- sh -> expand
+0 12312 10 func_abc.sh:- sh <- expand
+0 12312 14 func_abc.sh:23 func -> func_a
+0 12312 14 func_abc.sh:- sh -> execute
+0 12312 9 func_abc.sh:- sh -> execute
+
diff --git a/Examples/sh_stat_example.txt b/Examples/sh_stat_example.txt
new file mode 100644
index 000000000000..a44a5638f66a
--- /dev/null
+++ b/Examples/sh_stat_example.txt
@@ -0,0 +1,44 @@
+Following are examples of running sh_stat.d on Shell scripts.
+
+sh_stat.d shows you the number of events per second that have happened since
+the last line output. The default interval is 1 second, but you can specify
+other intervals as arguments to the script.
+
+This shows the sh_stat.d script reflecting the Code/Shell/func_slow.sh script.
+
+ # sh_stat.d
+ TIME EXEC/s FUNCS/s BLTINS/s SUB-SH/s CMD/s
+ 2007 Sep 17 03:29:02 1 1 50 96 0
+ 2007 Sep 17 03:29:03 0 1 151 300 0
+ 2007 Sep 17 03:29:04 0 1 142 280 0
+ 2007 Sep 17 03:29:05 0 0 132 262 0
+ 2007 Sep 17 03:29:06 0 0 122 245 0
+ 2007 Sep 17 03:29:07 0 0 9 17 0
+ 2007 Sep 17 03:29:08 0 0 0 0 0
+ 2007 Sep 17 03:29:09 0 0 0 0 0
+ ^C
+
+We can see that at 2007 Sep 17 03:29:04 there were 0 Bourne shells executed,
+one function called, 142 built-in commands called, 280 sub-shells created and
+0 external commands called.
+
+
+Here the script runs when Mozilla Firefox is started.
+
+ # sh_stat.d
+ TIME EXEC/s FUNCS/s BLTINS/s SUB-SH/s CMD/s
+ 2007 Sep 17 03:29:52 1 9 52 38 2
+ 2007 Sep 17 03:29:53 0 0 0 0 0
+ 2007 Sep 17 03:29:54 0 0 0 0 0
+ 2007 Sep 17 03:29:55 0 0 0 0 0
+ 2007 Sep 17 03:29:56 0 0 0 0 0
+ 2007 Sep 17 03:29:57 0 0 0 0 0
+ 2007 Sep 17 03:29:58 0 0 0 0 0
+ 2007 Sep 17 03:29:59 0 0 0 0 0
+ 2007 Sep 17 03:30:00 0 0 0 0 0
+ 2007 Sep 17 03:30:01 1 1 8 0 0
+ 2007 Sep 17 03:30:02 0 0 0 0 0
+ 2007 Sep 17 03:30:03 0 0 0 0 0
+ 2007 Sep 17 03:30:04 0 0 0 0 0
+ ^C
+
diff --git a/Examples/sh_syscalls_example.txt b/Examples/sh_syscalls_example.txt
new file mode 100644
index 000000000000..fbda09525d30
--- /dev/null
+++ b/Examples/sh_syscalls_example.txt
@@ -0,0 +1,59 @@
+The following are examples of sh_syscalls.d.
+
+This is a simple script to count Shell functions, built-ins, external command
+executions and system calls. Here we trace an example program -
+Code/Shell/func_abc.sh.
+
+# sh_syscalls.d -c ./func_abc.sh -o /tmp/out
+Function A
+Function B
+Function C
+
+# cat /tmp/out
+Tracing... Hit Ctrl-C to end.
+
+Calls for PID 12966,
+
+ FILE TYPE NAME COUNT
+ func_abc.sh func func_a 1
+ func_abc.sh func func_b 1
+ func_abc.sh func func_c 1
+ func_abc.sh syscall getrlimit 1
+ func_abc.sh syscall mmap 1
+ func_abc.sh syscall munmap 1
+ func_abc.sh syscall rexit 1
+ func_abc.sh syscall schedctl 1
+ func_abc.sh syscall sigaltstack 1
+ func_abc.sh syscall stat64 1
+ func_abc.sh syscall sysi86 1
+ func_abc.sh syscall access 2
+ func_abc.sh syscall fcntl 2
+ func_abc.sh syscall getgid 2
+ func_abc.sh syscall getpid 2
+ func_abc.sh syscall setcontext 2
+ func_abc.sh syscall sysconfig 2
+ func_abc.sh builtin echo 3
+ func_abc.sh cmd sleep 3
+ func_abc.sh syscall fork1 3
+ func_abc.sh syscall getuid 3
+ func_abc.sh syscall lwp_sigmask 3
+ func_abc.sh syscall open64 3
+ func_abc.sh syscall read 3
+ func_abc.sh syscall write 3
+ func_abc.sh syscall close 5
+ func_abc.sh syscall setpgrp 5
+ func_abc.sh syscall waitsys 6
+ func_abc.sh syscall brk 9
+ func_abc.sh syscall ioctl 15
+ func_abc.sh syscall sigaction 53
+
+While tracing, three functions were called - func_a(), func_b() and
+func_c(). There were 3 instances of the shell built-in 'echo' being called,
+and 3 executions of the sleep command (which is probably /usr/bin/sleep - use
+the syscall provider to confirm). There were numerous system calls made,
+including 9 brk()'s, 15 ioctl()'s and 53 sigaction()'s.
+
+This script can provide an insight to how a script is interacting
+with the system, by providing function calls, commands, built-ins and system
+calls in the same output.
+
diff --git a/Examples/sh_syscolors_example.txt b/Examples/sh_syscolors_example.txt
new file mode 100644
index 000000000000..ccc722a825ba
--- /dev/null
+++ b/Examples/sh_syscolors_example.txt
@@ -0,0 +1,328 @@
+The following are examples of sh_syscolors.d.
+
+This is a simple script to trace the flow of Shell functions, lines, and
+system calls made. It renders the output in color ("colour") using terminal
+escape sequences (which you can tweak by modifying the script).
+
+Here it traces the example program, Code/Shell/func_abc.sh.
+
+WARNING: This output is full of terminal escape sequences, so if you are
+trying to view this through an editor or web browser - it may look awful.
+Try viewing this using "more" (although, depending on your terminal, it
+still may look awful).
+
+# sh_syscolors.d -c ./func_abc.sh -o /tmp/out
+Function A
+Function B
+Function C
+
+# cat /tmp/out
+C PID DELTA(us) FILE:LINE TYPE -- NAME
+0 12979 2 func_abc.sh:- syscall -> munmap
+0 12979 35 func_abc.sh:- syscall <- munmap
+0 12979 56 func_abc.sh:- syscall -> mmap
+0 12979 18 func_abc.sh:- syscall <- mmap
+0 12979 40 func_abc.sh:- syscall -> setcontext
+0 12979 11 func_abc.sh:- syscall <- setcontext
+0 12979 11 func_abc.sh:- syscall -> getrlimit
+0 12979 11 func_abc.sh:- syscall <- getrlimit
+0 12979 10 func_abc.sh:- syscall -> getpid
+0 12979 9 func_abc.sh:- syscall <- getpid
+0 12979 61 func_abc.sh:- syscall -> setcontext
+0 12979 9 func_abc.sh:- syscall <- setcontext
+0 12979 865 func_abc.sh:- syscall -> sysi86
+0 12979 14 func_abc.sh:- syscall <- sysi86
+0 12979 84 func_abc.sh:- syscall -> open64
+0 12979 89 func_abc.sh:- syscall <- open64
+0 12979 14 func_abc.sh:- syscall -> ioctl
+0 12979 35 func_abc.sh:- syscall <- ioctl
+0 12979 15 func_abc.sh:- syscall -> close
+0 12979 16 func_abc.sh:- syscall <- close
+0 12979 119 func_abc.sh:- syscall -> getpid
+0 12979 10 func_abc.sh:- syscall <- getpid
+0 12979 17 func_abc.sh:- syscall -> setpgrp
+0 12979 10 func_abc.sh:- syscall <- setpgrp
+0 12979 11 func_abc.sh:- syscall -> setpgrp
+0 12979 8 func_abc.sh:- syscall <- setpgrp
+0 12979 12 func_abc.sh:- syscall -> access
+0 12979 20 func_abc.sh:- syscall <- access
+0 12979 15 func_abc.sh:- syscall -> brk
+0 12979 11 func_abc.sh:- syscall <- brk
+0 12979 15 func_abc.sh:- syscall -> sysconfig
+0 12979 9 func_abc.sh:- syscall <- sysconfig
+0 12979 9 func_abc.sh:- syscall -> sysconfig
+0 12979 9 func_abc.sh:- syscall <- sysconfig
+0 12979 11 func_abc.sh:- syscall -> sigaltstack
+0 12979 9 func_abc.sh:- syscall <- sigaltstack
+0 12979 16 func_abc.sh:- syscall -> sigaction
+0 12979 10 func_abc.sh:- syscall <- sigaction
+0 12979 12 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 10 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 10 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 10 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 9 func_abc.sh:- syscall -> sigaction
+0 12979 8 func_abc.sh:- syscall <- sigaction
+0 12979 10 func_abc.sh:- syscall -> sigaction
+0 12979 9 func_abc.sh:- syscall <- sigaction
+0 12979 61 func_abc.sh:- syscall -> brk
+0 12979 9 func_abc.sh:- syscall <- brk
+0 12979 13 func_abc.sh:- syscall -> getuid
+0 12979 9 func_abc.sh:- syscall <- getuid
+0 12979 10 func_abc.sh:- syscall -> getuid
+0 12979 8 func_abc.sh:- syscall <- getuid
+0 12979 11 func_abc.sh:- syscall -> getgid
+0 12979 9 func_abc.sh:- syscall <- getgid
+0 12979 10 func_abc.sh:- syscall -> getgid
+0 12979 9 func_abc.sh:- syscall <- getgid
+0 12979 15 func_abc.sh:- syscall -> open64
+0 12979 19 func_abc.sh:- syscall <- open64
+0 12979 11 func_abc.sh:- syscall -> close
+0 12979 9 func_abc.sh:- syscall <- close
+0 12979 24 func_abc.sh:- syscall -> fcntl
+0 12979 23 func_abc.sh:- syscall <- fcntl
+0 12979 10 func_abc.sh:- syscall -> close
+0 12979 10 func_abc.sh:- syscall <- close
+0 12979 9 func_abc.sh:- syscall -> fcntl
+0 12979 9 func_abc.sh:- syscall <- fcntl
+0 12979 28 func_abc.sh:- syscall -> ioctl
+0 12979 42 func_abc.sh:- syscall <- ioctl
+0 12979 10 func_abc.sh:- syscall -> ioctl
+0 12979 9 func_abc.sh:- syscall <- ioctl
+0 12979 14 func_abc.sh:- syscall -> read
+0 12979 33 func_abc.sh:- syscall <- read
+0 12979 11 func_abc.sh:- syscall -> brk
+0 12979 21 func_abc.sh:- syscall <- brk
+0 12979 12 func_abc.sh:- syscall -> brk
+0 12979 9 func_abc.sh:- syscall <- brk
+0 12979 19 func_abc.sh:- syscall -> brk
+0 12979 9 func_abc.sh:- syscall <- brk
+0 12979 11 func_abc.sh:- syscall -> brk
+0 12979 9 func_abc.sh:- syscall <- brk
+0 12979 11 func_abc.sh:- syscall -> read
+0 12979 15 func_abc.sh:- syscall <- read
+0 12979 28 func_abc.sh:- syscall -> brk
+0 12979 9 func_abc.sh:- syscall <- brk
+0 12979 10 func_abc.sh:- syscall -> brk
+0 12979 8 func_abc.sh:- syscall <- brk
+0 12979 14 func_abc.sh:23 line -- 
+0 12979 32 func_abc.sh:23 func -> func_a
+0 12979 16 func_abc.sh:18 line -- 
+0 12979 18 func_abc.sh:18 builtin -> echo
+0 12979 21 func_abc.sh:- syscall -> write
+0 12979 33 func_abc.sh:- syscall <- write
+0 12979 311 func_abc.sh:0 builtin <- echo
+0 12979 65 func_abc.sh:19 line -- 
+0 12979 17 func_abc.sh:- syscall -> getuid
+0 12979 10 func_abc.sh:- syscall <- getuid
+0 12979 15 func_abc.sh:- syscall -> stat64
+0 12979 25 func_abc.sh:- syscall <- stat64
+0 12979 11 func_abc.sh:- syscall -> access
+0 12979 15 func_abc.sh:- syscall <- access
+0 12979 18 func_abc.sh:- syscall -> schedctl
+0 12979 46 func_abc.sh:- syscall <- schedctl
+0 12979 220 func_abc.sh:- syscall -> fork1
+0 12979 258957 func_abc.sh:- syscall <- fork1
+0 12979 244 func_abc.sh:- syscall -> lwp_sigmask
+0 12979 16 func_abc.sh:- syscall <- lwp_sigmask
+0 12979 31 func_abc.sh:19 cmd -> sleep
+0 12979 53 func_abc.sh:- syscall -> waitsys
+0 12979 1008036 func_abc.sh:- syscall <- waitsys
+0 12979 38 func_abc.sh:- syscall -> ioctl
+0 12979 18 func_abc.sh:- syscall <- ioctl
+0 12979 12 func_abc.sh:- syscall -> setpgrp
+0 12979 10 func_abc.sh:- syscall <- setpgrp
+0 12979 9 func_abc.sh:- syscall -> ioctl
+0 12979 9 func_abc.sh:- syscall <- ioctl
+0 12979 11 func_abc.sh:- syscall -> ioctl
+0 12979 37 func_abc.sh:- syscall <- ioctl
+0 12979 12 func_abc.sh:- syscall -> waitsys
+0 12979 26 func_abc.sh:- syscall <- waitsys
+0 12979 14 func_abc.sh:0 cmd <- sleep
+0 12979 21 func_abc.sh:20 line -- 
+0 12979 28 func_abc.sh:20 func -> func_b
+0 12979 15 func_abc.sh:11 line -- 
+0 12979 17 func_abc.sh:11 builtin -> echo
+0 12979 19 func_abc.sh:- syscall -> write
+0 12979 33 func_abc.sh:- syscall <- write
+0 12979 310 func_abc.sh:0 builtin <- echo
+0 12979 16 func_abc.sh:12 line -- 
+0 12979 226 func_abc.sh:- syscall -> fork1
+0 12979 64931 func_abc.sh:- syscall <- fork1
+0 12979 262 func_abc.sh:- syscall -> lwp_sigmask
+0 12979 16 func_abc.sh:- syscall <- lwp_sigmask
+0 12979 31 func_abc.sh:12 cmd -> sleep
+0 12979 31 func_abc.sh:- syscall -> waitsys
+0 12979 1003941 func_abc.sh:- syscall <- waitsys
+0 12979 30 func_abc.sh:- syscall -> ioctl
+0 12979 19 func_abc.sh:- syscall <- ioctl
+0 12979 11 func_abc.sh:- syscall -> setpgrp
+0 12979 9 func_abc.sh:- syscall <- setpgrp
+0 12979 9 func_abc.sh:- syscall -> ioctl
+0 12979 9 func_abc.sh:- syscall <- ioctl
+0 12979 9 func_abc.sh:- syscall -> ioctl
+0 12979 38 func_abc.sh:- syscall <- ioctl
+0 12979 11 func_abc.sh:- syscall -> waitsys
+0 12979 26 func_abc.sh:- syscall <- waitsys
+0 12979 14 func_abc.sh:0 cmd <- sleep
+0 12979 33 func_abc.sh:13 line -- 
+0 12979 27 func_abc.sh:13 func -> func_c
+0 12979 15 func_abc.sh:5 line -- 
+0 12979 17 func_abc.sh:5 builtin -> echo
+0 12979 20 func_abc.sh:- syscall -> write
+0 12979 33 func_abc.sh:- syscall <- write
+0 12979 309 func_abc.sh:0 builtin <- echo
+0 12979 17 func_abc.sh:6 line -- 
+0 12979 267 func_abc.sh:- syscall -> fork1
+0 12979 64649 func_abc.sh:- syscall <- fork1
+0 12979 257 func_abc.sh:- syscall -> lwp_sigmask
+0 12979 16 func_abc.sh:- syscall <- lwp_sigmask
+0 12979 31 func_abc.sh:6 cmd -> sleep
+0 12979 31 func_abc.sh:- syscall -> waitsys
+0 12979 1004183 func_abc.sh:- syscall <- waitsys
+0 12979 31 func_abc.sh:- syscall -> ioctl
+0 12979 18 func_abc.sh:- syscall <- ioctl
+0 12979 11 func_abc.sh:- syscall -> setpgrp
+0 12979 9 func_abc.sh:- syscall <- setpgrp
+0 12979 9 func_abc.sh:- syscall -> ioctl
+0 12979 9 func_abc.sh:- syscall <- ioctl
+0 12979 9 func_abc.sh:- syscall -> ioctl
+0 12979 38 func_abc.sh:- syscall <- ioctl
+0 12979 12 func_abc.sh:- syscall -> waitsys
+0 12979 27 func_abc.sh:- syscall <- waitsys
+0 12979 14 func_abc.sh:0 cmd <- sleep
+0 12979 32 func_abc.sh:- func <- func_c
+0 12979 16 func_abc.sh:- func <- func_b
+0 12979 10 func_abc.sh:- func <- func_a
+0 12979 13 func_abc.sh:- syscall -> brk
+0 12979 12 func_abc.sh:- syscall <- brk
+0 12979 12 func_abc.sh:- syscall -> read
+0 12979 16 func_abc.sh:- syscall <- read
+0 12979 10 func_abc.sh:- syscall -> ioctl
+0 12979 9 func_abc.sh:- syscall <- ioctl
+0 12979 10 func_abc.sh:- syscall -> ioctl
+0 12979 9 func_abc.sh:- syscall <- ioctl
+0 12979 11 func_abc.sh:- syscall -> close
+0 12979 13 func_abc.sh:- syscall <- close
+0 12979 37 func_abc.sh:- syscall -> open64
+0 12979 105 func_abc.sh:- syscall <- open64
+0 12979 11 func_abc.sh:- syscall -> ioctl
+0 12979 11 func_abc.sh:- syscall <- ioctl
+0 12979 11 func_abc.sh:- syscall -> close
+0 12979 15 func_abc.sh:- syscall <- close
+0 12979 31 func_abc.sh:- syscall -> rexit
+
+Here you can see the output showing the path the script follows as it is
+executed.
+
+ie:
+0 12979 14 func_abc.sh:23 line -- 
+0 12979 32 func_abc.sh:23 func -> func_a
+0 12979 16 func_abc.sh:18 line -- 
+0 12979 18 func_abc.sh:18 builtin -> echo
+0 12979 21 func_abc.sh:- syscall -> write
+0 12979 33 func_abc.sh:- syscall <- write
+0 12979 311 func_abc.sh:0 builtin <- echo
+0 12979 65 func_abc.sh:19 line -- 
+
+shows that on CPU 0 we run func_a (which is line 23 of the example script),
+where it uses the shell built-in echo command (on line 18 of the example
+script) to write a line of text to the screen. You can see in column 3 (the
+delta time) it takes 311 microseconds from when the write syscall finishes to
+when the echo built-in completes its clean-up and finishes.
+
diff --git a/Examples/sh_wasted_example.txt b/Examples/sh_wasted_example.txt
new file mode 100644
index 000000000000..b11f9523db39
--- /dev/null
+++ b/Examples/sh_wasted_example.txt
@@ -0,0 +1,45 @@
+Many shell programmers are in the habit of using calls to external commands
+instead of using shell built-in commands (an example of this is a call to
+usr/bin/echo instead of using the echo command built into the shell.
+
+This script shows sh_wasted.d tracing a shell script that calls /usr/bin/echo
+instead of using the built-in.
+
+# sh_wasted.d -c ./func_waste.sh
+Tracing... Hit Ctrl-C to end.
+Function A
+Function B
+Function C
+Script duration: 3101631 us
+
+External command elapsed times,
+ FILE NAME TIME(us)
+ func_waste.sh sleep 3019573
+
+Wasted command elapsed times,
+ FILE NAME TIME(us)
+ func_waste.sh /usr/bin/echo 26510
+
+You can see that the calls to /usr/bin/echo took around 26 thousand
+microseconds; time wasted by the shell having to access an external command.
+
+
+Here we trace the same script, except it uses the shell built-in echo command.
+
+# sh_wasted.d -c ./func_abc.sh
+Function A
+Tracing... Hit Ctrl-C to end.
+Function B
+Function C
+Script duration: 3032616 us
+
+External command elapsed times,
+ FILE NAME TIME(us)
+ func_abc.sh sleep 3012920
+
+Wasted command elapsed times,
+ FILE NAME TIME(us)
+
+The total time here is less and there are no 'wasted' calls to external
+commands.
+
diff --git a/Examples/sh_who_example.txt b/Examples/sh_who_example.txt
new file mode 100644
index 000000000000..b35e8e4531d9
--- /dev/null
+++ b/Examples/sh_who_example.txt
@@ -0,0 +1,45 @@
+These are examples of the results after running the sh_who.d script.
+
+This script shows which UIDs and PIDs are running shell scripts, and how
+active they are. It measures the number of lines executed according to
+the line probe - which is a useful, but rough measure of shell activity.
+
+Here it runs as a script executes three times.
+
+# sh_who.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID UID LINES FILE
+ 13663 0 9 ./func_abc.sh
+ 13667 0 9 ./func_abc.sh
+ 13671 0 9 ./func_abc.sh
+
+We see func_abc.sh ran three seperate times, each with nine lines of shell
+activity.
+
+
+Here we trace an instance of starting Mozilla Firefox.
+
+# sh_who.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID UID LINES FILE
+ 13678 100 1 firefox
+ 13679 100 1 firefox
+ 13680 100 1 firefox
+ 13681 100 1 firefox
+ 13683 100 1 firefox
+ 13685 100 1 firefox
+ 13686 100 1 firefox
+ 13687 100 1 firefox
+ 13690 100 1 firefox
+ 13693 100 1 /usr/lib/firefox/run-mozilla.sh
+ 13694 100 1 /usr/lib/firefox/run-mozilla.sh
+ 13695 100 1 /usr/lib/firefox/run-mozilla.sh
+ 13692 100 55 /usr/lib/firefox/run-mozilla.sh
+ 13677 100 75 firefox
+
+Firefox itself (PID 13677) ran 75 lines of code. There are also instances of
+firefox running a single line of code with a different PID each time. These
+are probably calls to subshells. Use the sh provider to confirm.
+
diff --git a/Examples/shellsnoop_example.txt b/Examples/shellsnoop_example.txt
new file mode 100644
index 000000000000..be307f80f63e
--- /dev/null
+++ b/Examples/shellsnoop_example.txt
@@ -0,0 +1,112 @@
+shellsnoop captures the text input and output from shells running on the
+system. In the following example shellsnoop was run in one window, while
+in another several commands were run: date, cal, uname -a, uptime and find.
+shellsnoop has successfully captured the text that was displayed on the
+other window.
+
+
+# shellsnoop
+ PID PPID CMD DIR TEXT
+ 4724 3762 ksh R
+ 4724 3762 ksh W date
+
+ 4741 4724 date W Sun Mar 28 23:10:06 EST 2004
+ 4724 3762 ksh R
+ 4724 3762 ksh W jupiter:/etc/init.d>
+ 4724 3762 ksh R
+ 4724 3762 ksh R
+ 4724 3762 ksh W cal
+
+ 4742 4724 cal W March 2004
+ 4742 4724 cal W S M Tu W Th F S
+ 4742 4724 cal W 1 2 3 4 5 6
+ 4742 4724 cal W 7 8 9 10 11 12 13
+ 4742 4724 cal W 14 15 16 17 18 19 20
+ 4742 4724 cal W 21 22 23 24 25 26 27
+ 4742 4724 cal W 28 29 30 31
+ 4742 4724 cal W
+ 4724 3762 ksh R
+ 4724 3762 ksh W jupiter:/etc/init.d>
+ 4724 3762 ksh R
+ 4724 3762 ksh R
+ 4724 3762 ksh W uname -a
+
+ 4743 4724 uname W SunOS jupiter 5.10 s10_51 i86pc i386 i86pc
+ 4724 3762 ksh R
+ 4724 3762 ksh W jupiter:/etc/init.d>
+ 4724 3762 ksh R
+ 4724 3762 ksh R
+ 4724 3762 ksh W uptime
+
+ 4744 4724 uptime W 11:10pm up 4 day(s), 11:15, 4 users, load average: 0.05, 0.02, 0.02
+ 4724 3762 ksh R
+ 4724 3762 ksh W jupiter:/etc/init.d>
+ 4724 3762 ksh R
+ 4724 3762 ksh R
+ 4724 3762 ksh R
+ 4724 3762 ksh W jupiter:/etc/init.d>
+ 4724 3762 ksh R
+ 4724 3762 ksh R
+ 4724 3762 ksh W ls -l d*
+
+ 4745 4724 ls W -rwxr--r-- 3 root sys 1292 Jan 14 16:24 devfsadm
+ 4745 4724 ls W -rwxr--r-- 1 root sys 904 Jan 14 16:24 devlinks
+ 4745 4724 ls W -rwxr--r-- 6 root sys 621 Jan 14 16:17 dhcp
+ 4745 4724 ls W -rwxr--r-- 2 root sys 494 Jan 14 16:17 dhcpagent
+ 4745 4724 ls W -rwxr--r-- 5 root sys 1050 Jan 16 2002 directory
+ 4745 4724 ls W -rwxr--r-- 2 root sys 779 Jan 14 16:17 domainname
+ 4745 4724 ls W -rwxr--r-- 1 root sys 469 Jan 14 16:24 drvconfig
+ 4745 4724 ls W -r-xr-xr-x 4 root other 2804 Mar 27 13:37 dtlogin
+ 4724 3762 ksh R
+ 4724 3762 ksh W jupiter:/etc/init.d>
+ 4724 3762 ksh R
+ 4724 3762 ksh R
+ 4724 3762 ksh W find /etc/default
+
+ 4746 4724 find W /etc/default
+ 4746 4724 find W /etc/default/cron
+ 4746 4724 find W /etc/default/devfsadm
+ 4746 4724 find W /etc/default/dhcpagent
+ 4746 4724 find W /etc/default/fs
+ 4746 4724 find W /etc/default/inetd
+ 4746 4724 find W /etc/default/inetinit
+ 4746 4724 find W /etc/default/kbd
+ 4746 4724 find W /etc/default/keyserv
+ 4746 4724 find W /etc/default/ipsec
+ 4746 4724 find W /etc/default/nss
+ 4746 4724 find W /etc/default/passwd
+ 4746 4724 find W /etc/default/syslogd
+ 4746 4724 find W /etc/default/tar
+ 4746 4724 find W /etc/default/utmpd
+ 4746 4724 find W /etc/default/init
+ 4746 4724 find W /etc/default/login
+ 4746 4724 find W /etc/default/su
+ 4746 4724 find W /etc/default/power
+ 4746 4724 find W /etc/default/sys-suspend
+ 4746 4724 find W /etc/default/rpc.nisd
+ 4746 4724 find W /etc/default/nfs
+[...]
+
+
+
+shellsnoop has a "-q" option for running in "quiet" mode - the previous
+columns are not printed, so only shell output is seen,
+
+ # shellsnoop -q
+ # date
+ Wed Nov 30 16:19:48 EST 2005
+ #
+ # cal
+ November 2005
+ S M Tu W Th F S
+ 1 2 3 4 5
+ 6 7 8 9 10 11 12
+ 13 14 15 16 17 18 19
+ 20 21 22 23 24 25 26
+ 27 28 29 30
+
+ #
+
+The output appears somewhat boring, this is something you need to see
+in realtime.
+
diff --git a/Examples/shortlived_example.txt b/Examples/shortlived_example.txt
new file mode 100644
index 000000000000..ebe46925095a
--- /dev/null
+++ b/Examples/shortlived_example.txt
@@ -0,0 +1,57 @@
+The following is an example of the shortlived.d program.
+It can measure time spent processing short lived processes,
+that may be responsible for heavy load on the system but
+are usually difficult to see with sampling tools like prstat.
+
+
+
+Here we run in for a few seconds on a server,
+
+ # shortlived.d
+ Tracing... Hit Ctrl-C to stop.
+ ^C
+ short lived processes: 0.456 secs
+ total sample duration: 9.352 secs
+
+ Total time by process name,
+ date 12 ms
+ df 20 ms
+ ls 40 ms
+ perl 380 ms
+
+ Total time by PPID,
+ 3279 452 ms
+
+In the above output, around 5% of the CPU was lost to short
+lived processes - mostly perl. This may be many perl processes,
+here we are aggregating on the process name not the instance.
+
+
+
+Now shortlived.d is run on a server with a performance problem,
+
+ # uptime
+ 10:58pm up 5 day(s), 1:28, 1 user, load average: 2.20, 1.81, 1.04
+ #
+ # shortlived.d
+ Tracing... Hit Ctrl-C to stop.
+ ^C
+ short lived processes: 4.546 secs
+ total sample duration: 9.858 secs
+
+ Total time by process name,
+ expr 4122 ms
+
+ Total time by PPID,
+ 3279 4122 ms
+ #
+ # ps -p 3279
+ PID TTY TIME CMD
+ 3279 pts/10 0:45 report.sh
+
+shortlived.d showed that 50% of the CPU was consumed by short lived
+processes, all of them the "expr" command, and all having the
+parent proccess-ID 3279. We finished by checking PID 3279 to find
+it is a Bourne shell script called "report.sh".
+
+
diff --git a/Examples/sigdist_example.txt b/Examples/sigdist_example.txt
new file mode 100644
index 000000000000..88b9df461f32
--- /dev/null
+++ b/Examples/sigdist_example.txt
@@ -0,0 +1,18 @@
+The following is a demonstration of the sigdist.d script.
+
+
+Here we run sigdist.d, and in another window we kill -9 a sleep process,
+
+ # ./sigdist.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ SENDER RECIPIENT SIG COUNT
+ sched dtrace 2 1
+ sched bash 18 1
+ bash sleep 9 1
+ sched Xorg 14 55
+
+We can see the signal sent from bash to sleep. We can also see that Xorg
+has recieved 55 signal 14s. a "man -s3head signal" may help explain what
+signal 14 is (alarm clock).
+
diff --git a/Examples/stacksize_example.txt b/Examples/stacksize_example.txt
new file mode 100644
index 000000000000..156f351d8684
--- /dev/null
+++ b/Examples/stacksize_example.txt
@@ -0,0 +1,87 @@
+The following is a domonstration of the stacksize.d script.
+
+
+Here it is run for a few seconds then Ctrl-C is hit. The output prints
+distrubition plots of the size of the user stack as the value, and the
+number of times sampled at that size as the count.
+
+ # ./stacksize.d
+ Sampling... Hit Ctrl-C to end
+
+
+ automountd
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ nscd
+ value ------------- Distribution ------------- count
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 256 | 0
+
+ svc.startd
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 512 | 0
+
+ sshd
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 4096 | 0
+
+ dtrace
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
+ 2048 | 0
+
+ nautilus
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4096 | 0
+
+ Xvnc
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 4096 | 0
+
+ gnome-vfs-daemon
+ value ------------- Distribution ------------- count
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 8192 | 0
+
+ Xorg
+ value ------------- Distribution ------------- count
+ 2048 | 0
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
+ 8192 | 0
+
+ gnome-terminal
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@ 7
+ 4096 |@@@@@@@@@@@@@@@@@@@@@@@@ 11
+ 8192 | 0
+
+ acroread
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 92
+ 4096 | 0
+
+ perl
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1945
+ 2048 | 0
+
+
+ Errors:
+
diff --git a/Examples/statsnoop_example.txt b/Examples/statsnoop_example.txt
new file mode 100644
index 000000000000..842017ea4331
--- /dev/null
+++ b/Examples/statsnoop_example.txt
@@ -0,0 +1,94 @@
+The following is an example of the statsnoop tool.
+
+
+statsnoop is a companion to opensnoop, which traces a variety of stat()
+calls rather than open() calls.
+
+Here I run statsnoop on my idle laptop for about 3 seconds,
+
+ # statsnoop
+ UID PID COMM FD PATH
+ 0 1485 dtrace 0 /devices/pseudo/pts@0:6
+ 100 791 dtwm -1 /usr/mail/brendan
+ 100 791 dtwm -1 /usr/mail/brendan
+ 100 791 dtwm -1 /usr/mail/brendan
+ 100 791 dtwm -1 /usr/mail/brendan
+ 100 795 sdtperfmeter 0 /devices/pseudo/mm@0:null
+ 0 803 rpc.rstatd 0 /devices/pseudo/udp@0:udp
+ 0 803 rpc.rstatd 0 /devices/pseudo/udp@0:udp
+ 100 795 sdtperfmeter 0 /devices/pseudo/mm@0:null
+ 100 791 dtwm 0 /export/home/brendan/.dt/Trash/.trashinfo
+ 100 791 dtwm 0 /export/home/brendan/.dt/Trash/.trashinfo
+ 100 791 dtwm 0 /devices/pseudo/mm@0:null
+ 100 783 ttsession 0 /devices/pseudo/pts@0:3
+ 100 783 ttsession 0 /devices/pseudo/pts@0:3
+ 100 783 ttsession 0 /devices/pseudo/pts@0:3
+ 100 791 dtwm 0 /devices/pseudo/mm@0:null
+ 100 783 ttsession 0 /devices/pseudo/pts@0:3
+ 100 783 ttsession 0 /devices/pseudo/pts@0:3
+ 100 791 dtwm 0 /devices/pseudo/mm@0:null
+ 100 791 dtwm 0 /devices/pseudo/mm@0:null
+ 100 792 dtfile 0 /devices/pseudo/mm@0:null
+ 100 783 ttsession 0 /devices/pseudo/pts@0:3
+ ^C
+
+It is interesting what turns up. In the above output, a "dtwm" process
+with process ID 791 called stat on /usr/mail/brendan and received -1 as
+a return value - as this file does not exist. (when were mailboxes ever
+stored in /usr/mail??).
+
+
+statsnoop has a variety of options, as opensnoop does. Here I trace stat()s
+from processes called "bash", while a new bash shell is executed,
+
+ # statsnoop -n bash
+ UID PID COMM FD PATH
+ 100 1493 bash 0 /usr/bin/bash
+ 100 1493 bash 0 /devices/pseudo/pts@0:8
+ 100 1493 bash 0 /lib/libcurses.so.1
+ 100 1493 bash 0 /lib/libsocket.so.1
+ 100 1493 bash 0 /lib/libnsl.so.1
+ 100 1493 bash 0 /lib/libdl.so.1
+ 100 1493 bash 0 /lib/libc.so.1
+ 100 1493 bash 0 /devices/pseudo/pts@0:8
+ 100 1493 bash 0 /devices/pseudo/pts@0:8
+ 100 1493 bash 0 /export/home/brendan
+ 100 1493 bash 0 .
+ 100 1493 bash 0 /export/home/brendan/.bashrc
+ 100 1493 bash -1 /usr/mail/brendan
+ 100 1493 bash 0 /export/home/brendan/.bash_history
+ 100 1493 bash 0 /export/home/brendan/.bash_history
+ 100 1493 bash 0 /export/home/brendan/.bash_history
+ 100 1493 bash -1 /export/home/brendan/.inputrc
+ 100 1493 bash 0 .
+ ^C
+
+bash also checked /usr/mail/brendan? hmm...
+
+ $ echo $MAIL
+ /usr/mail/brendan
+
+hmmmmm...
+
+ $ cat .profile
+ # This is the default standard profile provided to a user.
+ # They are expected to edit it to meet their own needs.
+
+ MAIL=/usr/mail/${LOGNAME:?}
+
+huh?
+
+ $ cat /etc/skel/.profile
+ # This is the default standard profile provided to a user.
+ # They are expected to edit it to meet their own needs.
+
+ MAIL=/usr/mail/${LOGNAME:?}
+
+ $ cat /var/sadm/pkg/SUNWcsr/save/pspool/SUNWcsr/reloc/etc/skel/.profile
+ # This is the default standard profile provided to a user.
+ # They are expected to edit it to meet their own needs.
+
+ MAIL=/usr/mail/${LOGNAME:?}
+
+oh.
+
diff --git a/Examples/swapinfo_example.txt b/Examples/swapinfo_example.txt
new file mode 100644
index 000000000000..e8697660f9c7
--- /dev/null
+++ b/Examples/swapinfo_example.txt
@@ -0,0 +1,22 @@
+The following is a demonstration of the swapinfo.d script,
+
+ # ./swapinfo.d
+ RAM _______Total 511 MB
+ RAM Unusable 8 MB
+ RAM Kernel 128 MB
+ RAM Locked 0 MB
+ RAM Used 256 MB
+ RAM Free 118 MB
+
+ Disk _______Total 1023 MB
+ Disk Resv 626 MB
+ Disk Avail 397 MB
+
+ Swap _______Total 1335 MB
+ Swap Resv 626 MB
+ Swap Avail 709 MB
+ Swap (Minfree) 62 MB
+
+The output above gives a summary of the state of virtual memory (swap)
+on the system.
+
diff --git a/Examples/sysbypid_example.txt b/Examples/sysbypid_example.txt
new file mode 100644
index 000000000000..2858c5147c66
--- /dev/null
+++ b/Examples/sysbypid_example.txt
@@ -0,0 +1,45 @@
+The following is a demonstration of the sysbypid.d command,
+
+ # sysbypid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ EXEC PID SYS VALUE
+ xterm 24030 rawch 1
+ sched 0 rcvint 1
+ fsflush 3 pswitch 1
+ dtrace 19235 inv_swtch 1
+ xterm 24030 syswrite 2
+ Xorg 3597 syswrite 2
+ xterm 24030 inv_swtch 2
+ dtrace 19235 pswitch 2
+ dtrace 19235 syswrite 2
+ soffice.bin 4019 pswitch 3
+ xterm 24030 pswitch 3
+ mozilla-bin 3730 inv_swtch 4
+ xterm 24030 sysread 4
+ mozilla-bin 3730 readch 9
+ mozilla-bin 3730 sysread 9
+ Xorg 3597 pswitch 10
+ Xorg 3597 sysread 11
+ mozilla-bin 3730 syswrite 13
+ java_vm 28209 pswitch 13
+ sched 0 pswitch 15
+ mozilla-bin 3730 pswitch 25
+ setiathome 3929 trap 26
+ setiathome 3929 pswitch 26
+ setiathome 3929 inv_swtch 26
+ dtrace 19235 writech 32
+ dtrace 19235 outch 34
+ dtrace 19235 trap 53
+ Xorg 3597 writech 64
+ xterm 24030 readch 96
+ xterm 24030 writech 133
+ mozilla-bin 3730 writech 905
+ Xorg 3597 readch 1044
+
+In the above output, the Xorg command with PID 3597 read 1044 bytes, as
+indicated by readch.
+
+mozilla-bin with PID 3730 wrote 905 bytes, as indicated by the writech.
+
+
diff --git a/Examples/syscallbypid_example.txt b/Examples/syscallbypid_example.txt
new file mode 100644
index 000000000000..e51bb14cf0fa
--- /dev/null
+++ b/Examples/syscallbypid_example.txt
@@ -0,0 +1,50 @@
+The following is a demonstration of the syscallbypid.d script,
+
+
+Here we run syscallbypid.d for a few seconds then hit Ctrl-C,
+
+ # syscallbypid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD SYSCALL COUNT
+ 11039 dtrace setcontext 1
+ 11039 dtrace lwp_sigmask 1
+ 7 svc.startd portfs 1
+ 357 poold lwp_cond_wait 1
+ 27328 java_vm lwp_cond_wait 1
+ 1532 Xorg writev 1
+ 11039 dtrace lwp_park 1
+ 11039 dtrace schedctl 1
+ 11039 dtrace mmap 1
+ 361 sendmail pollsys 1
+ 11039 dtrace fstat64 1
+ 11039 dtrace sigaction 2
+ 11039 dtrace write 2
+ 361 sendmail lwp_sigmask 2
+ 1659 mozilla-bin yield 2
+ 11039 dtrace sysconfig 3
+ 361 sendmail pset 3
+ 20317 sshd read 4
+ 361 sendmail gtime 4
+ 20317 sshd write 4
+ 27328 java_vm ioctl 6
+ 11039 dtrace brk 8
+ 1532 Xorg setcontext 8
+ 1532 Xorg lwp_sigmask 8
+ 20317 sshd pollsys 8
+ 357 poold pollsys 13
+ 1659 mozilla-bin read 16
+ 20317 sshd lwp_sigmask 16
+ 1532 Xorg setitimer 17
+ 27328 java_vm pollsys 18
+ 1532 Xorg pollsys 19
+ 11039 dtrace p_online 21
+ 1532 Xorg read 22
+ 1659 mozilla-bin write 25
+ 1659 mozilla-bin lwp_park 26
+ 11039 dtrace ioctl 36
+ 1659 mozilla-bin pollsys 155
+ 1659 mozilla-bin ioctl 306
+
+In the above output, we can see that "mozilla-bin" with PID 1659 made the
+most system calls - 306 ioctl()s.
diff --git a/Examples/syscallbyproc_example.txt b/Examples/syscallbyproc_example.txt
new file mode 100644
index 000000000000..7469b79cc88b
--- /dev/null
+++ b/Examples/syscallbyproc_example.txt
@@ -0,0 +1,17 @@
+The following is an example of the syscallbyproc.d script,
+
+ # syscallbyproc.d
+ dtrace: description 'syscall:::entry ' matched 228 probes
+ ^C
+ snmpd 1
+ utmpd 2
+ inetd 2
+ nscd 7
+ svc.startd 11
+ sendmail 31
+ poold 133
+ dtrace 1720
+
+The above output shows that dtrace made the most system calls in this sample,
+1720 syscalls.
+
diff --git a/Examples/syscallbysysc_example.txt b/Examples/syscallbysysc_example.txt
new file mode 100644
index 000000000000..d131a176c10a
--- /dev/null
+++ b/Examples/syscallbysysc_example.txt
@@ -0,0 +1,24 @@
+The following is a demonstration of the syscallbysysc.d script,
+
+ # syscallbysysc.d
+ dtrace: description 'syscall:::entry ' matched 228 probes
+ ^C
+ fstat 1
+ setcontext 1
+ lwp_park 1
+ schedctl 1
+ mmap 1
+ sigaction 2
+ pset 2
+ lwp_sigmask 2
+ gtime 3
+ sysconfig 3
+ write 4
+ brk 6
+ pollsys 7
+ p_online 558
+ ioctl 579
+
+In the above output, the ioctl system call was the most common, occuring
+579 times.
+
diff --git a/Examples/tcl_calldist_example.txt b/Examples/tcl_calldist_example.txt
new file mode 100644
index 000000000000..3388963411e5
--- /dev/null
+++ b/Examples/tcl_calldist_example.txt
@@ -0,0 +1,166 @@
+The following are examples of tcl_calldist.d.
+
+This script traces the elapsed time of Tcl procedures and commands and
+prints a report containing distribution plots per function. Here it traces the
+example program, Code/Tcl/func_abc.tcl
+
+# tcl_calldist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Top 10 exclusive elapsed times (us),
+ PID=16033, cmd, namespace
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@ 1
+ 4 |@@@@@@@@@@@@@ 1
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 |@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ PID=16033, cmd, puts
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+ 128 |@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ PID=16033, cmd, tclInit
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ PID=16033, proc, func_a
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ PID=16033, proc, func_b
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ PID=16033, proc, func_c
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ PID=16033, cmd, file
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@ 4
+ 8 |@@@@@@@ 2
+ 16 |@@@@@@@ 2
+ 32 |@@@ 1
+ 64 |@@@@@@@@@@ 3
+ 128 | 0
+
+ PID=16033, cmd, source
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ PID=16033, cmd, if
+ value ------------- Distribution ------------- count
+ 8 | 0
+ 16 |@@@@@@@@@@@@@@@@@@@@ 4
+ 32 |@@@@@@@@@@@@@@@ 3
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 |@@@@@ 1
+ 1024 | 0
+
+ PID=16033, cmd, after
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 1048576 | 0
+
+
+Top 10 inclusive elapsed times (us),
+ PID=16033, cmd, uplevel
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ PID=16033, cmd, tclInit
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ PID=16033, proc, tclInit
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ PID=16033, cmd, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ PID=16033, proc, func_c
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ PID=16033, cmd, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ PID=16033, proc, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ PID=16033, cmd, after
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3
+ 1048576 | 0
+
+ PID=16033, cmd, func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+ PID=16033, proc, func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+The exclusive function elapsed times show that each func_a took between 256
+and 511 microseconds. This time excludes the time spent in any other functions.
+
+The inclusive elapsed times section shows that each func_a spent
+took between 2.1 and 4.2 seconds. This time also includes the time spent in
+any other commands or procedures called by func_a.
+
+These elapsed times are the absolute time from when the function began to
+when it completed - which includes off-CPU time due to other system events
+such as I/O, scheduling, interrupts, etc.
+
+Elapsed times are useful for identifying where latencies are.
+See Notes/ALLelapsed_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive function time.
+
diff --git a/Examples/tcl_calls_example.txt b/Examples/tcl_calls_example.txt
new file mode 100644
index 000000000000..5ffada4957a0
--- /dev/null
+++ b/Examples/tcl_calls_example.txt
@@ -0,0 +1,41 @@
+The following are examples of the results of running the tcl_calls.d script.
+
+In this example we see it running while the Code/Tcl/func_abc.tcl script is run.
+
+# tcl_calls.d Tracing... Hit Ctrl-C to end.
+^C
+ PID TYPE NAME COUNT
+ 16021 cmd concat 1
+ 16021 cmd exit 1
+ 16021 cmd func_a 1
+ 16021 cmd func_b 1
+ 16021 cmd func_c 1
+ 16021 cmd list 1
+ 16021 cmd rename 1
+ 16021 cmd source 1
+ 16021 cmd tclInit 1
+ 16021 cmd unset 1
+ 16021 cmd uplevel 1
+ 16021 cmd variable 1
+ 16021 proc func_a 1
+ 16021 proc func_b 1
+ 16021 proc func_c 1
+ 16021 proc tclInit 1
+ 16021 cmd foreach 2
+ 16021 cmd global 2
+ 16021 cmd interp 2
+ 16021 cmd package 2
+ 16021 cmd set 2
+ 16021 cmd after 3
+ 16021 cmd namespace 3
+ 16021 cmd puts 3
+ 16021 cmd lappend 4
+ 16021 cmd lsearch 4
+ 16021 cmd if 8
+ 16021 cmd info 11
+ 16021 cmd file 12
+ 16021 cmd proc 12
+
+You can see that PID 16021 made quite a few different types of command and
+procedure calls during its execution.
+
diff --git a/Examples/tcl_calltime_example.txt b/Examples/tcl_calltime_example.txt
new file mode 100644
index 000000000000..56d100af93ef
--- /dev/null
+++ b/Examples/tcl_calltime_example.txt
@@ -0,0 +1,61 @@
+The following are examples of tcl_calltime.d.
+
+This script traces the total elapsed time of different Tcl commands and
+procedures and prints a report. Here it traces the example program,
+Code/Tcl/func_abc.tcl
+
+# tcl_calltime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Top 10 counts,
+ PID TYPE NAME COUNT
+ 16028 cmd after 3
+ 16028 cmd namespace 3
+ 16028 cmd puts 3
+ 16028 cmd lappend 4
+ 16028 cmd lsearch 4
+ 16028 cmd if 8
+ 16028 cmd info 11
+ 16028 cmd file 12
+ 16028 cmd proc 12
+ 0 total - 85
+
+Top 10 exclusive elapsed times (us),
+ PID TYPE NAME TOTAL
+ 16028 cmd tclInit 253
+ 16028 cmd namespace 272
+ 16028 proc func_c 330
+ 16028 proc func_b 357
+ 16028 proc func_a 363
+ 16028 cmd file 416
+ 16028 cmd if 852
+ 16028 cmd source 929
+ 16028 cmd after 3025152
+ 0 total - 3030001
+
+Top 10 inclusive elapsed times (us),
+ PID TYPE NAME TOTAL
+ 16028 cmd uplevel 1849
+ 16028 proc tclInit 2519
+ 16028 cmd tclInit 2772
+ 16028 proc func_c 1010031
+ 16028 cmd func_c 1010088
+ 16028 proc func_b 2020059
+ 16028 cmd func_b 2020106
+ 16028 cmd after 3025152
+ 16028 proc func_a 3026545
+ 16028 cmd func_a 3026572
+
+The output is in three sections. The first shows the top ten most executed
+commands while the script is tracing.
+
+The second (Top 10 exclusive elapsed times) shows us the top ten slowest
+commands or procedures, this number excludes any subroutines called during
+command execution.
+
+The third (Top 10 inclusive elapsed times) shows us the top ten slowest
+commands or procedures including any time spent in subroutines. You can see
+that func_a took the most amount of time all up. This makes sense if you
+compare the code at Code/Tcl/func_abc.tcl with the results.
+
diff --git a/Examples/tcl_cpudist_example.txt b/Examples/tcl_cpudist_example.txt
new file mode 100644
index 000000000000..09126f603abc
--- /dev/null
+++ b/Examples/tcl_cpudist_example.txt
@@ -0,0 +1,164 @@
+The following are examples of tcl_cpudist.d.
+
+This script traces the on-CPU time of Tcl commands and procedures and
+prints a report containing distribution plots per subroutine. Here it
+traces the example program, Code/Tcl/func_slow.tcl.
+
+# tcl_cpudist.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Top 10 exclusive on-CPU times (us),
+ PID=16043, cmd, info
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@ 1
+ 2 |@@@@@@@@@@@@@@@ 4
+ 4 |@@@@ 1
+ 8 |@@@@ 1
+ 16 |@@@@@@@@@@@ 3
+ 32 |@@@@ 1
+ 64 | 0
+
+ PID=16043, cmd, namespace
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@@@@@@@@@@@ 1
+ 2 |@@@@@@@@@@@@@ 1
+ 4 | 0
+ 8 | 0
+ 16 | 0
+ 32 | 0
+ 64 | 0
+ 128 |@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ PID=16043, cmd, puts
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2
+ 64 | 0
+ 128 |@@@@@@@@@@@@@ 1
+ 256 | 0
+
+ PID=16043, cmd, if
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 |@@@@@@@@@@ 2
+ 16 |@@@@@@@@@@@@@@@@@@@@ 4
+ 32 |@@@@@ 1
+ 64 | 0
+ 128 |@@@@@ 1
+ 256 | 0
+
+ PID=16043, cmd, tclInit
+ value ------------- Distribution ------------- count
+ 128 | 0
+ 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 512 | 0
+
+ PID=16043, cmd, file
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 4 |@@@@@@@@@@@@@ 4
+ 8 |@@@@@@@@@@@@@ 4
+ 16 | 0
+ 32 |@@@ 1
+ 64 |@@@@@@@@@@ 3
+ 128 | 0
+
+ PID=16043, cmd, source
+ value ------------- Distribution ------------- count
+ 256 | 0
+ 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1024 | 0
+
+ PID=16043, proc, func_a
+ value ------------- Distribution ------------- count
+ 262144 | 0
+ 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 1048576 | 0
+
+ PID=16043, proc, func_b
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ PID=16043, proc, func_c
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+
+Top 10 inclusive on-CPU times (us),
+ PID=16043, cmd, source
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ PID=16043, cmd, uplevel
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ PID=16043, proc, tclInit
+ value ------------- Distribution ------------- count
+ 512 | 0
+ 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2048 | 0
+
+ PID=16043, cmd, tclInit
+ value ------------- Distribution ------------- count
+ 1024 | 0
+ 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4096 | 0
+
+ PID=16043, cmd, func_c
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ PID=16043, proc, func_c
+ value ------------- Distribution ------------- count
+ 524288 | 0
+ 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 2097152 | 0
+
+ PID=16043, cmd, func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+ PID=16043, cmd, func_b
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+ PID=16043, proc, func_a
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+ PID=16043, proc, func_b
+ value ------------- Distribution ------------- count
+ 1048576 | 0
+ 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
+ 4194304 | 0
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the subroutine began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive subroutine time.
+
diff --git a/Examples/tcl_cputime_example.txt b/Examples/tcl_cputime_example.txt
new file mode 100644
index 000000000000..c736201e262d
--- /dev/null
+++ b/Examples/tcl_cputime_example.txt
@@ -0,0 +1,67 @@
+Following are examples of running tcl_cputime.d.
+
+Here it runs while we execute Code/Tcl/func_slow.tcl
+
+# tcl_cputime.d
+Tracing... Hit Ctrl-C to end.
+^C
+
+Top 10 counts,
+ PID TYPE NAME COUNT
+ 16038 cmd set 2
+ 16038 cmd namespace 3
+ 16038 cmd puts 3
+ 16038 cmd lappend 4
+ 16038 cmd lsearch 4
+ 16038 cmd if 8
+ 16038 cmd info 11
+ 16038 cmd file 12
+ 16038 cmd proc 12
+ 0 total - 82
+
+Top 10 exclusive on-CPU times (us),
+ PID TYPE NAME TOTAL
+ 16038 cmd namespace 130
+ 16038 cmd puts 232
+ 16038 cmd if 310
+ 16038 cmd tclInit 315
+ 16038 cmd file 411
+ 16038 cmd source 760
+ 16038 proc func_a 535521
+ 16038 proc func_b 1071082
+ 16038 proc func_c 1619323
+ 0 total - 3228670
+
+Top 10 inclusive on-CPU times (us),
+ PID TYPE NAME TOTAL
+ 16038 cmd source 1359
+ 16038 cmd uplevel 1367
+ 16038 proc tclInit 1865
+ 16038 cmd tclInit 2180
+ 16038 proc func_c 1619360
+ 16038 cmd func_c 1619404
+ 16038 proc func_b 2690525
+ 16038 cmd func_b 2690568
+ 16038 proc func_a 3226247
+ 16038 cmd func_a 3226275
+
+We can see that the output is in three sections. The first section represents
+the ten most commonly executed commands while the script is tracing.
+
+The exclusive function on-CPU times show that func_a spent around 0.5 seconds
+on-CPU, func_b spent about 1.0 seconds, and func_c, 1.6 seconds. This excludes
+time spent in other procedures or commands.
+
+The inclusive function on-CPU times show the time spent by these procedures in
+total, including the time spent in other functions called, and since func_a
+called func_b which called func_c, these times make sense.
+
+These on-CPU times are the time the thread spent running on a CPU, from when
+the function began to when it completed. This does not include time
+spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy.
+See Notes/ALLoncpu_notes.txt for more details. Also see
+Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a
+detailed explanation of exclusive vs inclusive function time.
+
diff --git a/Examples/tcl_flow_example.txt b/Examples/tcl_flow_example.txt
new file mode 100644
index 000000000000..dd2dcd60c772
--- /dev/null
+++ b/Examples/tcl_flow_example.txt
@@ -0,0 +1,195 @@
+The following are examples of running tcl_flow.d.
+
+Here the script is tracing the execution of Code/Tcl/func_abc.tcl
+
+# tcl_flow.d
+ C PID TIME(us) -- CALL
+ 0 16068 3904942506169 > if
+ 0 16068 3904942506261 > info
+ 0 16068 3904942506286 < info
+ 0 16068 3904942506350 > proc
+ 0 16068 3904942506363 < proc
+ 0 16068 3904942506369 < if
+ 0 16068 3904942506383 > tclInit
+ 0 16068 3904942506605 -> tclInit
+ 0 16068 3904942506614 > global
+ 0 16068 3904942506626 < global
+ 0 16068 3904942506632 > global
+ 0 16068 3904942506638 < global
+ 0 16068 3904942506643 > rename
+ 0 16068 3904942506666 < rename
+ 0 16068 3904942506675 > info
+ 0 16068 3904942506685 < info
+ 0 16068 3904942506694 > info
+ 0 16068 3904942506721 < info
+ 0 16068 3904942506728 > unset
+ 0 16068 3904942506741 < unset
+ 0 16068 3904942506746 > concat
+ 0 16068 3904942506760 < concat
+ 0 16068 3904942506774 > file
+ 0 16068 3904942506792 < file
+ 0 16068 3904942506797 > file
+ 0 16068 3904942506880 < file
+ 0 16068 3904942506885 > file
+ 0 16068 3904942506895 < file
+ 0 16068 3904942506901 > file
+ 0 16068 3904942507009 < file
+ 0 16068 3904942507015 > file
+ 0 16068 3904942507025 < file
+ 0 16068 3904942507031 > file
+ 0 16068 3904942507118 < file
+ 0 16068 3904942507124 > file
+ 0 16068 3904942507133 < file
+ 0 16068 3904942507139 > file
+ 0 16068 3904942507193 < file
+ 0 16068 3904942507200 > uplevel
+ 0 16068 3904942507209 > source
+ 0 16068 3904942507649 > if
+ 0 16068 3904942507664 > info
+ 0 16068 3904942507673 < info
+ 0 16068 3904942507681 < if
+ 0 16068 3904942507691 > package
+ 0 16068 3904942507700 < package
+ 0 16068 3904942507712 > if
+ 0 16068 3904942507722 > info
+ 0 16068 3904942507728 < info
+ 0 16068 3904942507749 > info
+ 0 16068 3904942507773 < info
+ 0 16068 3904942507780 < if
+ 0 16068 3904942507797 > namespace
+ 0 16068 3904942507898 > variable
+ 0 16068 3904942507905 < variable
+ 0 16068 3904942507911 > info
+ 0 16068 3904942507923 < info
+ 0 16068 3904942507928 > info
+ 0 16068 3904942507934 < info
+ 0 16068 3904942507939 > info
+ 0 16068 3904942507947 < info
+ 0 16068 3904942507952 > file
+ 0 16068 3904942507971 < file
+ 0 16068 3904942507977 > list
+ 0 16068 3904942507991 < list
+ 0 16068 3904942507996 > foreach
+ 0 16068 3904942508020 > lsearch
+ 0 16068 3904942508028 < lsearch
+ 0 16068 3904942508034 > lappend
+ 0 16068 3904942508041 < lappend
+ 0 16068 3904942508051 > lsearch
+ 0 16068 3904942508056 < lsearch
+ 0 16068 3904942508061 > lappend
+ 0 16068 3904942508068 < lappend
+ 0 16068 3904942508073 < foreach
+ 0 16068 3904942508078 > info
+ 0 16068 3904942508086 < info
+ 0 16068 3904942508090 > file
+ 0 16068 3904942508108 < file
+ 0 16068 3904942508113 > file
+ 0 16068 3904942508129 < file
+ 0 16068 3904942508134 > file
+ 0 16068 3904942508142 < file
+ 0 16068 3904942508148 > lsearch
+ 0 16068 3904942508153 < lsearch
+ 0 16068 3904942508158 > lappend
+ 0 16068 3904942508166 < lappend
+ 0 16068 3904942508170 > info
+ 0 16068 3904942508176 < info
+ 0 16068 3904942508181 > foreach
+ 0 16068 3904942508190 > lsearch
+ 0 16068 3904942508195 < lsearch
+ 0 16068 3904942508200 > lappend
+ 0 16068 3904942508206 < lappend
+ 0 16068 3904942508211 < foreach
+ 0 16068 3904942508217 < namespace
+ 0 16068 3904942508243 > if
+ 0 16068 3904942508261 > interp
+ 0 16068 3904942508276 < interp
+ 0 16068 3904942508283 < if
+ 0 16068 3904942508296 > package
+ 0 16068 3904942508302 < package
+ 0 16068 3904942508312 > if
+ 0 16068 3904942508322 > interp
+ 0 16068 3904942508328 < interp
+ 0 16068 3904942508369 < if
+ 0 16068 3904942508387 > if
+ 0 16068 3904942508398 > namespace
+ 0 16068 3904942508406 < namespace
+ 0 16068 3904942508412 < if
+ 0 16068 3904942508424 > set
+ 0 16068 3904942508430 < set
+ 0 16068 3904942508437 > set
+ 0 16068 3904942508443 < set
+ 0 16068 3904942508451 > if
+ 0 16068 3904942508463 > namespace
+ 0 16068 3904942508469 < namespace
+ 0 16068 3904942508479 > proc
+ 0 16068 3904942508488 < proc
+ 0 16068 3904942508493 < if
+ 0 16068 3904942508573 > proc
+ 0 16068 3904942508582 < proc
+ 0 16068 3904942508599 > proc
+ 0 16068 3904942508609 < proc
+ 0 16068 3904942508638 > proc
+ 0 16068 3904942508645 < proc
+ 0 16068 3904942508664 > proc
+ 0 16068 3904942508673 < proc
+ 0 16068 3904942508686 > proc
+ 0 16068 3904942508693 < proc
+ 0 16068 3904942508737 > if
+ 0 16068 3904942508760 > proc
+ 0 16068 3904942508782 < proc
+ 0 16068 3904942508788 < if
+ 0 16068 3904942508826 > proc
+ 0 16068 3904942508837 < proc
+ 0 16068 3904942508843 < source
+ 0 16068 3904942508848 < uplevel
+ 0 16068 3904942508857 <- tclInit
+ 0 16068 3904942508871 < tclInit
+ 0 16068 3904942509050 > proc
+ 0 16068 3904942509059 < proc
+ 0 16068 3904942509067 > proc
+ 0 16068 3904942509074 < proc
+ 0 16068 3904942509081 > proc
+ 0 16068 3904942509088 < proc
+ 0 16068 3904942509094 > func_a
+ 0 16068 3904942509110 -> func_a
+ 0 16068 3904942509116 > puts
+ 0 16068 3904942509256 < puts
+ 0 16068 3904942509262 > after
+ 0 16068 3904943510998 < after
+ 0 16068 3904943511016 > func_b
+ 0 16068 3904943511050 -> func_b
+ 0 16068 3904943511058 > puts
+ 0 16068 3904943511090 < puts
+ 0 16068 3904943511094 > after
+ 0 16068 3904944520994 < after
+ 0 16068 3904944521013 > func_c
+ 0 16068 3904944521043 -> func_c
+ 0 16068 3904944521051 > puts
+ 0 16068 3904944521092 < puts
+ 0 16068 3904944521097 > after
+ 0 16068 3904945530993 < after
+ 0 16068 3904945531012 <- func_c
+ 0 16068 3904945531020 < func_c
+ 0 16068 3904945531025 <- func_b
+ 0 16068 3904945531029 < func_b
+ 0 16068 3904945531034 <- func_a
+ 0 16068 3904945531039 < func_a
+ 0 16068 3904945531064 > exit
+^C
+
+You can see the output is in five columns.
+
+The first column is CPU-id, the second is PID, third is the time since boot in
+microseconds since the previous action. The fourth and fifth columns
+represent the action happening. The Tcl command or procedure name is prefixed
+by an indicator reprenting what is happening. These may be -> (procedure
+entry), <- (procedure return), > (command entry), or < (command return).
+
+As each action is taken, the fourth and fifth columns are indented by 2 spaces.
+This shows which procedure or command is calling which.
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/tcl_flowtime_example.txt b/Examples/tcl_flowtime_example.txt
new file mode 100644
index 000000000000..8e07238e1303
--- /dev/null
+++ b/Examples/tcl_flowtime_example.txt
@@ -0,0 +1,197 @@
+Following are examples of running tcl_flowtime.d.
+
+Here the tcl_flowtime.d script is running on the program
+Code/Tcl/func_abc.tcl.
+
+
+# tcl_flowtime.d
+ C PID TIME(us) DELTA(us) -- CALL
+ 0 17901 4436098007906 2 > if
+ 0 17901 4436098007976 70 > info
+ 0 17901 4436098007998 21 < info
+ 0 17901 4436098008050 52 > proc
+ 0 17901 4436098008063 12 < proc
+ 0 17901 4436098008069 6 < if
+ 0 17901 4436098008085 15 > tclInit
+ 0 17901 4436098008286 201 -> tclInit
+ 0 17901 4436098008295 8 > global
+ 0 17901 4436098008305 10 < global
+ 0 17901 4436098008311 6 > global
+ 0 17901 4436098008318 6 < global
+ 0 17901 4436098008323 5 > rename
+ 0 17901 4436098008342 18 < rename
+ 0 17901 4436098008353 10 > info
+ 0 17901 4436098008362 9 < info
+ 0 17901 4436098008369 6 > info
+ 0 17901 4436098008395 25 < info
+ 0 17901 4436098008403 8 > unset
+ 0 17901 4436098008410 6 < unset
+ 0 17901 4436098008416 5 > concat
+ 0 17901 4436098008425 8 < concat
+ 0 17901 4436098008440 15 > file
+ 0 17901 4436098008459 18 < file
+ 0 17901 4436098008465 6 > file
+ 0 17901 4436098008543 78 < file
+ 0 17901 4436098008550 7 > file
+ 0 17901 4436098008560 9 < file
+ 0 17901 4436098008567 7 > file
+ 0 17901 4436098008671 104 < file
+ 0 17901 4436098008678 7 > file
+ 0 17901 4436098008688 9 < file
+ 0 17901 4436098008695 6 > file
+ 0 17901 4436098008780 84 < file
+ 0 17901 4436098008787 6 > file
+ 0 17901 4436098008796 9 < file
+ 0 17901 4436098008803 6 > file
+ 0 17901 4436098008854 51 < file
+ 0 17901 4436098008862 7 > uplevel
+ 0 17901 4436098008872 10 > source
+ 0 17901 4436098009290 417 > if
+ 0 17901 4436098009304 14 > info
+ 0 17901 4436098009311 7 < info
+ 0 17901 4436098009319 7 < if
+ 0 17901 4436098009331 11 > package
+ 0 17901 4436098009340 9 < package
+ 0 17901 4436098009353 12 > if
+ 0 17901 4436098009363 10 > info
+ 0 17901 4436098009369 6 < info
+ 0 17901 4436098009390 20 > info
+ 0 17901 4436098009413 22 < info
+ 0 17901 4436098009421 7 < if
+ 0 17901 4436098009439 18 > namespace
+ 0 17901 4436098009530 90 > variable
+ 0 17901 4436098009537 7 < variable
+ 0 17901 4436098009544 6 > info
+ 0 17901 4436098009554 10 < info
+ 0 17901 4436098009561 6 > info
+ 0 17901 4436098009567 6 < info
+ 0 17901 4436098009573 5 > info
+ 0 17901 4436098009579 6 < info
+ 0 17901 4436098009586 6 > file
+ 0 17901 4436098009605 19 < file
+ 0 17901 4436098009611 6 > list
+ 0 17901 4436098009627 15 < list
+ 0 17901 4436098009633 6 > foreach
+ 0 17901 4436098009658 24 > lsearch
+ 0 17901 4436098009665 7 < lsearch
+ 0 17901 4436098009673 7 > lappend
+ 0 17901 4436098009680 7 < lappend
+ 0 17901 4436098009689 9 > lsearch
+ 0 17901 4436098009694 5 < lsearch
+ 0 17901 4436098009700 6 > lappend
+ 0 17901 4436098009707 6 < lappend
+ 0 17901 4436098009712 5 < foreach
+ 0 17901 4436098009719 6 > info
+ 0 17901 4436098009726 7 < info
+ 0 17901 4436098009732 5 > file
+ 0 17901 4436098009749 17 < file
+ 0 17901 4436098009756 6 > file
+ 0 17901 4436098009772 16 < file
+ 0 17901 4436098009778 6 > file
+ 0 17901 4436098009787 9 < file
+ 0 17901 4436098009795 7 > lsearch
+ 0 17901 4436098009800 5 < lsearch
+ 0 17901 4436098009806 6 > lappend
+ 0 17901 4436098009812 5 < lappend
+ 0 17901 4436098009818 5 > info
+ 0 17901 4436098009823 5 < info
+ 0 17901 4436098009830 6 > foreach
+ 0 17901 4436098009840 9 > lsearch
+ 0 17901 4436098009845 5 < lsearch
+ 0 17901 4436098009851 6 > lappend
+ 0 17901 4436098009857 5 < lappend
+ 0 17901 4436098009862 5 < foreach
+ 0 17901 4436098009868 5 < namespace
+ 0 17901 4436098009896 27 > if
+ 0 17901 4436098009915 18 > interp
+ 0 17901 4436098009922 7 < interp
+ 0 17901 4436098009930 8 < if
+ 0 17901 4436098009943 12 > package
+ 0 17901 4436098009949 5 < package
+ 0 17901 4436098009960 10 > if
+ 0 17901 4436098009970 10 > interp
+ 0 17901 4436098009976 5 < interp
+ 0 17901 4436098010018 41 < if
+ 0 17901 4436098010036 18 > if
+ 0 17901 4436098010049 12 > namespace
+ 0 17901 4436098010057 7 < namespace
+ 0 17901 4436098010063 6 < if
+ 0 17901 4436098010074 11 > set
+ 0 17901 4436098010081 6 < set
+ 0 17901 4436098010089 8 > set
+ 0 17901 4436098010095 5 < set
+ 0 17901 4436098010104 9 > if
+ 0 17901 4436098010116 12 > namespace
+ 0 17901 4436098010122 6 < namespace
+ 0 17901 4436098010133 10 > proc
+ 0 17901 4436098010142 8 < proc
+ 0 17901 4436098010148 5 < if
+ 0 17901 4436098010228 79 > proc
+ 0 17901 4436098010237 8 < proc
+ 0 17901 4436098010255 18 > proc
+ 0 17901 4436098010264 9 < proc
+ 0 17901 4436098010293 29 > proc
+ 0 17901 4436098010301 7 < proc
+ 0 17901 4436098010320 18 > proc
+ 0 17901 4436098010329 9 < proc
+ 0 17901 4436098010342 13 > proc
+ 0 17901 4436098010350 7 < proc
+ 0 17901 4436098010394 44 > if
+ 0 17901 4436098010418 23 > proc
+ 0 17901 4436098010437 18 < proc
+ 0 17901 4436098010443 6 < if
+ 0 17901 4436098010563 120 > proc
+ 0 17901 4436098010575 12 < proc
+ 0 17901 4436098010582 7 < source
+ 0 17901 4436098010588 5 < uplevel
+ 0 17901 4436098010596 8 <- tclInit
+ 0 17901 4436098010610 13 < tclInit
+ 0 17901 4436098010800 190 > proc
+ 0 17901 4436098010809 8 < proc
+ 0 17901 4436098010818 9 > proc
+ 0 17901 4436098010825 6 < proc
+ 0 17901 4436098010833 8 > proc
+ 0 17901 4436098010840 6 < proc
+ 0 17901 4436098010847 7 > func_a
+ 0 17901 4436098010863 15 -> func_a
+ 0 17901 4436098010870 6 > puts
+ 0 17901 4436098011006 136 < puts
+ 0 17901 4436098011014 7 > after
+ 0 17901 4436099020588 1009573 < after
+ 0 17901 4436099020611 23 > func_b
+ 0 17901 4436099020646 34 -> func_b
+ 0 17901 4436099020655 8 > puts
+ 0 17901 4436099020697 41 < puts
+ 0 17901 4436099020703 6 > after
+ 0 17901 4436100030614 1009910 < after
+ 0 17901 4436100030638 24 > func_c
+ 0 17901 4436100030671 32 -> func_c
+ 0 17901 4436100030680 9 > puts
+ 0 17901 4436100030723 42 < puts
+ 0 17901 4436100030729 6 > after
+ 0 17901 4436101040600 1009870 < after
+ 0 17901 4436101040623 22 <- func_c
+ 0 17901 4436101040633 10 < func_c
+ 0 17901 4436101040639 6 <- func_b
+ 0 17901 4436101040645 5 < func_b
+ 0 17901 4436101040651 5 <- func_a
+ 0 17901 4436101040656 5 < func_a
+ 0 17901 4436101040682 25 > exit
+
+You can see the output is in six columns.
+
+The first column is CPU-id, the second is PID, third is the time since boot in
+microseconds, fourth is the elapsed time since the previous action. The fifth
+and sixth columns represent the action. The Tcl command or procedure name is
+prefixed by an indicator reprenting what is happening. These may be ->
+(procedure entry), <- (procedure return), > (command entry), or < (command
+return).
+
+As each action is taken, the fifth and sixth columns are indented by 2 spaces.
+This shows which procedure or command is calling which.
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/tcl_ins_example.txt b/Examples/tcl_ins_example.txt
new file mode 100644
index 000000000000..6f1ba9a3d137
--- /dev/null
+++ b/Examples/tcl_ins_example.txt
@@ -0,0 +1,46 @@
+The following are examples of running the script tcl_ins.d
+
+Here it traces as Code/Tcl/func_slow.tcl executes.
+
+# tcl_ins.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID TYPE NAME COUNT
+ 16005 inst foreach_start4 1
+ 16005 inst jumpTrue1 1
+ 16005 inst lappendScalar1 1
+ 16005 inst list 1
+ 16005 inst strneq 1
+ 16005 inst beginCatch4 2
+ 16005 inst dup 2
+ 16005 inst endCatch 2
+ 16005 inst eq 2
+ 16005 inst land 2
+ 16005 inst storeScalarStk 2
+ 16005 inst foreach_step4 4
+ 16005 inst not 4
+ 16005 inst loadArrayStk 5
+ 16005 inst streq 7
+ 16005 inst tryCvtToNumeric 8
+ 16005 inst jumpFalse1 12
+ 16005 inst loadScalarStk 13
+ 16005 inst jump1 14
+ 16005 inst pop 18
+ 16005 inst invokeStk1 53
+ 16005 inst add 600000
+ 16005 inst concat1 600000
+ 16005 inst exprStk 600000
+ 16005 inst lt 600007
+ 16005 inst storeScalar1 600016
+ 16005 inst done 600021
+ 16005 inst loadScalar1 1200020
+ 16005 inst push1 4200193
+
+It is showing the instructions called by Tcl as the program executes. The
+larger counts toward the bottom of the display are from the looping construct
+used in Code/Tcl/func_slow.tcl.
+
+Tracing the instructions is quite low-level and slow the target application
+considerably and would probably be used only as a last resort if you have no
+other indication of why CPUs are busy.
+
diff --git a/Examples/tcl_insflow_example.txt b/Examples/tcl_insflow_example.txt
new file mode 100644
index 000000000000..2919f8eb72fd
--- /dev/null
+++ b/Examples/tcl_insflow_example.txt
@@ -0,0 +1,997 @@
+The following are examples of running tcl_insflow.d
+
+Here you can see the script running while tracing Code/Tcl/func_abc.tcl
+
+# tcl_insflow.d
+ C PID TIME(us) DELTA(us) TYPE -- CALL
+ 0 174829 4436207514685 3 cmd -> if
+ 0 174829 4436207514793 107 inst -> push1
+ 0 174829 4436207514805 11 inst <- push1
+ 0 174829 4436207514814 8 inst -> push1
+ 0 174829 4436207514820 5 inst <- push1
+ 0 174829 4436207514826 5 inst -> push1
+ 0 174829 4436207514832 5 inst <- push1
+ 0 174829 4436207514838 5 inst -> invokeStk1
+ 0 174829 4436207514845 6 cmd -> info
+ 0 174829 4436207514883 38 cmd <- info
+ 0 174829 4436207514895 11 inst <- invokeStk1
+ 0 174829 4436207514901 6 inst -> push1
+ 0 174829 4436207514907 5 inst <- push1
+ 0 174829 4436207514913 5 inst -> eq
+ 0 174829 4436207514927 14 inst <- eq
+ 0 174829 4436207514933 6 inst -> done
+ 0 174829 4436207514940 6 inst <- done
+ 0 174829 4436207514978 38 inst -> push1
+ 0 174829 4436207514985 6 inst <- push1
+ 0 174829 4436207514991 5 inst -> push1
+ 0 174829 4436207514996 5 inst <- push1
+ 0 174829 4436207515002 5 inst -> push1
+ 0 174829 4436207515007 5 inst <- push1
+ 0 174829 4436207515013 5 inst -> push1
+ 0 174829 4436207515019 5 inst <- push1
+ 0 174829 4436207515024 5 inst -> invokeStk1
+ 0 174829 4436207515031 6 cmd -> proc
+ 0 174829 4436207515045 13 cmd <- proc
+ 0 174829 4436207515051 6 inst <- invokeStk1
+ 0 174829 4436207515057 6 inst -> done
+ 0 174829 4436207515063 5 inst <- done
+ 0 174829 4436207515069 6 cmd <- if
+ 0 174829 4436207515086 16 cmd -> tclInit
+ 0 174829 4436207515295 208 proc -> tclInit
+ 0 174829 4436207515305 10 inst -> push1
+ 0 174829 4436207515311 5 inst <- push1
+ 0 174829 4436207515317 6 inst -> push1
+ 0 174829 4436207515323 5 inst <- push1
+ 0 174829 4436207515328 5 inst -> push1
+ 0 174829 4436207515334 5 inst <- push1
+ 0 174829 4436207515340 5 inst -> push1
+ 0 174829 4436207515345 5 inst <- push1
+ 0 174829 4436207515351 5 inst -> invokeStk1
+ 0 174829 4436207515357 6 cmd -> global
+ 0 174829 4436207515369 11 cmd <- global
+ 0 174829 4436207515375 6 inst <- invokeStk1
+ 0 174829 4436207515381 5 inst -> pop
+ 0 174829 4436207515387 5 inst <- pop
+ 0 174829 4436207515393 5 inst -> push1
+ 0 174829 4436207515398 5 inst <- push1
+ 0 174829 4436207515404 5 inst -> push1
+ 0 174829 4436207515410 5 inst <- push1
+ 0 174829 4436207515415 5 inst -> push1
+ 0 174829 4436207515421 5 inst <- push1
+ 0 174829 4436207515427 5 inst -> invokeStk1
+ 0 174829 4436207515433 6 cmd -> global
+ 0 174829 4436207515440 7 cmd <- global
+ 0 174829 4436207515446 6 inst <- invokeStk1
+ 0 174829 4436207515452 5 inst -> pop
+ 0 174829 4436207515458 5 inst <- pop
+ 0 174829 4436207515463 5 inst -> push1
+ 0 174829 4436207515469 5 inst <- push1
+ 0 174829 4436207515475 5 inst -> push1
+ 0 174829 4436207515480 5 inst <- push1
+ 0 174829 4436207515486 5 inst -> push1
+ 0 174829 4436207515492 5 inst <- push1
+ 0 174829 4436207515497 5 inst -> invokeStk1
+ 0 174829 4436207515504 6 cmd -> rename
+ 0 174829 4436207515553 49 cmd <- rename
+ 0 174829 4436207515560 6 inst <- invokeStk1
+ 0 174829 4436207515566 6 inst -> pop
+ 0 174829 4436207515571 5 inst <- pop
+ 0 174829 4436207515577 5 inst -> push1
+ 0 174829 4436207515583 5 inst <- push1
+ 0 174829 4436207515589 5 inst -> storeScalar1
+ 0 174829 4436207515598 9 inst <- storeScalar1
+ 0 174829 4436207515605 6 inst -> push1
+ 0 174829 4436207515610 5 inst <- push1
+ 0 174829 4436207515616 5 inst -> storeScalar1
+ 0 174829 4436207515622 5 inst <- storeScalar1
+ 0 174829 4436207515628 5 inst -> push1
+ 0 174829 4436207515633 5 inst <- push1
+ 0 174829 4436207515639 5 inst -> push1
+ 0 174829 4436207515645 5 inst <- push1
+ 0 174829 4436207515650 5 inst -> push1
+ 0 174829 4436207515656 5 inst <- push1
+ 0 174829 4436207515662 5 inst -> invokeStk1
+ 0 174829 4436207515668 6 cmd -> info
+ 0 174829 4436207515679 10 cmd <- info
+ 0 174829 4436207515685 6 inst <- invokeStk1
+ 0 174829 4436207515691 5 inst -> tryCvtToNumeric
+ 0 174829 4436207515701 10 inst <- tryCvtToNumeric
+ 0 174829 4436207515708 6 inst -> jumpFalse1
+ 0 174829 4436207515714 5 inst <- jumpFalse1
+ 0 174829 4436207515719 5 inst -> push1
+ 0 174829 4436207515725 5 inst <- push1
+ 0 174829 4436207515731 5 inst -> push1
+ 0 174829 4436207515736 5 inst <- push1
+ 0 174829 4436207515742 5 inst -> push1
+ 0 174829 4436207515747 5 inst <- push1
+ 0 174829 4436207515753 5 inst -> invokeStk1
+ 0 174829 4436207515760 6 cmd -> info
+ 0 174829 4436207515787 27 cmd <- info
+ 0 174829 4436207515793 6 inst <- invokeStk1
+ 0 174829 4436207515799 5 inst -> tryCvtToNumeric
+ 0 174829 4436207515805 5 inst <- tryCvtToNumeric
+ 0 174829 4436207515811 5 inst -> jumpFalse1
+ 0 174829 4436207515817 5 inst <- jumpFalse1
+ 0 174829 4436207515823 5 inst -> push1
+ 0 174829 4436207515828 5 inst <- push1
+ 0 174829 4436207515834 5 inst -> pop
+ 0 174829 4436207515839 5 inst <- pop
+ 0 174829 4436207515845 5 inst -> beginCatch4
+ 0 174829 4436207515851 5 inst <- beginCatch4
+ 0 174829 4436207515857 5 inst -> loadScalar1
+ 0 174829 4436207515863 5 inst <- loadScalar1
+ 0 174829 4436207515868 5 inst -> lappendScalar1
+ 0 174829 4436207515877 8 inst <- lappendScalar1
+ 0 174829 4436207515883 6 inst -> push1
+ 0 174829 4436207515889 5 inst <- push1
+ 0 174829 4436207515895 5 inst -> push1
+ 0 174829 4436207515900 5 inst <- push1
+ 0 174829 4436207515906 5 inst -> invokeStk1
+ 0 174829 4436207515912 6 cmd -> unset
+ 0 174829 4436207515920 7 cmd <- unset
+ 0 174829 4436207515926 6 inst <- invokeStk1
+ 0 174829 4436207515932 5 inst -> pop
+ 0 174829 4436207515938 5 inst <- pop
+ 0 174829 4436207515943 5 inst -> push1
+ 0 174829 4436207515949 5 inst <- push1
+ 0 174829 4436207515955 5 inst -> jump1
+ 0 174829 4436207515960 5 inst <- jump1
+ 0 174829 4436207515966 5 inst -> endCatch
+ 0 174829 4436207515972 5 inst <- endCatch
+ 0 174829 4436207515977 5 inst -> pop
+ 0 174829 4436207515983 5 inst <- pop
+ 0 174829 4436207515989 5 inst -> push1
+ 0 174829 4436207515994 5 inst <- push1
+ 0 174829 4436207516000 5 inst -> loadScalar1
+ 0 174829 4436207516006 5 inst <- loadScalar1
+ 0 174829 4436207516012 5 inst -> loadScalar1
+ 0 174829 4436207516017 5 inst <- loadScalar1
+ 0 174829 4436207516023 5 inst -> invokeStk1
+ 0 174829 4436207516029 6 cmd -> concat
+ 0 174829 4436207516049 19 cmd <- concat
+ 0 174829 4436207516055 6 inst <- invokeStk1
+ 0 174829 4436207516061 5 inst -> storeScalar1
+ 0 174829 4436207516068 6 inst <- storeScalar1
+ 0 174829 4436207516074 6 inst -> loadScalar1
+ 0 174829 4436207516080 5 inst <- loadScalar1
+ 0 174829 4436207516085 5 inst -> storeScalar1
+ 0 174829 4436207516091 5 inst <- storeScalar1
+ 0 174829 4436207516097 5 inst -> foreach_start4
+ 0 174829 4436207516104 6 inst <- foreach_start4
+ 0 174829 4436207516110 6 inst -> foreach_step4
+ 0 174829 4436207516125 14 inst <- foreach_step4
+ 0 174829 4436207516131 5 inst -> loadScalar1
+ 0 174829 4436207516137 5 inst <- loadScalar1
+ 0 174829 4436207516143 5 inst -> storeScalar1
+ 0 174829 4436207516148 5 inst <- storeScalar1
+ 0 174829 4436207516154 5 inst -> push1
+ 0 174829 4436207516160 5 inst <- push1
+ 0 174829 4436207516165 5 inst -> push1
+ 0 174829 4436207516171 5 inst <- push1
+ 0 174829 4436207516177 5 inst -> loadScalar1
+ 0 174829 4436207516182 5 inst <- loadScalar1
+ 0 174829 4436207516188 5 inst -> push1
+ 0 174829 4436207516194 5 inst <- push1
+ 0 174829 4436207516200 5 inst -> invokeStk1
+ 0 174829 4436207516206 6 cmd -> file
+ 0 174829 4436207516218 12 cmd <- file
+ 0 174829 4436207516224 6 inst <- invokeStk1
+ 0 174829 4436207516230 5 inst -> storeScalar1
+ 0 174829 4436207516236 5 inst <- storeScalar1
+ 0 174829 4436207516242 5 inst -> push1
+ 0 174829 4436207516247 5 inst <- push1
+ 0 174829 4436207516253 5 inst -> push1
+ 0 174829 4436207516258 5 inst <- push1
+ 0 174829 4436207516264 5 inst -> loadScalar1
+ 0 174829 4436207516270 5 inst <- loadScalar1
+ 0 174829 4436207516276 5 inst -> invokeStk1
+ 0 174829 4436207516282 6 cmd -> file
+ 0 174829 4436207516368 86 cmd <- file
+ 0 174829 4436207516375 6 inst <- invokeStk1
+ 0 174829 4436207516381 6 inst -> tryCvtToNumeric
+ 0 174829 4436207516387 5 inst <- tryCvtToNumeric
+ 0 174829 4436207516393 5 inst -> jumpFalse1
+ 0 174829 4436207516398 5 inst <- jumpFalse1
+ 0 174829 4436207516404 5 inst -> push1
+ 0 174829 4436207516410 5 inst <- push1
+ 0 174829 4436207516416 5 inst -> pop
+ 0 174829 4436207516421 5 inst <- pop
+ 0 174829 4436207516427 5 inst -> jump1
+ 0 174829 4436207516432 5 inst <- jump1
+ 0 174829 4436207516438 5 inst -> foreach_step4
+ 0 174829 4436207516444 5 inst <- foreach_step4
+ 0 174829 4436207516450 5 inst -> loadScalar1
+ 0 174829 4436207516456 5 inst <- loadScalar1
+ 0 174829 4436207516462 6 inst -> storeScalar1
+ 0 174829 4436207516468 5 inst <- storeScalar1
+ 0 174829 4436207516473 5 inst -> push1
+ 0 174829 4436207516479 5 inst <- push1
+ 0 174829 4436207516485 5 inst -> push1
+ 0 174829 4436207516490 5 inst <- push1
+ 0 174829 4436207516496 5 inst -> loadScalar1
+ 0 174829 4436207516502 5 inst <- loadScalar1
+ 0 174829 4436207516508 5 inst -> push1
+ 0 174829 4436207516513 5 inst <- push1
+ 0 174829 4436207516519 5 inst -> invokeStk1
+ 0 174829 4436207516525 6 cmd -> file
+ 0 174829 4436207516536 10 cmd <- file
+ 0 174829 4436207516542 6 inst <- invokeStk1
+ 0 174829 4436207516548 5 inst -> storeScalar1
+ 0 174829 4436207516555 6 inst <- storeScalar1
+ 0 174829 4436207516561 6 inst -> push1
+ 0 174829 4436207516566 5 inst <- push1
+ 0 174829 4436207516572 5 inst -> push1
+ 0 174829 4436207516578 5 inst <- push1
+ 0 174829 4436207516583 5 inst -> loadScalar1
+ 0 174829 4436207516589 5 inst <- loadScalar1
+ 0 174829 4436207516595 5 inst -> invokeStk1
+ 0 174829 4436207516601 6 cmd -> file
+ 0 174829 4436207516709 107 cmd <- file
+ 0 174829 4436207516716 6 inst <- invokeStk1
+ 0 174829 4436207516722 6 inst -> tryCvtToNumeric
+ 0 174829 4436207516728 5 inst <- tryCvtToNumeric
+ 0 174829 4436207516733 5 inst -> jumpFalse1
+ 0 174829 4436207516739 5 inst <- jumpFalse1
+ 0 174829 4436207516745 5 inst -> push1
+ 0 174829 4436207516751 5 inst <- push1
+ 0 174829 4436207516756 5 inst -> pop
+ 0 174829 4436207516762 5 inst <- pop
+ 0 174829 4436207516768 5 inst -> jump1
+ 0 174829 4436207516773 5 inst <- jump1
+ 0 174829 4436207516779 5 inst -> foreach_step4
+ 0 174829 4436207516785 5 inst <- foreach_step4
+ 0 174829 4436207516791 5 inst -> loadScalar1
+ 0 174829 4436207516796 5 inst <- loadScalar1
+ 0 174829 4436207516802 5 inst -> storeScalar1
+ 0 174829 4436207516808 5 inst <- storeScalar1
+ 0 174829 4436207516814 5 inst -> push1
+ 0 174829 4436207516820 5 inst <- push1
+ 0 174829 4436207516825 5 inst -> push1
+ 0 174829 4436207516831 5 inst <- push1
+ 0 174829 4436207516837 5 inst -> loadScalar1
+ 0 174829 4436207516842 5 inst <- loadScalar1
+ 0 174829 4436207516848 5 inst -> push1
+ 0 174829 4436207516854 5 inst <- push1
+ 0 174829 4436207516859 5 inst -> invokeStk1
+ 0 174829 4436207516866 6 cmd -> file
+ 0 174829 4436207516876 10 cmd <- file
+ 0 174829 4436207516882 6 inst <- invokeStk1
+ 0 174829 4436207516888 5 inst -> storeScalar1
+ 0 174829 4436207516895 6 inst <- storeScalar1
+ 0 174829 4436207516901 6 inst -> push1
+ 0 174829 4436207516906 5 inst <- push1
+ 0 174829 4436207516912 5 inst -> push1
+ 0 174829 4436207516918 5 inst <- push1
+ 0 174829 4436207516923 5 inst -> loadScalar1
+ 0 174829 4436207516929 5 inst <- loadScalar1
+ 0 174829 4436207516935 5 inst -> invokeStk1
+ 0 174829 4436207516941 6 cmd -> file
+ 0 174829 4436207517027 86 cmd <- file
+ 0 174829 4436207517034 6 inst <- invokeStk1
+ 0 174829 4436207517040 6 inst -> tryCvtToNumeric
+ 0 174829 4436207517046 5 inst <- tryCvtToNumeric
+ 0 174829 4436207517052 5 inst -> jumpFalse1
+ 0 174829 4436207517057 5 inst <- jumpFalse1
+ 0 174829 4436207517063 5 inst -> push1
+ 0 174829 4436207517069 5 inst <- push1
+ 0 174829 4436207517075 5 inst -> pop
+ 0 174829 4436207517080 5 inst <- pop
+ 0 174829 4436207517086 5 inst -> jump1
+ 0 174829 4436207517091 5 inst <- jump1
+ 0 174829 4436207517097 5 inst -> foreach_step4
+ 0 174829 4436207517103 5 inst <- foreach_step4
+ 0 174829 4436207517109 5 inst -> loadScalar1
+ 0 174829 4436207517115 5 inst <- loadScalar1
+ 0 174829 4436207517121 5 inst -> storeScalar1
+ 0 174829 4436207517127 5 inst <- storeScalar1
+ 0 174829 4436207517132 5 inst -> push1
+ 0 174829 4436207517138 5 inst <- push1
+ 0 174829 4436207517144 5 inst -> push1
+ 0 174829 4436207517149 5 inst <- push1
+ 0 174829 4436207517155 5 inst -> loadScalar1
+ 0 174829 4436207517161 5 inst <- loadScalar1
+ 0 174829 4436207517167 5 inst -> push1
+ 0 174829 4436207517172 5 inst <- push1
+ 0 174829 4436207517178 5 inst -> invokeStk1
+ 0 174829 4436207517184 6 cmd -> file
+ 0 174829 4436207517194 10 cmd <- file
+ 0 174829 4436207517201 6 inst <- invokeStk1
+ 0 174829 4436207517206 5 inst -> storeScalar1
+ 0 174829 4436207517213 6 inst <- storeScalar1
+ 0 174829 4436207517219 5 inst -> push1
+ 0 174829 4436207517225 5 inst <- push1
+ 0 174829 4436207517231 5 inst -> push1
+ 0 174829 4436207517236 5 inst <- push1
+ 0 174829 4436207517242 5 inst -> loadScalar1
+ 0 174829 4436207517247 5 inst <- loadScalar1
+ 0 174829 4436207517253 5 inst -> invokeStk1
+ 0 174829 4436207517260 6 cmd -> file
+ 0 174829 4436207517313 53 cmd <- file
+ 0 174829 4436207517319 6 inst <- invokeStk1
+ 0 174829 4436207517325 5 inst -> tryCvtToNumeric
+ 0 174829 4436207517331 6 inst <- tryCvtToNumeric
+ 0 174829 4436207517337 5 inst -> jumpFalse1
+ 0 174829 4436207517343 5 inst <- jumpFalse1
+ 0 174829 4436207517348 5 inst -> beginCatch4
+ 0 174829 4436207517354 5 inst <- beginCatch4
+ 0 174829 4436207517360 6 inst -> push1
+ 0 174829 4436207517366 5 inst <- push1
+ 0 174829 4436207517371 5 inst -> push1
+ 0 174829 4436207517377 5 inst <- push1
+ 0 174829 4436207517383 5 inst -> push1
+ 0 174829 4436207517388 5 inst <- push1
+ 0 174829 4436207517394 5 inst -> loadScalar1
+ 0 174829 4436207517400 5 inst <- loadScalar1
+ 0 174829 4436207517405 5 inst -> list
+ 0 174829 4436207517412 6 inst <- list
+ 0 174829 4436207517418 5 inst -> invokeStk1
+ 0 174829 4436207517424 6 cmd -> uplevel
+ 0 174829 4436207517436 11 cmd -> source
+ 0 174829 4436207517878 441 cmd -> if
+ 0 174829 4436207517897 18 inst -> push1
+ 0 174829 4436207517903 6 inst <- push1
+ 0 174829 4436207517910 6 inst -> push1
+ 0 174829 4436207517915 5 inst <- push1
+ 0 174829 4436207517921 5 inst -> push1
+ 0 174829 4436207517927 5 inst <- push1
+ 0 174829 4436207517932 5 inst -> invokeStk1
+ 0 174829 4436207517939 6 cmd -> info
+ 0 174829 4436207517947 8 cmd <- info
+ 0 174829 4436207517954 6 inst <- invokeStk1
+ 0 174829 4436207517960 5 inst -> push1
+ 0 174829 4436207517965 5 inst <- push1
+ 0 174829 4436207517971 5 inst -> eq
+ 0 174829 4436207517979 7 inst <- eq
+ 0 174829 4436207517985 5 inst -> done
+ 0 174829 4436207517991 5 inst <- done
+ 0 174829 4436207517997 6 cmd <- if
+ 0 174829 4436207518010 12 cmd -> package
+ 0 174829 4436207518021 10 cmd <- package
+ 0 174829 4436207518034 13 cmd -> if
+ 0 174829 4436207518046 11 inst -> push1
+ 0 174829 4436207518051 5 inst <- push1
+ 0 174829 4436207518057 5 inst -> push1
+ 0 174829 4436207518063 5 inst <- push1
+ 0 174829 4436207518068 5 inst -> push1
+ 0 174829 4436207518074 5 inst <- push1
+ 0 174829 4436207518080 5 inst -> invokeStk1
+ 0 174829 4436207518086 6 cmd -> info
+ 0 174829 4436207518094 7 cmd <- info
+ 0 174829 4436207518099 5 inst <- invokeStk1
+ 0 174829 4436207518105 5 inst -> not
+ 0 174829 4436207518111 6 inst <- not
+ 0 174829 4436207518117 5 inst -> done
+ 0 174829 4436207518123 5 inst <- done
+ 0 174829 4436207518147 24 inst -> push1
+ 0 174829 4436207518153 5 inst <- push1
+ 0 174829 4436207518159 5 inst -> push1
+ 0 174829 4436207518164 5 inst <- push1
+ 0 174829 4436207518170 5 inst -> push1
+ 0 174829 4436207518175 5 inst <- push1
+ 0 174829 4436207518181 5 inst -> invokeStk1
+ 0 174829 4436207518187 6 cmd -> info
+ 0 174829 4436207518212 25 cmd <- info
+ 0 174829 4436207518218 6 inst <- invokeStk1
+ 0 174829 4436207518224 5 inst -> tryCvtToNumeric
+ 0 174829 4436207518230 5 inst <- tryCvtToNumeric
+ 0 174829 4436207518236 5 inst -> jumpFalse1
+ 0 174829 4436207518242 5 inst <- jumpFalse1
+ 0 174829 4436207518248 5 inst -> push1
+ 0 174829 4436207518253 5 inst <- push1
+ 0 174829 4436207518259 5 inst -> push1
+ 0 174829 4436207518264 5 inst <- push1
+ 0 174829 4436207518270 5 inst -> storeScalarStk
+ 0 174829 4436207518278 7 inst <- storeScalarStk
+ 0 174829 4436207518284 5 inst -> done
+ 0 174829 4436207518289 5 inst <- done
+ 0 174829 4436207518295 6 cmd <- if
+ 0 174829 4436207518315 19 cmd -> namespace
+ 0 174829 4436207518421 106 inst -> push1
+ 0 174829 4436207518428 6 inst <- push1
+ 0 174829 4436207518434 5 inst -> push1
+ 0 174829 4436207518440 5 inst <- push1
+ 0 174829 4436207518445 5 inst -> invokeStk1
+ 0 174829 4436207518452 6 cmd -> variable
+ 0 174829 4436207518460 8 cmd <- variable
+ 0 174829 4436207518466 6 inst <- invokeStk1
+ 0 174829 4436207518472 5 inst -> pop
+ 0 174829 4436207518477 5 inst <- pop
+ 0 174829 4436207518483 5 inst -> push1
+ 0 174829 4436207518489 5 inst <- push1
+ 0 174829 4436207518494 5 inst -> push1
+ 0 174829 4436207518500 5 inst <- push1
+ 0 174829 4436207518506 5 inst -> invokeStk1
+ 0 174829 4436207518513 7 cmd -> info
+ 0 174829 4436207518526 13 cmd <- info
+ 0 174829 4436207518532 6 inst <- invokeStk1
+ 0 174829 4436207518538 5 inst -> push1
+ 0 174829 4436207518544 5 inst <- push1
+ 0 174829 4436207518549 5 inst -> strneq
+ 0 174829 4436207518555 6 inst <- strneq
+ 0 174829 4436207518561 5 inst -> push1
+ 0 174829 4436207518567 5 inst <- push1
+ 0 174829 4436207518573 5 inst -> push1
+ 0 174829 4436207518578 5 inst <- push1
+ 0 174829 4436207518584 5 inst -> push1
+ 0 174829 4436207518589 5 inst <- push1
+ 0 174829 4436207518595 5 inst -> push1
+ 0 174829 4436207518600 5 inst <- push1
+ 0 174829 4436207518606 5 inst -> push1
+ 0 174829 4436207518612 5 inst <- push1
+ 0 174829 4436207518617 5 inst -> invokeStk1
+ 0 174829 4436207518624 6 cmd -> info
+ 0 174829 4436207518631 7 cmd <- info
+ 0 174829 4436207518637 6 inst <- invokeStk1
+ 0 174829 4436207518643 5 inst -> push1
+ 0 174829 4436207518648 5 inst <- push1
+ 0 174829 4436207518654 5 inst -> push1
+ 0 174829 4436207518660 5 inst <- push1
+ 0 174829 4436207518665 5 inst -> push1
+ 0 174829 4436207518671 5 inst <- push1
+ 0 174829 4436207518677 5 inst -> push1
+ 0 174829 4436207518682 5 inst <- push1
+ 0 174829 4436207518688 5 inst -> invokeStk1
+ 0 174829 4436207518694 6 cmd -> info
+ 0 174829 4436207518701 7 cmd <- info
+ 0 174829 4436207518707 6 inst <- invokeStk1
+ 0 174829 4436207518713 5 inst -> invokeStk1
+ 0 174829 4436207518720 7 cmd -> file
+ 0 174829 4436207518741 20 cmd <- file
+ 0 174829 4436207518748 6 inst <- invokeStk1
+ 0 174829 4436207518753 5 inst -> invokeStk1
+ 0 174829 4436207518760 6 cmd -> list
+ 0 174829 4436207518768 8 cmd <- list
+ 0 174829 4436207518774 6 inst <- invokeStk1
+ 0 174829 4436207518780 5 inst -> push1
+ 0 174829 4436207518786 5 inst <- push1
+ 0 174829 4436207518791 5 inst -> invokeStk1
+ 0 174829 4436207518798 6 cmd -> foreach
+ 0 174829 4436207518821 23 inst -> push1
+ 0 174829 4436207518827 6 inst <- push1
+ 0 174829 4436207518833 5 inst -> push1
+ 0 174829 4436207518839 5 inst <- push1
+ 0 174829 4436207518844 5 inst -> push1
+ 0 174829 4436207518850 5 inst <- push1
+ 0 174829 4436207518856 5 inst -> loadScalarStk
+ 0 174829 4436207518862 6 inst <- loadScalarStk
+ 0 174829 4436207518868 5 inst -> push1
+ 0 174829 4436207518874 5 inst <- push1
+ 0 174829 4436207518879 5 inst -> loadScalarStk
+ 0 174829 4436207518886 6 inst <- loadScalarStk
+ 0 174829 4436207518892 5 inst -> invokeStk1
+ 0 174829 4436207518898 6 cmd -> lsearch
+ 0 174829 4436207518906 8 cmd <- lsearch
+ 0 174829 4436207518913 6 inst <- invokeStk1
+ 0 174829 4436207518918 5 inst -> push1
+ 0 174829 4436207518924 5 inst <- push1
+ 0 174829 4436207518930 5 inst -> lt
+ 0 174829 4436207518936 6 inst <- lt
+ 0 174829 4436207518942 5 inst -> push1
+ 0 174829 4436207518947 5 inst <- push1
+ 0 174829 4436207518953 5 inst -> push1
+ 0 174829 4436207518958 5 inst <- push1
+ 0 174829 4436207518964 5 inst -> push1
+ 0 174829 4436207518969 5 inst <- push1
+ 0 174829 4436207518975 5 inst -> loadScalarStk
+ 0 174829 4436207518981 6 inst <- loadScalarStk
+ 0 174829 4436207518987 5 inst -> invokeStk1
+ 0 174829 4436207518993 6 cmd -> lappend
+ 0 174829 4436207519002 8 cmd <- lappend
+ 0 174829 4436207519008 6 inst <- invokeStk1
+ 0 174829 4436207519013 5 inst -> jump1
+ 0 174829 4436207519019 5 inst <- jump1
+ 0 174829 4436207519025 5 inst -> done
+ 0 174829 4436207519030 5 inst <- done
+ 0 174829 4436207519038 8 inst -> push1
+ 0 174829 4436207519044 5 inst <- push1
+ 0 174829 4436207519050 5 inst -> push1
+ 0 174829 4436207519055 5 inst <- push1
+ 0 174829 4436207519061 5 inst -> push1
+ 0 174829 4436207519066 5 inst <- push1
+ 0 174829 4436207519072 5 inst -> loadScalarStk
+ 0 174829 4436207519078 5 inst <- loadScalarStk
+ 0 174829 4436207519084 5 inst -> push1
+ 0 174829 4436207519090 5 inst <- push1
+ 0 174829 4436207519095 5 inst -> loadScalarStk
+ 0 174829 4436207519102 6 inst <- loadScalarStk
+ 0 174829 4436207519108 5 inst -> invokeStk1
+ 0 174829 4436207519114 6 cmd -> lsearch
+ 0 174829 4436207519120 6 cmd <- lsearch
+ 0 174829 4436207519126 5 inst <- invokeStk1
+ 0 174829 4436207519132 5 inst -> push1
+ 0 174829 4436207519138 5 inst <- push1
+ 0 174829 4436207519143 5 inst -> lt
+ 0 174829 4436207519149 5 inst <- lt
+ 0 174829 4436207519155 5 inst -> push1
+ 0 174829 4436207519160 5 inst <- push1
+ 0 174829 4436207519166 5 inst -> push1
+ 0 174829 4436207519171 5 inst <- push1
+ 0 174829 4436207519177 5 inst -> push1
+ 0 174829 4436207519182 5 inst <- push1
+ 0 174829 4436207519188 5 inst -> loadScalarStk
+ 0 174829 4436207519194 5 inst <- loadScalarStk
+ 0 174829 4436207519200 5 inst -> invokeStk1
+ 0 174829 4436207519206 6 cmd -> lappend
+ 0 174829 4436207519213 7 cmd <- lappend
+ 0 174829 4436207519219 6 inst <- invokeStk1
+ 0 174829 4436207519225 5 inst -> jump1
+ 0 174829 4436207519231 5 inst <- jump1
+ 0 174829 4436207519236 5 inst -> done
+ 0 174829 4436207519242 5 inst <- done
+ 0 174829 4436207519248 6 cmd <- foreach
+ 0 174829 4436207519255 6 inst <- invokeStk1
+ 0 174829 4436207519260 5 inst -> jump1
+ 0 174829 4436207519266 5 inst <- jump1
+ 0 174829 4436207519272 5 inst -> pop
+ 0 174829 4436207519277 5 inst <- pop
+ 0 174829 4436207519283 5 inst -> push1
+ 0 174829 4436207519288 5 inst <- push1
+ 0 174829 4436207519294 5 inst -> push1
+ 0 174829 4436207519300 5 inst <- push1
+ 0 174829 4436207519305 5 inst -> push1
+ 0 174829 4436207519311 5 inst <- push1
+ 0 174829 4436207519316 5 inst -> push1
+ 0 174829 4436207519322 5 inst <- push1
+ 0 174829 4436207519328 5 inst -> push1
+ 0 174829 4436207519333 5 inst <- push1
+ 0 174829 4436207519339 5 inst -> push1
+ 0 174829 4436207519344 5 inst <- push1
+ 0 174829 4436207519350 5 inst -> push1
+ 0 174829 4436207519356 5 inst <- push1
+ 0 174829 4436207519362 5 inst -> push1
+ 0 174829 4436207519367 5 inst <- push1
+ 0 174829 4436207519373 5 inst -> push1
+ 0 174829 4436207519378 5 inst <- push1
+ 0 174829 4436207519384 5 inst -> invokeStk1
+ 0 174829 4436207519390 6 cmd -> info
+ 0 174829 4436207519399 8 cmd <- info
+ 0 174829 4436207519405 5 inst <- invokeStk1
+ 0 174829 4436207519411 5 inst -> invokeStk1
+ 0 174829 4436207519417 6 cmd -> file
+ 0 174829 4436207519435 18 cmd <- file
+ 0 174829 4436207519442 6 inst <- invokeStk1
+ 0 174829 4436207519448 5 inst -> invokeStk1
+ 0 174829 4436207519454 6 cmd -> file
+ 0 174829 4436207519471 17 cmd <- file
+ 0 174829 4436207519478 6 inst <- invokeStk1
+ 0 174829 4436207519484 5 inst -> push1
+ 0 174829 4436207519490 5 inst <- push1
+ 0 174829 4436207519495 5 inst -> invokeStk1
+ 0 174829 4436207519502 6 cmd -> file
+ 0 174829 4436207519512 9 cmd <- file
+ 0 174829 4436207519518 6 inst <- invokeStk1
+ 0 174829 4436207519524 5 inst -> storeScalarStk
+ 0 174829 4436207519530 6 inst <- storeScalarStk
+ 0 174829 4436207519536 6 inst -> push1
+ 0 174829 4436207519542 5 inst <- push1
+ 0 174829 4436207519547 5 inst -> push1
+ 0 174829 4436207519553 5 inst <- push1
+ 0 174829 4436207519559 5 inst -> push1
+ 0 174829 4436207519564 5 inst <- push1
+ 0 174829 4436207519570 5 inst -> loadScalarStk
+ 0 174829 4436207519576 6 inst <- loadScalarStk
+ 0 174829 4436207519582 5 inst -> push1
+ 0 174829 4436207519587 5 inst <- push1
+ 0 174829 4436207519593 5 inst -> loadScalarStk
+ 0 174829 4436207519599 5 inst <- loadScalarStk
+ 0 174829 4436207519605 5 inst -> invokeStk1
+ 0 174829 4436207519611 6 cmd -> lsearch
+ 0 174829 4436207519617 6 cmd <- lsearch
+ 0 174829 4436207519623 6 inst <- invokeStk1
+ 0 174829 4436207519629 5 inst -> push1
+ 0 174829 4436207519635 5 inst <- push1
+ 0 174829 4436207519640 5 inst -> lt
+ 0 174829 4436207519646 5 inst <- lt
+ 0 174829 4436207519652 5 inst -> push1
+ 0 174829 4436207519657 5 inst <- push1
+ 0 174829 4436207519663 5 inst -> push1
+ 0 174829 4436207519668 5 inst <- push1
+ 0 174829 4436207519674 5 inst -> push1
+ 0 174829 4436207519679 5 inst <- push1
+ 0 174829 4436207519685 5 inst -> loadScalarStk
+ 0 174829 4436207519691 5 inst <- loadScalarStk
+ 0 174829 4436207519697 5 inst -> invokeStk1
+ 0 174829 4436207519703 6 cmd -> lappend
+ 0 174829 4436207519710 6 cmd <- lappend
+ 0 174829 4436207519716 6 inst <- invokeStk1
+ 0 174829 4436207519722 5 inst -> jump1
+ 0 174829 4436207519727 5 inst <- jump1
+ 0 174829 4436207519733 5 inst -> pop
+ 0 174829 4436207519739 5 inst <- pop
+ 0 174829 4436207519744 5 inst -> push1
+ 0 174829 4436207519750 5 inst <- push1
+ 0 174829 4436207519756 5 inst -> push1
+ 0 174829 4436207519761 5 inst <- push1
+ 0 174829 4436207519767 5 inst -> push1
+ 0 174829 4436207519772 5 inst <- push1
+ 0 174829 4436207519778 5 inst -> invokeStk1
+ 0 174829 4436207519784 6 cmd -> info
+ 0 174829 4436207519791 6 cmd <- info
+ 0 174829 4436207519797 6 inst <- invokeStk1
+ 0 174829 4436207519803 5 inst -> tryCvtToNumeric
+ 0 174829 4436207519809 5 inst <- tryCvtToNumeric
+ 0 174829 4436207519815 5 inst -> jumpFalse1
+ 0 174829 4436207519820 5 inst <- jumpFalse1
+ 0 174829 4436207519826 5 inst -> push1
+ 0 174829 4436207519832 5 inst <- push1
+ 0 174829 4436207519837 5 inst -> push1
+ 0 174829 4436207519843 5 inst <- push1
+ 0 174829 4436207519849 5 inst -> push1
+ 0 174829 4436207519854 5 inst <- push1
+ 0 174829 4436207519860 5 inst -> loadScalarStk
+ 0 174829 4436207519866 6 inst <- loadScalarStk
+ 0 174829 4436207519872 5 inst -> push1
+ 0 174829 4436207519877 5 inst <- push1
+ 0 174829 4436207519883 5 inst -> invokeStk1
+ 0 174829 4436207519889 6 cmd -> foreach
+ 0 174829 4436207519899 9 inst -> push1
+ 0 174829 4436207519904 5 inst <- push1
+ 0 174829 4436207519910 5 inst -> push1
+ 0 174829 4436207519915 5 inst <- push1
+ 0 174829 4436207519921 5 inst -> push1
+ 0 174829 4436207519927 5 inst <- push1
+ 0 174829 4436207519932 5 inst -> loadScalarStk
+ 0 174829 4436207519938 6 inst <- loadScalarStk
+ 0 174829 4436207519944 5 inst -> push1
+ 0 174829 4436207519950 5 inst <- push1
+ 0 174829 4436207519955 5 inst -> loadScalarStk
+ 0 174829 4436207519962 6 inst <- loadScalarStk
+ 0 174829 4436207519968 5 inst -> invokeStk1
+ 0 174829 4436207519974 6 cmd -> lsearch
+ 0 174829 4436207519980 6 cmd <- lsearch
+ 0 174829 4436207519986 6 inst <- invokeStk1
+ 0 174829 4436207519992 5 inst -> push1
+ 0 174829 4436207519998 5 inst <- push1
+ 0 174829 4436207520003 5 inst -> lt
+ 0 174829 4436207520009 5 inst <- lt
+ 0 174829 4436207520015 5 inst -> push1
+ 0 174829 4436207520020 5 inst <- push1
+ 0 174829 4436207520026 5 inst -> push1
+ 0 174829 4436207520031 5 inst <- push1
+ 0 174829 4436207520037 5 inst -> push1
+ 0 174829 4436207520043 5 inst <- push1
+ 0 174829 4436207520048 5 inst -> loadScalarStk
+ 0 174829 4436207520054 5 inst <- loadScalarStk
+ 0 174829 4436207520060 5 inst -> invokeStk1
+ 0 174829 4436207520066 6 cmd -> lappend
+ 0 174829 4436207520073 6 cmd <- lappend
+ 0 174829 4436207520079 5 inst <- invokeStk1
+ 0 174829 4436207520085 5 inst -> jump1
+ 0 174829 4436207520090 5 inst <- jump1
+ 0 174829 4436207520096 5 inst -> done
+ 0 174829 4436207520102 5 inst <- done
+ 0 174829 4436207520108 6 cmd <- foreach
+ 0 174829 4436207520114 5 inst <- invokeStk1
+ 0 174829 4436207520119 5 inst -> jump1
+ 0 174829 4436207520125 5 inst <- jump1
+ 0 174829 4436207520131 5 inst -> done
+ 0 174829 4436207520136 5 inst <- done
+ 0 174829 4436207520143 6 cmd <- namespace
+ 0 174829 4436207520171 28 cmd -> if
+ 0 174829 4436207520192 20 inst -> push1
+ 0 174829 4436207520198 6 inst <- push1
+ 0 174829 4436207520203 5 inst -> push1
+ 0 174829 4436207520209 5 inst <- push1
+ 0 174829 4436207520215 5 inst -> invokeStk1
+ 0 174829 4436207520221 6 cmd -> interp
+ 0 174829 4436207520230 9 cmd <- interp
+ 0 174829 4436207520236 5 inst <- invokeStk1
+ 0 174829 4436207520242 5 inst -> not
+ 0 174829 4436207520247 5 inst <- not
+ 0 174829 4436207520253 5 inst -> jumpTrue1
+ 0 174829 4436207520259 5 inst <- jumpTrue1
+ 0 174829 4436207520265 5 inst -> push1
+ 0 174829 4436207520270 5 inst <- push1
+ 0 174829 4436207520276 5 inst -> dup
+ 0 174829 4436207520281 5 inst <- dup
+ 0 174829 4436207520287 5 inst -> jumpFalse1
+ 0 174829 4436207520293 5 inst <- jumpFalse1
+ 0 174829 4436207520298 5 inst -> push1
+ 0 174829 4436207520304 5 inst <- push1
+ 0 174829 4436207520310 5 inst -> push1
+ 0 174829 4436207520315 5 inst <- push1
+ 0 174829 4436207520321 5 inst -> loadArrayStk
+ 0 174829 4436207520328 6 inst <- loadArrayStk
+ 0 174829 4436207520334 5 inst -> push1
+ 0 174829 4436207520339 5 inst <- push1
+ 0 174829 4436207520345 5 inst -> streq
+ 0 174829 4436207520351 5 inst <- streq
+ 0 174829 4436207520357 5 inst -> land
+ 0 174829 4436207520363 6 inst <- land
+ 0 174829 4436207520368 5 inst -> done
+ 0 174829 4436207520374 5 inst <- done
+ 0 174829 4436207520381 6 cmd <- if
+ 0 174829 4436207520394 13 cmd -> package
+ 0 174829 4436207520401 6 cmd <- package
+ 0 174829 4436207520413 11 cmd -> if
+ 0 174829 4436207520424 11 inst -> push1
+ 0 174829 4436207520429 5 inst <- push1
+ 0 174829 4436207520435 5 inst -> push1
+ 0 174829 4436207520441 5 inst <- push1
+ 0 174829 4436207520446 5 inst -> invokeStk1
+ 0 174829 4436207520453 6 cmd -> interp
+ 0 174829 4436207520459 6 cmd <- interp
+ 0 174829 4436207520465 5 inst <- invokeStk1
+ 0 174829 4436207520471 5 inst -> not
+ 0 174829 4436207520476 5 inst <- not
+ 0 174829 4436207520482 5 inst -> done
+ 0 174829 4436207520488 5 inst <- done
+ 0 174829 4436207520527 39 inst -> push1
+ 0 174829 4436207520533 5 inst <- push1
+ 0 174829 4436207520539 5 inst -> push1
+ 0 174829 4436207520544 5 inst <- push1
+ 0 174829 4436207520550 5 inst -> loadArrayStk
+ 0 174829 4436207520557 6 inst <- loadArrayStk
+ 0 174829 4436207520563 5 inst -> push1
+ 0 174829 4436207520568 5 inst <- push1
+ 0 174829 4436207520574 5 inst -> streq
+ 0 174829 4436207520580 5 inst <- streq
+ 0 174829 4436207520586 5 inst -> push1
+ 0 174829 4436207520591 5 inst <- push1
+ 0 174829 4436207520597 5 inst -> dup
+ 0 174829 4436207520602 5 inst <- dup
+ 0 174829 4436207520608 5 inst -> jumpFalse1
+ 0 174829 4436207520614 5 inst <- jumpFalse1
+ 0 174829 4436207520619 5 inst -> push1
+ 0 174829 4436207520625 5 inst <- push1
+ 0 174829 4436207520631 5 inst -> push1
+ 0 174829 4436207520636 5 inst <- push1
+ 0 174829 4436207520642 5 inst -> loadArrayStk
+ 0 174829 4436207520648 6 inst <- loadArrayStk
+ 0 174829 4436207520654 5 inst -> push1
+ 0 174829 4436207520660 5 inst <- push1
+ 0 174829 4436207520665 5 inst -> streq
+ 0 174829 4436207520671 5 inst <- streq
+ 0 174829 4436207520677 5 inst -> land
+ 0 174829 4436207520682 5 inst <- land
+ 0 174829 4436207520688 5 inst -> jumpFalse1
+ 0 174829 4436207520694 5 inst <- jumpFalse1
+ 0 174829 4436207520700 5 inst -> push1
+ 0 174829 4436207520705 5 inst <- push1
+ 0 174829 4436207520711 5 inst -> pop
+ 0 174829 4436207520716 5 inst <- pop
+ 0 174829 4436207520722 5 inst -> push1
+ 0 174829 4436207520728 5 inst <- push1
+ 0 174829 4436207520733 5 inst -> push1
+ 0 174829 4436207520739 5 inst <- push1
+ 0 174829 4436207520744 5 inst -> loadArrayStk
+ 0 174829 4436207520751 6 inst <- loadArrayStk
+ 0 174829 4436207520757 5 inst -> push1
+ 0 174829 4436207520762 5 inst <- push1
+ 0 174829 4436207520768 5 inst -> streq
+ 0 174829 4436207520773 5 inst <- streq
+ 0 174829 4436207520779 5 inst -> push1
+ 0 174829 4436207520785 5 inst <- push1
+ 0 174829 4436207520791 5 inst -> done
+ 0 174829 4436207520796 5 inst <- done
+ 0 174829 4436207520802 6 cmd <- if
+ 0 174829 4436207520822 19 cmd -> if
+ 0 174829 4436207520835 13 inst -> push1
+ 0 174829 4436207520841 5 inst <- push1
+ 0 174829 4436207520847 5 inst -> push1
+ 0 174829 4436207520852 5 inst <- push1
+ 0 174829 4436207520858 5 inst -> push1
+ 0 174829 4436207520864 5 inst <- push1
+ 0 174829 4436207520869 5 inst -> push1
+ 0 174829 4436207520875 5 inst <- push1
+ 0 174829 4436207520881 5 inst -> invokeStk1
+ 0 174829 4436207520887 6 cmd -> namespace
+ 0 174829 4436207520896 8 cmd <- namespace
+ 0 174829 4436207520902 6 inst <- invokeStk1
+ 0 174829 4436207520908 5 inst -> push1
+ 0 174829 4436207520913 5 inst <- push1
+ 0 174829 4436207520919 5 inst -> streq
+ 0 174829 4436207520925 6 inst <- streq
+ 0 174829 4436207520931 5 inst -> done
+ 0 174829 4436207520936 5 inst <- done
+ 0 174829 4436207520942 6 cmd <- if
+ 0 174829 4436207521503 560 cmd -> set
+ 0 174829 4436207521515 11 cmd <- set
+ 0 174829 4436207521524 9 cmd -> set
+ 0 174829 4436207521531 6 cmd <- set
+ 0 174829 4436207521541 10 cmd -> if
+ 0 174829 4436207521559 17 inst -> push1
+ 0 174829 4436207521566 7 inst <- push1
+ 0 174829 4436207521573 6 inst -> push1
+ 0 174829 4436207521578 5 inst <- push1
+ 0 174829 4436207521584 5 inst -> push1
+ 0 174829 4436207521590 5 inst <- push1
+ 0 174829 4436207521596 5 inst -> push1
+ 0 174829 4436207521601 5 inst <- push1
+ 0 174829 4436207521607 5 inst -> invokeStk1
+ 0 174829 4436207521613 6 cmd -> namespace
+ 0 174829 4436207521621 7 cmd <- namespace
+ 0 174829 4436207521627 6 inst <- invokeStk1
+ 0 174829 4436207521633 5 inst -> push1
+ 0 174829 4436207521639 5 inst <- push1
+ 0 174829 4436207521644 5 inst -> streq
+ 0 174829 4436207521650 5 inst <- streq
+ 0 174829 4436207521656 5 inst -> done
+ 0 174829 4436207521662 5 inst <- done
+ 0 174829 4436207521674 11 inst -> push1
+ 0 174829 4436207521679 5 inst <- push1
+ 0 174829 4436207521685 5 inst -> push1
+ 0 174829 4436207521691 5 inst <- push1
+ 0 174829 4436207521697 5 inst -> push1
+ 0 174829 4436207521702 5 inst <- push1
+ 0 174829 4436207521708 5 inst -> push1
+ 0 174829 4436207521714 5 inst <- push1
+ 0 174829 4436207521720 5 inst -> invokeStk1
+ 0 174829 4436207521726 6 cmd -> proc
+ 0 174829 4436207521738 12 cmd <- proc
+ 0 174829 4436207521744 6 inst <- invokeStk1
+ 0 174829 4436207521750 5 inst -> done
+ 0 174829 4436207521756 5 inst <- done
+ 0 174829 4436207521762 6 cmd <- if
+ 0 174829 4436207521862 99 cmd -> proc
+ 0 174829 4436207521872 10 cmd <- proc
+ 0 174829 4436207521891 19 cmd -> proc
+ 0 174829 4436207521902 10 cmd <- proc
+ 0 174829 4436207521932 30 cmd -> proc
+ 0 174829 4436207521941 8 cmd <- proc
+ 0 174829 4436207521961 19 cmd -> proc
+ 0 174829 4436207521970 9 cmd <- proc
+ 0 174829 4436207521985 14 cmd -> proc
+ 0 174829 4436207521994 8 cmd <- proc
+ 0 174829 4436207522039 45 cmd -> if
+ 0 174829 4436207522053 14 inst -> push1
+ 0 174829 4436207522059 5 inst <- push1
+ 0 174829 4436207522065 6 inst -> push1
+ 0 174829 4436207522070 5 inst <- push1
+ 0 174829 4436207522076 5 inst -> loadArrayStk
+ 0 174829 4436207522083 7 inst <- loadArrayStk
+ 0 174829 4436207522089 5 inst -> push1
+ 0 174829 4436207522094 5 inst <- push1
+ 0 174829 4436207522100 5 inst -> streq
+ 0 174829 4436207522106 5 inst <- streq
+ 0 174829 4436207522112 5 inst -> done
+ 0 174829 4436207522117 5 inst <- done
+ 0 174829 4436207522134 16 inst -> push1
+ 0 174829 4436207522140 5 inst <- push1
+ 0 174829 4436207522146 5 inst -> push1
+ 0 174829 4436207522151 5 inst <- push1
+ 0 174829 4436207522157 5 inst -> push1
+ 0 174829 4436207522163 5 inst <- push1
+ 0 174829 4436207522168 5 inst -> push1
+ 0 174829 4436207522174 5 inst <- push1
+ 0 174829 4436207522180 5 inst -> invokeStk1
+ 0 174829 4436207522186 6 cmd -> proc
+ 0 174829 4436207522205 19 cmd <- proc
+ 0 174829 4436207522212 6 inst <- invokeStk1
+ 0 174829 4436207522218 5 inst -> done
+ 0 174829 4436207522223 5 inst <- done
+ 0 174829 4436207522230 6 cmd <- if
+ 0 174829 4436207522274 44 cmd -> proc
+ 0 174829 4436207522286 11 cmd <- proc
+ 0 174829 4436207522294 8 cmd <- source
+ 0 174829 4436207522301 6 cmd <- uplevel
+ 0 174829 4436207522307 6 inst <- invokeStk1
+ 0 174829 4436207522313 6 inst -> storeScalar1
+ 0 174829 4436207522319 5 inst <- storeScalar1
+ 0 174829 4436207522325 5 inst -> push1
+ 0 174829 4436207522331 5 inst <- push1
+ 0 174829 4436207522337 5 inst -> jump1
+ 0 174829 4436207522342 5 inst <- jump1
+ 0 174829 4436207522348 5 inst -> endCatch
+ 0 174829 4436207522354 5 inst <- endCatch
+ 0 174829 4436207522360 5 inst -> not
+ 0 174829 4436207522366 5 inst <- not
+ 0 174829 4436207522371 5 inst -> jumpFalse1
+ 0 174829 4436207522377 5 inst <- jumpFalse1
+ 0 174829 4436207522383 5 inst -> push1
+ 0 174829 4436207522389 5 inst <- push1
+ 0 174829 4436207522394 5 inst -> done
+ 0 174829 4436207522400 5 inst <- done
+ 0 174829 4436207522409 8 proc <- tclInit
+ 0 174829 4436207522426 17 cmd <- tclInit
+ 0 174829 4436207522671 245 cmd -> proc
+ 0 174829 4436207522681 9 cmd <- proc
+ 0 174829 4436207522691 9 cmd -> proc
+ 0 174829 4436207522698 7 cmd <- proc
+ 0 174829 4436207522708 9 cmd -> proc
+ 0 174829 4436207522715 7 cmd <- proc
+ 0 174829 4436207522723 8 cmd -> func_a
+ 0 174829 4436207522742 18 proc -> func_a
+ 0 174829 4436207522752 10 inst -> push1
+ 0 174829 4436207522757 5 inst <- push1
+ 0 174829 4436207522763 5 inst -> push1
+ 0 174829 4436207522769 5 inst <- push1
+ 0 174829 4436207522775 5 inst -> invokeStk1
+ 0 174829 4436207522781 6 cmd -> puts
+ 0 174829 4436207523212 430 cmd <- puts
+ 0 174829 4436207523266 54 inst <- invokeStk1
+ 0 174829 4436207523275 8 inst -> pop
+ 0 174829 4436207523281 6 inst <- pop
+ 0 174829 4436207523287 5 inst -> push1
+ 0 174829 4436207523292 5 inst <- push1
+ 0 174829 4436207523298 5 inst -> push1
+ 0 174829 4436207523304 5 inst <- push1
+ 0 174829 4436207523310 5 inst -> invokeStk1
+ 0 174829 4436207523318 7 cmd -> after
+ 0 174829 4436208530951 1007632 cmd <- after
+ 0 174829 4436208530972 21 inst <- invokeStk1
+ 0 174829 4436208530984 12 inst -> pop
+ 0 174829 4436208530993 9 inst <- pop
+ 0 174829 4436208530999 5 inst -> push1
+ 0 174829 4436208531005 5 inst <- push1
+ 0 174829 4436208531010 5 inst -> invokeStk1
+ 0 174829 4436208531021 10 cmd -> func_b
+ 0 174829 4436208531057 35 proc -> func_b
+ 0 174829 4436208531067 10 inst -> push1
+ 0 174829 4436208531073 5 inst <- push1
+ 0 174829 4436208531079 5 inst -> push1
+ 0 174829 4436208531084 5 inst <- push1
+ 0 174829 4436208531090 5 inst -> invokeStk1
+ 0 174829 4436208531096 6 cmd -> puts
+ 0 174829 4436208531137 40 cmd <- puts
+ 0 174829 4436208531144 6 inst <- invokeStk1
+ 0 174829 4436208531150 5 inst -> pop
+ 0 174829 4436208531155 5 inst <- pop
+ 0 174829 4436208531161 5 inst -> push1
+ 0 174829 4436208531166 5 inst <- push1
+ 0 174829 4436208531172 5 inst -> push1
+ 0 174829 4436208531178 5 inst <- push1
+ 0 174829 4436208531184 5 inst -> invokeStk1
+ 0 174829 4436208531190 6 cmd -> after
+ 0 174829 4436209540924 1009734 cmd <- after
+ 0 174829 4436209540946 21 inst <- invokeStk1
+ 0 174829 4436209540957 11 inst -> pop
+ 0 174829 4436209540967 9 inst <- pop
+ 0 174829 4436209540973 5 inst -> push1
+ 0 174829 4436209540978 5 inst <- push1
+ 0 174829 4436209540984 5 inst -> invokeStk1
+ 0 174829 4436209540995 10 cmd -> func_c
+ 0 174829 4436209541029 34 proc -> func_c
+ 0 174829 4436209541039 10 inst -> push1
+ 0 174829 4436209541045 5 inst <- push1
+ 0 174829 4436209541051 5 inst -> push1
+ 0 174829 4436209541056 5 inst <- push1
+ 0 174829 4436209541062 5 inst -> invokeStk1
+ 0 174829 4436209541068 6 cmd -> puts
+ 0 174829 4436209541111 42 cmd <- puts
+ 0 174829 4436209541118 7 inst <- invokeStk1
+ 0 174829 4436209541124 5 inst -> pop
+ 0 174829 4436209541129 5 inst <- pop
+ 0 174829 4436209541135 5 inst -> push1
+ 0 174829 4436209541141 5 inst <- push1
+ 0 174829 4436209541147 5 inst -> push1
+ 0 174829 4436209541153 5 inst <- push1
+ 0 174829 4436209541158 5 inst -> invokeStk1
+ 0 174829 4436209541165 6 cmd -> after
+ 0 174829 4436210550785 1009619 cmd <- after
+ 0 174829 4436210550807 22 inst <- invokeStk1
+ 0 174829 4436210550819 11 inst -> done
+ 0 174829 4436210550830 10 inst <- done
+ 0 174829 4436210550839 9 proc <- func_c
+ 0 174829 4436210550850 11 cmd <- func_c
+ 0 174829 4436210550856 6 inst <- invokeStk1
+ 0 174829 4436210550862 5 inst -> done
+ 0 174829 4436210550868 5 inst <- done
+ 0 174829 4436210550874 6 proc <- func_b
+ 0 174829 4436210550880 6 cmd <- func_b
+ 0 174829 4436210550887 6 inst <- invokeStk1
+ 0 174829 4436210550892 5 inst -> done
+ 0 174829 4436210550898 5 inst <- done
+ 0 174829 4436210550904 6 proc <- func_a
+ 0 174829 4436210550911 6 cmd <- func_a
+ 0 174829 4436210550938 27 cmd -> exit
+
+As you can see the output is quite long, and in seven columns. The first
+column is the CPU the action is on. The second is the PID. The third is the
+time since boot in microseconds.
+
+The fourth column is the number of microseconds that has elapsed between the
+previous line and the current one.
+
+The fifth column is the type of event that occurred (procedure, command or
+instruction).
+
+The sixth and seventh columns are indented by 2 spaces to show when a new
+event occurs. This shows us which command is calling which.
+
+If the output looks strange, check the CPU "C" column - if it changes,
+then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for
+details and suggested workarounds.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/tcl_proccalls_example.txt b/Examples/tcl_proccalls_example.txt
new file mode 100644
index 000000000000..ed6820dddfb7
--- /dev/null
+++ b/Examples/tcl_proccalls_example.txt
@@ -0,0 +1,17 @@
+Following are examples of running tcl_proccalls.d.
+
+The output shows what happens when the code from Code/Tcl/func_abc.tcl is
+traced.
+
+# tcl_proccalls.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID COUNT PROCEDURE
+ 16078 1 func_a
+ 16078 1 func_b
+ 16078 1 func_c
+ 16078 1 tclInit
+
+This simple output shows that PID 16078 was responsible for four procedures
+beginning, one each of func_a, func_b, func_c, and tclInit.
+
diff --git a/Examples/tcl_procflow_example.txt b/Examples/tcl_procflow_example.txt
new file mode 100644
index 000000000000..93b822ec3eb6
--- /dev/null
+++ b/Examples/tcl_procflow_example.txt
@@ -0,0 +1,29 @@
+The following are examples of tcl_procflow.d.
+
+This is a simple script to trace the flow of Tcl procedures.
+
+Here it traces the example program, Code/Tcl/func_abc.tcl.
+
+# tcl_procflow.d
+ C PID TIME(us) -- PROCEDURE
+ 0 16073 3904971507502 -> tclInit
+ 0 16073 3904971509096 <- tclInit
+ 0 16073 3904971509305 -> func_a
+ 0 16073 3904972511039 -> func_b
+ 0 16073 3904973521023 -> func_c
+ 0 16073 3904974530998 <- func_c
+ 0 16073 3904974531008 <- func_b
+ 0 16073 3904974531014 <- func_a
+^C
+
+As each procedure starts, the third column is indented by 2 spaces. This
+shows which procedure is calling which - the output above begins with an init
+procedure and then shows that func_a began, and then called func_b.
+
+The columns are CPU, PID, Time since boot, indicator and procedure name.
+
+If the output looks shuffled, check the CPU "C" and "TIME" columns, and
+post sort based on TIME if necessary.
+
+See Notes/ALLflow_notes.txt for important notes about reading flow outputs.
+
diff --git a/Examples/tcl_stat_example.txt b/Examples/tcl_stat_example.txt
new file mode 100644
index 000000000000..178fef10b197
--- /dev/null
+++ b/Examples/tcl_stat_example.txt
@@ -0,0 +1,24 @@
+Following are examples of running tcl_stat.d on Tcl programs.
+
+tcl_stat.d shows you the number of events per second that have happened since
+the last line output. The default interval is 1 second, but you can specify
+other intervals as arguments to the script.
+
+This shows the sh_stat.d script reflecting the Code/Tcl/func_abc.tcl program.
+
+# tcl_stat.d
+TIME EXEC/s PROC/s CMD/s OBJNEW/s OBJFRE/s OP/s
+2007 Sep 26 23:34:36 0 0 0 0 0 0
+2007 Sep 26 23:34:37 1 2 75 911 805 377
+2007 Sep 26 23:34:38 0 1 3 4 2 10
+2007 Sep 26 23:34:39 0 1 3 3 2 10
+2007 Sep 26 23:34:40 0 0 1 7 8 3
+2007 Sep 26 23:34:41 0 0 0 0 0 0
+2007 Sep 26 23:34:42 0 0 0 0 0 0
+^C
+
+ At 2007 Sep 26 23:34:37 we can see that there was one Tcl program executed
+(this number may include those programs without Tcl provider support), two
+procedures called, 75 new commands created, 911 objects created, 805 objects
+freed, and 377 bytecode operations.
+
diff --git a/Examples/tcl_syscalls_example.txt b/Examples/tcl_syscalls_example.txt
new file mode 100644
index 000000000000..5553b1c6a8c4
--- /dev/null
+++ b/Examples/tcl_syscalls_example.txt
@@ -0,0 +1,66 @@
+The following are examples of sh_syscalls.d.
+
+This is a simple script to count Tcl commands, procedures and system calls.
+
+Here we trace an example program - Code/Tcl/func_abc.tcl.
+
+# tcl_syscalls.d -c './tclsh func_abc.tcl '
+Tracing... Hit Ctrl-C to end.
+Function A
+Function B
+Function C
+ PID TYPE NAME COUNT
+ 16580 cmd concat 1
+ 16580 cmd exit 1
+ 16580 cmd func_a 1
+ 16580 cmd func_b 1
+ 16580 cmd func_c 1
+ 16580 cmd list 1
+ 16580 cmd rename 1
+ 16580 cmd source 1
+ 16580 cmd tclInit 1
+ 16580 cmd unset 1
+ 16580 cmd uplevel 1
+ 16580 cmd variable 1
+ 16580 proc func_a 1
+ 16580 proc func_b 1
+ 16580 proc func_c 1
+ 16580 proc tclInit 1
+ 16580 syscall getpid 1
+ 16580 syscall getrlimit 1
+ 16580 syscall mmap 1
+ 16580 syscall munmap 1
+ 16580 syscall rexit 1
+ 16580 syscall sigaction 1
+ 16580 syscall sigpending 1
+ 16580 syscall sysi86 1
+ 16580 syscall uname 1
+ 16580 cmd foreach 2
+ 16580 cmd global 2
+ 16580 cmd interp 2
+ 16580 cmd package 2
+ 16580 cmd set 2
+ 16580 syscall setcontext 2
+ 16580 syscall stat64 2
+ 16580 syscall sysconfig 2
+ 16580 cmd after 3
+ 16580 cmd namespace 3
+ 16580 cmd puts 3
+ 16580 syscall pollsys 3
+ 16580 syscall write 3
+ 16580 cmd lappend 4
+ 16580 cmd lsearch 4
+ 16580 syscall close 5
+ 16580 syscall llseek 6
+ 16580 cmd if 8
+ 16580 cmd info 11
+ 16580 syscall read 11
+ 16580 cmd file 12
+ 16580 cmd proc 12
+ 16580 syscall fcntl 12
+ 16580 syscall ioctl 12
+ 16580 syscall open64 14
+ 16580 syscall resolvepath 25
+ 16580 syscall brk 27
+ 16580 syscall access 54
+
diff --git a/Examples/tcl_syscolors_example.txt b/Examples/tcl_syscolors_example.txt
new file mode 100644
index 000000000000..b5929867eab9
--- /dev/null
+++ b/Examples/tcl_syscolors_example.txt
@@ -0,0 +1,563 @@
+The following are examples of tcl_syscolors.d.
+
+This is a simple script to trace the flow of Tcl processes, Tcl commands and
+system calls made, and renders the output in color ("colour") using terminal
+escape sequences (which you can tweak by modifying the script).
+
+Here it traces the example program, Code/Tcl/func_abc.tcl.
+
+WARNING: This output is full of terminal escape sequences, so if you are
+trying to view this through an editor or web browser - it may look awful.
+Try viewing this using "more" (although, depending on your terminal, it
+still may look awful).
+
+# tcl_syscolors.d -c './tclsh func_abc.tcl
+Function A
+ C PID DELTA(us) TYPE -- NAME
+ 0 16624 2 syscall -> munmap
+ 0 16624 31 syscall <- munmap
+ 0 16624 52 syscall -> mmap
+ 0 16624 21 syscall <- mmap
+ 0 16624 38 syscall -> setcontext
+ 0 16624 8 syscall <- setcontext
+ 0 16624 8 syscall -> getrlimit
+ 0 16624 9 syscall <- getrlimit
+ 0 16624 8 syscall -> getpid
+ 0 16624 7 syscall <- getpid
+ 0 16624 68 syscall -> setcontext
+ 0 16624 7 syscall <- setcontext
+ 0 16624 177 syscall -> sigpending
+ 0 16624 8 syscall <- sigpending
+ 0 16624 88 syscall -> sysconfig
+ 0 16624 7 syscall <- sysconfig
+ 0 16624 107 syscall -> open64
+ 0 16624 115 syscall <- open64
+ 0 16624 13 syscall -> ioctl
+ 0 16624 64 syscall <- ioctl
+ 0 16624 16 syscall -> close
+ 0 16624 17 syscall <- close
+ 0 16624 1208 syscall -> sysi86
+ 0 16624 9 syscall <- sysi86
+ 0 16624 146 syscall -> llseek
+ 0 16624 10 syscall <- llseek
+ 0 16624 7 syscall -> llseek
+ 0 16624 7 syscall <- llseek
+ 0 16624 7 syscall -> llseek
+ 0 16624 6 syscall <- llseek
+ 0 16624 24 syscall -> sigaction
+ 0 16624 8 syscall <- sigaction
+ 0 16624 63 syscall -> brk
+ 0 16624 9 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 14 syscall <- brk
+ 0 16624 76 syscall -> brk
+ 0 16624 7 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 12 syscall <- brk
+ 0 16624 328 syscall -> resolvepath
+ 0 16624 35 syscall <- resolvepath
+ 0 16624 24 syscall -> access
+ 0 16624 10 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 10 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 11 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 13 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 14 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 16 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 17 syscall <- resolvepath
+ 0 16624 32 syscall -> open64
+ 0 16624 22 syscall <- open64
+ 0 16624 32 syscall -> resolvepath
+ 0 16624 18 syscall <- resolvepath
+ 0 16624 8 syscall -> access
+ 0 16624 8 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 9 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 11 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 12 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 14 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 15 syscall <- resolvepath
+ 0 16624 11 syscall -> open64
+ 0 16624 16 syscall <- open64
+ 0 16624 30 syscall -> resolvepath
+ 0 16624 23 syscall <- resolvepath
+ 0 16624 11 syscall -> open64
+ 0 16624 21 syscall <- open64
+ 0 16624 29 syscall -> resolvepath
+ 0 16624 17 syscall <- resolvepath
+ 0 16624 8 syscall -> access
+ 0 16624 8 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 9 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 11 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 12 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 14 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 15 syscall <- resolvepath
+ 0 16624 11 syscall -> open64
+ 0 16624 15 syscall <- open64
+ 0 16624 30 syscall -> resolvepath
+ 0 16624 20 syscall <- resolvepath
+ 0 16624 11 syscall -> open64
+ 0 16624 20 syscall <- open64
+ 0 16624 29 syscall -> resolvepath
+ 0 16624 16 syscall <- resolvepath
+ 0 16624 8 syscall -> access
+ 0 16624 8 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 10 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 11 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 12 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 14 syscall <- resolvepath
+ 0 16624 11 syscall -> open64
+ 0 16624 14 syscall <- open64
+ 0 16624 28 syscall -> resolvepath
+ 0 16624 20 syscall <- resolvepath
+ 0 16624 8 syscall -> access
+ 0 16624 8 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 9 syscall <- access
+ 0 16624 43 syscall -> access
+ 0 16624 12 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 13 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 13 syscall <- resolvepath
+ 0 16624 11 syscall -> open64
+ 0 16624 14 syscall <- open64
+ 0 16624 10 syscall -> sysconfig
+ 0 16624 7 syscall <- sysconfig
+ 0 16624 33 syscall -> resolvepath
+ 0 16624 19 syscall <- resolvepath
+ 0 16624 8 syscall -> access
+ 0 16624 8 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 9 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 11 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 13 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 14 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 15 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 17 syscall <- resolvepath
+ 0 16624 11 syscall -> open64
+ 0 16624 18 syscall <- open64
+ 0 16624 30 syscall -> resolvepath
+ 0 16624 17 syscall <- resolvepath
+ 0 16624 7 syscall -> access
+ 0 16624 8 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 9 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 11 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 12 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 14 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 15 syscall <- resolvepath
+ 0 16624 11 syscall -> open64
+ 0 16624 16 syscall <- open64
+ 0 16624 30 syscall -> resolvepath
+ 0 16624 21 syscall <- resolvepath
+ 0 16624 11 syscall -> open64
+ 0 16624 25 syscall <- open64
+ 0 16624 15 syscall -> fcntl
+ 0 16624 7 syscall <- fcntl
+ 0 16624 31 syscall -> ioctl
+ 0 16624 8 syscall <- ioctl
+ 0 16624 49 syscall -> brk
+ 0 16624 8 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 11 syscall <- brk
+ 0 16624 30 syscall -> read
+ 0 16624 35 syscall <- read
+ 0 16624 54 syscall -> read
+ 0 16624 8 syscall <- read
+ 0 16624 21 syscall -> close
+ 0 16624 10 syscall <- close
+ 0 16624 51 syscall -> brk
+ 0 16624 7 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 9 syscall <- brk
+ 0 16624 111 syscall -> brk
+ 0 16624 7 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 8 syscall <- brk
+ 0 16624 94 syscall -> uname
+ 0 16624 8 syscall <- uname
+ 0 16624 47 syscall -> ioctl
+ 0 16624 35 syscall <- ioctl
+ 0 16624 73 cmd -> if
+ 0 16624 89 cmd -> info
+ 0 16624 25 cmd <- info
+ 0 16624 46 cmd -> proc
+ 0 16624 11 syscall -> brk
+ 0 16624 7 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 9 syscall <- brk
+ 0 16624 23 cmd <- proc
+ 0 16624 9 cmd <- if
+ 0 16624 18 cmd -> tclInit
+ 0 16624 223 proc -> tclInit
+ 0 16624 12 cmd -> global
+ 0 16624 12 cmd <- global
+ 0 16624 9 cmd -> global
+ 0 16624 9 cmd <- global
+ 0 16624 8 cmd -> rename
+ 0 16624 24 cmd <- rename
+ 0 16624 13 cmd -> info
+ 0 16624 12 cmd <- info
+ 0 16624 13 cmd -> info
+ 0 16624 19 cmd <- info
+ 0 16624 11 cmd -> unset
+ 0 16624 13 cmd <- unset
+ 0 16624 9 cmd -> concat
+ 0 16624 15 cmd <- concat
+ 0 16624 18 cmd -> file
+ 0 16624 20 cmd <- file
+ 0 16624 8 cmd -> file
+ 0 16624 25 syscall -> resolvepath
+ 0 16624 24 syscall <- resolvepath
+ 0 16624 9 syscall -> access
+ 0 16624 8 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 9 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 11 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 12 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 14 syscall <- resolvepath
+ 0 16624 12 syscall -> access
+ 0 16624 13 syscall <- access
+ 0 16624 9 cmd <- file
+ 0 16624 10 cmd -> file
+ 0 16624 12 cmd <- file
+ 0 16624 9 cmd -> file
+ 0 16624 24 syscall -> resolvepath
+ 0 16624 23 syscall <- resolvepath
+ 0 16624 8 syscall -> access
+ 0 16624 8 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 9 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 11 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 13 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 14 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 16 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 17 syscall <- resolvepath
+ 0 16624 12 syscall -> access
+ 0 16624 16 syscall <- access
+ 0 16624 29 cmd <- file
+ 0 16624 10 cmd -> file
+ 0 16624 12 cmd <- file
+ 0 16624 9 cmd -> file
+ 0 16624 23 syscall -> resolvepath
+ 0 16624 20 syscall <- resolvepath
+ 0 16624 8 syscall -> access
+ 0 16624 9 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 10 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 11 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 13 syscall <- access
+ 0 16624 7 syscall -> access
+ 0 16624 14 syscall <- access
+ 0 16624 7 syscall -> resolvepath
+ 0 16624 15 syscall <- resolvepath
+ 0 16624 11 syscall -> access
+ 0 16624 14 syscall <- access
+ 0 16624 7 cmd <- file
+ 0 16624 9 cmd -> file
+ 0 16624 12 cmd <- file
+ 0 16624 9 cmd -> file
+ 0 16624 23 syscall -> resolvepath
+ 0 16624 20 syscall <- resolvepath
+ 0 16624 11 syscall -> access
+ 0 16624 19 syscall <- access
+ 0 16624 7 cmd <- file
+ 0 16624 10 cmd -> uplevel
+ 0 16624 13 cmd -> source
+ 0 16624 14 syscall -> stat64
+ 0 16624 23 syscall <- stat64
+ 0 16624 10 syscall -> open64
+ 0 16624 23 syscall <- open64
+ 0 16624 8 syscall -> fcntl
+ 0 16624 7 syscall <- fcntl
+ 0 16624 8 syscall -> ioctl
+ 0 16624 7 syscall <- ioctl
+ 0 16624 26 syscall -> read
+ 0 16624 29 syscall <- read
+ 0 16624 8 syscall -> brk
+ 0 16624 7 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 9 syscall <- brk
+ 0 16624 57 syscall -> read
+ 0 16624 15 syscall <- read
+ 0 16624 55 syscall -> read
+ 0 16624 14 syscall <- read
+ 0 16624 8 syscall -> brk
+ 0 16624 6 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 6 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 8 syscall <- brk
+ 0 16624 63 syscall -> read
+ 0 16624 14 syscall <- read
+ 0 16624 45 syscall -> read
+ 0 16624 13 syscall <- read
+ 0 16624 8 syscall -> brk
+ 0 16624 6 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 6 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 8 syscall <- brk
+ 0 16624 63 syscall -> read
+ 0 16624 14 syscall <- read
+ 0 16624 29 syscall -> read
+ 0 16624 7 syscall <- read
+ 0 16624 10 syscall -> close
+ 0 16624 10 syscall <- close
+ 0 16624 18 cmd -> if
+ 0 16624 19 cmd -> info
+ 0 16624 10 cmd <- info
+ 0 16624 12 cmd <- if
+ 0 16624 14 cmd -> package
+ 0 16624 12 cmd <- package
+ 0 16624 15 cmd -> if
+ 0 16624 12 cmd -> info
+ 0 16624 9 cmd <- info
+ 0 16624 26 cmd -> info
+ 0 16624 16 cmd <- info
+ 0 16624 10 cmd <- if
+ 0 16624 21 cmd -> namespace
+ 0 16624 87 cmd -> variable
+ 0 16624 10 cmd <- variable
+ 0 16624 9 cmd -> info
+ 0 16624 13 cmd <- info
+ 0 16624 9 cmd -> info
+ 0 16624 8 cmd <- info
+ 0 16624 8 cmd -> info
+ 0 16624 8 cmd <- info
+ 0 16624 9 cmd -> file
+ 0 16624 21 cmd <- file
+ 0 16624 9 cmd -> list
+ 0 16624 17 cmd <- list
+ 0 16624 8 cmd -> foreach
+ 0 16624 27 cmd -> lsearch
+ 0 16624 10 cmd <- lsearch
+ 0 16624 10 cmd -> lappend
+ 0 16624 9 cmd <- lappend
+ 0 16624 11 cmd -> lsearch
+ 0 16624 8 cmd <- lsearch
+ 0 16624 8 cmd -> lappend
+ 0 16624 8 cmd <- lappend
+ 0 16624 8 cmd <- foreach
+ 0 16624 8 cmd -> info
+ 0 16624 10 cmd <- info
+ 0 16624 8 cmd -> file
+ 0 16624 15 syscall -> brk
+ 0 16624 7 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 9 syscall <- brk
+ 0 16624 24 cmd <- file
+ 0 16624 9 cmd -> file
+ 0 16624 19 cmd <- file
+ 0 16624 9 cmd -> file
+ 0 16624 11 cmd <- file
+ 0 16624 10 cmd -> lsearch
+ 0 16624 8 cmd <- lsearch
+ 0 16624 9 cmd -> lappend
+ 0 16624 8 cmd <- lappend
+ 0 16624 8 cmd -> info
+ 0 16624 8 cmd <- info
+ 0 16624 9 cmd -> foreach
+ 0 16624 12 cmd -> lsearch
+ 0 16624 8 cmd <- lsearch
+ 0 16624 8 cmd -> lappend
+ 0 16624 8 cmd <- lappend
+ 0 16624 8 cmd <- foreach
+ 0 16624 8 cmd <- namespace
+ 0 16624 30 cmd -> if
+ 0 16624 22 cmd -> interp
+ 0 16624 17 cmd <- interp
+ 0 16624 11 cmd <- if
+ 0 16624 15 cmd -> package
+ 0 16624 8 cmd <- package
+ 0 16624 13 cmd -> if
+ 0 16624 12 cmd -> interp
+ 0 16624 8 cmd <- interp
+ 0 16624 44 cmd <- if
+ 0 16624 21 cmd -> if
+ 0 16624 15 cmd -> namespace
+ 0 16624 10 cmd <- namespace
+ 0 16624 9 cmd <- if
+ 0 16624 13 cmd -> set
+ 0 16624 9 cmd <- set
+ 0 16624 10 cmd -> set
+ 0 16624 8 cmd <- set
+ 0 16624 12 cmd -> if
+ 0 16624 14 cmd -> namespace
+ 0 16624 8 cmd <- namespace
+ 0 16624 13 cmd -> proc
+ 0 16624 12 cmd <- proc
+ 0 16624 8 cmd <- if
+ 0 16624 69 cmd -> proc
+ 0 16624 11 cmd <- proc
+ 0 16624 20 cmd -> proc
+ 0 16624 12 cmd <- proc
+ 0 16624 22 syscall -> brk
+ 0 16624 7 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 6 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 9 syscall <- brk
+ 0 16624 18 cmd -> proc
+ 0 16624 10 cmd <- proc
+ 0 16624 21 cmd -> proc
+ 0 16624 11 cmd <- proc
+ 0 16624 16 cmd -> proc
+ 0 16624 10 cmd <- proc
+ 0 16624 42 cmd -> if
+ 0 16624 25 cmd -> proc
+ 0 16624 9 syscall -> brk
+ 0 16624 6 syscall <- brk
+ 0 16624 7 syscall -> brk
+ 0 16624 9 syscall <- brk
+ 0 16624 21 cmd <- proc
+ 0 16624 9 cmd <- if
+ 0 16624 41 cmd -> proc
+ 0 16624 13 cmd <- proc
+ 0 16624 9 cmd <- source
+ 0 16624 8 cmd <- uplevel
+ 0 16624 10 proc <- tclInit
+ 0 16624 17 cmd <- tclInit
+ 0 16624 35 syscall -> resolvepath
+ 0 16624 31 syscall <- resolvepath
+ 0 16624 13 syscall -> stat64
+ 0 16624 24 syscall <- stat64
+ 0 16624 9 syscall -> open64
+ 0 16624 23 syscall <- open64
+ 0 16624 8 syscall -> fcntl
+ 0 16624 7 syscall <- fcntl
+ 0 16624 9 syscall -> ioctl
+ 0 16624 7 syscall <- ioctl
+ 0 16624 12 syscall -> read
+ 0 16624 21 syscall <- read
+ 0 16624 10 syscall -> read
+ 0 16624 7 syscall <- read
+ 0 16624 9 syscall -> close
+ 0 16624 8 syscall <- close
+ 0 16624 12 cmd -> proc
+ 0 16624 11 cmd <- proc
+ 0 16624 11 cmd -> proc
+ 0 16624 9 cmd <- proc
+ 0 16624 11 cmd -> proc
+ 0 16624 9 cmd <- proc
+ 0 16624 9 cmd -> func_a
+ 0 16624 17 proc -> func_a
+ 0 16624 10 cmd -> puts
+ 0 16624 25 syscall -> llseek
+ 0 16624 9 syscall <- llseek
+ 0 16624 9 syscall -> ioctl
+ 0 16624 6 syscall <- ioctl
+ 0 16624 13 syscall -> getsockname
+ 0 16624 8 syscall <- getsockname
+ 0 16624 18 syscall -> llseek
+ 0 16624 8 syscall <- llseek
+ 0 16624 7 syscall -> ioctl
+ 0 16624 86 syscall <- ioctl
+ 0 16624 184 syscall -> ioctl
+ 0 16624 17 syscall <- ioctl
+ 0 16624 14 syscall -> llseek
+ 0 16624 7 syscall <- llseek
+ 0 16624 7 syscall -> ioctl
+ 0 16624 13 syscall <- ioctl
+ 0 16624 8 syscall -> ioctl
+ 0 16624 12 syscall <- ioctl
+ 0 16624 24 syscall -> write
+ 0 16624 108 syscall <- write
+ 0 16624 10 cmd <- puts
+ 0 16624 11 cmd -> after
+ 0 16624 23 syscall -> pollsys
+Function B
+ 0 16624 1009593 syscall <- pollsys
+ 0 16624 24 cmd <- after
+ 0 16624 23 cmd -> func_b
+ 0 16624 37 proc -> func_b
+ 0 16624 12 cmd -> puts
+ 0 16624 17 syscall -> write
+ 0 16624 74 syscall <- write
+ 0 16624 8 cmd <- puts
+ 0 16624 9 cmd -> after
+ 0 16624 10 syscall -> pollsys
+Function C
+ 0 16624 1009748 syscall <- pollsys
+ 0 16624 24 cmd <- after
+ 0 16624 23 cmd -> func_c
+ 0 16624 35 proc -> func_c
+ 0 16624 12 cmd -> puts
+ 0 16624 17 syscall -> write
+ 0 16624 75 syscall <- write
+ 0 16624 8 cmd <- puts
+ 0 16624 9 cmd -> after
+ 0 16624 10 syscall -> pollsys
+ 0 16624 1009831 syscall <- pollsys
+ 0 16624 24 cmd <- after
+ 0 16624 23 proc <- func_c
+ 0 16624 13 cmd <- func_c
+ 0 16624 9 proc <- func_b
+ 0 16624 8 cmd <- func_b
+ 0 16624 8 proc <- func_a
+ 0 16624 8 cmd <- func_a
+ 0 16624 30 cmd -> exit
+ 0 16624 41 syscall -> fcntl
+ 0 16624 11 syscall <- fcntl
+ 0 16624 7 syscall -> fcntl
+ 0 16624 7 syscall <- fcntl
+ 0 16624 7 syscall -> fcntl
+ 0 16624 6 syscall <- fcntl
+ 0 16624 11 syscall -> fcntl
+ 0 16624 6 syscall <- fcntl
+ 0 16624 7 syscall -> fcntl
+ 0 16624 6 syscall <- fcntl
+ 0 16624 7 syscall -> fcntl
+ 0 16624 6 syscall <- fcntl
+ 0 16624 9 syscall -> fcntl
+ 0 16624 7 syscall <- fcntl
+ 0 16624 7 syscall -> fcntl
+ 0 16624 6 syscall <- fcntl
+ 0 16624 7 syscall -> fcntl
+ 0 16624 6 syscall <- fcntl
+ 0 16624 81 syscall -> open64
+ 0 16624 119 syscall <- open64
+ 0 16624 8 syscall -> ioctl
+ 0 16624 8 syscall <- ioctl
+ 0 16624 10 syscall -> close
+ 0 16624 16 syscall <- close
+ 0 16624 68 syscall -> rexit
+
diff --git a/Examples/tcl_who_example.txt b/Examples/tcl_who_example.txt
new file mode 100644
index 000000000000..d1eefa3a9c85
--- /dev/null
+++ b/Examples/tcl_who_example.txt
@@ -0,0 +1,17 @@
+The following is an example of running tcl_who.d.
+
+The output produces four fields of interest in tracing tcl calls by process.
+
+Here we see it running while Code/Tcl/func_slow.tcl and Code/Tcl/func_abc.tcl
+are executed.
+# tcl_who.d
+Tracing... Hit Ctrl-C to end.
+^C
+ PID UID CALLS ARGS
+ 16063 100 83 ./tclsh scripts/func_slow.tcl
+ 16061 100 86 ./tclsh scripts/func_abc.tcl
+
+CALLS is a measure of activity, and is a count of the procedures and commands
+that Tcl called. The ARGS column shows the process name and arguments given
+for a particular PID in order to identify the particular Tcl code involved.
+
diff --git a/Examples/tcpsnoop_d_example.txt b/Examples/tcpsnoop_d_example.txt
new file mode 100644
index 000000000000..a0a8cc85d379
--- /dev/null
+++ b/Examples/tcpsnoop_d_example.txt
@@ -0,0 +1,41 @@
+The following is a demonstration of the tcpsnoop script.
+
+
+
+Here we run tcpsnoop and wait for new TCP connections to be established,
+
+ # tcpsnoop.d
+ UID PID LADDR LPORT DR RADDR RPORT SIZE CMD
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 66 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 56 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 606 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger
+ 0 242 192.168.1.5 23 <- 192.168.1.1 54224 54 inetd
+ 0 242 192.168.1.5 23 -> 192.168.1.1 54224 54 inetd
+ 0 242 192.168.1.5 23 <- 192.168.1.1 54224 54 inetd
+ 0 242 192.168.1.5 23 <- 192.168.1.1 54224 78 inetd
+ 0 242 192.168.1.5 23 -> 192.168.1.1 54224 54 inetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 57 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 54 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 78 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 57 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 54 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 54 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 60 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 63 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 54 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 60 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 60 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 60 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 72 in.telnetd
+ [...]
+
+As new connections are made, each of the TCP packets are traced along with
+the UID, PID and command name.
diff --git a/Examples/tcpsnoop_example.txt b/Examples/tcpsnoop_example.txt
new file mode 100644
index 000000000000..1124175d2d16
--- /dev/null
+++ b/Examples/tcpsnoop_example.txt
@@ -0,0 +1,61 @@
+The following is a demonstration of the tcpsnoop program.
+
+
+
+Here we run tcpsnoop and wait for new TCP connections to be established,
+
+ # tcpsnoop
+ UID PID LADDR LPORT DR RADDR RPORT SIZE CMD
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 66 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 56 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 606 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 -> 192.168.1.1 79 54 finger
+ 100 20892 192.168.1.5 36398 <- 192.168.1.1 79 54 finger
+ 0 242 192.168.1.5 23 <- 192.168.1.1 54224 54 inetd
+ 0 242 192.168.1.5 23 -> 192.168.1.1 54224 54 inetd
+ 0 242 192.168.1.5 23 <- 192.168.1.1 54224 54 inetd
+ 0 242 192.168.1.5 23 <- 192.168.1.1 54224 78 inetd
+ 0 242 192.168.1.5 23 -> 192.168.1.1 54224 54 inetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 57 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 54 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 78 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 57 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 54 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 54 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 60 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 63 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 54 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 60 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 60 in.telnetd
+ 0 20893 192.168.1.5 23 <- 192.168.1.1 54224 60 in.telnetd
+ 0 20893 192.168.1.5 23 -> 192.168.1.1 54224 72 in.telnetd
+ [...]
+
+As new connections are made, each of the TCP packets are traced along with
+the UID, PID and command name.
+
+
+
+tcpsnoop has many options, for example here we use "-v" to print times,
+
+ # tcpsnoop -v
+ STRTIME UID PID LADDR LPORT DR RADDR RPORT SIZE CMD
+ 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 <- 192.168.1.1 49001 54 inetd
+ 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 -> 192.168.1.1 49001 54 inetd
+ 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 <- 192.168.1.1 49001 54 inetd
+ 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 <- 192.168.1.1 49001 56 inetd
+ 2005 Jul 11 21:21:19 0 242 192.168.1.5 79 -> 192.168.1.1 49001 54 inetd
+ 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 -> 192.168.1.1 49001 444 in.fingerd
+ 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 -> 192.168.1.1 49001 54 in.fingerd
+ 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 <- 192.168.1.1 49001 54 in.fingerd
+ 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 <- 192.168.1.1 49001 54 in.fingerd
+ 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 <- 192.168.1.1 49001 54 in.fingerd
+ 2005 Jul 11 21:21:19 0 23181 192.168.1.5 79 -> 192.168.1.1 49001 54 in.fingerd
+ [...]
+
diff --git a/Examples/tcpsnoop_snv_d_example.txt b/Examples/tcpsnoop_snv_d_example.txt
new file mode 120000
index 000000000000..d53301a9cc66
--- /dev/null
+++ b/Examples/tcpsnoop_snv_d_example.txt
@@ -0,0 +1 @@
+tcpsnoop_d_example.txt \ No newline at end of file
diff --git a/Examples/tcpsnoop_snv_example.txt b/Examples/tcpsnoop_snv_example.txt
new file mode 120000
index 000000000000..794263cb8c1e
--- /dev/null
+++ b/Examples/tcpsnoop_snv_example.txt
@@ -0,0 +1 @@
+tcpsnoop_example.txt \ No newline at end of file
diff --git a/Examples/tcpstat_example.txt b/Examples/tcpstat_example.txt
new file mode 100644
index 000000000000..d7d8cb379d98
--- /dev/null
+++ b/Examples/tcpstat_example.txt
@@ -0,0 +1,22 @@
+The following is a demonstration of the tcpstat.d script,
+
+
+Here we run tcpstat.d as a large file is downloaded,
+
+ # tcpstat.d
+ TCP_out TCP_outRe TCP_in TCP_inDup TCP_inUn
+ 0 0 0 0 0
+ 20 0 1540 0 0
+ 632 0 576 0 0
+ 560 0 115552 0 0
+ 1872 0 2900480 0 0
+ 1968 0 3032320 0 0
+ 1776 0 2752160 0 0
+ 752 0 999824 0 0
+ 0 0 0 0 0
+ 0 0 0 0 0
+ 0 0 0 0 0
+ ^C
+
+We can see the TCP_in value rise to around 3 Mb/sec as the download occurs.
+
diff --git a/Examples/tcptop_example.txt b/Examples/tcptop_example.txt
new file mode 100644
index 000000000000..c90fc753d883
--- /dev/null
+++ b/Examples/tcptop_example.txt
@@ -0,0 +1,28 @@
+The following is a demonstration of the tcptop command,
+
+
+tcptop will display info on newly established TCP connections,
+
+ # tcptop -C 10
+ Tracing... Please wait.
+ 2005 Jul 5 04:55:25, load: 1.11, TCPin: 2 KB, TCPout: 110 KB
+
+ UID PID LADDR LPORT FADDR FPORT SIZE NAME
+ 100 20876 192.168.1.5 36396 192.168.1.1 79 1160 finger
+ 100 20875 192.168.1.5 36395 192.168.1.1 79 1160 finger
+ 100 20878 192.168.1.5 36397 192.168.1.1 23 1303 telnet
+ 100 20877 192.168.1.5 859 192.168.1.1 514 115712 rcp
+
+ 2005 Jul 5 04:55:35, load: 1.10, TCPin: 0 KB, TCPout: 0 KB
+
+ UID PID LADDR LPORT FADDR FPORT SIZE NAME
+ 0 242 192.168.1.5 79 192.168.1.1 54220 272 inetd
+ 0 20879 192.168.1.5 79 192.168.1.1 54220 714 in.fingerd
+
+ [...]
+
+
+In the above output, we run it with a 10 second interval and with -C so
+that the screen does not clear. Some traffic was captured, around 110 Kbytes
+by the rcp process (PID 20877), etc.
+
diff --git a/Examples/tcptop_snv_example.txt b/Examples/tcptop_snv_example.txt
new file mode 120000
index 000000000000..f2a169ee6b50
--- /dev/null
+++ b/Examples/tcptop_snv_example.txt
@@ -0,0 +1 @@
+tcptop_example.txt \ No newline at end of file
diff --git a/Examples/tcpwdist_example.txt b/Examples/tcpwdist_example.txt
new file mode 100644
index 000000000000..02a392ce55a1
--- /dev/null
+++ b/Examples/tcpwdist_example.txt
@@ -0,0 +1,70 @@
+The following is a demonstration of the tcpwdist.d script.
+
+
+Here the tcpwdist.d script is run for a few seconds then Ctrl-C is hit,
+
+ # tcpwdist.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID: 15300 CMD: finger @mars\0
+
+ value ------------- Distribution ------------- count
+ -1 | 0
+ 0 |@@@@@@@@@@@@@@@@@@@@ 1
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@@@@@@ 1
+ 4 | 0
+
+ PID: 4967 CMD: /usr/lib/ssh/sshd\0
+
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@ 1
+ 64 |@@@@@@@@@@@@@@@@@@@@ 1
+ 128 | 0
+
+ PID: 9172 CMD: /usr/lib/ssh/sshd\0
+
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@ 4
+ 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14
+ 128 | 0
+ 256 | 0
+ 512 |@@ 1
+ 1024 | 0
+
+ PID: 15301 CMD: rcp 1Mb.gz mars:/tmp\0
+
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@ 2
+ 2 |@ 1
+ 4 | 0
+ 8 |@ 2
+ 16 |@ 2
+ 32 | 0
+ 64 | 0
+ 128 | 0
+ 256 | 0
+ 512 | 0
+ 1024 | 0
+ 2048 | 0
+ 4096 | 0
+ 8192 | 0
+ 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 64
+ 32768 | 0
+
+In the above output we can see the "rcp" command dominates, sending
+large writes (16 to 31 Kb) 64 times. The "sshd" ssh daemons each sent
+several smaller writes, from 32 to 127 bytes - which corresponds to
+command line activity (eg, screen width of 80 bytes). The finger command
+sent 2 bytes once, and zero data bytes once.
+
+These values are the TCP write payload sizes.
+
+The writes from the "rcp" command seem unusual at over 16 Kb each, when
+this is an Ethernet network with an MTU of 1500 bytes. The reason is that
+at this point the data has not yet been broken down into MTU sized packets,
+so we are looking at the applications behaviour as it writes to TCP.
+
diff --git a/Examples/threaded_example.txt b/Examples/threaded_example.txt
new file mode 100644
index 000000000000..1e41a0ef2ed9
--- /dev/null
+++ b/Examples/threaded_example.txt
@@ -0,0 +1,108 @@
+The following is a demonstration of the threaded.d script,
+
+
+Here we run a test program called "cputhread" that creates 4 busy threads
+that run at the same time. Here we run it on a server with only 1 CPU,
+
+ # threaded.d
+
+ 2005 Jul 26 02:56:37,
+
+ PID: 8516 CMD: cputhread
+
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@ 17
+ 3 |@@@@@@@@@@@ 28
+ 4 |@@@@@@@@@@@ 27
+ 5 |@@@@@@@@@@@ 28
+ 6 | 0
+ [...]
+
+In the above output, we can see that cputhread has four busy threads with
+thread IDs 2, 3, 4 and 5. We are sampling at 100 Hertz, and have caught
+each of these threads on the CPU between 17 and 28 times.
+
+Since the above counts add to 100, this is either a sign of a single CPU
+server (which it is), or a sign that a multithreaded application may be
+running "serialised" - only 1 thread at a time. Compare the above output
+to a multi CPU server,
+
+
+
+Here we run the same test program on a server with 4 CPUs,
+
+ # threaded.d
+
+ 2005 Jul 26 02:48:44,
+
+ PID: 5218 CMD: cputhread
+
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@ 80
+ 3 |@@@@@@@@@@ 72
+ 4 |@@@@@@@@@ 64
+ 5 |@@@@@@@@@@@ 78
+ 6 | 0
+ [...]
+
+This time the counts add to equal 294, so this program is definitely
+running on multiple CPUs at the same time, otherwise this total would
+not be beyond our sample rate of 100. The distribution of threads on CPU
+is fairly even, and the above serves as an example of a multithreaded
+application performing well.
+
+
+
+Now we run a test program called "cpuserial", which also create 4 busy
+threads, however due to a coding problem (poor use of mutex locks) they
+only run one at a time,
+
+ # threaded.d
+
+ 2005 Jul 26 03:07:21,
+
+ PID: 5238 CMD: cpuserial
+
+ value ------------- Distribution ------------- count
+ 2 | 0
+ 3 |@@@@@@@@@@@@ 30
+ 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 70
+ 5 | 0
+ [...]
+
+The above looks like we are back on a single CPU server with 100 samples
+in total, however we are still on our 4 CPU server. Only two threads have
+run, and the above distribution is a good indication that they have
+run serialised.
+
+
+
+Now more of a fringe case. This version of cpuserial again creates 4 threads
+that are all busy and hungry for the CPU, and again we run it on a 4 CPU
+server,
+
+ # threaded.d
+
+ 2005 Jul 26 03:25:45,
+
+ PID: 5280 CMD: cpuserial
+
+ value ------------- Distribution ------------- count
+ 1 | 0
+ 2 |@@@@@@@@@@@@@@@ 42
+ 3 |@@@@@@@@@@@@@@@@@@ 50
+ 4 |@@@@@@ 15
+ 5 |@ 2
+ 6 | 0
+ [...]
+
+So all threads are running, good. And with a total of 109, at some point
+more than one thread was running at the same time (otherwise this would
+not have exceeded 100, bearing in mind a sample rate of 100 Hertz). However,
+what is not so good is that with 4 CPUs we have only scored 109 samples -
+since all threads are CPU hungry we'd hope that more often they could
+run across the CPUs simultaneously; however this wasn't the case. Again,
+this fault was created by poor use of mutex locks.
+
diff --git a/Examples/topsyscall_example.txt b/Examples/topsyscall_example.txt
new file mode 100644
index 000000000000..dda1aa03e515
--- /dev/null
+++ b/Examples/topsyscall_example.txt
@@ -0,0 +1,65 @@
+The following is a demonstration of the topsyscall command,
+
+
+Here topsyscall is run with no arguments,
+
+ # topsyscall
+ 2005 Jun 13 22:13:21, load average: 1.24, 1.24, 1.22 syscalls: 1287
+
+ SYSCALL COUNT
+ getgid 4
+ getuid 5
+ waitsys 5
+ xstat 7
+ munmap 7
+ sysconfig 8
+ brk 8
+ setcontext 8
+ open 8
+ getpid 9
+ close 9
+ resolvepath 10
+ lwp_sigmask 22
+ mmap 26
+ lwp_park 43
+ read 59
+ write 72
+ sigaction 113
+ pollsys 294
+ ioctl 520
+
+The screen updates every second, and continues until Ctrl-C is hit to
+end the program.
+
+In the above output we can see that the ioctl() system call occured 520 times,
+pollsys() 294 times and sigaction() 113 times.
+
+
+
+Here the command is run with a 10 second interval,
+
+ # topsyscall 10
+ 2005 Jun 13 22:15:35, load average: 1.21, 1.22, 1.22 syscalls: 10189
+
+ SYSCALL COUNT
+ writev 6
+ close 7
+ lseek 7
+ open 7
+ brk 8
+ nanosleep 9
+ portfs 10
+ llseek 14
+ lwp_cond_wait 21
+ p_online 21
+ gtime 27
+ rusagesys 71
+ setcontext 92
+ lwp_sigmask 98
+ setitimer 183
+ lwp_park 375
+ write 438
+ read 551
+ pollsys 3071
+ ioctl 5144
+
diff --git a/Examples/topsysproc_example.txt b/Examples/topsysproc_example.txt
new file mode 100644
index 000000000000..368ea314c079
--- /dev/null
+++ b/Examples/topsysproc_example.txt
@@ -0,0 +1,56 @@
+The following is a demonstration of the topsysproc program,
+
+
+Here we run topsysproc with no arguments,
+
+ # topsysproc
+ 2005 Jun 13 22:25:16, load average: 1.24, 1.23, 1.21 syscalls: 1347
+
+ PROCESS COUNT
+ svc.startd 1
+ nscd 1
+ setiathome 7
+ poold 18
+ sshd 21
+ java_vm 35
+ tput 49
+ dtrace 56
+ Xorg 108
+ sh 110
+ clear 122
+ mozilla-bin 819
+
+The screen refreshes every 1 second, which can be changed by specifying
+a different interval at the command line.
+
+In the above output we can see that processes with the name "mozilla-bin"
+made 819 system calls, while processes with the name "clear" made 122.
+
+
+
+Now topsysproc is run with a 15 second interval,
+
+ # topsysproc 15
+ 2005 Jun 13 22:29:43, load average: 1.19, 1.20, 1.20 syscalls: 15909
+
+ PROCESS COUNT
+ fmd 1
+ inetd 2
+ svc.configd 2
+ gconfd-2 3
+ miniserv.pl 3
+ sac 6
+ snmpd 6
+ sshd 8
+ automountd 8
+ ttymon 9
+ svc.startd 17
+ nscd 21
+ in.routed 37
+ sendmail 41
+ setiathome 205
+ poold 293
+ dtrace 413
+ java_vm 529
+ Xorg 1234
+ mozilla-bin 13071
diff --git a/Examples/udpstat_example.txt b/Examples/udpstat_example.txt
new file mode 100644
index 000000000000..4ffa3bafeacb
--- /dev/null
+++ b/Examples/udpstat_example.txt
@@ -0,0 +1,39 @@
+The following is an example of the udpstat.d script,
+
+
+
+Here we run udpstat for a few seconds. Firstly, we run a "spray" command
+outbound, followed by a spray inbound. Both can be identified in the
+output below,
+
+ # udpstat.d
+ UDP_out UDP_outErr UDP_in UDP_inErr UDP_noPort
+ 0 0 0 0 1
+ 0 0 0 0 2
+ 0 0 0 0 0
+ 1165 0 2 0 0
+ 0 0 0 0 0
+ 0 0 0 0 2
+ 3 0 1166 0 1
+ 0 0 0 0 0
+ 0 0 0 0 0
+ 0 0 0 0 0
+ ^C
+
+
+
+Here we run udpstat.d while an outbound DNS lookup is performed using
+"nslookup",
+
+ # udpstat.d
+ UDP_out UDP_outErr UDP_in UDP_inErr UDP_noPort
+ 0 0 0 0 1
+ 0 0 0 0 1
+ 1 0 1 0 0
+ 0 0 0 0 0
+ 0 0 0 0 3
+ ^C
+
+Little output is observed as this tracks datagrams not bytes. There is
+one outbound and one inbound datagram.
+
diff --git a/Examples/uname-a_example.txt b/Examples/uname-a_example.txt
new file mode 100644
index 000000000000..281033dc8721
--- /dev/null
+++ b/Examples/uname-a_example.txt
@@ -0,0 +1,15 @@
+The following is a demonstration of the uname.d script,
+
+
+Here we run the usual "uname -a" command and compare the output to that
+given by the uname.d script,
+
+ # uname -a
+ SunOS jupiter 5.10 Generic i86pc i386 i86pc
+
+ # ./uname-a.d
+ SunOS jupiter 5.10 Generic i86pc i386 i86pc
+
+The output is the same. uname-a.d is intended as a demonstration script,
+and as a starting point for other scripts.
+
diff --git a/Examples/vmbypid_example.txt b/Examples/vmbypid_example.txt
new file mode 100644
index 000000000000..9e09b836a4c5
--- /dev/null
+++ b/Examples/vmbypid_example.txt
@@ -0,0 +1,32 @@
+The following is a demonstration of the vmbypid.d command,
+
+ # vmbypid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ EXEC PID VM VALUE
+ find 19216 prot_fault 1
+ bash 19216 zfod 1
+ dtrace 19215 pgfrec 3
+ dtrace 19215 pgrec 3
+ bash 19216 pgfrec 5
+ bash 19216 pgrec 5
+ find 19216 cow_fault 6
+ find 19216 pgfrec 6
+ find 19216 pgrec 6
+ bash 19216 prot_fault 10
+ bash 19216 cow_fault 15
+ bash 19155 prot_fault 30
+ dtrace 19215 zfod 52
+ find 19216 zfod 54
+ dtrace 19215 as_fault 56
+ bash 19216 as_fault 74
+ find 19216 as_fault 91
+ find 19216 fspgin 315
+ find 19216 pgin 315
+ find 19216 pgpgin 315
+ find 19216 maj_fault 315
+
+In the above output, the find command at PID 19211 triggered 315 maj_faults -
+major faults, that would require disk activity to satisfy (as confirmed by the
+pgpgin value for pages paged in).
+
diff --git a/Examples/vmstat-p_example.txt b/Examples/vmstat-p_example.txt
new file mode 100644
index 000000000000..1a0fe14b7750
--- /dev/null
+++ b/Examples/vmstat-p_example.txt
@@ -0,0 +1,51 @@
+The following is a demonstration of the vmstat-p.d script,
+
+
+We run both vmstat-p.d and the original vmstat(1M) command at the same time
+to compare outputs,
+
+ $ vmstat -p 1
+ memory page executable anonymous filesystem
+ swap free re mf fr de sr epi epo epf api apo apf fpi fpo fpf
+ 1144488 142456 2 8 1 0 0 0 0 0 0 0 0 2 1 1
+ 1063812 84472 18 92 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050404 75108 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050404 75108 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050404 75108 476 150 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050184 74772 73 0 0 0 0 0 0 0 0 0 0 788 0 0
+ 1050400 74988 2371 173 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050400 75100 1057 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050400 75100 2 0 0 0 0 0 0 0 0 0 0 4 0 0
+ 1050400 75100 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050400 75100 4529 172 0 0 0 0 0 0 0 0 0 192 0 0
+ 1050400 75104 0 0 0 0 0 0 0 0 0 0 0 467 0 0
+ 1050400 75104 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+
+ # ./vmstat-p.d
+ memory page executable anonymous filesystem
+ swap free re mf sr epi epo epf api apo apf fpi fpo fpf
+ 1050404 75108 8 80 0 0 0 0 0 0 0 0 0 0
+ 1050404 75108 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050404 75108 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050180 74768 2216 608 0 0 0 0 0 0 0 568 0 0
+ 1050400 74988 4 0 0 0 0 0 0 0 0 228 0 0
+ 1050400 75100 13852 700 0 0 0 0 0 0 0 0 0 0
+ 1050400 75100 8 0 0 0 0 0 0 0 0 4 0 0
+ 1050400 75100 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050400 75100 0 0 0 0 0 0 0 0 0 0 0 0
+ 1050400 75104 18480 700 0 0 0 0 0 0 0 668 0 0
+ 1050400 75104 0 0 0 0 0 0 0 0 0 0 0 0
+
+Above we can see the columns are corresponding well. "re" and "mf" in the
+DTrace output appear four times as large as they should be, because in the
+DTrace output we are printing Kbs not page counts (for consistancy).
+
+The DTrace output lacks the "summary since boot" line, as it is not using
+Kstat to fetch this data.
+
+
+The vmstat-p.d script is not intended itself as a useful program, rather it
+is intended as a starting point for other DTrace scripts; a starting point
+of familiar statistics to provide the programmer with a "common ground"
+of knowledge.
+
diff --git a/Examples/vmstat_example.txt b/Examples/vmstat_example.txt
new file mode 100644
index 000000000000..7d953fd9b672
--- /dev/null
+++ b/Examples/vmstat_example.txt
@@ -0,0 +1,45 @@
+The following is an example of the vmstat.d script,
+
+
+We run both vmstat.d and the original vmstat(1M) command at the same time
+to compare outputs,
+
+ $ vmstat 1
+ kthr memory page disk faults cpu
+ r b w swap free re mf pi po fr de sr cd s0 -- -- in sy cs us sy id
+ 0 0 0 1147468 144324 2 8 2 1 1 0 0 1 0 0 0 294 990 355 18 2 80
+ 1 0 0 1065480 92276 13 73 0 0 0 0 0 0 0 0 0 359 1055 376 85 15 0
+ 0 0 0 1052088 82940 0 0 0 0 0 0 0 0 0 0 0 409 999 402 97 3 0
+ 0 0 0 1052088 82940 0 0 0 0 0 0 0 0 0 0 0 406 975 407 97 3 0
+ 0 0 0 1052088 82940 0 0 0 0 0 0 0 0 0 0 0 406 1037 429 97 3 0
+ 0 0 0 1052088 82940 247 1763 0 0 0 0 0 2 0 0 0 427 4828 680 81 19 0
+ 0 0 0 1051264 82300 0 0 0 0 0 0 0 0 0 0 0 414 1164 441 97 3 0
+ 0 0 0 1051264 82300 11 134 0 0 0 0 0 0 0 0 0 423 1218 461 95 5 0
+ 0 0 0 1051264 82300 0 0 0 0 0 0 0 0 0 0 0 416 1054 435 98 2 0
+ [...]
+
+ # ./vmstat.d
+ w swap free re mf pi po fr sr in sy cs
+ 0 1052088 82940 8 80 0 0 0 0 117 958 379
+ 0 1052088 82940 0 0 0 0 0 0 123 955 402
+ 0 1052088 82940 0 0 0 0 0 0 121 1025 420
+ 0 1052088 82940 0 0 0 0 0 0 121 1065 433
+ 0 1051264 82300 1008 7192 0 0 0 0 219 4886 684
+ 0 1051264 82300 0 0 0 0 0 0 193 1188 461
+ 0 1051264 82300 44 540 0 0 0 0 165 1226 450
+ 0 1051264 82300 0 0 0 0 0 0 123 1012 421
+ [...]
+
+Above we can see the columns are corresponding well. "re" and "mf" in the
+DTrace output appear four times as large as they should be, because in the
+DTrace output we are printing Kbs not page counts (for consistancy).
+
+The DTrace output lacks the "summary since boot" line, as it is not using
+Kstat to fetch this data.
+
+
+The vmstat.d script is not intended itself as a useful program, rather it
+is intended as a starting point for other DTrace scripts; a starting point
+of familiar statistics to provide the programmer with a "common ground"
+of knowledge.
+
diff --git a/Examples/vopstat_example.txt b/Examples/vopstat_example.txt
new file mode 100644
index 000000000000..646419efada9
--- /dev/null
+++ b/Examples/vopstat_example.txt
@@ -0,0 +1,89 @@
+The following are demonstrations of the vopstat script.
+
+
+By default, vopstat traces activity at the vnode interface and prints
+summaries every five seconds. It will either trace all filesystems or
+just the mountpoint specified.
+
+Here it was run on /extra1, while a tar command archived /extra1,
+
+ # ./vopstat /extra1
+ VOP Physical IO Count
+ fop_getpage 66
+
+ VOP Count Count
+ fop_readdir 1
+ fop_read 2
+ fop_cmp 2
+ fop_seek 3
+ fop_close 7
+ fop_open 10
+ fop_getattr 12
+ fop_access 13
+ fop_lookup 16
+ fop_rwunlock 3802
+ fop_rwlock 3802
+ fop_putpage 4701
+ fop_getpage 6648
+ fop_dispose 19109
+
+ VOP Wall Time mSeconds
+ fop_readdir 0
+ fop_cmp 0
+ fop_read 0
+ fop_seek 0
+ fop_close 0
+ fop_open 0
+ fop_access 0
+ fop_getattr 0
+ fop_lookup 0
+ fop_rwunlock 64
+ fop_putpage 86
+ fop_rwlock 93
+ fop_dispose 346
+ fop_getpage 402
+ ^C
+
+There were 66 calls for physical I/O operations, fop_getpage, as files
+were read from disk. The VOP Count show that there were many calls to
+fop_putpage and fop_getpage, as tar works its way through files; and
+many more to fop_dispose. The total elaspsed time for these calls
+are listed at the bottom, in milleseconds.
+
+This rate of events will put some pressure on the DTrace buffer,
+you may see dynamic variable drops.
+
+
+
+vopstat also has a -t option to trace activity. Here it is run on /extra1
+while an "ls" command listed files from that directory,
+
+# ./vopstat -t /extra1
+ Event Device Path RW Size Offset
+-> fop_getattr - /extra1 - 0 0
+<- fop_getattr - /extra1 - 0 0
+-> fop_access - /extra1 - 0 0
+<- fop_access - /extra1 - 0 0
+-> fop_open - /extra1 - 0 0
+<- fop_open - /extra1 - 0 0
+-> fop_getattr - /extra1 - 0 0
+<- fop_getattr - /extra1 - 0 0
+-> fop_rwlock - /extra1 - 0 0
+<- fop_rwlock - /extra1 - 0 0
+-> fop_readdir - /extra1 - 0 0
+-> fop_getpage - /extra1 - 0 0
+<- fop_getpage - /extra1 - 0 0
+-> fop_rwunlock - /extra1 - 0 0
+<- fop_rwunlock - /extra1 - 0 0
+-> fop_rwlock - /extra1 - 0 0
+<- fop_rwlock - /extra1 - 0 0
+-> fop_readdir - /extra1 - 0 0
+<- fop_readdir - /extra1 - 0 0
+-> fop_rwunlock - /extra1 - 0 0
+<- fop_rwunlock - /extra1 - 0 0
+-> fop_close - /extra1 - 0 512
+<- fop_close - /extra1 - 0 512
+^C
+
+Each call can be seen as it happened, including the entry and return of
+these calls.
diff --git a/Examples/weblatency_example.txt b/Examples/weblatency_example.txt
new file mode 100644
index 000000000000..995b545a366a
--- /dev/null
+++ b/Examples/weblatency_example.txt
@@ -0,0 +1,127 @@
+The following is a demonstration of the weblatency.d script.
+
+Here we run weblatency.d while a mozilla browser loads the
+http://www.planetsolaris.org website. After the website was loaded, Ctrl-C
+was hit to print the following report,
+
+ # weblatency.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ HOST NUM
+ static.flickr.com 1
+ images.pegasosppc.com 1
+ www.planetsolaris.org 5
+ blogs.sun.com 7
+
+ HOST AVGTIME(ms)
+ static.flickr.com 65
+ blogs.sun.com 285
+ images.pegasosppc.com 491
+ www.planetsolaris.org 757
+
+ HOST MAXTIME(ms)
+ static.flickr.com 65
+ images.pegasosppc.com 491
+ blogs.sun.com 962
+ www.planetsolaris.org 3689
+
+This gives us an understanding on which hosts were responsible for the
+time endured while loading the website. It turns out that requests to
+www.planetsolaris.org were the slowest, with a maximum time of 3.7 seconds
+(probably the first request, which incurred a DNS lookup).
+
+
+
+The following shows the same google lookup performed on a number of sites,
+
+ # weblatency.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ HOST NUM
+ www.google.com.au 3
+ www.google.co.uk 3
+ www.google.com 3
+ www.google.co.nz 3
+
+ HOST AVGTIME(ms)
+ www.google.co.nz 450
+ www.google.com.au 502
+ www.google.com 567
+ www.google.co.uk 595
+
+ HOST MAXTIME(ms)
+ www.google.co.nz 544
+ www.google.com.au 559
+ www.google.com 744
+ www.google.co.uk 763
+
+From the average time you would guess that I was running this from
+New Zealand (the fastest), with times to the other hosts following suit
+(Australia, USA, UK). I was actually running this from Australia - it's
+interesting that the New Zealand server responded slightly faster.
+
+
+
+
+Now several websites are loaded as a larger demonstration,
+
+ # weblatency.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ HOST NUM
+ shop.abc.net.au 1
+ static.technorati.com 1
+ sunopensolaris.112.2o7.net 1
+ www.theage.com.au 1
+ ffxcam.smh.com.au 1
+ sunglobal.112.2o7.net 2
+ embed.technorati.com 2
+ technorati.com 2
+ fdimages.fairfax.com.au 4
+ blogs.sun.com 5
+ bugs.opensolaris.org 7
+ www.abc.net.au 34
+ www.smh.com.au 51
+
+ HOST AVGTIME(ms)
+ ffxcam.smh.com.au 0
+ sunglobal.112.2o7.net 0
+ www.abc.net.au 56
+ www.theage.com.au 64
+ shop.abc.net.au 65
+ www.smh.com.au 73
+ fdimages.fairfax.com.au 88
+ blogs.sun.com 130
+ bugs.opensolaris.org 162
+ static.technorati.com 350
+ technorati.com 352
+ embed.technorati.com 632
+ sunopensolaris.112.2o7.net 900
+
+ HOST MAXTIME(ms)
+ ffxcam.smh.com.au 0
+ sunglobal.112.2o7.net 0
+ www.theage.com.au 64
+ shop.abc.net.au 65
+ fdimages.fairfax.com.au 243
+ www.smh.com.au 244
+ blogs.sun.com 293
+ www.abc.net.au 315
+ static.technorati.com 350
+ technorati.com 356
+ bugs.opensolaris.org 560
+ sunopensolaris.112.2o7.net 900
+ embed.technorati.com 973
+
+It's interesting that the most common host (www.smh.com.au, NUM == 51),
+responded with a fast AVGTIME (73 ms). The reason for this may be due to
+cacheing by my proxy server. Less common hosts such as embed.technorati.com
+were quite slow.
+
+
+
+The results from weblatency.d are interesting, but they don't point the
+finger at one single cause for website latency. The value here is the response
+time experienced by the client - which is a combination of many response
+times (link speeds, proxy server, DNS server, web server).
+
diff --git a/Examples/whatexec_example.txt b/Examples/whatexec_example.txt
new file mode 100644
index 000000000000..519909ec789d
--- /dev/null
+++ b/Examples/whatexec_example.txt
@@ -0,0 +1,18 @@
+The following are demonstrations of the whatexec.d script.
+
+
+Here we run it while a few commands are also executed,
+
+ # ./whatexec.d
+ PEXEC EXEC OK TYPE
+ bash /usr/bin/clear Y #!/u\0
+ bash /sbin/sh Y \177ELF\0
+ clear /usr/bin/tput Y \177ELF\0
+ bash /export/home/brendan/DOOM.EXE N MZ\644\0
+ ^C
+
+whatexec.d has first found that "clear" was run, which has a type that
+begins with "#!" - a script. clear runs "sh" and "tput", both ELF files.
+
+We finish by attempting to run a MZ file, "DOOM.EXE", which is rejected
+(OK is "N").
diff --git a/Examples/woof_example.txt b/Examples/woof_example.txt
new file mode 100644
index 000000000000..dc8152728114
--- /dev/null
+++ b/Examples/woof_example.txt
@@ -0,0 +1,28 @@
+The following explains how to demonstrate the woof.d DTrace script.
+
+This script is only useful if you have an audio device, /dev/audio. To test
+audio, you can run:
+
+ $ audioplay /usr/share/audio/samples/au/sample.au
+
+The volume can be adjusted from a few tools, including,
+
+ $ /usr/dt/bin/sdtaudiocontrol
+
+...
+
+woof.d will bark whenever a new process is created. In order to demonstrate
+it, first run the following:
+
+ # ./woof.d &
+
+You have now installed the dog (if the dog becomes a nusience, you are
+allowed to kill it). Now compare the difference between these recursive
+grep commands:
+
+ $ find /etc -type f -exec grep localhost {} \;
+
+ $ find /etc -type f -exec grep localhost {} +
+
+The first find command is the "bad way", the second is the "good way". You
+will hear for yourself why this is the case.
diff --git a/Examples/wpm_example.txt b/Examples/wpm_example.txt
new file mode 100644
index 000000000000..bfc74a90ff34
--- /dev/null
+++ b/Examples/wpm_example.txt
@@ -0,0 +1,57 @@
+The following is an example of the wpm.d script.
+
+
+This script takes the name of a program to trace, and assumes that reads
+on file descriptor zero (STDIN) are keystrokes.
+
+When run, a 5 second count down begins before keystrokes are measured,
+
+ # wpm.d vim
+ Measuring will start in : 5 seconds
+
+While running, I retyped the first three sentences of this file a few times
+which clocked the following result,
+
+ # wpm.d vim
+ Measuring will start in : 0 seconds
+ Measuring will stop in : 0 seconds
+
+ Characters typed : 509
+ Words per minute : 84
+
+ Minimum keystroke latency : 12 ms
+ Average keystroke latency : 118 ms
+ Maximum keystroke latency : 493 ms
+
+ Word size distribution (letters),
+
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@@ 6
+ 2 |@@@@@ 11
+ 3 |@@@@@ 11
+ 4 |@@@@@@ 13
+ 5 |@@@@ 8
+ 6 |@@@@@@ 12
+ 7 |@@@@@ 11
+ 8 | 0
+ 9 |@@ 4
+ 10 |@ 3
+ 11 |@ 2
+ 12 | 0
+ 13 | 0
+ 14 | 1
+ 15 | 0
+
+ Keystroke latency distribution (ms),
+
+ value ------------- Distribution ------------- count
+ 4 | 0
+ 8 | 1
+ 16 | 5
+ 32 |@@@@@ 66
+ 64 |@@@@@@@@@@@@@@@@@@@@ 247
+ 128 |@@@@@@@@@@@@@ 167
+ 256 |@ 16
+ 512 | 0
+
diff --git a/Examples/writebytes_example.txt b/Examples/writebytes_example.txt
new file mode 100644
index 000000000000..baa83fc971f5
--- /dev/null
+++ b/Examples/writebytes_example.txt
@@ -0,0 +1,26 @@
+The following is a demonstration of the writebytes.d script,
+
+
+Here the writebytes.d script is run for a few seconds, then Ctrl-C is hit,
+
+ # writebytes.d
+ dtrace: description 'sysinfo:::writech ' matched 4 probes
+ ^C
+ dtrace 1
+ gnome-settings-d 8
+ xscreensaver 8
+ gnome-panel 8
+ nautilus 8
+ date 29
+ wnck-applet 120
+ bash 210
+ mozilla-bin 1497
+ ls 1947
+ metacity 3172
+ Xorg 7424
+ gnome-terminal 51955
+
+
+In this interval the gnome-terminal command has successfully written 51.9 Kb,
+while Xorg has written 7424 bytes.
+
diff --git a/Examples/writedist_example.txt b/Examples/writedist_example.txt
new file mode 100644
index 000000000000..f334843e2c10
--- /dev/null
+++ b/Examples/writedist_example.txt
@@ -0,0 +1,38 @@
+The following is an example of the writedist.d script,
+
+
+Here the writedist.d script is run for a few seconds, then Ctrl-C is hit,
+
+ # writedist.d
+ dtrace: description 'sysinfo:::writech ' matched 4 probes
+ ^C
+ [...]
+ Xorg
+ value ------------- Distribution ------------- count
+ 16 | 0
+ 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 169
+ 64 |@@@ 16
+ 128 |@@ 10
+ 256 | 0
+
+ gnome-terminal
+ value ------------- Distribution ------------- count
+ 0 | 0
+ 1 |@@ 6
+ 2 | 0
+ 4 | 0
+ 8 | 1
+ 16 |@ 2
+ 32 |@@@ 7
+ 64 | 0
+ 128 |@@@@@@@@@@@@@@@@@@@@@@@ 63
+ 256 |@@@@ 10
+ 512 | 1
+ 1024 |@@@@@ 13
+ 2048 |@ 2
+ 4096 |@@@ 7
+
+This allows us to understand the write behaviour of each process. The
+gnome-terminal command has executed 6 writes that returned 0 bytes, through
+to 7 writes that were at least 4096 bytes (up to 8192).
+
diff --git a/Examples/xcallsbypid_example.txt b/Examples/xcallsbypid_example.txt
new file mode 100644
index 000000000000..1593b62de627
--- /dev/null
+++ b/Examples/xcallsbypid_example.txt
@@ -0,0 +1,17 @@
+The following is a demonstration of the xcallsbypid.d script,
+
+ # xcallsbypid.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ PID CMD XCALLS
+ 215 utmpd 3
+ 6350 bash 3
+ 6351 bash 3
+ 6350 ls 24
+ 0 sched 48
+ 6349 dtrace 93
+ 6351 find 5718
+
+In the above output, we can see the find command with PID 6351 has caused
+5718 cross calls.
+
diff --git a/Examples/xvmstat_example.txt b/Examples/xvmstat_example.txt
new file mode 100644
index 000000000000..544bd985e8bd
--- /dev/null
+++ b/Examples/xvmstat_example.txt
@@ -0,0 +1,44 @@
+The following is a demonstration of the xvmstat program.
+
+
+Here we run it with no arguments. It will default to 1 second samples, and
+will run forever,
+
+ # xvmstat
+ w swap free re maj mf cow pro sr epi epo epf api apo apf fpi fpo fpf
+ 0 1025 73 2 0 21 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1025 73 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1025 73 199 42 166 21 41 0 0 0 0 0 0 0 42 0 0
+ 0 1025 73 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0
+ 0 1025 73 4404 47 175 26 30 0 0 0 0 0 0 0 48 0 0
+ 0 1025 73 433 0 0 0 14 0 0 0 0 0 0 0 0 0 0
+ 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1025 73 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ ^C
+
+Both "swap" and "free" are in units of megabytes, the rest are in units of
+pages. "maj" is major faults - a useful addition to the output.
+
+There is no summary since boot line, as this program in not using the
+Kstat data.
+
+
+
+The following runs xvmstat with a 5 second interval,
+
+ # xvmstat 5
+ w swap free re maj mf cow pro sr epi epo epf api apo apf fpi fpo fpf
+ 0 1025 72 1531 2 40 5 9 0 0 0 0 0 0 0 2 0 0
+ 0 1025 72 1534 0 36 5 9 0 0 0 0 0 0 0 0 0 0
+ 0 1025 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1025 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1025 72 5 1 82 16 25 0 0 0 0 0 0 0 1 0 0
+ 0 1025 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ ^C
+
+The values from "re" to "fpf" are per second values.
+
diff --git a/Examples/zvmstat_example.txt b/Examples/zvmstat_example.txt
new file mode 100644
index 000000000000..cb070c5d3e58
--- /dev/null
+++ b/Examples/zvmstat_example.txt
@@ -0,0 +1,34 @@
+The following is a demonstration of the zvmstat command, which provides
+vmstat style info per zone using DTrace.
+
+Here we run zvmstat with an interval of 5 seconds. This is a server that
+only has two zones, "global" and "workzone1",
+
+ # zvmstat 5
+ ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf
+ global 62 340 0 0 0 0 0 0 0 0 0 0 0
+ workzone1 4 2 0 0 0 0 0 0 0 0 0 0 0
+ ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf
+ global 1132 484 0 0 2 0 0 0 0 0 832 0 0
+ workzone1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf
+ global 50 319 2 0 2 0 0 0 0 0 579 2 2
+ workzone1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf
+ global 54 317 0 0 0 0 0 0 0 0 0 0 0
+ workzone1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf
+ global 54 316 1 0 0 0 0 0 0 0 0 1 1
+ workzone1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf
+ global 157 659 1 0 10 0 0 0 0 0 3 2 1
+ workzone1 770 1085 0 0 48 0 0 0 0 0 928 0 0
+ ZONE re mf fr sr epi epo epf api apo apf fpi fpo fpf
+ global 56 317 0 0 6 0 0 0 0 0 2 0 0
+ workzone1 1478 21 0 0 0 0 0 0 0 0 1635 0 0
+
+During the first few samples, some filesystem activity can be observed in
+the global zone, created by a "find /" in the global. In the last few samples,
+filesystem activity can be seen in the non-global zone "workzone1" - this
+time created by running a "find /" within the non-global zone,
+
diff --git a/FS/Readme b/FS/Readme
new file mode 100644
index 000000000000..30927a5e2db6
--- /dev/null
+++ b/FS/Readme
@@ -0,0 +1,3 @@
+FS - File System based analysis
+
+ This would include VFS and UFS activity.
diff --git a/FS/fspaging.d b/FS/fspaging.d
new file mode 100755
index 000000000000..4eaa718a5174
--- /dev/null
+++ b/FS/fspaging.d
@@ -0,0 +1,154 @@
+#!/usr/sbin/dtrace -s
+/*
+ * fspaging.d - file system read/write and paging tracing.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This traces file related activity: system call reads and writes,
+ * vnode logical read and writes (fop), vnode putpage and getpage activity,
+ * and disk I/O. It can be used to examine the behaviour of each I/O
+ * layer, from the syscall interface to what the disk is doing. Behaviour
+ * such as read-ahead, and max I/O size breakup can be observed.
+ *
+ * This is a verbose version of fsrw.d, as this also traces paging activity.
+ *
+ * $Id: fspaging.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: fspaging.d
+ *
+ * FIELDS:
+ * Event Traced event (see EVENTS below)
+ * Device Device, for disk I/O
+ * RW Either Read or Write
+ * Size Size of I/O in bytes, if known
+ * Offset Offset of I/O in kilobytes, if known
+ * Path Path to file on disk
+ *
+ * EVENTS:
+ * sc-read System call read
+ * sc-write System call write
+ * fop_read Logical read
+ * fop_write Logical write
+ * fop_getpage Logical get page
+ * fop_putpage Logical put page
+ * disk_io Physical disk I/O
+ * disk_ra Physical disk I/O, read ahead
+ *
+ * The events are drawn with a level of indentation, which can sometimes
+ * help identify related events.
+ *
+ * SEE ALSO: fsrw.d
+ *
+ * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter.
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * ToDo: readv()
+ *
+ * 20-Mar-2006 Brendan Gregg Created this.
+ * 23-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10hz
+
+dtrace:::BEGIN
+{
+ printf("%-13s %10s %2s %8s %6s %s\n",
+ "Event", "Device", "RW", "Size", "Offset", "Path");
+}
+
+syscall::*read:entry,
+syscall::*write*:entry
+{
+ /*
+ * starting with a file descriptior, dig out useful info
+ * from the corresponding file_t and vnode_t.
+ */
+ this->filistp = curthread->t_procp->p_user.u_finfo.fi_list;
+ this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp +
+ (uint64_t)arg0 * (uint64_t)sizeof (uf_entry_t));
+ this->filep = this->ufentryp->uf_file;
+ self->offset = this->filep->f_offset;
+ this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0;
+ self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ?
+ cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>";
+ self->sc_trace = this->vnodep ? this->vnodep->v_type == 1 ||
+ this->vnodep->v_type == 2 ? 1 : 0 : 0;
+}
+
+syscall::*read:entry
+/self->sc_trace/
+{
+ printf("sc-%-10s %10s %2s %8d %6d %s\n", probefunc, ".", "R",
+ (int)arg2, self->offset / 1024, self->vpath);
+}
+
+syscall::*write*:entry
+/self->sc_trace/
+{
+ printf("sc-%-10s %10s %2s %8d %6d %s\n", probefunc, ".", "W",
+ (int)arg2, self->offset / 1024, self->vpath);
+}
+
+syscall::*read:return,
+syscall::*write*:return
+{
+ self->vpath = 0;
+ self->offset = 0;
+ self->sc_trace = 0;
+}
+
+fbt::fop_putpage:entry,
+fbt::fop_getpage:entry
+/self->sc_trace && args[0]->v_path/
+{
+ printf(" %-11s %10s %2s %8d %6d %s\n", probefunc, ".",
+ probefunc == "fop_getpage" ? "R" : "W", (uint64_t)arg2,
+ args[1] / 1024, cleanpath(args[0]->v_path));
+}
+
+
+fbt::fop_read:entry,
+fbt::fop_write:entry
+/self->sc_trace && args[0]->v_path/
+{
+ printf(" %-11s %10s %2s %8d %6d %s\n", probefunc, ".",
+ probefunc == "fop_read" ? "R" : "W", args[1]->uio_resid,
+ args[1]->_uio_offset._f / 1024, cleanpath(args[0]->v_path));
+}
+
+fbt:ufs:ufs_getpage_ra:entry
+{
+ /* fetch the real offset (file_t is unaware of this) */
+ self->offset = ((inode_t *)args[0]->v_data)->i_nextrio;
+ self->read_ahead = 1;
+}
+
+fbt:ufs:ufs_getpage_ra:return
+{
+ self->read_ahead = 0;
+ self->offset = 0;
+}
+
+io::bdev_strategy:start
+{
+ this->offset = self->read_ahead ? self->offset : args[2]->fi_offset;
+ printf(" %-9s %10s %2s %8d %6d %s\n",
+ self->read_ahead ? "disk_ra" : "disk_io", args[1]->dev_statname,
+ args[0]->b_flags & B_READ ? "R" : "W", args[0]->b_bcount,
+ this->offset / 1024, args[2]->fi_pathname);
+}
diff --git a/FS/fsrw.d b/FS/fsrw.d
new file mode 100755
index 000000000000..291f09aaae01
--- /dev/null
+++ b/FS/fsrw.d
@@ -0,0 +1,149 @@
+#!/usr/sbin/dtrace -s
+/*
+ * fsrw.d - file system read/write event tracing.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This traces file related activity: system call reads and writes,
+ * vnode logical read and writes (fop), and disk I/O. It can be used
+ * to examine the behaviour of each I/O layer, from the syscall
+ * interface to what the disk is doing. Behaviour such as read-ahead, and
+ * max I/O size breakup can be observed.
+ *
+ * $Id: fsrw.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: fsrw.d
+ *
+ * FIELDS:
+ * Event Traced event (see EVENTS below)
+ * Device Device, for disk I/O
+ * RW Either Read or Write
+ * Size Size of I/O in bytes
+ * Offset Offset of I/O in kilobytes
+ * Path Path to file on disk
+ *
+ * EVENTS:
+ * sc-read System call read
+ * sc-write System call write
+ * fop_read Logical read
+ * fop_write Logical write
+ * disk_io Physical disk I/O
+ * disk_ra Physical disk I/O, read ahead
+ *
+ * The events are drawn with a level of indentation, which can sometimes
+ * help identify related events.
+ *
+ * SEE ALSO: fspaging.d
+ *
+ * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter.
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * ToDo: readv()
+ *
+ * 20-Mar-2006 Brendan Gregg Created this.
+ * 23-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10hz
+
+dtrace:::BEGIN
+{
+ printf("%-12s %10s %2s %8s %6s %s\n",
+ "Event", "Device", "RW", "Size", "Offset", "Path");
+}
+
+syscall::*read:entry,
+syscall::*write*:entry
+{
+ /*
+ * starting with a file descriptior, dig out useful info
+ * from the corresponding file_t and vnode_t.
+ */
+ this->filistp = curthread->t_procp->p_user.u_finfo.fi_list;
+ this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp +
+ (uint64_t)arg0 * (uint64_t)sizeof (uf_entry_t));
+ this->filep = this->ufentryp->uf_file;
+ self->offset = this->filep->f_offset;
+ this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0;
+ self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ?
+ cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>";
+
+ /* only trace activity to regular files and directories, as */
+ self->sc_trace = this->vnodep ? this->vnodep->v_type == VREG ||
+ this->vnodep->v_type == VDIR ? 1 : 0 : 0;
+}
+
+syscall::*read:entry
+/self->sc_trace/
+{
+ printf("sc-%-9s %10s %2s %8d %6d %s\n", probefunc, ".", "R",
+ (int)arg2, self->offset / 1024, self->vpath);
+}
+
+syscall::*write*:entry
+/self->sc_trace/
+{
+ printf("sc-%-9s %10s %2s %8d %6d %s\n", probefunc, ".", "W",
+ (int)arg2, self->offset / 1024, self->vpath);
+}
+
+syscall::*read:return,
+syscall::*write*:return
+{
+ self->vpath = 0;
+ self->offset = 0;
+ self->sc_trace = 0;
+}
+
+fbt::fop_read:entry,
+fbt::fop_write:entry
+/self->sc_trace && args[0]->v_path/
+{
+ printf(" %-10s %10s %2s %8d %6d %s\n", probefunc, ".",
+ probefunc == "fop_read" ? "R" : "W", args[1]->uio_resid,
+ args[1]->_uio_offset._f / 1024, cleanpath(args[0]->v_path));
+}
+
+fbt:ufs:ufs_getpage_ra:entry
+{
+ /* fetch the real offset (file_t is unaware of this) */
+ self->ra_offset = ((inode_t *)args[0]->v_data)->i_nextrio;
+ self->read_ahead = 1;
+}
+
+fbt:ufs:ufs_getpage_ra:return
+{
+ self->read_ahead = 0;
+ self->ra_offset = 0;
+}
+
+io::bdev_strategy:start
+{
+ this->offset = self->read_ahead ? self->ra_offset : args[2]->fi_offset;
+ printf(" %-8s %10s %2s %8d %6d %s\n",
+ self->read_ahead ? "disk_ra" : "disk_io", args[1]->dev_statname,
+ args[0]->b_flags & B_READ ? "R" : "W", args[0]->b_bcount,
+ this->offset / 1024, args[2]->fi_pathname);
+ /*
+ * it would seem to make sense to only trace disk events during
+ * an fop event, easily coded with a self->fop_trace flag. However
+ * writes are asynchronous to the fop_write calls (they are flushed
+ * at some later time), and so this approach will miss tracing
+ * most of the disk writes.
+ */
+}
diff --git a/FS/rfileio.d b/FS/rfileio.d
new file mode 100755
index 000000000000..95a6caad5c6f
--- /dev/null
+++ b/FS/rfileio.d
@@ -0,0 +1,91 @@
+#!/usr/sbin/dtrace -s
+/*
+ * rfileio.d - read file I/O stats, with cache miss rate.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This script provides statistics on the number of reads and the bytes
+ * read from filesystems (logical), and the number of bytes read from
+ * disk (physical). A summary is printed every five seconds by file.
+ *
+ * A total miss-rate is also provided for the file system cache.
+ *
+ * $Id: rfileio.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: rfileio.d
+ *
+ * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter.
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 19-Mar-2006 Brendan Gregg Created this.
+ * 23-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+self int trace;
+uint64_t lbytes;
+uint64_t pbytes;
+
+dtrace:::BEGIN
+{
+ trace("Tracing...\n");
+}
+
+fbt::fop_read:entry
+/self->trace == 0 && args[0]->v_path/
+{
+ self->pathname = cleanpath(args[0]->v_path);
+ @rio[self->pathname, "logical"] = count();
+ lbytes += args[1]->uio_resid;
+ self->size = args[1]->uio_resid;
+ self->uiop = args[1];
+}
+
+fbt::fop_read:return
+/self->size/
+{
+ @rbytes[self->pathname, "logical"] =
+ sum(self->size - self->uiop->uio_resid);
+ self->size = 0;
+ self->uiop = 0;
+ self->pathname = 0;
+}
+
+io::bdev_strategy:start
+/self->size && args[0]->b_flags & B_READ/
+{
+ @rio[self->pathname, "physical"] = count();
+ @rbytes[self->pathname, "physical"] = sum(args[0]->b_bcount);
+ pbytes += args[0]->b_bcount;
+}
+
+profile:::tick-5s
+{
+ trunc(@rio, 20);
+ trunc(@rbytes, 20);
+ printf("\033[H\033[2J");
+ printf("\nRead IOPS, top 20 (count)\n");
+ printa("%-54s %10s %10@d\n", @rio);
+ printf("\nRead Bandwidth, top 20 (bytes)\n");
+ printa("%-54s %10s %10@d\n", @rbytes);
+ printf("\nTotal File System miss-rate: %d%%\n",
+ lbytes ? 100 * pbytes / lbytes : 0);
+ trunc(@rbytes);
+ trunc(@rio);
+ lbytes = pbytes = 0;
+}
diff --git a/FS/rfsio.d b/FS/rfsio.d
new file mode 100755
index 000000000000..847756314ba3
--- /dev/null
+++ b/FS/rfsio.d
@@ -0,0 +1,98 @@
+#!/usr/sbin/dtrace -s
+/*
+ * rfsio.d - read FS I/O stats, with cache miss rate.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This script provides statistics on the number of reads and the bytes
+ * read from filesystems (logical), and the number of bytes read from
+ * disk (physical). A summary is printed every five seconds by filesystem.
+ *
+ * A total miss-rate is also provided for the file system cache.
+ *
+ * $Id: rfsio.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: rfsio.d
+ *
+ * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter.
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 19-Mar-2006 Brendan Gregg Created this.
+ * 23-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+self int trace;
+uint64_t lbytes;
+uint64_t pbytes;
+
+dtrace:::BEGIN
+{
+ trace("Tracing...\n");
+}
+
+fbt::fop_read:entry
+/self->trace == 0/
+{
+ self->fs_mount = args[0]->v_vfsp == `rootvfs ? "/" :
+ args[0]->v_vfsp->vfs_vnodecovered ?
+ stringof(args[0]->v_vfsp->vfs_vnodecovered->v_path) : NULL;
+}
+
+fbt::fop_read:entry
+/self->fs_mount != NULL/
+{
+ @rio[self->fs_mount, "logical"] = count();
+ lbytes += args[1]->uio_resid;
+ self->size = args[1]->uio_resid;
+ self->uiop = args[1];
+}
+
+fbt::fop_read:return
+/self->size/
+{
+ @rbytes[self->fs_mount, "logical"] =
+ sum(self->size - self->uiop->uio_resid);
+ self->size = 0;
+ self->uiop = 0;
+ self->fs_mount = 0;
+}
+
+io::bdev_strategy:start
+/self->size && args[0]->b_flags & B_READ/
+{
+ @rio[self->fs_mount, "physical"] = count();
+ @rbytes[self->fs_mount, "physical"] = sum(args[0]->b_bcount);
+ pbytes += args[0]->b_bcount;
+}
+
+profile:::tick-5s
+{
+ trunc(@rio, 20);
+ trunc(@rbytes, 20);
+ printf("\033[H\033[2J");
+ printf("\nRead IOPS (count)\n");
+ printa("%-32s %10s %10@d\n", @rio);
+ printf("\nRead Bandwidth (bytes)\n");
+ printa("%-32s %10s %10@d\n", @rbytes);
+ printf("\nTotal File System miss-rate: %d%%\n",
+ lbytes ? 100 * pbytes / lbytes : 0);
+ trunc(@rbytes);
+ trunc(@rio);
+ lbytes = pbytes = 0;
+}
diff --git a/FS/vopstat b/FS/vopstat
new file mode 100755
index 000000000000..a4c5af46d7de
--- /dev/null
+++ b/FS/vopstat
@@ -0,0 +1,304 @@
+#!/usr/bin/sh
+#
+# vopstat - Trace the vnode interface.
+# Written using DTrace (Solaris 10 3/05)
+#
+# Author: Richard McDougall
+#
+# $Id: vopstat 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: vopstat [-t] [/mountname]
+#
+# vopstat # default output, summary each 5 secs
+# -t # trace activity as it occurs
+#
+# Example:
+#
+# ./vopstat
+#
+# VOP Physical IO Count
+# fop_fsync 236
+#
+# VOP Count Count
+# fop_create 1
+# fop_fid 1
+# fop_lookup 2
+# fop_access 3
+# fop_read 3
+# fop_poll 11
+# fop_fsync 31
+# fop_putpage 32
+# fop_ioctl 115
+# fop_write 517
+# fop_rwlock 520
+# fop_rwunlock 520
+# fop_inactive 529
+# fop_getattr 1057
+#
+# VOP Wall Time mSeconds
+# fop_fid 0
+# fop_access 0
+# fop_read 0
+# fop_poll 0
+# fop_lookup 0
+# fop_create 0
+# fop_ioctl 0
+# fop_putpage 1
+# fop_rwunlock 1
+# fop_rwlock 1
+# fop_inactive 1
+# fop_getattr 2
+# fop_write 22
+# fop_fsync 504
+#
+# COPYRIGHT: Copyright (c) 2006 Richard McDougall
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Shell Wrapper Concept by Brendan Gregg
+#
+# 08-Jan-2006 Richard McDougall Created this.
+# 23-Apr-2006 Brendan Gregg Minor style tweaks.
+# 23-Apr-2006 " " Last update.
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_trace=0; opt_fs=0; opt_stats=1; opt_all=0
+
+### process options
+while getopts t name
+do
+ case $name in
+ t) opt_trace=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: voptrace [-t] [/mountpoint]
+ voptrace # default output
+ -t # trace
+ eg,
+ voptrace -t # trace all file systems
+ voptrace -t /tmp # trace /tmp
+ voptrace /tmp # summary stats for /tmp
+ END
+ exit 1
+ esac
+done
+shift `expr $OPTIND - 1`
+filesys="$1"
+
+### option logic
+if [ $opt_trace -eq 1 ]; then
+ opt_stats=0
+fi
+if [ -z "$filesys" ]; then
+ opt_all=1
+fi
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_fs = '$opt_fs';
+ inline int OPT_all = '$opt_all';
+ inline int OPT_trace = '$opt_trace';
+ inline int OPT_stats = '$opt_stats';
+ inline string FILESYS = "'$filesys'";
+
+ #pragma D option quiet
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ last_event[""] = 0;
+
+ /* print main headers */
+ OPT_stats == 1 ?
+ printf("\033[H\033[2J") : 1;
+
+ OPT_trace == 1 ?
+ printf("%2s %-15s %-10s %51s %2s %8s %8s\n",
+ "", "Event", "Device", "Path", "RW", "Size", "Offset") : 1;
+ self->path = "";
+ self->trace = 0;
+ }
+
+ dtrace:::BEGIN
+ /OPT_trace == 1/
+ {
+ /* make D compiler happy */
+ @vop_iocnt[""] = count();
+ @vop_cnt[""] = count();
+ @vop_time[""] = sum(0);
+ trunc(@vop_iocnt);
+ trunc(@vop_cnt);
+ trunc(@vop_time);
+ }
+
+ fbt::fop_*:entry
+ {
+ self->trace = 0;
+
+ /* Get vp: fop_open has a pointer to vp */
+ this->vpp = (vnode_t **)arg0;
+ self->vp = (vnode_t *)arg0;
+ self->vp = probefunc == "fop_open" ? (vnode_t *)*this->vpp : self->vp;
+
+ /* And the containing vfs */
+ this->vfsp = self->vp ? self->vp->v_vfsp : 0;
+
+ /* And the paths for the vp and containing vfs */
+ this->vfsvp = this->vfsp ?
+ (struct vnode *)((vfs_t *)this->vfsp)->vfs_vnodecovered : 0;
+ self->vfspath = this->vfsvp ? stringof(this->vfsvp->v_path) : "unknown";
+
+ /* Check if we should trace the root fs */
+ (OPT_all ||
+ (FILESYS == "/" && this->vfsp &&
+ (this->vfsp == `rootvfs))) ? self->trace = 1 : self->trace;
+
+ /* Check if we should trace the fs */
+ (OPT_all || (self->vfspath == FILESYS)) ? self->trace = 1 : self->trace;
+
+ self->vfspath = 0;
+ }
+
+ /*
+ * Trace the entry point to each fop
+ */
+ fbt::fop_*:entry
+ /self->trace/
+ {
+ self->path = (self->vp != NULL && self->vp->v_path) ?
+ stringof(self->vp->v_path) : "unknown";
+
+ /* Some fops has the len in arg2 */
+ (probefunc == "fop_getpage" ||
+ probefunc == "fop_putpage" ||
+ probefunc == "fop_none") ? self->len = arg2 : 1;
+
+ /* Some fops has the len in arg3 */
+ (probefunc == "fop_pageio" ||
+ probefunc == "fop_none") ? self->len = arg3 : 1;
+
+ /* Some fops has the len in arg4 */
+ (probefunc == "fop_addmap" ||
+ probefunc == "fop_map" ||
+ probefunc == "fop_delmap") ? self->len = arg4 : 1;
+
+ /* Some fops has the offset in arg1 */
+ (probefunc == "fop_addmap" ||
+ probefunc == "fop_map" ||
+ probefunc == "fop_getpage" ||
+ probefunc == "fop_putpage" ||
+ probefunc == "fop_seek" ||
+ probefunc == "fop_delmap") ? self->off = arg1 : 1;
+
+ /* Some fops has the offset in arg3 */
+ (probefunc == "fop_close" ||
+ probefunc == "fop_pageio") ? self->off = arg3 : 1;
+
+ /* Some fops has the offset in arg4 */
+ probefunc == "fop_frlock" ? self->off = arg4 : 1;
+
+ /* Some fops has the pathname in arg1 */
+ self->path = (probefunc == "fop_create" ||
+ probefunc == "fop_mkdir" ||
+ probefunc == "fop_rmdir" ||
+ probefunc == "fop_remove" ||
+ probefunc == "fop_lookup") ?
+ strjoin(self->path, strjoin("/", stringof(arg1))) : self->path;
+
+ OPT_trace ?
+ printf("%2s %-15s %-10s %51s %2s %8d %8d\n",
+ "->", probefunc, "-", self->path, "-",
+ self->len, self->off) : 1;
+
+ self->type = probefunc;
+ self->vop_entry[probefunc] = timestamp;
+ }
+
+ fbt::fop_*:return
+ /self->trace == 1/
+ {
+ OPT_trace ?
+ printf("%2s %-15s %-10s %51s %2s %8d %8d\n",
+ "<-", probefunc, "-", self->path, "-",
+ self->len, self->off) : 1;
+
+ OPT_stats == 1 ?
+ @vop_time[probefunc] =
+ sum(timestamp - self->vop_entry[probefunc]) : 1;
+ OPT_stats == 1 ?
+ @vop_cnt[probefunc] = count() : 1;
+
+ self->path = 0;
+ self->len = 0;
+ self->off = 0;
+ }
+
+ fbt::fop_*:return
+ {
+ self->trace = 0;
+ self->type = 0;
+ self->vp = 0;
+ }
+
+ /* Capture any I/O within this fop */
+ io:::start
+ /self->trace/
+ {
+ OPT_stats == 1 ?
+ @vop_iocnt[self->type] = count() : 1;
+
+ OPT_trace == 1?
+ printf("%2s %-15s %-10s %51s %2s %8d %8u\n",
+ "--", self->type, args[1]->dev_statname,
+ self->path, args[0]->b_flags & B_READ ? "R" : "W",
+ args[0]->b_bcount, args[0]->b_blkno) : 1;
+ }
+
+ profile:::tick-5s
+ /OPT_stats == 1/
+ {
+ /* Print top 20 only */
+ trunc(@vop_iocnt, 20);
+ trunc(@vop_time, 20);
+
+ /* Display microseconds */
+ normalize(@vop_time, 1000000);
+ printf("\033[H\033[2J");
+ printf("%-60s %10s\n", "VOP Physical IO", "Count");
+ printa("%-60s %10@d\n", @vop_iocnt);
+ printf("\n");
+ printf("%-60s %10s\n", "VOP Count", "Count");
+ printa("%-60s %10@d\n", @vop_cnt);
+ printf("\n");
+ printf("%-60s %10s\n", "VOP Wall Time", "mSeconds");
+ printa("%-60s %10@d\n", @vop_time);
+
+ /* Clear data */
+ trunc(@vop_iocnt);
+ trunc(@vop_cnt);
+ trunc(@vop_time);
+ }
+'
diff --git a/Guide b/Guide
new file mode 100644
index 000000000000..739d3670b83b
--- /dev/null
+++ b/Guide
@@ -0,0 +1,91 @@
+Guide - Guide to the DTraceToolkit
+
+ How to get started, and a table of contents.
+
+QuickStart
+
+ 1. The top most useful scripts are in this directory.
+ 2. Try running them with "-h". Eg, "./execsnoop -h".
+ 3. Read Docs/Contents for a full list of scripts.
+
+QuickStart-by-Screenshot
+
+ 1. Look through the examples in the Examples directory until
+ you see an output you like
+ 2. Find the script and run it
+ 3. Look for its man page in Man
+
+Not-so-QuickStart
+
+ 1. Welcome!
+ 2. Check the Table of Contents below to become famaliar with the
+ directory structure of the DTraceToolkit.
+ 3. See Docs/Faq for any initial questions.
+ 4. Read Docs/Contents for a list of scripts.
+ 5. Read Docs/Readme to see where scripts are documented.
+ 6. Check Docs/Links for further DTrace.
+ 7. Once famaliar with the toolkit, the following may be useful to
+ add to your shell initialisation file,
+ PATH=$PATH:/opt/DTT/Bin
+ MANPATH=$MANPATH:/opt/DTT/Man
+ in this case assuming the toolkit was installed in /opt/DTT.
+
+Installation
+
+ 1. Run ./install
+ This will replace any existing version of the DTraceToolkit
+ with this one. It will prompt. Final install location is
+ printed by this install script.
+
+Table of Contents
+
+ DTraceToolkit-X.XX/
+ Bin/ Symlinks to all the scripts
+ Apps/ Application specific scripts
+ Cpu/ Scripts for CPU analysis
+ Code/ Example code to practise on
+ Disk/ Scripts for disk I/O analysis
+ Docs/ Documentation
+ Contents Command list for the Toolkit
+ Faq Frequently asked questions
+ Links Further DTrace links
+ Readme Readme for using the docs
+ Examples/ Examples of command usage
+ Guide This file!
+ Include/ DTrace include files
+ Java/ Scripts for tracing Java
+ JavaScript/ Scripts for tracing JavaScript
+ Kernel/ Scripts for kernel analysis
+ License The CDDL license
+ Locks/ Scripts for lock analysis
+ Man/ Man pages
+ man1m/ Man pages for the Toolkit commands
+ Mem/ Scripts for memory analysis
+ Misc/ Misc scripts
+ Net/ Scripts for network analysis
+ Notes/ Notes on Toolkit commands
+ Perl/ Scripts for tracing Perl
+ Php/ Scripts for tracing Php
+ Proc/ Scripts for process analysis
+ Python/ Scripts for tracing Python
+ Ruby/ Scripts for tracing Ruby
+ Shell/ Scripts for tracing Shell languages
+ Snippits/ Snippits of D scripting
+ System/ Scripts for system analysis
+ Tcl/ Scripts for tracing Tcl
+ User/ Scripts for user based activity analysis
+ Zones/ Scripts for analysis by zone
+ Version DTraceToolkit version
+ install Install script, use for installs only
+
+When you type ls in the DTraceToolkit, you will be looking at the top ten
+or so most useful scripts plus the top level directories. Other scripts have
+been placed in meaningful subdirectories, such as Disk, Kernel, Proc, etc.
+
+An optional Bin directory has been provided that links to all the scripts.
+
+The DTraceToolkit is released under the CDDL license. It's the same open
+source license that OpenSolaris has been released under.
+
+Thank you for using the DTraceToolkit!
+
diff --git a/Include/Readme b/Include/Readme
new file mode 100644
index 000000000000..4aa46881e8f4
--- /dev/null
+++ b/Include/Readme
@@ -0,0 +1,18 @@
+Include - include scripts for D scripting
+
+ This directory contains files that can be included for use with D scripts.
+
+ There are two types of include files,
+
+ *.h
+ These can be included using,
+
+ #!/usr/sbin/dtrace -Cs
+ #include <filename.h>
+
+ *.d
+ These must be copyied to a translator directory (/usr/lib/dtrace),
+ and should be automatically pulled in.
+
+ This directory does not contain runnable DTrace scripts.
+
diff --git a/Include/test.ksh b/Include/test.ksh
new file mode 100755
index 000000000000..a3e1036a2061
--- /dev/null
+++ b/Include/test.ksh
@@ -0,0 +1,68 @@
+#!/usr/bin/ksh
+/*
+ * test.ksh - DTrace include file test script.
+ *
+ * $Id: test.ksh 36 2007-09-15 06:51:18Z brendan $
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 16-Sep-2007 Brendan Gregg Created this.
+ */
+
+dtrace -CI . -s /dev/stdin << END
+
+#include "tostr.h"
+#include "time.h"
+
+#pragma D option quiet
+#pragma D option destructive
+
+dtrace:::BEGIN
+{
+ i = 1;
+ printf("\nNUM_TO_STR %12d = %s\n", i, NUM_TO_STR(i));
+ i = 1100;
+ printf("NUM_TO_STR %12d = %s\n", i, NUM_TO_STR(i));
+ i = 1100000;
+ printf("NUM_TO_STR %12d = %s\n", i, NUM_TO_STR(i));
+ i = 999999999;
+ printf("NUM_TO_STR %12d = %s\n", i, NUM_TO_STR(i));
+
+ i = 1;
+ printf("\nBYTES_TO_STR %12d = %s\n", i, BYTES_TO_STR(i));
+ i = 1024;
+ printf("BYTES_TO_STR %12d = %s\n", i, BYTES_TO_STR(i));
+ i = 1000000;
+ printf("BYTES_TO_STR %12d = %s\n", i, BYTES_TO_STR(i));
+ i = 999999999;
+ printf("BYTES_TO_STR %12d = %s\n", i, BYTES_TO_STR(i));
+
+ i = 1;
+ printf("\nUS_TO_STR %12d = %s\n", i, US_TO_STR(i));
+ i = 1100;
+ printf("US_TO_STR %12d = %s\n", i, US_TO_STR(i));
+ i = 999999;
+ printf("US_TO_STR %12d = %s\n", i, US_TO_STR(i));
+
+ printf("\nwalltimestamp : %Y\n", walltimestamp);
+ printf("TZ=GMT date : ");
+ system("TZ=GMT date '+%%H:%%M:%%S'");
+ printf("TIME_HHMMSS : %s\n", TIME_HHMMSS);
+
+ exit(0);
+}
+END
diff --git a/Include/time.h b/Include/time.h
new file mode 100644
index 000000000000..76caa2e97825
--- /dev/null
+++ b/Include/time.h
@@ -0,0 +1,38 @@
+/*
+ * time.h - DTrace Time include file.
+ *
+ * $Id: time.h 36 2007-09-15 06:51:18Z brendan $
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 16-Sep-2007 Brendan Gregg Created this.
+ */
+
+/*
+ * TIME_HHMMSS - Returns GMT time as a "HH:MM:SS" string.
+ *
+ * eg, "21:53:07"
+ */
+#define TIME_HHMMSS \
+ strjoin(strjoin(strjoin(strjoin(strjoin( \
+ (((walltimestamp / 1000000000) % 86400) / 3600) < 10 ? "0" : "",\
+ lltostr(((walltimestamp / 1000000000) % 86400) / 3600)), ":"), \
+ strjoin((((walltimestamp / 1000000000) % 3600) / 60) < 10 ? \
+ "0" : "", lltostr(((walltimestamp / 1000000000) % 3600) / 60))),\
+ ":"), strjoin(((walltimestamp / 1000000000) % 60) < 10 ? \
+ "0" : "", lltostr((walltimestamp / 1000000000) % 60)))
+
diff --git a/Include/tostr.h b/Include/tostr.h
new file mode 100644
index 000000000000..6032f6afb323
--- /dev/null
+++ b/Include/tostr.h
@@ -0,0 +1,89 @@
+/*
+ * tostr.h - DTrace To-String include file.
+ *
+ * $Id: tostr.h 36 2007-09-15 06:51:18Z brendan $
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 16-Sep-2007 Brendan Gregg Created this.
+ */
+
+/*
+ * NUM_TO_STR(n) - takes a number and returns a string with a prefix,
+ * intended to fit withen 6 chars.
+ *
+ * Input Output
+ * 0 0
+ * 1 1
+ * 10 10
+ * 999 999
+ * 1000 1.0K
+ * 1100 1.1K
+ * 10000 10.0K
+ * 999999 999.0K
+ * 1000000 1.0M
+ * 10000000 10.0M
+ * 999999999 999.9M
+ */
+#define NUM_TO_STR(n) \
+ n >= 1000000 ? \
+ strjoin(strjoin(strjoin(lltostr(n / 1000000), "."), \
+ lltostr((n % 1000000) / 100000)), "M") : n >= 1000 ? \
+ strjoin(strjoin(strjoin(lltostr(n / 1000), "."), \
+ lltostr((n % 1000) / 100)), "K") : lltostr(n)
+
+/*
+ * BYTES_TO_STR(n) - takes a byte count and returns a string with a prefix,
+ * intended to fit withen 6 chars.
+ *
+ * Input Output
+ * 0 0
+ * 1 1
+ * 10 10
+ * 999 0.9K
+ * 1000 0.9K
+ * 1024 1.0K
+ * 10240 10.0K
+ * 1000000 976.5K
+ * 1048576 1.0M
+ * 1000000000 953.6M
+ */
+#define BYTES_TO_STR(n) \
+ n >= 1024000 ? \
+ strjoin(strjoin(strjoin(lltostr(n / 1048576), "."), \
+ lltostr((n % 1048576) / 104858)), "M") : n >= 1000 ? \
+ strjoin(strjoin(strjoin(lltostr(n / 1024), "."), \
+ lltostr((n % 1024) / 103)), "K") : lltostr(n)
+
+/*
+ * US_TO_STR(n) - takes microseconds and returns a string with a prefix,
+ * intended to fit withen 6 chars.
+ *
+ * Input Output
+ * 0 0
+ * 1 1u
+ * 10 10u
+ * 999 999u
+ * 1000 1.0m
+ * 1100 1.1m
+ * 10000 10.0m
+ * 999999 999.0m
+ */
+#define US_TO_STR(n) \
+ n == 0 ? "0" : n >= 1000 ? \
+ strjoin(lltostr(n / 1000), "m") : strjoin(lltostr(n), "u")
+
diff --git a/Java/Readme b/Java/Readme
new file mode 100644
index 000000000000..ae455a524d1c
--- /dev/null
+++ b/Java/Readme
@@ -0,0 +1,17 @@
+Java - DTracing Java
+
+ These scripts trace the JVM, and require the Java hotspot provider which
+ was shipped with Java starting with version 1.6.0.
+
+ Some of these scripts measure method and object events, and require
+ the Java process to be run using the "+ExtendedDTraceProbes" flag.
+ For example,
+
+ java -XX:+ExtendedDTraceProbes classfile
+
+ The ExtendedDTraceProbes flag is not on by default to avoid the additional
+ overhead for maintaining these additional probes. When this flag is
+ enabled, the JVM may execute slightly slower than before; when the probes
+ are also enabled (especially method probes), the JVM may execute
+ significantly slower.
+
diff --git a/Java/j_calldist.d b/Java/j_calldist.d
new file mode 100755
index 000000000000..f0cb087fc6a8
--- /dev/null
+++ b/Java/j_calldist.d
@@ -0,0 +1,116 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * j_calldist.d - measure Java elapsed times for different types of operation.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_calldist.d 59 2007-10-03 08:21:58Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0). Method calls are only visible when using the
+ * flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_calldist.d [top] # hit Ctrl-C to end
+ *
+ * The "top" optional argument will truncate the output for each report
+ * section to that many lines, with a default of 10.
+ *
+ * FIELDS:
+ * 1 Process ID
+ * 2 Type of call (method/gc)
+ * 3 Name of call
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#define TOP 10 /* default output truncation */
+#define B_FALSE 0
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ top = $1 != 0 ? $1 : TOP;
+}
+
+hotspot*:::method-entry
+{
+ self->depth[arg0]++;
+ self->exclude[arg0, self->depth[arg0]] = 0;
+ self->method[arg0, self->depth[arg0]] = timestamp;
+}
+
+hotspot*:::method-return
+/self->method[arg0, self->depth[arg0]]/
+{
+ this->elapsed_incl = timestamp - self->method[arg0, self->depth[arg0]];
+ this->elapsed_excl = this->elapsed_incl -
+ self->exclude[arg0, self->depth[arg0]];
+ self->method[arg0, self->depth[arg0]] = 0;
+ self->exclude[arg0, self->depth[arg0]] = 0;
+
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+ this->name = strjoin(strjoin(stringof(this->class), "."),
+ stringof(this->method));
+
+ @types_incl[pid, "method", this->name] =
+ quantize(this->elapsed_incl / 1000);
+ @types_excl[pid, "method", this->name] =
+ quantize(this->elapsed_excl / 1000);
+
+ self->depth[arg0]--;
+ self->exclude[arg0, self->depth[arg0]] += this->elapsed_incl;
+}
+
+hotspot*:::gc-begin
+{
+ self->gc = timestamp;
+ self->full = (boolean_t)arg0;
+}
+
+hotspot*:::gc-end
+/self->gc/
+{
+ this->elapsed = timestamp - self->gc;
+
+ @types[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] =
+ quantize(this->elapsed / 1000);
+
+ self->gc = 0;
+ self->full = 0;
+}
+
+dtrace:::END
+{
+ trunc(@types, top);
+ printf("\nTop %d elapsed times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types);
+
+ trunc(@types_excl, top);
+ printf("\nTop %d exclusive method elapsed times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types_excl);
+
+ trunc(@types_incl, top);
+ printf("\nTop %d inclusive method elapsed times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types_incl);
+}
diff --git a/Java/j_calls.d b/Java/j_calls.d
new file mode 100755
index 000000000000..087545d3ff39
--- /dev/null
+++ b/Java/j_calls.d
@@ -0,0 +1,113 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_calls.d - count Java calls (method/...) using DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_calls.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0). Method calls and object allocation are only
+ * visible when using the flag "+ExtendedDTraceProbes". eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_calls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * TYPE Type of call (see below)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * TYPEs:
+ * cload class load
+ * method method call
+ * mcompile method compile
+ * mload compiled method load
+ * oalloc object alloc
+ * thread thread start
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+hotspot*:::method-entry
+{
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+ this->name = strjoin(strjoin(stringof(this->class), "."),
+ stringof(this->method));
+ @calls[pid, "method", this->name] = count();
+}
+
+hotspot*:::object-alloc
+{
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ @calls[pid, "oalloc", stringof(this->class)] = count();
+}
+
+hotspot*:::class-loaded
+{
+ this->class = (char *)copyin(arg0, arg1 + 1);
+ this->class[arg1] = '\0';
+ @calls[pid, "cload", stringof(this->class)] = count();
+}
+
+hotspot*:::thread-start
+{
+ this->thread = (char *)copyin(arg0, arg1 + 1);
+ this->thread[arg1] = '\0';
+ @calls[pid, "thread", stringof(this->thread)] = count();
+}
+
+hotspot*:::method-compile-begin
+{
+ this->class = (char *)copyin(arg0, arg1 + 1);
+ this->class[arg1] = '\0';
+ this->method = (char *)copyin(arg2, arg3 + 1);
+ this->method[arg3] = '\0';
+ this->name = strjoin(strjoin(stringof(this->class), "."),
+ stringof(this->method));
+ @calls[pid, "mcompile", this->name] = count();
+}
+
+hotspot*:::compiled-method-load
+{
+ this->class = (char *)copyin(arg0, arg1 + 1);
+ this->class[arg1] = '\0';
+ this->method = (char *)copyin(arg2, arg3 + 1);
+ this->method[arg3] = '\0';
+ this->name = strjoin(strjoin(stringof(this->class), "."),
+ stringof(this->method));
+ @calls[pid, "mload", this->name] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT");
+ printa(" %6d %-8s %-52s %@8d\n", @calls);
+}
diff --git a/Java/j_calltime.d b/Java/j_calltime.d
new file mode 100755
index 000000000000..be4da519180d
--- /dev/null
+++ b/Java/j_calltime.d
@@ -0,0 +1,129 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * j_calltime.d - measure Java elapsed times for different types of operation.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_calltime.d 59 2007-10-03 08:21:58Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0). Method calls are only visible when using the
+ * flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_calltime.d [top] # hit Ctrl-C to end
+ *
+ * The "top" optional argument will truncate the output for each report
+ * section to that many lines, with a default of 10.
+ *
+ * FIELDS:
+ * PID Process ID
+ * TYPE Type of call (method/gc/total)
+ * NAME Name of call
+ * TOTAL Total elapsed time for calls (us)
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#define TOP 10 /* default output truncation */
+#define B_FALSE 0
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ top = $1 != 0 ? $1 : TOP;
+}
+
+hotspot*:::method-entry
+{
+ self->depth[arg0]++;
+ self->exclude[arg0, self->depth[arg0]] = 0;
+ self->method[arg0, self->depth[arg0]] = timestamp;
+}
+
+hotspot*:::method-return
+/self->method[arg0, self->depth[arg0]]/
+{
+ this->elapsed_incl = timestamp - self->method[arg0, self->depth[arg0]];
+ this->elapsed_excl = this->elapsed_incl -
+ self->exclude[arg0, self->depth[arg0]];
+ self->method[arg0, self->depth[arg0]] = 0;
+ self->exclude[arg0, self->depth[arg0]] = 0;
+
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+ this->name = strjoin(strjoin(stringof(this->class), "."),
+ stringof(this->method));
+
+ @num[pid, "method", this->name] = count();
+ @num[0, "total", "-"] = count();
+ @types_incl[pid, "method", this->name] = sum(this->elapsed_incl);
+ @types_excl[pid, "method", this->name] = sum(this->elapsed_excl);
+ @types_excl[0, "total", "-"] = sum(this->elapsed_excl);
+
+ self->depth[arg0]--;
+ self->exclude[arg0, self->depth[arg0]] += this->elapsed_incl;
+}
+
+hotspot*:::gc-begin
+{
+ self->gc = timestamp;
+ self->full = (boolean_t)arg0;
+}
+
+hotspot*:::gc-end
+/self->gc/
+{
+ this->elapsed = timestamp - self->gc;
+ self->gc = 0;
+
+ @num[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] = count();
+ @types[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] =
+ sum(this->elapsed);
+ self->full = 0;
+}
+
+dtrace:::END
+{
+ trunc(@num, top);
+ printf("\nTop %d counts,\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "COUNT");
+ printa(" %6d %-10s %-48s %@8d\n", @num);
+
+ trunc(@types, top);
+ normalize(@types, 1000);
+ printf("\nTop %d elapsed times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types);
+
+ trunc(@types_excl, top);
+ normalize(@types_excl, 1000);
+ printf("\nTop %d exclusive method elapsed times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types_excl);
+
+ trunc(@types_incl, top);
+ normalize(@types_incl, 1000);
+ printf("\nTop %d inclusive method elapsed times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types_incl);
+}
diff --git a/Java/j_classflow.d b/Java/j_classflow.d
new file mode 100755
index 000000000000..162338ad2186
--- /dev/null
+++ b/Java/j_classflow.d
@@ -0,0 +1,100 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_classflow.d - trace a Java class method flow using DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_classflow.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_classflow.d classname # hit Ctrl-C to end
+ *
+ * This watches Java method entries and returns, and indents child
+ * method calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * PID Process ID
+ * CLASS.METHOD Java class and method name
+ *
+ * LEGEND:
+ * -> method entry
+ * <- method return
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ * Changes in TID will appear to shuffle output, as we change from one thread
+ * depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+/* increasing bufsize can reduce drops */
+#pragma D option bufsize=16m
+#pragma D option quiet
+#pragma D option defaultargs
+#pragma D option switchrate=10
+
+self int depth[int];
+
+dtrace:::BEGIN
+/$$1 == ""/
+{
+ printf("USAGE: j_classflow.d classname\n");
+ exit(1);
+}
+
+dtrace:::BEGIN
+{
+ printf("%3s %6s %-16s -- %s\n", "C", "PID", "TIME(us)", "CLASS.METHOD");
+}
+
+hotspot*:::method-entry,
+hotspot*:::method-return
+{
+ this->class = stringof((char *)copyin(arg1, arg2 + 1));
+ this->class[arg2] = '\0';
+}
+
+hotspot*:::method-entry
+/this->class == $$1/
+{
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+
+ printf("%3d %6d %-16d %*s-> %s.%s\n", cpu, pid, timestamp / 1000,
+ self->depth[arg0] * 2, "", stringof(this->class),
+ stringof(this->method));
+ self->depth[arg0]++;
+}
+
+hotspot*:::method-return
+/this->class == $$1/
+{
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+
+ self->depth[arg0] -= self->depth[arg0] > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %*s<- %s.%s\n", cpu, pid, timestamp / 1000,
+ self->depth[arg0] * 2, "", stringof(this->class),
+ stringof(this->method));
+}
diff --git a/Java/j_cpudist.d b/Java/j_cpudist.d
new file mode 100755
index 000000000000..9a4626e4c62a
--- /dev/null
+++ b/Java/j_cpudist.d
@@ -0,0 +1,116 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * j_cpudist.d - measure Java on-CPU times for different types of operation.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_cpudist.d 59 2007-10-03 08:21:58Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0). Method calls are only visible when using the
+ * flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_cpudist.d [top] # hit Ctrl-C to end
+ *
+ * The "top" optional argument will truncate the output for each report
+ * section to that many lines, with a default of 10.
+ *
+ * FIELDS:
+ * 1 Process ID
+ * 2 Type of call (method/gc)
+ * 3 Name of call
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#define TOP 10 /* default output truncation */
+#define B_FALSE 0
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ top = $1 != 0 ? $1 : TOP;
+}
+
+hotspot*:::method-entry
+{
+ self->depth[arg0]++;
+ self->exclude[arg0, self->depth[arg0]] = 0;
+ self->method[arg0, self->depth[arg0]] = vtimestamp;
+}
+
+hotspot*:::method-return
+/self->method[arg0, self->depth[arg0]]/
+{
+ this->oncpu_incl = vtimestamp - self->method[arg0, self->depth[arg0]];
+ this->oncpu_excl = this->oncpu_incl -
+ self->exclude[arg0, self->depth[arg0]];
+ self->method[arg0, self->depth[arg0]] = 0;
+ self->exclude[arg0, self->depth[arg0]] = 0;
+
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+ this->name = strjoin(strjoin(stringof(this->class), "."),
+ stringof(this->method));
+
+ @types_incl[pid, "method", this->name] =
+ quantize(this->oncpu_incl / 1000);
+ @types_excl[pid, "method", this->name] =
+ quantize(this->oncpu_excl / 1000);
+
+ self->depth[arg0]--;
+ self->exclude[arg0, self->depth[arg0]] += this->oncpu_incl;
+}
+
+hotspot*:::gc-begin
+{
+ self->gc = vtimestamp;
+ self->full = (boolean_t)arg0;
+}
+
+hotspot*:::gc-end
+/self->gc/
+{
+ this->oncpu = vtimestamp - self->gc;
+
+ @types[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] =
+ quantize(this->oncpu / 1000);
+
+ self->gc = 0;
+ self->full = 0;
+}
+
+dtrace:::END
+{
+ trunc(@types, top);
+ printf("\nTop %d on-CPU times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types);
+
+ trunc(@types_excl, top);
+ printf("\nTop %d exclusive method on-CPU times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types_excl);
+
+ trunc(@types_incl, top);
+ printf("\nTop %d inclusive method on-CPU times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types_incl);
+}
diff --git a/Java/j_cputime.d b/Java/j_cputime.d
new file mode 100755
index 000000000000..a720cdb439a4
--- /dev/null
+++ b/Java/j_cputime.d
@@ -0,0 +1,129 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * j_cputime.d - measure Java on-CPU times for different types of operation.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_cputime.d 59 2007-10-03 08:21:58Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0). Method calls are only visible when using the
+ * flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_cputime.d [top] # hit Ctrl-C to end
+ *
+ * The "top" optional argument will truncate the output for each report
+ * section to that many lines, with a default of 10.
+ *
+ * FIELDS:
+ * PID Process ID
+ * TYPE Type of call (method/gc/total)
+ * NAME Name of call
+ * TOTAL Total on-CPU time for calls (us)
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#define TOP 10 /* default output truncation */
+#define B_FALSE 0
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ top = $1 != 0 ? $1 : TOP;
+}
+
+hotspot*:::method-entry
+{
+ self->depth[arg0]++;
+ self->exclude[arg0, self->depth[arg0]] = 0;
+ self->method[arg0, self->depth[arg0]] = vtimestamp;
+}
+
+hotspot*:::method-return
+/self->method[arg0, self->depth[arg0]]/
+{
+ this->oncpu_incl = vtimestamp - self->method[arg0, self->depth[arg0]];
+ this->oncpu_excl = this->oncpu_incl -
+ self->exclude[arg0, self->depth[arg0]];
+ self->method[arg0, self->depth[arg0]] = 0;
+ self->exclude[arg0, self->depth[arg0]] = 0;
+
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+ this->name = strjoin(strjoin(stringof(this->class), "."),
+ stringof(this->method));
+
+ @num[pid, "method", this->name] = count();
+ @num[0, "total", "-"] = count();
+ @types_incl[pid, "method", this->name] = sum(this->oncpu_incl);
+ @types_excl[pid, "method", this->name] = sum(this->oncpu_excl);
+ @types_excl[0, "total", "-"] = sum(this->oncpu_excl);
+
+ self->depth[arg0]--;
+ self->exclude[arg0, self->depth[arg0]] += this->oncpu_incl;
+}
+
+hotspot*:::gc-begin
+{
+ self->gc = vtimestamp;
+ self->full = (boolean_t)arg0;
+}
+
+hotspot*:::gc-end
+/self->gc/
+{
+ this->oncpu = vtimestamp - self->gc;
+ self->gc = 0;
+
+ @num[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] = count();
+ @types[pid, "gc", self->full == B_FALSE ? "GC" : "Full GC"] =
+ sum(this->oncpu);
+ self->full = 0;
+}
+
+dtrace:::END
+{
+ trunc(@num, top);
+ printf("\nTop %d counts,\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "COUNT");
+ printa(" %6d %-10s %-48s %@8d\n", @num);
+
+ trunc(@types, top);
+ normalize(@types, 1000);
+ printf("\nTop %d on-CPU times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types);
+
+ trunc(@types_excl, top);
+ normalize(@types_excl, 1000);
+ printf("\nTop %d exclusive method on-CPU times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types_excl);
+
+ trunc(@types_incl, top);
+ normalize(@types_incl, 1000);
+ printf("\nTop %d inclusive method on-CPU times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types_incl);
+}
diff --git a/Java/j_events.d b/Java/j_events.d
new file mode 100755
index 000000000000..d8c938b2c134
--- /dev/null
+++ b/Java/j_events.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_events.d - count Java events using DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_events.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0). Some events such as method calls are only
+ * visible when using the flag "+ExtendedDTraceProbes". eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_events.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * EVENT Event name (DTrace probe name)
+ * COUNT Number of calls during sample
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+/* this matches both hotspot and hotspot_jni providers */
+hotspot*:::
+{
+ @calls[pid, probename] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %-36s %8s\n", "PID", "EVENT", "COUNT");
+ printa(" %6d %-36s %@8d\n", @calls);
+}
diff --git a/Java/j_flow.d b/Java/j_flow.d
new file mode 100755
index 000000000000..e98c06784a4a
--- /dev/null
+++ b/Java/j_flow.d
@@ -0,0 +1,87 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_flow.d - snoop Java execution showing method flow using DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_flow.d 38 2007-09-16 08:17:41Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_flow.d # hit Ctrl-C to end
+ *
+ * This watches Java method entries and returns, and indents child
+ * method calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * PID Process ID
+ * CLASS.METHOD Java class and method name
+ *
+ * LEGEND:
+ * -> method entry
+ * <- method return
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ * Changes in TID will appear to shuffle output, as we change from one thread
+ * depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+/* increasing bufsize can reduce drops */
+#pragma D option bufsize=16m
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth[int];
+
+dtrace:::BEGIN
+{
+ printf("%3s %6s %-16s -- %s\n", "C", "PID", "TIME(us)", "CLASS.METHOD");
+}
+
+hotspot*:::method-entry
+{
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+
+ printf("%3d %6d %-16d %*s-> %s.%s\n", cpu, pid, timestamp / 1000,
+ self->depth[arg0] * 2, "", stringof(this->class),
+ stringof(this->method));
+ self->depth[arg0]++;
+}
+
+hotspot*:::method-return
+{
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+
+ self->depth[arg0] -= self->depth[arg0] > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %*s<- %s.%s\n", cpu, pid, timestamp / 1000,
+ self->depth[arg0] * 2, "", stringof(this->class),
+ stringof(this->method));
+}
diff --git a/Java/j_flowtime.d b/Java/j_flowtime.d
new file mode 100755
index 000000000000..53e75cdf9cc9
--- /dev/null
+++ b/Java/j_flowtime.d
@@ -0,0 +1,101 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_flowtime.d - snoop Java execution with method flow and delta times.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_flowtime.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_flowtime.d # hit Ctrl-C to end
+ *
+ * This watches Java method entries and returns, and indents child
+ * method calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * TID Thread ID
+ * TIME(us) Time since boot (us)
+ * DELTA(us) Elapsed time from previous line to this line
+ * CLASS.METHOD Java class and method name
+ *
+ * LEGEND:
+ * -> method entry
+ * <- method return
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ * Changes in TID will appear to shuffle output, as we change from one thread
+ * depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+/* increasing bufsize can reduce drops */
+#pragma D option bufsize=16m
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth[int];
+
+dtrace:::BEGIN
+{
+ printf("%3s %6s/%-5s %-16s %9s -- %s\n", "C", "PID", "TID", "TIME(us)",
+ "DELTA(us)", "CLASS.METHOD");
+}
+
+hotspot*:::method-entry,
+hotspot*:::method-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+hotspot*:::method-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+
+ printf("%3d %6d/%-5d %-16d %9d %*s-> %s.%s\n", cpu, pid, tid,
+ timestamp / 1000, this->delta, self->depth[arg0] * 2, "",
+ stringof(this->class), stringof(this->method));
+ self->depth[arg0]++;
+ self->last = timestamp;
+}
+
+hotspot*:::method-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+
+ self->depth[arg0] -= self->depth[arg0] > 0 ? 1 : 0;
+ printf("%3d %6d/%-5d %-16d %9d %*s<- %s.%s\n", cpu, pid, tid,
+ timestamp / 1000, this->delta, self->depth[arg0] * 2, "",
+ stringof(this->class), stringof(this->method));
+ self->last = timestamp;
+}
diff --git a/Java/j_methodcalls.d b/Java/j_methodcalls.d
new file mode 100755
index 000000000000..606b8200c3c8
--- /dev/null
+++ b/Java/j_methodcalls.d
@@ -0,0 +1,60 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_methodcalls.d - count Java method calls DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_methodcalls.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_methodcalls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * COUNT Number of calls during sample
+ * CLASS.METHOD Java class and method name
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+hotspot*:::method-entry
+{
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+ this->name = strjoin(strjoin(stringof(this->class), "."),
+ stringof(this->method));
+ @calls[pid, this->name] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %8s %s\n", "PID", "COUNT", "CLASS.METHOD");
+ printa(" %6d %@8d %s\n", @calls);
+}
diff --git a/Java/j_objnew.d b/Java/j_objnew.d
new file mode 100755
index 000000000000..88470054c6a5
--- /dev/null
+++ b/Java/j_objnew.d
@@ -0,0 +1,61 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_objnew.d - report Java object allocation using DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_objnew.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_objnew.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * OBJS Number of objects created
+ * CLASS.METHOD Java class and method name
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+hotspot*:::object-alloc
+{
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ @objs[pid, stringof(this->class)] = count();
+ @dist[pid, stringof(this->class)] = quantize(arg3);
+}
+
+dtrace:::END
+{
+ printf("Java object allocation byte distributions by pid and class,\n");
+ printa(@dist);
+
+ printf("Java object allocation count by pid and class,\n\n");
+ printf(" %6s %8s %s\n", "PID", "OBJS", "CLASS");
+ printa(" %6d %8@d %s\n", @objs);
+}
diff --git a/Java/j_package.d b/Java/j_package.d
new file mode 100755
index 000000000000..cfeaf050bd4b
--- /dev/null
+++ b/Java/j_package.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_package.d - count Java class loads by package using DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_package.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0).
+ *
+ * USAGE: j_package.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * LOADS Class loads during trace
+ * PACKAGE Package name from class
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+hotspot*:::class-loaded
+{
+ this->class = (char *)copyin(arg0, arg1 + 1);
+ this->class[arg1] = '\0';
+
+ @loads[pid, dirname(stringof(this->class))] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %8s %s\n", "PID", "LOADS", "PACKAGE");
+ printa(" %6d %@8d %s\n", @loads);
+}
diff --git a/Java/j_profile.d b/Java/j_profile.d
new file mode 100755
index 000000000000..4ff009e91068
--- /dev/null
+++ b/Java/j_profile.d
@@ -0,0 +1,78 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * j_profile.d - sample stack traces with Java translations using DTrace.
+ *
+ * USAGE: j_profile.d { -p PID | -c cmd } # hit Ctrl-C to end
+ * $Id: j_profile.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ *
+ * This samples stack traces for the process specified. This stack trace
+ * will cross the JVM and system libraries, and insert translations for Java
+ * stack frames where appropriate. This is best explained with an example
+ * stack frame output,
+ *
+ * Func_loop.func_c()V
+ * Func_loop.func_b()V
+ * Func_loop.func_a()V
+ * Func_loop.main([Ljava/lang/String;)V
+ * StubRoutines (1)
+ * libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHan
+ * libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmetho
+ * libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJ
+ * libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_j
+ * libjvm.so`jni_CallStaticVoidMethod+0x15d
+ * java`JavaMain+0xd30
+ * libc.so.1`_thr_setup+0x52
+ * libc.so.1`_lwp_start
+ * 101
+ *
+ * The lines at the top are Java frames, followed by the JVM (libjvm.so).
+ * The JVM symbols may be translated by passing the output through c++filt.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option jstackstrsize=1024
+
+/*
+ * Tunables
+ */
+#define DEPTH 10 /* stack depth, frames */
+#define RATE 101 /* sampling rate, Hertz */
+#define TOP 25 /* number of stacks to output */
+
+dtrace:::BEGIN
+{
+ printf("Sampling %d-level stacks at %d Hertz... Hit Ctrl-C to end.\n",
+ DEPTH, RATE);
+}
+
+profile-RATE
+/pid == $target/
+{
+ @stacks[jstack(DEPTH)] = count();
+}
+
+dtrace:::END
+{
+ trunc(@stacks, TOP);
+ printf("Top %d most frequently sampled stacks,\n", TOP);
+ printa(@stacks);
+}
diff --git a/Java/j_stat.d b/Java/j_stat.d
new file mode 100755
index 000000000000..862fe31f46d8
--- /dev/null
+++ b/Java/j_stat.d
@@ -0,0 +1,148 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_stat.d - Java operation stats using DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_stat.d 64 2007-10-04 08:35:29Z claire $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0). Method calls and object allocation are only
+ * visible when using the flag "+ExtendedDTraceProbes". eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_stat.d [interval [count]]
+ *
+ * FIELDS:
+ * EXEC/s Java programs executed per second, including
+ * those without Java provider support
+ * THREAD/s Threads created, per second
+ * METHOD/s Methods called, per second
+ * OBJNEW/s Objects created, per second
+ * CLOAD/s Class loads, per second
+ * EXCP/s Exceptions raised, per second
+ * GC/s Garbage collects, per second
+ *
+ * The numbers are per second counts for the interval specified. The default
+ * interval is 1 second.
+ *
+ * If you see a count in "EXECS" but not in the other columns, then your
+ * Java software is probably not running with the DTrace hotspot provider.
+ *
+ * If you see counts in "CLOAD" but not in "METHODS", then you Java
+ * software probably isn't running with "+ExtendedDTraceProbes".
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+inline int SCREEN = 21;
+
+dtrace:::BEGIN
+{
+ execs = threads = methods = objnew = cload = gc = exception = 0;
+ lines = SCREEN + 1;
+ interval = $1 ? $1 : 1;
+ counts = $2 ? $2 : -1;
+ secs = interval;
+ first = 1;
+}
+
+profile:::tick-1sec
+{
+ secs--;
+}
+
+/*
+ * Print Header
+ */
+dtrace:::BEGIN,
+profile:::tick-1sec
+/first || (secs == 0 && lines > SCREEN)/
+{
+ printf("%-20s %6s %8s %8s %8s %8s %6s %6s\n", "TIME", "EXEC/s",
+ "THREAD/s", "METHOD/s", "OBJNEW/s", "CLOAD/s", "EXCP/s", "GC/s");
+ lines = 0;
+ first = 0;
+}
+
+/*
+ * Tally Data
+ */
+proc:::exec-success
+/execname == "java"/
+{
+ execs++;
+}
+
+hotspot*:::thread-start
+{
+ threads++;
+}
+
+hotspot*:::method-entry
+{
+ methods++;
+}
+
+hotspot*:::object-alloc
+{
+ oalloc++;
+}
+
+hotspot*:::class-loaded
+{
+ cload++;
+}
+
+hotspot*:::gc-begin
+{
+ gc++;
+}
+
+hotspot*:::ExceptionOccurred-entry
+{
+ exception++;
+}
+
+/*
+ * Print Output
+ */
+profile:::tick-1sec
+/secs == 0/
+{
+ printf("%-20Y %6d %8d %8d %8d %8d %6d %6d\n", walltimestamp,
+ execs / interval, threads / interval, methods / interval,
+ oalloc / interval, cload / interval, exception / interval,
+ gc / interval);
+ execs = threads = methods = oalloc = cload = gc = exception = 0;
+ secs = interval;
+ lines++;
+ counts--;
+}
+
+/*
+ * End
+ */
+profile:::tick-1sec
+/counts == 0/
+{
+ exit(0);
+}
diff --git a/Java/j_syscalls.d b/Java/j_syscalls.d
new file mode 100755
index 000000000000..4a24dea75ae3
--- /dev/null
+++ b/Java/j_syscalls.d
@@ -0,0 +1,68 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_syscalls.d - count Java methods and syscalls using DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_syscalls.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This traces Java methods if the hotspot provider exists (1.6.0) and
+ * the flag "+ExtendedDTraceProbes" is used. eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * TYPE Type of call (method/syscall)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+hotspot$target:::method-entry
+{
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+ this->name = strjoin(strjoin(stringof(this->class), "."),
+ stringof(this->method));
+ @calls[pid, "method", this->name] = count();
+}
+
+syscall:::entry
+/pid == $target/
+{
+ @calls[pid, "syscall", probefunc] = count();
+}
+
+
+dtrace:::END
+{
+ printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT");
+ printa(" %6d %-8s %-52s %@8d\n", @calls);
+}
diff --git a/Java/j_syscolors.d b/Java/j_syscolors.d
new file mode 100755
index 000000000000..691ae7eda5eb
--- /dev/null
+++ b/Java/j_syscolors.d
@@ -0,0 +1,135 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_syscolors.d - trace Java method flow plus syscalls, in color.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_syscolors.d 58 2007-10-01 13:36:29Z brendan $
+ *
+ * This traces Java methods if the hotspot provider exists (1.6.0) and
+ * the flag "+ExtendedDTraceProbes" is used. eg,
+ * java -XX:+ExtendedDTraceProbes classfile
+ *
+ * USAGE: j_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * This watches Java method entries and returns, and indents child
+ * method calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * TID Thread ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * TYPE Type of call (func/syscall)
+ * NAME Java method or syscall name
+ *
+ * If the flow appears to jump, check the TID column - the JVM may have
+ * switched to another thread.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ * Changes in TID will appear to shuffle output, as we change from one thread
+ * depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+/* increasing bufsize can reduce drops */
+#pragma D option bufsize=32m
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth[int];
+
+dtrace:::BEGIN
+{
+ color_java = "\033[2;35m"; /* violet, faint */
+ color_line = "\033[1;35m"; /* violet, bold */
+ color_syscall = "\033[2;32m"; /* green, faint */
+ color_off = "\033[0m"; /* default */
+
+ printf("%3s %6s/%-5s %9s %-8s -- %s\n", "C", "PID", "TID", "DELTA(us)",
+ "TYPE", "NAME");
+}
+
+hotspot$target:::method-entry,
+hotspot$target:::method-return,
+syscall:::entry,
+syscall:::return
+/self->last == 0 && pid == $target/
+{
+ self->last = timestamp;
+}
+
+hotspot$target:::method-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+
+ printf("%s%3d %6d/%-5d %9d %-8s %*s-> %s.%s%s\n", color_java, cpu,
+ pid, tid, this->delta, "method", self->depth[arg0] * 2, "",
+ stringof(this->class), stringof(this->method), color_off);
+ self->depth[arg0]++;
+ self->depthlast = self->depth[arg0];
+ self->last = timestamp;
+}
+
+hotspot$target:::method-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->class = (char *)copyin(arg1, arg2 + 1);
+ this->class[arg2] = '\0';
+ this->method = (char *)copyin(arg3, arg4 + 1);
+ this->method[arg4] = '\0';
+
+ self->depth[arg0] -= self->depth[arg0] > 0 ? 1 : 0;
+ printf("%s%3d %6d/%-5d %9d %-8s %*s<- %s.%s%s\n", color_java, cpu,
+ pid, tid, this->delta, "method", self->depth[arg0] * 2, "",
+ stringof(this->class), stringof(this->method), color_off);
+ self->depthlast = self->depth[arg0];
+ self->last = timestamp;
+}
+
+syscall:::entry
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%3d %6d/%-5d %9d %-8s %*s-> %s%s\n", color_syscall,
+ cpu, pid, tid, this->delta, "syscall", self->depthlast * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+syscall:::return
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%3d %6d/%-5d %9d %-8s %*s<- %s%s\n", color_syscall,
+ cpu, pid, tid, this->delta, "syscall", self->depthlast * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+proc:::exit
+/pid == $target/
+{
+ exit(0);
+}
diff --git a/Java/j_thread.d b/Java/j_thread.d
new file mode 100755
index 000000000000..08d2de8b14c1
--- /dev/null
+++ b/Java/j_thread.d
@@ -0,0 +1,64 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_thread.d - snoop Java thread execution using DTrace.
+ Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_thread.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0).
+ *
+ * USAGE: j_thread.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * TIME Time string
+ * PID Process ID
+ * TID Thread ID
+ * THREAD Thread name
+ *
+ * LEGEND:
+ * => thread start
+ * <= thread end
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+dtrace:::BEGIN
+{
+ printf("%-20s %6s/%-5s -- %s\n", "TIME", "PID", "TID", "THREAD");
+}
+
+hotspot*:::thread-start
+{
+ this->thread = (char *)copyin(arg0, arg1 + 1);
+ this->thread[arg1] = '\0';
+ printf("%-20Y %6d/%-5d => %s\n", walltimestamp, pid, tid,
+ stringof(this->thread));
+}
+
+hotspot*:::thread-stop
+{
+ this->thread = (char *)copyin(arg0, arg1 + 1);
+ this->thread[arg1] = '\0';
+ printf("%-20Y %6d/%-5d <= %s\n", walltimestamp, pid, tid,
+ stringof(this->thread));
+}
diff --git a/Java/j_who.d b/Java/j_who.d
new file mode 100755
index 000000000000..8785cca73bcf
--- /dev/null
+++ b/Java/j_who.d
@@ -0,0 +1,58 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * j_who.d - trace Java calls by process using DTrace.
+ * Written for the Java hotspot DTrace provider.
+ *
+ * $Id: j_who.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This traces activity from all Java processes on the system with hotspot
+ * provider support (1.6.0).
+ *
+ * USAGE: j_who.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID of Java
+ * UID User ID of the owner
+ * CALLS Number of calls made (a measure of activity)
+ * ARGS Process name and arguments
+ *
+ * The argument list is truncated at 55 characters (up to 80 is easily
+ * available). To easily read the full argument list, use other system tools;
+ * on Solaris use "pargs PID".
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+hotspot*:::Call*-entry
+{
+ @calls[pid, uid, curpsinfo->pr_psargs] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %6s %6s %-55s\n", "PID", "UID", "CALLS", "ARGS");
+ printa(" %6d %6d %@6d %-55.55s\n", @calls);
+}
diff --git a/JavaScript/Readme b/JavaScript/Readme
new file mode 100644
index 000000000000..a9bebf86b892
--- /dev/null
+++ b/JavaScript/Readme
@@ -0,0 +1,54 @@
+JavaScript - DTracing JavaScript
+
+ There scripts trace the JavaScript programming language, and require a
+ browser to be built with the DTrace JavaScript provider.
+
+ The DTrace JavaScript provider was originally written by Brendan Gregg,
+ and later developed as part of a Mozilla DTrace provider suite by
+ engineers from both Sun and Mozilla. It currently exists as patches
+ to the Mozilla source tree and requires building from source to get
+ working; it may be integrated into Solaris builds by default in the
+ future. To download the current patches and instructions, visit,
+
+ http://www.opensolaris.org/os/project/mozilla-dtrace/
+
+ A rough guide for the process is,
+
+ 1. Download the Mozilla source
+ http://developer.mozilla.org/en/docs/Mozilla_Source_Code_Via_CVS
+ 2. Download the Mozilla DTrace framework patch, and apply
+ https://bugzilla.mozilla.org/show_bug.cgi?id=370906
+ 3. Download the JavaScript DTrace provider patch, and apply
+ https://bugzilla.mozilla.org/show_bug.cgi?id=388564
+ 4. Create a .mozconfig file (needed for compilation).
+ 5. Setup various compilation environment vars (CC/CFLAGS/CXX/...)
+ 6. autoconf
+ 7. ./configure --enable-dtrace
+ 8. gmake
+
+ See John Rice's instructions linked from the OpenSolaris page above
+ for details on steps 4-8.
+
+ Since the DTrace JavaScript provider may be developed further, there is a
+ chance that it has changed slightly by the time you are reading this,
+ causing these scripts to either break or behave oddly. Firstly, check for
+ newer versions of the DTraceToolkit; if it hasn't been updated and you need
+ to use these scripts immediately, then updating them shouldn't take
+ too long. The following was the state of the provider when these scripts
+ were written - check for changes and update the scripts accordingly,
+
+ provider javascript {
+ probe function-entry(file, class, func)
+ probe function-info(file, class, func, lineno, runfile, runlineno)
+ probe function-args(file, class, func, argc, argv, argv0, argv1,
+ argv2, argv3, argv4)
+ probe function-rval(file, class, func, lineno, rval, rval0)
+ probe function-return(file, class, func)
+ probe object-create-start(file, class)
+ probe object-create(file, class, *object, rlineno)
+ probe object-create-done(file, class)
+ probe object-finalize(NULL, class, *object)
+ probe execute-start(file, lineno)
+ probe execute-done(file, lineno)
+ };
+
diff --git a/JavaScript/js_calldist.d b/JavaScript/js_calldist.d
new file mode 100755
index 000000000000..2c4923a53088
--- /dev/null
+++ b/JavaScript/js_calldist.d
@@ -0,0 +1,101 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_calldist.d - measure JavaScript elapsed times for types of operation.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_calldist.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces JavaScript activity from all browsers running on the system with
+ * JavaScript provider support.
+ *
+ * USAGE: js_calldist.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * 1 Filename of the JavaScript program
+ * 2 Type of call (func/obj-new)
+ * 3 Name of call
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+javascript*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+javascript*:::function-return
+/self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg2);
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->elapsed_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->elapsed_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+javascript*:::object-create-start
+{
+ self->object = timestamp;
+}
+
+javascript*:::object-create-done
+/self->object/
+{
+ this->elapsed = timestamp - self->object;
+ self->object = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @types[this->file, "obj-new", this->name] =
+ quantize(this->elapsed / 1000);
+
+ self->exclude[self->depth] += this->elapsed;
+}
+
+dtrace:::END
+{
+ printf("\nElapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types);
+
+ printf("\nExclusive function elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive function elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/JavaScript/js_calls.d b/JavaScript/js_calls.d
new file mode 100755
index 000000000000..98f1a83ae54b
--- /dev/null
+++ b/JavaScript/js_calls.d
@@ -0,0 +1,76 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_calls.d - count JavaScript calls using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_calls.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all browsers on the system that are
+ * running with JavaScript provider support.
+ *
+ * USAGE: js_calls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the JavaScript program
+ * TYPE Type of call (func/obj-new/...)
+ * NAME Descriptive name of call
+ * COUNT Number of calls during sample
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+javascript*:::function-entry
+{
+ this->name = copyinstr(arg2);
+ @calls[basename(copyinstr(arg0)), "func", this->name] = count();
+}
+
+javascript*:::execute-start
+{
+ this->filename = basename(copyinstr(arg0));
+ @calls[this->filename, "exec", "."] = count();
+}
+
+javascript*:::object-create-start
+{
+ this->name = copyinstr(arg1);
+ this->filename = basename(copyinstr(arg0));
+ @calls[this->filename, "obj-new", this->name] = count();
+}
+
+javascript*:::object-finalize
+{
+ this->name = copyinstr(arg1);
+ @calls["<null>", "obj-free", this->name] = count();
+}
+
+dtrace:::END
+{
+ printf(" %-24s %-10s %-30s %8s\n", "FILE", "TYPE", "NAME", "CALLS");
+ printa(" %-24s %-10s %-30s %@8d\n", @calls);
+}
diff --git a/JavaScript/js_calltime.d b/JavaScript/js_calltime.d
new file mode 100755
index 000000000000..dce150e3e5ac
--- /dev/null
+++ b/JavaScript/js_calltime.d
@@ -0,0 +1,115 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_calltime.d - measure JavaScript elapsed times for types of operation.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_calltime.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces JavaScript activity from all browsers running on the system with
+ * JavaScript provider support.
+ *
+ * USAGE: js_calltime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the JavaScript program
+ * TYPE Type of call (func/obj-new/gc/total)
+ * NAME Name of call
+ * TOTAL Total elapsed time for calls (us)
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+javascript*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+javascript*:::function-return
+/self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg2);
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl);
+ @types_excl["-", "total", "-"] = sum(this->elapsed_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+javascript*:::object-create-start
+{
+ self->object = timestamp;
+}
+
+javascript*:::object-create-done
+/self->object/
+{
+ this->elapsed = timestamp - self->object;
+ self->object = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @num[this->file, "obj-new", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types[this->file, "obj-new", this->name] = sum(this->elapsed);
+ @types["-", "total", "-"] = sum(this->elapsed);
+
+ self->exclude[self->depth] += this->elapsed;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20.20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types, 1000);
+ printf("\nElapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20.20s %-10s %-32s %@8d\n", @types);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20.20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20.20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/JavaScript/js_cpudist.d b/JavaScript/js_cpudist.d
new file mode 100755
index 000000000000..cbe168d742d4
--- /dev/null
+++ b/JavaScript/js_cpudist.d
@@ -0,0 +1,101 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_cpudist.d - measure JavaScript on-CPU times for types of operation.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_cpudist.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces JavaScript activity from all browsers running on the system with
+ * JavaScript provider support.
+ *
+ * USAGE: js_cpudist.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * 1 Filename of the JavaScript program
+ * 2 Type of call (func/obj-new)
+ * 3 Name of call
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+javascript*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = vtimestamp;
+}
+
+javascript*:::function-return
+/self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg2);
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->oncpu_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->oncpu_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+javascript*:::object-create-start
+{
+ self->object = vtimestamp;
+}
+
+javascript*:::object-create-done
+/self->object/
+{
+ this->oncpu = vtimestamp - self->object;
+ self->object = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @types[this->file, "obj-new", this->name] =
+ quantize(this->oncpu / 1000);
+
+ self->exclude[self->depth] += this->oncpu;
+}
+
+dtrace:::END
+{
+ printf("\nElapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types);
+
+ printf("\nExclusive function on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive function on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/JavaScript/js_cputime.d b/JavaScript/js_cputime.d
new file mode 100755
index 000000000000..bee77abc9953
--- /dev/null
+++ b/JavaScript/js_cputime.d
@@ -0,0 +1,115 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_cputime.d - measure JavaScript on-CPU times for types of operation.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_cputime.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces JavaScript activity from all browsers running on the system with
+ * JavaScript provider support.
+ *
+ * USAGE: js_cputime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the JavaScript program
+ * TYPE Type of call (func/obj-new/gc/total)
+ * NAME Name of call
+ * TOTAL Total on-CPU time for calls (us)
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+javascript*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = vtimestamp;
+}
+
+javascript*:::function-return
+/self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg2);
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl);
+ @types_excl["-", "total", "-"] = sum(this->oncpu_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+javascript*:::object-create-start
+{
+ self->object = vtimestamp;
+}
+
+javascript*:::object-create-done
+/self->object/
+{
+ this->oncpu = vtimestamp - self->object;
+ self->object = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @num[this->file, "obj-new", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types[this->file, "obj-new", this->name] = sum(this->oncpu);
+ @types["-", "total", "-"] = sum(this->oncpu);
+
+ self->exclude[self->depth] += this->oncpu;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20.20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types, 1000);
+ printf("\nElapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20.20s %-10s %-32s %@8d\n", @types);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20.20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20.20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/JavaScript/js_execs.d b/JavaScript/js_execs.d
new file mode 100755
index 000000000000..fb0ca91fb565
--- /dev/null
+++ b/JavaScript/js_execs.d
@@ -0,0 +1,51 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_execs.d - JavaScript execute snoop using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_execs.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all browsers on the system that are
+ * running with JavaScript provider support.
+ *
+ * USAGE: js_execs.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * TIME Time of event
+ * FILE Filename of the JavaScript program
+ * LINENO Line number in filename
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+dtrace:::BEGIN
+{
+ printf("%-20s %32s:%s\n", "TIME", "FILE", "LINENO");
+}
+
+javascript*:::execute-start
+{
+ printf("%-20Y %32s:%d\n", walltimestamp, basename(copyinstr(arg0)),
+ arg1);
+}
diff --git a/JavaScript/js_flow.d b/JavaScript/js_flow.d
new file mode 100755
index 000000000000..450cc69e8070
--- /dev/null
+++ b/JavaScript/js_flow.d
@@ -0,0 +1,69 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_flow.d - snoop JavaScript execution showing function flow using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_flow.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all browsers on the system that are running
+ * with JavaScript provider support.
+ *
+ * USAGE: js_flow.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this function belongs to
+ * FUNC Function name
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-22s -- %s\n", "C", "TIME(us)", "FILE", "FUNC");
+}
+
+javascript*:::function-entry
+{
+ printf("%3d %-16d %-22s %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg2));
+ self->depth++;
+}
+
+javascript*:::function-return
+{
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-22s %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg2));
+}
diff --git a/JavaScript/js_flowinfo.d b/JavaScript/js_flowinfo.d
new file mode 100755
index 000000000000..b4b7d5c47e11
--- /dev/null
+++ b/JavaScript/js_flowinfo.d
@@ -0,0 +1,86 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_flowinfo.d - JavaScript function flow with info using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_flowinfo.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all browsers on the system that are running
+ * with JavaScript provider support.
+ *
+ * USAGE: js_flowinfo.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the JavScript program
+ * LINE Line number of filename
+ * TYPE Type of call (func)
+ * FUNC Function name
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "FUNC");
+}
+
+javascript*:::function-info,
+javascript*:::function-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+javascript*:::function-info
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid,
+ this->delta, basename(copyinstr(arg4)), arg5, "func",
+ self->depth * 2, "", copyinstr(arg2));
+ self->depth++;
+ self->last = timestamp;
+}
+
+javascript*:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %10d %16s:- %-8s %*s<- %s\n", cpu, pid,
+ this->delta, basename(copyinstr(arg0)), "func", self->depth * 2,
+ "", copyinstr(arg2));
+ self->last = timestamp;
+}
diff --git a/JavaScript/js_flowtime.d b/JavaScript/js_flowtime.d
new file mode 100755
index 000000000000..9545274934a5
--- /dev/null
+++ b/JavaScript/js_flowtime.d
@@ -0,0 +1,84 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_flowtime.d - JavaScript function flow with delta times using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_flowtime.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all browsers on the system that are running
+ * with JavaScript provider support.
+ *
+ * USAGE: js_flowtime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this function belongs to
+ * DELTA(us) Elapsed time from previous line to this line
+ * FUNC Function name
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-18s %9s -- %s\n", "C", "TIME(us)", "FILE",
+ "DELTA(us)", "FUNC");
+}
+
+javascript*:::function-entry,
+javascript*:::function-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+javascript*:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %-16d %-18s %9d %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), this->delta, self->depth * 2, "",
+ copyinstr(arg2));
+ self->depth++;
+ self->last = timestamp;
+}
+
+javascript*:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-18s %9d %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), this->delta, self->depth * 2, "",
+ copyinstr(arg2));
+ self->last = timestamp;
+}
diff --git a/JavaScript/js_objcpu.d b/JavaScript/js_objcpu.d
new file mode 100755
index 000000000000..6611f59b4ef3
--- /dev/null
+++ b/JavaScript/js_objcpu.d
@@ -0,0 +1,61 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_objcpu.d - measure JavaScript object creation on-CPU time using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_objcpu.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces JavaScript activity from all browsers running on the system
+ * with JavaScript provider support.
+ *
+ * USAGE: js_objcpu.d # hit Ctrl-C to end
+ *
+ * Class names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+javascript*:::object-create-start
+{
+ self->vstart = vtimestamp;
+}
+
+javascript*:::object-create-done
+/self->vstart/
+{
+ this->oncpu = vtimestamp - self->vstart;
+ @total = sum(this->oncpu);
+ @dist[copyinstr(arg1)] = quantize(this->oncpu / 1000);
+ self->vstart = 0;
+}
+
+dtrace:::END
+{
+ normalize(@total, 1000000);
+ printa("Total object creation on-CPU time (ms): %@d\n\n", @total);
+ printf("Object creation on-CPU time distributions (us),\n");
+ printa(@dist);
+}
diff --git a/JavaScript/js_objgc.d b/JavaScript/js_objgc.d
new file mode 100755
index 000000000000..575b2952f834
--- /dev/null
+++ b/JavaScript/js_objgc.d
@@ -0,0 +1,89 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_objgc.d - trace JavaScript Object GC using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_objgc.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces JavaScript activity from all running browers on the system
+ * which support the JavaScript DTrace provider.
+ *
+ * USAGE: js_objgc.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename that contained the function
+ * CLASS Class to which this new object belongs
+ * TOTAL Object entropy (positive == uncollected)
+ *
+ * This script provides information on which objects are not being garbage
+ * collected, an issue which causes the browser to steadily leak memory.
+ * We trace object creation (+1) and destruction (-1), and provide a
+ * summary each second of the running tally of the object class and
+ * originating filename. If over the period of several minutes an object
+ * type is still steadily increasing, then that would be of interest.
+ * Be patient, depending on the rate of object creation it can take over
+ * ten minutes for garbage collect to kick in.
+ *
+ * NOTES:
+ * - it is possible that you will see negative entropy. That happens
+ * when you begin tracing after some objects have already been created,
+ * and then trace their destruction.
+ * - there are other Things that GC handles, other than Objects; extra
+ * probes can be added to trace them, should the need arise.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+/* if you get dynvardrops, increase this, */
+#pragma D option dynvarsize=32m
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+javascript*:::object-create
+/arg2/
+{
+ this->file = basename(copyinstr(arg0));
+ @objs[this->file, copyinstr(arg1)] = sum(1);
+ filename[arg2] = this->file;
+}
+
+javascript*:::object-finalize
+/filename[arg2] == NULL/
+{
+ @objs["<missed>", copyinstr(arg1)] = sum(-1);
+}
+
+javascript*:::object-finalize
+/filename[arg2] != NULL/
+{
+ @objs[filename[arg2], copyinstr(arg1)] = sum(-1);
+ filename[arg2] = 0;
+}
+
+profile:::tick-1sec,
+dtrace:::END
+{
+ printf("\n %-24s %8s %-20s %23Y\n", "FILE", "TOTAL", "CLASS",
+ walltimestamp);
+ printa(" %-24.24s %@8d %s\n", @objs);
+}
diff --git a/JavaScript/js_objnew.d b/JavaScript/js_objnew.d
new file mode 100755
index 000000000000..f57c7b52ec6f
--- /dev/null
+++ b/JavaScript/js_objnew.d
@@ -0,0 +1,55 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_objnew.d - count JavaScript object creation using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_objnew.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces JavaScript activity from all browsers running on the system
+ * with JavaScript provider support.
+ *
+ * USAGE: js_objnew.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the JavaScript program
+ * CLASS Class of new object
+ * COUNT Number of object creations during tracing
+ *
+ * Filename and class names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+javascript*:::object-create-done
+{
+ @objs[basename(copyinstr(arg0)), copyinstr(arg1)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %-24s %-36s %8s\n", "FILE", "CLASS", "COUNT");
+ printa(" %-24.24s %-36s %@8d\n", @objs);
+}
diff --git a/JavaScript/js_stat.d b/JavaScript/js_stat.d
new file mode 100755
index 000000000000..323776298a04
--- /dev/null
+++ b/JavaScript/js_stat.d
@@ -0,0 +1,120 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_stat.d - JavaScript operation stats using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_stat.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all browsers on the system that are
+ * running with JavaScript provider support.
+ *
+ * USAGE: js_stat.d [interval [count]]
+ *
+ * FIELDS:
+ * EXEC/s JavaScript programs executed per second
+ * FUNCS/s Functions called, per second
+ * OBJNEW/s Objects created, per second
+ * OBJFRE/s Objects freed (finalize), per second
+ *
+ * The numbers are counts for the interval specified. The default interval
+ * is 1 second.
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+inline int SCREEN = 21;
+
+dtrace:::BEGIN
+{
+ execs = funcs = objnew = objfree = 0;
+ lines = SCREEN + 1;
+ interval = $1 ? $1 : 1;
+ counts = $2 ? $2 : -1;
+ secs = interval;
+ first = 1;
+}
+
+profile:::tick-1sec
+{
+ secs--;
+}
+
+/*
+ * Print Header
+ */
+dtrace:::BEGIN,
+profile:::tick-1sec
+/first || (secs == 0 && lines > SCREEN)/
+{
+ printf("%-20s %8s %8s %8s %8s\n", "TIME", "EXEC/s", "FUNC/s",
+ "OBJNEW/s", "OBJFRE/s");
+ lines = 0;
+ first = 0;
+}
+
+/*
+ * Tally Data
+ */
+javascript*:::execute-start
+{
+ execs++;
+}
+
+javascript*:::function-entry
+{
+ funcs++;
+}
+
+javascript*:::object-create-start
+{
+ objnew++;
+}
+
+javascript*:::object-finalize
+{
+ objfree++;
+}
+
+/*
+ * Print Output
+ */
+profile:::tick-1sec
+/secs == 0/
+{
+ printf("%-20Y %8d %8d %8d %8d\n", walltimestamp, execs / interval,
+ funcs / interval, objnew / interval, objfree / interval);
+ execs = funcs = objnew = objfree = 0;
+ secs = interval;
+ lines++;
+ counts--;
+}
+
+/*
+ * End
+ */
+profile:::tick-1sec
+/counts == 0/
+{
+ exit(0);
+}
diff --git a/JavaScript/js_who.d b/JavaScript/js_who.d
new file mode 100755
index 000000000000..f320b481fd32
--- /dev/null
+++ b/JavaScript/js_who.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * js_who.d - trace JavaScript function execution by process using DTrace.
+ * Written for the JavaScript DTrace provider.
+ *
+ * $Id: js_who.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces JavaScript activity from all browsers on the system that are
+ * running with JavaScript provider support.
+ *
+ * USAGE: js_who.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID of JavaScript
+ * UID User ID of the owner
+ * FUNCS Number of function calls
+ * FILE Pathname of the JavaScript program
+ *
+ * Filenames are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+javascript*:::function-entry
+{
+ @funcs[pid, uid, copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %6s %6s %s\n", "PID", "UID", "FUNCS", "FILE");
+ printa(" %6d %6d %@6d %s\n", @funcs);
+}
diff --git a/Kernel/Readme b/Kernel/Readme
new file mode 100644
index 000000000000..3c5d6b3589da
--- /dev/null
+++ b/Kernel/Readme
@@ -0,0 +1,3 @@
+Kernel - Kernel based analysis
+
+ These are scripts to monitor kernel activity.
diff --git a/Kernel/cpudists b/Kernel/cpudists
new file mode 100755
index 000000000000..b708216e191b
--- /dev/null
+++ b/Kernel/cpudists
@@ -0,0 +1,184 @@
+#!/usr/bin/sh
+#
+# cpudists - print CPU time distributions by Kernel/Idle/Processes.
+# Written using DTrace (Solaris 10 3/05).
+#
+# $Id: cpudists 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: cpudists [-ahV] [-t top] [interval [count]]
+#
+# -a # print all processes
+# -V # don't print timestamps
+# -t num # print top num only
+# eg,
+# cpudists 1 # print every 1 second
+# cpudists -a 10 # print all processes every 10 secs
+#
+#
+# FIELDS:
+# value The following or the process name,
+# IDLE Idle time - CPU running idle thread
+# KERNEL Kernel time - Kernel servicing interrupts, ...
+# PROCESS Process time - PIDs running on the system
+# count Number of occurances at least this duration (ns)
+#
+# NOTES:
+# * This takes into account multiple CPU servers, the total
+# seconds consumed will be a multiple of the CPU count and interval.
+#
+# SEE ALSO: cputimes
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 27-Apr-2005 Brendan Gregg Created this.
+# 22-Sep-2005 " " Fixed key corruption bug.
+# 22-Sep-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+opt_all=0; opt_time=1; opt_top=0; top=0; interval=1; count=1
+
+while getopts aht:V name
+do
+ case $name in
+ a) opt_all=1 ;;
+ V) opt_time=0 ;;
+ t) opt_top=1; top=$OPTARG ;;
+ h|?) cat <<-END >&2
+ USAGE: cpudists [-ahV] [-t top] [interval [count]]
+ cpudists # default output
+ -a # print all processes
+ -V # don't print times
+ -t num # print top num only
+ END
+ exit 1
+ esac
+done
+shift `expr $OPTIND - 1`
+
+if [ "$1" -gt 0 ]; then
+ interval=$1; count=-1; shift
+fi
+if [ "$1" -gt 0 ]; then
+ count=$1; shift
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+
+ /*
+ * Command line arguments
+ */
+ inline int OPT_all = '$opt_all';
+ inline int OPT_time = '$opt_time';
+ inline int OPT_top = '$opt_top';
+ inline int TOP = '$top';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+
+ /* Initialise variables */
+ dtrace:::BEGIN
+ {
+ cpustart[cpu] = 0;
+ counts = COUNTER;
+ secs = INTERVAL;
+ }
+
+ /* Flag this thread as idle */
+ sysinfo:unix:idle_enter:idlethread
+ {
+ idle[cpu] = 1;
+ }
+
+ /* Save kernel time between running threads */
+ sched:::on-cpu
+ /cpustart[cpu]/
+ {
+ this->elapsed = timestamp - cpustart[cpu];
+ @Procs["KERNEL"] = quantize(this->elapsed);
+ }
+
+ /* Save the elapsed time of a thread */
+ sched:::off-cpu,
+ sched:::remain-cpu,
+ profile:::profile-1sec
+ /cpustart[cpu]/
+ {
+ /* determine the name for this thread */
+ program[cpu] = pid == 0 ? idle[cpu] ? "IDLE" : "KERNEL" :
+ OPT_all ? execname : "PROCESS";
+
+ /* save elapsed */
+ this->elapsed = timestamp - cpustart[cpu];
+ @Procs[program[cpu]] = quantize(this->elapsed);
+ cpustart[cpu] = timestamp;
+ }
+
+ /* Record the start time of a thread */
+ sched:::on-cpu,
+ sched:::remain-cpu
+ {
+ idle[cpu] = 0;
+ cpustart[cpu] = timestamp;
+ }
+
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+ /* Print time */
+ profile:::tick-1sec
+ /secs == 0 && OPT_time/
+ {
+ printf("%Y,\n", walltimestamp);
+ }
+
+ /* Print report */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ OPT_top ? trunc(@Procs, TOP) : 1;
+ printa("%16s %@16d\n", @Procs);
+ trunc(@Procs);
+ secs = INTERVAL;
+ counts--;
+ }
+
+ /* End of program */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+
+ /* cleanup for Ctrl-C */
+ dtrace:::END
+ {
+ trunc(@Procs);
+ }
+'
+
diff --git a/Kernel/cputimes b/Kernel/cputimes
new file mode 100755
index 000000000000..881bf90efec6
--- /dev/null
+++ b/Kernel/cputimes
@@ -0,0 +1,203 @@
+#!/usr/bin/sh
+#
+# cputimes - print CPU time consumed by Kernel/Idle/Processes.
+# Written using DTrace (Solaris 10 3/05).
+#
+# $Id: cputimes 3 2007-08-01 10:50:08Z brendan $
+#
+# This program accurately measures time consumed by the kernel, but in
+# doing so creates extra kernel load of it's own. The extra kernel
+# activity can be measured by running one cputimes and then another, and
+# comparing the difference in kernel consumed time. This method can be
+# used to estimate the load created by other DTrace scripts.
+#
+# USAGE: cputimes [-ahTV] [-t top] [interval [count]]
+#
+# -a # print all processes
+# -T # print totals
+# -V # don't print timestamps
+# -t num # print top num lines only
+# eg,
+# cputimes 1 # print every 1 second
+# cputimes -a 10 # print all processes every 10 secs
+# cputimes -at 8 5 # print top 8 lines every 5 secs
+#
+#
+# FIELDS:
+# THREADS The following or the process name,
+# IDLE Idle time - CPU running idle thread
+# KERNEL Kernel time - Kernel servicing interrupts, ...
+# PROCESS Process time - PIDs running on the system
+# TIME (ns) Sum of the CPU time, ns (nanoseconds)
+#
+# NOTES:
+# * This takes into account multiple CPU servers, the total
+# seconds consumed will be a multiple of the CPU count and interval.
+#
+# SEE ALSO: cpudists
+# Heisenberg's uncertainty principle.
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 27-Apr-2005 Brendan Gregg Created this.
+# 22-Sep-2005 " " Fixed a key corruption bug.
+# 22-Sep-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+opt_all=0; opt_time=1; opt_top=0; opt_totals=0
+top=0; interval=1; count=1
+
+while getopts aht:TV name
+do
+ case $name in
+ a) opt_all=1 ;;
+ T) opt_totals=1 ;;
+ V) opt_time=0 ;;
+ t) opt_top=1; top=$OPTARG ;;
+ h|?) cat <<-END >&2
+ USAGE: cputimes [-ahTV] [-t top] [interval [count]]
+ cputimes # default output
+ -a # print all processes
+ -T # print totals
+ -V # don't print times
+ -t num # print top num lines only
+ eg,
+ cputimes 1 # print every 1 second
+ cputimes -a 10 # all processes per 10 sec
+ cputimes -at 8 5 # top 8 lines every 5 secs
+ END
+ exit 1
+ esac
+done
+shift `expr $OPTIND - 1`
+
+if [ "$1" -gt 0 ]; then
+ interval=$1; count=-1; shift
+fi
+if [ "$1" -gt 0 ]; then
+ count=$1; shift
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+
+ /*
+ * Command line arguments
+ */
+ inline int OPT_all = '$opt_all';
+ inline int OPT_time = '$opt_time';
+ inline int OPT_totals = '$opt_totals';
+ inline int OPT_top = '$opt_top';
+ inline int TOP = '$top';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+
+ /* Initialise variables */
+ dtrace:::BEGIN
+ {
+ cpustart[cpu] = 0;
+ counts = COUNTER;
+ secs = INTERVAL;
+ }
+
+ /* Flag this thread as idle */
+ sysinfo:unix:idle_enter:idlethread
+ {
+ idle[cpu] = 1;
+ }
+
+ /* Save kernel time between running threads */
+ sched:::on-cpu
+ /cpustart[cpu]/
+ {
+ this->elapsed = timestamp - cpustart[cpu];
+ @Procs["KERNEL"] = sum(this->elapsed);
+ }
+
+ /* Save the elapsed time of a thread */
+ sched:::off-cpu,
+ sched:::remain-cpu,
+ profile:::profile-1sec
+ /cpustart[cpu]/
+ {
+ /* determine the name for this thread */
+ program[cpu] = pid == 0 ? idle[cpu] ? "IDLE" : "KERNEL" :
+ OPT_all ? execname : "PROCESS";
+
+ /* save elapsed */
+ this->elapsed = timestamp - cpustart[cpu];
+ @Procs[program[cpu]] = sum(this->elapsed);
+ cpustart[cpu] = timestamp;
+ }
+
+ /* Record the start time of a thread */
+ sched:::on-cpu,
+ sched:::remain-cpu
+ {
+ idle[cpu] = 0;
+ cpustart[cpu] = timestamp;
+ }
+
+
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+ /* Print time */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ OPT_time ? printf("%Y,\n", walltimestamp) : 1;
+ printf("%16s %16s\n", "THREADS", "TIME (ns)");
+ }
+
+ /* Print report */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ OPT_top ? trunc(@Procs, TOP) : 1;
+ printa("%16s %@16d\n", @Procs);
+ trunc(@Procs);
+ secs = INTERVAL;
+ counts--;
+ }
+
+ /* End of program */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+
+ /* cleanup for Ctrl-C */
+ dtrace:::END
+ {
+ trunc(@Procs);
+ }
+'
+
diff --git a/Kernel/cswstat.d b/Kernel/cswstat.d
new file mode 100755
index 000000000000..98ca83cc361c
--- /dev/null
+++ b/Kernel/cswstat.d
@@ -0,0 +1,74 @@
+#!/usr/sbin/dtrace -s
+/*
+ * cswstat.d - context switch time stat.
+ * Uses DTrace (Solaris 10 03/05)
+ *
+ * This prints a context switch count and consumed time for context
+ * switching every second.
+ *
+ * $Id: cswstat.d 15 2007-09-11 09:09:25Z brendan $
+ *
+ * USAGE: cswstat.d
+ *
+ * FIELDS:
+ * TIME Current time
+ * NUM Number of context switches
+ * CSWTIME(us) Time consumed context switching, us
+ * AVGTIME(us) Average context switch time, us
+ *
+ * THANKS: Toomas Soome
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 17-May-2005 Brendan Gregg Created this.
+ * 03-Nov-2005 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ /* print header */
+ printf("%-20s %8s %12s %12s\n", "TIME", "NUM", "CSWTIME(us)",
+ "AVGTIME(us)");
+ times = 0;
+ num = 0;
+}
+
+sched:::off-cpu
+{
+ /* csw start */
+ num++;
+ start[cpu] = timestamp;
+}
+
+sched:::on-cpu
+/start[cpu]/
+{
+ /* csw end */
+ times += timestamp - start[cpu];
+ start[cpu] = 0;
+}
+
+profile:::tick-1sec
+{
+ /* print output */
+ printf("%20Y %8d %12d %12d\n", walltimestamp, num, times/1000,
+ num == 0 ? 0 : times/(1000 * num));
+ times = 0;
+ num = 0;
+}
diff --git a/Kernel/dnlcps.d b/Kernel/dnlcps.d
new file mode 100755
index 000000000000..d3c3e58ff18e
--- /dev/null
+++ b/Kernel/dnlcps.d
@@ -0,0 +1,68 @@
+#!/usr/sbin/dtrace -s
+/*
+ * dnlcps.d - DNLC stats by process.
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * The DNLC is the Directory Name Lookup Cache. Filename lookups often
+ * return a hit from here, before needing to traverse the regular file
+ * system cache or go to disk.
+ *
+ * dnlcps.d prints DNLC statistics by process.
+ *
+ * $Id: dnlcps.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: dnlcps.d # wait several seconds, then hit Ctrl-C
+ *
+ * FIELDS:
+ * PID Process ID
+ * CMD Command name
+ * value 0 == miss, 1 == hit
+ * count number of occurrences
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 27-Mar-2004 Brendan Gregg Created this.
+ * 14-Jun-2005 " " Rewrote this a lot.
+ * 18-Feb-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+/*
+ * DNLC return
+ */
+fbt:genunix:dnlc_lookup:return
+{
+ this->code = arg1 == 0 ? 0 : 1;
+ @Result[execname, pid] = lquantize(this->code, 0, 1, 1);
+}
+
+/*
+ * Print report
+ */
+dtrace:::END
+{
+ printa(" CMD: %-16s PID: %d\n%@d\n", @Result);
+}
diff --git a/Kernel/dnlcsnoop.d b/Kernel/dnlcsnoop.d
new file mode 100755
index 000000000000..1150f4502303
--- /dev/null
+++ b/Kernel/dnlcsnoop.d
@@ -0,0 +1,92 @@
+#!/usr/sbin/dtrace -s
+/*
+ * dnlcsnoop.d - snoop DNLC activity.
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * The DNLC is the Directory Name Lookup Cache. Filename lookups often
+ * return a hit from here, before needing to traverse the regular file
+ * system cache or go to disk.
+ *
+ * $Id: dnlcsnoop.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: dnlcsnoop.d # wait several seconds, then hit Ctrl-C
+ *
+ * FIELDS:
+ * PID Process ID
+ * CMD Command name
+ * TIME Elapsed time for lookup, us
+ * HIT DNLC hit Y/N
+ * PATH Path for DNLC lookup
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 27-Mar-2004 Brendan Gregg Created this.
+ * 14-Jun-2005 " " Rewrote this a lot.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ printf("%6s %-12s %5s %3s %s\n",
+ "PID", "CMD", "TIME", "HIT", "PATH");
+}
+
+/*
+ * DNLC lookup
+ */
+fbt:genunix:dnlc_lookup:entry
+{
+ /* store path */
+ self->path = stringof(args[0]->v_path);
+
+ /* check for trailing "/" */
+ this->len = strlen(self->path);
+ self->join = *(char *)(args[0]->v_path + this->len - 1) == '/' ?
+ "" : "/";
+
+ /* store lookup name */
+ self->name = stringof(arg1);
+
+ /* store start time */
+ self->start = timestamp;
+}
+
+/*
+ * DNLC return
+ */
+fbt:genunix:dnlc_lookup:return
+/self->start/
+{
+ /* calculate elapsed time */
+ this->elapsed = (timestamp - self->start) / 1000;
+
+ /* print output */
+ printf("%6d %-12.12s %5d %3s %s%s%s\n",
+ pid, execname, this->elapsed, arg1 == 0 ? "N" : "Y",
+ self->path, self->join, self->name);
+
+ /* clear variables */
+ self->path = 0;
+ self->join = 0;
+ self->name = 0;
+ self->start = 0;
+}
diff --git a/Kernel/dnlcstat b/Kernel/dnlcstat
new file mode 100755
index 000000000000..b29e8c219bf7
--- /dev/null
+++ b/Kernel/dnlcstat
@@ -0,0 +1,162 @@
+#!/usr/bin/sh
+#
+# dnlcstat - DNLC statistics.
+# Written in DTrace (Solaris 10 3/05).
+#
+# The DNLC is the Directory Name Lookup Cache. Filename lookups often
+# return a hit from here, before needing to traverse the regular file
+# system cache or go to disk.
+#
+# $Id: dnlcstat 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: dnlcstat [interval [count]]
+#
+# FIELDS:
+#
+# %hit hit percentage for this sample
+# hit number of DNLC hits in this sample
+# miss number of DNLC misses in this sample
+#
+# SEE ALSO: CacheKit, http://www.brendangregg.com/cachekit.html
+# (contains a dnlcstat written in Perl, which uses less CPU)
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# 27-Mar-2004 Brendan Gregg Created this.
+# 14-Jun-2005 " " Updated style.
+# 14-Jun-2005 " " Last update.
+#
+
+##############################
+# --- Process Arguments ---
+#
+
+### default values
+interval=1; count=-1
+
+### check arguments
+if [ "$1" = "-h" -o "$1" = "--help" ]; then
+ cat <<-END >&2
+ USAGE: dnlcstat [interval [count]]
+ dnlcstat # 1 second samples, infinite
+ eg,
+ dnlcstat 1 # print every 1 second
+ dnlcstat 5 6 # print every 5 seconds, 6 times
+ END
+ exit 1
+fi
+
+### argument logic
+if [ "$1" -gt 0 ]; then
+ interval=$1; count=-1; shift
+fi
+if [ "$1" -gt 0 ]; then
+ count=$1; shift
+fi
+if [ $interval -eq 0 ]; then
+ interval=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+
+ /*
+ * Command line arguments
+ */
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+ inline int SCREEN = 21;
+
+ int hits; /* hits */
+ int misses; /* misses */
+
+ /*
+ * Initialise variables
+ */
+ dtrace:::BEGIN
+ {
+ lines = SCREEN + 1;
+ counts = COUNTER;
+ secs = INTERVAL;
+ first = 1;
+ }
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN,
+ tick-1sec
+ /first || (secs == 0 && lines > SCREEN)/
+ {
+ printf("%10s %8s %8s\n","dnlc %hit","hit","miss");
+ lines = 0;
+ first = 0;
+ }
+
+ /*
+ * Probe DNLC lookups
+ */
+ fbt:genunix:dnlc_lookup:return
+ {
+ hits += arg1 == 0 ? 0 : 1;
+ misses += arg1 == 0 ? 1 : 0;
+ }
+
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+
+ /*
+ * Print output line
+ */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ /* calculate hit percent */
+ this->divide = misses + hits == 0 ? 1 : misses + hits;
+ ratio = hits * 100 / this->divide;
+
+ /* print output */
+ printf("%10d %8d %8d\n",ratio,hits,misses);
+
+ /* clear counters */
+ hits = 0;
+ misses = 0;
+
+ /* process counts */
+ secs = INTERVAL;
+ counts--;
+ lines++;
+
+ }
+
+ /*
+ * End
+ */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+'
+
diff --git a/Kernel/kstat_types.d b/Kernel/kstat_types.d
new file mode 100755
index 000000000000..119bc77d1d20
--- /dev/null
+++ b/Kernel/kstat_types.d
@@ -0,0 +1,66 @@
+#!/usr/sbin/dtrace -Cs
+/*
+ * kstat_types.d - Trace kstat reads with type info.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * kstat is the Kernel Statistics framework, which is used by tools
+ * such as vmstat, iostat, mpstat and sar. Try running vmstat while
+ * kstat_types.d is tracing - you should see details of the kstat
+ * reads performed.
+ *
+ * $Id: kstat_types.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: kstat_types.d (early release, check for updates)
+ *
+ * FIELDS:
+ * CMD command name
+ * CLASS kstat class (ks_class)
+ * TYPE kstat type as a string (ks_type)
+ * MOD:INS:NAME kstat module:instance:name
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 11-Feb-2006 Brendan Gregg Created this.
+ * 11-Feb-2006 " " Last update.
+ */
+
+#include <sys/isa_defs.h>
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("%-16s %-16s %-6s %s\n",
+ "CMD", "CLASS", "TYPE", "MOD:INS:NAME");
+}
+
+fbt::read_kstat_data:entry
+{
+#ifdef _MULTI_DATAMODEL
+ self->uk = (kstat32_t *)copyin((uintptr_t)arg1, sizeof (kstat32_t));
+#else
+ self->uk = (kstat_t *)copyin((uintptr_t)arg1, sizeof (kstat_t));
+#endif
+ printf("%-16s %-16s %-6s %s:%d:%s\n", execname,
+ self->uk->ks_class == "" ? "." : self->uk->ks_class,
+ self->uk->ks_type == 0 ? "raw"
+ : self->uk->ks_type == 1 ? "named"
+ : self->uk->ks_type == 2 ? "intr"
+ : self->uk->ks_type == 3 ? "io"
+ : self->uk->ks_type == 4 ? "timer" : "?",
+ self->uk->ks_module, self->uk->ks_instance, self->uk->ks_name);
+}
diff --git a/Kernel/modcalls.d b/Kernel/modcalls.d
new file mode 100755
index 000000000000..0386a7a721a9
--- /dev/null
+++ b/Kernel/modcalls.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * modcalls.d - kernel function calls by module. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: modcalls.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+fbt:::entry { @calls[probemod] = count(); }
diff --git a/Kernel/priclass.d b/Kernel/priclass.d
new file mode 100755
index 000000000000..92275dcb4ed4
--- /dev/null
+++ b/Kernel/priclass.d
@@ -0,0 +1,67 @@
+#!/usr/sbin/dtrace -s
+/*
+ * priclass.d - priority distribution by scheduling class.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This is a simple DTrace script that samples at 1000 Hz the current
+ * thread's scheduling class and priority. A distribution plot is printed.
+ *
+ * With priorities, the higher the priority the better chance the thread
+ * has of being scheduled.
+ *
+ * This idea came from the script /usr/demo/dtrace/pri.d, which
+ * produces similar output for priority changes, not samples.
+ *
+ * $Id: priclass.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: priclass.d # hit Ctrl-C to end sampling
+ *
+ * FIELDS:
+ * value process priority
+ * count number of samples of at least this priority
+ *
+ * Also printed is the scheduling class,
+ *
+ * TS time sharing
+ * IA interactive
+ * RT real time
+ * SYS system
+ * FSS fair share schedular
+ *
+ * BASED ON: /usr/demo/dtrace/pri.d
+ *
+ * SEE ALSO: DTrace Guide "profile Provider" chapter (docs.sun.com)
+ * dispadmin(1M)
+ *
+ * PORTIONS: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 12-Feb-2006 Brendan Gregg Created this.
+ * 22-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Sampling... Hit Ctrl-C to end.\n");
+}
+
+profile:::profile-1000hz
+{
+ @count[stringof(curlwpsinfo->pr_clname)]
+ = lquantize(curlwpsinfo->pr_pri, 0, 170, 10);
+}
diff --git a/Kernel/pridist.d b/Kernel/pridist.d
new file mode 100755
index 000000000000..1b6d3ebb7b06
--- /dev/null
+++ b/Kernel/pridist.d
@@ -0,0 +1,66 @@
+#!/usr/sbin/dtrace -s
+/*
+ * pridist.d - process priority distribution.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This is a simple DTrace script that samples at 1000 Hz which process
+ * is on the CPUs, and what the priority is. A distribution plot is printed.
+ *
+ * With priorities, the higher the priority the better chance the process
+ * (actually, thread) has of being scheduled.
+ *
+ * This idea came from the script /usr/demo/dtrace/profpri.d, which
+ * produces similar output for one particular PID.
+ *
+ * $Id: pridist.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: pridist.d # hit Ctrl-C to end sampling
+ *
+ * FIELDS:
+ * CMD process name
+ * PID process ID
+ * value process priority
+ * count number of samples of at least this priority
+ *
+ * BASED ON: /usr/demo/dtrace/profpri.d
+ *
+ * SEE ALSO:
+ * DTrace Guide "profile Provider" chapter (docs.sun.com)
+ * dispadmin(1M)
+ *
+ * PORTIONS: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 13-Jun-2005 Brendan Gregg Created this.
+ * 22-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Sampling... Hit Ctrl-C to end.\n");
+}
+
+profile:::profile-1000hz
+{
+ @Count[execname, pid] = lquantize(curlwpsinfo->pr_pri, 0, 170, 5);
+}
+
+dtrace:::END
+{
+ printa(" CMD: %-16s PID: %d\n%@d\n", @Count);
+}
diff --git a/Kernel/putnexts.d b/Kernel/putnexts.d
new file mode 100755
index 000000000000..cb99a7213636
--- /dev/null
+++ b/Kernel/putnexts.d
@@ -0,0 +1,38 @@
+#!/usr/sbin/dtrace -s
+/*
+ * putnexts.d - stream putnext() tracing with stacks. Solaris, DTrace.
+ *
+ * This shows who is calling putnext() to who, by listing the destination
+ * queue and the calling stack, by frequency count. This is especially useful
+ * for understanding streams based frameworks, such as areas of the Solaris
+ * TCP/IP stack.
+ *
+ * $Id: putnexts.d 14 2007-09-11 08:03:35Z brendan $
+ *
+ * USAGE: putnext.d
+ *
+ * BASED ON: /usr/demo/dtrace/putnext.d
+ *
+ * PORTIONS: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 12-Jun-2005 Brendan Gregg Created this.
+ */
+
+fbt::putnext:entry
+{
+ @[stringof(args[0]->q_qinfo->qi_minfo->mi_idname), stack(5)] = count();
+}
diff --git a/Kernel/whatexec.d b/Kernel/whatexec.d
new file mode 100755
index 000000000000..e70173b8b733
--- /dev/null
+++ b/Kernel/whatexec.d
@@ -0,0 +1,79 @@
+#!/usr/sbin/dtrace -s
+/*
+ * whatexec.d - Examine the type of files exec'd.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This prints the first four chacacters of files that are executed.
+ * This traces the kernel function findexec_by_hdr(), which checks for
+ * a known magic number in the file's header.
+ *
+ * The idea came from a demo I heard about from the UK, where a
+ * "blue screen of death" was displayed for "MZ" files (although I
+ * haven't seen the script or the demo).
+ *
+ * $Id: whatexec.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: whatexec.d (early release, check for updates)
+ *
+ * FIELDS:
+ * PEXEC parent command name
+ * EXEC pathname to file exec'd
+ * OK is type runnable, Y/N
+ * TYPE first four characters from file
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 11-Feb-2006 Brendan Gregg Created this.
+ * 25-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+this char *buf;
+
+dtrace:::BEGIN
+{
+ printf("%-16s %-38s %2s %s\n", "PEXEC", "EXEC", "OK", "TYPE");
+}
+
+fbt::gexec:entry
+{
+ self->file = cleanpath((*(struct vnode **)arg0)->v_path);
+ self->ok = 1;
+}
+
+fbt::findexec_by_hdr:entry
+/self->ok/
+{
+ bcopy(args[0], this->buf = alloca(5), 4);
+ this->buf[4] = '\0';
+ self->hdr = stringof(this->buf);
+}
+
+fbt::findexec_by_hdr:return
+/self->ok/
+{
+ printf("%-16s %-38s %2s %S\n", execname, self->file,
+ arg1 == NULL ? "N" : "Y", self->hdr);
+ self->hdr = 0;
+}
+
+fbt::gexec:return
+{
+ self->file = 0;
+ self->ok = 0;
+}
diff --git a/License b/License
new file mode 120000
index 000000000000..2095b9644d77
--- /dev/null
+++ b/License
@@ -0,0 +1 @@
+Docs/cddl1.txt \ No newline at end of file
diff --git a/Locks/lockbydist.d b/Locks/lockbydist.d
new file mode 100755
index 000000000000..9bfc224f6d3b
--- /dev/null
+++ b/Locks/lockbydist.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * lockbydist.d - lock distrib. by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: lockbydist.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+lockstat:::adaptive-block { @time[execname] = quantize(arg1); }
diff --git a/Locks/lockbyproc.d b/Locks/lockbyproc.d
new file mode 100755
index 000000000000..d7b921913419
--- /dev/null
+++ b/Locks/lockbyproc.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * lockbyproc.d - lock time by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: lockbyproc.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+lockstat:::adaptive-block { @time[execname] = sum(arg1); }
diff --git a/Man/Readme b/Man/Readme
new file mode 100644
index 000000000000..31641230863b
--- /dev/null
+++ b/Man/Readme
@@ -0,0 +1,40 @@
+Man - Man pages
+
+ There are a number of ways you can read these man pages. Either,
+
+ 1. Add this directory to your MANPATH,
+
+ cd Man
+ MANPATH=$MANPATH:$PWD
+ man iosnoop
+
+ 2. If the DTraceToolkit has been installed, and that dir to your MANPATH,
+
+ MANPATH=$MANPATH:/opt/DTT/Man
+ man iosnoop
+
+ 3. Set MANPATH to "." every time you read a script,
+
+ cd Man
+ MANPATH=. man iosnoop
+
+ 4. Use the -M option to "man", if your OS has it,
+
+ man -M Man iosnoop
+
+ 5. Prentend that you are /usr/bin/man, if your OS has nroff,
+
+ nroff -man Man/man1m/iosnoop.1m | more
+
+ 6. Pretend that you are /usr/bin/nroff,
+
+ more Man/man1m/iosnoop.1m
+
+ 7. Pretend that you have no pagers installed,
+
+ while read line; do echo $line; done < Man/man1m/iosnoop.1m
+
+ 8. Pretend that you can read hex,
+
+ od -x Man/man1m/iosnoop.1m
+
diff --git a/Man/man1m/anonpgpid.d.1m b/Man/man1m/anonpgpid.d.1m
new file mode 100644
index 000000000000..9cafd4806269
--- /dev/null
+++ b/Man/man1m/anonpgpid.d.1m
@@ -0,0 +1,54 @@
+.TH anonpgpid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+anonpgpid.d \- anonymous memory paging info by PID on CPU. Uses DTrace.
+.SH SYNOPSIS
+.B anonpgpid.d
+.SH DESCRIPTION
+This scripts may help identify which processes are affected by a system
+with low memory, which is paging to the physical swap device. A report
+of the process on the CPU when paging occured is printed.
+
+This program is currently an approximation - often the process when writing
+pages to swap will be "pageout" the pageout scanner, or "rcapd" the
+resource capping daemon.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Print report after Ctrl-C is hit,
+#
+.B anonpgpid.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+command name for the process
+.TP
+D
+direction, Read or Write
+.TP
+BYTES
+total bytes during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+anonpgpid.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/bitesize.d.1m b/Man/man1m/bitesize.d.1m
new file mode 100644
index 000000000000..4ef13bec7d8c
--- /dev/null
+++ b/Man/man1m/bitesize.d.1m
@@ -0,0 +1,57 @@
+.TH bitesize.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+bitesize.d \- analyse disk I/O size by process. Uses DTrace.
+.SH SYNOPSIS
+.B bitesize.d
+.SH DESCRIPTION
+This produces a report for the size of disk events caused by
+processes. These are the disk events sent by the block I/O driver.
+
+If applications must use the disks, we generally prefer they do so
+sequentially with large I/O sizes, or larger "bites".
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B bitesize.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+command and argument list
+.TP
+value
+size in bytes
+.TP
+count
+number of I/O operations
+.PP
+.SH NOTES
+The application may be requesting smaller sized operations, which
+are being rounded up to the nearest sector size or UFS block size.
+
+To analyse what the application is requesting, DTraceToolkit programs
+such as Proc/fddist may help.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+bitesize.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+iosnoop(1M), seeksize(1M), dtrace(1M)
+
diff --git a/Man/man1m/connections.1m b/Man/man1m/connections.1m
new file mode 100644
index 000000000000..ea0285cc55ea
--- /dev/null
+++ b/Man/man1m/connections.1m
@@ -0,0 +1,77 @@
+.TH connections 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+connections \- print inbound TCP connections by process. Uses DTrace.
+.SH SYNOPSIS
+.B connections
+[\-htvZ]
+.SH DESCRIPTION
+This displays the PID and command name of the processes accepting
+connections, along with the source IP address and destination port number
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH OPTIONS
+.TP
+\-t
+print timestamps, us
+.TP
+\-v
+print timestamps, string
+.TP
+\-Z
+print zonename
+.PP
+.SH EXAMPLES
+.TP
+snoop inbound connections
+#
+.B connections
+.TP
+snoop connections with time
+#
+.B connections
+\-v
+.PP
+.SH FIELDS
+.TP
+UID
+user ID of the server
+.TP
+PID
+process ID of the server
+.TP
+CMD
+server command name
+.TP
+TIME
+timestamp, us
+.TP
+TIMESTR
+timestamp, string
+.TP
+PORT
+server port
+.TP
+IP_SOURCE
+source IP of the client, written in IPv4 style
+.TP
+ZONE
+zonename
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+connections will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), snoop(1M)
diff --git a/Man/man1m/cpudists.1m b/Man/man1m/cpudists.1m
new file mode 100644
index 000000000000..aeb29ca6a8f5
--- /dev/null
+++ b/Man/man1m/cpudists.1m
@@ -0,0 +1,86 @@
+.TH cpudists 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+cpudists \- CPU distrib. by Kernel/Idle/Process. Uses DTrace.
+.SH SYNOPSIS
+.B cpudists
+[\-ahV] [\-t top] [interval [count]]
+.SH DESCRIPTION
+cpudists prints the CPU time distributions consumed by the Kernel,
+Idle threads and by Processes.
+
+This program is a variant on cputimes, and creates extra kernel load as
+described in cputimes(1M). cpudists prints out a distribution report
+(a quantize aggregation), such that the number of occurrences and
+duration of each thread using the CPUs can be identified.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo and sched providers.
+.SH OPTIONS
+.TP
+\-a
+print all processes
+.TP
+\-T
+print totals
+.TP
+\-V
+don't print timestamps
+.TP
+\-t num
+print top num lines only
+.SH EXAMPLES
+.TP
+Default, print Kernel/Idle/Process time, 1 x 1 second sample,
+#
+.B cpudists
+.PP
+.TP
+Print every 1 second,
+#
+.B cpudists
+1
+.PP
+.TP
+Print all processes every 10 seconds,
+#
+.B cpudists
+\-a 10
+.PP
+.TP
+Print top 8 lines every 5 seconds,
+#
+.B cpudists
+\-at 8 5
+.PP
+.SH FIELDS
+.TP
+IDLE
+Idle time - CPU running idle thread
+.TP
+KERNEL
+Kernel time - Kernel servicing interrupts, ...
+.TP
+PROCESS
+Process time - PIDs running on the system
+.TP
+value
+Time in nanoseconds
+.TP
+count
+Number of occurrences that were at least this duration (ns)
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+cpudists will run once, unless a count is specified.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), vmstat(1M)
+
diff --git a/Man/man1m/cputimes.1m b/Man/man1m/cputimes.1m
new file mode 100644
index 000000000000..bcafbb106589
--- /dev/null
+++ b/Man/man1m/cputimes.1m
@@ -0,0 +1,87 @@
+.TH cputimes 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+cputimes \- print time by Kernel/Idle/Process. Uses DTrace.
+.SH SYNOPSIS
+.B cputimes
+[\-ahTV] [\-t top] [interval [count]]
+.SH DESCRIPTION
+cputimes prints the CPU time consumed by the Kernel, Idle threads and
+by Processes.
+
+This program accurately measures time consumed by the kernel, but in
+doing so creates extra kernel load of it's own. This extra kernel
+activity can be measured by running one cputimes and then another, and
+comparing the difference in kernel consumed time. This method can be
+used to estimate the load caused by other DTrace scripts.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo and sched providers.
+.SH OPTIONS
+.TP
+\-a
+print all processes
+.TP
+\-T
+print totals
+.TP
+\-V
+don't print timestamps
+.TP
+\-t num
+print top num lines only
+.SH EXAMPLES
+.TP
+Default, print Kernel/Idle/Process time, 1 x 1 second sample,
+#
+.B cputimes
+.PP
+.TP
+Print every 1 second,
+#
+.B cputimes
+1
+.PP
+.TP
+Print all processes every 10 seconds,
+#
+.B cputimes
+\-a 10
+.PP
+.TP
+Print top 8 lines every 5 seconds,
+#
+.B cputimes
+\-at 8 5
+.PP
+.SH FIELDS
+.TP
+THREADS
+Either KERNEL, IDLE, PROCESS or process name.
+.TP
+IDLE
+Idle time - CPU running idle thread
+.TP
+KERNEL
+Kernel time - Kernel servicing interrupts, ...
+.TP
+PROCESS
+Process time - PIDs running on the system
+.TP
+TIME (ns)
+Sum of the CPU time, ns (nanoseconds)
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+cputimes will run once, unless a count is specified.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), vmstat(1M)
+
diff --git a/Man/man1m/cputypes.d.1m b/Man/man1m/cputypes.d.1m
new file mode 100644
index 000000000000..82b6fecdccaa
--- /dev/null
+++ b/Man/man1m/cputypes.d.1m
@@ -0,0 +1,54 @@
+.TH cputypes.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+cputypes.d \- list CPU types. Uses DTrace.
+.SH SYNOPSIS
+.B cputypes.d
+.SH DESCRIPTION
+This program lists CPU type information for the online CPUs
+in the system.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable.
+.SH EXAMPLES
+.TP
+List CPU types,
+#
+.B cputypes.d
+.PP
+.SH FIELDS
+.TP
+CPU
+CPU ID
+.TP
+CHIP
+chip ID
+.TP
+PSET
+processor set ID
+.TP
+LGRP
+latency group ID
+.TP
+CLOCK
+clock speed, MHz
+.TP
+TYPE
+CPU type
+.TP
+FPU
+floating point identifier type
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+psrinfo(1M), dtrace(1M)
+
diff --git a/Man/man1m/cpuwalk.d.1m b/Man/man1m/cpuwalk.d.1m
new file mode 100644
index 000000000000..16874d988e39
--- /dev/null
+++ b/Man/man1m/cpuwalk.d.1m
@@ -0,0 +1,53 @@
+.TH cpuwalk.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+cpuwalk.d \- Measure which CPUs a process runs on. Uses DTrace.
+.SH SYNOPSIS
+.B cpuwalk.d [duration]
+.SH DESCRIPTION
+This program is for multi-CPU servers, and can help identify if a process
+is running on multiple CPUs concurrently or not.
+
+A duration may be specified in seconds.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Any
+.SH STABILITY
+stable.
+.SH EXAMPLES
+.TP
+this runs until Ctrl\-C is hit,
+#
+.B cpuwalk.d
+.PP
+.TP
+run for 5 seconds,
+#
+.B cpuwalk.d
+5
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+value
+CPU id
+.TP
+count
+number of samples (sample at 100 hz)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+cpuwalk.d will run until Ctrl\-C is hit, or the duration specified
+is reached.
+.SH SEE ALSO
+threaded.d(1M), dtrace(1M)
+
diff --git a/Man/man1m/crash.d.1m b/Man/man1m/crash.d.1m
new file mode 100644
index 000000000000..368229b133ec
--- /dev/null
+++ b/Man/man1m/crash.d.1m
@@ -0,0 +1,81 @@
+.TH crash.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+crash.d \- Crashed Application info. Uses DTrace.
+.SH SYNOPSIS
+.B crash.d
+.SH DESCRIPTION
+crash.d monitors for applications that crash.
+When a crash via a SIGSEGV or SIGBUS is detected, a report of the
+process state is printed out.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the proc provider, and uses /usr/bin/prun.
+.SH FIELDS
+.TP
+Type
+signal type
+.TP
+Program
+execname of process
+.TP
+Args
+argument listing of process
+.TP
+PID
+process ID
+.TP
+TID
+thread ID
+.TP
+LWPs
+number of Light Weight Processes
+.TP
+PPID
+parent process ID
+.TP
+UID
+user ID
+.TP
+TaskID
+task ID
+.TP
+ProjID
+project ID
+.TP
+PoolID
+pool ID
+.TP
+ZoneID
+zone ID
+.TP
+zone
+zone name
+.TP
+CWD
+current working directory
+.TP
+errno
+error number of last syscall
+.PP
+.SH EXAMPLES
+.TP
+Monitor for crashing applications.
+#
+.B crash.d
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+crash.d will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/creatbyproc.d.1m b/Man/man1m/creatbyproc.d.1m
new file mode 100644
index 000000000000..fe4f12363705
--- /dev/null
+++ b/Man/man1m/creatbyproc.d.1m
@@ -0,0 +1,55 @@
+.TH creatbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+creatbyproc.d \- snoop creat()s by process name. Uses DTrace.
+.SH SYNOPSIS
+.B creatbyproc.d
+.SH DESCRIPTION
+creatbyproc.d is a DTrace OneLiner to print file creations as it
+occurs, including the name of the process calling the open.
+
+This matches file creates from the creat() system call; not all
+file creation occurs in this way, sometimes it is through open()
+with a O_CREAT flag, this script will not monitor that activity.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+This prints process names and new pathnames until Ctrl\-C is hit.
+#
+.B creatbyproc.d
+.PP
+.SH FIELDS
+.TP
+CPU
+The CPU that recieved the event
+.TP
+ID
+A DTrace probe ID for the event
+.TP
+FUNCTION:NAME
+The DTrace probe name for the event
+.TP
+remaining fields
+The first is the name of the process, the second is the file pathname.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+creatbyproc.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/cswstat.d.1m b/Man/man1m/cswstat.d.1m
new file mode 100644
index 000000000000..7256d5f315d9
--- /dev/null
+++ b/Man/man1m/cswstat.d.1m
@@ -0,0 +1,51 @@
+.TH cswstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+cswstat.d \- context switch time stats. Uses DTrace.
+.SH SYNOPSIS
+.B cswstat.d
+.SH DESCRIPTION
+cswstat.d is a DTrace program to print context switch time
+statistics.
+
+This program measures the time consumed during context switching,
+and prints it with the number of context switches and the average
+time.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sched provider.
+.SH EXAMPLES
+.TP
+Print statistics every second,
+#
+.B cswstat.d
+.PP
+.SH FIELDS
+.TP
+TIME
+The current time
+.TP
+NUM
+Number of context switches in this sample
+.TP
+CSWTIME
+Total time consumed context switching, us
+.TP
+AVGTIME
+Average time for each context switch, us
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+cswstat.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+mpstat(1M), dtrace(1M)
+
diff --git a/Man/man1m/dappprof.1m b/Man/man1m/dappprof.1m
new file mode 100644
index 000000000000..de1b52a7fa2f
--- /dev/null
+++ b/Man/man1m/dappprof.1m
@@ -0,0 +1,98 @@
+.TH dappprof 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+dappprof \- profile user and lib function usage. Uses DTrace.
+.SH SYNOPSIS
+.B dappprof
+[\-acehoTU] [\-u lib] { \-p PID | command }
+.SH DESCRIPTION
+dappprof prints details on user and library call times for processes
+as a summary style aggragation. By default the user fuctions are
+traced, options can be used to trace library activity. Output can
+include function counts, elapsed times and on cpu times.
+
+The elapsed times are interesting, to help identify functions
+that take some time to complete (during which the process may
+have slept). CPU time helps us identify syscalls that
+are consuming CPU cycles to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the pid provider.
+.SH OPTIONS
+.TP
+\-a
+print all data
+.TP
+\-c
+print function counts
+.TP
+\-e
+print elapsed times, ns
+.TP
+\-o
+print CPU times, ns
+.TP
+\-T
+print totals
+.TP
+\-p PID
+examine this PID
+.TP
+\-u lib
+trace this library instead
+.TP
+\-U
+trace all library and user functions
+.PP
+.SH EXAMPLES
+.TP
+run and examine the "df \-h" command,
+#
+.B dappprof
+df \-h
+.PP
+.TP
+print elapsed times, on-cpu times and counts for "df \-h",
+#
+.B dappprof
+-ceo df \-h
+.TP
+print elapsed times for PID 1871,
+#
+.B dappprof
+\-p 1871
+.PP
+.TP
+print all data for PID 1871,
+#
+.B dappprof
+\-ap 1871
+.PP
+.SH FIELDS
+.TP
+CALL
+Function call name
+.TP
+ELAPSED
+Total elapsed time, nanoseconds
+.TP
+CPU
+Total on-cpu time, nanoseconds
+.TP
+COUNT
+Number of occurrences
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+dappprof will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dapptrace(1M), dtrace(1M), apptrace(1)
+
diff --git a/Man/man1m/dapptrace.1m b/Man/man1m/dapptrace.1m
new file mode 100644
index 000000000000..c439f05380c8
--- /dev/null
+++ b/Man/man1m/dapptrace.1m
@@ -0,0 +1,112 @@
+.TH dapptrace 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+dapptrace \- trace user and library function usage. Uses DTrace.
+.SH SYNOPSIS
+.B dapptrace
+[\-acdeFlhoU] [\-u lib] { \-p PID | command }
+.SH DESCRIPTION
+dapptrace prints details on user and library function calls. By
+default it traces user functions only, options can be used to
+trace library activity.
+
+Of particular interest is the elapsed times and on cpu times, which
+can identify both function calls that are slow to complete, and those
+which are consuming CPU cycles.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the pid provider.
+.SH OPTIONS
+.TP
+\-a
+print all details
+.TP
+\-b bufsize
+dynamic variable buffer size. Increase this if you notice dynamic
+variable drop errors. The default is "4m" for 4 megabytes per CPU.
+.TP
+\-c
+print function call counts
+.TP
+\-d
+print relative timestamps, us
+.TP
+\-e
+print elapsed times, us
+.TP
+\-F
+print flow indentation
+.TP
+\-l
+force printing of pid/lwpid per line
+.TP
+\-o
+print on-cpu times, us
+.TP
+\-p PID
+examine this PID
+.TP
+\-u lib
+trace this library instead
+.TP
+\-U
+trace all library and user functions
+.PP
+.SH EXAMPLES
+.TP
+run and examine the "df -h" command,
+#
+.B dapptrace
+df -h
+.PP
+.TP
+examine PID 1871,
+#
+.B dapptrace
+\-p 1871
+.PP
+.TP
+print using flow indents,
+#
+.B dapptrace
+\-Fp 1871
+.PP
+.TP
+print elapsed and CPU times,
+#
+.B dapptrace
+\-eop 1871
+.PP
+.SH FIELDS
+.TP
+PID/LWPID
+Process ID / Lightweight Process ID
+.TP
+RELATIVE
+relative timestamps to the start of the thread, us (microseconds)
+.TP
+ELAPSD
+elapsed time for this system call, us
+.TP
+CPU
+on-cpu time for this system call, us
+.TP
+CALL(args)
+function call name, with some arguments in hexadecimal
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+dapptrace will run forever until Ctrl\-C is hit, or if a command was
+executed dapptrace will finish when the command ends.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dappprof(1M), dtrace(1M), apptrace(1)
+
diff --git a/Man/man1m/dexplorer.1m b/Man/man1m/dexplorer.1m
new file mode 100644
index 000000000000..10683a936542
--- /dev/null
+++ b/Man/man1m/dexplorer.1m
@@ -0,0 +1,64 @@
+.TH dexplorer 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+dexplorer \- run a series of scripts and archive output. Uses DTrace.
+.SH SYNOPSIS
+.B dexplorer
+.SH DESCRIPTION
+This program automatically runs a collection of DTrace scripts to examine
+many areas of the system, and places the output in a meaningful directory
+structure that is tar'd and gzip'd.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH OPTIONS
+.TP
+\-q
+quiet mode
+.TP
+\-y
+"yes", don't prompt for confirmation
+.TP
+\-D
+don't delete output dir
+.TP
+\-T
+don't create output tar.gz
+.TP
+\-d outputdir
+output directory
+.TP
+\-i interval
+interval for each sample
+.PP
+.SH EXAMPLES
+.TP
+Create output file in current directory,
+#
+.B dexplorer
+.TP
+Don't prompt
+#
+.B dexplorer
+\-y
+.TP
+Leave expanded directories, don't archive and compress,
+#
+.B dexplorer
+\-DT
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/diskhits.1m b/Man/man1m/diskhits.1m
new file mode 100644
index 000000000000..e8b9c57e1bcd
--- /dev/null
+++ b/Man/man1m/diskhits.1m
@@ -0,0 +1,46 @@
+.TH diskhits 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+diskhits \- disk access by file offset. Uses DTrace.
+.SH SYNOPSIS
+.B diskhits pathname
+.SH DESCRIPTION
+This prints how a file was accessed, the locations on a distribution plot.
+This is for the cache misses only - the file activity that resulted in
+disk events.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH EXAMPLES
+.TP
+Sample /var/adm/messages disk activity,
+#
+.B diskhits /var/adm/messages
+.PP
+.SH FIELDS
+.TP
+Location (KB)
+the file offset of the disk activity, Kbytes
+.TP
+Size (KB)
+size of the disk activity, Kbytes
+.TP
+Total RW
+Total disk activity, reads + writes
+.PP
+.SH BASED ON
+/usr/demo/dtrace/applicat.d
+.PP
+.SH DOCUMENTATION
+DTrace Guide "io Provider" chapter (docs.sun.com)
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+diskhits will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/dispqlen.d.1m b/Man/man1m/dispqlen.d.1m
new file mode 100644
index 000000000000..dcc08200d8f9
--- /dev/null
+++ b/Man/man1m/dispqlen.d.1m
@@ -0,0 +1,36 @@
+.TH dispqlen.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+dispqlen.d \- dispatcher queue length by CPU. Uses DTrace.
+.SH SYNOPSIS
+.B dispqlen.d
+.SH DESCRIPTION
+The dispatcher queue length is an indication of CPU saturation.
+It is not an indicatior of utilisation - the CPUs may or may not be
+utilised when the dispatcher queue reports a length of zero.
+
+This script measures this activity by sampling at 1000 Hertz per CPU.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - walks private kernel structs.
+.SH EXAMPLES
+.TP
+Print dispatcher queue length by CPU.
+#
+.B dispqlen.d
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+dispqlen.d will sample until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+uptime(1), dtrace(1M)
+
diff --git a/Man/man1m/dnlcps.d.1m b/Man/man1m/dnlcps.d.1m
new file mode 100644
index 000000000000..482fd0747cc0
--- /dev/null
+++ b/Man/man1m/dnlcps.d.1m
@@ -0,0 +1,51 @@
+.TH dnlcps.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+dnlcps.d \- DNLC stats by process. Uses DTrace.
+.SH SYNOPSIS
+.B dnlcps.d
+.SH DESCRIPTION
+The DNLC is the Directory Name Lookup Cache. Filename lookups often
+return a hit from here, before needing to traverse the regular file
+system cache or go to disk.
+
+dnlcps.d prints DNLC statistics by process.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B dnlcps.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+command name
+.TP
+value
+0 == miss, 1 == hit
+.TP
+count
+number of occurrences
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+dnlcps.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/dnlcsnoop.d.1m b/Man/man1m/dnlcsnoop.d.1m
new file mode 100644
index 000000000000..cd9ac7be9461
--- /dev/null
+++ b/Man/man1m/dnlcsnoop.d.1m
@@ -0,0 +1,52 @@
+.TH dnlcsnoop.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+dnlcsnoop.d \- snoop DNLC activity. Uses DTrace.
+.SH SYNOPSIS
+.B dnlcsnoop.d
+.SH DESCRIPTION
+The DNLC is the Directory Name Lookup Cache. Filename lookups often
+return a hit from here, before needing to traverse the regular file
+system cache or go to disk.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B dnlcsnoop.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+command name
+.TP
+TIME
+Elapsed time for lookup, us
+.TP
+HIT
+DNLC hit Y/N
+.TP
+PATH
+Path for DNLC lookup
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+dnlcsnoop.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/dnlcstat.1m b/Man/man1m/dnlcstat.1m
new file mode 100644
index 000000000000..146c39dc1d96
--- /dev/null
+++ b/Man/man1m/dnlcstat.1m
@@ -0,0 +1,57 @@
+.TH dnlcstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+dnlcstat \- DNLC statistics. Uses DTrace.
+.SH SYNOPSIS
+.B dnlcstat
+[interval [count]]
+.SH DESCRIPTION
+The DNLC is the Directory Name Lookup Cache. Filename lookups often
+return a hit from here, before needing to traverse the regular file
+system cache or go to disk.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Print DNLC statistics every second,
+#
+.B dnlcstat
+.TP
+Print every 5 seconds, 6 times,
+#
+.B dnlcstat
+5 6
+.PP
+.SH FIELDS
+.TP
+%hit
+hit percentage for this sample
+.TP
+hit
+number of DNLC hits in this sample
+.TP
+miss
+number of DNLC misses in this sample
+.PP
+.SH NOTES
+See the CacheKit, http://www.brendangregg.com/cachekit.html for a version
+of dnlcstat written in Perl (Kstat) that uses much less CPU.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+dnlcstat will run until Ctrl\-C is hit, or until the count argument
+has been satisfied.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/dtruss.1m b/Man/man1m/dtruss.1m
new file mode 100644
index 000000000000..7837f0e7b5ed
--- /dev/null
+++ b/Man/man1m/dtruss.1m
@@ -0,0 +1,123 @@
+.TH dtruss 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+dtruss \- process syscall details. Uses DTrace.
+.SH SYNOPSIS
+.B dtruss
+[\-acdeflhoLs] [\-t syscall] { \-p PID | \-n name | command }
+.SH DESCRIPTION
+dtruss prints details on process system calls. It is like a DTrace
+version of truss, and has been designed to be less intrusive than
+truss.
+
+Of particular interest is the elapsed times and on cpu times, which
+can identify both system calls that are slow to complete, and those
+which are consuming CPU cycles.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH OPTIONS
+.TP
+\-a
+print all details
+.TP
+\-b bufsize
+dynamic variable buffer size. Increase this if you notice dynamic
+variable drop errors. The default is "4m" for 4 megabytes per CPU.
+.TP
+\-c
+print system call counts
+.TP
+\-d
+print relative timestamps, us
+.TP
+\-e
+print elapsed times, us
+.TP
+\-f
+follow children as they are forked
+.TP
+\-l
+force printing of pid/lwpid per line
+.TP
+\-L
+don't print pid/lwpid per line
+.TP
+\-n name
+examine processes with this name
+.TP
+\-o
+print on-cpu times, us
+.TP
+\-s
+print stack backtraces
+.TP
+\-p PID
+examine this PID
+.TP
+\-t syscall
+examine this syscall only
+.PP
+.SH EXAMPLES
+.TP
+run and examine the "df -h" command
+#
+.B dtruss
+df -h
+.PP
+.TP
+examine PID 1871
+#
+.B dtruss
+\-p 1871
+.PP
+.TP
+examine all processes called "tar"
+#
+.B dtruss
+\-n tar
+.PP
+.TP
+run test.sh and follow children
+#
+.B dtruss
+\-f test.sh
+.TP
+run the "date" command and print elapsed and on cpu times,
+#
+.B dtruss
+\-eo date
+.PP
+.SH FIELDS
+.TP
+PID/LWPID
+Process ID / Lightweight Process ID
+.TP
+RELATIVE
+relative timestamps to the start of the thread, us (microseconds)
+.TP
+ELAPSD
+elapsed time for this system call, us
+.TP
+CPU
+on-cpu time for this system call, us
+.TP
+SYSCALL(args)
+system call name, with arguments (some may be evaluated)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+dtruss will run forever until Ctrl\-C is hit, or if a command was
+executed dtruss will finish when the command ends.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+procsystime(1M), dtrace(1M), truss(1)
+
diff --git a/Man/man1m/dvmstat.1m b/Man/man1m/dvmstat.1m
new file mode 100644
index 000000000000..20fa955e0d71
--- /dev/null
+++ b/Man/man1m/dvmstat.1m
@@ -0,0 +1,93 @@
+.TH dvmstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+dvmstat \- vmstat by PID/name/command. Uses DTrace.
+.SH SYNOPSIS
+.B dvmstat
+{ \-p PID | \-n name | command }
+.SH DESCRIPTION
+This program provides vmstat like data for one particular PID, a
+process name, or when running a command. It prints statistics
+every second.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the vminfo provider.
+.SH OPTIONS
+.TP
+\-p PID
+examine this Process ID
+.TP
+\-n name
+examine processes with this name
+.PP
+.SH EXAMPLES
+.TP
+examine PID 1871,
+#
+.B dvmstat
+\-p 1871
+.TP
+examine processes called "tar",
+#
+.B dvmstat
+\-n tar
+.TP
+run and examine "df -h",
+#
+.B dvmstat
+df -h
+.PP
+.SH FIELDS
+.TP
+re
+page reclaims, Kbytes
+.TP
+maj
+major faults, Kbytes
+.TP
+mf
+minor faults, Kbytes
+.TP
+fr
+page frees, Kbytes
+.TP
+epi
+executable page ins, Kbytes
+.TP
+epo
+executable page outs, Kbytes
+.TP
+api
+anonymous page ins, Kbytes
+.TP
+apo
+anonymous page outs, Kbytes
+.TP
+fpi
+filesystem page ins, Kbytes
+.TP
+fpo
+filesystem page outs, Kbytes
+.TP
+sy
+system calls, number
+.PP
+.SH NOTES
+Most of the statistics are in units of kilobytes, unlike the
+original vmstat command which sometimes uses pages.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+dvmstat will run until Ctrl\-C is hit, or the command it is
+examining ends.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), vmstat(1M)
diff --git a/Man/man1m/errinfo.1m b/Man/man1m/errinfo.1m
new file mode 100644
index 000000000000..6b63e5211192
--- /dev/null
+++ b/Man/man1m/errinfo.1m
@@ -0,0 +1,85 @@
+.TH errinfo 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+errinfo \- print errno for syscall fails. Uses DTrace.
+.SH SYNOPSIS
+.B errinfo
+[\-a|\-A|\-hsvZ] [\-c command]
+.SH DESCRIPTION
+errinfo snoops syscall failures and prints the errno value and
+description of the error number.
+
+This program can help determine if applications are silently
+failing, providing some details on the cause.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH OPTIONS
+.TP
+\-c
+counts - print an aggregate style report containing a
+frequency count of errors
+.TP
+\-p PID
+examine this PID only
+.TP
+\-n name
+examine processes with ths name only (eg, "ls")
+.SH EXAMPLES
+.TP
+Default output, print errors as they occur,
+#
+.B errinfo
+.PP
+.TP
+Print a frequency count report,
+#
+.B errinfo
+\-c
+.PP
+.TP
+Snoop errors as they occur for "ssh" processes,
+#
+.B errinfo
+\-n ssh
+PP
+.TP
+Snoop errors for PID 81 only,
+#
+.B errinfo
+\-p 81
+.PP
+.SH FIELDS
+.TP
+EXEC
+Program name (truncated)
+.TP
+SYSCALL
+System call name
+.TP
+ERR
+Value of errno
+.TP
+DESC
+Description of errno message
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+errinfo will run forever until Ctrl\-C is hit.
+.SH FILES
+.TP
+/usr/include/sys/errno.h
+Contains the full descriptions for the error numbers.
+.PP
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/execsnoop.1m b/Man/man1m/execsnoop.1m
new file mode 100644
index 000000000000..a7114cec58d0
--- /dev/null
+++ b/Man/man1m/execsnoop.1m
@@ -0,0 +1,108 @@
+.TH execsnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+execsnoop \- snoop new process execution. Uses DTrace.
+.SH SYNOPSIS
+.B execsnoop
+[\-a|\-A|\-ejhsvZ] [\-c command]
+.SH DESCRIPTION
+execsnoop prints details of new processes as they are executed.
+Details such as UID, PID and argument listing are printed out.
+
+This program is very useful to examine short lived processes that would
+not normally appear in a prstat or "ps -ef" listing. Sometimes
+applications will run hundreds of short lived processes in their
+normal startup cycle, a behaviour that is easily monitored with execsnoop.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH OPTIONS
+.TP
+\-a
+print all data
+.TP
+\-A
+dump all data, space delimited
+.TP
+\-e
+safe output, parseable. This prevents the ARGS field containing "\\n"s,
+to assist postprocessing.
+.TP
+\-j
+print project ID
+.TP
+\-s
+print start time, us
+.TP
+\-v
+print start time, string
+.TP
+\-Z
+print zonename
+.TP
+\-c command
+command name to snoop
+.SH EXAMPLES
+.TP
+Default output, print processes as they are executed,
+#
+.B execsnoop
+.TP
+Print human readable timestamps,
+#
+.B execsnoop
+\-v
+.TP
+Print zonename,
+#
+.B execsnoop
+\-Z
+.TP
+Snoop this command only,
+#
+.B execsnoop
+\-f ls
+.PP
+.SH FIELDS
+.TP
+UID
+User ID
+.TP
+PID
+Process ID
+.TP
+PPID
+Parent Process ID
+.TP
+COMM
+command name for the process
+.TP
+ARGS
+argument listing for the process
+.TP
+ZONE
+zonename
+.TP
+PROJ
+project ID
+.TP
+TIME
+timestamp for the exec event, us
+.TP
+STRTIME
+timestamp for the exec event, string
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+execsnoop will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/fddist.1m b/Man/man1m/fddist.1m
new file mode 100644
index 000000000000..990d76174386
--- /dev/null
+++ b/Man/man1m/fddist.1m
@@ -0,0 +1,63 @@
+.TH fddist 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+fddist \- file descriptor usage distributions. Uses DTrace.
+.SH SYNOPSIS
+.B fddist [\-r|\-w]
+.SH DESCRIPTION
+This prints distributions for read and write events by file descriptor,
+by process. This can be used to determine which file descriptor a
+process is doing the most I/O with.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH OPTIONS
+.TP
+\-r
+reads only
+.TP
+\-w
+writes only
+.PP
+.SH EXAMPLES
+.TP
+Sample both read and write activity,
+#
+.B fddist
+.TP
+Sample reads only,
+#
+.B fddist
+\-r
+.PP
+.SH FIELDS
+.TP
+EXEC
+process name
+.TP
+PID
+process ID
+.TP
+value
+file descriptor
+.TP
+count
+number of events
+.PP
+.SH BASED ON
+/usr/demo/dtrace/lquantize.d
+.PP
+.SH DOCUMENTATION
+DTrace Guide "Aggregations" chapter (docs.sun.com)
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+fddist will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/filebyproc.d.1m b/Man/man1m/filebyproc.d.1m
new file mode 100644
index 000000000000..23b56481662b
--- /dev/null
+++ b/Man/man1m/filebyproc.d.1m
@@ -0,0 +1,56 @@
+.TH filebyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+filebyproc.d \- snoop opens by process name. Uses DTrace.
+.SH SYNOPSIS
+.B filebyproc.d
+.SH DESCRIPTION
+filebyproc.d is a DTrace OneLiner to print file pathnames as they are
+opened, including the name of the process calling the open.
+A line will be printed regardless of whether the open is actually
+successful or not.
+
+This is useful to learn which files applications are attempting to
+open, such as config files, database files, log files, etc.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+This prints new process name and pathnames until Ctrl\-C is hit.
+#
+.B filebyproc.d
+.PP
+.SH FIELDS
+.TP
+CPU
+The CPU that recieved the event
+.TP
+ID
+A DTrace probe ID for the event
+.TP
+FUNCTION:NAME
+The DTrace probe name for the event
+.TP
+remaining fields
+The first is the name of the process, the second is the file pathname.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+filebyproc.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+opensnoop(1M), dtrace(1M), truss(1)
+
diff --git a/Man/man1m/fspaging.d.1m b/Man/man1m/fspaging.d.1m
new file mode 100644
index 000000000000..6911ac5582dd
--- /dev/null
+++ b/Man/man1m/fspaging.d.1m
@@ -0,0 +1,88 @@
+.TH fspaging.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+fspaging.d \- file system read/write and paging tracing. Uses DTrace.
+.SH SYNOPSIS
+.B fspaging.d
+.SH DESCRIPTION
+This traces file related activity: system call reads and writes,
+vnode logical read and writes (fop), vnode putpage and getpage activity,
+and disk I/O. It can be used to examine the behaviour of each I/O
+layer, from the syscall interface to what the disk is doing. Behaviour
+such as read-ahead, and max I/O size breakup can be observed.
+
+This is a verbose version of fsrw.d, as this also traces paging activity.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Trace file system read/write/paging events,
+#
+.B fspaging.d
+.PP
+.SH FIELDS
+.TP
+Event
+traced event (see EVENTS below)
+.TP
+Device
+device, for disk I/O
+.TP
+RW
+either Read or Write
+.TP
+Size
+size of I/O in bytes
+.TP
+Offset
+offset of I/O in kilobytes
+.TP
+Path
+path to file on disk
+.PP
+.SH EVENTS
+.TP
+sc-read
+system call read
+.TP
+sc-write
+system call write
+.TP
+fop_read
+logical read
+.TP
+fop_write
+logical write
+.TP
+fop_getpage
+logical get page
+.TP
+fop_putpage
+logical put page
+.TP
+disk_io
+physical disk I/O
+.TP
+disk_ra
+physical disk I/O, read ahead
+.PP
+.SH IDEA
+Richard McDougall, Solaris Internals 2nd Ed, FS Chapter.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+fspaging.d will trace until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+fsrw.d(1M), dtrace(1M)
diff --git a/Man/man1m/fsrw.d.1m b/Man/man1m/fsrw.d.1m
new file mode 100644
index 000000000000..4389c211f063
--- /dev/null
+++ b/Man/man1m/fsrw.d.1m
@@ -0,0 +1,80 @@
+.TH fsrw.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+fsrw.d \- file system read/write event tracing. Uses DTrace.
+.SH SYNOPSIS
+.B fsrw.d
+.SH DESCRIPTION
+This traces file related activity: system call reads and writes,
+vnode logical read and writes (fop), and disk I/O. It can be used
+to examine the behaviour of each I/O layer, from the syscall
+interface to what the disk is doing. Behaviour such as read-ahead, and
+max I/O size breakup can be observed.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Trace file system read/write events,
+#
+.B fsrw.d
+.PP
+.SH FIELDS
+.TP
+Event
+traced event (see EVENTS below)
+.TP
+Device
+device, for disk I/O
+.TP
+RW
+either Read or Write
+.TP
+Size
+size of I/O in bytes
+.TP
+Offset
+offset of I/O in kilobytes
+.TP
+Path
+path to file on disk
+.PP
+.SH EVENTS
+.TP
+sc-read
+system call read
+.TP
+sc-write
+system call write
+.TP
+fop_read
+logical read
+.TP
+fop_write
+logical write
+.TP
+disk_io
+physical disk I/O
+.TP
+disk_ra
+physical disk I/O, read ahead
+.PP
+.SH IDEA
+Richard McDougall, Solaris Internals 2nd Ed, FS Chapter.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+fsrw.d will trace until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+fspaging.d(1M), dtrace(1M)
diff --git a/Man/man1m/guess.d.1m b/Man/man1m/guess.d.1m
new file mode 100644
index 000000000000..4c6d2e2ea472
--- /dev/null
+++ b/Man/man1m/guess.d.1m
@@ -0,0 +1,37 @@
+.TH guess.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+guess.d \- guessing game. Uses DTrace.
+.SH SYNOPSIS
+.B guess.d
+.SH DESCRIPTION
+This is written to demonstrate this language versus the same program
+written in other languages.
+
+See http://www.brendangregg.com/guessinggame.html
+
+It exists in the DTraceToolkit as a curiosity, rather than something
+actually useful.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+Play the game,
+#
+.B guess.d
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+guess.d will only exit when you win the game.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/hotkernel.1m b/Man/man1m/hotkernel.1m
new file mode 100644
index 000000000000..49772b6ae1ee
--- /dev/null
+++ b/Man/man1m/hotkernel.1m
@@ -0,0 +1,39 @@
+.TH hotkernel 1m "$Date:: 2007-09-24 #$" "USER COMMANDS"
+.SH NAME
+hotkernel - sample on-CPU kernel-level functions and modules.
+.SH SYNOPSIS
+.B hotkernel
+[\-hm]
+.SH DESCRIPTION
+This samples the on-CPU function at 1001 Hertz, for a simple yet
+effective kernel-level profiling tool for sampling exclusive function time.
+The output will identify which function is on the CPU the most - which is
+the hottest. See Notes/ALLexclusive_notes.txt for an explanation of
+exclusive time.
+.SH OS
+Solaris
+.SH STABILITY
+stable - Written using Perl and DTrace (Solaris 10 03/05)
+.SH EXAMPLES
+.TP
+Sample kernel functions,
+#
+.B hotkernel
+.PP
+.TP
+Sample kernel modules,
+#
+.B hotkernel
+\-m
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+hotkernel will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M), hotuser(1M)
diff --git a/Man/man1m/hotspot.d.1m b/Man/man1m/hotspot.d.1m
new file mode 100644
index 000000000000..a99a589cc92d
--- /dev/null
+++ b/Man/man1m/hotspot.d.1m
@@ -0,0 +1,51 @@
+.TH hotspot.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+hotspot.d \- print disk event by location. Uses DTrace.
+.SH SYNOPSIS
+.B hotspot.d
+.SH DESCRIPTION
+hotspot.d is a simple DTrace script to determine if disk activity is
+occuring in the one place - a "hotspot". This helps us understand the
+system's usage of a disk, it does not imply that the existance or not
+of a hotspot is good or bad (often may be good, less seeking).
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B hotspot.d
+.PP
+.SH FIELDS
+.TP
+Disk
+disk instance name
+.TP
+Major
+driver major number
+.TP
+Minor
+driver minor number
+.TP
+value
+location of disk event, megabytes
+.TP
+count
+number of events
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+hotspot.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/hotuser.1m b/Man/man1m/hotuser.1m
new file mode 100644
index 000000000000..ab26523755cc
--- /dev/null
+++ b/Man/man1m/hotuser.1m
@@ -0,0 +1,44 @@
+.TH hotuser 1m "$Date:: 2007-09-24 #$" "USER COMMANDS"
+.SH NAME
+hotuser - sample on-CPU user-level functions and libraries.
+.SH SYNOPSIS
+.B hotuser
+[\-hl] { \-c command | \-p PID }
+.SH DESCRIPTION
+This samples the on-CPU function at 1001 Hertz, for a simple yet
+effective user-level profiling tool for sampling exclusive function time.
+The output will identify which function is on the CPU the most - which
+is the hottest. See Notes/ALLexclusive_notes.txt for an explanation of
+exclusive time.
+.SH OS
+Solaris
+.SH STABILITY
+stable - Written using Perl and DTrace (Solaris 10 03/05)
+.SH EXAMPLES
+.TP
+Sample user functions from PID 81,
+#
+.B hotuser
+\-p 81
+.TP
+Sample user libraries from PID 81,
+#
+.B hotuser
+\-lp 81
+.TP
+Sample Xorg,
+#
+.B hotuser
+`pgrep \-n Xorg`
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+hotuser will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M), hotkernel(1M)
diff --git a/Man/man1m/httpdstat.d.1m b/Man/man1m/httpdstat.d.1m
new file mode 100644
index 000000000000..5dd0a3fa96a9
--- /dev/null
+++ b/Man/man1m/httpdstat.d.1m
@@ -0,0 +1,67 @@
+.TH httpdstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+httpdstat.d \- realtime httpd statistics. Uses DTrace.
+.SH SYNOPSIS
+.B httpdstat.d
+[interval [count]]
+.SH DESCRIPTION
+This prints connection statistics for "httpd" processes, such as those
+from an Apache web server.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+Print statistics every second,
+#
+.B httpdstat.d
+.TP
+Print every 5 seconds, 6 times,
+#
+.B httpdstat.d
+5 6
+.PP
+.SH FIELDS
+.TP
+TIME
+time, string
+.TP
+NUM
+number of connections
+.TP
+GET
+number of GETs
+.TP
+POST
+number of POSTs
+.TP
+HEAD
+number of HEADs
+.TP
+TRACE
+number of TRACEs
+.PP
+.SH NOTES
+All statistics are printed as a value per interval.
+
+This version does not process subsequent operations on keepalives.
+.PP
+.SH IDEA
+Ryan Matteson
+(who first wrote a solution to this).
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+httpdstat.d will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/icmpstat.d.1m b/Man/man1m/icmpstat.d.1m
new file mode 100644
index 000000000000..be4b87ae9f97
--- /dev/null
+++ b/Man/man1m/icmpstat.d.1m
@@ -0,0 +1,47 @@
+.TH icmpstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+icmpstat.d \- print ICMP statistics. Uses DTrace.
+.SH SYNOPSIS
+.B icmpstat.d
+.SH DESCRIPTION
+icmpstat.d is a DTrace program to print ICMP statistics every second,
+retrieved from the MIB provider. This is a simple script to demonstrate the
+ability to trace ICMP events.
+
+The ICMP statistics are documented in the mib2_icmp struct
+in /usr/include/inet/mib2.h; and also in the mib provider
+chapter of the DTrace Guide, found at
+http://docs.sun.com/db/doc/817-6223.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the mib provider.
+.SH EXAMPLES
+.TP
+Print statistics every second,
+#
+.B icmpstat.d
+.PP
+.SH FIELDS
+.TP
+STATISTIC
+ICMP statistic name
+.TP
+VALUE
+total of statistic during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+icmpstat.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/intbycpu.d.1m b/Man/man1m/intbycpu.d.1m
new file mode 100644
index 000000000000..79314dc4c268
--- /dev/null
+++ b/Man/man1m/intbycpu.d.1m
@@ -0,0 +1,48 @@
+.TH intbycpu.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+intbycpu.d \- interrupts by CPU. Uses DTrace.
+.SH SYNOPSIS
+.B intbycpu.d
+.SH DESCRIPTION
+intbycpu.d is based on a DTrace OneLiner to a report of the number of
+interrupts by CPU.
+
+The intrstat(1M) command can be used for further analysis
+of interrputs.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sdt provider interrupt probes.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B intbycpu.d
+.PP
+.SH FIELDS
+.TP
+CPU
+This is the CPU id.
+.TP
+INTERRUPTS
+This is the number of interrputs received in the sample.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+intbycpu.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+intrstat(1M), dtrace(1M)
+
diff --git a/Man/man1m/intoncpu.d.1m b/Man/man1m/intoncpu.d.1m
new file mode 100644
index 000000000000..ec52b815236d
--- /dev/null
+++ b/Man/man1m/intoncpu.d.1m
@@ -0,0 +1,42 @@
+.TH intoncpu.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+intoncpu.d \- print interrput on-cpu usage. Uses DTrace.
+.SH SYNOPSIS
+.B intoncpu.d
+.SH DESCRIPTION
+This prints a distribution of the on-cpu time for interrput threads.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sdt provider interrupt probes.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B intoncpu.d
+.PP
+.SH FIELDS
+.TP
+value
+Time interrupt thread was on-cpu, ns
+.TP
+count
+Number of occurrences of at least this time
+.PP
+.SH BASED ON
+/usr/demo/dtrace/intr.d
+.PP
+.SH DOCUMENTATION
+DTrace Guide "sdt Provider" chapter (docs.sun.com)
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+intoncpu.d will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+intrstat(1M), dtrace(1M)
+
diff --git a/Man/man1m/inttimes.d.1m b/Man/man1m/inttimes.d.1m
new file mode 100644
index 000000000000..bc6d989aafdc
--- /dev/null
+++ b/Man/man1m/inttimes.d.1m
@@ -0,0 +1,43 @@
+.TH inttimes.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+inttimes.d \- print interrput on-cpu time total. Uses DTrace.
+.SH SYNOPSIS
+.B inttimes.d
+.SH DESCRIPTION
+This prints the total time each driver instance has spent servicing
+interrupts.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sdt provider interrupt probes.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B inttimes.d
+.PP
+.SH FIELDS
+.TP
+DEVICE
+instance name of the device driver
+.TP
+TIME (ns)
+sum of time spent servicing interrupt (nanoseconds)
+.PP
+.SH BASED ON
+/usr/demo/dtrace/intr.d
+.PP
+.SH DOCUMENTATION
+DTrace Guide "sdt Provider" chapter (docs.sun.com)
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+inttimes.d will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+intrstat(1M), dtrace(1M)
+
diff --git a/Man/man1m/iofile.d.1m b/Man/man1m/iofile.d.1m
new file mode 100644
index 000000000000..fd3016dd5674
--- /dev/null
+++ b/Man/man1m/iofile.d.1m
@@ -0,0 +1,49 @@
+.TH iofile.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+iofile.d \- I/O wait time by file and process. Uses DTrace.
+.SH SYNOPSIS
+.B iofile.d
+.SH DESCRIPTION
+This prints the total I/O wait times for each filename by process.
+This can help determine why an application is performing poorly by
+identifying which file they are waiting on, and the total times.
+Both disk and NFS I/O are measured.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B iofile.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+TIME
+total wait time for disk events, us
+.TP
+FILE
+file pathname
+.PP
+.SH BASED ON
+/usr/demo/dtrace/iocpu.d
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+iofile.d will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+iosnoop(1M), dtrace(1M)
+
diff --git a/Man/man1m/iofileb.d.1m b/Man/man1m/iofileb.d.1m
new file mode 100644
index 000000000000..56ca3acc83a2
--- /dev/null
+++ b/Man/man1m/iofileb.d.1m
@@ -0,0 +1,46 @@
+.TH iofileb.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+iofileb.d \- I/O bytes by file and process. Uses DTrace.
+.SH SYNOPSIS
+.B iofileb.d
+.SH DESCRIPTION
+This prints a summary of requested disk activity by pathname,
+providing totals of the I/O events in bytes. It is a companion to the
+iofile.d script - which prints in terms of I/O wait time, not bytes.
+I/O wait time is a better metric for understanding performance issues.
+Both disk and NFS I/O are measured.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B iofileb.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+KB
+kilobytes of disk I/O
+.TP
+FILE
+file pathname
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+iofileb.d will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+iofile.d(1M), iosnoop(1M), dtrace(1M)
diff --git a/Man/man1m/iopattern.1m b/Man/man1m/iopattern.1m
new file mode 100644
index 000000000000..6898f82672a9
--- /dev/null
+++ b/Man/man1m/iopattern.1m
@@ -0,0 +1,112 @@
+.TH iopattern 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+iopattern \- print disk I/O pattern. Uses DTrace.
+.SH SYNOPSIS
+.B iopattern
+[\-v] [\-d device] [\-f filename] [\-m mount_point] [interval [count]]
+.SH DESCRIPTION
+This prints details on the I/O access pattern for the disks, such as
+percentage of events that were of a random or sequential nature.
+By default totals for all disks are printed.
+
+An event is considered random when the heads seek. This program prints
+the percentage of events that are random. The size of the seek is not
+measured - it's either random or not.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH OPTIONS
+.TP
+\-v
+print timestamp, string
+.TP
+\-d device
+instance name to snoop (eg, dad0)
+.TP
+\-f filename
+full pathname of file to snoop
+.TP
+\-m mount_point
+mountpoint for filesystem to snoop
+.SH EXAMPLES
+.TP
+Default output, print I/O summary every 1 second,
+#
+.B iopattern
+.PP
+.TP
+Print 10 second samples,
+#
+.B iopattern
+10
+.PP
+.TP
+Print 12 x 5 second samples,
+#
+.B iopattern
+5 12
+.PP
+.TP
+Snoop events on the root filesystem only,
+#
+.B iopattern
+\-m /
+.PP
+.SH FIELDS
+.TP
+%RAN
+percentage of events of a random nature
+.TP
+%SEQ
+percentage of events of a sequential nature
+.TP
+COUNT
+number of I/O events
+.TP
+MIN
+minimum I/O event size
+.TP
+MAX
+maximum I/O event size
+.TP
+AVG
+average I/O event size
+.TP
+KR
+total kilobytes read during sample
+.TP
+KW
+total kilobytes written during sample
+.TP
+DEVICE
+device name
+.TP
+MOUNT
+mount point
+.TP
+FILE
+filename (basename) for I/O operation
+.TP
+TIME
+timestamp, string
+.PP
+.SH IDEA
+Ryan Matteson
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+iopattern will run forever until Ctrl\-C is hit, or the
+specified count is reached.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+iosnoop(1M), iotop(1M), dtrace(1M)
+
diff --git a/Man/man1m/iopending.1m b/Man/man1m/iopending.1m
new file mode 100644
index 000000000000..c31d967e6eef
--- /dev/null
+++ b/Man/man1m/iopending.1m
@@ -0,0 +1,89 @@
+.TH iopending 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+iopending \- plot number of pending disk events. Uses DTrace.
+.SH SYNOPSIS
+.B iopending
+[\-c] [\-d device] [\-f filename] [\-m mount_point] [interval [count]]
+.SH DESCRIPTION
+This samples the number of disk events that are pending and plots a
+distribution graph. By doing this the
+"serialness" or "parallelness" of disk behaviour can be distinguished.
+A high occurance of a pending value of more than 1 is an indication of
+saturation.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH OPTIONS
+.TP
+\-c
+clear screen
+.TP
+\-d device
+instance name to snoop (eg, dad0)
+.TP
+\-f filename
+full pathname of file to snoop
+.TP
+\-m mount_point
+mountpoint for filesystem to snoop
+.SH EXAMPLES
+.TP
+Default output, print I/O summary every 1 second,
+#
+.B iopending
+.PP
+.TP
+Print 10 second samples,
+#
+.B iopending
+10
+.PP
+.TP
+Print 12 x 5 second samples,
+#
+.B iopending
+5 12
+.PP
+.TP
+Snoop events on the root filesystem only,
+#
+.B iopending
+\-m /
+.PP
+.SH FIELDS
+.TP
+value
+number of pending events, 0 == idle
+.TP
+count
+number of samples @ 1000 Hz
+.TP
+load
+1 min load average
+.TP
+disk_r
+total disk read Kb for sample
+.TP
+disk_w
+total disk write Kb for sample
+.PP
+.SH IDEA
+Dr Rex di Bona
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+iopending will run forever until Ctrl\-C is hit, or the
+specified count is reached.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+iosnoop(1M), iotop(1M), dtrace(1M)
+
diff --git a/Man/man1m/iosnoop.1m b/Man/man1m/iosnoop.1m
new file mode 100644
index 000000000000..6e9058dabf3a
--- /dev/null
+++ b/Man/man1m/iosnoop.1m
@@ -0,0 +1,167 @@
+.TH iosnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+iosnoop \- snoop I/O events as they occur. Uses DTrace.
+.SH SYNOPSIS
+.B iosnoop
+[\-a|\-A|\-Deghinostv] [\-d device] [\-f filename] [\-m mount_point]
+[\-n name] [\-p PID]
+.SH DESCRIPTION
+iosnoop prints I/O events as they happen, with useful details such
+as UID, PID, block number, size, filename, etc.
+
+This is useful to determine the process responsible for
+using the disks, as well as details on what activity the process
+is requesting. Behaviour such as random or sequential I/O can
+be observed by reading the block numbers.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH OPTIONS
+.TP
+\-a
+print all data
+.TP
+\-A
+dump all data, space delimited
+.TP
+\-D
+print time delta, us (elapsed)
+.TP
+\-e
+print device name
+.TP
+\-i
+print device instance
+.TP
+\-n
+print major and minor numbers
+.TP
+\-o
+print disk delta time, us
+.TP
+\-s
+print start time, us
+.TP
+\-t
+print completion time, us
+.TP
+\-v
+print completion time, string
+.TP
+\-d device
+instance name to snoop (eg, dad0)
+.TP
+\-f filename
+full pathname of file to snoop
+.TP
+\-m mount_point
+mountpoint for filesystem to snoop
+.TP
+\-n name
+process name
+.TP
+\-p PID
+process ID
+.PP
+.SH EXAMPLES
+.TP
+Default output, print I/O activity as it occurs,
+#
+.B iosnoop
+.PP
+.TP
+Print human readable timestamps,
+#
+.B iosnoop
+\-v
+.PP
+.TP
+Print major and minor numbers,
+#
+.B iosnoop
+\-n
+.PP
+.TP
+Snoop events on the root filesystem only,
+#
+.B iosnoop
+\-m /
+.PP
+.SH FIELDS
+.TP
+UID
+User ID
+.TP
+PID
+Process ID
+.TP
+PPID
+Parent Process ID
+.TP
+COMM
+command name for the process
+.TP
+ARGS
+argument listing for the process
+.TP
+SIZE
+size of the operation, bytes
+.TP
+BLOCK
+disk block for the operation (location. relative to this filesystem.
+more useful with the -n option to print major and minor numbers)
+.TP
+STIME
+timestamp for the disk request, us
+.TP
+TIME
+timestamp for the disk completion, us
+.TP
+DELTA
+elapsed time from request to completion, us (this is the elapsed
+time from the disk request (strategy) to the disk completion (iodone))
+.TP
+DTIME
+time for disk to complete request, us (this is the time for the
+disk to complete that event since it's last event (time between iodones),
+or, the time to the strategy if the disk had been idle)
+.TP
+STRTIME
+timestamp for the disk completion, string
+.TP
+DEVICE
+device name
+.TP
+INS
+device instance number
+.TP
+D
+direction, Read or Write
+.TP
+MOUNT
+mount point
+.TP
+FILE
+filename (basename) for I/O operation
+.PP
+.SH NOTES
+When filtering on PID or process name, be aware that poor disk event
+times may be due to events that have been filtered away, for example
+another process that may be seeking the disk heads elsewhere.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+iosnoop will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+iotop(1M), dtrace(1M)
+
diff --git a/Man/man1m/iotop.1m b/Man/man1m/iotop.1m
new file mode 100644
index 000000000000..80522436ec84
--- /dev/null
+++ b/Man/man1m/iotop.1m
@@ -0,0 +1,154 @@
+.TH iotop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+iotop \- display top disk I/O events by process. Uses DTrace.
+.SH SYNOPSIS
+.B iotop
+[\-C] [\-D|\-o|\-P] [\-j|\-Z] [\-d device] [\-f filename]
+[\-m mount_point] [\-t top] [interval [count]]
+.SH DESCRIPTION
+iotop tracks disk I/O by process, and prints a summary report that
+is refreshed every interval.
+
+This is measuring disk events that have made it past system caches.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH OPTIONS
+.TP
+\-C
+don't clear the screen
+.TP
+\-D
+print delta times - elapsed, us
+.TP
+\-j
+print project ID
+.TP
+\-o
+print disk delta times, us
+.TP
+\-P
+print %I/O (disk delta times)
+.TP
+\-Z
+print zone ID
+.TP
+\-d device
+instance name to snoop (eg, dad0)
+.TP
+\-f filename
+full pathname of file to snoop
+.TP
+\-m mount_point
+mountpoint for filesystem to snoop
+.TP
+\-t top
+print top number only
+.PP
+.SH EXAMPLES
+.TP
+Default output, print summary every 5 seconds
+#
+.B iotop
+.PP
+.TP
+One second samples,
+#
+.B iotop
+1
+.PP
+.TP
+print %I/O (time based),
+#
+.B iotop
+\-P
+.PP
+.TP
+Snoop events on the root filesystem only,
+#
+.B iotop
+\-m /
+.TP
+Print top 20 lines only,
+#
+.B iotop
+\-t 20
+.TP
+Print 12 x 5 second samples, scrolling,
+#
+.B iotop
+\-C 5 12
+.PP
+.SH FIELDS
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+PPID
+parent process ID
+.TP
+PROJ
+project ID
+.TP
+ZONE
+zone ID
+.TP
+CMD
+command name for the process
+.TP
+DEVICE
+device name
+.TP
+MAJ
+device major number
+.TP
+MIN
+device minor number
+.TP
+D
+direction, Read or Write
+.TP
+BYTES
+total size of operations, bytes
+.TP
+ELAPSED
+total elapsed times from request to completion, us (this is the elapsed
+time from the disk request (strategy) to the disk completion (iodone))
+.TP
+DISKTIME
+total times for disk to complete request, us (this is the time for the
+disk to complete that event since it's last event (time between iodones),
+or, the time to the strategy if the disk had been idle)
+.TP
+%I/O
+percent disk I/O, based on time (DISKTIME)
+.TP
+load
+1 minute load average
+.TP
+disk_r
+total disk read Kb for sample
+.TP
+disk_w
+total disk write Kb for sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+iotop will run forever until Ctrl\-C is hit, or the specified
+interval is reached.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+iosnoop(1M), dtrace(1M)
+
diff --git a/Man/man1m/j_calldist.d.1m b/Man/man1m/j_calldist.d.1m
new file mode 100644
index 000000000000..d78ce8591b75
--- /dev/null
+++ b/Man/man1m/j_calldist.d.1m
@@ -0,0 +1,48 @@
+.TH j_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_calldist.d - measure Java elapsed times for different types of operation.
+.SH SYNOPSIS
+.B j_calldist.d
+[top]
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0). Method calls are only visible when using the
+flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+
+The "top" optional argument will truncate the output for each report
+section to that many lines, with a default of 10.
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_calldist.d
+.PP
+.SH FIELDS
+.TP
+1
+Process ID
+.TP
+2
+Type of call (method/gc)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_calldist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_calls.d.1m b/Man/man1m/j_calls.d.1m
new file mode 100644
index 000000000000..e89fb8e53961
--- /dev/null
+++ b/Man/man1m/j_calls.d.1m
@@ -0,0 +1,57 @@
+.TH j_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_calls.d - count Java calls (method/...) using DTrace.
+.SH SYNOPSIS
+.B j_calls.d
+
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0). Method calls and object allocation are only
+visible when using the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+TYPEs:
+cload class load
+method method call
+mcompile method compile
+mload compiled method load
+oalloc object alloc
+thread thread start
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_calls.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+TYPE
+Type of call (see below)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_calls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_calltime.d.1m b/Man/man1m/j_calltime.d.1m
new file mode 100644
index 000000000000..479dc5bfb48e
--- /dev/null
+++ b/Man/man1m/j_calltime.d.1m
@@ -0,0 +1,51 @@
+.TH j_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_calltime.d - measure Java elapsed times for different types of operation.
+.SH SYNOPSIS
+.B j_calltime.d
+[top]
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0). Method calls are only visible when using the
+flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+
+The "top" optional argument will truncate the output for each report
+section to that many lines, with a default of 10.
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_calltime.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+TYPE
+Type of call (method/gc/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total elapsed time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_calltime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_classflow.d.1m b/Man/man1m/j_classflow.d.1m
new file mode 100644
index 000000000000..af9d06c1a38b
--- /dev/null
+++ b/Man/man1m/j_classflow.d.1m
@@ -0,0 +1,63 @@
+.TH j_classflow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_classflow.d - trace a Java class method flow using DTrace.
+.SH SYNOPSIS
+.B j_classflow.d
+classname
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+This watches Java method entries and returns, and indents child
+method calls.
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_classflow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+PID
+Process ID
+.TP
+CLASS.METHOD
+Java class and method name
+.SH LEGEND
+.TP
+\->
+method entry
+.TP
+<\-
+method return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+Changes in TID will appear to shuffle output, as we change from one thread
+depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_classflow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_cpudist.d.1m b/Man/man1m/j_cpudist.d.1m
new file mode 100644
index 000000000000..37fe5f04fc3b
--- /dev/null
+++ b/Man/man1m/j_cpudist.d.1m
@@ -0,0 +1,48 @@
+.TH j_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_cpudist.d - measure Java on-CPU times for different types of operation.
+.SH SYNOPSIS
+.B j_cpudist.d
+[top]
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0). Method calls are only visible when using the
+flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+
+The "top" optional argument will truncate the output for each report
+section to that many lines, with a default of 10.
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_cpudist.d
+.PP
+.SH FIELDS
+.TP
+1
+Process ID
+.TP
+2
+Type of call (method/gc)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_cpudist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_cputime.d.1m b/Man/man1m/j_cputime.d.1m
new file mode 100644
index 000000000000..a0e767aedccb
--- /dev/null
+++ b/Man/man1m/j_cputime.d.1m
@@ -0,0 +1,51 @@
+.TH j_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_cputime.d - measure Java on-CPU times for different types of operation.
+.SH SYNOPSIS
+.B j_cputime.d
+[top]
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0). Method calls are only visible when using the
+flag "+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile
+
+The "top" optional argument will truncate the output for each report
+section to that many lines, with a default of 10.
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_cputime.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+TYPE
+Type of call (method/gc/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total on-CPU time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_cputime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_events.d.1m b/Man/man1m/j_events.d.1m
new file mode 100644
index 000000000000..6df009b2a7a4
--- /dev/null
+++ b/Man/man1m/j_events.d.1m
@@ -0,0 +1,46 @@
+.TH j_events.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_events.d - count Java events using DTrace.
+.SH SYNOPSIS
+.B j_events.d
+
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0). Some events such as method calls are only
+visible when using the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_events.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+EVENT
+Event name (DTrace probe name)
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_events.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_flow.d.1m b/Man/man1m/j_flow.d.1m
new file mode 100644
index 000000000000..579e68186c0a
--- /dev/null
+++ b/Man/man1m/j_flow.d.1m
@@ -0,0 +1,63 @@
+.TH j_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_flow.d - snoop Java execution showing method flow using DTrace.
+.SH SYNOPSIS
+.B j_flow.d
+
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+This watches Java method entries and returns, and indents child
+method calls.
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_flow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+PID
+Process ID
+.TP
+CLASS.METHOD
+Java class and method name
+.SH LEGEND
+.TP
+\->
+method entry
+.TP
+<\-
+method return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+Changes in TID will appear to shuffle output, as we change from one thread
+depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_flow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_flowtime.d.1m b/Man/man1m/j_flowtime.d.1m
new file mode 100644
index 000000000000..e4334b23e5b3
--- /dev/null
+++ b/Man/man1m/j_flowtime.d.1m
@@ -0,0 +1,69 @@
+.TH j_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_flowtime.d - snoop Java execution with method flow and delta times.
+.SH SYNOPSIS
+.B j_flowtime.d
+
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+This watches Java method entries and returns, and indents child
+method calls.
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_flowtime.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+TID
+Thread ID
+.TP
+TIME(us)
+Time since boot (us)
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+CLASS.METHOD
+Java class and method name
+.SH LEGEND
+.TP
+\->
+method entry
+.TP
+<\-
+method return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+Changes in TID will appear to shuffle output, as we change from one thread
+depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_flowtime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_methodcalls.d.1m b/Man/man1m/j_methodcalls.d.1m
new file mode 100644
index 000000000000..a44aea76dbd3
--- /dev/null
+++ b/Man/man1m/j_methodcalls.d.1m
@@ -0,0 +1,45 @@
+.TH j_methodcalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_methodcalls.d - count Java method calls DTrace.
+.SH SYNOPSIS
+.B j_methodcalls.d
+
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_methodcalls.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+COUNT
+Number of calls during sample
+.TP
+CLASS.METHOD
+Java class and method name
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_methodcalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_objnew.d.1m b/Man/man1m/j_objnew.d.1m
new file mode 100644
index 000000000000..14a6b21a0535
--- /dev/null
+++ b/Man/man1m/j_objnew.d.1m
@@ -0,0 +1,45 @@
+.TH j_objnew.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_objnew.d - report Java object allocation using DTrace.
+.SH SYNOPSIS
+.B j_objnew.d
+
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0) and the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_objnew.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+OBJS
+Number of objects created
+.TP
+CLASS.METHOD
+Java class and method name
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_objnew.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_package.d.1m b/Man/man1m/j_package.d.1m
new file mode 100644
index 000000000000..43f5b9b1623f
--- /dev/null
+++ b/Man/man1m/j_package.d.1m
@@ -0,0 +1,44 @@
+.TH j_package.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_package.d - count Java class loads by package using DTrace.
+.SH SYNOPSIS
+.B j_package.d
+
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0).
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_package.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+LOADS
+Class loads during trace
+.TP
+PACKAGE
+Package name from class
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_package.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_profile.d.1m b/Man/man1m/j_profile.d.1m
new file mode 100644
index 000000000000..7c1ca28f6b2b
--- /dev/null
+++ b/Man/man1m/j_profile.d.1m
@@ -0,0 +1,52 @@
+.TH j_profile.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_profile.d - sample stack traces with Java translations using DTrace.
+.SH SYNOPSIS
+.SH DESCRIPTION
+This samples stack traces for the process specified. This stack trace
+will cross the JVM and system libraries, and insert translations for Java
+stack frames where appropriate. This is best explained with an example
+stack frame output,
+
+Func_loop.func_c()V
+Func_loop.func_b()V
+Func_loop.func_a()V
+Func_loop.main([Ljava/lang/String;)V
+StubRoutines (1)
+libjvm.so`__1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHan
+libjvm.so`__1cCosUos_exception_wrapper6FpFpnJJavaValue_pnMmetho
+libjvm.so`__1cJJavaCallsEcall6FpnJJavaValue_nMmethodHandle_pnRJ
+libjvm.so`__1cRjni_invoke_static6FpnHJNIEnv__pnJJavaValue_pnI_j
+libjvm.so`jni_CallStaticVoidMethod+0x15d
+java`JavaMain+0xd30
+libc.so.1`_thr_setup+0x52
+libc.so.1`_lwp_start
+101
+
+The lines at the top are Java frames, followed by the JVM (libjvm.so).
+The JVM symbols may be translated by passing the output through c++filt.
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_profile.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_profile.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_stat.d.1m b/Man/man1m/j_stat.d.1m
new file mode 100644
index 000000000000..ab1495e7b690
--- /dev/null
+++ b/Man/man1m/j_stat.d.1m
@@ -0,0 +1,68 @@
+.TH j_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_stat.d - Java operation stats using DTrace.
+.SH SYNOPSIS
+.B j_stat.d
+[interval [count]]
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0). Method calls and object allocation are only
+visible when using the flag "+ExtendedDTraceProbes". eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+The numbers are counts for the interval specified. The default interval
+is 1 second.
+
+If you see a count in "EXECS" but not in the other columns, then your
+Java software is probably not running with the DTrace hotspot provider.
+
+If you see counts in "CLOAD" but not in "METHODS", then you Java
+software probably isn't running with "+ExtendedDTraceProbes".
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_stat.d
+.PP
+.SH FIELDS
+.TP
+EXEC/s
+Java programs executed per second, including
+those without Java provider support
+.TP
+METHOD/s
+Methods called, per second
+.TP
+OBJNEW/s
+Objects created, per second
+.TP
+CLOAD/s
+Class loads, per second
+.TP
+EXCP/s
+Exceptions raised, per second
+.TP
+RESC/s
+Rescues, per second
+.TP
+GC/s
+Garbage collects, per second
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_stat.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_syscalls.d.1m b/Man/man1m/j_syscalls.d.1m
new file mode 100644
index 000000000000..854c9017e59a
--- /dev/null
+++ b/Man/man1m/j_syscalls.d.1m
@@ -0,0 +1,48 @@
+.TH j_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_syscalls.d - count Java methods and syscalls using DTrace.
+.SH SYNOPSIS
+.B j_syscalls.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This traces Java methods if the hotspot provider exists (1.6.0) and
+the flag "+ExtendedDTraceProbes" is used. eg,
+java -XX:+ExtendedDTraceProbes classfile
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_syscalls.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+TYPE
+Type of call (method/syscall)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_syscalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_syscolors.d.1m b/Man/man1m/j_syscolors.d.1m
new file mode 100644
index 000000000000..e6bdebee7d3f
--- /dev/null
+++ b/Man/man1m/j_syscolors.d.1m
@@ -0,0 +1,65 @@
+.TH j_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_syscolors.d - trace Java method flow plus syscalls, in color.
+.SH SYNOPSIS
+.B j_syscolors.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This traces Java methods if the hotspot provider exists (1.6.0) and
+the flag "+ExtendedDTraceProbes" is used. eg,
+java -XX:+ExtendedDTraceProbes classfile
+
+This watches Java method entries and returns, and indents child
+method calls.
+
+If the flow appears to jump, check the TID column - the JVM may have
+switched to another thread.
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_syscolors.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+TID
+Thread ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+TYPE
+Type of call (func/syscall)
+.TP
+NAME
+Java method or syscall name
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+Changes in TID will appear to shuffle output, as we change from one thread
+depth to the next. See Docs/Notes/ALLjavaflow.txt for additional notes.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_syscolors.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_thread.d.1m b/Man/man1m/j_thread.d.1m
new file mode 100644
index 000000000000..97caf9ffc771
--- /dev/null
+++ b/Man/man1m/j_thread.d.1m
@@ -0,0 +1,54 @@
+.TH j_thread.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_thread.d - snoop Java thread execution using DTrace.
+.SH SYNOPSIS
+.B j_thread.d
+
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0).
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_thread.d
+.PP
+.SH FIELDS
+.TP
+TIME
+Time string
+.TP
+PID
+Process ID
+.TP
+TID
+Thread ID
+.TP
+THREAD
+Thread name
+.SH LEGEND
+.TP
+=>
+thread start
+.TP
+<=
+thread end
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_thread.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/j_who.d.1m b/Man/man1m/j_who.d.1m
new file mode 100644
index 000000000000..97d68e8baf5e
--- /dev/null
+++ b/Man/man1m/j_who.d.1m
@@ -0,0 +1,51 @@
+.TH j_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+j_who.d - trace Java calls by process using DTrace.
+.SH SYNOPSIS
+.B j_who.d
+
+.SH DESCRIPTION
+This traces activity from all Java processes on the system with hotspot
+provider support (1.6.0).
+
+The argument list is truncated at 55 characters (up to 80 is easily
+available). To easily read the full argument list, use other system tools;
+on Solaris use "pargs PID".
+.SH OS
+Solaris
+.SH STABILITY
+Evolving - uses the DTrace hotspot provider, which may change
+as additional features are introduced. Check Java/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B j_who.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID of Java
+.TP
+UID
+User ID of the owner
+.TP
+CALLS
+Number of calls made (a measure of activity)
+.TP
+ARGS
+Process name and arguments
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+j_who.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_calldist.d.1m b/Man/man1m/js_calldist.d.1m
new file mode 100644
index 000000000000..fbd20fcfbb3b
--- /dev/null
+++ b/Man/man1m/js_calldist.d.1m
@@ -0,0 +1,46 @@
+.TH js_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_calldist.d - measure JavaScript elapsed times for types of operation.
+.SH SYNOPSIS
+.B js_calldist.d
+
+.SH DESCRIPTION
+This traces JavaScript activity from all browsers running on the system with
+JavaScript provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_calldist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the JavaScript program
+.TP
+2
+Type of call (func/obj-new)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_calldist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_calls.d.1m b/Man/man1m/js_calls.d.1m
new file mode 100644
index 000000000000..c997293cdd01
--- /dev/null
+++ b/Man/man1m/js_calls.d.1m
@@ -0,0 +1,49 @@
+.TH js_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_calls.d - count JavaScript calls using DTrace.
+.SH SYNOPSIS
+.B js_calls.d
+
+.SH DESCRIPTION
+This traces activity from all browsers on the system that are
+running with JavaScript provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_calls.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the JavaScript program
+.TP
+TYPE
+Type of call (func/obj-new/...)
+.TP
+NAME
+Descriptive name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_calls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_calltime.d.1m b/Man/man1m/js_calltime.d.1m
new file mode 100644
index 000000000000..785587b16c10
--- /dev/null
+++ b/Man/man1m/js_calltime.d.1m
@@ -0,0 +1,49 @@
+.TH js_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_calltime.d - measure JavaScript elapsed times for types of operation.
+.SH SYNOPSIS
+.B js_calltime.d
+
+.SH DESCRIPTION
+This traces JavaScript activity from all browsers running on the system with
+JavaScript provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_calltime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the JavaScript program
+.TP
+TYPE
+Type of call (func/obj-new/gc/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total elapsed time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_calltime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_cpudist.d.1m b/Man/man1m/js_cpudist.d.1m
new file mode 100644
index 000000000000..64a9aec98ec8
--- /dev/null
+++ b/Man/man1m/js_cpudist.d.1m
@@ -0,0 +1,46 @@
+.TH js_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_cpudist.d - measure JavaScript on-CPU times for types of operation.
+.SH SYNOPSIS
+.B js_cpudist.d
+
+.SH DESCRIPTION
+This traces JavaScript activity from all browsers running on the system with
+JavaScript provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_cpudist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the JavaScript program
+.TP
+2
+Type of call (func/obj-new)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_cpudist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_cputime.d.1m b/Man/man1m/js_cputime.d.1m
new file mode 100644
index 000000000000..2aaefc13c8e1
--- /dev/null
+++ b/Man/man1m/js_cputime.d.1m
@@ -0,0 +1,49 @@
+.TH js_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_cputime.d - measure JavaScript on-CPU times for types of operation.
+.SH SYNOPSIS
+.B js_cputime.d
+
+.SH DESCRIPTION
+This traces JavaScript activity from all browsers running on the system with
+JavaScript provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_cputime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the JavaScript program
+.TP
+TYPE
+Type of call (func/obj-new/gc/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total on-CPU time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_cputime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_execs.d.1m b/Man/man1m/js_execs.d.1m
new file mode 100644
index 000000000000..61613c040053
--- /dev/null
+++ b/Man/man1m/js_execs.d.1m
@@ -0,0 +1,46 @@
+.TH js_execs.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_execs.d - JavaScript execute snoop using DTrace.
+.SH SYNOPSIS
+.B js_execs.d
+
+.SH DESCRIPTION
+This traces activity from all browsers on the system that are
+running with JavaScript provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_execs.d
+.PP
+.SH FIELDS
+.TP
+TIME
+Time of event
+.TP
+FILE
+Filename of the JavaScript program
+.TP
+LINENO
+Line number in filename
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_execs.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_flow.d.1m b/Man/man1m/js_flow.d.1m
new file mode 100644
index 000000000000..5d4ba0d23e7b
--- /dev/null
+++ b/Man/man1m/js_flow.d.1m
@@ -0,0 +1,59 @@
+.TH js_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_flow.d - snoop JavaScript execution showing function flow using DTrace.
+.SH SYNOPSIS
+.B js_flow.d
+
+.SH DESCRIPTION
+This traces activity from all browsers on the system that are running
+with JavaScript provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_flow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this function belongs to
+.TP
+FUNC
+Function name
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_flow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_flowinfo.d.1m b/Man/man1m/js_flowinfo.d.1m
new file mode 100644
index 000000000000..1531ce5b428f
--- /dev/null
+++ b/Man/man1m/js_flowinfo.d.1m
@@ -0,0 +1,68 @@
+.TH js_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_flowinfo.d - JavaScript function flow with info using DTrace.
+.SH SYNOPSIS
+.B js_flowinfo.d
+
+.SH DESCRIPTION
+This traces activity from all browsers on the system that are running
+with JavaScript provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_flowinfo.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the JavScript program
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (func)
+.TP
+FUNC
+Function name
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_flowinfo.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_flowtime.d.1m b/Man/man1m/js_flowtime.d.1m
new file mode 100644
index 000000000000..f90c9998fb70
--- /dev/null
+++ b/Man/man1m/js_flowtime.d.1m
@@ -0,0 +1,62 @@
+.TH js_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_flowtime.d - JavaScript function flow with delta times using DTrace.
+.SH SYNOPSIS
+.B js_flowtime.d
+
+.SH DESCRIPTION
+This traces activity from all browsers on the system that are running
+with JavaScript provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_flowtime.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this function belongs to
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FUNC
+Function name
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_flowtime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_objcpu.d.1m b/Man/man1m/js_objcpu.d.1m
new file mode 100644
index 000000000000..088fa06e70b6
--- /dev/null
+++ b/Man/man1m/js_objcpu.d.1m
@@ -0,0 +1,36 @@
+.TH js_objcpu.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_objcpu.d - measure JavaScript object creation on-CPU time using DTrace.
+.SH SYNOPSIS
+.B js_objcpu.d
+
+.SH DESCRIPTION
+This traces JavaScript activity from all browsers running on the system
+with JavaScript provider support.
+
+Class names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_objcpu.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_objcpu.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_objgc.d.1m b/Man/man1m/js_objgc.d.1m
new file mode 100644
index 000000000000..691883e6dc6e
--- /dev/null
+++ b/Man/man1m/js_objgc.d.1m
@@ -0,0 +1,60 @@
+.TH js_objgc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_objgc.d - trace JavaScript Object GC using DTrace.
+.SH SYNOPSIS
+.B js_objgc.d
+
+.SH DESCRIPTION
+This traces JavaScript activity from all running browers on the system
+which support the JavaScript DTrace provider.
+
+This script provides information on which objects are not being garbage
+collected, an issue which causes the browser to steadily leak memory.
+We trace object creation (+1) and destruction (-1), and provide a
+summary each second of the running tally of the object class and
+originating filename. If over the period of several minutes an object
+type is still steadily increasing, then that would be of interest.
+Be patient, depending on the rate of object creation it can take over
+ten minutes for garbage collect to kick in.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_objgc.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename that contained the function
+.TP
+CLASS
+Class to which this new object belongs
+.TP
+TOTAL
+Object entropy (positive == uncollected)
+.SH NOTES
+
+\- it is possible that you will see negative entropy. That happens
+when you begin tracing after some objects have already been created,
+and then trace their destruction.
+\- there are other Things that GC handles, other than Objects; extra
+probes can be added to trace them, should the need arise.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_objgc.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_objnew.d.1m b/Man/man1m/js_objnew.d.1m
new file mode 100644
index 000000000000..83897b5dfbab
--- /dev/null
+++ b/Man/man1m/js_objnew.d.1m
@@ -0,0 +1,46 @@
+.TH js_objnew.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_objnew.d - count JavaScript object creation using DTrace.
+.SH SYNOPSIS
+.B js_objnew.d
+
+.SH DESCRIPTION
+This traces JavaScript activity from all browsers running on the system
+with JavaScript provider support.
+
+Filename and class names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_objnew.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the JavaScript program
+.TP
+CLASS
+Class of new object
+.TP
+COUNT
+Number of object creations during tracing
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_objnew.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_stat.d.1m b/Man/man1m/js_stat.d.1m
new file mode 100644
index 000000000000..3234630a3022
--- /dev/null
+++ b/Man/man1m/js_stat.d.1m
@@ -0,0 +1,52 @@
+.TH js_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_stat.d - JavaScript operation stats using DTrace.
+.SH SYNOPSIS
+.B js_stat.d
+[interval [count]]
+.SH DESCRIPTION
+This traces activity from all browsers on the system that are
+running with JavaScript provider support.
+
+The numbers are counts for the interval specified. The default interval
+is 1 second.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_stat.d
+.PP
+.SH FIELDS
+.TP
+EXEC/s
+JavaScript programs executed per second
+.TP
+FUNCS/s
+Functions called, per second
+.TP
+OBJNEW/s
+Objects created, per second
+.TP
+OBJFRE/s
+Objects freed (finalize), per second
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_stat.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/js_who.d.1m b/Man/man1m/js_who.d.1m
new file mode 100644
index 000000000000..119ea2626bd3
--- /dev/null
+++ b/Man/man1m/js_who.d.1m
@@ -0,0 +1,49 @@
+.TH js_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+js_who.d - trace JavaScript function execution by process using DTrace.
+.SH SYNOPSIS
+.B js_who.d
+
+.SH DESCRIPTION
+This traces JavaScript activity from all browsers on the system that are
+running with JavaScript provider support.
+
+Filenames are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace JavaScript provider, which may change
+as additional features are introduced. Check JavaScript/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B js_who.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID of JavaScript
+.TP
+UID
+User ID of the owner
+.TP
+FUNCS
+Number of function calls
+.TP
+FILE
+Pathname of the JavaScript program
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+js_who.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/kill.d.1m b/Man/man1m/kill.d.1m
new file mode 100644
index 000000000000..e9e966a9c92b
--- /dev/null
+++ b/Man/man1m/kill.d.1m
@@ -0,0 +1,53 @@
+.TH kill.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+kill.d \- snoop process signals as they occur. Uses DTrace.
+.SH SYNOPSIS
+.B kill.d
+.SH DESCRIPTION
+kill.d is a simple DTrace program to print details of process
+signals as they are sent, such as the PID source and destination,
+signal number and result.
+
+This program can be used to determine which process is sending
+signals to which other process.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+Default output, print process signals as they are sent.
+#
+.B kill.d
+.PP
+.SH FIELDS
+.TP
+FROM
+source PID
+.TP
+COMMAND
+source command name
+.TP
+TO
+destination PID
+.TP
+SIG
+destination signal ("9" for a kill -9)
+.TP
+RESULT
+result of signal (-1 is for failure)
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+kill.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/kstat_types.d.1m b/Man/man1m/kstat_types.d.1m
new file mode 100644
index 000000000000..8a2d11952c45
--- /dev/null
+++ b/Man/man1m/kstat_types.d.1m
@@ -0,0 +1,50 @@
+.TH kstat_types.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+kstat_types.d \- Trace kstat reads with type info. Uses DTrace.
+.SH SYNOPSIS
+.B kstat_types.d
+.SH DESCRIPTION
+kstat is the Kernel Statistics framework, which is used by tools
+such as vmstat, iostat, mpstat and sar. Try running vmstat while
+kstat_types.d is tracing - you should see details of the kstat
+reads performed.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Trace kstat reads as they occur,
+#
+.B kstat_types.d
+.PP
+.SH FIELDS
+.TP
+CMD
+command name
+.TP
+CLASS
+kstat class (ks_class)
+.TP
+TYPE
+kstat type as a string (ks_type)
+.TP
+MOD:INS:NAME
+kstat module:instance:name
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+kstat_types.d will trace until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), kstat(1M), kstat(3KSTAT)
diff --git a/Man/man1m/lastwords.1m b/Man/man1m/lastwords.1m
new file mode 100644
index 000000000000..024234bf49f7
--- /dev/null
+++ b/Man/man1m/lastwords.1m
@@ -0,0 +1,56 @@
+.TH lastwords 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+lastwords \- print syscalls before exit. Uses DTrace.
+.SH SYNOPSIS
+.B lastwords command
+.SH DESCRIPTION
+This prints the last few system calls for processes matching
+the given name, when they exit. This makes use of a ring buffer
+so that the impact on the system is minimised.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall and proc providers.
+.SH EXAMPLES
+.TP
+Catch last few syscalls for dying netscape processes,
+#
+.B lastwords netscape
+.PP
+.SH FIELDS
+.TP
+TIME
+time of syscall return, ns
+.TP
+PID
+process ID
+.TP
+EXEC
+process name (execname)
+.TP
+SYSCALL
+system call
+.TP
+RETURN
+return value for the system call
+.TP
+ERR
+errno for the system call
+.PP
+.SH BASED ON
+/usr/demo/dtrace/ring.d
+.PP
+.SH DOCUMENTATION
+DTrace Guide "Buffers and Buffering" chapter (docs.sun.com)
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+lastwords will sample until a command with that name exits.
+.SH SEE ALSO
+dtruss(1M), dtrace(1M)
+
diff --git a/Man/man1m/loads.d.1m b/Man/man1m/loads.d.1m
new file mode 100644
index 000000000000..f18d3b119507
--- /dev/null
+++ b/Man/man1m/loads.d.1m
@@ -0,0 +1,38 @@
+.TH loads.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+loads.d \- print load averages. Uses DTrace.
+.SH SYNOPSIS
+.B loads.d
+.SH DESCRIPTION
+These are the same load averages that the "uptime" command prints.
+The purpose of this script is to demonstrate fetching these values
+from the DTrace language.
+
+The first field is the 1 minute average, the second is the 5 minute,
+and the third is the 15 minute average. The value represents the average
+number of runnable threads in the system, a value higher than your
+CPU (core/hwthread) count may be a sign of CPU saturation.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - uses kernel symbols, which may change for a future version
+of this OS.
+.SH EXAMPLES
+.TP
+Print load averages,
+#
+.B loads.d
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+uptime(1), dtrace(1M)
+
diff --git a/Man/man1m/lockbydist.d.1m b/Man/man1m/lockbydist.d.1m
new file mode 100644
index 000000000000..188c5a4e5f40
--- /dev/null
+++ b/Man/man1m/lockbydist.d.1m
@@ -0,0 +1,54 @@
+.TH lockbydist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+lockbydist.d \- lock distrib. by process name. Uses DTrace.
+.SH SYNOPSIS
+.B lockbydist.d
+.SH DESCRIPTION
+lockbydist.d is a DTrace OneLiner to a report the time threads have
+spent blocked on adaptive mutexes, by process name.
+
+A distribution is printed to illustrate the number of blocks at
+different lengths in time. This helps us identify if there are many
+short blocks, or fewer large blocks.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the lockstat provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B lockbydist.d
+.PP
+.SH FIELDS
+.TP
+process name
+The process name. There may be several PIDs that have the
+same process name, for example with numerous instances of "bash". The
+value reported will be the sum of them all.
+.TP
+value
+The blocked time in nanoseconds
+.TP
+count
+The number of occurrences that were at least this size
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+lockbydist.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+lockstat(1M), dtrace(1M)
+
diff --git a/Man/man1m/lockbyproc.d.1m b/Man/man1m/lockbyproc.d.1m
new file mode 100644
index 000000000000..af6c9114b71a
--- /dev/null
+++ b/Man/man1m/lockbyproc.d.1m
@@ -0,0 +1,47 @@
+.TH lockbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+lockbyproc.d \- lock time by process name. Uses DTrace.
+.SH SYNOPSIS
+.B lockbyproc.d
+.SH DESCRIPTION
+lockbyproc.d is a DTrace OneLiner to a report the total time threads
+have spent blocked on adaptive mutexes, by process name.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the lockstat provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B lockbyproc.d
+.PP
+.SH FIELDS
+.TP
+first field
+This is the process name. There may be several PIDs that have the
+same process name, for example with numerous instances of "bash". The
+value reported will be the sum of them all.
+.TP
+second field
+This is the total length of time blocked, in nanoseconds.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+lockbyproc.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+lockstat(1M), dtrace(1M)
+
diff --git a/Man/man1m/minfbypid.d.1m b/Man/man1m/minfbypid.d.1m
new file mode 100644
index 000000000000..45574f487ae0
--- /dev/null
+++ b/Man/man1m/minfbypid.d.1m
@@ -0,0 +1,46 @@
+.TH minfbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+minfbypid.d \- minor faults by process name. Uses DTrace.
+.SH SYNOPSIS
+.B minfbypid.d
+.SH DESCRIPTION
+minfbypid.d is a DTrace OneLiner to a report the number of minor
+faults by process name.
+
+This is based on a script from DExplorer.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the vminfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B minfbypid.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+MINFAULTS
+number of minor faults in this sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+minfbypid.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/minfbyproc.d.1m b/Man/man1m/minfbyproc.d.1m
new file mode 100644
index 000000000000..9045e48da762
--- /dev/null
+++ b/Man/man1m/minfbyproc.d.1m
@@ -0,0 +1,47 @@
+.TH minfbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+minfbyproc.d \- minor faults by process name. Uses DTrace.
+.SH SYNOPSIS
+.B minfbyproc.d
+.SH DESCRIPTION
+minfbyproc.d is a DTrace OneLiner to a report the number of minor
+faults by process name.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the vminfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B minfbyproc.d
+.PP
+.SH FIELDS
+.TP
+first field
+The process name. There may be several PIDs that have the
+same process name, for example with numerous instances of "bash". The
+value reported will be the sum of them all.
+.TP
+second field
+The number minor faults
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+minfbyproc.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/mmapfiles.d.1m b/Man/man1m/mmapfiles.d.1m
new file mode 100644
index 000000000000..e4bb2c89eaef
--- /dev/null
+++ b/Man/man1m/mmapfiles.d.1m
@@ -0,0 +1,42 @@
+.TH mmapfiles.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+mmapfiles.d \- mmap'd files by process. Uses DTrace.
+.SH SYNOPSIS
+.B mmapfiles.d
+.SH DESCRIPTION
+This prints statistics on the pathnames that were mmap'd by processes.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B mmapfiles.d
+.PP
+.SH FIELDS
+.TP
+MMAPS
+number of mmaps
+.TP
+CMD
+process name
+.TP
+PATHNAME
+pathname of mmap'd file
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+mmapfiles.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/modcalls.d.1m b/Man/man1m/modcalls.d.1m
new file mode 100644
index 000000000000..af7722b71c4c
--- /dev/null
+++ b/Man/man1m/modcalls.d.1m
@@ -0,0 +1,50 @@
+.TH modcalls.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+modcalls.d \- kernel function calls by module. Uses DTrace.
+.SH SYNOPSIS
+.B modcalls.d
+.SH DESCRIPTION
+modcalls.d is a DTrace OneLiner to a report of the number of
+kernel function calls by module.
+
+This script may be useful to determine whether drivers are "thinking" when
+troubleshooting driver issues.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Any
+.SH STABILITY
+stable - while this script uses the unstable fbt provider, it does so
+in a stable way.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B modcalls.d
+.PP
+.SH FIELDS
+.TP
+first field
+This is the module name, or kernel driver name. if a name is
+unfamiliar to you there may be a man page to explain what it is.
+.TP
+second field
+This is the number of function calls by this module.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+modcalls.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/newproc.d.1m b/Man/man1m/newproc.d.1m
new file mode 100644
index 000000000000..b3b979b4e779
--- /dev/null
+++ b/Man/man1m/newproc.d.1m
@@ -0,0 +1,54 @@
+.TH newproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+newproc.d \- snoop new processes. Uses DTrace.
+.SH SYNOPSIS
+.B newproc.d
+.SH DESCRIPTION
+newproc.d is a DTrace OneLiner to snoop new processes as they are run.
+The argument listing is printed.
+
+This is useful to identify short lived processes that are usually
+difficult to spot using traditional tools.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the proc provider.
+.SH EXAMPLES
+.TP
+This prints new processes until Ctrl\-C is hit.
+#
+.B newproc.d
+.PP
+.SH FIELDS
+.TP
+CPU
+The CPU that recieved the event
+.TP
+ID
+A DTrace probe ID for the event
+.TP
+FUNCTION:NAME
+The DTrace probe name for the event
+.TP
+remaining fields
+These contains the argument listing for the new process
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+newproc.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+execsnoop(1M), dtrace(1M), truss(1)
+
diff --git a/Man/man1m/nfswizard.d.1m b/Man/man1m/nfswizard.d.1m
new file mode 100644
index 000000000000..64d8e416e83f
--- /dev/null
+++ b/Man/man1m/nfswizard.d.1m
@@ -0,0 +1,36 @@
+.TH nfswizard.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+nfswizard.d \- nfs client activity wizard. Uses DTrace.
+.SH SYNOPSIS
+.B nfswizard.d
+.SH DESCRIPTION
+This examines activity caused by NFS client processes on the same server
+that you are running this script on. A detailed report is generated
+to explain various details of NFS client activity, including response
+times and file access.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.PP
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH EXAMPLES
+.TP
+Sample NFS client activity, then print a report after Ctrl\-C,
+#
+.B nfswizard.d
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+nfswizard.d will sample activity until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/opensnoop.1m b/Man/man1m/opensnoop.1m
new file mode 100644
index 000000000000..bc449c05b1b9
--- /dev/null
+++ b/Man/man1m/opensnoop.1m
@@ -0,0 +1,139 @@
+.TH opensnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+opensnoop \- snoop file opens as they occur. Uses DTrace.
+.SH SYNOPSIS
+.B opensnoop
+[\-a|\-A|\-ceghsvxZ] [\-f pathname] [\-n name] [\-p PID]
+.SH DESCRIPTION
+opensnoop tracks file opens. As a process issues a file open, details
+such as UID, PID and pathname are printed out.
+
+The returned file descriptor is printed,
+a value of -1 indicates an error. This can be useful
+for troubleshooting to determine if appliacions are attempting to
+open files that do not exist.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH OPTIONS
+.TP
+\-a
+print all data
+.TP
+\-A
+dump all data, space delimited
+.TP
+\-c
+print current working directory of process
+.TP
+\-e
+print errno value
+.TP
+\-g
+print full command arguments
+.TP
+\-s
+print start time, us
+.TP
+\-v
+print start time, string
+.TP
+\-x
+only print failed opens
+.TP
+\-Z
+print zonename
+.TP
+\-f pathname
+file pathname to snoop
+.TP
+\-n name
+process name to snoop
+.TP
+\-p PID
+process ID to snoop
+.PP
+.SH EXAMPLES
+.TP
+Default output, print file opens by process as they occur,
+#
+.B opensnoop
+.PP
+.TP
+Print human readable timestamps,
+#
+.B opensnoop
+\-v
+.PP
+.TP
+See error codes,
+#
+.B opensnoop
+\-e
+.PP
+.TP
+Snoop this file only,
+#
+.B opensnoop
+\-f /etc/passwd
+.PP
+.SH FIELDS
+.TP
+ZONE
+Zone name
+.TP
+UID
+User ID
+.TP
+PID
+Process ID
+.TP
+PPID
+Parent Process ID
+.TP
+FD
+File Descriptor (-1 is error)
+.TP
+ERR
+errno value (see /usr/include/sys/errno.h)
+.TP
+CWD
+current working directory of process
+.TP
+PATH
+pathname for file open
+.TP
+COMM
+command name for the process
+.TP
+ARGS
+argument listing for the process
+.TP
+TIME
+timestamp for the open event, us
+.TP
+STRTIME
+timestamp for the open event, string
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+opensnoop will run forever until Ctrl\-C is hit.
+.SH BUGS
+occasionally the pathname for the file open cannot be read
+and the following error will be seen,
+
+dtrace: error on enabled probe ID 6 (...): invalid address
+
+this is normal behaviour.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/pathopens.d.1m b/Man/man1m/pathopens.d.1m
new file mode 100644
index 000000000000..cf043bd1c3f6
--- /dev/null
+++ b/Man/man1m/pathopens.d.1m
@@ -0,0 +1,38 @@
+.TH pathopens.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+pathopens.d \- full pathnames opened ok count. Uses DTrace.
+.SH SYNOPSIS
+.B pathopens.d
+.SH DESCRIPTION
+This program prints a count of the number of times files have been
+successfully opened. This is somewhat special in that the full pathname
+is calculated, even if the file open referred to a relative pathname.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B pathopens.d
+.PP
+.SH FIELDS
+.TP
+PATHNAME
+full pathname
+.TP
+COUNT
+number of successful opens
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+pathopens.d will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+opensnoop(1M), dtrace(1M)
diff --git a/Man/man1m/pfilestat.1m b/Man/man1m/pfilestat.1m
new file mode 100644
index 000000000000..8780c2e58e1c
--- /dev/null
+++ b/Man/man1m/pfilestat.1m
@@ -0,0 +1,87 @@
+.TH pfilestat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+pfilestat \- show I/O latency break down by FD. Uses DTrace.
+.SH SYNOPSIS
+.B pfilestat [\-r|\-w] pid
+.SH DESCRIPTION
+This prints I/O statistics for each file descriptor within a process.
+In particular, the time break down during read() and write() events is
+measured.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH OPTIONS
+.TP
+\-r
+reads only
+.TP
+\-w
+writes only
+.TP
+pid
+process ID to examine
+.PP
+.SH EXAMPLES
+.TP
+Sample both read and write activity for PID 81,
+#
+.B pfilestat 81
+.TP
+Sample reads only for PID 81,
+#
+.B pfilestat
+\-r 81
+.PP
+.SH FIELDS
+.TP
+STATE
+microstate. see STATES below.
+.TP
+FDUM
+file Descriptor ID
+.TP
+Time
+percentage of wallclock time in each STATE
+.TP
+File
+Name of file, if known
+.PP
+.SH STATES
+.TP
+read
+Time spent during the execution of the read() syscall.
+.TP
+write
+Time spent during the execution of the write() syscall.
+.TP
+waitcpu
+Latency spent waiting to be scheduled after becoming runnable.
+.TP
+running
+Process running user-mode code.
+.TP
+sleep-r
+Process sleeping on reads.
+.TP
+sleep-w
+Process sleeping on writes.
+.PP
+.SH DOCUMENTATION
+pfilestat is discussed and demonstrated in Solaris Internals 2nd edition,
+volume 2.
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+pfilestat will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Richard McDougall
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pgpginbypid.d.1m b/Man/man1m/pgpginbypid.d.1m
new file mode 100644
index 000000000000..fdaa297b51d0
--- /dev/null
+++ b/Man/man1m/pgpginbypid.d.1m
@@ -0,0 +1,47 @@
+.TH pgpginbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+pgpginbypid.d \- pages paged in by PID. Uses DTrace.
+.SH SYNOPSIS
+.B pgpginbypid.d
+.SH DESCRIPTION
+pgpginbypid.d reports the rumber of pages paged in from the disks
+by process ID. This is an indicator that processes are reading
+from the disks.
+
+This is based on a script from DExplorer.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the vminfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B pgpginbypid.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+PAGES
+number of pages paged in
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+pgpginbypid.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+iosnoop(1m), dtrace(1M)
+
diff --git a/Man/man1m/pgpginbyproc.d.1m b/Man/man1m/pgpginbyproc.d.1m
new file mode 100644
index 000000000000..413043af10e5
--- /dev/null
+++ b/Man/man1m/pgpginbyproc.d.1m
@@ -0,0 +1,50 @@
+.TH pgpginbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+pgpginbyproc.d \- pages pagedin by process name. Uses DTrace.
+.SH SYNOPSIS
+.B pgpginbyproc.d
+.SH DESCRIPTION
+pgpginbyproc.d is a DTrace OneLiner to a report the number of pages
+paged in by process name.
+
+This may be one way to help identify the process responsible for
+causing heavy read traffic to the disks.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the vminfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B pgpginbyproc.d
+.PP
+.SH FIELDS
+.TP
+first field
+The process name. There may be several PIDs that have the
+same process name, for example with numerous instances of "bash". The
+value reported will be the sum of them all.
+.TP
+second field
+The number of pages paged in
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+pgpginbyproc.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+iosnoop(1m), dtrace(1M), truss(1)
+
diff --git a/Man/man1m/php_calldist.d.1m b/Man/man1m/php_calldist.d.1m
new file mode 100644
index 000000000000..065d6db2d7d1
--- /dev/null
+++ b/Man/man1m/php_calldist.d.1m
@@ -0,0 +1,49 @@
+.TH php_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_calldist.d - measure PHP elapsed times for functions.
+.SH SYNOPSIS
+.B php_calldist.d
+
+.SH DESCRIPTION
+This traces PHP activity from all programs running on the system with
+PHP provider support.
+
+This script prints distribution plots of elapsed time for PHP
+operations. Use php_calltime.d for summary reports.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_calldist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the PHP program
+.TP
+2
+Type of call (func)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_calldist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_calltime.d.1m b/Man/man1m/php_calltime.d.1m
new file mode 100644
index 000000000000..f090b6e70160
--- /dev/null
+++ b/Man/man1m/php_calltime.d.1m
@@ -0,0 +1,49 @@
+.TH php_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_calltime.d - measure PHP elapsed times for functions.
+.SH SYNOPSIS
+.B php_calltime.d
+
+.SH DESCRIPTION
+This traces PHP activity from all programs running on the system with
+PHP provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_calltime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the PHP program
+.TP
+TYPE
+Type of call (func/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total elapsed time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_calltime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_cpudist.d.1m b/Man/man1m/php_cpudist.d.1m
new file mode 100644
index 000000000000..54ea0d195b84
--- /dev/null
+++ b/Man/man1m/php_cpudist.d.1m
@@ -0,0 +1,49 @@
+.TH php_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_cpudist.d - measure PHP on-CPU times for functions.
+.SH SYNOPSIS
+.B php_cpudist.d
+
+.SH DESCRIPTION
+This traces PHP activity from all programs running on the system with
+PHP provider support.
+
+This script prints distribution plots of elapsed time for PHP
+operations. Use php_cputime.d for summary reports.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_cpudist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the PHP program
+.TP
+2
+Type of call (func)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_cpudist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_cputime.d.1m b/Man/man1m/php_cputime.d.1m
new file mode 100644
index 000000000000..2020969224f6
--- /dev/null
+++ b/Man/man1m/php_cputime.d.1m
@@ -0,0 +1,49 @@
+.TH php_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_cputime.d - measure PHP on-CPU times for functions.
+.SH SYNOPSIS
+.B php_cputime.d
+
+.SH DESCRIPTION
+This traces PHP activity from all programs running on the system with
+PHP provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_cputime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the PHP program
+.TP
+TYPE
+Type of call (func/total)
+.TP
+NAME
+Name of call (function name)
+.TP
+TOTAL
+Total on-CPU time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_cputime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_flow.d.1m b/Man/man1m/php_flow.d.1m
new file mode 100644
index 000000000000..bda09e3b24d6
--- /dev/null
+++ b/Man/man1m/php_flow.d.1m
@@ -0,0 +1,60 @@
+.TH php_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_flow.d - snoop PHP execution showing function flow.
+.SH SYNOPSIS
+.B php_flow.d
+
+.SH DESCRIPTION
+This traces PHP activity from all PHP programs on the system
+running with PHP provider support.
+
+This watches PHP function entries and returns, and indents child
+function calls.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_flow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this function belongs to
+.TP
+FUNC
+Function name
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_flow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_flowinfo.d.1m b/Man/man1m/php_flowinfo.d.1m
new file mode 100644
index 000000000000..2e9282e73035
--- /dev/null
+++ b/Man/man1m/php_flowinfo.d.1m
@@ -0,0 +1,68 @@
+.TH php_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_flowinfo.d - snoop PHP function flow with info using DTrace.
+.SH SYNOPSIS
+.B php_flowinfo.d
+
+.SH DESCRIPTION
+This traces activity from all PHP programs on the system that are
+running with PHP provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_flowinfo.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the PHP program
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (func)
+.TP
+FUNC
+PHP function
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_flowinfo.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_flowtime.d.1m b/Man/man1m/php_flowtime.d.1m
new file mode 100644
index 000000000000..f30c283e5476
--- /dev/null
+++ b/Man/man1m/php_flowtime.d.1m
@@ -0,0 +1,65 @@
+.TH php_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_flowtime.d - snoop PHP functions with flow and delta times.
+.SH SYNOPSIS
+.B php_flowtime.d
+
+.SH DESCRIPTION
+This traces shell activity from PHP programs on the system that are
+running with PHP provider support.
+
+This watches PHP function entries and returns, and indents child
+function calls.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_flowtime.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this function belongs to
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FUNC
+PHP function name
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_flowtime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_funccalls.d.1m b/Man/man1m/php_funccalls.d.1m
new file mode 100644
index 000000000000..eb01963bb2fa
--- /dev/null
+++ b/Man/man1m/php_funccalls.d.1m
@@ -0,0 +1,43 @@
+.TH php_funccalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_funccalls.d - measure PHP function calls using DTrace.
+.SH SYNOPSIS
+.B php_funccalls.d
+
+.SH DESCRIPTION
+This traces PHP activity from all running programs on the system
+which support the PHP DTrace provider.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_funccalls.d
+.PP
+.SH FIELDS
+.TP
+FUNC
+PHP function name
+.TP
+CALLS
+Function calls during this sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_funccalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_malloc.d.1m b/Man/man1m/php_malloc.d.1m
new file mode 100644
index 000000000000..a11944d9537c
--- /dev/null
+++ b/Man/man1m/php_malloc.d.1m
@@ -0,0 +1,39 @@
+.TH php_malloc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_malloc.d - PHP libc malloc analysis.
+.SH SYNOPSIS
+.B php_malloc.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This is an expiremental script to identify who is calling malloc() for
+memory allocation, and to print distribution plots of the requested bytes.
+If a malloc() occured while in a PHP function, then that function is
+identified as responsible; else the caller of malloc() is identified as
+responsible - which will be a function from the PHP engine.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_malloc.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_malloc.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_syscalls.d.1m b/Man/man1m/php_syscalls.d.1m
new file mode 100644
index 000000000000..e2b10b0f84fa
--- /dev/null
+++ b/Man/man1m/php_syscalls.d.1m
@@ -0,0 +1,54 @@
+.TH php_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_syscalls.d - count PHP function calls and syscalls using DTrace.
+.SH SYNOPSIS
+.B php_syscalls.d
+
+.SH DESCRIPTION
+This traces syscalls that occured during a PHP function call.
+
+Filename and function names are printed if available.
+The filename for syscalls may be printed as "php", if the program
+was invoked using the form "php filename" rather than running the
+program with an interpreter line.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_syscalls.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+FILE
+Filename of the PHP program
+.TP
+TYPE
+Type of call (func/syscall)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_syscalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_syscolors.d.1m b/Man/man1m/php_syscolors.d.1m
new file mode 100644
index 000000000000..0a29ffb43913
--- /dev/null
+++ b/Man/man1m/php_syscolors.d.1m
@@ -0,0 +1,61 @@
+.TH php_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_syscolors.d - trace PHP function flow plus syscalls, in color.
+.SH SYNOPSIS
+.B php_syscolors.d
+
+.SH DESCRIPTION
+This watches PHP function entries and returns, and indents child
+function calls.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_syscolors.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the PHP program
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (func/syscall)
+.TP
+NAME
+PHP function or syscall name
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_syscolors.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/php_who.d.1m b/Man/man1m/php_who.d.1m
new file mode 100644
index 000000000000..9aacba6221ef
--- /dev/null
+++ b/Man/man1m/php_who.d.1m
@@ -0,0 +1,49 @@
+.TH php_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+php_who.d - trace PHP function execution by process using DTrace.
+.SH SYNOPSIS
+.B php_who.d
+
+.SH DESCRIPTION
+This traces PHP activity from all PHP programs on the system that are
+running with PHP provider support.
+
+Filenames are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Php provider, which may change
+as additional features are introduced. Check Php/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B php_who.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID of PHP
+.TP
+UID
+User ID of the owner
+.TP
+FUNCS
+Number of function calls
+.TP
+FILE
+Pathname of the PHP program
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+php_who.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pidpersec.d.1m b/Man/man1m/pidpersec.d.1m
new file mode 100644
index 000000000000..4040ae549f26
--- /dev/null
+++ b/Man/man1m/pidpersec.d.1m
@@ -0,0 +1,42 @@
+.TH pidpersec.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+pidpersec.d \- print new PIDs per sec. Uses DTrace.
+.SH SYNOPSIS
+.B pidpersec.d
+.SH DESCRIPTION
+This script prints the number of new processes created per second.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the proc provider.
+.SH EXAMPLES
+.TP
+Print PID statistics per second,
+#
+.B pidpersec.d
+.PP
+.SH FIELDS
+.TP
+TIME
+time, as a string
+.TP
+LASTPID
+last PID created
+.TP
+PID/s
+Number of processes created per second
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+pidpersec.d will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+execsnoop(1M), dtrace(1M)
diff --git a/Man/man1m/pl_calldist.d.1m b/Man/man1m/pl_calldist.d.1m
new file mode 100644
index 000000000000..ad2d1b83d184
--- /dev/null
+++ b/Man/man1m/pl_calldist.d.1m
@@ -0,0 +1,49 @@
+.TH pl_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_calldist.d - measure Perl elapsed times for subroutines.
+.SH SYNOPSIS
+.B pl_calldist.d
+
+.SH DESCRIPTION
+This traces Perl activity from all programs running on the system with
+Perl provider support.
+
+This script prints distribution plots of elapsed time for Perl subroutines.
+Use pl_calltime.d for summary reports.
+
+Filename and subroutine names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_calldist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the Perl program
+.TP
+2
+Type of call (sub)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_calldist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_calltime.d.1m b/Man/man1m/pl_calltime.d.1m
new file mode 100644
index 000000000000..7de6eaf7a7c1
--- /dev/null
+++ b/Man/man1m/pl_calltime.d.1m
@@ -0,0 +1,49 @@
+.TH pl_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_calltime.d - measure Perl elapsed times for subroutines.
+.SH SYNOPSIS
+.B pl_calltime.d
+
+.SH DESCRIPTION
+This traces Perl activity from all programs running on the system with
+Perl provider support.
+
+Filename and subroutine names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_calltime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Perl program
+.TP
+TYPE
+Type of call (sub/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total elapsed time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_calltime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_cpudist.d.1m b/Man/man1m/pl_cpudist.d.1m
new file mode 100644
index 000000000000..6df61f1bb4de
--- /dev/null
+++ b/Man/man1m/pl_cpudist.d.1m
@@ -0,0 +1,49 @@
+.TH pl_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_cpudist.d - measure Perl on-CPU times for subroutines.
+.SH SYNOPSIS
+.B pl_cpudist.d
+
+.SH DESCRIPTION
+This traces Perl activity from all programs running on the system with
+Perl provider support.
+
+This script prints distribution plots of elapsed time for Perl subrotines.
+Use pl_cputime.d for summary reports.
+
+Filename and subroutine names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_cpudist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the Perl program
+.TP
+2
+Type of call (sub)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_cpudist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_cputime.d.1m b/Man/man1m/pl_cputime.d.1m
new file mode 100644
index 000000000000..f8cf75aed423
--- /dev/null
+++ b/Man/man1m/pl_cputime.d.1m
@@ -0,0 +1,49 @@
+.TH pl_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_cputime.d - measure Perl on-CPU times for subroutines.
+.SH SYNOPSIS
+.B pl_cputime.d
+
+.SH DESCRIPTION
+This traces Perl activity from all programs running on the system with
+Perl provider support.
+
+Filename and subroutine names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_cputime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Perl program
+.TP
+TYPE
+Type of call (sub/total)
+.TP
+NAME
+Name of call (subroutine name)
+.TP
+TOTAL
+Total on-CPU time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_cputime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_flow.d.1m b/Man/man1m/pl_flow.d.1m
new file mode 100644
index 000000000000..d66e49363069
--- /dev/null
+++ b/Man/man1m/pl_flow.d.1m
@@ -0,0 +1,60 @@
+.TH pl_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_flow.d - snoop Perl execution showing subroutine flow.
+.SH SYNOPSIS
+.B pl_flow.d
+
+.SH DESCRIPTION
+This traces Perl activity from all Perl programs on the system
+running with Perl provider support.
+
+This watches Perl subroutine entries and returns, and indents child
+subroutine calls.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_flow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this subroutine belongs to
+.TP
+SUB
+Subroutine name
+.SH LEGEND
+.TP
+\->
+subroutine entry
+.TP
+<\-
+subroutine return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_flow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_flowinfo.d.1m b/Man/man1m/pl_flowinfo.d.1m
new file mode 100644
index 000000000000..0bf1384bfdbf
--- /dev/null
+++ b/Man/man1m/pl_flowinfo.d.1m
@@ -0,0 +1,68 @@
+.TH pl_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_flowinfo.d - snoop Perl subroutine flow with info using DTrace.
+.SH SYNOPSIS
+.B pl_flowinfo.d
+
+.SH DESCRIPTION
+This traces activity from all Perl programs on the system that are
+running with Perl provider support.
+
+Filename and subroutine names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_flowinfo.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the Perl program
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (sub)
+.TP
+SUB
+Perl subroutine
+.SH LEGEND
+.TP
+\->
+subroutine entry
+.TP
+<\-
+subroutine return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_flowinfo.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_flowtime.d.1m b/Man/man1m/pl_flowtime.d.1m
new file mode 100644
index 000000000000..59acddf363ed
--- /dev/null
+++ b/Man/man1m/pl_flowtime.d.1m
@@ -0,0 +1,65 @@
+.TH pl_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_flowtime.d - snoop Perl subroutines with flow and delta times.
+.SH SYNOPSIS
+.B pl_flowtime.d
+
+.SH DESCRIPTION
+This traces shell activity from Perl programs on the system that are
+running with Perl provider support.
+
+This watches Perl subroutine entries and returns, and indents child
+subroutine calls.
+
+Filename and subroutine names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_flowtime.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this subroutine belongs to
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+SUB
+Perl subroutine name
+.SH LEGEND
+.TP
+\->
+method entry
+.TP
+<\-
+method return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_flowtime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_malloc.d.1m b/Man/man1m/pl_malloc.d.1m
new file mode 100644
index 000000000000..babee557d35d
--- /dev/null
+++ b/Man/man1m/pl_malloc.d.1m
@@ -0,0 +1,39 @@
+.TH pl_malloc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_malloc.d - Perl libc malloc analysis.
+.SH SYNOPSIS
+.B pl_malloc.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This is an expiremental script to identify who is calling malloc() for
+memory allocation, and to print distribution plots of the requested bytes.
+If a malloc() occured while in a Perl subroutine, then that subroutine is
+identified as responsible; else the caller of malloc() is identified as
+responsible - which will be a function from the Perl engine.
+
+Filename and subroutine names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_malloc.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_malloc.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_subcalls.d.1m b/Man/man1m/pl_subcalls.d.1m
new file mode 100644
index 000000000000..710b39dde66d
--- /dev/null
+++ b/Man/man1m/pl_subcalls.d.1m
@@ -0,0 +1,43 @@
+.TH pl_subcalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_subcalls.d - measure Perl subroutine calls using DTrace.
+.SH SYNOPSIS
+.B pl_subcalls.d
+
+.SH DESCRIPTION
+This traces Perl activity from all running programs on the system
+which support the Perl DTrace provider.
+
+Filename and subroutine names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_subcalls.d
+.PP
+.SH FIELDS
+.TP
+SUB
+Perl subroutine name
+.TP
+CALLS
+Subroutine calls during this sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_subcalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_syscalls.d.1m b/Man/man1m/pl_syscalls.d.1m
new file mode 100644
index 000000000000..bd35e5c685bc
--- /dev/null
+++ b/Man/man1m/pl_syscalls.d.1m
@@ -0,0 +1,49 @@
+.TH pl_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_syscalls.d - count Perl subroutine calls and syscalls using DTrace.
+.SH SYNOPSIS
+.B pl_syscalls.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+Filename and subroutine names are printed if available.
+The filename for syscalls may be printed as "perl", if the program
+was invoked using the form "perl filename" rather than running the
+program with an interpreter line.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_syscalls.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Perl program
+.TP
+TYPE
+Type of call (sub/syscall)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_syscalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_syscolors.d.1m b/Man/man1m/pl_syscolors.d.1m
new file mode 100644
index 000000000000..5c4c4bac1dbe
--- /dev/null
+++ b/Man/man1m/pl_syscolors.d.1m
@@ -0,0 +1,61 @@
+.TH pl_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_syscolors.d - trace Perl subroutine flow plus syscalls, in color.
+.SH SYNOPSIS
+.B pl_syscolors.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This watches Perl subroutine entries and returns, and indents child
+subroutine calls.
+
+Filename and subroutine names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_syscolors.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the Perl program
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (sub/syscall)
+.TP
+NAME
+Perl subroutine or syscall name
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_syscolors.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/pl_who.d.1m b/Man/man1m/pl_who.d.1m
new file mode 100644
index 000000000000..9239a7023849
--- /dev/null
+++ b/Man/man1m/pl_who.d.1m
@@ -0,0 +1,49 @@
+.TH pl_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+pl_who.d - trace Perl subroutine execution by process using DTrace.
+.SH SYNOPSIS
+.B pl_who.d
+
+.SH DESCRIPTION
+This traces Perl activity from all Perl programs on the system that are
+running with Perl provider support.
+
+Filenames are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Perl provider, which may change
+as additional features are introduced. Check Perl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B pl_who.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID of Perl
+.TP
+UID
+User ID of the owner
+.TP
+SUBS
+Number of subroutine calls
+.TP
+FILE
+Pathname of the Perl program
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+pl_who.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/priclass.d.1m b/Man/man1m/priclass.d.1m
new file mode 100644
index 000000000000..d726ac2588f1
--- /dev/null
+++ b/Man/man1m/priclass.d.1m
@@ -0,0 +1,66 @@
+.TH priclass.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+priclass.d \- priority distribution by scheduling class. Uses DTrace.
+.SH SYNOPSIS
+.B priclass.d
+.SH DESCRIPTION
+This is a simple DTrace script that samples at 1000 Hz the current
+thread's scheduling class and priority. A distribution plot is printed.
+
+With priorities, the higher the priority the better chance the thread
+has of being scheduled.
+
+This idea came from the script /usr/demo/dtrace/pri.d, which
+produces similar output for priority changes, not samples.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B priclass.d
+.PP
+.SH FIELDS
+.TP
+value
+process priority
+.TP
+count
+number of samples of at least this priority
+.PP
+.SH SCHEDULING CLASSES
+.TP
+TS
+time sharing
+.TP
+IA
+interactive
+.TP
+RT
+real time
+.TP
+SYS
+system
+.TP
+FSS
+fair share scheduler
+.PP
+.SH BASED ON
+/usr/demo/dtrace/pri.d
+.PP
+.SH DOCUMENTATION
+DTrace Guide "profile Provider" chapter (docs.sun.com)
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+priclass.d will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+pridist.d(1M), dispadmin(1M), dtrace(1M)
+
diff --git a/Man/man1m/pridist.d.1m b/Man/man1m/pridist.d.1m
new file mode 100644
index 000000000000..1e7aba625442
--- /dev/null
+++ b/Man/man1m/pridist.d.1m
@@ -0,0 +1,55 @@
+.TH pridist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+pridist.d \- process priority distribution. Uses DTrace.
+.SH SYNOPSIS
+.B pridist.d
+.SH DESCRIPTION
+This is a simple DTrace script that samples at 1000 Hz which process
+is on the CPUs, and what the priority is. A distribution plot is printed.
+
+With priorities, the higher the priority the better chance the process
+(actually, thread) has of being scheduled.
+
+This idea came from the script /usr/demo/dtrace/profpri.d, which
+produces similar output for one particular PID.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B pridist.d
+.PP
+.SH FIELDS
+.TP
+CMD
+process name
+.TP
+PID
+process ID
+.TP
+value
+process priority
+.TP
+count
+number of samples of at least this priority
+.PP
+.SH BASED ON
+/usr/demo/dtrace/profpri.d
+.PP
+.SH DOCUMENTATION
+DTrace Guide "profile Provider" chapter (docs.sun.com)
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+pridist.d will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+dispadmin(1M), dtrace(1M)
+
diff --git a/Man/man1m/procsystime.1m b/Man/man1m/procsystime.1m
new file mode 100644
index 000000000000..0df87cf78832
--- /dev/null
+++ b/Man/man1m/procsystime.1m
@@ -0,0 +1,108 @@
+.TH procsystime 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+procsystime \- analyse system call times. Uses DTrace.
+.SH SYNOPSIS
+.B procsystime
+[\-acehoT] [ -p PID | -n name | command ]
+.SH DESCRIPTION
+procsystime prints details on system call times for processes,
+both the elapsed times and on-cpu times can be printed.
+
+The elapsed times are interesting, to help identify syscalls
+that take some time to complete (during which the process may
+have slept). CPU time helps us identify syscalls that
+are consuming CPU cycles to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH OPTIONS
+.TP
+\-a
+print all data
+.TP
+\-c
+print syscall counts
+.TP
+\-e
+print elapsed times, ns
+.TP
+\-o
+print CPU times, ns
+.TP
+\-T
+print totals
+.TP
+\-p PID
+examine this PID
+.TP
+\-n name
+examine processes which have this name
+.SH EXAMPLES
+.TP
+Print elapsed times for PID 1871,
+#
+.B procsystime
+\-p 1871
+.PP
+.TP
+Print elapsed times for processes called "tar",
+#
+.B procsystime
+\-n tar
+.PP
+.TP
+Print CPU times for "tar" processes,
+#
+.B procsystime
+\-on tar
+.PP
+.TP
+Print syscall counts for "tar" processes,
+#
+.B procsystime
+\-cn tar
+.PP
+.TP
+Print elapsed and CPU times for "tar" processes,
+#
+.B procsystime
+\-eon tar
+.PP
+.TP
+print all details for "bash" processes,
+#
+.B procsystime
+\-aTn bash
+.PP
+.TP
+run and print details for "df -h",
+#
+.B procsystime
+df \-h
+.PP
+.SH FIELDS
+.TP
+SYSCALL
+System call name
+.TP
+TIME (ns)
+Total time, nanoseconds
+.TP
+COUNT
+Number of occurrences
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+procsystime will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtruss(1M), dtrace(1M), truss(1)
+
diff --git a/Man/man1m/putnexts.d.1m b/Man/man1m/putnexts.d.1m
new file mode 100644
index 000000000000..59335673299d
--- /dev/null
+++ b/Man/man1m/putnexts.d.1m
@@ -0,0 +1,27 @@
+.TH putnexts.d 1m "$Date:: 2007-09-12 #$" "USER COMMANDS"
+.SH NAME
+putnexts.d -
+.SH SYNOPSIS
+.SH DESCRIPTION
+
+.SH OS
+Solaris
+.SH STABILITY
+stable -
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B putnexts.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+putnexts.d will run until Ctrl-C is hit.
+.SH AUTHOR
+
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_calldist.d.1m b/Man/man1m/py_calldist.d.1m
new file mode 100644
index 000000000000..1592af5e8223
--- /dev/null
+++ b/Man/man1m/py_calldist.d.1m
@@ -0,0 +1,49 @@
+.TH py_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_calldist.d - measure Python elapsed times for functions.
+.SH SYNOPSIS
+.B py_calldist.d
+
+.SH DESCRIPTION
+This traces Python activity from all programs running on the system with
+Python provider support.
+
+This script prints distribution plots of elapsed time for Python
+operations. Use py_calltime.d for summary reports.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_calldist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the Python program
+.TP
+2
+Type of call (func)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_calldist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_calltime.d.1m b/Man/man1m/py_calltime.d.1m
new file mode 100644
index 000000000000..e055eb33366f
--- /dev/null
+++ b/Man/man1m/py_calltime.d.1m
@@ -0,0 +1,49 @@
+.TH py_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_calltime.d - measure Python elapsed times for functions.
+.SH SYNOPSIS
+.B py_calltime.d
+
+.SH DESCRIPTION
+This traces Python activity from all programs running on the system with
+Python provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_calltime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Python program
+.TP
+TYPE
+Type of call (func/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total elapsed time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_calltime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_cpudist.d.1m b/Man/man1m/py_cpudist.d.1m
new file mode 100644
index 000000000000..825fc6401288
--- /dev/null
+++ b/Man/man1m/py_cpudist.d.1m
@@ -0,0 +1,49 @@
+.TH py_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_cpudist.d - measure Python on-CPU times for functions.
+.SH SYNOPSIS
+.B py_cpudist.d
+
+.SH DESCRIPTION
+This traces Python activity from all programs running on the system with
+Python provider support.
+
+This script prints distribution plots of elapsed time for Python
+operations. Use py_cputime.d for summary reports.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_cpudist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the Python program
+.TP
+2
+Type of call (func)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_cpudist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_cputime.d.1m b/Man/man1m/py_cputime.d.1m
new file mode 100644
index 000000000000..f926204bb2bc
--- /dev/null
+++ b/Man/man1m/py_cputime.d.1m
@@ -0,0 +1,49 @@
+.TH py_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_cputime.d - measure Python on-CPU times for functions.
+.SH SYNOPSIS
+.B py_cputime.d
+
+.SH DESCRIPTION
+This traces Python activity from all programs running on the system with
+Python provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_cputime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Python program
+.TP
+TYPE
+Type of call (func/total)
+.TP
+NAME
+Name of call (function name)
+.TP
+TOTAL
+Total on-CPU time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_cputime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_flow.d.1m b/Man/man1m/py_flow.d.1m
new file mode 100644
index 000000000000..3659e0f63706
--- /dev/null
+++ b/Man/man1m/py_flow.d.1m
@@ -0,0 +1,60 @@
+.TH py_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_flow.d - snoop Python execution showing function flow.
+.SH SYNOPSIS
+.B py_flow.d
+
+.SH DESCRIPTION
+This traces Python activity from all Python programs on the system
+running with Python provider support.
+
+This watches Python function entries and returns, and indents child
+function calls.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_flow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this function belongs to
+.TP
+FUNC
+Function name
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_flow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_flowinfo.d.1m b/Man/man1m/py_flowinfo.d.1m
new file mode 100644
index 000000000000..4a25d0db2bdb
--- /dev/null
+++ b/Man/man1m/py_flowinfo.d.1m
@@ -0,0 +1,68 @@
+.TH py_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_flowinfo.d - snoop Python function flow with info using DTrace.
+.SH SYNOPSIS
+.B py_flowinfo.d
+
+.SH DESCRIPTION
+This traces activity from all Python programs on the system that are
+running with Python provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_flowinfo.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the Python program
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (func)
+.TP
+FUNC
+Python function
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_flowinfo.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_flowtime.d.1m b/Man/man1m/py_flowtime.d.1m
new file mode 100644
index 000000000000..67882957e5ce
--- /dev/null
+++ b/Man/man1m/py_flowtime.d.1m
@@ -0,0 +1,65 @@
+.TH py_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_flowtime.d - snoop Python functions with flow and delta times.
+.SH SYNOPSIS
+.B py_flowtime.d
+
+.SH DESCRIPTION
+This traces shell activity from Python programs on the system that are
+running with Python provider support.
+
+This watches Python function entries and returns, and indents child
+function calls.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_flowtime.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this function belongs to
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FUNC
+Python function name
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_flowtime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_funccalls.d.1m b/Man/man1m/py_funccalls.d.1m
new file mode 100644
index 000000000000..8a54976199eb
--- /dev/null
+++ b/Man/man1m/py_funccalls.d.1m
@@ -0,0 +1,43 @@
+.TH py_funccalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_funccalls.d - measure Python function calls using DTrace.
+.SH SYNOPSIS
+.B py_funccalls.d
+
+.SH DESCRIPTION
+This traces Python activity from all running programs on the system
+which support the Python DTrace provider.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_funccalls.d
+.PP
+.SH FIELDS
+.TP
+FUNC
+Python function name
+.TP
+CALLS
+Function calls during this sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_funccalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_malloc.d.1m b/Man/man1m/py_malloc.d.1m
new file mode 100644
index 000000000000..4468da8ae2b9
--- /dev/null
+++ b/Man/man1m/py_malloc.d.1m
@@ -0,0 +1,39 @@
+.TH py_malloc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_malloc.d - Python libc malloc analysis.
+.SH SYNOPSIS
+.B py_malloc.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This is an expiremental script to identify who is calling malloc() for
+memory allocation, and to print distribution plots of the requested bytes.
+If a malloc() occured while in a Python function, then that function is
+identified as responsible; else the caller of malloc() is identified as
+responsible - which will be a function from the Python engine.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_malloc.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_malloc.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_mallocstk.d.1m b/Man/man1m/py_mallocstk.d.1m
new file mode 100644
index 000000000000..fac0a1789b54
--- /dev/null
+++ b/Man/man1m/py_mallocstk.d.1m
@@ -0,0 +1,33 @@
+.TH py_mallocstk.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_mallocstk.d - Python libc malloc analysis with full stack traces.
+.SH SYNOPSIS
+.B py_mallocstk.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_mallocstk.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_mallocstk.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_profile.d.1m b/Man/man1m/py_profile.d.1m
new file mode 100644
index 000000000000..282bf48104fc
--- /dev/null
+++ b/Man/man1m/py_profile.d.1m
@@ -0,0 +1,54 @@
+.TH py_profile.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_profile.d - sample stack traces with Python translations using DTrace.
+.SH SYNOPSIS
+.B py_profile.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This samples stack traces for the process specified. This stack trace
+will cross the Python engine and system libraries, and insert
+translations for Python stack frames where appropriate. This is best
+explained with an example stack frame output,
+
+libpython2.4.so.1.0`PyEval_EvalFrame+0x2fbf
+[ ./func_loop.py:5 (func_c) ]
+libpython2.4.so.1.0`fast_function+0xa8
+libpython2.4.so.1.0`call_function+0xda
+libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+[ ./func_loop.py:11 (func_b) ]
+libpython2.4.so.1.0`fast_function+0xa8
+libpython2.4.so.1.0`call_function+0xda
+libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+[ ./func_loop.py:14 (func_a) ]
+libpython2.4.so.1.0`fast_function+0xa8
+libpython2.4.so.1.0`call_function+0xda
+libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+[ ./func_loop.py:16 (?) ]
+
+The lines in square brackets are the native Python frames, the rest
+are the Python engine.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_profile.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_profile.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_syscalls.d.1m b/Man/man1m/py_syscalls.d.1m
new file mode 100644
index 000000000000..cd4712349714
--- /dev/null
+++ b/Man/man1m/py_syscalls.d.1m
@@ -0,0 +1,49 @@
+.TH py_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_syscalls.d - count Python function calls and syscalls using DTrace.
+.SH SYNOPSIS
+.B py_syscalls.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+Filename and function names are printed if available.
+The filename for syscalls may be printed as "python", if the program
+was invoked using the form "python filename" rather than running the
+program with an interpreter line.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_syscalls.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Python program
+.TP
+TYPE
+Type of call (func/syscall)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_syscalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_syscolors.d.1m b/Man/man1m/py_syscolors.d.1m
new file mode 100644
index 000000000000..210fa1b61f73
--- /dev/null
+++ b/Man/man1m/py_syscolors.d.1m
@@ -0,0 +1,61 @@
+.TH py_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_syscolors.d - trace Python function flow plus syscalls, in color.
+.SH SYNOPSIS
+.B py_syscolors.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This watches Python function entries and returns, and indents child
+function calls.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_syscolors.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the Python program
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (func/syscall)
+.TP
+NAME
+Python function or syscall name
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_syscolors.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/py_who.d.1m b/Man/man1m/py_who.d.1m
new file mode 100644
index 000000000000..e88190e6462f
--- /dev/null
+++ b/Man/man1m/py_who.d.1m
@@ -0,0 +1,49 @@
+.TH py_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+py_who.d - trace Python function execution by process using DTrace.
+.SH SYNOPSIS
+.B py_who.d
+
+.SH DESCRIPTION
+This traces Python activity from all Python programs on the system that are
+running with Python provider support.
+
+Filenames are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Python provider, which may change
+as additional features are introduced. Check Python/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B py_who.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID of Python
+.TP
+UID
+User ID of the owner
+.TP
+FUNCS
+Number of function calls
+.TP
+FILE
+Pathname of the Python program
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+py_who.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_calldist.d.1m b/Man/man1m/rb_calldist.d.1m
new file mode 100644
index 000000000000..57a975620198
--- /dev/null
+++ b/Man/man1m/rb_calldist.d.1m
@@ -0,0 +1,49 @@
+.TH rb_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_calldist.d - measure Ruby elapsed times for types of operation.
+.SH SYNOPSIS
+.B rb_calldist.d
+
+.SH DESCRIPTION
+This traces Ruby activity from all programs running on the system with
+Ruby provider support.
+
+This script prints distribution plots of elapsed time for Ruby
+operations. Use rb_calltime.d for summary reports.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_calldist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the Ruby program
+.TP
+2
+Type of call (method/obj-new/gc)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_calldist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_calls.d.1m b/Man/man1m/rb_calls.d.1m
new file mode 100644
index 000000000000..3e328f3ce7cf
--- /dev/null
+++ b/Man/man1m/rb_calls.d.1m
@@ -0,0 +1,49 @@
+.TH rb_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_calls.d - count Ruby calls using DTrace.
+.SH SYNOPSIS
+.B rb_calls.d
+
+.SH DESCRIPTION
+This traces activity from all Ruby programs on the system that are
+running with Ruby provider support.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_calls.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Ruby program
+.TP
+TYPE
+Type of call (method/obj-new/...)
+.TP
+NAME
+Descriptive name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_calls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_calltime.d.1m b/Man/man1m/rb_calltime.d.1m
new file mode 100644
index 000000000000..0787a93aa50d
--- /dev/null
+++ b/Man/man1m/rb_calltime.d.1m
@@ -0,0 +1,49 @@
+.TH rb_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_calltime.d - measure Ruby elapsed times for types of operation.
+.SH SYNOPSIS
+.B rb_calltime.d
+
+.SH DESCRIPTION
+This traces Ruby activity from all programs running on the system with
+Ruby provider support.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_calltime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Ruby program
+.TP
+TYPE
+Type of call (method/obj-new/gc/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total elapsed time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_calltime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_cpudist.d.1m b/Man/man1m/rb_cpudist.d.1m
new file mode 100644
index 000000000000..ff4f283bbf3b
--- /dev/null
+++ b/Man/man1m/rb_cpudist.d.1m
@@ -0,0 +1,49 @@
+.TH rb_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_cpudist.d - measure Ruby on-CPU times for types of operation.
+.SH SYNOPSIS
+.B rb_cpudist.d
+
+.SH DESCRIPTION
+This traces Ruby activity from all programs running on the system with
+Ruby provider support.
+
+This script prints distribution plots of elapsed time for Ruby
+operations. Use rb_cputime.d for summary reports.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_cpudist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the Ruby program
+.TP
+2
+Type of call (method/obj-new/gc)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_cpudist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_cputime.d.1m b/Man/man1m/rb_cputime.d.1m
new file mode 100644
index 000000000000..7e8302b895a4
--- /dev/null
+++ b/Man/man1m/rb_cputime.d.1m
@@ -0,0 +1,49 @@
+.TH rb_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_cputime.d - measure Ruby on-CPU times for types of operation.
+.SH SYNOPSIS
+.B rb_cputime.d
+
+.SH DESCRIPTION
+This traces Ruby activity from all programs running on the system with
+Ruby provider support.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_cputime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Ruby program
+.TP
+TYPE
+Type of call (method/obj-new/gc/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total on-CPU time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_cputime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_flow.d.1m b/Man/man1m/rb_flow.d.1m
new file mode 100644
index 000000000000..fa1f51834cfd
--- /dev/null
+++ b/Man/man1m/rb_flow.d.1m
@@ -0,0 +1,59 @@
+.TH rb_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_flow.d - snoop Ruby execution showing method flow using DTrace.
+.SH SYNOPSIS
+.B rb_flow.d
+
+.SH DESCRIPTION
+This traces activity from all Ruby programs on the system that are
+running with Ruby provider support.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_flow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this method belongs to
+.TP
+CLASS::METHOD
+Ruby classname and method
+.SH LEGEND
+.TP
+\->
+method entry
+.TP
+<\-
+method return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_flow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_flowinfo.d.1m b/Man/man1m/rb_flowinfo.d.1m
new file mode 100644
index 000000000000..08e124fbfa25
--- /dev/null
+++ b/Man/man1m/rb_flowinfo.d.1m
@@ -0,0 +1,68 @@
+.TH rb_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_flowinfo.d - snoop Ruby function (method) flow with info using DTrace.
+.SH SYNOPSIS
+.B rb_flowinfo.d
+
+.SH DESCRIPTION
+This traces activity from all Ruby programs on the system that are
+running with Ruby provider support.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_flowinfo.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the Ruby program
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (method)
+.TP
+NAME
+Ruby class and method name
+.SH LEGEND
+.TP
+\->
+method entry
+.TP
+<\-
+method return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_flowinfo.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_flowtime.d.1m b/Man/man1m/rb_flowtime.d.1m
new file mode 100644
index 000000000000..64425b37f7be
--- /dev/null
+++ b/Man/man1m/rb_flowtime.d.1m
@@ -0,0 +1,62 @@
+.TH rb_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_flowtime.d - snoop Ruby function (method) flow using DTrace.
+.SH SYNOPSIS
+.B rb_flowtime.d
+
+.SH DESCRIPTION
+This traces activity from all Ruby programs on the system that are
+running with Ruby provider support.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_flowtime.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this method belongs to
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+CLASS::METHOD
+Ruby class and method name
+.SH LEGEND
+.TP
+\->
+method entry
+.TP
+<\-
+method return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_flowtime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_funccalls.d.1m b/Man/man1m/rb_funccalls.d.1m
new file mode 100644
index 000000000000..c4fe9fad2516
--- /dev/null
+++ b/Man/man1m/rb_funccalls.d.1m
@@ -0,0 +1,46 @@
+.TH rb_funccalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_funccalls.d - count Ruby function (method) calls using DTrace.
+.SH SYNOPSIS
+.B rb_funccalls.d
+
+.SH DESCRIPTION
+This traces activity from all Ruby programs on the system that are
+running with Ruby provider support.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_funccalls.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Ruby program
+.TP
+METHOD
+Method name
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_funccalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_lines.d.1m b/Man/man1m/rb_lines.d.1m
new file mode 100644
index 000000000000..4bdbabcafb57
--- /dev/null
+++ b/Man/man1m/rb_lines.d.1m
@@ -0,0 +1,46 @@
+.TH rb_lines.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_lines.d - trace Ruby line execution by process using DTrace.
+.SH SYNOPSIS
+.B rb_who.d
+
+.SH DESCRIPTION
+This traces Ruby activity from all Ruby programs on the system that are
+running with Ruby provider support.
+
+Filenames are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_lines.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Ruby program
+.TP
+LINE
+Line number
+.TP
+COUNT
+Number of times a line was executed
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_lines.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_malloc.d.1m b/Man/man1m/rb_malloc.d.1m
new file mode 100644
index 000000000000..d86bc46d14b7
--- /dev/null
+++ b/Man/man1m/rb_malloc.d.1m
@@ -0,0 +1,47 @@
+.TH rb_malloc.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_malloc.d - Ruby operations and libc malloc statistics.
+.SH SYNOPSIS
+.B rb_malloc.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_malloc.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the Ruby program
+.TP
+2
+Type of operation (method/objnew/startup)
+.TP
+3
+Name of operation
+.SH WARNING
+This script is not 100% accurate; This prints libc malloc() byte
+distributions by "recent" Ruby operation, which we hope will be usually
+relevant. This is an experimental script that may be improved over time.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_malloc.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_objcpu.d.1m b/Man/man1m/rb_objcpu.d.1m
new file mode 100644
index 000000000000..6d1d8b1e2928
--- /dev/null
+++ b/Man/man1m/rb_objcpu.d.1m
@@ -0,0 +1,36 @@
+.TH rb_objcpu.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_objcpu.d - measure Ruby object creation on-CPU time using DTrace.
+.SH SYNOPSIS
+.B rb_objcpu.d
+
+.SH DESCRIPTION
+This traces Ruby activity from all programs running on the system with
+Ruby provider support.
+
+Class names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_objcpu.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_objcpu.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_objnew.d.1m b/Man/man1m/rb_objnew.d.1m
new file mode 100644
index 000000000000..e40f493a4998
--- /dev/null
+++ b/Man/man1m/rb_objnew.d.1m
@@ -0,0 +1,46 @@
+.TH rb_objnew.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_objnew.d - count Ruby object creation using DTrace.
+.SH SYNOPSIS
+.B rb_objnew.d
+
+.SH DESCRIPTION
+This traces Ruby activity from all programs running on the system with
+Ruby provider support.
+
+Filename and class names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_objnew.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Ruby program
+.TP
+CLASS
+Class of new object
+.TP
+COUNT
+Number of object creations during tracing
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_objnew.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_stat.d.1m b/Man/man1m/rb_stat.d.1m
new file mode 100644
index 000000000000..070faf42781d
--- /dev/null
+++ b/Man/man1m/rb_stat.d.1m
@@ -0,0 +1,66 @@
+.TH rb_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_stat.d - Ruby operation stats using DTrace.
+.SH SYNOPSIS
+.B rb_stat.d
+[interval [count]]
+.SH DESCRIPTION
+This traces activity from all Ruby programs on the system that are
+running with Ruby provider support.
+
+The numbers are counts for the interval specified. The default interval
+is 1 second.
+
+If you see a count in "EXECS" but not in the other columns, then your
+Ruby software is probably not running with the DTrace Ruby provider.
+See Ruby/Readme.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_stat.d
+.PP
+.SH FIELDS
+.TP
+EXEC/s
+Ruby programs executed per second, including
+those without Ruby provider support
+.TP
+METHOD/s
+Methods called, per second
+.TP
+OBJNEW/s
+Objects created, per second
+.TP
+OBJFRE/s
+Objects freed, per second
+.TP
+RAIS/s
+Raises, per second
+.TP
+RESC/s
+Rescues, per second
+.TP
+GC/s
+Garbage collects, per second
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_stat.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_syscalls.d.1m b/Man/man1m/rb_syscalls.d.1m
new file mode 100644
index 000000000000..9fbe81d3f10b
--- /dev/null
+++ b/Man/man1m/rb_syscalls.d.1m
@@ -0,0 +1,49 @@
+.TH rb_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_syscalls.d - count Ruby calls and syscalls using DTrace.
+.SH SYNOPSIS
+.B rb_syscalls.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+Filename and method names are printed if available.
+The filename for syscalls may be printed as "ruby", if the program
+was invoked using the form "ruby filename" rather than running the
+program with an interpreter line.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_syscalls.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the Ruby program
+.TP
+TYPE
+Type of call (method/syscall)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_syscalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_syscolors.d.1m b/Man/man1m/rb_syscolors.d.1m
new file mode 100644
index 000000000000..bd18be9ea7d3
--- /dev/null
+++ b/Man/man1m/rb_syscolors.d.1m
@@ -0,0 +1,61 @@
+.TH rb_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_syscolors.d - trace Ruby method flow plus syscalls, in color.
+.SH SYNOPSIS
+.B rb_syscolors.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This watches Ruby method entries and returns, and indents child
+function calls.
+
+Filename and method names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_syscolors.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the Ruby program
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (method/line/syscall)
+.TP
+NAME
+Ruby method or syscall name
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_syscolors.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rb_who.d.1m b/Man/man1m/rb_who.d.1m
new file mode 100644
index 000000000000..5dd13d5e7275
--- /dev/null
+++ b/Man/man1m/rb_who.d.1m
@@ -0,0 +1,49 @@
+.TH rb_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+rb_who.d - trace Ruby line execution by process using DTrace.
+.SH SYNOPSIS
+.B rb_who.d
+
+.SH DESCRIPTION
+This traces Ruby activity from all Ruby programs on the system that are
+running with Ruby provider support.
+
+Filenames are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Ruby provider, which may change
+as additional features are introduced. Check Ruby/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rb_who.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID of Ruby
+.TP
+UID
+User ID of the owner
+.TP
+LINES
+Number of times a line was executed
+.TP
+FILE
+Pathname of the Ruby program
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+rb_who.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/readbytes.d.1m b/Man/man1m/readbytes.d.1m
new file mode 100644
index 000000000000..697339d493e1
--- /dev/null
+++ b/Man/man1m/readbytes.d.1m
@@ -0,0 +1,47 @@
+.TH readbytes.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+readbytes.d \- read bytes by process name. Uses DTrace.
+.SH SYNOPSIS
+.B readbytes.d
+.SH DESCRIPTION
+readbytes.d is a DTrace OneLiner to a report of the number of
+bytes read by process name.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B readbytes.d
+.PP
+.SH FIELDS
+.TP
+first field
+This is the process name. There may be several PIDs that have the
+same process name, for example with numerous instances of "bash". The
+value reported will be the sum of them all.
+.TP
+second field
+This is the number of bytes read.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+readbytes.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/readdist.d.1m b/Man/man1m/readdist.d.1m
new file mode 100644
index 000000000000..e11b21c7b0b7
--- /dev/null
+++ b/Man/man1m/readdist.d.1m
@@ -0,0 +1,54 @@
+.TH readdist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+readdist.d \- read distrib. by process name. Uses DTrace.
+.SH SYNOPSIS
+.B readdist.d
+.SH DESCRIPTION
+readdist.d is a DTrace OneLiner to a report the read size and
+number of occurrences as a frequency distribution by process name.
+
+This can be useful to identify the behaviour of processes
+that are doing reads. Are they using many small reads, or
+fewer large reads.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B readdist.d
+.PP
+.SH FIELDS
+.TP
+process name
+The process name. There may be several PIDs that have the
+same process name, for example with numerous instances of "bash". The
+value reported will be the sum of them all.
+.TP
+value
+The size in bytes
+.TP
+count
+The number of occurrences that were at least this size
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+readdist.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/rfileio.d.1m b/Man/man1m/rfileio.d.1m
new file mode 100644
index 000000000000..08c25e9d4de2
--- /dev/null
+++ b/Man/man1m/rfileio.d.1m
@@ -0,0 +1,41 @@
+.TH rfileio.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+rfileio.d \- read file I/O stats, with cache miss rate. Uses DTrace.
+.SH SYNOPSIS
+.B rfileio.d
+.SH DESCRIPTION
+This script provides statistics on the number of reads and the bytes
+read from filesystems (logical), and the number of bytes read from
+disk (physical). A summary is printed every five seconds by file.
+
+A total miss-rate is also provided for the file system cache.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Print a summary of activity every five seconds.
+#
+.B rfileio.d
+.PP
+.SH IDEA
+Richard McDougall, Solaris Internals 2nd Ed, FS Chapter.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+rfileio.d will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+rfsio.d(1M), dtrace(1M)
+
diff --git a/Man/man1m/rfsio.d.1m b/Man/man1m/rfsio.d.1m
new file mode 100644
index 000000000000..ecbb786a84e6
--- /dev/null
+++ b/Man/man1m/rfsio.d.1m
@@ -0,0 +1,41 @@
+.TH rfsio.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+rfsio.d \- read FS I/O stats, with cache miss rate. Uses DTrace.
+.SH SYNOPSIS
+.B rfsio.d
+.SH DESCRIPTION
+This script provides statistics on the number of reads and the bytes
+read from filesystems (logical), and the number of bytes read from
+disk (physical). A summary is printed every five seconds by filesystem.
+
+A total miss-rate is also provided for the file system cache.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Print a summary of activity every five seconds.
+#
+.B rfsio.d
+.PP
+.SH IDEA
+Richard McDougall, Solaris Internals 2nd Ed, FS Chapter.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+rfsio.d will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+rfileio.d(1M), dtrace(1M)
+
diff --git a/Man/man1m/runocc.d.1m b/Man/man1m/runocc.d.1m
new file mode 100644
index 000000000000..0ba529ffcd8e
--- /dev/null
+++ b/Man/man1m/runocc.d.1m
@@ -0,0 +1,46 @@
+.TH runocc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+runocc.d \- run queue occupancy by CPU. Uses DTrace.
+.SH SYNOPSIS
+.B runocc.d
+.SH DESCRIPTION
+This prints the dispatcher run queue occupancy by CPU each second.
+A consistant run queue occupancy is a sign of CPU saturation.
+
+The value is similar to that seen in "sar -q", however this is
+calculated in a more accurate manner - sampling at 1000 Hertz.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable.
+.SH EXAMPLES
+.TP
+Print %runocc by CPU every second,
+#
+.B runocc.d
+.PP
+.SH FIELDS
+.TP
+CPU
+cpu ID
+.TP
+%runocc
+percent run queue occupancy, sampled at 1000 Hertz
+.PP
+.SH SEE ALSO
+Solaris Internals 2nd Ed, vol 2, CPU chapter
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+runocc.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/rwbbypid.d.1m b/Man/man1m/rwbbypid.d.1m
new file mode 100644
index 000000000000..36ab3f24ed0a
--- /dev/null
+++ b/Man/man1m/rwbbypid.d.1m
@@ -0,0 +1,48 @@
+.TH rwbbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+rwbbypid.d \- read/write bytes by PID. Uses DTrace.
+.SH SYNOPSIS
+.B rwbbypid.d
+.SH DESCRIPTION
+This script tracks the bytes read and written at the syscall level
+by processes, printing the totals in a report. This is tracking the
+successful number of bytes read or written.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B rwbbypid.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+DIR
+direction, Read or Write
+.TP
+BYTES
+total bytes
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+rwbbypid.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+rwbypid.d(1M), dtrace(1M)
+
diff --git a/Man/man1m/rwbypid.d.1m b/Man/man1m/rwbypid.d.1m
new file mode 100644
index 000000000000..869eb80e8557
--- /dev/null
+++ b/Man/man1m/rwbypid.d.1m
@@ -0,0 +1,48 @@
+.TH rwbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+rwbypid.d \- read/write calls by PID. Uses DTrace.
+.SH SYNOPSIS
+.B rwbypid.d
+.SH DESCRIPTION
+This script tracks the number of reads and writes at the syscall level
+by processes, printing the totals in a report. This matches reads
+and writes whether they succeed or not.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B rwbypid.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+DIR
+direction, Read or Write
+.TP
+COUNT
+total calls
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+rwbypid.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+rwbbypid.d(1M), dtrace(1M)
+
diff --git a/Man/man1m/rwbytype.d.1m b/Man/man1m/rwbytype.d.1m
new file mode 100644
index 000000000000..85c8194baa9b
--- /dev/null
+++ b/Man/man1m/rwbytype.d.1m
@@ -0,0 +1,54 @@
+.TH rwbytype.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+rwbytype.d \- read/write bytes by vnode type. Uses DTrace.
+.SH SYNOPSIS
+.B rwbytype.d
+.SH DESCRIPTION
+This program identifies the vnode type of read/write activity - whether
+that is for regular files, sockets, character special devices, etc. This
+is measuring at the application level, so file activity may well be
+cached by the system.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B rwbytype.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+VNODE
+vnode type (describes I/O type)
+.TP
+DIR
+direction, Read or Write
+.TP
+BYTES
+total bytes
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+rwbytype.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+rwbypid.d(1M), rwbbypid.d(1M), dtrace(1M)
+
diff --git a/Man/man1m/rwsnoop.1m b/Man/man1m/rwsnoop.1m
new file mode 100644
index 000000000000..d6e544169ce5
--- /dev/null
+++ b/Man/man1m/rwsnoop.1m
@@ -0,0 +1,104 @@
+.TH rwsnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+rwsnoop \- snoop read/write events. Uses DTrace.
+.SH SYNOPSIS
+.B rwsnoop
+[\-jPtvZ] [\-n name] [\-p PID]
+.SH DESCRIPTION
+This is measuring reads and writes at the application level. This
+matches the syscalls read, write, pread and pwrite.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH OPTIONS
+.TP
+\-j
+print project ID
+.TP
+\-P
+print parent process ID
+.TP
+\-t
+print timestamp, us
+.TP
+\-v
+print time, string
+.TP
+\-Z
+print zone ID
+.TP
+\-n name
+process name to track
+.TP
+\-p PID
+PID to track
+.PP
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B rwsnoop
+.TP
+Print zone ID,
+#
+.B rwsnoop
+-\Z
+.TP
+Monitor processes named "bash",
+#
+.B rwsnoop
+\-n bash
+.PP
+.SH FIELDS
+.TP
+TIME
+timestamp, us
+.TP
+TIMESTR
+time, string
+.TP
+ZONE
+zone ID
+.TP
+PROJ
+project ID
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+PPID
+parent process ID
+.TP
+CMD
+command name for the process
+.TP
+D
+direction, Read or Write
+.TP
+BYTES
+total bytes during sample
+.TP
+FILE
+filename, if file based.
+Reads and writes that are not file based, for example with sockets, will
+print "<unknown>" as the filename.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+rwsnoop will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+rwtop(1M), dtrace(1M)
+
diff --git a/Man/man1m/rwtop.1m b/Man/man1m/rwtop.1m
new file mode 100644
index 000000000000..82af043462b0
--- /dev/null
+++ b/Man/man1m/rwtop.1m
@@ -0,0 +1,115 @@
+.TH rwtop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+rwtop \- display top read/write bytes process. Uses DTrace.
+.SH SYNOPSIS
+.B rwtop
+[\-Cc] [\-j|\-Z] [\-n name] [\-p PID]
+[\-t top] [interval [count]]
+.SH DESCRIPTION
+This is measuring reads and writes at the application level.
+This matches read and write system calls.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo provider.
+.SH OPTIONS
+.TP
+\-C
+don't clear the screen
+.TP
+\-c
+print counts
+.TP
+\-j
+print project ID
+.TP
+\-Z
+print zone ID
+.TP
+\-n name
+process name to track
+.TP
+\-p PID
+PID to track
+.TP
+\-t top
+print top number only
+.PP
+.SH EXAMPLES
+.TP
+Default output, print summary every 5 seconds
+#
+.B rwtop
+.PP
+.TP
+One second samples,
+#
+.B rwtop
+1
+.TP
+Print top 10 lines only,
+#
+.B rwtop
+\-t 10
+.TP
+Monitor processes named "bash",
+#
+.B rwtop
+\-n bash
+.TP
+Print 12 x 5 second samples, scrolling,
+#
+.B rwtop
+\-C 5 12
+.PP
+.SH FIELDS
+.TP
+PROJ
+project ID
+.TP
+ZONE
+zone ID
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+PPID
+parent process ID
+.TP
+CMD
+command name for the process
+.TP
+D
+direction, Read or Write
+.TP
+BYTES
+total bytes during sample
+.TP
+load
+1 minute load average
+.TP
+app_r
+total read Kb for sample
+.TP
+app_w
+total write Kb for sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+rwtop will run forever until Ctrl\-C is hit, or the specified
+interval is reached.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+iotop(1M), dtrace(1M)
+
diff --git a/Man/man1m/sampleproc.1m b/Man/man1m/sampleproc.1m
new file mode 100644
index 000000000000..0ae3a2de9009
--- /dev/null
+++ b/Man/man1m/sampleproc.1m
@@ -0,0 +1,55 @@
+.TH sampleproc 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+sampleproc \- sample processes on the CPUs. Uses DTrace.
+.SH SYNOPSIS
+.B sampleproc [hertz]
+.SH DESCRIPTION
+This program samples which process is on each CPU, at a particular
+configurable rate. This can be used as an estimate for which process
+is consuming the most CPU time.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - uses the ncpus_online kernel symbol.
+.SH EXAMPLES
+.TP
+Sample at 100 hertz,
+#
+.B sampleproc
+.TP
+Sample at 400 hertz,
+#
+.B sampleproc
+400
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+COMMAND
+command name
+.TP
+COUNT
+number of samples
+.TP
+PERCENT
+percent of CPU usage
+.PP
+.SH BASED ON
+/usr/demo/dtrace/prof.d
+.PP
+.SH DOCUMENTATION
+DTrace Guide "profile Provider" chapter (docs.sun.com)
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+sampleproc will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/sar-c.d.1m b/Man/man1m/sar-c.d.1m
new file mode 100644
index 000000000000..10192fb48753
--- /dev/null
+++ b/Man/man1m/sar-c.d.1m
@@ -0,0 +1,62 @@
+.TH sar\-c.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+sar\-c.d \- sar \-c demo in DTrace. Uses DTrace.
+.SH SYNOPSIS
+.B sar\-c.d
+.SH DESCRIPTION
+This has been written to demonstrate fetching the same data as sar \-c
+from DTrace. This program is intended as a starting point for other
+DTrace scripts, by beginning with familiar statistics.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall and sysinfo providers.
+.SH EXAMPLES
+.TP
+Print system call counts every second,
+#
+.B sar\-c.d
+.PP
+.SH FIELDS
+.TP
+scall/s
+System calls
+.TP
+sread/s
+reads
+.TP
+swrit/s
+writes
+.TP
+fork/s
+forks
+.TP
+exec/s
+execs
+.TP
+rchar/s
+read characters
+.TP
+wchar/s
+write characters
+.PP
+.SH IDEA
+David Rubio, who also wrote the original.
+.PP
+.SH NOTES
+As this program does not use Kstat, there is no summary since boot line.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+sar\-c.d will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+sar(1M), dtrace(1M)
diff --git a/Man/man1m/seeksize.d.1m b/Man/man1m/seeksize.d.1m
new file mode 100644
index 000000000000..f15743d1e197
--- /dev/null
+++ b/Man/man1m/seeksize.d.1m
@@ -0,0 +1,51 @@
+.TH seeksize.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+seeksize.d \- print disk event seek report. Uses DTrace.
+.SH SYNOPSIS
+.B seeksize.d
+.SH DESCRIPTION
+seeksize.d is a simple DTrace program to print a report of disk
+event seeks by process.
+
+This can be used to identify whether processes are accessing the
+disks in a "random" or "sequential" manner. Sequential is often
+desirable, indicated by mostly zero length seeks.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the io provider.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B seeksize.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+command and argument list
+.TP
+value
+distance in disk blocks (sectors)
+.TP
+count
+number of I/O operations
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+seeksize.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+iosnoop(1M), bitesize.d(1M), dtrace(1M)
+
diff --git a/Man/man1m/setuids.d.1m b/Man/man1m/setuids.d.1m
new file mode 100644
index 000000000000..50d131cf551d
--- /dev/null
+++ b/Man/man1m/setuids.d.1m
@@ -0,0 +1,53 @@
+.TH setuids.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+setuids.d \- snoop setuid calls as they occur. Uses DTrace.
+.SH SYNOPSIS
+.B setuids.d
+.SH DESCRIPTION
+setuids.d is a simple DTrace program to print details of setuid
+calls, where a process assumes a different UID. These are usually
+related to login events.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+Default output, print setuids as they occur,
+#
+.B setuids.d
+.PP
+.SH FIELDS
+.TP
+UID
+user ID (from)
+.TP
+SUID
+set user ID (to)
+.TP
+PPID
+parent process ID
+.TP
+PID
+process ID
+.TP
+PCMD
+parent command
+.TP
+CMD
+command (with arguments)
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+setuids.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), bsmconv(1M)
+
diff --git a/Man/man1m/sh_calldist.d.1m b/Man/man1m/sh_calldist.d.1m
new file mode 100644
index 000000000000..760e699c0e49
--- /dev/null
+++ b/Man/man1m/sh_calldist.d.1m
@@ -0,0 +1,49 @@
+.TH sh_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_calldist.d - measure Bourne shell elapsed times for types of operation.
+.SH SYNOPSIS
+.B sh_calldist.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+This script prints distribution plots of elapsed time for shell
+operations. Use sh_calltime.d for summary reports.
+
+Filename and call names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_calldist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the shell or shellscript
+.TP
+2
+Type of call (func/builtin/cmd)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_calldist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_calls.d.1m b/Man/man1m/sh_calls.d.1m
new file mode 100644
index 000000000000..0afeaab6883f
--- /dev/null
+++ b/Man/man1m/sh_calls.d.1m
@@ -0,0 +1,49 @@
+.TH sh_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_calls.d - count Bourne calls (func/builtin/cmd/subsh) using DTrace.
+.SH SYNOPSIS
+.B sh_calls.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_calls.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the shell or shellscript
+.TP
+TYPE
+Type of call (func/builtin/cmd/subsh)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_calls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_calltime.d.1m b/Man/man1m/sh_calltime.d.1m
new file mode 100644
index 000000000000..6863d870a332
--- /dev/null
+++ b/Man/man1m/sh_calltime.d.1m
@@ -0,0 +1,49 @@
+.TH sh_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_calltime.d - measure Bourne shell elapsed times for types of operation.
+.SH SYNOPSIS
+.B sh_calltime.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+Filename and call names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_calltime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the shell or shellscript
+.TP
+TYPE
+Type of call (func/builtin/cmd/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total elapsed time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_calltime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_cpudist.d.1m b/Man/man1m/sh_cpudist.d.1m
new file mode 100644
index 000000000000..998e6ee8a422
--- /dev/null
+++ b/Man/man1m/sh_cpudist.d.1m
@@ -0,0 +1,49 @@
+.TH sh_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_cpudist.d - measure Bourne shell on-CPU times for types of operation.
+.SH SYNOPSIS
+.B sh_cpudist.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+This script prints distribution plots of on-CPU time for shell
+operations. Use sh_cputime.d for summary reports.
+
+Filename and call names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_cpudist.d
+.PP
+.SH FIELDS
+.TP
+1
+Filename of the shell or shellscript
+.TP
+2
+Type of call (func/builtin/cmd)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_cpudist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_cputime.d.1m b/Man/man1m/sh_cputime.d.1m
new file mode 100644
index 000000000000..3c98f94e213a
--- /dev/null
+++ b/Man/man1m/sh_cputime.d.1m
@@ -0,0 +1,49 @@
+.TH sh_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_cputime.d - measure Bourne shell on-CPU times for types of operation.
+.SH SYNOPSIS
+.B sh_cputime.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+Filename and call names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_cputime.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the shell or shellscript
+.TP
+TYPE
+Type of call (func/builtin/cmd/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total on-CPU time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_cputime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_flow.d.1m b/Man/man1m/sh_flow.d.1m
new file mode 100644
index 000000000000..42dc5cc4206b
--- /dev/null
+++ b/Man/man1m/sh_flow.d.1m
@@ -0,0 +1,66 @@
+.TH sh_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_flow.d - snoop Bourne shell execution showing function flow using DTrace.
+.SH SYNOPSIS
+.B sh_flow.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+This watches shell function entries and returns, and indents child
+function calls. Shell builtins are also printed.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_flow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this function belongs to
+.TP
+NAME
+Shell function, builtin or command name
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.TP
+>
+builtin
+.TP
+|
+external command
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_flow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_flowinfo.d.1m b/Man/man1m/sh_flowinfo.d.1m
new file mode 100644
index 000000000000..6fa150078214
--- /dev/null
+++ b/Man/man1m/sh_flowinfo.d.1m
@@ -0,0 +1,62 @@
+.TH sh_flowinfo.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_flowinfo.d - snoop Bourne shell flow with additional info.
+.SH SYNOPSIS
+.B sh_flowinfo.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+This watches shell function entries and returns, and indents child
+function calls. Shell builtins and external commands are also printed.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_flowinfo.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the shell script
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (func/builtin/cmd/subsh)
+.TP
+NAME
+Shell function, builtin or command name
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_flowinfo.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_flowtime.d.1m b/Man/man1m/sh_flowtime.d.1m
new file mode 100644
index 000000000000..87906b6afebc
--- /dev/null
+++ b/Man/man1m/sh_flowtime.d.1m
@@ -0,0 +1,76 @@
+.TH sh_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_flowtime.d - snoop Bourne shell execution with flow and delta times.
+.SH SYNOPSIS
+.B sh_flowtime.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+This watches shell function entries and returns, and indents child
+function calls. Shell builtins are also printed.
+
+DELTAs:
+-> previous line to the start of this function
+<- previous line to the end of this function
+> previous line to the end of this builtin
+| previous line to the end of this command
+
+See sh_flowinfo.d for more verbose and more straightforward delta times.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_flowtime.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+FILE
+Filename that this function belongs to
+.TP
+NAME
+Shell function or builtin name
+.SH LEGEND
+.TP
+\->
+function entry
+.TP
+<\-
+function return
+.TP
+>
+builtin
+.TP
+|
+external command
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_flowtime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_lines.d.1m b/Man/man1m/sh_lines.d.1m
new file mode 100644
index 000000000000..e3d85081ddf2
--- /dev/null
+++ b/Man/man1m/sh_lines.d.1m
@@ -0,0 +1,46 @@
+.TH sh_lines.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_lines.d - trace Bourne shell line execution using DTrace.
+.SH SYNOPSIS
+.B sh_lines.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+Filenames are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_lines.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the shell or shellscript
+.TP
+LINE
+Line number
+.TP
+COUNT
+Number of times a line was executed
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_lines.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_pidcolors.d.1m b/Man/man1m/sh_pidcolors.d.1m
new file mode 100644
index 000000000000..3f6380ac041f
--- /dev/null
+++ b/Man/man1m/sh_pidcolors.d.1m
@@ -0,0 +1,70 @@
+.TH sh_pidcolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_pidcolors.d - Demonstration of deeper DTrace Bourne shell analysis.
+.SH SYNOPSIS
+.B sh_pidcolors.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This extends sh_syscolors.d by including some "pid" provider tracing
+as a starting point for deeper analysis. Currently it adds the probes,
+
+pid$target:a.out:e*:entry,
+pid$target:a.out:e*:return
+
+which means, all functions from the /usr/bin/sh binary that begin with
+the letter "e". This adds about 34 probes. Customise it to whichever
+parts of /usr/bin/sh or the system libraries you are interested in.
+
+The filename for syscalls may be printed as the shell name, if the
+script was invoked using the form "shell filename" rather than running
+the script with an interpreter line.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_pidcolors.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the shell script
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (func/builtin/cmd/line/shell)
+.TP
+NAME
+Shell function, builtin or command name
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_pidcolors.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_stat.d.1m b/Man/man1m/sh_stat.d.1m
new file mode 100644
index 000000000000..40624f949555
--- /dev/null
+++ b/Man/man1m/sh_stat.d.1m
@@ -0,0 +1,59 @@
+.TH sh_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_stat.d - Bourne shell operation stats using DTrace.
+.SH SYNOPSIS
+.B sh_stat.d
+[interval [count]]
+.SH DESCRIPTION
+This traces activity from all sh processes on the system that are running
+with sh provider support.
+
+The numbers are counts for the interval specified. The default interval
+is 1 second.
+
+If you see a count in "EXECS" but not in the other columns, then sh
+scripts may be running without the DTrace sh provider. See Shell/Readme.
+
+Filename and function names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_stat.d
+.PP
+.SH FIELDS
+.TP
+EXEC/s
+Bourne shells executed per second, including
+those without sh provider support
+.TP
+FUNC/s
+Functions called, per second
+.TP
+BLTIN/s
+Builtins called, per second
+.TP
+SUB-SH/s
+Sub-shells called, per second
+.TP
+CMD/s
+External commands called, per second
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_stat.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_syscalls.d.1m b/Man/man1m/sh_syscalls.d.1m
new file mode 100644
index 000000000000..67d74a3ff424
--- /dev/null
+++ b/Man/man1m/sh_syscalls.d.1m
@@ -0,0 +1,49 @@
+.TH sh_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_syscalls.d - count Bourne calls and syscalls using DTrace.
+.SH SYNOPSIS
+.B sh_syscalls.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+Filename and function names are printed if available.
+The filename for syscalls may be printed as the shell name, if the
+script was invoked using the form "shell filename" rather than running
+the script with an interpreter line.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_syscalls.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the shell or shellscript
+.TP
+TYPE
+Type of call (func/builtin/cmd/syscall)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_syscalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_syscolors.d.1m b/Man/man1m/sh_syscolors.d.1m
new file mode 100644
index 000000000000..bfd1de5e8630
--- /dev/null
+++ b/Man/man1m/sh_syscolors.d.1m
@@ -0,0 +1,63 @@
+.TH sh_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_syscolors.d - trace Bourne shell flow plus syscalls, in color.
+.SH SYNOPSIS
+.B sh_syscolors.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This watches shell function entries and returns, and indents child
+function calls. Shell builtins, commands and lines are also printed.
+
+The filename for syscalls may be printed as the shell name, if the
+script was invoked using the form "shell filename" rather than running
+the script with an interpreter line.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_syscolors.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+FILE
+Filename of the shell script
+.TP
+LINE
+Line number of filename
+.TP
+TYPE
+Type of call (func/builtin/cmd/line/shell)
+.TP
+NAME
+Shell function, builtin or command name
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_syscolors.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_wasted.d.1m b/Man/man1m/sh_wasted.d.1m
new file mode 100644
index 000000000000..1b983891b049
--- /dev/null
+++ b/Man/man1m/sh_wasted.d.1m
@@ -0,0 +1,49 @@
+.TH sh_wasted.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_wasted.d - measure Bourne shell elapsed times for "wasted" commands.
+.SH SYNOPSIS
+.B sh_wasted.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This script measures "wasted" commands - those which are called externally
+but are in fact builtins to the shell. Ever seen a script which calls
+/usr/bin/echo needlessly? This script measures that cost.
+
+Filename and call names are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_wasted.d
+.PP
+.SH FIELDS
+.TP
+FILE
+Filename of the shell or shellscript
+.TP
+NAME
+Name of call
+.TP
+TIME
+Total elapsed time for calls (us)
+.SH IDEA
+Mike Shapiro
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_wasted.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/sh_who.d.1m b/Man/man1m/sh_who.d.1m
new file mode 100644
index 000000000000..f98bef83b221
--- /dev/null
+++ b/Man/man1m/sh_who.d.1m
@@ -0,0 +1,49 @@
+.TH sh_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+sh_who.d - trace Bourne shell line execution by process using DTrace.
+.SH SYNOPSIS
+.B sh_who.d
+
+.SH DESCRIPTION
+This traces shell activity from all Bourne shells on the system that are
+running with sh provider support.
+
+Filenames are printed if available.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Shell provider, which may change
+as additional features are introduced. Check Shell/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B sh_who.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID of the shell
+.TP
+UID
+User ID of the owner
+.TP
+LINES
+Number of times a line was executed
+.TP
+FILE
+Pathname of the shell or shellscript
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+sh_who.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/shellsnoop.1m b/Man/man1m/shellsnoop.1m
new file mode 100644
index 000000000000..a533ab0e1c1f
--- /dev/null
+++ b/Man/man1m/shellsnoop.1m
@@ -0,0 +1,99 @@
+.TH shellsnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+shellsnoop \- snoop live shell activity. Uses DTrace.
+.SH SYNOPSIS
+.B shellsnoop
+[\-hqsv] [\-p PID] [\-u UID]
+.SH DESCRIPTION
+A program to print read/write details from shells,
+such as keystrokes and command outputs.
+
+This program sounds somewhat dangerous (snooping keystrokes), but is
+no more so than /usr/bin/truss, and both need root or dtrace privileges to
+run. In fact, less dangerous, as we only print visible text (not password
+text, for example). Having said that, it goes without saying that this
+program shouldn't be used for breeching privacy of other users.
+
+This was written as a tool to demonstrate the capabilities of DTrace.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - this script uses the syscall provider.
+.SH OPTIONS
+.TP
+\-q
+quiet, only print data
+.TP
+\-s
+include start time, us
+.TP
+\-v
+include start time, string
+.TP
+\-p PID
+PID to snoop
+.TP
+\-u UID
+user ID to snoop
+.PP
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B shellsnoop
+.TP
+human readable timestamps,
+#
+.B shellsnoop
+\-v
+.TP
+watch this PID only,
+#
+.B shellsnoop
+\-p 1892
+.TP
+watch this PID data only,
+#
+.B shellsnoop
+\-qp 1892
+.PP
+.SH FIELDS
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+PPID
+parent process ID
+.TP
+COMM
+command name
+.TP
+DIR
+direction (R read, W write)
+.TP
+TEXT
+text contained in the read/write
+.TP
+TIME
+timestamp for the command, us
+.TP
+STRTIME
+timestamp for the command, string
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+shellsnoop will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/shortlived.d.1m b/Man/man1m/shortlived.d.1m
new file mode 100644
index 000000000000..cb4950726f86
--- /dev/null
+++ b/Man/man1m/shortlived.d.1m
@@ -0,0 +1,37 @@
+.TH shortlived.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+shortlived.d \- check short lived process time. Uses DTrace.
+.SH SYNOPSIS
+.B shortlived.d
+.SH DESCRIPTION
+shortlived.d is a DTrace program to measure the time consumed by
+short lived processes.
+
+Many short lived processes can be a burden on the system, and may be
+the cause of performance problems. This program can help identify
+that case.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall and proc providers.
+.SH EXAMPLES
+.TP
+This prints a report after Ctrl\-C has been hit,
+#
+.B shortlived.d
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+shortlived.d will run until Ctrl\-C is hit to end the sample.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/sigdist.d.1m b/Man/man1m/sigdist.d.1m
new file mode 100644
index 000000000000..f9f02fee9a43
--- /dev/null
+++ b/Man/man1m/sigdist.d.1m
@@ -0,0 +1,50 @@
+.TH sigdist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+sigdist.d \- signal distribution by process. Uses DTrace.
+.SH SYNOPSIS
+.B sigdist.d
+.SH DESCRIPTION
+This is a simple DTrace script that prints the number of signals
+recieved by process and signal number. This script is also available
+as /usr/demo/dtrace/sig.d, where it originates.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the proc provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B sigdist.d
+.PP
+.SH FIELDS
+.TP
+SENDER
+process name of sender
+.TP
+RECIPIENT
+process name of target
+.TP
+SIG
+signal number, see signal(3head)
+.TP
+COUNT
+number of signals sent
+.PP
+.SH BASED ON
+/usr/demo/dtrace/sig.d
+.PP
+.SH DOCUMENTATION
+DTrace Guide "proc Provider" chapter (docs.sun.com)
+
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+sigdist.d will sample until Ctrl\-C is hit.
+.SH SEE ALSO
+kill.d(1M), dtrace(1M)
+
diff --git a/Man/man1m/stacksize.d.1m b/Man/man1m/stacksize.d.1m
new file mode 100644
index 000000000000..5b5a916ed397
--- /dev/null
+++ b/Man/man1m/stacksize.d.1m
@@ -0,0 +1,42 @@
+.TH stacksize.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+stacksize.d \- measure stack size for running threads. Uses DTrace.
+.SH SYNOPSIS
+.B stacksize.d
+.SH DESCRIPTION
+This samples the user stack size by process name, and prints a
+distribution plot so that the average stack size can be easily
+identified.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sched provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B stacksize.d
+.PP
+.SH FIELDS
+.TP
+value
+size of the user stack
+.TP
+count
+number of samples at this size
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+stacksize.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Jonathan Adams
+.SH SEE ALSO
+pmap(1), dtrace(1M)
+
diff --git a/Man/man1m/statsnoop.1m b/Man/man1m/statsnoop.1m
new file mode 100644
index 000000000000..9a1011dac67a
--- /dev/null
+++ b/Man/man1m/statsnoop.1m
@@ -0,0 +1,140 @@
+.TH statsnoop 1m "$Date:: 2007-09-23 #$" "USER COMMANDS"
+.SH NAME
+statsnoop \- snoop file stats as they occur. Uses DTrace.
+.SH SYNOPSIS
+.B statsnoop
+[\-a|\-A|\-ceghsvxZ] [\-f pathname] [\-n name] [\-p PID]
+.SH DESCRIPTION
+statsnoop traces the stat variety of syscalls.
+As a process issues a file stat, details
+such as UID, PID and pathname are printed out.
+
+The returned file descriptor is printed,
+a value of -1 indicates an error. This can be useful
+for troubleshooting to determine if appliacions are attempting to
+stat files that do not exist.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH OPTIONS
+.TP
+\-a
+print all data
+.TP
+\-A
+dump all data, space delimited
+.TP
+\-c
+print current working directory of process
+.TP
+\-e
+print errno value
+.TP
+\-g
+print full command arguments
+.TP
+\-s
+print start time, us
+.TP
+\-v
+print start time, string
+.TP
+\-x
+only print failed stats
+.TP
+\-Z
+print zonename
+.TP
+\-f pathname
+file pathname to snoop
+.TP
+\-n name
+process name to snoop
+.TP
+\-p PID
+process ID to snoop
+.PP
+.SH EXAMPLES
+.TP
+Default output, print file stats by process as they occur,
+#
+.B statsnoop
+.PP
+.TP
+Print human readable timestamps,
+#
+.B statsnoop
+\-v
+.PP
+.TP
+See error codes,
+#
+.B statsnoop
+\-e
+.PP
+.TP
+Snoop this file only,
+#
+.B statsnoop
+\-f /etc/passwd
+.PP
+.SH FIELDS
+.TP
+ZONE
+Zone name
+.TP
+UID
+User ID
+.TP
+PID
+Process ID
+.TP
+PPID
+Parent Process ID
+.TP
+FD
+File Descriptor (-1 is error)
+.TP
+ERR
+errno value (see /usr/include/sys/errno.h)
+.TP
+CWD
+current working directory of process
+.TP
+PATH
+pathname for file stat
+.TP
+COMM
+command name for the process
+.TP
+ARGS
+argument listing for the process
+.TP
+TIME
+timestamp for the stat event, us
+.TP
+STRTIME
+timestamp for the stat event, string
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+statsnoop will run forever until Ctrl\-C is hit.
+.SH BUGS
+occasionally the pathname for the file stat cannot be read
+and the following error will be seen,
+
+dtrace: error on enabled probe ID 6 (...): invalid address
+
+this is normal behaviour.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/swapinfo.d.1m b/Man/man1m/swapinfo.d.1m
new file mode 100644
index 000000000000..322d29d1608d
--- /dev/null
+++ b/Man/man1m/swapinfo.d.1m
@@ -0,0 +1,88 @@
+.TH swapinfo.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+swapinfo.d \- print virtual memory info. Uses DTrace.
+.SH SYNOPSIS
+.B swapinfo.d
+.SH DESCRIPTION
+Prints swap usage details for RAM and disk based swap.
+
+This script is UNDER CONSTRUCTION, check for newer versions.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - uses various kernel symbols.
+.SH FIELDS
+.TP
+RAM Total
+Total RAM installed
+.TP
+RAM Unusable
+RAM consumed by the OBP and TSBs
+.TP
+RAM Kernel
+Kernel resident in RAM (and usually locked)
+.TP
+RAM Locked
+Locked memory pages from swap (Anon)
+.TP
+RAM Used
+anon + exec + file pages used
+.TP
+RAM Free
+free memory + page cache free
+.TP
+Disk Total
+Total disk swap configured
+.TP
+Disk Resv
+Disk swap allocated + reserved
+.TP
+Disk Avail
+Disk swap available for reservation
+.TP
+Swap Total
+Total Virtual Memory usable
+.TP
+Swap Resv
+VM allocated + reserved
+.TP
+Swap Avail
+VM available for reservation
+.TP
+Swap MinFree
+VM kept free from reservations
+.PP
+.SH EXAMPLES
+.TP
+Print info,
+#
+.B swapinfo.d
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH ADDITIONAL RESOURCES
+swapstat - K9Toolkit
+
+vmstat 1 2; swap -s; echo ::memstat | mdb -k
+
+RMCmem - The MemTool Package
+
+RICHPse - The SE Toolkit
+
+"Clearing up swap space confusion" Unix Insider, Adrian Cockcroft
+
+"Solaris Internals", Jim Mauro, Richard McDougall
+
+/usr/include/vm/anon.h, /usr/include/sys/systm.h
+
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/sysbypid.d.1m b/Man/man1m/sysbypid.d.1m
new file mode 100644
index 000000000000..b956f1243db3
--- /dev/null
+++ b/Man/man1m/sysbypid.d.1m
@@ -0,0 +1,50 @@
+.TH sysbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+sysbypid.d \- system stats by PID. Uses DTrace.
+.SH SYNOPSIS
+.B sysbypid.d
+.SH DESCRIPTION
+sysbypid.d is a simple DTrace program to print System
+statistics by process.
+
+The system statistics are documented in the cpu_sysinfo struct
+in the /usr/include/sys/sysinfo.h file; and also in the sysinfo provider
+chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo provider.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B sysbypid.d
+.PP
+.SH FIELDS
+.TP
+EXEC
+process name
+.TP
+PID
+process ID
+.TP
+VM
+Virtual Memory statistic
+.TP
+VALUE
+Value by which statistic was incremented
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+sysbypid.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), vmstat(1M)
+
diff --git a/Man/man1m/syscallbypid.d.1m b/Man/man1m/syscallbypid.d.1m
new file mode 100644
index 000000000000..e799dba9ebfe
--- /dev/null
+++ b/Man/man1m/syscallbypid.d.1m
@@ -0,0 +1,50 @@
+.TH syscallbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+syscallbypid.d \- syscalls by process ID. Uses DTrace.
+.SH SYNOPSIS
+.B syscallbypid.d
+.SH DESCRIPTION
+This reports the number of each type of system call made by PID.
+This is useful to identify which process is causing the most
+system calls.
+
+This is based on a script from DExplorer.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B syscallbypid.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+SYSCALL
+system call name
+.TP
+COUNT
+number of system calls made in this sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+syscallbypid.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+procsystime(1M), dtrace(1M), truss(1)
+
diff --git a/Man/man1m/syscallbyproc.d.1m b/Man/man1m/syscallbyproc.d.1m
new file mode 100644
index 000000000000..bb3234824826
--- /dev/null
+++ b/Man/man1m/syscallbyproc.d.1m
@@ -0,0 +1,50 @@
+.TH syscallbyproc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+syscallbyproc.d \- syscalls by process name. Uses DTrace.
+.SH SYNOPSIS
+.B syscallbyproc.d
+.SH DESCRIPTION
+syscallbyproc.d is a DTrace OneLiner to a report of the number of
+system calls made by process name.
+
+This is useful to identify which process is causing the most
+system calls.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Any
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B syscallbyproc.d
+.PP
+.SH FIELDS
+.TP
+first field
+This is the process name. There may be several PIDs that have the
+same process name, for example with numerous instances of "bash". The
+value reported will be the sum of them all.
+.TP
+second field
+This is the count, the number of system calls made.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+syscallbyproc.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+procsystime(1M), dtrace(1M), truss(1)
+
diff --git a/Man/man1m/syscallbysysc.d.1m b/Man/man1m/syscallbysysc.d.1m
new file mode 100644
index 000000000000..c8f34f2d047c
--- /dev/null
+++ b/Man/man1m/syscallbysysc.d.1m
@@ -0,0 +1,47 @@
+.TH syscallbysysc.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+syscallbysysc.d \- syscalls by syscall. Uses DTrace.
+.SH SYNOPSIS
+.B syscallbysysc.d
+.SH DESCRIPTION
+syscallbysysc.d is a DTrace OneLiner to a report of the number of
+each type of system call made.
+
+This is useful to identify which system call is the most common.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Any
+.SH STABILITY
+stable - needs the syscall provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B syscallbysysc.d
+.PP
+.SH FIELDS
+.TP
+first field
+This is the system call type. Most have man pages in section 2.
+.TP
+second field
+This is the count, the number of occurrances for this system call.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+syscallbysysc.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+procsystime(1M), dtrace(1M), truss(1)
+
diff --git a/Man/man1m/tcl_calldist.d.1m b/Man/man1m/tcl_calldist.d.1m
new file mode 100644
index 000000000000..351a3f431eee
--- /dev/null
+++ b/Man/man1m/tcl_calldist.d.1m
@@ -0,0 +1,47 @@
+.TH tcl_calldist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_calldist.d - measure Tcl elapsed time for different types of operation.
+.SH SYNOPSIS
+.B tcl_calldist.d
+[top]
+eg,
+tcl_calldist.d # default, truncate to 10 lines
+tcl_calldist.d 25 # truncate each report section to 25 lines
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_calldist.d
+.PP
+.SH FIELDS
+.TP
+1
+Process ID
+.TP
+2
+Type of call (proc/cmd/total)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_calldist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_calls.d.1m b/Man/man1m/tcl_calls.d.1m
new file mode 100644
index 000000000000..df65cde58745
--- /dev/null
+++ b/Man/man1m/tcl_calls.d.1m
@@ -0,0 +1,68 @@
+.TH tcl_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_calls.d - count Tcl calls (proc/cmd) using DTrace.
+.SH SYNOPSIS
+.B tcl_calls.d
+
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+
+TYPEs:
+proc procedure
+cmd command
+
+PORTIONS: Copyright (c) 2007 Brendan Gregg.
+
+CDDL HEADER START
+
+The contents of this file are subject to the terms of the
+Common Development and Distribution License, Version 1.0 only
+(the "License"). You may not use this file except in compliance
+with the License.
+
+You can obtain a copy of the license at Docs/cddl1.txt
+or http://www.opensolaris.org/os/licensing.
+See the License for the specific language governing permissions
+and limitations under the License.
+
+CDDL HEADER END
+
+09-Sep-2007 Brendan Gregg Created this.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_calls.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+TYPE
+Type of call (see below)
+.TP
+NAME
+Name of proc or cmd call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_calls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_calltime.d.1m b/Man/man1m/tcl_calltime.d.1m
new file mode 100644
index 000000000000..14074af76cbd
--- /dev/null
+++ b/Man/man1m/tcl_calltime.d.1m
@@ -0,0 +1,50 @@
+.TH tcl_calltime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_calltime.d - measure Tcl elapsed times for different types of operation.
+.SH SYNOPSIS
+.B tcl_calltime.d
+[top]
+eg,
+tcl_calltime.d # default, truncate to 10 lines
+tcl_calltime.d 25 # truncate each report section to 25 lines
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_calltime.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+TYPE
+Type of call (proc/cmd/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total elapsed time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_calltime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_cpudist.d.1m b/Man/man1m/tcl_cpudist.d.1m
new file mode 100644
index 000000000000..7ae55d865885
--- /dev/null
+++ b/Man/man1m/tcl_cpudist.d.1m
@@ -0,0 +1,47 @@
+.TH tcl_cpudist.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_cpudist.d - measure Tcl on-CPU time for different types of operation.
+.SH SYNOPSIS
+.B tcl_cpudist.d
+[top]
+eg,
+tcl_cpudist.d # default, truncate to 10 lines
+tcl_cpudist.d 25 # truncate each report section to 25 lines
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_cpudist.d
+.PP
+.SH FIELDS
+.TP
+1
+Process ID
+.TP
+2
+Type of call (proc/cmd/total)
+.TP
+3
+Name of call
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_cpudist.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_cputime.d.1m b/Man/man1m/tcl_cputime.d.1m
new file mode 100644
index 000000000000..efbac89f7822
--- /dev/null
+++ b/Man/man1m/tcl_cputime.d.1m
@@ -0,0 +1,50 @@
+.TH tcl_cputime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_cputime.d - measure Tcl on-CPU times for different types of operation.
+.SH SYNOPSIS
+.B tcl_cputime.d
+[top]
+eg,
+tcl_cputime.d # default, truncate to 10 lines
+tcl_cputime.d 25 # truncate each report section to 25 lines
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_cputime.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+TYPE
+Type of call (proc/cmd/total)
+.TP
+NAME
+Name of call
+.TP
+TOTAL
+Total on-CPU time for calls (us)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_cputime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_flow.d.1m b/Man/man1m/tcl_flow.d.1m
new file mode 100644
index 000000000000..bba2e3a17780
--- /dev/null
+++ b/Man/man1m/tcl_flow.d.1m
@@ -0,0 +1,66 @@
+.TH tcl_flow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_flow.d - snoop Tcl execution showing procedure flow using DTrace.
+.SH SYNOPSIS
+.B tcl_flow.d
+
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+
+This watches Tcl method entries and returns, and indents child
+method calls.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_flow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+PID
+Process ID
+.TP
+CALL
+Tcl command or procedure name
+.SH LEGEND
+.TP
+\->
+procedure entry
+.TP
+<\-
+procedure return
+.TP
+>
+command entry
+.TP
+<
+command return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_flow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_flowtime.d.1m b/Man/man1m/tcl_flowtime.d.1m
new file mode 100644
index 000000000000..56194d2d9ce6
--- /dev/null
+++ b/Man/man1m/tcl_flowtime.d.1m
@@ -0,0 +1,69 @@
+.TH tcl_flowtime.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_flowtime.d - snoop Tcl execution showing procedure flow and delta times.
+.SH SYNOPSIS
+.B tcl_flowtime.d
+
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+
+This watches Tcl method entries and returns, and indents child
+method calls.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_flowtime.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+TIME(us)
+Time since boot, us
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+CALL
+Tcl command or procedure name
+.SH LEGEND
+.TP
+\->
+procedure entry
+.TP
+<\-
+procedure return
+.TP
+>
+command entry
+.TP
+<
+command return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_flowtime.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_ins.d.1m b/Man/man1m/tcl_ins.d.1m
new file mode 100644
index 000000000000..f3ab7feb99bc
--- /dev/null
+++ b/Man/man1m/tcl_ins.d.1m
@@ -0,0 +1,50 @@
+.TH tcl_calls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_calls.d - count Tcl calls (method/...) using DTrace.
+.SH SYNOPSIS
+.B tcl_calls.d
+
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+
+TYPEs:
+inst instruction
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_calls.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+TYPE
+Type of call (see below)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_calls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_insflow.d.1m b/Man/man1m/tcl_insflow.d.1m
new file mode 100644
index 000000000000..877757d2291c
--- /dev/null
+++ b/Man/man1m/tcl_insflow.d.1m
@@ -0,0 +1,69 @@
+.TH tcl_insflow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_insflow.d - snoop Tcl execution showing procedure flow and delta times.
+.SH SYNOPSIS
+.B tcl_insflow.d
+
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+
+This watches Tcl method entries and returns, and indents child
+method calls.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_insflow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+TIME(us)
+Time since boot, us
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+TYPE
+Type of call (proc/cmd/inst)
+.TP
+CALL
+Tcl command or procedure name
+.SH LEGEND
+.TP
+proc
+procedure
+.TP
+cmd
+command
+.TP
+inst
+instruction
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_insflow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_proccalls.d.1m b/Man/man1m/tcl_proccalls.d.1m
new file mode 100644
index 000000000000..9fda802351fd
--- /dev/null
+++ b/Man/man1m/tcl_proccalls.d.1m
@@ -0,0 +1,44 @@
+.TH tcl_methodcalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_methodcalls.d - count Tcl method calls DTrace.
+.SH SYNOPSIS
+.B tcl_methodcalls.d
+
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_methodcalls.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+COUNT
+Number of calls during sample
+.TP
+PROCEDURE
+Tcl procedure name
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_methodcalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_procflow.d.1m b/Man/man1m/tcl_procflow.d.1m
new file mode 100644
index 000000000000..aa79e913b0ca
--- /dev/null
+++ b/Man/man1m/tcl_procflow.d.1m
@@ -0,0 +1,60 @@
+.TH tcl_procflow.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_procflow.d - snoop Tcl execution showing procedure flow using DTrace.
+.SH SYNOPSIS
+.B tcl_procflow.d
+
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+
+This watches Tcl method entries and returns, and indents child
+method calls.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_procflow.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+TIME(us)
+Time since boot, us
+.TP
+PID
+Process ID
+.TP
+PROCEDURE
+Tcl procedure name
+.SH LEGEND
+.TP
+\->
+proc entry
+.TP
+<\-
+proc return
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_procflow.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_stat.d.1m b/Man/man1m/tcl_stat.d.1m
new file mode 100644
index 000000000000..280b8c0d2acc
--- /dev/null
+++ b/Man/man1m/tcl_stat.d.1m
@@ -0,0 +1,61 @@
+.TH tcl_stat.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_stat.d - Tcl operation stats using DTrace.
+.SH SYNOPSIS
+.B tcl_stat.d
+[interval [count]]
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+
+The numbers are counts for the interval specified. The default interval
+is 1 second.
+
+If you see a count in "EXECS" but not in the other columns, then you
+may have older Tcl software that does not have the integrated DTrace
+provider (or newer software where the provider has changed).
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_stat.d
+.PP
+.SH FIELDS
+.TP
+EXEC/s
+Tcl programs executed per second, including
+those without Tcl provider support
+.TP
+PROC/s
+Procedures called, per second
+.TP
+CMD/s
+Commands created, per second
+.TP
+OBJNEW/s
+Objects created, per second
+.TP
+OBJFRE/s
+Objects freed, per second
+.TP
+OP/s
+Bytecode operations, per second
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_stat.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_syscalls.d.1m b/Man/man1m/tcl_syscalls.d.1m
new file mode 100644
index 000000000000..ef4e5fe1f506
--- /dev/null
+++ b/Man/man1m/tcl_syscalls.d.1m
@@ -0,0 +1,47 @@
+.TH tcl_syscalls.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_syscalls.d - count Tcl calls and syscalls using DTrace.
+.SH SYNOPSIS
+.B tcl_syscalls.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_syscalls.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID
+.TP
+TYPE
+Type of call (method/syscall)
+.TP
+NAME
+Name of call
+.TP
+COUNT
+Number of calls during sample
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_syscalls.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_syscolors.d.1m b/Man/man1m/tcl_syscolors.d.1m
new file mode 100644
index 000000000000..4b920d55e327
--- /dev/null
+++ b/Man/man1m/tcl_syscolors.d.1m
@@ -0,0 +1,59 @@
+.TH tcl_syscolors.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_syscolors.d - trace Tcl program flow plus syscalls, in color.
+.SH SYNOPSIS
+.B tcl_syscolors.d
+{ \-p PID | \-c cmd }
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+
+This watches Tcl method entries and returns, and indents child
+method calls.
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_syscolors.d
+.PP
+.SH FIELDS
+.TP
+C
+CPU-id
+.TP
+PID
+Process ID
+.TP
+TID
+Thread ID
+.TP
+DELTA(us)
+Elapsed time from previous line to this line
+.TP
+TYPE
+Type of call (proc/cmd/syscall)
+.TP
+NAME
+Tcl proc/cmd or syscall name
+.SH WARNING
+Watch the first column carefully, it prints the CPU-id. If it
+changes, then it is very likely that the output has been shuffled.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_syscolors.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcl_who.d.1m b/Man/man1m/tcl_who.d.1m
new file mode 100644
index 000000000000..f6a69944ea29
--- /dev/null
+++ b/Man/man1m/tcl_who.d.1m
@@ -0,0 +1,54 @@
+.TH tcl_who.d 1m "$Date:: 2007-10-03 #$" "USER COMMANDS"
+.SH NAME
+tcl_who.d - trace Tcl calls by process using DTrace.
+.SH SYNOPSIS
+.B tcl_who.d
+
+.SH DESCRIPTION
+This traces activity from all Tcl processes on the system with DTrace
+provider support (tcl8.4.16).
+
+Calls is a measure of activity, and is a count of the procedures and
+commands that Tcl called.
+
+The argument list is truncated at 55 characters (up to 80 is easily
+available). To easily read the full argument list, use other system tools;
+on Solaris use "pargs PID".
+.SH OS
+Any
+.SH STABILITY
+Evolving - uses the DTrace Tcl provider, which may change
+as additional features are introduced. Check Tcl/Readme
+to see what version these scripts are based on.
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B tcl_who.d
+.PP
+.SH FIELDS
+.TP
+PID
+Process ID of Tcl
+.TP
+UID
+User ID of the owner
+.TP
+CALLS
+Number of calls made (proc + cmd)
+.TP
+ARGS
+Process name and arguments
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Examples, Notes and Docs directories. The example files may be
+especially useful as they aim to demonstrate how to interpret
+the output.
+.SH EXIT
+tcl_who.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/tcpsnoop.1m b/Man/man1m/tcpsnoop.1m
new file mode 100644
index 000000000000..7fff62c535c6
--- /dev/null
+++ b/Man/man1m/tcpsnoop.1m
@@ -0,0 +1,116 @@
+.TH tcpsnoop 1m "$Date:: 2007-10-04 #$" "USER COMMANDS"
+.SH NAME
+tcpsnoop \- snoop TCP network packets by process. Uses DTrace.
+.SH SYNOPSIS
+.B tcpsnoop
+[\-a|hjsvZ] [\-n name] [\-p pid]
+.SH DESCRIPTION
+This analyses TCP network packets and prints the responsible PID and UID,
+plus standard details such as IP address and port. This captures traffic
+of newly created TCP connections that were established while this program
+was running. It can help identify which processes is causing TCP traffic.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris 10 3/05
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH OPTIONS
+.TP
+\-a
+print all data
+.TP
+\-j
+print project ID
+.TP
+\-s
+print time, us
+.TP
+\-v
+print time, string
+.TP
+\-Z
+print zone ID
+.TP
+\-n name
+command name to snoop
+.TP
+\-p PID
+process ID to snoop
+.PP
+.SH EXAMPLES
+.TP
+Default output, snoop TCP network packets with details,
+#
+.B tcpsnoop
+.TP
+Print human readable timestamps,
+#
+.B tcpsnoop
+\-v
+.TP
+Print zonename,
+#
+.B tcpsnoop
+\-Z
+.TP
+Print sshd traffic only,
+#
+.B tcpsnoop
+\-n sshd
+.PP
+.SH FIELDS
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+CMD
+command name
+.TP
+LADDR
+local IP address
+.TP
+RADDR
+remote IP address
+.TP
+LPORT
+local port number
+.TP
+RPORT
+remote port number
+.TP
+DR
+direction
+.TP
+SIZE
+packet size, bytes
+.TP
+TIME
+timestamp, us
+.TP
+STRTIME
+human readable timestamp, string
+.TP
+ZONE
+zone ID
+.TP
+PROJ
+project ID
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+tcpsnoop will print traffic until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+tcptop(1M), dtrace(1M)
diff --git a/Man/man1m/tcpsnoop.d.1m b/Man/man1m/tcpsnoop.d.1m
new file mode 100644
index 000000000000..e1cfd3c13f4d
--- /dev/null
+++ b/Man/man1m/tcpsnoop.d.1m
@@ -0,0 +1,68 @@
+.TH tcpsnoop.d 1m "$Date:: 2007-10-04 #$" "USER COMMANDS"
+.SH NAME
+tcpsnoop.d \- snoop TCP network packets by process. DTrace.
+.SH SYNOPSIS
+.B tcpsnoop.d
+.SH DESCRIPTION
+This analyses TCP network packets and prints the responsible PID and UID,
+plus standard details such as IP address and port. This captures traffic
+of newly created TCP connections that were established while this program
+was running. It can help identify which processes is causing TCP traffic.
+
+This is a DTrace only version of "tcpsnoop" - an enhanced program that
+provides command line options.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris 10 3/05
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Default output, snoop TCP network packets with details,
+#
+.B tcpsnoop.d
+.PP
+.SH FIELDS
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+CMD
+command name
+.TP
+LADDR
+local IP address
+.TP
+RADDR
+remote IP address
+.TP
+LPORT
+local port number
+.TP
+RPORT
+remote port number
+.TP
+DR
+direction
+.TP
+SIZE
+packet size, bytes
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+tcpsnoop.d will print traffic until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+tcpsnoop(1M), tcptop(1M), dtrace(1M)
diff --git a/Man/man1m/tcpsnoop_snv.1m b/Man/man1m/tcpsnoop_snv.1m
new file mode 100644
index 000000000000..36e880d78317
--- /dev/null
+++ b/Man/man1m/tcpsnoop_snv.1m
@@ -0,0 +1,116 @@
+.TH tcpsnoop 1m "$Date:: 2007-10-04 #$" "USER COMMANDS"
+.SH NAME
+tcpsnoop \- snoop TCP network packets by process. Uses DTrace.
+.SH SYNOPSIS
+.B tcpsnoop
+[\-a|hjsvZ] [\-n name] [\-p pid]
+.SH DESCRIPTION
+This analyses TCP network packets and prints the responsible PID and UID,
+plus standard details such as IP address and port. This captures traffic
+of newly created TCP connections that were established while this program
+was running. It can help identify which processes is causing TCP traffic.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris Nevada / OpenSolaris, circa late 2007
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH OPTIONS
+.TP
+\-a
+print all data
+.TP
+\-j
+print project ID
+.TP
+\-s
+print time, us
+.TP
+\-v
+print time, string
+.TP
+\-Z
+print zone ID
+.TP
+\-n name
+command name to snoop
+.TP
+\-p PID
+process ID to snoop
+.PP
+.SH EXAMPLES
+.TP
+Default output, snoop TCP network packets with details,
+#
+.B tcpsnoop
+.TP
+Print human readable timestamps,
+#
+.B tcpsnoop
+\-v
+.TP
+Print zonename,
+#
+.B tcpsnoop
+\-Z
+.TP
+Print sshd traffic only,
+#
+.B tcpsnoop
+\-n sshd
+.PP
+.SH FIELDS
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+CMD
+command name
+.TP
+LADDR
+local IP address
+.TP
+RADDR
+remote IP address
+.TP
+LPORT
+local port number
+.TP
+RPORT
+remote port number
+.TP
+DR
+direction
+.TP
+SIZE
+packet size, bytes
+.TP
+TIME
+timestamp, us
+.TP
+STRTIME
+human readable timestamp, string
+.TP
+ZONE
+zone ID
+.TP
+PROJ
+project ID
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+tcpsnoop will print traffic until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+tcptop(1M), dtrace(1M)
diff --git a/Man/man1m/tcpsnoop_snv.d.1m b/Man/man1m/tcpsnoop_snv.d.1m
new file mode 100644
index 000000000000..79bfda36285c
--- /dev/null
+++ b/Man/man1m/tcpsnoop_snv.d.1m
@@ -0,0 +1,68 @@
+.TH tcpsnoop.d 1m "$Date:: 2007-10-04 #$" "USER COMMANDS"
+.SH NAME
+tcpsnoop.d \- snoop TCP network packets by process. DTrace.
+.SH SYNOPSIS
+.B tcpsnoop.d
+.SH DESCRIPTION
+This analyses TCP network packets and prints the responsible PID and UID,
+plus standard details such as IP address and port. This captures traffic
+of newly created TCP connections that were established while this program
+was running. It can help identify which processes is causing TCP traffic.
+
+This is a DTrace only version of "tcpsnoop" - an enhanced program that
+provides command line options.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris Nevada / OpenSolaris, circa late 2007
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Default output, snoop TCP network packets with details,
+#
+.B tcpsnoop.d
+.PP
+.SH FIELDS
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+CMD
+command name
+.TP
+LADDR
+local IP address
+.TP
+RADDR
+remote IP address
+.TP
+LPORT
+local port number
+.TP
+RPORT
+remote port number
+.TP
+DR
+direction
+.TP
+SIZE
+packet size, bytes
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+tcpsnoop.d will print traffic until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+tcpsnoop(1M), tcptop(1M), dtrace(1M)
diff --git a/Man/man1m/tcpstat.d.1m b/Man/man1m/tcpstat.d.1m
new file mode 100644
index 000000000000..4db577c446a5
--- /dev/null
+++ b/Man/man1m/tcpstat.d.1m
@@ -0,0 +1,58 @@
+.TH tcpstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+tcpstat.d \- print TCP statistics. Uses DTrace.
+.SH SYNOPSIS
+.B tcpstat.d
+.SH DESCRIPTION
+tcpstat.d is a DTrace program to print TCP statistics every second,
+retrieved from the MIB provider.
+
+This program can be used to help identify how utilised the network
+interfaces may be, as well as TCP transmission errors.
+
+The TCP statistics are documented in the mib2_tcp struct
+in /usr/include/inet/mib2.h; and also in the mib provider
+chapter of the DTrace Guide, found at
+http://docs.sun.com/db/doc/817-6223.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the mib provider.
+.SH EXAMPLES
+.TP
+Print statistics every second,
+#
+.B tcpstat.d
+.PP
+.SH FIELDS
+.TP
+TCP_out
+TCP bytes sent
+.TP
+TCP_outRe
+TCP bytes retransmitted
+.TP
+TCP_in
+TCP bytes received
+.TP
+TCP_inDup
+TCP bytes received duplicated
+.TP
+TCP_inUn
+TCP bytes received out of order
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+tcpstat.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+nicstat(1M), dtrace(1M)
+
diff --git a/Man/man1m/tcptop.1m b/Man/man1m/tcptop.1m
new file mode 100644
index 000000000000..156aaf50fc69
--- /dev/null
+++ b/Man/man1m/tcptop.1m
@@ -0,0 +1,111 @@
+.TH tcptop 1m "$Date:: 2007-10-04 #$" "USER COMMANDS"
+.SH NAME
+tcptop \- display top TCP network packets by process. Uses DTrace.
+.SH SYNOPSIS
+.B tcptop
+[-Ch] [-j|-Z] [interval [count]]
+.SH DESCRIPTION
+This analyses TCP network packets and prints the responsible PID and UID,
+plus standard details such as IP address and port. This captures traffic
+of newly created TCP connections that were established while this program
+was running. It can help identify which processes is causing TCP traffic.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris 10 3/05
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH OPTIONS
+.TP
+\-C
+don't clear the screen
+.TP
+\-j
+print project IDs
+.TP
+\-Z
+print zone IDs
+.TP
+interval
+sample seconds between refreshing the screen
+.TP
+count
+number of samples
+.PP
+.SH EXAMPLES
+.TP
+Print a report every 5 seconds,
+#
+.B tcptop
+.TP
+Don't clear the screen, scrolling output,
+#
+.B tcptop
+\-C
+.TP
+Print project IDs,
+#
+.B tcptop
+\-j
+.TP
+Print zone IDs,
+#
+.B tcptop
+\-Z
+.PP
+.SH FIELDS
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+CMD
+command name
+.TP
+LADDR
+local IP address
+.TP
+RADDR
+remote IP address
+.TP
+LPORT
+local port number
+.TP
+RPORT
+remote port number
+.TP
+SIZE
+packet size, bytes
+.TP
+load
+1 minute load average
+.TP
+TCPin
+total TCP inbound payload data
+.TP
+TCPout
+total TCP outbound payload data
+.TP
+ZONE
+zone ID
+.TP
+PROJ
+project ID
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+tcptop will print reports until Ctrl\-C is hit, or the specified
+count is reached.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+tcpsnoop(1M), dtrace(1M)
diff --git a/Man/man1m/tcptop_snv.1m b/Man/man1m/tcptop_snv.1m
new file mode 100644
index 000000000000..9ac14ac3a427
--- /dev/null
+++ b/Man/man1m/tcptop_snv.1m
@@ -0,0 +1,111 @@
+.TH tcptop 1m "$Date:: 2007-10-04 #$" "USER COMMANDS"
+.SH NAME
+tcptop \- display top TCP network packets by process. Uses DTrace.
+.SH SYNOPSIS
+.B tcptop
+[-Ch] [-j|-Z] [interval [count]]
+.SH DESCRIPTION
+This analyses TCP network packets and prints the responsible PID and UID,
+plus standard details such as IP address and port. This captures traffic
+of newly created TCP connections that were established while this program
+was running. It can help identify which processes is causing TCP traffic.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris Nevada / OpenSolaris, circa late 2007
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH OPTIONS
+.TP
+\-C
+don't clear the screen
+.TP
+\-j
+print project IDs
+.TP
+\-Z
+print zone IDs
+.TP
+interval
+sample seconds between refreshing the screen
+.TP
+count
+number of samples
+.PP
+.SH EXAMPLES
+.TP
+Print a report every 5 seconds,
+#
+.B tcptop
+.TP
+Don't clear the screen, scrolling output,
+#
+.B tcptop
+\-C
+.TP
+Print project IDs,
+#
+.B tcptop
+\-j
+.TP
+Print zone IDs,
+#
+.B tcptop
+\-Z
+.PP
+.SH FIELDS
+.TP
+UID
+user ID
+.TP
+PID
+process ID
+.TP
+CMD
+command name
+.TP
+LADDR
+local IP address
+.TP
+RADDR
+remote IP address
+.TP
+LPORT
+local port number
+.TP
+RPORT
+remote port number
+.TP
+SIZE
+packet size, bytes
+.TP
+load
+1 minute load average
+.TP
+TCPin
+total TCP inbound payload data
+.TP
+TCPout
+total TCP outbound payload data
+.TP
+ZONE
+zone ID
+.TP
+PROJ
+project ID
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+tcptop will print reports until Ctrl\-C is hit, or the specified
+count is reached.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+tcpsnoop(1M), dtrace(1M)
diff --git a/Man/man1m/tcpwdist.d.1m b/Man/man1m/tcpwdist.d.1m
new file mode 100644
index 000000000000..626d66e74f25
--- /dev/null
+++ b/Man/man1m/tcpwdist.d.1m
@@ -0,0 +1,60 @@
+.TH tcpwdist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+tcpwdist.d \- simple TCP write dist by process. Uses DTrace.
+.SH SYNOPSIS
+.B tcpwdist.d
+.SH DESCRIPTION
+This measures the size of writes from applications to the TCP level, which
+may well be much larger than the MTU size (this is application writes not
+packet writes). It can help identify which process is creating network
+traffic, and the size of the writes by that application. It uses a simple
+probe that produces meaningful output for most protocols.
+
+Tracking TCP activity by process is complex for a number of reasons,
+the greatest is that inbound TCP traffic is asynchronous to the process.
+The easiest TCP traffic to match is writes, which this script demonstrates.
+However there are still issues - for an inbound telnet connection the
+writes are associated with the command, for example "ls -l", not something
+meaningful such as "in.telnetd".
+
+Scripts that match TCP traffic properly include tcpsnoop and tcptop.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B tcpwdist.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+command and argument list
+.TP
+value
+TCP write payload size in bytes
+.TP
+count
+number of writes
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+tcpwdist.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+tcpsnoop(1M), tcptop(1M), dtrace(1M)
diff --git a/Man/man1m/threaded.d.1m b/Man/man1m/threaded.d.1m
new file mode 100644
index 000000000000..c17ad9acc9de
--- /dev/null
+++ b/Man/man1m/threaded.d.1m
@@ -0,0 +1,50 @@
+.TH threaded.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+threaded.d \- sample multi-threaded CPU usage. Uses DTrace.
+.SH SYNOPSIS
+.B threaded.d
+.SH DESCRIPTION
+This measures thread IDs as a process runs across multiple CPUs.
+It is a simple script that can help determine if a multi-threaded
+application is effectively using it's threads, or if the threads have
+serialised. See the example file in Docs/Examples/threaded_example.txt
+for a demonstration.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Any
+.SH STABILITY
+stable.
+.SH EXAMPLES
+.TP
+This runs until Ctrl\-C is hit.
+#
+.B threaded.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+value
+thread ID
+.TP
+count
+number of samples
+.PP
+.SH SEE ALSO
+prstat \-L
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+threaded.d will run until Ctrl\-C is hit.
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/topsyscall.1m b/Man/man1m/topsyscall.1m
new file mode 100644
index 000000000000..34734546ac34
--- /dev/null
+++ b/Man/man1m/topsyscall.1m
@@ -0,0 +1,73 @@
+.TH topsyscall 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+topsyscall \- top syscalls by syscall name. Uses DTrace.
+.SH SYNOPSIS
+.B topsyscall
+[-Cs] [interval [count]]
+.SH DESCRIPTION
+This program continually prints a report of the top system calls,
+and refreshes the display every 1 second or as specified at the
+command line.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - uses the hp_avenrun kernel symbol.
+.SH OPTIONS
+.TP
+\-C
+don't clear the screen
+.TP
+\-s
+print per second values
+.PP
+.SH EXAMPLES
+.TP
+Default output, 1 second updates,
+#
+.B topsyscall
+.TP
+Print every 5 seconds,
+#
+.B topsyscall
+5
+.TP
+Print a scrolling output,
+#
+.B topsyscall
+\-C
+.PP
+.SH FIELDS
+.TP
+load avg
+load averages, see uptime(1)
+.TP
+syscalls
+total syscalls in this interval
+.TP
+syscalls/s
+syscalls per second
+.TP
+SYSCALL
+system call name
+.TP
+COUNT
+total syscalls in this interval
+.TP
+COUNT/s
+syscalls per second
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+topsyscall will run until Ctrl\-C is hit, or the specified
+interval is reached.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), prstat(1M)
diff --git a/Man/man1m/topsysproc.1m b/Man/man1m/topsysproc.1m
new file mode 100644
index 000000000000..2f5e1c39d2ce
--- /dev/null
+++ b/Man/man1m/topsysproc.1m
@@ -0,0 +1,75 @@
+.TH topsysproc 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+topsysproc \- top syscalls by process name. Uses DTrace.
+.SH SYNOPSIS
+.B topsysproc
+[-Cs] [interval [count]]
+.SH DESCRIPTION
+This program continually prints a report of the number of system calls
+by process name, and refreshes the display every 1 second or as specified
+at the command line. Similar data can be fetched with "prstat -m".
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - uses the hp_avenrun kernel symbol.
+.SH OPTIONS
+.TP
+\-C
+don't clear the screen
+.TP
+\-s
+print per second values
+.PP
+.SH EXAMPLES
+.TP
+Default output, 1 second updates,
+#
+.B topsysproc
+.TP
+Print every 5 seconds,
+#
+.B topsysproc
+5
+.TP
+Print a scrolling output,
+#
+.B topsysproc
+\-C
+.PP
+.SH FIELDS
+.TP
+load avg
+load averages, see uptime(1)
+.TP
+syscalls
+total syscalls in this interval
+.TP
+syscalls/s
+syscalls per second
+.TP
+PROCESS
+process name
+.TP
+COUNT
+total syscalls in this interval
+.TP
+COUNT/s
+syscalls per second
+.PP
+.SH NOTES
+There may be several PIDs with the same process name.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+topsysproc will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), prstat(1M)
diff --git a/Man/man1m/udpstat.d.1m b/Man/man1m/udpstat.d.1m
new file mode 100644
index 000000000000..340f659d06bc
--- /dev/null
+++ b/Man/man1m/udpstat.d.1m
@@ -0,0 +1,55 @@
+.TH udpstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+udpstat.d \- print UDP statistics. Uses DTrace.
+.SH SYNOPSIS
+.B udpstat.d
+.SH DESCRIPTION
+udpstat.d is a DTrace program to print UDP statistics every second,
+retrieved from the MIB provider.
+
+The UDP statistics are documented in the mib2_tcp struct
+in /usr/include/inet/mib2.h; and also in the mib provider
+chapter of the DTrace Guide, found at
+http://docs.sun.com/db/doc/817-6223.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the mib provider.
+.SH EXAMPLES
+.TP
+Print statistics every second,
+#
+.B udpstat.d
+.PP
+.SH FIELDS
+.TP
+UDP_out
+UDP datagrams sent
+.TP
+UDP_outErr
+UDP datagrams errored on send
+.TP
+UDP_in
+UDP datagrams received
+.TP
+UDP_inErr
+UDP datagrams undeliverable
+.TP
+UDP_noPort
+UDP datagrams received to closed ports
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+udpstat.d will run forever until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/uname-a.d.1m b/Man/man1m/uname-a.d.1m
new file mode 100644
index 000000000000..60d10f700fe7
--- /dev/null
+++ b/Man/man1m/uname-a.d.1m
@@ -0,0 +1,35 @@
+.TH uname\-a.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+uname\-a.d \- "uname \-a" demo in DTrace. Uses DTrace.
+.SH SYNOPSIS
+.B uname\-a.d
+.SH DESCRIPTION
+This has been written to demonstrate fetching the "uname -a" info
+from a DTrace script, which turns out to be all kernel variables.
+This is intended as a starting point for other DTrace scripts, by
+beginning with familiar statistics.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - uses various kernel symbols.
+.SH EXAMPLES
+.TP
+Print system call counts every second,
+#
+.B uname\-c.d
+.PP
+.SH FIELDS
+See uname(1) manpage for documentation.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+uname(1), dtrace(1M)
diff --git a/Man/man1m/vmbypid.d.1m b/Man/man1m/vmbypid.d.1m
new file mode 100644
index 000000000000..3c8b8759071a
--- /dev/null
+++ b/Man/man1m/vmbypid.d.1m
@@ -0,0 +1,50 @@
+.TH vmbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+vmbypid.d \- virtual memory stats by PID. Uses DTrace.
+.SH SYNOPSIS
+.B vmbypid.d
+.SH DESCRIPTION
+vmbypid.d is a simple DTrace program to print Virtual Memory
+statistics by process.
+
+The virtual memory statistics are documented in the cpu_vminfo struct
+in the /usr/include/sys/sysinfo.h file; and also in the vminfo provider
+chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the vminfo provider.
+.SH EXAMPLES
+.TP
+Sample until Ctrl\-C is hit then print report,
+#
+.B vmbypid.d
+.PP
+.SH FIELDS
+.TP
+EXEC
+process name
+.TP
+PID
+process ID
+.TP
+VM
+Virtual Memory statistic
+.TP
+VALUE
+Value by which statistic was incremented
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+vmbypid.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), vmstat(1M)
+
diff --git a/Man/man1m/vmstat-p.d.1m b/Man/man1m/vmstat-p.d.1m
new file mode 100644
index 000000000000..8198f3d55fee
--- /dev/null
+++ b/Man/man1m/vmstat-p.d.1m
@@ -0,0 +1,85 @@
+.TH vmstat-p.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+vmstat-p.d \- vmstat -p demo in DTrace. Uses DTrace.
+.SH SYNOPSIS
+.B vmstat-p.d
+.SH DESCRIPTION
+This has been written to demonstrate fetching similar data as vmstat
+from DTrace. This program is intended as a starting point for other
+DTrace scripts, by beginning with familiar statistics.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - uses various kernel symbols.
+.SH EXAMPLES
+.TP
+Print virtual memory statistics every second,
+#
+.B vmstat-p.d
+.PP
+.SH FIELDS
+.TP
+swap
+virtual memory free, Kbytes
+.TP
+free
+free RAM, Kbytes
+.TP
+re
+page reclaims, Kbytes
+.TP
+mf
+minor faults, Kbytes
+.TP
+sr
+scan rate, pages
+.TP
+epi
+executable page ins, Kbytes
+.TP
+epo
+executable page outs, Kbytes
+.TP
+epf
+executable frees, Kbytes
+.TP
+api
+anonymous page ins, Kbytes
+.TP
+apo
+anonymous page outs, Kbytes
+.TP
+apf
+anonymous frees, Kbytes
+.TP
+fpi
+filesystem page ins, Kbytes
+.TP
+fpo
+filesystem page outs, Kbytes
+.TP
+fpf
+filesystem frees, Kbytes
+.PP
+.SH NOTES
+Most of the statistics are in units of kilobytes, unlike the
+original vmstat command which sometimes uses page counts.
+
+As this program does not use Kstat, there is no summary since boot line.
+
+Free RAM is both free free + cache free.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+vmstat-p.d will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+vmstat(1M), dtrace(1M)
diff --git a/Man/man1m/vmstat.d.1m b/Man/man1m/vmstat.d.1m
new file mode 100644
index 000000000000..dfbc3605c520
--- /dev/null
+++ b/Man/man1m/vmstat.d.1m
@@ -0,0 +1,79 @@
+.TH vmstat.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+vmstat.d \- vmstat demo in DTrace. Uses DTrace.
+.SH SYNOPSIS
+.B vmstat.d
+.SH DESCRIPTION
+This has been written to demonstrate fetching the same data as vmstat
+from DTrace. This program is intended as a starting point for other
+DTrace scripts, by beginning with familiar statistics.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - uses various kernel symbols.
+.SH EXAMPLES
+.TP
+Print virtual memory statistics every second,
+#
+.B vmstat.d
+.PP
+.SH FIELDS
+.TP
+w
+swapped out light weight processes
+.TP
+swap
+virtual memory free, Kbytes
+.TP
+free
+free RAM, Kbytes
+.TP
+re
+page reclaims, Kbytes
+.TP
+mf
+minor faults, Kbytes
+.TP
+pi
+page ins, Kbytes
+.TP
+po
+page outs, Kbytes
+.TP
+fr
+pages freed, Kbytes
+.TP
+sr
+scan rate, pages
+.TP
+in
+interrupts, number
+.TP
+sy
+system calls, number
+.TP
+cs
+context switches, number
+.PP
+.SH NOTES
+Most of the statistics are in units of kilobytes, unlike the
+original vmstat command which sometimes uses page counts.
+
+As this program does not use Kstat, there is no summary since boot line.
+
+Free RAM is both free free + cache free.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+vmstat.d will run until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+vmstat(1M), dtrace(1M)
diff --git a/Man/man1m/vopstat.1m b/Man/man1m/vopstat.1m
new file mode 100644
index 000000000000..fa81cc1e9820
--- /dev/null
+++ b/Man/man1m/vopstat.1m
@@ -0,0 +1,77 @@
+.TH vopstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+vopstat \- vnode interface statistics. Uses DTrace.
+.SH SYNOPSIS
+.B vopstat [\-t] [/mountname]
+.SH DESCRIPTION
+This will either produce summary reports of vnode statistics, or
+trace activity.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH OPTIONS
+.TP
+\-t
+trace activity as it occurs
+.TP
+/mountname
+examine this FS only
+.PP
+.SH EXAMPLES
+.TP
+default output, summary each 5 secs,
+#
+.B vopstat
+.TP
+only examine /var,
+#
+.B vopstat
+/var
+.TP
+trace activity to /var,
+#
+.B vopstat
+\-t /var
+.PP
+.SH FIELDS
+.TP
+Count
+number of calls
+.TP
+mSeconds
+total of elapsed times
+.TP
+Event
+vop call name
+.TP
+Device
+device instance name
+.TP
+Path
+full pathname to file
+.TP
+RW
+Read or Write
+.TP
+Size
+size in bytes, if available
+.TP
+Offset
+offset in bytes, if available
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+vopstat will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Richard McDougall
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/weblatency.d.1m b/Man/man1m/weblatency.d.1m
new file mode 100644
index 000000000000..c7ff3d38870a
--- /dev/null
+++ b/Man/man1m/weblatency.d.1m
@@ -0,0 +1,63 @@
+.TH weblatency.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+weblatency.d \- website latency statistics. Uses DTrace.
+.SH SYNOPSIS
+.B weblatency.d
+.SH DESCRIPTION
+This prints statistics for hostnames that browers have set GET requests
+for, in particular latency by hostname.
+
+The latency measured is from the browser sending the GET
+request to when the browser begins to recieve the response. It
+is an overall response time for the client, and encompasses
+connection speed delays, DNS lookups, proxy delays, and web server
+response time.
+
+This is written as an experimental tool, and may not work at all with
+your browser.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - depends on browser implementation.
+.SH EXAMPLES
+.TP
+Print report after Ctrl-C is hit,
+#
+.B weblatency.d
+.PP
+.SH FIELDS
+.TP
+HOST
+hostname from URL
+.TP
+NUM
+number of GETs
+.TP
+AVGTIME(ms)
+Average time for response, ms
+.TP
+MAXTIME(ms)
+Maximum time for response, ms
+.PP
+.SH NOTES
+See the source code for the "BROWSER" variable, which sets the browser
+to trace (currently set to "mozilla-bin").
+.PP
+.SH IDEA
+Bryan Cantrill (who wrote an elegant version for Sol 10 update 1)
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+weblatency.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
+
diff --git a/Man/man1m/whatexec.d.1m b/Man/man1m/whatexec.d.1m
new file mode 100644
index 000000000000..9c29b8ed5f20
--- /dev/null
+++ b/Man/man1m/whatexec.d.1m
@@ -0,0 +1,53 @@
+.TH whatexec.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+whatexec.d \- Examine the type of files exec'd. Uses DTrace.
+.SH SYNOPSIS
+.B whatexec.d
+.SH DESCRIPTION
+This prints the first four chacacters of files that are executed.
+This traces the kernel function findexec_by_hdr(), which checks for
+a known magic number in the file's header.
+
+The idea came from a demo I heard about from the UK, where a
+"blue screen of death" was displayed for "MZ" files (although I
+haven't seen the script or the demo).
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - this script uses fbt provider probes which may change for
+future updates of the OS, invalidating this script. Please read
+Docs/Notes/ALLfbt_notes.txt for further details about these fbt scripts.
+.SH EXAMPLES
+.TP
+Trace execs as they occur,
+#
+.B whatexec.d
+.PP
+.SH FIELDS
+.TP
+PEXEC
+parent command name
+.TP
+EXEC
+pathname to file exec'd
+.TP
+OK
+is type runnable, Y/N
+.TP
+TYPE
+first four characters from file
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+whatexec.d will trace until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/woof.d.1m b/Man/man1m/woof.d.1m
new file mode 100644
index 000000000000..212346d6973d
--- /dev/null
+++ b/Man/man1m/woof.d.1m
@@ -0,0 +1,46 @@
+.TH woof.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+woof.d \- Bark for new processes. Needs /dev/audio. Uses DTrace.
+.SH SYNOPSIS
+.B woof.d &
+.SH DESCRIPTION
+This is an audio alert daemon for process creation. It is a virtual dog which
+barks when it sees new processes. If many processes are being created
+quickly, it will bark a lot (and become a nuisance - not just the noise,
+but also from consuming too much CPU).
+
+This exists in the DTraceToolkit more for entertainment than
+practicality.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the proc provider, /usr/bin/audioplay, and bark.au.
+.SH EXAMPLES
+.TP
+Run the dog,
+#
+.B woof.d &
+.TP
+Hear the dog,
+$ find /etc -type f -exec grep localhost {} +
+.TP
+Drive the dog crazy,
+$ find /etc -type f -exec grep localhost {} \\;
+.PP
+.SH NOTES
+Beware of the dog!
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+woof.d will exit on Ctrl-C.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+sdtaudiocontrol(1), dtrace(1M)
diff --git a/Man/man1m/wpm.d.1m b/Man/man1m/wpm.d.1m
new file mode 100644
index 000000000000..8022ae463f50
--- /dev/null
+++ b/Man/man1m/wpm.d.1m
@@ -0,0 +1,34 @@
+.TH wpm.d 1m "$Date:: 2007-09-12 #$" "USER COMMANDS"
+.SH NAME
+wpm.d - Measure words per minute of typing.
+.SH SYNOPSIS
+.B wpm.d
+commandname
+eg,
+wpm.d bash
+wpm.d vim
+.SH DESCRIPTION
+This script assumes that keystrokes arrive one at a time on STDIN. This
+isn't the case for all processes that read keyboard input (eg, sh).
+.SH OS
+Solaris
+.SH STABILITY
+stable - Written in DTrace (Solaris 10 3/05).
+.SH EXAMPLES
+.TP
+Default output,
+#
+.B wpm.d
+.PP
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+wpm.d will run until Ctrl-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[CA, USA]
+.SH SEE ALSO
+dtrace(1M)
diff --git a/Man/man1m/writebytes.d.1m b/Man/man1m/writebytes.d.1m
new file mode 100644
index 000000000000..6fb3d85fd08a
--- /dev/null
+++ b/Man/man1m/writebytes.d.1m
@@ -0,0 +1,47 @@
+.TH writebytes.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+writebytes.d \- write bytes by process name. Uses DTrace.
+.SH SYNOPSIS
+.B writebytes.d
+.SH DESCRIPTION
+writebytes.d is a DTrace OneLiner to a report of the number of
+bytes write by process name.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B writebytes.d
+.PP
+.SH FIELDS
+.TP
+first field
+This is the process name. There may be several PIDs that have the
+same process name, for example with numerous instances of "bash". The
+value reported will be the sum of them all.
+.TP
+second field
+This is the number of bytes write.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+writebytes.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/writedist.d.1m b/Man/man1m/writedist.d.1m
new file mode 100644
index 000000000000..bdced08f1bca
--- /dev/null
+++ b/Man/man1m/writedist.d.1m
@@ -0,0 +1,54 @@
+.TH writedist.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+writedist.d \- write distrib. by process name. Uses DTrace.
+.SH SYNOPSIS
+.B writedist.d
+.SH DESCRIPTION
+writedist.d is a DTrace OneLiner to a report the write size and
+number of occurrences as a frequency distribution by process name.
+
+This can be useful to identify the behaviour of processes
+that are doing writes. Are they using many small writes, or
+fewer large writes.
+
+Docs/oneliners.txt and Docs/Examples/oneliners_examples.txt
+in the DTraceToolkit contain this as a oneliner that can be cut-n-paste
+to run.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B writedist.d
+.PP
+.SH FIELDS
+.TP
+process name
+The process name. There may be several PIDs that have the
+same process name, for example with numerous instances of "bash". The
+value reported will be the sum of them all.
+.TP
+value
+The size in bytes
+.TP
+count
+The number of occurrences that were at least this size
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+writedist.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+dtrace(1M), truss(1)
+
diff --git a/Man/man1m/xcallsbypid.d.1m b/Man/man1m/xcallsbypid.d.1m
new file mode 100644
index 000000000000..173a14f7f71b
--- /dev/null
+++ b/Man/man1m/xcallsbypid.d.1m
@@ -0,0 +1,46 @@
+.TH xcallsbypid.d 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+xcallsbypid.d \- CPU cross calls by PID. Uses DTrace.
+.SH SYNOPSIS
+.B xcallsbypid.d
+.SH DESCRIPTION
+xcallsbypid.d reports the number of CPU cross calls by process name
+and process ID. Cross calls occur when a CPU requests another CPU to
+do work on it's behalf. A great number of these can be a burden
+on the system.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the sysinfo provider.
+.SH EXAMPLES
+.TP
+This samples until Ctrl\-C is hit.
+#
+.B xcallsbypid.d
+.PP
+.SH FIELDS
+.TP
+PID
+process ID
+.TP
+CMD
+process name
+.TP
+XCALLS
+number cross calls
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+xcallsbypid.d will sample until Ctrl\-C is hit.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+mpstat(1m), dtrace(1M)
+
diff --git a/Man/man1m/xvmstat.1m b/Man/man1m/xvmstat.1m
new file mode 100644
index 000000000000..9f27d959a232
--- /dev/null
+++ b/Man/man1m/xvmstat.1m
@@ -0,0 +1,104 @@
+.TH xvmstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+xvmstat \- extended vmstat demo in DTrace. Uses DTrace.
+.SH SYNOPSIS
+.B xvmstat
+[interval [count]]
+.SH DESCRIPTION
+This has been written to demonstrate fetching similar data as vmstat
+from DTrace, with a few extra fields.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+unstable - needs various kernel symbols.
+.SH EXAMPLES
+.TP
+Print virtual memory statistics every second,
+#
+.B xvmstat
+.TP
+Print every 5 seconds, 6 times,
+#
+.B xvmstat
+5 6
+.PP
+.SH FIELDS
+.TP
+w
+swapped out LWPs, number
+.TP
+swap
+virtual memory free, Mb
+.TP
+free
+free RAM, Mb
+.TP
+re
+page reclaims, pages
+.TP
+maj
+major faults, pages
+.TP
+mf
+minor faults, pages
+.TP
+cow
+copy-on-write faults, pages
+.TP
+pro
+protection faults, pages
+sr
+scan rate, pages
+.TP
+epi
+executable page ins, pages
+.TP
+epo
+executable page outs, pages
+.TP
+epf
+executable frees, pages
+.TP
+api
+anonymous page ins, pages
+.TP
+apo
+anonymous page outs, pages
+.TP
+apf
+anonymous frees, pages
+.TP
+fpi
+filesystem page ins, pages
+.TP
+fpo
+filesystem page outs, pages
+.TP
+fpf
+filesystem frees, pages
+.PP
+.SH NOTES
+Most of the statistics are in units of pages, unlike the
+original vmstat command which sometimes uses kilobytes.
+
+All page values are per second values.
+
+As this program does not use Kstat, there is no summary since boot line.
+
+Free RAM is both free free + cache free.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+xvmstat will run until Ctrl\-C is hit, or until the count argument
+has been satisfied.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+vmstat(1M), dtrace(1M)
diff --git a/Man/man1m/zvmstat.1m b/Man/man1m/zvmstat.1m
new file mode 100644
index 000000000000..cd830e06dba7
--- /dev/null
+++ b/Man/man1m/zvmstat.1m
@@ -0,0 +1,101 @@
+.TH zvmstat 1m "$Date:: 2007-08-05 #$" "USER COMMANDS"
+.SH NAME
+zvmstat \- print vmstat style info per Zone. Uses DTrace.
+.SH SYNOPSIS
+.B zvmstat
+[\-t] [interval [count]]
+.SH DESCRIPTION
+This program must be run from the global zone as root.
+
+Since this uses DTrace, only the root user or users with the
+dtrace_kernel privilege can run this command.
+.SH OS
+Solaris
+.SH STABILITY
+stable - needs the syscall and vminfo providers.
+.SH OPTIONS
+.TP
+\-t
+Print timestamps, string
+.TP
+interval
+Duration for each sample, seconds. default is 1.
+.TP
+count
+Number of samples. default is 1.
+.PP
+.SH EXAMPLES
+.TP
+Print virtual memory statistics every second,
+#
+.B zvmstat
+.TP
+Print every 5 seconds, 6 times,
+#
+.B zvmstat
+5 6
+.PP
+.SH FIELDS
+.TP
+ZONE
+zonename
+.TP
+re
+page reclaims, pages
+.TP
+mf
+minor faults, pages
+.TP
+fr
+pages freed, pages
+.TP
+sr
+scan rate, pages
+.TP
+epi
+executable page ins, pages
+.TP
+epo
+executable page outs, pages
+.TP
+epf
+executable frees, pages
+.TP
+api
+anonymous page ins, pages
+.TP
+apo
+anonymous page outs, pages
+.TP
+apf
+anonymous frees, pages
+.TP
+fpi
+filesystem page ins, pages
+.TP
+fpo
+filesystem page outs, pages
+.TP
+fpf
+filesystem frees, pages
+.PP
+.SH NOTES
+Most of the statistics are in units of pages, unlike the
+original vmstat command which sometimes uses kilobytes.
+
+All page values are a total for the sample duration.
+
+As this program does not use Kstat, there is no summary since boot line.
+.PP
+.SH DOCUMENTATION
+See the DTraceToolkit for further documentation under the
+Docs directory. The DTraceToolkit docs may include full worked
+examples with verbose descriptions explaining the output.
+.SH EXIT
+zvmstat will run until Ctrl\-C is hit, or until the count argument
+has been satisfied.
+.SH AUTHOR
+Brendan Gregg
+[Sydney, Australia]
+.SH SEE ALSO
+vmstat(1M), dtrace(1M)
diff --git a/Mem/Readme b/Mem/Readme
new file mode 100644
index 000000000000..c4f7e3d90ccc
--- /dev/null
+++ b/Mem/Readme
@@ -0,0 +1,3 @@
+Mem - Memory based analysis
+
+ These scripts analyse memory and virtual memory related activity.
diff --git a/Mem/anonpgpid.d b/Mem/anonpgpid.d
new file mode 100755
index 000000000000..73971d923d1a
--- /dev/null
+++ b/Mem/anonpgpid.d
@@ -0,0 +1,75 @@
+#!/usr/sbin/dtrace -Cs
+/*
+ * anonpgpid.d - anonymous memory paging info by process on CPU.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This scripts may help identify which processes are affected by a system
+ * with low memory, which is paging to the physical swap device. A report
+ * of the process on the CPU when paging occured is printed.
+ *
+ * $Id: anonpgpid.d 8 2007-08-06 05:55:26Z brendan $
+ *
+ * USAGE: anonpgpid.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * CMD Process name
+ * D Direction, Read or Write
+ * BYTES Total bytes during sample
+ *
+ * NOTES:
+ *
+ * This program is currently an approximation - often the process when writing
+ * pages to swap will be "pageout" the pageout scanner, or "rcapd" the
+ * resource capping daemon.
+ *
+ * THANKS: James Dickens
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * TODO:
+ *
+ * Track processes accurately. This is a little difficult - anonpgout
+ * occurs asynchronously to the process, and events related to this don't
+ * point back to the process.
+ *
+ * Author: Brendan Gregg [Sydney, Australia]
+ *
+ * 25-Jul-2005 Brendan Gregg Created this.
+ * 18-Feb-2006 " " Last update.
+ */
+
+#include <sys/vnode.h>
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+fbt::pageio_setup:entry
+/((args[2]->v_flag & (VISSWAP | VSWAPLIKE)) != 0)/
+{
+ @total[pid, execname, args[3] & B_READ ? "R" : "W"] = sum(arg1);
+}
+
+dtrace:::END
+{
+ printf("%6s %-16s %1s %s\n", "PID", "CMD", "D", "BYTES");
+ printa("%6d %-16s %1s %@d\n", @total);
+}
diff --git a/Mem/minfbypid.d b/Mem/minfbypid.d
new file mode 100755
index 000000000000..43f6f83e99c0
--- /dev/null
+++ b/Mem/minfbypid.d
@@ -0,0 +1,57 @@
+#!/usr/sbin/dtrace -s
+/*
+ * minfbypid.d - minor faults by PID.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This program prints a report of minor faults by PID. Minor faults are
+ * an indiction of memory consumption. This script could be used to help
+ * determine which process was consuming the most memory during the sample.
+ *
+ * $Id: minfbypid.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: minfbypid.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD process name
+ * MINFAULTS number of minor faults
+ *
+ * This is based on a script from DExplorer.
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 28-Jun-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+vminfo:::as_fault
+{
+ @mem[pid, execname] = sum(arg0);
+}
+
+dtrace:::END
+{
+ printf("%6s %-16s %16s\n", "PID", "CMD", "MINFAULTS");
+ printa("%6d %-16s %@16d\n", @mem);
+}
diff --git a/Mem/minfbyproc.d b/Mem/minfbyproc.d
new file mode 100755
index 000000000000..4d7316c5f09b
--- /dev/null
+++ b/Mem/minfbyproc.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * minfbyproc.d - minor faults by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: minfbyproc.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+vminfo:::as_fault { @mem[execname] = sum(arg0); }
diff --git a/Mem/pgpginbypid.d b/Mem/pgpginbypid.d
new file mode 100755
index 000000000000..bd0ee5334755
--- /dev/null
+++ b/Mem/pgpginbypid.d
@@ -0,0 +1,53 @@
+#!/usr/sbin/dtrace -s
+/*
+ * pgpginbypid.d - pages paged in by PID.
+ * Writen using DTrace (Solaris 10 3/05).
+ *
+ * $Id: pgpginbypid.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: pgpginbypid.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD process name
+ * PAGES number of pages paged in
+ *
+ * This is based on a script from DExplorer.
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 28-Jun-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+vminfo:::pgpgin
+{
+ @pg[pid, execname] = sum(arg0);
+}
+
+dtrace:::END
+{
+ printf("%6s %-16s %16s\n", "PID", "CMD", "PAGES");
+ printa("%6d %-16s %@16d\n", @pg);
+}
diff --git a/Mem/pgpginbyproc.d b/Mem/pgpginbyproc.d
new file mode 100755
index 000000000000..572271b5d7d6
--- /dev/null
+++ b/Mem/pgpginbyproc.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * pgpginbyproc.d - pages paged in by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: pgpginbyproc.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+vminfo:::pgpgin { @pg[execname] = sum(arg0); }
diff --git a/Mem/swapinfo.d b/Mem/swapinfo.d
new file mode 100755
index 000000000000..045cd7271b54
--- /dev/null
+++ b/Mem/swapinfo.d
@@ -0,0 +1,149 @@
+#!/usr/sbin/dtrace -s
+/*
+ * swapinfo.d - print virtual memory info (swap).
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * Prints swap usage details for RAM and disk based swap.
+ * This script is UNDER CONSTRUCTION, check for newer versions.
+ *
+ * $Id: swapinfo.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: swapinfo.d (check for newer versions)
+ *
+ * FIELDS:
+ * RAM Total Total RAM installed
+ * RAM Unusable RAM consumed by the OBP and TSBs
+ * RAM Kernel Kernel resident in RAM (and usually locked)
+ * RAM Locked Locked memory pages from swap (Anon)
+ * RAM Used anon + exec + file pages used
+ * RAM Free free memory + page cache free
+ * Disk Total Total disk swap configured
+ * Disk Resv Disk swap allocated + reserved
+ * Disk Avail Disk swap available for reservation
+ * Swap Total Total Virtual Memory usable
+ * Swap Resv VM allocated + reserved
+ * Swap Avail VM available for reservation
+ * Swap MinFree VM kept free from reservations
+ *
+ * SEE ALSO: swapinfo - K9Toolkit, http://www.brendangregg.com/k9toolkit.html
+ * vmstat 1 2; swap -s; echo ::memstat | mdb -k
+ * RMCmem - The MemTool Package
+ * RICHPse - The SE Toolkit
+ * "Clearing up swap space confusion" Unix Insider, Adrian Cockcroft
+ * "Solaris Internals", Jim Mauro, Richard McDougall
+ * /usr/include/vm/anon.h, /usr/include/sys/systm.h
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * Author: Brendan Gregg [Sydney, Australia]
+ *
+ * 11-Jun-2005 Brendan Gregg Created this.
+ * 24-Apr-2006 " " Improved disk measurements; changed terms.
+ * 24-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+#pragma D option bufsize=16k
+
+inline int DEBUG = 0;
+
+dtrace:::BEGIN
+{
+ /* Debug stats */
+ this->ani_max = `k_anoninfo.ani_max;
+ this->ani_phys_resv = `k_anoninfo.ani_phys_resv;
+ this->ani_mem_resv = `k_anoninfo.ani_mem_resv;
+ this->ani_locked = `k_anoninfo.ani_locked_swap;
+ this->availrmem = `availrmem;
+
+ /* RAM stats */
+ this->ram_total = `physinstalled;
+ this->unusable = `physinstalled - `physmem;
+ this->locked = `pages_locked;
+ this->ram_used = `availrmem - `freemem;
+ this->freemem = `freemem;
+ this->kernel = `physmem - `pages_locked - `availrmem;
+
+ /* Disk stats */
+ this->disk_total = `k_anoninfo.ani_max;
+ this->disk_resv = `k_anoninfo.ani_phys_resv;
+ this->disk_avail = this->disk_total - this->disk_resv;
+
+ /* Total Swap stats */
+ this->minfree = `swapfs_minfree;
+ this->reserve = `swapfs_reserve;
+ /* this is TOTAL_AVAILABLE_SWAP from /usr/include/vm/anon.h, */
+ this->swap_total = `k_anoninfo.ani_max +
+ (`availrmem - `swapfs_minfree > 0 ?
+ `availrmem - `swapfs_minfree : 0);
+ /* this is CURRENT_TOTAL_AVAILABLE_SWAP from /usr/include/vm/anon.h, */
+ this->swap_avail = `k_anoninfo.ani_max - `k_anoninfo.ani_phys_resv +
+ (`availrmem - `swapfs_minfree > 0 ?
+ `availrmem - `swapfs_minfree : 0);
+ this->swap_resv = this->swap_total - this->swap_avail;
+
+ /* Convert to Mbytes */
+ this->ani_phys_resv *= `_pagesize; this->ani_phys_resv /= 1048576;
+ this->ani_mem_resv *= `_pagesize; this->ani_mem_resv /= 1048576;
+ this->ani_locked *= `_pagesize; this->ani_locked /= 1048576;
+ this->ani_max *= `_pagesize; this->ani_max /= 1048576;
+ this->availrmem *= `_pagesize; this->availrmem /= 1048576;
+ this->ram_total *= `_pagesize; this->ram_total /= 1048576;
+ this->unusable *= `_pagesize; this->unusable /= 1048576;
+ this->kernel *= `_pagesize; this->kernel /= 1048576;
+ this->locked *= `_pagesize; this->locked /= 1048576;
+ this->ram_used *= `_pagesize; this->ram_used /= 1048576;
+ this->freemem *= `_pagesize; this->freemem /= 1048576;
+ this->disk_total *= `_pagesize; this->disk_total /= 1048576;
+ this->disk_resv *= `_pagesize; this->disk_resv /= 1048576;
+ this->disk_avail *= `_pagesize; this->disk_avail /= 1048576;
+ this->swap_total *= `_pagesize; this->swap_total /= 1048576;
+ this->swap_avail *= `_pagesize; this->swap_avail /= 1048576;
+ this->swap_resv *= `_pagesize; this->swap_resv /= 1048576;
+ this->minfree *= `_pagesize; this->minfree /= 1048576;
+ this->reserve *= `_pagesize; this->reserve /= 1048576;
+
+ /* Print debug */
+ DEBUG ? printf("DEBUG availrmem %5d MB\n", this->availrmem) : 1;
+ DEBUG ? printf("DEBUG freemem %5d MB\n", this->freemem) : 1;
+ DEBUG ? printf("DEBUG ani_max %5d MB\n", this->ani_max) : 1;
+ DEBUG ? printf("DEBUG ani_phys_re %5d MB\n", this->ani_phys_resv) : 1;
+ DEBUG ? printf("DEBUG ani_mem_re %5d MB\n", this->ani_mem_resv) : 1;
+ DEBUG ? printf("DEBUG ani_locked %5d MB\n", this->ani_locked) : 1;
+ DEBUG ? printf("DEBUG reserve %5d MB\n", this->reserve) : 1;
+ DEBUG ? printf("\n") : 1;
+
+ /* Print report */
+ printf("RAM _______Total %5d MB\n", this->ram_total);
+ printf("RAM Unusable %5d MB\n", this->unusable);
+ printf("RAM Kernel %5d MB\n", this->kernel);
+ printf("RAM Locked %5d MB\n", this->locked);
+ printf("RAM Used %5d MB\n", this->ram_used);
+ printf("RAM Free %5d MB\n", this->freemem);
+ printf("\n");
+ printf("Disk _______Total %5d MB\n", this->disk_total);
+ printf("Disk Resv %5d MB\n", this->disk_resv);
+ printf("Disk Avail %5d MB\n", this->disk_avail);
+ printf("\n");
+ printf("Swap _______Total %5d MB\n", this->swap_total);
+ printf("Swap Resv %5d MB\n", this->swap_resv);
+ printf("Swap Avail %5d MB\n", this->swap_avail);
+ printf("Swap (Minfree) %5d MB\n", this->minfree);
+
+ DEBUG ? printf("\nNow run other commands for confirmation.\n") : 1;
+ ! DEBUG ? exit(0) : 1;
+}
diff --git a/Mem/vmbypid.d b/Mem/vmbypid.d
new file mode 100755
index 000000000000..5160c14d05b4
--- /dev/null
+++ b/Mem/vmbypid.d
@@ -0,0 +1,54 @@
+#!/usr/sbin/dtrace -s
+/*
+ * vmbypid.d - print vminfo events by process. DTrace.
+ *
+ * $Id: vmbypid.d 8 2007-08-06 05:55:26Z brendan $
+ *
+ * USAGE: vmbypid.d
+ *
+ * FIELDS:
+ * EXEC Process name
+ * PID Process ID
+ * VM Virtual Memory statistic (/usr/include/sys/sysinfo.h)
+ * VALUE Value by which statistic was incremented
+ *
+ * The virtual memory statistics are documented in the cpu_vminfo struct
+ * in the /usr/include/sys/sysinfo.h file; and also in the vminfo provider
+ * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223.
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 14-May-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+vminfo:::
+{
+ @VM[execname, pid, probename] = sum(arg0);
+}
+
+dtrace:::END {
+ printf("%16s %8s %22s %8s\n", "EXEC", "PID", "VM", "VALUE");
+ printa("%16s %8d %22s %@8d\n", @VM);
+}
diff --git a/Mem/vmstat-p.d b/Mem/vmstat-p.d
new file mode 100755
index 000000000000..835a0a6931ba
--- /dev/null
+++ b/Mem/vmstat-p.d
@@ -0,0 +1,155 @@
+#!/usr/sbin/dtrace -s
+/*
+ * vmstat-p.d - vmstat -p demo in DTrace.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This has been written to demonstrate fetching similar data as vmstat
+ * from DTrace. This program is intended as a starting point for other
+ * DTrace scripts, by beginning with familiar statistics.
+ *
+ * $Id: vmstat-p.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: vmstat-p.d
+ *
+ * FIELDS:
+ * swap virtual memory free Kbytes
+ * free free RAM Kbytes
+ * re page reclaims Kbytes
+ * mf minor faults Kbytes
+ * sr scan rate pages
+ * epi executable page ins Kbytes
+ * epo executable page outs Kbytes
+ * epf executable frees Kbytes
+ * api anonymous page ins Kbytes
+ * apo anonymous page outs Kbytes
+ * apf anonymous frees Kbytes
+ * fpi filesystem page ins Kbytes
+ * fpo filesystem page outs Kbytes
+ * fpf filesystem frees Kbytes
+ *
+ * NOTES:
+ * Most of the statistics are in units of kilobytes, unlike the
+ * original vmstat command which sometimes uses page counts.
+ * As this program does not use Kstat, there is no summary since
+ * boot line. Free RAM is both free free + cache free.
+ *
+ * SEE ALSO: vmstat(1M)
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 11-Jun-2005 Brendan Gregg Created this.
+ * 08-Jan-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+inline int SCREEN = 21;
+
+/*
+ * Initialise variables
+ */
+dtrace:::BEGIN
+{
+ pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0;
+ sy = 0; in = 0; cs = 0; maj = 0; cow = 0; pro = 0;
+ epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0;
+ fpi = 0; fpo = 0; fpf = 0;
+ lines = SCREEN + 1;
+}
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN,
+tick-1sec
+/lines++ > SCREEN/
+{
+ printf("%14s %13s %16s %14s %13s\n",
+ "memory", "page", "executable", "anonymous", "filesystem");
+ printf("%9s %7s %5s %4s %3s ",
+ "swap", "free", "re", "mf", "sr");
+ printf("%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",
+ "epi", "epo", "epf", "api", "apo", "apf", "fpi", "fpo", "fpf");
+ lines = 0;
+}
+
+/*
+ * Probe events
+ */
+vminfo:::pgrec { re += arg0; }
+vminfo:::scan { sr += arg0; }
+vminfo:::as_fault { mf += arg0; }
+vminfo:::execpgin { epi += arg0; }
+vminfo:::execpgout { epo += arg0; }
+vminfo:::execfree { epf += arg0; }
+vminfo:::anonpgin { api += arg0; }
+vminfo:::anonpgout { apo += arg0; }
+vminfo:::anonfree { apf += arg0; }
+vminfo:::fspgin { fpi += arg0; }
+vminfo:::fspgout { fpo += arg0; }
+vminfo:::fsfree { fpf += arg0; }
+
+/*
+ * Print output line
+ */
+profile:::tick-1sec
+{
+ /* fetch free mem */
+ this->free = `freemem;
+
+ /*
+ * fetch free swap
+ *
+ * free swap is described in /usr/include/vm/anon.h as,
+ * MAX(ani_max - ani_resv, 0) + (availrmem - swapfs_minfree)
+ */
+ this->ani_max = `k_anoninfo.ani_max;
+ this->ani_resv = `k_anoninfo.ani_phys_resv + `k_anoninfo.ani_mem_resv;
+ this->swap = (this->ani_max - this->ani_resv > 0 ?
+ this->ani_max - this->ani_resv : 0) + `availrmem - `swapfs_minfree;
+
+ /* fetch w */
+ this->w = `nswapped;
+
+ /* convert to Kbytes */
+ epi *= `_pagesize / 1024;
+ epo *= `_pagesize / 1024;
+ epf *= `_pagesize / 1024;
+ api *= `_pagesize / 1024;
+ apo *= `_pagesize / 1024;
+ apf *= `_pagesize / 1024;
+ fpi *= `_pagesize / 1024;
+ fpo *= `_pagesize / 1024;
+ fpf *= `_pagesize / 1024;
+ re *= `_pagesize / 1024;
+ sr *= `_pagesize / 1024;
+ mf *= `_pagesize / 1024;
+ this->swap *= `_pagesize / 1024;
+ this->free *= `_pagesize / 1024;
+
+ /* print line */
+ printf("%9d %7d %5d %4d %3d ",
+ this->swap, this->free, re, mf, sr);
+ printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d\n",
+ epi, epo, epf, api, apo, apf, fpi, fpo, fpf);
+
+ /* clear counters */
+ pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0;
+ sy = 0; in = 0; cs = 0; maj = 0; cow = 0; pro = 0;
+ epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0;
+ fpi = 0; fpo = 0; fpf = 0;
+}
diff --git a/Mem/vmstat.d b/Mem/vmstat.d
new file mode 100755
index 000000000000..f8e0ead0a50d
--- /dev/null
+++ b/Mem/vmstat.d
@@ -0,0 +1,137 @@
+#!/usr/sbin/dtrace -s
+/*
+ * vmstat.d - vmstat demo in DTrace.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This has been written to demonstrate fetching the same data as vmstat
+ * from DTrace. This program is intended as a starting point for other
+ * DTrace scripts, by beginning with familiar statistics.
+ *
+ * $Id: vmstat.d 8 2007-08-06 05:55:26Z brendan $
+ *
+ * USAGE: vmstat.d
+ *
+ * FIELDS:
+ * w swapped out LWPs number
+ * swap virtual memory free Kbytes
+ * free free RAM Kbytes
+ * re page reclaims Kbytes
+ * mf minor faults Kbytes
+ * pi page ins Kbytes
+ * po page outs Kbytes
+ * fr pages freed Kbytes
+ * sr scan rate pages
+ * in interrupts number
+ * sy system calls number
+ * cs context switches number
+ *
+ * NOTES:
+ * Most of the statistics are in units of kilobytes, unlike the
+ * original vmstat command which sometimes uses page counts.
+ * As this program does not use Kstat, there is no summary since boot line.
+ * Free RAM is both free free + cache free.
+ *
+ * SEE ALSO: vmstat(1M)
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 11-Jun-2005 Brendan Gregg Created this.
+ * 08-Jan-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+inline int SCREEN = 21;
+
+/*
+ * Initialise variables
+ */
+dtrace:::BEGIN
+{
+ pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0;
+ sy = 0; in = 0; cs = 0;
+ lines = SCREEN + 1;
+}
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN,
+profile:::tick-1sec
+/lines++ > SCREEN/
+{
+ printf(" %1s %10s %8s %5s %5s %4s %4s %4s %4s %5s %6s %4s\n",
+ "w", "swap", "free", "re", "mf", "pi", "po", "fr", "sr",
+ "in", "sy", "cs");
+ lines = 0;
+}
+
+/*
+ * Probe events
+ */
+vminfo:::pgpgin { pi += arg0; }
+vminfo:::pgpgout { po += arg0; }
+vminfo:::pgrec { re += arg0; }
+vminfo:::scan { sr += arg0; }
+vminfo:::as_fault { mf += arg0; }
+vminfo:::dfree { fr += arg0; }
+
+syscall:::entry { sy++; }
+sdt:::interrupt-start { in++; }
+sched::resume:on-cpu { cs++; }
+
+/*
+ * Print output line
+ */
+profile:::tick-1sec
+{
+ /* fetch free mem */
+ this->free = `freemem;
+
+ /*
+ * fetch free swap
+ *
+ * free swap is described in /usr/include/vm/anon.h as,
+ * MAX(ani_max - ani_resv, 0) + (availrmem - swapfs_minfree)
+ */
+ this->ani_max = `k_anoninfo.ani_max;
+ this->ani_resv = `k_anoninfo.ani_phys_resv + `k_anoninfo.ani_mem_resv;
+ this->swap = (this->ani_max - this->ani_resv > 0 ?
+ this->ani_max - this->ani_resv : 0) + `availrmem - `swapfs_minfree;
+
+ /* fetch w */
+ this->w = `nswapped;
+
+ /* convert to Kbytes */
+ pi *= `_pagesize / 1024;
+ po *= `_pagesize / 1024;
+ re *= `_pagesize / 1024;
+ sr *= `_pagesize / 1024;
+ mf *= `_pagesize / 1024;
+ fr *= `_pagesize / 1024;
+ this->swap *= `_pagesize / 1024;
+ this->free *= `_pagesize / 1024;
+
+ /* print line */
+ printf(" %1d %10d %8d %5d %5d %4d %4d %4d %4d %5d %6d %4d\n",
+ this->w, this->swap, this->free, re, mf, pi, po, fr, sr,
+ in, sy, cs);
+
+ /* clear counters */
+ pi = 0; po = 0; re = 0; sr = 0; mf = 0; fr = 0;
+ sy = 0; in = 0; cs = 0;
+}
diff --git a/Mem/xvmstat b/Mem/xvmstat
new file mode 100755
index 000000000000..ce13ce7e261c
--- /dev/null
+++ b/Mem/xvmstat
@@ -0,0 +1,217 @@
+#!/usr/bin/sh
+#
+# xvmstat - extended vmstat demo in DTrace.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This has been written to demonstrate fetching similar data as vmstat
+# from DTrace, with a few extra fields.
+#
+# $Id: xvmstat 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: xvmstat [interval [count]]
+#
+# FIELDS:
+# w swapped out LWPs number
+# swap virtual memory free Mbytes
+# free free RAM Mbytes
+# re page reclaims pages/sec
+# maj major faults pages/sec
+# mf minor faults pages/sec
+# cow copy-on-write faults pages/sec
+# pro protection faults pages/sec
+# sr scan rate pages/sec
+# epi executable page ins pages/sec
+# epo executable page outs pages/sec
+# epf executable frees pages/sec
+# api anonymous page ins pages/sec
+# apo anonymous page outs pages/sec
+# apf anonymous frees pages/sec
+# fpi filesystem page ins pages/sec
+# fpo filesystem page outs pages/sec
+# fpf filesystem frees pages/sec
+#
+# NOTES:
+# - Most of the statistics are in units of pages, unlike the
+# original vmstat command which sometimes uses kilobytes.
+# - As this program does not use Kstat, there is no summary since boot line.
+# - Free RAM is both free free + cache free.
+#
+# SEE ALSO: vmstat(1M)
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# 12-Jun-2005 Brendan Gregg Created this.
+# 01-Mar-2006 " " Last update.
+#
+
+##############################
+# --- Process Arguments ---
+#
+
+### default values
+interval=1; count=-1
+
+### check arguments
+if [ "$1" = "-h" -o "$1" = "--help" ]; then
+ cat <<-END >&2
+ USAGE: xvmstat [interval [count]]
+ xvmstat # 1 second samples, infinite
+ eg,
+ xvmstat 1 # print every 1 second
+ xvmstat 5 6 # print every 5 seconds, 6 times
+ END
+ exit 1
+fi
+
+### argument logic
+if [ "$1" -gt 0 ]; then
+ interval=$1; count=-1; shift
+fi
+if [ "$1" -gt 0 ]; then
+ count=$1; shift
+fi
+if [ $interval -eq 0 ]; then
+ interval=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+
+ /*
+ * Command line arguments
+ */
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+ inline int SCREEN = 21;
+
+ /*
+ * Initialise variables
+ */
+ dtrace:::BEGIN
+ {
+ re = 0; sr = 0; mf = 0; maj = 0; cow = 0; pro = 0;
+ epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0;
+ fpi = 0; fpo = 0; fpf = 0;
+ lines = SCREEN + 1;
+ counts = COUNTER;
+ secs = INTERVAL;
+ first = 1;
+ }
+
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN,
+ profile:::tick-1sec
+ /first || (secs == 0 && lines > SCREEN)/
+ {
+ printf("%2s %6s %5s %5s %3s %4s %3s %3s %3s ",
+ "w", "swap", "free", "re", "maj", "mf", "cow", "pro", "sr");
+ printf("%3s %3s %3s %3s %3s %3s %3s %3s %3s\n",
+ "epi", "epo", "epf", "api", "apo", "apf", "fpi", "fpo", "fpf");
+ lines = 0;
+ first = 0;
+ }
+
+ /*
+ * Probe events
+ */
+ vminfo:::pgrec { re += arg0; }
+ vminfo:::scan { sr += arg0; }
+ vminfo:::as_fault { mf += arg0; }
+ vminfo:::execpgin { epi += arg0; }
+ vminfo:::execpgout { epo += arg0; }
+ vminfo:::execfree { epf += arg0; }
+ vminfo:::anonpgin { api += arg0; }
+ vminfo:::anonpgout { apo += arg0; }
+ vminfo:::anonfree { apf += arg0; }
+ vminfo:::fspgin { fpi += arg0; }
+ vminfo:::fspgout { fpo += arg0; }
+ vminfo:::fsfree { fpf += arg0; }
+ vminfo:::maj_fault { maj += arg0; }
+ vminfo:::cow_fault { cow += arg0; }
+ vminfo:::prot_fault { pro += arg0; }
+
+ /*
+ * Print output line
+ */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ /* fetch free mem */
+ this->free = `freemem;
+
+ /*
+ * fetch free swap
+ *
+ * free swap is described in /usr/include/vm/anon.h as,
+ * MAX(ani_max - ani_resv, 0) + (availrmem - swapfs_minfree)
+ */
+ this->ani_max = `k_anoninfo.ani_max;
+ this->ani_resv = `k_anoninfo.ani_phys_resv + `k_anoninfo.ani_mem_resv;
+ this->swap = (this->ani_max - this->ani_resv > 0 ?
+ this->ani_max - this->ani_resv : 0) + `availrmem - `swapfs_minfree;
+
+ /* fetch w */
+ this->w = `nswapped;
+
+ /* convert to Mbytes */
+ this->swap *= `_pagesize; this->swap /= 1048576;
+ this->free *= `_pagesize; this->free /= 1048576;
+
+ /* convert to per second values */
+ re /= INTERVAL; maj /= INTERVAL; mf /= INTERVAL;
+ cow /= INTERVAL; pro /= INTERVAL; sr /= INTERVAL;
+ epi /= INTERVAL; epo /= INTERVAL; epf /= INTERVAL;
+ api /= INTERVAL; apo /= INTERVAL; apf /= INTERVAL;
+ fpi /= INTERVAL; fpo /= INTERVAL; fpf /= INTERVAL;
+
+ /* print line */
+ printf("%2d %6d %5d %5d %3d %4d %3d %3d %3d ",
+ this->w, this->swap, this->free, re, maj, mf, cow, pro, sr);
+ printf("%3d %3d %3d %3d %3d %3d %3d %3d %3d\n",
+ epi, epo, epf, api, apo, apf, fpi, fpo, fpf);
+
+ /* clear counters */
+ re = 0; sr = 0; mf = 0; maj = 0; cow = 0; pro = 0;
+ epi = 0; epo = 0; epf = 0; api = 0; apo = 0; apf = 0;
+ fpi = 0; fpo = 0; fpf = 0;
+
+ /* process counts */
+ secs = INTERVAL;
+ counts--;
+ lines++;
+ }
+
+ /*
+ * End
+ */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+'
diff --git a/Misc/Readme b/Misc/Readme
new file mode 100644
index 000000000000..2b77f6092109
--- /dev/null
+++ b/Misc/Readme
@@ -0,0 +1,5 @@
+Extra - Extra DTrace scripts
+
+ These are scripts that fall into no other category. They probably aren't
+ very useful, and are here as a particular coding example rather than
+ a useful tool.
diff --git a/Misc/guess.d b/Misc/guess.d
new file mode 100755
index 000000000000..3ebcd39c2ec3
--- /dev/null
+++ b/Misc/guess.d
@@ -0,0 +1,118 @@
+#!/usr/sbin/dtrace -wqs
+/*
+ * guess.d - guessing game in D (DTrace)
+ *
+ * $Id: guess.d 32 2007-09-15 05:08:49Z brendan $
+ *
+ * USAGE: guess.d
+ *
+ * SEE: http://www.brendangregg.com/guessinggame.html
+ *
+ * This is written to demonstrate this language versus the same program
+ * written in other languages.
+ *
+ * 11-May-2005 Brendan Gregg Created this.
+ */
+
+inline string scorefile = "highscores_d";
+
+dtrace:::BEGIN
+{
+ printf("guess.d - Guess a number between 1 and 100\n\n");
+ num = 1;
+ state = 1;
+
+ /* Generate random number */
+ answer = (rand() % 100) + 1;
+ answer = answer > 0 ? answer : - answer;
+}
+
+syscall::write:entry
+/state == 1 && pid == $pid/
+{
+ state = 2;
+ printf("Enter guess %d: ", num);
+ system("read guess");
+ pos = 0;
+}
+
+syscall::read:entry
+/state == 2 && ppid == $pid && arg0 == 3/
+{
+ self->inguess = 1;
+ self->buf = arg1;
+}
+
+syscall::read:return
+/self->inguess/
+{
+ key = copyin(self->buf, arg0);
+ keys[pos] = *(char *)key;
+ self->buf = 0;
+ pos++;
+}
+
+syscall::read:return
+/self->inguess && keys[pos-1] == '\n'/
+{
+ pos -= 2;
+ fac = 1;
+ guess = fac * (keys[pos] - '0');
+ pos--;
+ fac *= 10;
+ guess = pos >= 0 ? guess + fac * (keys[pos] - '0') : guess;
+ pos--;
+ fac *= 10;
+ guess = pos >= 0 ? guess + fac * (keys[pos] - '0') : guess;
+ self->doneguess = 1;
+}
+
+syscall::read:return
+/self->inguess/
+{
+ self->inguess = 0;
+}
+
+/* Play game */
+syscall::read:return
+/self->doneguess && guess == answer/
+{
+ printf("Correct! That took %d guesses.\n\n", num);
+ self->doneguess = 0;
+ state = 3;
+ printf("Please enter your name: ");
+ system("/usr/bin/read name");
+}
+
+syscall::read:return
+/self->doneguess && guess != answer/
+{
+ num++;
+
+ printf("%s...\n", guess < answer ? "Higher" : "Lower");
+
+ printf("Enter guess %d: ", num);
+ system("read line");
+ pos = 0;
+}
+
+syscall::read:entry
+/state == 3 && curthread->t_procp->p_parent->p_ppid == $pid && arg0 == 0/
+{
+ self->inname = 1;
+ self->buf = arg1;
+}
+
+/* Save high score */
+syscall::read:return
+/self->inname/
+{
+ self->inname = 0;
+ name = stringof(copyin(self->buf, arg0 - 1));
+ system("echo %s %d >> %s", name, num, scorefile);
+
+ /* Print high scores */
+ printf("\nPrevious high scores,\n");
+ system("cat %s", scorefile);
+ exit(0);
+}
diff --git a/Misc/woof.d b/Misc/woof.d
new file mode 100755
index 000000000000..d856a09bc543
--- /dev/null
+++ b/Misc/woof.d
@@ -0,0 +1,63 @@
+#!/usr/sbin/dtrace -s
+/*
+ * woof.d - Bark whenever new processes appear. Needs /dev/audio.
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * $Id: woof.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: woof.d &
+ *
+ * SEE ALSO: /usr/dt/bin/sdtaudiocontrol # to set volume
+ *
+ * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 14-Aug-2006 Brendan Gregg Created this.
+ * 14-Aug-2006 " " Last update.
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+#pragma D option switchrate=10hz
+
+inline int SCREEN_OUTPUT = 0; /* Set to 1 for screen output */
+
+/* barks prevents woof.d from barking too much (up to 20 barks/second) */
+int barks;
+
+dtrace:::BEGIN
+{
+ SCREEN_OUTPUT ? trace("Beware of the dog!\n") : 1;
+}
+
+/*
+ * Call the shell to run a background audioplay command (cat > /dev/audio
+ * doesn't always work). One problem this creates is a feedback loop,
+ * where we bark at our own barks, or at other dogs barks; entertaining
+ * as this is, it can really slog the system and has been avoided by
+ * checking our ancestory.
+ */
+proc:::exec-success
+/!progenyof($pid) && barks++ < 2/
+{
+ SCREEN_OUTPUT ? trace("Woof! ") : 1;
+ system("audioplay /usr/share/audio/samples/au/bark.au &");
+}
+
+profile:::tick-10hz
+{
+ barks = 0;
+}
diff --git a/Misc/wpm.d b/Misc/wpm.d
new file mode 100755
index 000000000000..7f3bff2d6fb6
--- /dev/null
+++ b/Misc/wpm.d
@@ -0,0 +1,143 @@
+#!/usr/sbin/dtrace -s
+/*
+ * wpm.d - Measure words per minute of typing.
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * $Id: wpm.d 52 2007-09-24 04:28:01Z brendan $
+ *
+ * USAGE: wpm.d commandname
+ * eg,
+ * wpm.d bash
+ * wpm.d vim
+ *
+ * This script assumes that keystrokes arrive one at a time on STDIN. This
+ * isn't the case for all processes that read keyboard input (eg, sh).
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 05-Aug-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+#pragma D option defaultargs
+
+inline int STDIN = 0;
+
+enum tracing_state {
+ BEGIN,
+ TRACING
+};
+
+dtrace:::BEGIN
+/$$1 == ""/
+{
+ trace("USAGE: wpm.d commandname\n");
+ trace(" eg,\n");
+ trace(" wpm.d bash\n");
+ trace(" wpm.d vim\n");
+ exit(1);
+}
+
+dtrace:::BEGIN
+{
+ state = BEGIN;
+ keys = 0;
+ words = 0;
+ wordsize = 0;
+ countdown = 5;
+ last = 0;
+ printf("Measuring will start in : %2d seconds", countdown);
+}
+
+profile:::tick-1sec
+/--countdown >= 0/
+{
+ printf("\b\b\b\b\b\b\b\b\b\b%2d seconds", countdown);
+}
+
+profile:::tick-1sec
+/state == BEGIN && countdown == -1/
+{
+ state = TRACING;
+ countdown = 60;
+ printf("\nMeasuring will stop in : %2d seconds", countdown);
+}
+
+syscall::read:entry
+/state == TRACING && execname == $$1 && arg0 == STDIN/
+{
+ self->buf = arg1;
+}
+
+syscall::read:return
+/self->buf && last/
+{
+ this->elapsed = (timestamp - last) / 1000000;
+ @dist = quantize(this->elapsed);
+ @avg = avg(this->elapsed);
+ @min = min(this->elapsed);
+ @max = max(this->elapsed);
+}
+
+syscall::read:return
+/self->buf/
+{
+ keys++;
+ wordsize++;
+ this->key = stringof(copyin(self->buf, arg0));
+ last = timestamp;
+}
+
+syscall::read:return
+/self->buf && (this->key == " " || this->key == "\n" || this->key == "\r") &&
+ wordsize == 1/
+{
+ /* recurring space */
+ wordsize = 0;
+ self->buf = 0;
+}
+
+syscall::read:return
+/self->buf && (this->key == " " || this->key == "\n" || this->key == "\r")/
+{
+ words++;
+ @sizes = lquantize(wordsize - 1, 0, 32, 1);
+ wordsize = 0;
+}
+
+syscall::read:return
+/self->buf/
+{
+ self->buf = 0;
+}
+
+profile:::tick-1sec
+/state == TRACING && countdown == -1/
+{
+ printf("\n\nCharacters typed : %d\n", keys);
+ printf("Words per minute : %d\n\n", words);
+
+ printa("Minimum keystroke latency : %@d ms\n", @min);
+ printa("Average keystroke latency : %@d ms\n", @avg);
+ printa("Maximum keystroke latency : %@d ms\n\n", @max);
+
+ printa("Word size distribution (letters),\n%@d\n", @sizes);
+ printa("Keystroke latency distribution (ms),\n%@d\n", @dist);
+
+ exit(0);
+}
diff --git a/Net/Readme b/Net/Readme
new file mode 100644
index 000000000000..3a53744ebe27
--- /dev/null
+++ b/Net/Readme
@@ -0,0 +1,4 @@
+Net - Network based analysis
+
+ These scripts analyse activity of the network interfaces, the TCP/IP
+ stack, socket activity, etc.
diff --git a/Net/connections b/Net/connections
new file mode 100755
index 000000000000..523b880b14ce
--- /dev/null
+++ b/Net/connections
@@ -0,0 +1,178 @@
+#!/usr/bin/ksh
+#
+# connections - print inbound TCP connections by process.
+# Written in DTrace (Solaris 10 3/05).
+#
+# This displays the PID and command name of the processes accepting
+# connections, along with the source IP address and destination port number.
+#
+# $Id: connections 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: connections [-htvZ]
+#
+# -t # print timestamps, us
+# -v # print timestamps, string
+# -Z # print zonename
+# eg,
+# connections -v # snoop connections with times
+#
+# FIELDS:
+# UID user ID of the server
+# PID process ID for the server
+# CMD server command name
+# TIME timestamp, us
+# TIMESTR timestamp, string
+# PORT server port
+# IP_SOURCE source IP of the client, written in IPv4 style
+# ZONE zonename
+#
+# SEE ALSO: snoop 'tcp[13:1] = 0x02' # snoop new connections
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# TODO: IPv6
+#
+# 10-Apr-2004 Brendan Gregg Created this.
+# 23-May-2004 " " Fixed issues on SPARC.
+# 08-May-2005 " " Updated for newer Solaris 10.
+# 17-Jun-2005 " " Rewrote, changed probes, wrapped in sh.
+# 04-Dec-2005 " " Changed tcp_accept_finish -> sotpi_accept
+# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+.
+# 20-Apr-2006 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+opt_time=0; opt_timestr=0; opt_zone=0
+
+### Process options
+while getopts htvZ name
+do
+ case $name in
+ t) opt_time=1 ;;
+ v) opt_timestr=1 ;;
+ Z) opt_zone=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: connections [-htvZ]
+ -t # print timestamps, us
+ -v # print timestamps, string
+ -Z # print zonename
+ eg,
+ connections -v # snoop connections with times
+ END
+ exit 1
+ esac
+done
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -C -s <( print -r '
+#include <sys/file.h>
+#include <sys/types.h>
+#include <sys/byteorder.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+
+ #pragma D option quiet
+ #pragma D option switchrate=10hz
+
+ inline int OPT_time = '$opt_time';
+ inline int OPT_timestr = '$opt_timestr';
+ inline int OPT_zone = '$opt_zone';
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ /* print optional headers */
+ OPT_time ? printf("%-14s ", "TIME") : 1;
+ OPT_timestr ? printf("%-20s ", "TIMESTR") : 1;
+ OPT_zone ? printf("%-10s ", "ZONE") : 1;
+
+ /* print header */
+ printf("%5s %5s %-12s %4s %5s %s\n",
+ "UID", "PID", "CMD", "TYPE", "PORT", "IP_SOURCE");
+ }
+
+ /*
+ * TCP Process inbound connections
+ *
+ * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was
+ * renamed to SS_DIRECT around build 31.
+ */
+ fbt:sockfs:sotpi_accept:entry
+ /(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/
+ {
+ self->sop = args[0];
+ }
+
+ fbt:sockfs:sotpi_create:return
+ /self->sop/
+ {
+ self->nsop = (struct sonode *)arg1;
+ }
+
+
+ /*
+ * Probe TCP connections
+ */
+ fbt:sockfs:sotpi_accept:return
+ /self->nsop/
+ {
+ /* fetch connection details */
+ this->tcpp = (tcp_t *)self->nsop->so_priv;
+ this->connp = (conn_t *)this->tcpp->tcp_connp;
+
+#if defined(_BIG_ENDIAN)
+ this->port0 = this->connp->u_port.tcpu_ports.tcpu_lport;
+#else
+ this->port0 = BSWAP_16(this->connp->u_port.tcpu_ports.tcpu_lport);
+#endif
+ this->rem12 =
+ (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12];
+ this->rem13 =
+ (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13];
+ this->rem14 =
+ (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14];
+ this->rem15 =
+ (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15];
+
+ /* print optional fields */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%-10s ", zonename) : 1;
+
+ /* print output line */
+ printf("%5d %5d %-12s %4s %5d %d.%d.%d.%d\n",
+ uid, pid, execname, "tcp", this->port0,
+ this->rem12, this->rem13, this->rem14, this->rem15);
+ }
+
+ fbt:sockfs:sotpi_accept:return
+ {
+ self->nsop = 0;
+ self->sop = 0;
+ }
+')
+
diff --git a/Net/icmpstat.d b/Net/icmpstat.d
new file mode 100755
index 000000000000..3df519999e33
--- /dev/null
+++ b/Net/icmpstat.d
@@ -0,0 +1,61 @@
+#!/usr/sbin/dtrace -s
+/*
+ * icmpstat.d - print ICMP statistics. Uses DTrace.
+ *
+ * This prints ICMP statistics every second, retrieved from the MIB provider.
+ * This is a simple script to demonstrate the ability to trace ICMP events.
+ *
+ * $Id: icmpstat.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: icmpstat.d
+ *
+ * FIELDS:
+ * STATISTIC ICMP statistic name
+ * VALUE total of statistic during sample
+ *
+ * The above ICMP statistics are documented in the mib2_icmp struct
+ * in the /usr/include/inet/mib2.h file; and also in the mib provider
+ * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223.
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 25-Jul-2005 Brendan Gregg Created this.
+ * 25-Jul-2005 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Save Data
+ */
+mib:::icmp*
+{
+ @icmp[probename] = sum(arg0);
+}
+
+/*
+ * Print Output
+ */
+profile:::tick-1sec
+{
+ printf("%Y,\n\n", walltimestamp);
+ printf("%32s %8s\n", "STATISTIC", "VALUE");
+ printa("%32s %@8d\n", @icmp);
+ printf("\n");
+
+ trunc(@icmp);
+}
diff --git a/Net/tcpsnoop b/Net/tcpsnoop
new file mode 100755
index 000000000000..e06912de015c
--- /dev/null
+++ b/Net/tcpsnoop
@@ -0,0 +1,581 @@
+#!/usr/bin/ksh
+#
+# tcpsnoop - snoop TCP network packets by process.
+# Written using DTrace (Solaris 10 3/05)
+#
+# This analyses TCP network packets and prints the responsible PID and UID,
+# plus standard details such as IP address and port. This captures traffic
+# of newly created TCP connections that were established while this program
+# was running. It can help identify which processes is causing TCP traffic.
+#
+# WARNING: This script may only work on Solaris 10 3/05, since it uses the
+# fbt provider to trace the raw operation of a specific version of the kernel.
+# In the future, a 'stable' network provider should exist which will allow
+# this to be written for that and subsequent versions of the kernel. In the
+# meantime, check for other versions of this script in the /Net directory,
+# and read the Notes/ALLfbt_notes.txt for more background on fbt.
+#
+# $Id: tcpsnoop 69 2007-10-04 13:40:00Z brendan $
+#
+# USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid]
+#
+# -a # print all data
+# -j # print project ID
+# -s # print time, us
+# -v # print time, string
+# -Z # print zone ID
+# -n name # command name to snoop
+# -p pid # PID to snoop
+# eg,
+# tcpsnoop -v # human readable timestamps
+# tcpsnoop -Z # print zonename
+# tcpsnoop -n sshd # snoop sshd traffic only
+#
+# FIELDS:
+# UID user ID
+# PID process ID
+# CMD command
+# LADDR local IP address
+# RADDR remote IP address
+# LPORT local port number
+# RPORT remote port number
+# DR direction
+# SIZE packet size, bytes
+# TIME timestamp, us
+# STRTIME human readable timestamp, string
+# ZONE zone ID
+# PROJ project ID
+#
+# SEE ALSO: snoop -rS
+#
+# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# TODO: IPv6
+#
+# CODE:
+# The FILTER syntax matches on packets rather than initial
+# connections, so that it can follow inetd connections properly.
+#
+# 09-Jul-2004 Brendan Gregg Created this.
+# 12-Mar-2005 " " Changed probes, size info now printed.
+# 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d".
+# 04-Jul-2005 " " Now wrapped in shell, called "tcpsnoop".
+# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct
+# execname. Thanks Kias Belgaied for expertise.
+# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+.
+# 20-Apr-2006 " " Last update.
+#
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_name=0; opt_time=0; opt_timestr=0; filter=0; pname=.
+opt_zone=0; opt_proj=0; opt_pid=0; pid=0
+
+### process options
+while getopts ahjsvZn:p: name
+do
+ case $name in
+ a) opt_time=1; opt_timestr=1; opt_zone=1; opt_proj=1 ;;
+ n) opt_name=1; pname=$OPTARG ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ j) opt_proj=1 ;;
+ s) opt_time=1 ;;
+ v) opt_timestr=1 ;;
+ Z) opt_zone=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid]
+ tcpsnoop # default output
+ -a # print all data
+ -j # print project ID
+ -s # print start time, us
+ -v # print start time, string
+ -Z # print zonename
+ -n name # command name to snoop
+ -p pid # PID to snoop
+ eg,
+ tcpsnoop -v # human readable timestamps
+ tcpsnoop -Z # print zonename
+ tcpsnoop -n sshd # snoop sshd traffic only
+ END
+ exit 1
+ esac
+done
+
+### option logic
+if (( opt_name || opt_pid )); then
+ filter=1
+fi
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -Cs <( print -r '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_name = '$opt_name';
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_time = '$opt_time';
+ inline int OPT_timestr = '$opt_timestr';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_proj = '$opt_proj';
+ inline int PID = '$pid';
+ inline int FILTER = '$filter';
+ inline string NAME = "'$pname'";
+
+#pragma D option quiet
+#pragma D option switchrate=10hz
+
+#include <sys/file.h>
+#include <inet/common.h>
+#include <sys/byteorder.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ /* print optional headers */
+ OPT_time ? printf("%-14s ", "TIME") : 1;
+ OPT_timestr ? printf("%-20s ", "STRTIME") : 1;
+ OPT_zone ? printf("%4s ", "ZONE") : 1;
+ OPT_proj ? printf("%4s ", "PROJ") : 1;
+
+ /* print main headers */
+ printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n",
+ "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT",
+ "SIZE", "CMD");
+}
+
+
+/*
+ * TCP Process inbound connections
+ *
+ * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was
+ * renamed to SS_DIRECT around build 31.
+ */
+fbt:sockfs:sotpi_accept:entry
+/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/
+{
+ self->sop = args[0];
+}
+
+fbt:sockfs:sotpi_create:return
+/self->sop/
+{
+ self->nsop = (struct sonode *)arg1;
+}
+
+fbt:sockfs:sotpi_accept:return
+/self->nsop/
+{
+ this->tcpp = (tcp_t *)self->nsop->so_priv;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+}
+
+fbt:sockfs:sotpi_accept:return
+{
+ self->nsop = 0;
+ self->sop = 0;
+}
+
+/*
+ * TCP Process outbound connections
+ */
+fbt:ip:tcp_connect:entry
+{
+ this->tcpp = (tcp_t *)arg0;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+ OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1;
+}
+
+/*
+ * TCP Data translations
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ /* fetch ports */
+#if defined(_BIG_ENDIAN)
+ self->lport = self->connp->u_port.tcpu_ports.tcpu_lport;
+ self->fport = self->connp->u_port.tcpu_ports.tcpu_fport;
+#else
+ self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport);
+ self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport);
+#endif
+
+ /* fetch IPv4 addresses */
+ this->fad12 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12];
+ this->fad13 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13];
+ this->fad14 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14];
+ this->fad15 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15];
+ this->lad12 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12];
+ this->lad13 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13];
+ this->lad14 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14];
+ this->lad15 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15];
+
+ /* convert type for use with lltostr() */
+ this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12;
+ this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13;
+ this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14;
+ this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15;
+ this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12;
+ this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13;
+ this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14;
+ this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15;
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ /* fix direction and save values */
+ tladdr[(int)self->connp] = self->laddr;
+ tfaddr[(int)self->connp] = self->faddr;
+ tlport[(int)self->connp] = self->lport;
+ tfport[(int)self->connp] = self->fport;
+
+ /* all systems go */
+ tok[(int)self->connp] = 1;
+}
+
+/*
+ * TCP Clear connp
+ */
+fbt:ip:tcp_get_conn:return
+{
+ /* Q_TO_CONN */
+ this->connp = (conn_t *)arg1;
+ tok[(int)this->connp] = 0;
+ tpid[(int)this->connp] = 0;
+ tuid[(int)this->connp] = 0;
+ tname[(int)this->connp] = 0;
+ tproj[(int)this->connp] = 0;
+}
+
+/*
+ * TCP Process "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:entry
+/FILTER == 0/
+{
+ this->queuep = (queue_t *)`tcp_g_q; /* ` */
+ this->connp = (conn_t *)this->queuep->q_ptr;
+ this->tcpp = (tcp_t *)this->connp->conn_tcp;
+ self->zoneid = this->connp->conn_zoneid;
+
+ /* split addresses */
+ this->ipha = (ipha_t *)args[1]->b_rptr;
+ this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24;
+ this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16;
+ this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8;
+ this->fad12 = (this->ipha->ipha_src & 0x000000ff);
+ this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24;
+ this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16;
+ this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8;
+ this->lad12 = (this->ipha->ipha_dst & 0x000000ff);
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ self->reset = 1;
+}
+
+/*
+ * TCP Fetch "port closed" ports
+ */
+fbt:ip:tcp_xchg:entry
+/self->reset/
+{
+#if defined(_BIG_ENDIAN)
+ self->lport = (uint16_t)arg0;
+ self->fport = (uint16_t)arg1;
+#else
+ self->lport = BSWAP_16((uint16_t)arg0);
+ self->fport = BSWAP_16((uint16_t)arg1);
+#endif
+ self->lport = BE16_TO_U16(arg0);
+ self->fport = BE16_TO_U16(arg1);
+}
+
+/*
+ * TCP Print "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:return
+/FILTER == 0/
+{
+ self->name = "<closed>";
+ self->pid = 0;
+ self->uid = 0;
+ self->proj = 0;
+ self->size = 54; /* should check trailers */
+ self->dir = "<-";
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "->";
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->reset = 0;
+ self->size = 0;
+ self->name = 0;
+ self->zoneid = 0;
+}
+
+/*
+ * TCP Process Write
+ */
+fbt:ip:tcp_send_data:entry
+{
+ self->conn_p = (conn_t *)args[0]->tcp_connp;
+}
+
+fbt:ip:tcp_send_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->dir = "->";
+ self->size = msgdsize(args[2]) + 14; /* should check trailers */
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
+ self->zoneid = self->conn_p->conn_zoneid;
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Process Read
+ */
+fbt:ip:tcp_rput_data:entry
+{
+ self->conn_p = (conn_t *)arg0;
+ self->size = msgdsize(args[1]) + 14; /* should check trailers */
+}
+
+fbt:ip:tcp_rput_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->dir = "<-";
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
+ self->zoneid = self->conn_p->conn_zoneid;
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Complete printing outbound handshake
+ */
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->zoneid = self->connp->conn_zoneid;
+ OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
+ self->size = 54; /* should check trailers */
+ self->dir = "->";
+}
+
+fbt:ip:tcp_connect:return
+/(self->connp) &&
+ ((FILTER == 0) ||
+ (OPT_pid && self->pid == PID) ||
+ (OPT_name && self->name == NAME))/
+{
+ /* this packet occured before connp was fully established */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * TCP Complete printing inbound handshake
+ */
+fbt:sockfs:sotpi_accept:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->zoneid = self->connp->conn_zoneid;
+ OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
+ self->size = 54; /* should check trailers */
+ self->dir = "<-";
+}
+
+fbt:sockfs:sotpi_accept:return
+/(self->connp) &&
+ ((FILTER == 0) ||
+ (OPT_pid && self->pid == PID) ||
+ (OPT_name && self->name == NAME))/
+{
+ /* these packets occured before connp was fully established */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "->";
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "<-";
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * Print output
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+/(self->ok == 2) &&
+ ((FILTER == 0) ||
+ (OPT_pid && self->pid == PID) ||
+ (OPT_name && self->name == NAME))/
+{
+ /* print optional fields */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+
+ /* print output line */
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * TCP Clear connect variables
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->faddr = 0;
+ self->laddr = 0;
+ self->fport = 0;
+ self->lport = 0;
+ self->connp = 0;
+ self->name = 0;
+ self->pid = 0;
+ self->uid = 0;
+}
+
+/*
+ * TCP Clear r/w variables
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+{
+ self->ok = 0;
+ self->dir = 0;
+ self->uid = 0;
+ self->pid = 0;
+ self->size = 0;
+ self->name = 0;
+ self->lport = 0;
+ self->fport = 0;
+ self->laddr = 0;
+ self->faddr = 0;
+ self->conn_p = 0;
+ self->zoneid = 0;
+ self->proj = 0;
+}
+')
diff --git a/Net/tcpsnoop.d b/Net/tcpsnoop.d
new file mode 100755
index 000000000000..ca01864522aa
--- /dev/null
+++ b/Net/tcpsnoop.d
@@ -0,0 +1,424 @@
+#!/usr/sbin/dtrace -Cs
+/*
+ * tcpsnoop.d - snoop TCP network packets by process.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This analyses TCP network packets and prints the responsible PID and UID,
+ * plus standard details such as IP address and port. This captures traffic
+ * of newly created TCP connections that were established while this program
+ * was running. It can help identify which processes is causing TCP traffic.
+ *
+ * WARNING: This script may only work on Solaris 10 3/05, since it uses the
+ * fbt provider to trace the raw operation of a specific version of the kernel.
+ * In the future, a 'stable' network provider should exist which will allow
+ * this to be written for that and subsequent versions of the kernel. In the
+ * meantime, check for other versions of this script in the /Net directory,
+ * and read the Notes/ALLfbt_notes.txt for more background on fbt.
+ *
+ * $Id: tcpsnoop.d 69 2007-10-04 13:40:00Z brendan $
+ *
+ * USAGE: tcpsnoop.d
+ *
+ * FIELDS:
+ * UID user ID
+ * PID process ID
+ * CMD command
+ * LADDR local IP address
+ * RADDR remote IP address
+ * LPORT local port number
+ * RPORT remote port number
+ * DR direction
+ * SIZE packet size, bytes
+ *
+ * SEE ALSO: snoop -rS
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * Author: Brendan Gregg [Sydney, Australia]
+ *
+ * TODO: IPv6
+ *
+ * 09-Jul-2004 Brendan Gregg Created this.
+ * 12-Mar-2005 " " Changed probes, size info now printed.
+ * 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d".
+ * 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct
+ * execname. Thanks Kias Belgaied for expertise.
+ * 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10hz
+
+#include <sys/file.h>
+#include <inet/common.h>
+#include <sys/byteorder.h>
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ /* print main headers */
+ printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n",
+ "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT",
+ "SIZE", "CMD");
+}
+
+/*
+ * TCP Process inbound connections
+ *
+ * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was
+ * renamed to SS_DIRECT around build 31.
+ */
+fbt:sockfs:sotpi_accept:entry
+/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/
+{
+ self->sop = args[0];
+}
+
+fbt:sockfs:sotpi_create:return
+/self->sop/
+{
+ self->nsop = (struct sonode *)arg1;
+}
+
+fbt:sockfs:sotpi_accept:return
+/self->nsop/
+{
+ this->tcpp = (tcp_t *)self->nsop->so_priv;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+}
+
+fbt:sockfs:sotpi_accept:return
+{
+ self->nsop = 0;
+ self->sop = 0;
+}
+
+/*
+ * TCP Process outbound connections
+ */
+fbt:ip:tcp_connect:entry
+{
+ this->tcpp = (tcp_t *)arg0;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+}
+
+/*
+ * TCP Data translations
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ /* fetch ports */
+#if defined(_BIG_ENDIAN)
+ self->lport = self->connp->u_port.tcpu_ports.tcpu_lport;
+ self->fport = self->connp->u_port.tcpu_ports.tcpu_fport;
+#else
+ self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport);
+ self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport);
+#endif
+
+ /* fetch IPv4 addresses */
+ this->fad12 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12];
+ this->fad13 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13];
+ this->fad14 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14];
+ this->fad15 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15];
+ this->lad12 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12];
+ this->lad13 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13];
+ this->lad14 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14];
+ this->lad15 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15];
+
+ /* convert type for use with lltostr() */
+ this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12;
+ this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13;
+ this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14;
+ this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15;
+ this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12;
+ this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13;
+ this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14;
+ this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15;
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ /* fix direction and save values */
+ tladdr[(int)self->connp] = self->laddr;
+ tfaddr[(int)self->connp] = self->faddr;
+ tlport[(int)self->connp] = self->lport;
+ tfport[(int)self->connp] = self->fport;
+
+ /* all systems go */
+ tok[(int)self->connp] = 1;
+}
+
+/*
+ * TCP Clear connp
+ */
+fbt:ip:tcp_get_conn:return
+{
+ /* Q_TO_CONN */
+ this->connp = (conn_t *)arg1;
+ tok[(int)this->connp] = 0;
+ tpid[(int)this->connp] = 0;
+ tuid[(int)this->connp] = 0;
+ tname[(int)this->connp] = 0;
+}
+
+/*
+ * TCP Process "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:entry
+{
+ this->queuep = (queue_t *)`tcp_g_q; /* ` */
+ this->connp = (conn_t *)this->queuep->q_ptr;
+ this->tcpp = (tcp_t *)this->connp->conn_tcp;
+
+ /* split addresses */
+ this->ipha = (ipha_t *)args[1]->b_rptr;
+ this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24;
+ this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16;
+ this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8;
+ this->fad12 = (this->ipha->ipha_src & 0x000000ff);
+ this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24;
+ this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16;
+ this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8;
+ this->lad12 = (this->ipha->ipha_dst & 0x000000ff);
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ self->reset = 1;
+}
+
+/*
+ * TCP Fetch "port closed" ports
+ */
+fbt:ip:tcp_xchg:entry
+/self->reset/
+{
+#if defined(_BIG_ENDIAN)
+ self->lport = (uint16_t)arg0;
+ self->fport = (uint16_t)arg1;
+#else
+ self->lport = BSWAP_16((uint16_t)arg0);
+ self->fport = BSWAP_16((uint16_t)arg1);
+#endif
+ self->lport = BE16_TO_U16(arg0);
+ self->fport = BE16_TO_U16(arg1);
+}
+
+/*
+ * TCP Print "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:return
+{
+ self->name = "<closed>";
+ self->pid = 0;
+ self->uid = 0;
+ self->size = 54; /* should check trailers */
+ self->dir = "<-";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "->";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->reset = 0;
+ self->size = 0;
+ self->name = 0;
+}
+
+/*
+ * TCP Process Write
+ */
+fbt:ip:tcp_send_data:entry
+{
+ self->conn_p = (conn_t *)args[0]->tcp_connp;
+}
+
+fbt:ip:tcp_send_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->dir = "->";
+ self->size = msgdsize(args[2]) + 14; /* should check trailers */
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Process Read
+ */
+fbt:ip:tcp_rput_data:entry
+{
+ self->conn_p = (conn_t *)arg0;
+ self->size = msgdsize(args[1]) + 14; /* should check trailers */
+}
+
+fbt:ip:tcp_rput_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->dir = "<-";
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Complete printing outbound handshake
+ */
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->size = 54; /* should check trailers */
+ self->dir = "->";
+ /* this packet occured before connp was fully established */
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * TCP Complete printing inbound handshake
+ */
+fbt:sockfs:sotpi_accept:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->size = 54; /* should check trailers */
+ /* these packets occured before connp was fully established */
+ self->dir = "<-";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "->";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "<-";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * Print output
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+/self->ok == 2/
+{
+ /* print output line */
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * TCP Clear connect variables
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->faddr = 0;
+ self->laddr = 0;
+ self->fport = 0;
+ self->lport = 0;
+ self->connp = 0;
+ self->name = 0;
+ self->pid = 0;
+ self->uid = 0;
+}
+
+/*
+ * TCP Clear r/w variables
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+{
+ self->ok = 0;
+ self->dir = 0;
+ self->uid = 0;
+ self->pid = 0;
+ self->size = 0;
+ self->name = 0;
+ self->lport = 0;
+ self->fport = 0;
+ self->laddr = 0;
+ self->faddr = 0;
+ self->conn_p = 0;
+}
diff --git a/Net/tcpsnoop_snv b/Net/tcpsnoop_snv
new file mode 100755
index 000000000000..85ebb6c898e2
--- /dev/null
+++ b/Net/tcpsnoop_snv
@@ -0,0 +1,583 @@
+#!/usr/bin/ksh
+#
+# tcpsnoop_snv - snoop TCP network packets by process.
+# Written using DTrace (Solaris Nevada)
+#
+# This analyses TCP network packets and prints the responsible PID and UID,
+# plus standard details such as IP address and port. This captures traffic
+# of newly created TCP connections that were established while this program
+# was running. It can help identify which processes is causing TCP traffic.
+#
+# WARNING: This script may only work on Solaris Nevada and OpenSolaris
+# of the late 2007 vintage, since it uses the fbt provider to trace the raw
+# operation of a specific version of the kernel. In the future, a 'stable'
+# network provider should exist which will allow this to be written for that
+# and subsequent versions of the kernel. In the meantime, check for other
+# versions of this script in the /Net directory, and read the
+# Notes/ALLfbt_notes.txt for more background on fbt.
+#
+# $Id: tcpsnoop_snv 69 2007-10-04 13:40:00Z brendan $
+#
+# USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid]
+#
+# -a # print all data
+# -j # print project ID
+# -s # print time, us
+# -v # print time, string
+# -Z # print zone ID
+# -n name # command name to snoop
+# -p pid # PID to snoop
+# eg,
+# tcpsnoop -v # human readable timestamps
+# tcpsnoop -Z # print zonename
+# tcpsnoop -n sshd # snoop sshd traffic only
+#
+# FIELDS:
+# UID user ID
+# PID process ID
+# CMD command
+# LADDR local IP address
+# RADDR remote IP address
+# LPORT local port number
+# RPORT remote port number
+# DR direction
+# SIZE packet size, bytes
+# TIME timestamp, us
+# STRTIME human readable timestamp, string
+# ZONE zone ID
+# PROJ project ID
+#
+# SEE ALSO: snoop -rS
+#
+# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# TODO: IPv6
+#
+# CODE:
+# The FILTER syntax matches on packets rather than initial
+# connections, so that it can follow inetd connections properly.
+#
+# 09-Jul-2004 Brendan Gregg Created this.
+# 12-Mar-2005 " " Changed probes, size info now printed.
+# 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d".
+# 04-Jul-2005 " " Now wrapped in shell, called "tcpsnoop".
+# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct
+# execname. Thanks Kias Belgaied for expertise.
+# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+.
+# 20-Apr-2006 " " Last update.
+# 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada.
+#
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_name=0; opt_time=0; opt_timestr=0; filter=0; pname=.
+opt_zone=0; opt_proj=0; opt_pid=0; pid=0
+
+### process options
+while getopts ahjsvZn:p: name
+do
+ case $name in
+ a) opt_time=1; opt_timestr=1; opt_zone=1; opt_proj=1 ;;
+ n) opt_name=1; pname=$OPTARG ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ j) opt_proj=1 ;;
+ s) opt_time=1 ;;
+ v) opt_timestr=1 ;;
+ Z) opt_zone=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid]
+ tcpsnoop # default output
+ -a # print all data
+ -j # print project ID
+ -s # print start time, us
+ -v # print start time, string
+ -Z # print zonename
+ -n name # command name to snoop
+ -p pid # PID to snoop
+ eg,
+ tcpsnoop -v # human readable timestamps
+ tcpsnoop -Z # print zonename
+ tcpsnoop -n sshd # snoop sshd traffic only
+ END
+ exit 1
+ esac
+done
+
+### option logic
+if (( opt_name || opt_pid )); then
+ filter=1
+fi
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -Cs <( print -r '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_name = '$opt_name';
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_time = '$opt_time';
+ inline int OPT_timestr = '$opt_timestr';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_proj = '$opt_proj';
+ inline int PID = '$pid';
+ inline int FILTER = '$filter';
+ inline string NAME = "'$pname'";
+
+#pragma D option quiet
+#pragma D option switchrate=10hz
+
+#include <sys/file.h>
+#include <inet/common.h>
+#include <sys/byteorder.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ /* print optional headers */
+ OPT_time ? printf("%-14s ", "TIME") : 1;
+ OPT_timestr ? printf("%-20s ", "STRTIME") : 1;
+ OPT_zone ? printf("%4s ", "ZONE") : 1;
+ OPT_proj ? printf("%4s ", "PROJ") : 1;
+
+ /* print main headers */
+ printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n",
+ "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT",
+ "SIZE", "CMD");
+}
+
+
+/*
+ * TCP Process inbound connections
+ *
+ * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was
+ * renamed to SS_DIRECT around build 31.
+ */
+fbt:sockfs:sotpi_accept:entry
+/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/
+{
+ self->sop = args[0];
+}
+
+fbt:sockfs:sotpi_create:return
+/self->sop/
+{
+ self->nsop = (struct sonode *)arg1;
+}
+
+fbt:sockfs:sotpi_accept:return
+/self->nsop/
+{
+ this->tcpp = (tcp_t *)self->nsop->so_priv;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+}
+
+fbt:sockfs:sotpi_accept:return
+{
+ self->nsop = 0;
+ self->sop = 0;
+}
+
+/*
+ * TCP Process outbound connections
+ */
+fbt:ip:tcp_connect:entry
+{
+ this->tcpp = (tcp_t *)arg0;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+ OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1;
+}
+
+/*
+ * TCP Data translations
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ /* fetch ports */
+#if defined(_BIG_ENDIAN)
+ self->lport = self->connp->u_port.tcpu_ports.tcpu_lport;
+ self->fport = self->connp->u_port.tcpu_ports.tcpu_fport;
+#else
+ self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport);
+ self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport);
+#endif
+
+ /* fetch IPv4 addresses */
+ this->fad12 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12];
+ this->fad13 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13];
+ this->fad14 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14];
+ this->fad15 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15];
+ this->lad12 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12];
+ this->lad13 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13];
+ this->lad14 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14];
+ this->lad15 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15];
+
+ /* convert type for use with lltostr() */
+ this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12;
+ this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13;
+ this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14;
+ this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15;
+ this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12;
+ this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13;
+ this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14;
+ this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15;
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ /* fix direction and save values */
+ tladdr[(int)self->connp] = self->laddr;
+ tfaddr[(int)self->connp] = self->faddr;
+ tlport[(int)self->connp] = self->lport;
+ tfport[(int)self->connp] = self->fport;
+
+ /* all systems go */
+ tok[(int)self->connp] = 1;
+}
+
+/*
+ * TCP Clear connp
+ */
+fbt:ip:tcp_get_conn:return
+{
+ /* Q_TO_CONN */
+ this->connp = (conn_t *)arg1;
+ tok[(int)this->connp] = 0;
+ tpid[(int)this->connp] = 0;
+ tuid[(int)this->connp] = 0;
+ tname[(int)this->connp] = 0;
+ tproj[(int)this->connp] = 0;
+}
+
+/*
+ * TCP Process "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:entry
+/FILTER == 0/
+{
+ this->queuep = args[7]->tcps_g_q;
+ this->connp = (conn_t *)this->queuep->q_ptr;
+ this->tcpp = (tcp_t *)this->connp->conn_tcp;
+ self->zoneid = this->connp->conn_zoneid;
+
+ /* split addresses */
+ this->ipha = (ipha_t *)args[1]->b_rptr;
+ this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24;
+ this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16;
+ this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8;
+ this->fad12 = (this->ipha->ipha_src & 0x000000ff);
+ this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24;
+ this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16;
+ this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8;
+ this->lad12 = (this->ipha->ipha_dst & 0x000000ff);
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ self->reset = 1;
+}
+
+/*
+ * TCP Fetch "port closed" ports
+ */
+fbt:ip:tcp_xchg:entry
+/self->reset/
+{
+#if defined(_BIG_ENDIAN)
+ self->lport = (uint16_t)arg0;
+ self->fport = (uint16_t)arg1;
+#else
+ self->lport = BSWAP_16((uint16_t)arg0);
+ self->fport = BSWAP_16((uint16_t)arg1);
+#endif
+ self->lport = BE16_TO_U16(arg0);
+ self->fport = BE16_TO_U16(arg1);
+}
+
+/*
+ * TCP Print "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:return
+/FILTER == 0/
+{
+ self->name = "<closed>";
+ self->pid = 0;
+ self->uid = 0;
+ self->proj = 0;
+ self->size = 54; /* should check trailers */
+ self->dir = "<-";
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "->";
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->reset = 0;
+ self->size = 0;
+ self->name = 0;
+ self->zoneid = 0;
+}
+
+/*
+ * TCP Process Write
+ */
+fbt:ip:tcp_send_data:entry
+{
+ self->conn_p = (conn_t *)args[0]->tcp_connp;
+}
+
+fbt:ip:tcp_send_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->dir = "->";
+ self->size = msgdsize(args[2]) + 14; /* should check trailers */
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
+ self->zoneid = self->conn_p->conn_zoneid;
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Process Read
+ */
+fbt:ip:tcp_rput_data:entry
+{
+ self->conn_p = (conn_t *)arg0;
+ self->size = msgdsize(args[1]) + 14; /* should check trailers */
+}
+
+fbt:ip:tcp_rput_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->dir = "<-";
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
+ self->zoneid = self->conn_p->conn_zoneid;
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Complete printing outbound handshake
+ */
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->zoneid = self->connp->conn_zoneid;
+ OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
+ self->size = 54; /* should check trailers */
+ self->dir = "->";
+}
+
+fbt:ip:tcp_connect:return
+/(self->connp) &&
+ ((FILTER == 0) ||
+ (OPT_pid && self->pid == PID) ||
+ (OPT_name && self->name == NAME))/
+{
+ /* this packet occured before connp was fully established */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * TCP Complete printing inbound handshake
+ */
+fbt:sockfs:sotpi_accept:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->zoneid = self->connp->conn_zoneid;
+ OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
+ self->size = 54; /* should check trailers */
+ self->dir = "<-";
+}
+
+fbt:sockfs:sotpi_accept:return
+/(self->connp) &&
+ ((FILTER == 0) ||
+ (OPT_pid && self->pid == PID) ||
+ (OPT_name && self->name == NAME))/
+{
+ /* these packets occured before connp was fully established */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "->";
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "<-";
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * Print output
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+/(self->ok == 2) &&
+ ((FILTER == 0) ||
+ (OPT_pid && self->pid == PID) ||
+ (OPT_name && self->name == NAME))/
+{
+ /* print optional fields */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%4d ", self->zoneid) : 1;
+ OPT_proj ? printf("%4d ", self->proj) : 1;
+
+ /* print output line */
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * TCP Clear connect variables
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->faddr = 0;
+ self->laddr = 0;
+ self->fport = 0;
+ self->lport = 0;
+ self->connp = 0;
+ self->name = 0;
+ self->pid = 0;
+ self->uid = 0;
+}
+
+/*
+ * TCP Clear r/w variables
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+{
+ self->ok = 0;
+ self->dir = 0;
+ self->uid = 0;
+ self->pid = 0;
+ self->size = 0;
+ self->name = 0;
+ self->lport = 0;
+ self->fport = 0;
+ self->laddr = 0;
+ self->faddr = 0;
+ self->conn_p = 0;
+ self->zoneid = 0;
+ self->proj = 0;
+}
+')
diff --git a/Net/tcpsnoop_snv.d b/Net/tcpsnoop_snv.d
new file mode 100755
index 000000000000..b696f0e46619
--- /dev/null
+++ b/Net/tcpsnoop_snv.d
@@ -0,0 +1,426 @@
+#!/usr/sbin/dtrace -Cs
+/*
+ * tcpsnoop_snv.d - snoop TCP network packets by process.
+ * Written using DTrace (Solaris Nevada)
+ *
+ * This analyses TCP network packets and prints the responsible PID and UID,
+ * plus standard details such as IP address and port. This captures traffic
+ * of newly created TCP connections that were established while this program
+ * was running. It can help identify which processes is causing TCP traffic.
+ *
+ * WARNING: This script may only work on Solaris Nevada and OpenSolaris
+ * of the late 2007 vintage, since it uses the fbt provider to trace the raw
+ * operation of a specific version of the kernel. In the future, a 'stable'
+ * network provider should exist which will allow this to be written for that
+ * and subsequent versions of the kernel. In the meantime, check for other
+ * versions of this script in the /Net directory, and read the
+ * Notes/ALLfbt_notes.txt for more background on fbt.
+ *
+ * $Id: tcpsnoop_snv.d 69 2007-10-04 13:40:00Z brendan $
+ *
+ * USAGE: tcpsnoop.d
+ *
+ * FIELDS:
+ * UID user ID
+ * PID process ID
+ * CMD command
+ * LADDR local IP address
+ * RADDR remote IP address
+ * LPORT local port number
+ * RPORT remote port number
+ * DR direction
+ * SIZE packet size, bytes
+ *
+ * SEE ALSO: snoop -rS
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * Author: Brendan Gregg [Sydney, Australia]
+ *
+ * TODO: IPv6
+ *
+ * 09-Jul-2004 Brendan Gregg Created this.
+ * 12-Mar-2005 " " Changed probes, size info now printed.
+ * 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d".
+ * 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct
+ * execname. Thanks Kias Belgaied for expertise.
+ * 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+.
+ * 20-Apr-2006 " " Last update.
+ * 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10hz
+
+#include <sys/file.h>
+#include <inet/common.h>
+#include <sys/byteorder.h>
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ /* print main headers */
+ printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n",
+ "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT",
+ "SIZE", "CMD");
+}
+
+/*
+ * TCP Process inbound connections
+ *
+ * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was
+ * renamed to SS_DIRECT around build 31.
+ */
+fbt:sockfs:sotpi_accept:entry
+/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/
+{
+ self->sop = args[0];
+}
+
+fbt:sockfs:sotpi_create:return
+/self->sop/
+{
+ self->nsop = (struct sonode *)arg1;
+}
+
+fbt:sockfs:sotpi_accept:return
+/self->nsop/
+{
+ this->tcpp = (tcp_t *)self->nsop->so_priv;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+}
+
+fbt:sockfs:sotpi_accept:return
+{
+ self->nsop = 0;
+ self->sop = 0;
+}
+
+/*
+ * TCP Process outbound connections
+ */
+fbt:ip:tcp_connect:entry
+{
+ this->tcpp = (tcp_t *)arg0;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+}
+
+/*
+ * TCP Data translations
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ /* fetch ports */
+#if defined(_BIG_ENDIAN)
+ self->lport = self->connp->u_port.tcpu_ports.tcpu_lport;
+ self->fport = self->connp->u_port.tcpu_ports.tcpu_fport;
+#else
+ self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport);
+ self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport);
+#endif
+
+ /* fetch IPv4 addresses */
+ this->fad12 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12];
+ this->fad13 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13];
+ this->fad14 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14];
+ this->fad15 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15];
+ this->lad12 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12];
+ this->lad13 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13];
+ this->lad14 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14];
+ this->lad15 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15];
+
+ /* convert type for use with lltostr() */
+ this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12;
+ this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13;
+ this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14;
+ this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15;
+ this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12;
+ this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13;
+ this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14;
+ this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15;
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ /* fix direction and save values */
+ tladdr[(int)self->connp] = self->laddr;
+ tfaddr[(int)self->connp] = self->faddr;
+ tlport[(int)self->connp] = self->lport;
+ tfport[(int)self->connp] = self->fport;
+
+ /* all systems go */
+ tok[(int)self->connp] = 1;
+}
+
+/*
+ * TCP Clear connp
+ */
+fbt:ip:tcp_get_conn:return
+{
+ /* Q_TO_CONN */
+ this->connp = (conn_t *)arg1;
+ tok[(int)this->connp] = 0;
+ tpid[(int)this->connp] = 0;
+ tuid[(int)this->connp] = 0;
+ tname[(int)this->connp] = 0;
+}
+
+/*
+ * TCP Process "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:entry
+{
+ this->queuep = args[7]->tcps_g_q;
+ this->connp = (conn_t *)this->queuep->q_ptr;
+ this->tcpp = (tcp_t *)this->connp->conn_tcp;
+
+ /* split addresses */
+ this->ipha = (ipha_t *)args[1]->b_rptr;
+ this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24;
+ this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16;
+ this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8;
+ this->fad12 = (this->ipha->ipha_src & 0x000000ff);
+ this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24;
+ this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16;
+ this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8;
+ this->lad12 = (this->ipha->ipha_dst & 0x000000ff);
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ self->reset = 1;
+}
+
+/*
+ * TCP Fetch "port closed" ports
+ */
+fbt:ip:tcp_xchg:entry
+/self->reset/
+{
+#if defined(_BIG_ENDIAN)
+ self->lport = (uint16_t)arg0;
+ self->fport = (uint16_t)arg1;
+#else
+ self->lport = BSWAP_16((uint16_t)arg0);
+ self->fport = BSWAP_16((uint16_t)arg1);
+#endif
+ self->lport = BE16_TO_U16(arg0);
+ self->fport = BE16_TO_U16(arg1);
+}
+
+/*
+ * TCP Print "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:return
+{
+ self->name = "<closed>";
+ self->pid = 0;
+ self->uid = 0;
+ self->size = 54; /* should check trailers */
+ self->dir = "<-";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "->";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->reset = 0;
+ self->size = 0;
+ self->name = 0;
+}
+
+/*
+ * TCP Process Write
+ */
+fbt:ip:tcp_send_data:entry
+{
+ self->conn_p = (conn_t *)args[0]->tcp_connp;
+}
+
+fbt:ip:tcp_send_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->dir = "->";
+ self->size = msgdsize(args[2]) + 14; /* should check trailers */
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Process Read
+ */
+fbt:ip:tcp_rput_data:entry
+{
+ self->conn_p = (conn_t *)arg0;
+ self->size = msgdsize(args[1]) + 14; /* should check trailers */
+}
+
+fbt:ip:tcp_rput_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->dir = "<-";
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Complete printing outbound handshake
+ */
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->size = 54; /* should check trailers */
+ self->dir = "->";
+ /* this packet occured before connp was fully established */
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * TCP Complete printing inbound handshake
+ */
+fbt:sockfs:sotpi_accept:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->size = 54; /* should check trailers */
+ /* these packets occured before connp was fully established */
+ self->dir = "<-";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "->";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+ self->dir = "<-";
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * Print output
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+/self->ok == 2/
+{
+ /* print output line */
+ printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n",
+ self->uid, self->pid, self->laddr, self->lport, self->dir,
+ self->faddr, self->fport, self->size, self->name);
+}
+
+/*
+ * TCP Clear connect variables
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->faddr = 0;
+ self->laddr = 0;
+ self->fport = 0;
+ self->lport = 0;
+ self->connp = 0;
+ self->name = 0;
+ self->pid = 0;
+ self->uid = 0;
+}
+
+/*
+ * TCP Clear r/w variables
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+{
+ self->ok = 0;
+ self->dir = 0;
+ self->uid = 0;
+ self->pid = 0;
+ self->size = 0;
+ self->name = 0;
+ self->lport = 0;
+ self->fport = 0;
+ self->laddr = 0;
+ self->faddr = 0;
+ self->conn_p = 0;
+}
diff --git a/Net/tcpstat.d b/Net/tcpstat.d
new file mode 100755
index 000000000000..1fe40040c6d1
--- /dev/null
+++ b/Net/tcpstat.d
@@ -0,0 +1,91 @@
+#!/usr/sbin/dtrace -s
+/*
+ * tcpstat.d - print TCP statistics. Uses DTrace.
+ *
+ * This prints TCP statistics every second, retrieved from the MIB provider.
+ *
+ * $Id: tcpstat.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: tcpstat.d
+ *
+ * FIELDS:
+ * TCP_out TCP bytes sent
+ * TCP_outRe TCP bytes retransmitted
+ * TCP_in TCP bytes received
+ * TCP_inDup TCP bytes received duplicated
+ * TCP_inUn TCP bytes received out of order
+ *
+ * The above TCP statistics are documented in the mib2_tcp struct
+ * in the /usr/include/inet/mib2.h file; and also in the mib provider
+ * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223.
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 15-May-2005 Brendan Gregg Created this.
+ * 15-May-2005 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Declare Globals
+ */
+dtrace:::BEGIN
+{
+ TCP_out = 0; TCP_outRe = 0;
+ TCP_in = 0; TCP_inDup = 0; TCP_inUn = 0;
+ LINES = 20; line = 0;
+}
+
+/*
+ * Print Header
+ */
+profile:::tick-1sec { line--; }
+
+profile:::tick-1sec
+/line <= 0 /
+{
+ printf("%11s %11s %11s %11s %11s\n",
+ "TCP_out", "TCP_outRe", "TCP_in", "TCP_inDup", "TCP_inUn");
+
+ line = LINES;
+}
+
+/*
+ * Save Data
+ */
+mib:::tcpOutDataBytes { TCP_out += arg0; }
+mib:::tcpRetransBytes { TCP_outRe += arg0; }
+mib:::tcpInDataInorderBytes { TCP_in += arg0; }
+mib:::tcpInDataDupBytes { TCP_inDup += arg0; }
+mib:::tcpInDataUnorderBytes { TCP_inUn += arg0; }
+
+/*
+ * Print Output
+ */
+profile:::tick-1sec
+{
+ printf("%11d %11d %11d %11d %11d\n",
+ TCP_out, TCP_outRe, TCP_in, TCP_inDup, TCP_inUn);
+
+ /* clear values */
+ TCP_out = 0;
+ TCP_outRe = 0;
+ TCP_in = 0;
+ TCP_inDup = 0;
+ TCP_inUn = 0;
+}
diff --git a/Net/tcptop b/Net/tcptop
new file mode 100755
index 000000000000..70b6e6f3176e
--- /dev/null
+++ b/Net/tcptop
@@ -0,0 +1,579 @@
+#!/usr/bin/ksh
+#
+# tcptop - display top TCP network packets by process.
+# Written using DTrace (Solaris 10 3/05)
+#
+# This analyses TCP network packets and prints the responsible PID and UID,
+# plus standard details such as IP address and port. This captures traffic
+# of newly created TCP connections that were established while this program
+# was running. It can help identify which processes is causing TCP traffic.
+#
+# WARNING: This script may only work on Solaris 10 3/05, since it uses the
+# fbt provider to trace the raw operation of a specific version of the kernel.
+# In the future, a 'stable' network provider should exist which will allow
+# this to be written for that and subsequent versions of the kernel. In the
+# meantime, check for other versions of this script in the /Net directory,
+# and read the Notes/ALLfbt_notes.txt for more background on fbt.
+#
+# $Id: tcptop 69 2007-10-04 13:40:00Z brendan $
+#
+# USAGE: tcptop [-Ch] [-j|-Z] [interval [count]]
+#
+# -C # don't clear the screen
+# -j # print project IDs
+# -Z # print zone IDs
+#
+# FIELDS:
+# UID user ID
+# PID process ID
+# CMD command
+# LADDR local IP address
+# RADDR remote IP address
+# LPORT local port number
+# RPORT remote port number
+# SIZE packet size, bytes
+# load 1 min load average
+# TCPin TCP inbound payload data
+# TCPout TCP outbound payload data
+# ZONE zone ID
+# PROJ project ID
+#
+# SEE ALSO: tcpsnoop
+#
+# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# ToDo: IPv6
+#
+# 05-Jul-2005 Brendan Gregg Created this.
+# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct
+# execname. Thanks Kias Belgaied for expertise.
+# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+.
+# 20-Apr-2006 " " Last update.
+#
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_def=1; opt_clear=1; opt_zone=0; opt_proj=0; interval=5; count=-1
+
+### process options
+while getopts ChjZ name
+do
+ case $name in
+ C) opt_clear=0 ;;
+ j) opt_proj=1; opt_def=0 ;;
+ Z) opt_zone=1; opt_def=0 ;;
+ h|?) cat <<-END >&2
+ USAGE: tcptop [-h] [-j|-Z] [interval [count]]
+ tcptop # default output
+ -C # don't clear the screen
+ -j # print project ID
+ -Z # print zonename
+ eg,
+ tcptop # default is 5 sec interval
+ tcptop 2 # 2 second interval
+ tcptop -C 1 10 # 10 x 1 sec samples, no clear
+ END
+ exit 1
+ esac
+done
+shift $(( $OPTIND - 1 ))
+
+### option logic
+if [[ "$1" > 0 ]]; then
+ interval=$1; shift
+fi
+if [[ "$1" > 0 ]]; then
+ count=$1; shift
+fi
+if (( opt_proj && opt_zone )); then
+ opt_proj=0
+fi
+if (( opt_clear )); then
+ clearstr=`clear`
+else
+ clearstr=.
+fi
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -Cs <( print -r '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_def = '$opt_def';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_proj = '$opt_proj';
+ inline int OPT_clear = '$opt_clear';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+ inline string CLEAR = "'$clearstr'";
+
+#pragma D option quiet
+#pragma D option switchrate=10hz
+
+#include <sys/file.h>
+#include <inet/common.h>
+#include <sys/byteorder.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ /* starting values */
+ counts = COUNTER;
+ secs = INTERVAL;
+ TCP_out = 0;
+ TCP_in = 0;
+
+ printf("Tracing... Please wait.\n");
+}
+
+/*
+ * TCP Process inbound connections
+ *
+ * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was
+ * renamed to SS_DIRECT around build 31.
+ */
+fbt:sockfs:sotpi_accept:entry
+/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/
+{
+ self->sop = args[0];
+}
+
+fbt:sockfs:sotpi_create:return
+/self->sop/
+{
+ self->nsop = (struct sonode *)arg1;
+}
+
+fbt:sockfs:sotpi_accept:return
+/self->nsop/
+{
+ this->tcpp = (tcp_t *)self->nsop->so_priv;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+}
+
+fbt:sockfs:sotpi_accept:return
+{
+ self->nsop = 0;
+ self->sop = 0;
+}
+
+/*
+ * TCP Process outbound connections
+ */
+fbt:ip:tcp_connect:entry
+{
+ this->tcpp = (tcp_t *)arg0;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+ OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1;
+}
+
+/*
+ * TCP Data translations
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ /* fetch ports */
+#if defined(_BIG_ENDIAN)
+ self->lport = self->connp->u_port.tcpu_ports.tcpu_lport;
+ self->fport = self->connp->u_port.tcpu_ports.tcpu_fport;
+#else
+ self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport);
+ self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport);
+#endif
+
+ /* fetch IPv4 addresses */
+ this->fad12 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12];
+ this->fad13 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13];
+ this->fad14 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14];
+ this->fad15 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15];
+ this->lad12 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12];
+ this->lad13 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13];
+ this->lad14 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14];
+ this->lad15 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15];
+
+ /* convert type for use with lltostr() */
+ this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12;
+ this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13;
+ this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14;
+ this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15;
+ this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12;
+ this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13;
+ this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14;
+ this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15;
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ /* fix direction and save values */
+ tladdr[(int)self->connp] = self->laddr;
+ tfaddr[(int)self->connp] = self->faddr;
+ tlport[(int)self->connp] = self->lport;
+ tfport[(int)self->connp] = self->fport;
+
+ /* all systems go */
+ tok[(int)self->connp] = 1;
+}
+
+/*
+ * TCP Clear connp
+ */
+fbt:ip:tcp_get_conn:return
+{
+ /* Q_TO_CONN */
+ this->connp = (conn_t *)arg1;
+ tok[(int)this->connp] = 0;
+ tpid[(int)this->connp] = 0;
+ tuid[(int)this->connp] = 0;
+ tname[(int)this->connp] = 0;
+ tproj[(int)this->connp] = 0;
+}
+
+/*
+ * TCP Process "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:entry
+{
+ this->queuep = (queue_t *)`tcp_g_q; /* ` */
+ this->connp = (conn_t *)this->queuep->q_ptr;
+ this->tcpp = (tcp_t *)this->connp->conn_tcp;
+ self->zoneid = this->connp->conn_zoneid;
+
+ /* split addresses */
+ this->ipha = (ipha_t *)args[1]->b_rptr;
+ this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24;
+ this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16;
+ this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8;
+ this->fad12 = (this->ipha->ipha_src & 0x000000ff);
+ this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24;
+ this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16;
+ this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8;
+ this->lad12 = (this->ipha->ipha_dst & 0x000000ff);
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ self->reset = 1;
+}
+
+/*
+ * TCP Fetch "port closed" ports
+ */
+fbt:ip:tcp_xchg:entry
+/self->reset/
+{
+#if defined(_BIG_ENDIAN)
+ self->lport = (uint16_t)arg0;
+ self->fport = (uint16_t)arg1;
+#else
+ self->lport = BSWAP_16((uint16_t)arg0);
+ self->fport = BSWAP_16((uint16_t)arg1);
+#endif
+ self->lport = BE16_TO_U16(arg0);
+ self->fport = BE16_TO_U16(arg1);
+}
+
+/*
+ * TCP Print "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:return
+{
+ self->name = "<closed>";
+ self->pid = 0;
+ self->uid = 0;
+ self->proj = 0;
+ self->size = 54 * 2; /* should check trailers */
+ OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ self->reset = 0;
+ self->size = 0;
+ self->name = 0;
+}
+
+/*
+ * TCP Process Write
+ */
+fbt:ip:tcp_send_data:entry
+{
+ self->conn_p = (conn_t *)args[0]->tcp_connp;
+}
+
+fbt:ip:tcp_send_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->size = msgdsize(args[2]) + 14; /* should check trailers */
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
+ self->zoneid = self->conn_p->conn_zoneid;
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Process Read
+ */
+fbt:ip:tcp_rput_data:entry
+{
+ self->conn_p = (conn_t *)arg0;
+ self->size = msgdsize(args[1]) + 14; /* should check trailers */
+}
+
+fbt:ip:tcp_rput_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
+ self->zoneid = self->conn_p->conn_zoneid;
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Complete printing outbound handshake
+ */
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->zoneid = self->connp->conn_zoneid;
+ OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
+ self->size = 54; /* should check trailers */
+
+ /* this packet occured before connp was fully established */
+ OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+}
+
+/*
+ * TCP Complete printing inbound handshake
+ */
+fbt:sockfs:sotpi_accept:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->zoneid = self->connp->conn_zoneid;
+ OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
+ self->size = 54 * 3; /* should check trailers */
+
+ /* these packets occured before connp was fully established */
+ OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+}
+
+/*
+ * TCP Save data
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+/self->ok == 2/
+{
+ /* save r+w data*/
+ OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+}
+
+/*
+ * TCP Clear connect variables
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->faddr = 0;
+ self->laddr = 0;
+ self->fport = 0;
+ self->lport = 0;
+ self->connp = 0;
+ self->name = 0;
+ self->pid = 0;
+ self->uid = 0;
+}
+
+/*
+ * TCP Clear r/w variables
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+{
+ self->ok = 0;
+ self->uid = 0;
+ self->pid = 0;
+ self->size = 0;
+ self->name = 0;
+ self->lport = 0;
+ self->fport = 0;
+ self->laddr = 0;
+ self->faddr = 0;
+ self->conn_p = 0;
+ self->zoneid = 0;
+ self->proj = 0;
+}
+
+/*
+ * TCP Systemwide Stats
+ */
+mib:::tcpOutDataBytes { TCP_out += args[0]; }
+mib:::tcpRetransBytes { TCP_out += args[0]; }
+mib:::tcpInDataInorderBytes { TCP_in += args[0]; }
+mib:::tcpInDataDupBytes { TCP_in += args[0]; }
+mib:::tcpInDataUnorderBytes { TCP_in += args[0]; }
+
+/*
+ * Timer
+ */
+profile:::tick-1sec
+{
+ secs--;
+}
+
+/*
+ * Print Report
+ */
+profile:::tick-1sec
+/secs == 0/
+{
+ /* fetch 1 min load average */
+ this->load1a = `hp_avenrun[0] / 65536;
+ this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536;
+
+ /* convert TCP counters to Kbytes */
+ TCP_out /= 1024;
+ TCP_in /= 1024;
+
+ /* print status */
+ OPT_clear ? printf("%s", CLEAR) : 1;
+ printf("%Y, load: %d.%02d, TCPin: %6d KB, TCPout: %6d KB\n\n",
+ walltimestamp, this->load1a, this->load1b, TCP_in, TCP_out);
+
+ /* print headers */
+ OPT_def ? printf(" UID ") : 1;
+ OPT_proj ? printf("PROJ ") : 1;
+ OPT_zone ? printf("ZONE ") : 1;
+ printf("%6s %-15s %5s %-15s %5s %9s %s\n",
+ "PID", "LADDR", "LPORT", "RADDR", "RPORT", "SIZE", "NAME");
+
+ /* print data */
+ printa("%4d %6d %-15s %5d %-15s %5d %@9d %s\n", @out);
+ printf("\n");
+
+ /* clear data */
+ trunc(@out);
+ TCP_in = 0;
+ TCP_out = 0;
+ secs = INTERVAL;
+ counts--;
+}
+
+/*
+ * End of program
+ */
+profile:::tick-1sec
+/counts == 0/
+{
+ exit(0);
+}
+
+/*
+ * Cleanup for Ctrl-C
+ */
+dtrace:::END
+{
+ trunc(@out);
+}
+')
diff --git a/Net/tcptop_snv b/Net/tcptop_snv
new file mode 100755
index 000000000000..56714e3c01f4
--- /dev/null
+++ b/Net/tcptop_snv
@@ -0,0 +1,581 @@
+#!/usr/bin/ksh
+#
+# tcptop_snv - display top TCP network packets by process.
+# Written using DTrace (Solaris Nevada)
+#
+# This analyses TCP network packets and prints the responsible PID and UID,
+# plus standard details such as IP address and port. This captures traffic
+# of newly created TCP connections that were established while this program
+# was running. It can help identify which processes is causing TCP traffic.
+#
+# WARNING: This script may only work on Solaris Nevada and OpenSolaris
+# of the late 2007 vintage, since it uses the fbt provider to trace the raw
+# operation of a specific version of the kernel. In the future, a 'stable'
+# network provider should exist which will allow this to be written for that
+# and subsequent versions of the kernel. In the meantime, check for other
+# versions of this script in the /Net directory, and read the
+# Notes/ALLfbt_notes.txt for more background on fbt.
+#
+# $Id: tcptop_snv 69 2007-10-04 13:40:00Z brendan $
+#
+# USAGE: tcptop [-Ch] [-j|-Z] [interval [count]]
+#
+# -C # don't clear the screen
+# -j # print project IDs
+# -Z # print zone IDs
+#
+# FIELDS:
+# UID user ID
+# PID process ID
+# CMD command
+# LADDR local IP address
+# RADDR remote IP address
+# LPORT local port number
+# RPORT remote port number
+# SIZE packet size, bytes
+# load 1 min load average
+# TCPin TCP inbound payload data
+# TCPout TCP outbound payload data
+# ZONE zone ID
+# PROJ project ID
+#
+# SEE ALSO: tcpsnoop
+#
+# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# ToDo: IPv6
+#
+# 05-Jul-2005 Brendan Gregg Created this.
+# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct
+# execname. Thanks Kias Belgaied for expertise.
+# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+.
+# 20-Apr-2006 " " Last update.
+# 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada.
+#
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_def=1; opt_clear=1; opt_zone=0; opt_proj=0; interval=5; count=-1
+
+### process options
+while getopts ChjZ name
+do
+ case $name in
+ C) opt_clear=0 ;;
+ j) opt_proj=1; opt_def=0 ;;
+ Z) opt_zone=1; opt_def=0 ;;
+ h|?) cat <<-END >&2
+ USAGE: tcptop [-h] [-j|-Z] [interval [count]]
+ tcptop # default output
+ -C # don't clear the screen
+ -j # print project ID
+ -Z # print zonename
+ eg,
+ tcptop # default is 5 sec interval
+ tcptop 2 # 2 second interval
+ tcptop -C 1 10 # 10 x 1 sec samples, no clear
+ END
+ exit 1
+ esac
+done
+shift $(( $OPTIND - 1 ))
+
+### option logic
+if [[ "$1" > 0 ]]; then
+ interval=$1; shift
+fi
+if [[ "$1" > 0 ]]; then
+ count=$1; shift
+fi
+if (( opt_proj && opt_zone )); then
+ opt_proj=0
+fi
+if (( opt_clear )); then
+ clearstr=`clear`
+else
+ clearstr=.
+fi
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -Cs <( print -r '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_def = '$opt_def';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_proj = '$opt_proj';
+ inline int OPT_clear = '$opt_clear';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+ inline string CLEAR = "'$clearstr'";
+
+#pragma D option quiet
+#pragma D option switchrate=10hz
+
+#include <sys/file.h>
+#include <inet/common.h>
+#include <sys/byteorder.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ /* starting values */
+ counts = COUNTER;
+ secs = INTERVAL;
+ TCP_out = 0;
+ TCP_in = 0;
+
+ printf("Tracing... Please wait.\n");
+}
+
+/*
+ * TCP Process inbound connections
+ *
+ * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was
+ * renamed to SS_DIRECT around build 31.
+ */
+fbt:sockfs:sotpi_accept:entry
+/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/
+{
+ self->sop = args[0];
+}
+
+fbt:sockfs:sotpi_create:return
+/self->sop/
+{
+ self->nsop = (struct sonode *)arg1;
+}
+
+fbt:sockfs:sotpi_accept:return
+/self->nsop/
+{
+ this->tcpp = (tcp_t *)self->nsop->so_priv;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+}
+
+fbt:sockfs:sotpi_accept:return
+{
+ self->nsop = 0;
+ self->sop = 0;
+}
+
+/*
+ * TCP Process outbound connections
+ */
+fbt:ip:tcp_connect:entry
+{
+ this->tcpp = (tcp_t *)arg0;
+ self->connp = (conn_t *)this->tcpp->tcp_connp;
+ tname[(int)self->connp] = execname;
+ tpid[(int)self->connp] = pid;
+ tuid[(int)self->connp] = uid;
+ OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1;
+}
+
+/*
+ * TCP Data translations
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ /* fetch ports */
+#if defined(_BIG_ENDIAN)
+ self->lport = self->connp->u_port.tcpu_ports.tcpu_lport;
+ self->fport = self->connp->u_port.tcpu_ports.tcpu_fport;
+#else
+ self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport);
+ self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport);
+#endif
+
+ /* fetch IPv4 addresses */
+ this->fad12 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12];
+ this->fad13 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13];
+ this->fad14 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14];
+ this->fad15 =
+ (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15];
+ this->lad12 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12];
+ this->lad13 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13];
+ this->lad14 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14];
+ this->lad15 =
+ (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15];
+
+ /* convert type for use with lltostr() */
+ this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12;
+ this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13;
+ this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14;
+ this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15;
+ this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12;
+ this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13;
+ this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14;
+ this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15;
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ /* fix direction and save values */
+ tladdr[(int)self->connp] = self->laddr;
+ tfaddr[(int)self->connp] = self->faddr;
+ tlport[(int)self->connp] = self->lport;
+ tfport[(int)self->connp] = self->fport;
+
+ /* all systems go */
+ tok[(int)self->connp] = 1;
+}
+
+/*
+ * TCP Clear connp
+ */
+fbt:ip:tcp_get_conn:return
+{
+ /* Q_TO_CONN */
+ this->connp = (conn_t *)arg1;
+ tok[(int)this->connp] = 0;
+ tpid[(int)this->connp] = 0;
+ tuid[(int)this->connp] = 0;
+ tname[(int)this->connp] = 0;
+ tproj[(int)this->connp] = 0;
+}
+
+/*
+ * TCP Process "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:entry
+{
+ this->queuep = args[7]->tcps_g_q;
+ this->connp = (conn_t *)this->queuep->q_ptr;
+ this->tcpp = (tcp_t *)this->connp->conn_tcp;
+ self->zoneid = this->connp->conn_zoneid;
+
+ /* split addresses */
+ this->ipha = (ipha_t *)args[1]->b_rptr;
+ this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24;
+ this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16;
+ this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8;
+ this->fad12 = (this->ipha->ipha_src & 0x000000ff);
+ this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24;
+ this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16;
+ this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8;
+ this->lad12 = (this->ipha->ipha_dst & 0x000000ff);
+
+ /* stringify addresses */
+ self->faddr = strjoin(lltostr(this->fad12), ".");
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
+ self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
+ self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
+ self->laddr = strjoin(lltostr(this->lad12), ".");
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
+ self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
+ self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
+
+ self->reset = 1;
+}
+
+/*
+ * TCP Fetch "port closed" ports
+ */
+fbt:ip:tcp_xchg:entry
+/self->reset/
+{
+#if defined(_BIG_ENDIAN)
+ self->lport = (uint16_t)arg0;
+ self->fport = (uint16_t)arg1;
+#else
+ self->lport = BSWAP_16((uint16_t)arg0);
+ self->fport = BSWAP_16((uint16_t)arg1);
+#endif
+ self->lport = BE16_TO_U16(arg0);
+ self->fport = BE16_TO_U16(arg1);
+}
+
+/*
+ * TCP Print "port closed"
+ */
+fbt:ip:tcp_xmit_early_reset:return
+{
+ self->name = "<closed>";
+ self->pid = 0;
+ self->uid = 0;
+ self->proj = 0;
+ self->size = 54 * 2; /* should check trailers */
+ OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ self->reset = 0;
+ self->size = 0;
+ self->name = 0;
+}
+
+/*
+ * TCP Process Write
+ */
+fbt:ip:tcp_send_data:entry
+{
+ self->conn_p = (conn_t *)args[0]->tcp_connp;
+}
+
+fbt:ip:tcp_send_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->size = msgdsize(args[2]) + 14; /* should check trailers */
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
+ self->zoneid = self->conn_p->conn_zoneid;
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Process Read
+ */
+fbt:ip:tcp_rput_data:entry
+{
+ self->conn_p = (conn_t *)arg0;
+ self->size = msgdsize(args[1]) + 14; /* should check trailers */
+}
+
+fbt:ip:tcp_rput_data:entry
+/tok[(int)self->conn_p]/
+{
+ self->uid = tuid[(int)self->conn_p];
+ self->laddr = tladdr[(int)self->conn_p];
+ self->faddr = tfaddr[(int)self->conn_p];
+ self->lport = tlport[(int)self->conn_p];
+ self->fport = tfport[(int)self->conn_p];
+ OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
+ self->zoneid = self->conn_p->conn_zoneid;
+ self->ok = 2;
+
+ /* follow inetd -> in.* transitions */
+ self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
+ execname : tname[(int)self->conn_p];
+ self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
+ pid : tpid[(int)self->conn_p];
+ tname[(int)self->conn_p] = self->name;
+ tpid[(int)self->conn_p] = self->pid;
+}
+
+/*
+ * TCP Complete printing outbound handshake
+ */
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->zoneid = self->connp->conn_zoneid;
+ OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
+ self->size = 54; /* should check trailers */
+
+ /* this packet occured before connp was fully established */
+ OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+}
+
+/*
+ * TCP Complete printing inbound handshake
+ */
+fbt:sockfs:sotpi_accept:return
+/self->connp/
+{
+ self->name = tname[(int)self->connp];
+ self->pid = tpid[(int)self->connp];
+ self->uid = tuid[(int)self->connp];
+ self->zoneid = self->connp->conn_zoneid;
+ OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
+ self->size = 54 * 3; /* should check trailers */
+
+ /* these packets occured before connp was fully established */
+ OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+}
+
+/*
+ * TCP Save data
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+/self->ok == 2/
+{
+ /* save r+w data*/
+ OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+ OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
+ self->faddr, self->fport, self->name] = sum(self->size) : 1;
+}
+
+/*
+ * TCP Clear connect variables
+ */
+fbt:sockfs:sotpi_accept:return,
+fbt:ip:tcp_connect:return
+/self->connp/
+{
+ self->faddr = 0;
+ self->laddr = 0;
+ self->fport = 0;
+ self->lport = 0;
+ self->connp = 0;
+ self->name = 0;
+ self->pid = 0;
+ self->uid = 0;
+}
+
+/*
+ * TCP Clear r/w variables
+ */
+fbt:ip:tcp_send_data:entry,
+fbt:ip:tcp_rput_data:entry
+{
+ self->ok = 0;
+ self->uid = 0;
+ self->pid = 0;
+ self->size = 0;
+ self->name = 0;
+ self->lport = 0;
+ self->fport = 0;
+ self->laddr = 0;
+ self->faddr = 0;
+ self->conn_p = 0;
+ self->zoneid = 0;
+ self->proj = 0;
+}
+
+/*
+ * TCP Systemwide Stats
+ */
+mib:::tcpOutDataBytes { TCP_out += args[0]; }
+mib:::tcpRetransBytes { TCP_out += args[0]; }
+mib:::tcpInDataInorderBytes { TCP_in += args[0]; }
+mib:::tcpInDataDupBytes { TCP_in += args[0]; }
+mib:::tcpInDataUnorderBytes { TCP_in += args[0]; }
+
+/*
+ * Timer
+ */
+profile:::tick-1sec
+{
+ secs--;
+}
+
+/*
+ * Print Report
+ */
+profile:::tick-1sec
+/secs == 0/
+{
+ /* fetch 1 min load average */
+ this->load1a = `hp_avenrun[0] / 65536;
+ this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536;
+
+ /* convert TCP counters to Kbytes */
+ TCP_out /= 1024;
+ TCP_in /= 1024;
+
+ /* print status */
+ OPT_clear ? printf("%s", CLEAR) : 1;
+ printf("%Y, load: %d.%02d, TCPin: %6d KB, TCPout: %6d KB\n\n",
+ walltimestamp, this->load1a, this->load1b, TCP_in, TCP_out);
+
+ /* print headers */
+ OPT_def ? printf(" UID ") : 1;
+ OPT_proj ? printf("PROJ ") : 1;
+ OPT_zone ? printf("ZONE ") : 1;
+ printf("%6s %-15s %5s %-15s %5s %9s %s\n",
+ "PID", "LADDR", "LPORT", "RADDR", "RPORT", "SIZE", "NAME");
+
+ /* print data */
+ printa("%4d %6d %-15s %5d %-15s %5d %@9d %s\n", @out);
+ printf("\n");
+
+ /* clear data */
+ trunc(@out);
+ TCP_in = 0;
+ TCP_out = 0;
+ secs = INTERVAL;
+ counts--;
+}
+
+/*
+ * End of program
+ */
+profile:::tick-1sec
+/counts == 0/
+{
+ exit(0);
+}
+
+/*
+ * Cleanup for Ctrl-C
+ */
+dtrace:::END
+{
+ trunc(@out);
+}
+')
diff --git a/Net/tcpwdist.d b/Net/tcpwdist.d
new file mode 100755
index 000000000000..20753c182f60
--- /dev/null
+++ b/Net/tcpwdist.d
@@ -0,0 +1,82 @@
+#!/usr/sbin/dtrace -s
+/*
+ * tcpwdist.d - simple TCP write distribution by process.
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * This measures the size of writes from applications to the TCP level, which
+ * may well be much larger than the MTU size (this is application writes not
+ * packet writes). It can help identify which process is creating network
+ * traffic, and the size of the writes by that application. It uses a simple
+ * probe that produces meaningful output for most protocols.
+ *
+ * Tracking TCP activity by process is complex for a number of reasons,
+ * the greatest is that inbound TCP traffic is asynchronous to the process.
+ * The easiest TCP traffic to match is writes, which this script demonstrates.
+ * However there are still issues - for an inbound telnet connection the
+ * writes are associated with the command, for example "ls -l", not something
+ * meaningful such as "in.telnetd".
+ *
+ * Scripts that match TCP traffic properly include tcpsnoop and tcptop.
+ *
+ * $Id: tcpwdist.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: tcpwdist.d # wait several seconds, then hit Ctrl-C
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD command and argument list
+ * value TCP write payload size in bytes
+ * count number of writes
+ *
+ * SEE ALSO: tcpsnoop, tcptop
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Jul-2004 Brendan Gregg Created this.
+ * 14-Jun-2005 " " Rewrote this as tcpwdist.d.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+/*
+ * Process TCP Write
+ */
+fbt:ip:tcp_output:entry
+{
+ /* fetch details */
+ this->size = msgdsize(args[1]);
+
+ /* store details */
+ @Size[pid, curpsinfo->pr_psargs] = quantize(this->size);
+}
+
+/*
+ * Print final report
+ */
+dtrace:::END
+{
+ printa(" PID: %-6d CMD: %S\n%@d\n", @Size);
+}
diff --git a/Net/udpstat.d b/Net/udpstat.d
new file mode 100755
index 000000000000..7b27e4ec0b89
--- /dev/null
+++ b/Net/udpstat.d
@@ -0,0 +1,92 @@
+#!/usr/sbin/dtrace -s
+/*
+ * udpstat.d - print UDP statistics. Uses DTrace.
+ *
+ * This prints UDP statistics every second, retrieved from the MIB provider.
+ *
+ * $Id: udpstat.d 59 2007-10-03 08:21:58Z brendan $
+ *
+ * USAGE: udpstat.d
+ *
+ * FIELDS:
+ * UDP_out UDP datagrams sent
+ * UDP_outErr UDP datagrams errored on send
+ * UDP_in UDP datagrams received
+ * UDP_inErr UDP datagrams undeliverable
+ * UDP_noPort UDP datagrams received to closed ports
+ *
+ * The above UDP statistics are documented in the mib2_udp struct
+ * in the /usr/include/inet/mib2.h file; and also in the mib provider
+ * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223.
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 25-Jul-2005 Brendan Gregg Created this.
+ * 25-Jul-2005 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Declare Globals
+ */
+dtrace:::BEGIN
+{
+ UDP_in = 0; UDP_out = 0;
+ UDP_inErr = 0; UDP_outErr = 0; UDP_noPort = 0;
+ LINES = 20; line = 0;
+}
+
+/*
+ * Print Header
+ */
+profile:::tick-1sec { line--; }
+
+profile:::tick-1sec
+/line <= 0 /
+{
+ printf("%11s %11s %11s %11s %11s\n",
+ "UDP_out", "UDP_outErr", "UDP_in", "UDP_inErr", "UDP_noPort");
+
+ line = LINES;
+}
+
+/*
+ * Save Data
+ */
+mib:::udp*InDatagrams { UDP_in += arg0; }
+mib:::udp*OutDatagrams { UDP_out += arg0; }
+mib:::udpInErrors { UDP_inErr += arg0; }
+mib:::udpInCksumErrs { UDP_inErr += arg0; }
+mib:::udpOutErrors { UDP_outErr += arg0; }
+mib:::udpNoPorts { UDP_noPort += arg0; }
+
+/*
+ * Print Output
+ */
+profile:::tick-1sec
+{
+ printf("%11d %11d %11d %11d %11d\n",
+ UDP_out, UDP_outErr, UDP_in, UDP_inErr, UDP_noPort);
+
+ /* clear values */
+ UDP_out = 0;
+ UDP_outErr = 0;
+ UDP_in = 0;
+ UDP_inErr = 0;
+ UDP_noPort = 0;
+}
diff --git a/Notes/ALLcolors_notes.txt b/Notes/ALLcolors_notes.txt
new file mode 100644
index 000000000000..bed6f9509b67
--- /dev/null
+++ b/Notes/ALLcolors_notes.txt
@@ -0,0 +1,127 @@
+**************************************************************************
+* The following are additional notes on all programs that print a colorized
+* ("colourised") output, *color*.d.
+*
+* $Id: ALLcolors_notes.txt 58 2007-10-01 13:36:29Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+* The colors aren't working, I see rubbish characters
+
+Try using a terminal that supports colors, such as gnome-terminal or dtterm.
+
+The following text should test the spectrum of colors for your terminal.
+Read this using "more" or "cat" (not "less" or "vim") to check if your
+terminal will print colors, and what they will look like:
+
+ Color Test String Dark Background
+ ---------------------------------------------------------
+ black color test color test
+ red color test color test
+ green color test color test
+ yellow color test color test
+ blue color test color test
+ magenta color test color test
+ cyan color test color test
+ white color test color test
+
+and now for a test of attributes:
+
+ Color Bold Faint
+ ---------------------------------------------------------
+ black color test color test
+ red color test color test
+ green color test color test
+ yellow color test color test
+ blue color test color test
+ magenta color test color test
+ cyan color test color test
+ white color test color test
+
+
+* Why so much green and violet in the toolkit scripts?
+
+As DTrace can examine the entire software stack, it is conceivable that
+your script could print events from many different layers each with their
+own color. Color scripts in the DTraceToolkit generally start by tracing
+two layers, with extra layers added by the end user as needed (you). The
+general plan is:
+
+ Software Layer Example Provider Color
+ -------------------------------------------------------
+ Dynamic Language perl violet
+ User Library pid:libperl blue
+ OS Library pid:libc cyan
+ System Calls syscall green
+ Kernel and Drivers fbt red
+
+How these colors will look will depend on your terminal software. Useful
+variations can be made, for example using red/bold for kernel abstraction
+providers (io, vminfo, ...); and red/faint for raw kernel tracing (fbt).
+
+The color examples in this toolkit usually trace the syscall and dynamic
+language layers, hense the green and violet.
+
+
+* I don't like the choosen terminal colors / your colors suck
+
+It should be easy to customize them by tweaking the script. I've tried
+to use the following convention for declaring colors in D scripts:
+
+ dtrace:::BEGIN
+ {
+ color_shell = "\033[2;35m"; /* violet, faint */
+ color_line = "\033[1;35m"; /* violet, bold */
+ color_syscall = "\033[2;32m"; /* green, faint */
+ color_off = "\033[0m"; /* default */
+ }
+
+That way, printf() statements can print these string variables to turn
+on and off colors, as needed. These strings contain an escape sequence to
+inform your terminal software to change the output color. Customizations
+can be made by tweaking the variables; refer to documentation for your
+terminal software to see what numbers will print what colors.
+
+For my terminal (dtterm), the numbers are (from dtterm(5)):
+
+ Attributes
+
+ 1 bold
+ 2 faint
+
+ Forground colors
+
+ 30 black
+ 31 red
+ 32 green
+ 33 yellow
+ 34 blue
+ 35 magenta
+ 36 cyan
+ 37 white
+
+ Background colors
+
+ 40 black
+ 41 red
+ ... etc, as above
+
+
+* I'd like to use this colored output on a website.
+
+The easiest way would be to change the script to output HTML rather than
+escape sequences. eg:
+
+ dtrace:::BEGIN
+ {
+ color_shell = "<font color=\"#FFAAFF\">"; /* violet, faint */
+ color_line = "<font color=\"#FF44FF\">"; /* violet, bold */
+ color_syscall = "<font color=\"#44CC44\">"; /* green, faint */
+ color_off = "</font>"; /* default */
+ }
+
+Other tweaks can be made to either print the output in a <pre> tagged block;
+or as seperate lines ending in <br> along with changing the font to be
+fixed width.
+
diff --git a/Notes/ALLelapsed_notes.txt b/Notes/ALLelapsed_notes.txt
new file mode 100644
index 000000000000..9e8f314feae2
--- /dev/null
+++ b/Notes/ALLelapsed_notes.txt
@@ -0,0 +1,46 @@
+**************************************************************************
+* The following are notes for all scripts that measure elapsed time.
+*
+* $Id: ALLelapsed_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* What is "elapsed" time?
+
+Elapsed time is the absolute time from one point to another. This time
+includes everything that happened between these points, including
+off-CPU time due to other system events such as I/O, scheduling,
+interrupts, etc. It also includes the small overheads of DTrace itself.
+
+Elapsed times are useful for identifying where latencies are, since
+regardless of their nature (CPU, I/O, ...), they will be visible in
+elapsed time.
+
+Since elapsed times don't filter out anything, they are suseptible to
+"noise" - random system events that are unrelated to the analysis target.
+For that reason, it may be best to take several measurements of elapsed
+time and take the average (or run your workload several times and let
+DTrace take the average).
+
+See Notes/ALLoncpu_notes.txt for a description of a different time
+measurement, "on-CPU" time.
+
+
+* How is "elapsed" time measured?
+
+In DTrace, the following template provides elapsed time as "this->elapsed",
+
+ <start-probe>
+ {
+ self->start = timestamp;
+ }
+
+ <end-probe>
+ {
+ this->elapsed = timestamp - self->start;
+ self->start = 0;
+ ...
+ }
+
diff --git a/Notes/ALLexclusive_notes.txt b/Notes/ALLexclusive_notes.txt
new file mode 100644
index 000000000000..7aeb9ffde84c
--- /dev/null
+++ b/Notes/ALLexclusive_notes.txt
@@ -0,0 +1,78 @@
+**************************************************************************
+* Notes for all scripts that print exclusive function times (or method,
+* or subroutine).
+*
+* $Id: ALLexclusive_notes.txt 45 2007-09-17 08:54:56Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* What is "exclusive" function time?
+
+This is the time of function execution, from when the function begins to
+when it completes, excluding the time spent executing any child function.
+
+Exclusive function time can be calculated like this,
+
+ exclusive function time = time(function end) - time(function start) -
+ time(total child exclusive time)
+
+To do this, the DTrace script needs to keep trace of child function execution
+time, so that it can be subtracted from the parent execution time.
+
+Consider this Bourne shell program,
+ 1 #!./sh
+ 2
+ 3 func_c()
+ 4 {
+ 5 echo "Function C"
+ 6 sleep 1
+ 7 }
+ 8
+ 9 func_b()
+ 10 {
+ 11 echo "Function B"
+ 12 sleep 1
+ 13 func_c
+ 14 }
+ 15
+ 16 func_a()
+ 17 {
+ 18 echo "Function A"
+ 19 sleep 1
+ 20 func_b
+ 21 }
+ 22
+ 23 func_a
+
+func_a() calls func_b() which calls func_c(). Tracing the flow using
+sh_flowtime.d shows,
+
+# ./sh_flowtime.d | cat -n
+ 1 C TIME(us) FILE DELTA(us) -- NAME
+ 2 0 3052991099265 func_abc.sh 2 -> func_a
+ 3 0 3052991099324 func_abc.sh 59 > echo
+ 4 0 3052992111638 func_abc.sh 1012314 | sleep
+ 5 0 3052992111678 func_abc.sh 39 -> func_b
+ 6 0 3052992111729 func_abc.sh 51 > echo
+ 7 0 3052993121633 func_abc.sh 1009903 | sleep
+ 8 0 3052993121693 func_abc.sh 60 -> func_c
+ 9 0 3052993121745 func_abc.sh 52 > echo
+ 10 0 3052994131634 func_abc.sh 1009888 | sleep
+ 11 0 3052994131685 func_abc.sh 50 <- func_c
+ 12 0 3052994131699 func_abc.sh 14 <- func_b
+ 13 0 3052994131707 func_abc.sh 7 <- func_a
+
+the output of DTrace was piped through "cat -n" to enumerate the lines.
+
+Exclusive function time for func_a() in the above output would be the
+time from line 2 to line 13 minus the time from line 5 to 12 to subtract
+the time spent in both func_b() and func_c(). Or, you could say that
+exclusive time for func_a() is the time from lines 2 to 4.
+
+Looking back at the code, exclusive time for func_a() is the time spent
+in code lines 18 and 19 (and not line 20).
+
+See Notes/ALLinclusive_notes.txt for details on "inclusive" function time.
+
diff --git a/Notes/ALLfbt_notes.txt b/Notes/ALLfbt_notes.txt
new file mode 100644
index 000000000000..ef5f2b8eff3e
--- /dev/null
+++ b/Notes/ALLfbt_notes.txt
@@ -0,0 +1,77 @@
+**************************************************************************
+* The following are notes for any script that uses the "fbt" provider.
+* To identify these scripts, check the "STABILITY" section of the script's
+* man page, or try grepping for "fbt" on the script.
+*
+* $Id: ALLfbt_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+What is the "fbt" provider?...
+
+* A DTrace library of probes that instruments raw kernel function calls.
+* An "unstable" provider; meaning, scripts written using "fbt" are not
+ guarenteed to work on future versions of the OS - including after
+ patching the kernel.
+
+In a perfect world...
+
+* None of the DTraceToolkit scripts would use the "fbt" provider; instead
+ they would all use stable providers such as "proc", "sched", "io", etc.
+* All the DTraceToolkit scripts would run on any system that supports DTrace.
+
+In the real world...
+
+* Not all stable providers exist yet. Many are in development, such as
+ stable networking providers.
+* In the meantime, useful tools such as "tcpsnoop" and "tcptop" can
+ only be written using the unstable "fbt" provider (and these scripts have
+ broken several times due to kernel changes since they were first written).
+* "fbt" provider based scripts,
+ - only run on a particular OS (eg, Solaris)
+ - may only run on a particular version of an OS (eg, Solaris 10 3/05)
+ - are likely to break for future OS releases (eg, Solaris 10 6/06)
+* "fbt" provider based scripts also make the impossible possible, albiet
+ in a very unstable way, as a temporary solution while stable providers
+ are still in development.
+* Once stable providers exist, "fbt" scripts can be rewritten to use them;
+ however these new scripts will only run on newer OS builds that support
+ the stable providers. (in other words, this won't help you if you remain
+ on Solaris 10 6/06; you'll need to upgrade, or survive with "fbt").
+* Only some of the DTraceToolkit scripts use "fbt", and only a portion of
+ those have encountered stability issues - so this issue is limited.
+
+The "fbt" provider exports raw kernel implementation, which isn't guarenteed
+to be stable nor should it ever be (to do so would freeze kernel development
+and bug fixes). The only practical solution is the development and
+integration of stable providers (although that doesn't help people who keep
+running older versions of the OS).
+
+More harm than good?...
+
+Is the inclusion of these "fbt" scripts more harm than good? Consider,
+
+* the good,
+ - shows what is possible with DTrace
+ - should help a number of people solve specific performance issues,
+ on systems where they run
+ - a customer who really wants these scripts but on an OS version
+ where they don't work, have at least the source as a starting
+ point (and in some cases, the fix was trivial)
+
+* the bad,
+ - teases and frustrates people who find these scripts don't work
+ on their OS
+
+To minimise this issue, only a small number of "fbt" scripts have been
+included, and they have been documented (see their man page) as unstable.
+
+Can I help?...
+
+If you really like an "fbt" based script and would like to keep using it
+in a stable way, it may help to raise that with your vendor (Sun for Solaris,
+Apple for MacOS). Sun has OpenSolaris forums, such as dtrace-discuss, which
+are read by their engineers and the public.
+
diff --git a/Notes/ALLflow_notes.txt b/Notes/ALLflow_notes.txt
new file mode 100644
index 000000000000..4571491d467e
--- /dev/null
+++ b/Notes/ALLflow_notes.txt
@@ -0,0 +1,64 @@
+**************************************************************************
+* Notes for all scripts that print a function or method flow.
+*
+* $Id: ALLflow_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* What is a flow?
+
+Output that has some meaningful indent, such as function flow indented by
+stack depth. eg,
+
+ # ./pl_flow.d
+ C TIME(us) FILE -- SUB
+ 0 2963130861619 func_abc.pl -> func_a
+ 0 2963131870998 func_abc.pl -> func_b
+ 0 2963132871121 func_abc.pl -> func_c
+ 0 2963133881150 func_abc.pl <- func_c
+ 0 2963133881166 func_abc.pl <- func_b
+ 0 2963133881174 func_abc.pl <- func_a
+ ^C
+
+
+* The output looks shuffled?
+
+Eg,
+
+ # ./pl_flow.d
+ C TIME(us) FILE -- SUB
+ 0 2963130861619 func_abc.pl -> func_a
+ 0 2963131870998 func_abc.pl -> func_b
+ 0 2963132871121 func_abc.pl -> func_c
+ 0 2963133881166 func_abc.pl <- func_b
+ 0 2963133881174 func_abc.pl <- func_a
+ 1 2963133881150 func_abc.pl <- func_c
+ ^C
+
+Yes, this is shuffled. DTrace has been designed with a number of important
+goals in mind - including minimising the enabled performance overhead. To do
+this, per-CPU kernel buffers have been used to collect output, which are
+(currently) dumped in sequence by /usr/sbin/dtrace whenever it wakes
+up ("switchrate" tunable). So, on multi-CPU servers, there is always the
+possibility that any DTrace script can print out-of-order data.
+
+To deal with this behaviour, the flow scripts may,
+
+- print a "C" CPU column. If this changes from one line to the next then
+ the output is probably shuffled around that point. This is why the "C"
+ column appears in these flow scripts.
+- print a "TIME(us)" column. You can eyeball this for shuffles, or just
+ post sort the dtrace output.
+
+Now have a closer look at the pl_flow.d output above. The change in C
+indicates that a shuffle may have happened, and the out-of-order TIME(us)
+shows that it did happen.
+
+It is possible that DTrace will be enhanced to always sort output before
+printing, and this behaviour is no longer an issue.
+
+See "The output seems shuffled?" in Notes/ALLsnoop_notes.txt for more
+notes on this behaviour.
+
diff --git a/Notes/ALLinclusive_notes.txt b/Notes/ALLinclusive_notes.txt
new file mode 100644
index 000000000000..eea4b5d88d9e
--- /dev/null
+++ b/Notes/ALLinclusive_notes.txt
@@ -0,0 +1,74 @@
+**************************************************************************
+* Notes for all scripts that print inclusive function times (or method,
+* or subroutine).
+*
+* $Id: ALLinclusive_notes.txt 45 2007-09-17 08:54:56Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* What is "inclusive" function time?
+
+This is the time of function execution, from when the function begins to
+when it completes. This includes the times from all child functions called.
+
+Inclusive function time is calculated in a very simple way,
+
+ inclusive function time = time(function end) - time(function start)
+
+Consider this Bourne shell program,
+
+ 1 #!./sh
+ 2
+ 3 func_c()
+ 4 {
+ 5 echo "Function C"
+ 6 sleep 1
+ 7 }
+ 8
+ 9 func_b()
+ 10 {
+ 11 echo "Function B"
+ 12 sleep 1
+ 13 func_c
+ 14 }
+ 15
+ 16 func_a()
+ 17 {
+ 18 echo "Function A"
+ 19 sleep 1
+ 20 func_b
+ 21 }
+ 22
+ 23 func_a
+
+func_a() calls func_b() which calls func_c(). Tracing the flow using
+sh_flowtime.d shows,
+
+# ./sh_flowtime.d | cat -n
+ 1 C TIME(us) FILE DELTA(us) -- NAME
+ 2 0 3052991099265 func_abc.sh 2 -> func_a
+ 3 0 3052991099324 func_abc.sh 59 > echo
+ 4 0 3052992111638 func_abc.sh 1012314 | sleep
+ 5 0 3052992111678 func_abc.sh 39 -> func_b
+ 6 0 3052992111729 func_abc.sh 51 > echo
+ 7 0 3052993121633 func_abc.sh 1009903 | sleep
+ 8 0 3052993121693 func_abc.sh 60 -> func_c
+ 9 0 3052993121745 func_abc.sh 52 > echo
+ 10 0 3052994131634 func_abc.sh 1009888 | sleep
+ 11 0 3052994131685 func_abc.sh 50 <- func_c
+ 12 0 3052994131699 func_abc.sh 14 <- func_b
+ 13 0 3052994131707 func_abc.sh 7 <- func_a
+
+the output of DTrace was piped through "cat -n" to enumerate the lines.
+
+Inclusive function time for func_a() in the above output would be the
+time from line 2 to line 13. This inclusive time includes the time
+for both func_b() and func_c().
+
+Looking back at the code, inclusive time for func_a() is the time spent
+in code lines 18, 19 and 20.
+
+See Notes/ALLexclusive_notes.txt for details on "exclusive" function time.
+
diff --git a/Notes/ALLjava_notes.txt b/Notes/ALLjava_notes.txt
new file mode 100644
index 000000000000..2d033c18a822
--- /dev/null
+++ b/Notes/ALLjava_notes.txt
@@ -0,0 +1,35 @@
+**************************************************************************
+* Notes for all scripts that trace Java using the hotspot provider.
+*
+* $Id: ALLjava_notes.txt 52 2007-09-24 04:28:01Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+* I see "drops"
+
+If you see the following output,
+
+ dtrace: 2547 drops on CPU 0
+
+This means that JVM events (usually methods) were executed too quickly for
+DTrace to keep up, and as a safety measure DTrace has let events slip by.
+This means, at least, that the output is missing lines. At worst, the
+output may contain corrupted values (time deltas between events that were
+dropped).
+
+If you see drops, you should first ask yourself whether you need to be
+tracing such frequent events at all - is there another way to get the same
+data? For example, see the j_profile.d script, which uses a different
+technique (sampling) than most of the other Java scripts (tracing).
+
+You can try tweaking DTrace tunables to prevent DTrace from dropping events.
+A key tunable is "bufsize", and can be set in scripts like so,
+
+ #pragma D option bufsize=32m
+
+That line means that 32 Mbytes will be allocated to the DTrace primary
+buffer per-CPU (how depends on bufpolicy). If you have many CPUs, say 8,
+then the above line means that 256 Mbytes (32 * 8) will be allocated as a
+buffer while your D script is running.
+
diff --git a/Notes/ALLoncpu_notes.txt b/Notes/ALLoncpu_notes.txt
new file mode 100644
index 000000000000..41aead027bc9
--- /dev/null
+++ b/Notes/ALLoncpu_notes.txt
@@ -0,0 +1,42 @@
+**************************************************************************
+* The following are notes for all scripts that measure on-CPU times.
+*
+* $Id: ALLoncpu_notes.txt 58 2007-10-01 13:36:29Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* What is "on-CPU" time?
+
+This is the time that a thread spent running on a CPU. It does not include
+time spent off-CPU time such as sleeping for I/O or waiting for scheduling.
+
+On-CPU times are useful for showing who is causing the CPUs to be busy,
+since they measure how much CPU time has been consumed by that thread.
+
+On-CPU times are also less susceptible to system "noise" than elapsed times,
+since much of the noise will be filtered out. DTrace itself also tries
+to subtract the small overheads of DTrace from the on-CPU time, to improve
+the accuracy of this time.
+
+See Notes/ALLelapsed_notes.txt for a description of a different time
+measurement, "elapsed" time.
+
+
+* How is "on-CPU" time measured?
+
+In DTrace, the following template provides on-CPU time as "this->oncpu",
+
+ <start-probe>
+ {
+ self->vstart = vtimestamp;
+ }
+
+ <end-probe>
+ {
+ this->oncpu = vtimestamp - self->vstart;
+ self->vstart = 0;
+ ...
+ }
+
diff --git a/Notes/ALLoverhead.txt b/Notes/ALLoverhead.txt
new file mode 100644
index 000000000000..844b3c08c1d9
--- /dev/null
+++ b/Notes/ALLoverhead.txt
@@ -0,0 +1,96 @@
+**************************************************************************
+* The following are notes regarding the overheads of running DTrace.
+*
+* $Id: ALLoverhead.txt 58 2007-10-01 13:36:29Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+The following are notes regarding the overheads of running DTrace.
+
+* What are the overheads of running DTrace?
+
+Often negligible.
+
+It depends what the DTrace script does, in particular, the frequency of
+events that it is tracing.
+
+The following tips should explain what the overheads probably are,
+
+- if your script traces less than 1000 events per second, then the overhead
+ is probably negligible. ie, less than 0.1% CPU.
+- if your script traces more than 100,000 events per second, then the
+ overhead will start to be significant. If you are tracing kernel events,
+ then perhaps this could be 10% per CPU. If you are tracing user land
+ application events, then the overhead can be greater than 30% per CPU.
+- if your script produes pages of output, then the CPU cost of drawing
+ this output to the screen and rendering the fonts is usually far greater
+ than DTrace itself. Redirect the output of DTrace to a file in /tmp
+ ("-o" or ">").
+- a ballpark figure for the overhead of a DTrace probe would be 500 ns.
+ This can be much less (kernel only), or much more (many user to kerel
+ copyin()s); I've provided it to give you a very rough idea. Of course,
+ as CPUs become faster, this overhead will become smaller.
+
+If overheads are a concern - then perform tests to measure their magnitude
+for both your workload and the scripts applied, such as benchmarks with
+and without DTrace running. Also read the scripts you are using, and
+consider how frequent the probes will fire, and if you can customise the
+script to reduce the frequency of probes.
+
+For example, scripts that trace,
+
+ pid$target:::entry,
+ pid$target:::return
+
+would usually cause significant performance overhead, since they fire two
+probes for every function called (and can easily reach 100,000 per second).
+You could reduce this by modifying the script to only trace the libraries
+you are interested in. For example, if you were only interested in
+libsocket and libnsl, then change the above lines wherever they appeared to,
+
+ pid$target:libsocket::entry,
+ pid$target:libsocket::return,
+ pid$target:libnsl::entry,
+ pid$target:libnsl::return
+
+and you may notice the overheads are significantly reduced (especially anytime
+you drop libc and libdl). To go further, only list functions of interest,
+
+ pid$target:libsocket:connect:entry,
+ pid$target:libsocket:connect:return,
+ pid$target:libsocket:listen:entry,
+ pid$target:libsocket:listen:return,
+ [...]
+
+There are additional notes in Docs/Faq about the DTraceToolkit's scripts
+and performance overhead.
+
+
+* When are the overheads a problem?
+
+When they are significant (due to frequent events), and you are tracing
+in a production environment that is sensitive to additional CPU load.
+
+Overheads should be considered if you are measuring times (delta, elapsed,
+on-CPU, etc) for performance analysis. In practise, overheads aren't
+that much of a problem -- the script will either identify your issues
+correctly (great), or not (keep looking). Any it is usually easy to quickly
+confirm what DTrace does find by using other tools, or by hacking quick
+code changes. You might be using DTrace output that you know has a
+significant margin of error - but that becomes moot after you prove that
+the performance fix works through benchmarking a quick fix.
+
+At the end of the day, if DTrace helps find real measurable performance wins
+(and it should), then it has been successful.
+
+
+* When are overheads not a problem?
+
+When the script is not tracing extreamly frequent events.
+
+Also, when you are in development and tracing events for troubleshooting
+purposes (args to functions, for example), DTrace overheads are usually
+not an issue at all.
+
diff --git a/Notes/ALLperl_notes.txt b/Notes/ALLperl_notes.txt
new file mode 100644
index 000000000000..24039504f698
--- /dev/null
+++ b/Notes/ALLperl_notes.txt
@@ -0,0 +1,44 @@
+**************************************************************************
+* The following are notes for all the Perl tracing scripts,
+*
+* $Id: ALLperl_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* Where did those "BEGIN" subroutine calls come from?
+
+The following counts subroutines from the example program, Code/Perl/hello.pl,
+
+ # pl_subcalls.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ FILE SUB CALLS
+
+no subroutines were called, so there is no data to output.
+
+Now a similar program is traced, Code/Perl/hello_strict.pl, which uses
+the "strict" pragma,
+
+ # pl_subcalls.d
+ Tracing... Hit Ctrl-C to end.
+ ^C
+ FILE SUB CALLS
+ hello_strict.pl BEGIN 1
+ strict.pm bits 1
+ strict.pm import 1
+
+not only were functions from "strict.pm" traced, but a "BEGIN" function
+ran from the "hello_strict.pl" program - which doesn't appear to use "BEGIN",
+
+ # cat -n ../Code/Perl/hello_strict.pl
+ 1 #!./perl -w
+ 2
+ 3 use strict;
+ 4
+ 5 print "Hello World!\n";
+
+Perl appears to add a BEGIN block to process the "use" keyword. This makes
+some degree of sense.
+
diff --git a/Notes/ALLsnoop_notes.txt b/Notes/ALLsnoop_notes.txt
new file mode 100644
index 000000000000..b43c70a1aefe
--- /dev/null
+++ b/Notes/ALLsnoop_notes.txt
@@ -0,0 +1,94 @@
+**************************************************************************
+* The following are additional notes on ALL of the *snoop programs (such as
+* execsnoop, iosnoop, ..., and dapptrace, dtruss).
+*
+* $Id: ALLsnoop_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* The output seems shuffled?
+
+Beware - due to the (current) way DTrace works, on multi-CPU systems there
+is no guarentee that if you print traced events the output is in the same
+order that the events occured.
+
+This is because events details are placed in kernel per-CPU buffers, and then
+dumped in sequence by the DTrace consumer (/usr/sbin/dtrace) whenever it
+wakes up ("switchrate" tunable). The DTrace consumer reads and prints the
+buffers one by one, it doesn't combine them and sort them.
+
+To demonstrate this,
+
+ # dtrace -n 'profile:::profile-3hz { trace(timestamp); }'
+ dtrace: description 'profile-3hz ' matched 1 probe
+ CPU ID FUNCTION:NAME
+ 0 41241 :profile-3hz 1898015274778547
+ 0 41241 :profile-3hz 1898015608118262
+ 0 41241 :profile-3hz 1898015941430060
+ 1 41241 :profile-3hz 1898015275499014
+ 1 41241 :profile-3hz 1898015609173485
+ 1 41241 :profile-3hz 1898015942505828
+ 2 41241 :profile-3hz 1898015275351257
+ 2 41241 :profile-3hz 1898015609180861
+ 2 41241 :profile-3hz 1898015942512708
+ 3 41241 :profile-3hz 1898015274803528
+ 3 41241 :profile-3hz 1898015608120522
+ 3 41241 :profile-3hz 1898015941449884
+ ^C
+
+If you read the timestamps carefully, you'll see that they aren't quite
+in chronological order. If you look at the CPU column while reading the
+timestamps, the way DTrace works should become clear.
+
+Most of the snoop tools have a switchrate of 10hz, so events may be shuffled
+within a tenth of a second - not hugely noticable.
+
+This isn't really a problem anyway. If you must have the output in the correct
+order, find the switch that prints timestamps and then sort the output.
+As an example,
+
+ # iosnoop -t > out.iosnoop
+ ^C
+ # sort -n out.iosnoop
+
+ TIME UID PID D BLOCK SIZE COMM PATHNAME
+ 183710958520 0 3058 W 10507848 4096 sync /var/log/pool/poold
+ 183710990358 0 3058 W 6584858 1024 sync /etc/motd
+ 183711013469 0 3058 W 60655 9216 sync <none>
+ 183711020149 0 3058 W 60673 1024 sync <none>
+
+All shell-wrapped scripts should have some way to print timestamps, and
+many DTrace-only scripts print timestamps by default. If you find a script
+that doesn't print timestamps, it should be trivial for you to add an
+extra column.
+
+To add a microsecond-since-boot time column to a script, try adding this
+before every printf() you find,
+
+ printf("%-16d ", timestamp / 1000);
+
+except for the header line, where you can add this,
+
+ printf("%-16s ", "TIME(us)");
+
+Now you will be able to post sort the script output on the TIME(us) column.
+
+In practise, I find post sorting the output a little annoying at times,
+and use a couple of other ways to prevent shuffling from happening in the
+first place:
+
+- offline all CPUs but one when running flow scripts. Naturally, you
+ probably don't want to do this on production servers, this is a trick
+ that may be handy for when developing on workstations or laptops. Bear
+ in mind that if you are trying to DTrace certain issues, such as
+ multi-thread locking contention, then offlining most CPUs may eliminate
+ the issue you are trying to observe.
+- pbind the target process of interest to a single CPU. Most OSes provide
+ a way to glue a process to a single CPU; Solaris has both pbind and psrset.
+
+Another way to solve this problem would be to enhance DTrace to always print
+in-order output. Maybe this will be done one day; maybe by the time you
+are reading this it has already been done?
+
diff --git a/Notes/Readme b/Notes/Readme
new file mode 100644
index 000000000000..99a1807e087e
--- /dev/null
+++ b/Notes/Readme
@@ -0,0 +1,21 @@
+Notes - Discussion about tools and their output
+
+ This directory contains files that provide deeper discussions about
+ tools and their output.
+
+ Files are either named,
+
+ ALL*_notes.txt - notes that cover a collection of tools
+ *_notes.txt - notes that cover a specific tool
+
+ These files are exist as an informal place to dump "stuff". This might
+ range from caveats to bear in mind when interpreting tool output, to
+ general or bizzare knowledge. Tool documentation is placed in,
+
+ /Man - formal man pages
+ /Examples - demos and how to read the output
+ *.d - implementation notes within the code itself
+ /Notes - everything else
+
+ Many of the scripts and man pages refer to files in this directory.
+
diff --git a/Notes/cputimes_notes.txt b/Notes/cputimes_notes.txt
new file mode 100644
index 000000000000..cdf7ecdac5a6
--- /dev/null
+++ b/Notes/cputimes_notes.txt
@@ -0,0 +1,138 @@
+**************************************************************************
+* The following are additional notes on the cputimes command.
+*
+* $Id: cputimes_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* How cputimes works
+
+cputimes measures time consumed by the kernel, idle therads and processes,
+by tracking the activity of the schedular. In particular we track on-cpu
+and off-cpu events for kernel therads, measuring the timestamps at each event.
+
+
+* Why cputimes?
+
+If you are interested in how much time processes are consuming, the data
+given by "prstat" or "prstat -m" is fine. However there is no easy way to
+see kernel consumed time, which is the idea behind cputimes.
+
+
+* What does it mean?
+
+The output shows categories of threads by the sum of time, in nanoseconds.
+
+A nanosecond is 10^-9, or 0.000000001 of a second. This program uses
+nanoseconds as units, but does not have nanosecond accuracy. It would be
+reasonable to assume that this has microsecond accuracy (10^-6), so in
+practise ignore the last three digits of the times.
+
+The sections reported are,
+
+PROCESSES - the sum of all the process time on the CPU.
+KERNEL - the sum of the time spent in the kernel.
+IDLE - the time the kernel spent in the idle thread, waiting for some work.
+
+If your system isn't doing much, then the idle time will be quite large. If
+your system is running many applications, then there may be no idle time
+at all - instead most of the time appearing under processes.
+
+
+* When is there a problem?
+
+Expect to see most of the time in processes or idle, depending on how busy
+your server is. Seeing a considerable amout of time in kernel would
+definately be interesting.
+
+The kernel generally doesn't use much CPU time, usually less than 5%.
+If it were using more, that may indicate heavy activity from an interrupt
+thread, or activity caused by DTrace.
+
+For example,
+
+ # cputimes 1
+ 2005 Apr 27 23:49:32,
+ THREADS TIME (ns)
+ IDLE 28351679
+ KERNEL 436022725
+ PROCESS 451304688
+
+In this sample the kernel is using a massive amount of the CPUs, around 47%.
+This sample was taken during heavy network utilisation, the time consumed
+by the TCP/IP and network driver threads (and DTrace). The "intrstat" command
+could be used for further analysis of the interrupt threads responsible
+for servicing the network interface.
+
+
+* Problems with cputimes
+
+The way cputimes measures schedular activity turns out to be a lot of work.
+There are many scheduling events per second where one thread steps onto a
+CPU and another leaves. It turns out that cputimes itself causes some degree
+of kernel load.
+
+Here we run 1 cputimes,
+
+ # cputimes 1
+ 2005 May 15 12:00:41,
+ THREADS TIME (ns)
+ KERNEL 12621985
+ PROCESS 982751579
+ 2005 May 15 12:00:42,
+ THREADS TIME (ns)
+ KERNEL 12267577
+ PROCESS 983513765
+ [...]
+
+Now a second cputimes is run at the same time,
+
+ # cputimes 1
+ 2005 May 15 12:02:06,
+ THREADS TIME (ns)
+ KERNEL 17366426
+ PROCESS 978804165
+ 2005 May 15 12:02:07,
+ THREADS TIME (ns)
+ KERNEL 17614829
+ PROCESS 978671601
+ [...]
+
+And now a third,
+
+ # cputimes 1
+ 2005 May 15 12:03:09,
+ THREADS TIME (ns)
+ KERNEL 21303089
+ PROCESS 974925124
+ 2005 May 15 12:03:10,
+ THREADS TIME (ns)
+ KERNEL 21222992
+ PROCESS 975152727
+ [...]
+
+Each extra cputimes is consuming an extra 4 to 5 ms of the CPU as kernel time.
+Around 0.5%. This can be used as an estimate of the kernel load caused by
+running cputimes, and a similar strategy could be used to measure the kernel
+load of other DTrace scripts.
+
+However the following CPU characteristics must be taken into consideration,
+
+ # psrinfo -v
+ Status of virtual processor 0 as of: 05/15/2005 12:06:05
+ on-line since 04/30/2005 13:32:32.
+ The i386 processor operates at 867 MHz,
+ and has an i387 compatible floating point processor.
+
+as well as the type of activity that was also running on the system, which
+cputimes was monitoring (frequency of scheduling events).
+
+A system with a slower CPU will use a larger proportion of kernel time to
+perform the same tasks. Also, a system that is context switching more
+(switching between different processes) is likely to consume more kernel time
+as well.
+
+
+
diff --git a/Notes/dappprof_notes.txt b/Notes/dappprof_notes.txt
new file mode 100644
index 000000000000..d617f2aeabaa
--- /dev/null
+++ b/Notes/dappprof_notes.txt
@@ -0,0 +1,14 @@
+**************************************************************************
+* The following are extra notes on the dappprof command.
+*
+* $Id: dappprof_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* Can I trust the elapsed and on-cpu times?
+
+See the documentation for this point in the dtruss_notes.txt file.
+
+
diff --git a/Notes/dapptrace_notes.txt b/Notes/dapptrace_notes.txt
new file mode 100644
index 000000000000..579c2dfd8c01
--- /dev/null
+++ b/Notes/dapptrace_notes.txt
@@ -0,0 +1,19 @@
+**************************************************************************
+* The following are extra notes on the dapptrace command.
+*
+* $Id: dapptrace_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* Can I trust the elapsed and on-cpu times?
+
+See the documentation for this point in the dtruss_notes.txt file.
+
+
+
+* The output appears shuffled?
+
+Read the answer to this in ALLsnoop_notes.txt.
+
diff --git a/Notes/dtruss_notes.txt b/Notes/dtruss_notes.txt
new file mode 100644
index 000000000000..8ecbecf864bc
--- /dev/null
+++ b/Notes/dtruss_notes.txt
@@ -0,0 +1,97 @@
+**************************************************************************
+* The following are additional notes on the dtruss program.
+*
+* $Id: dtruss_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* Can I trust the elapsed and on-cpu times?
+
+Firstly, lets see dtruss do something cool,
+
+ # dtruss -eo -n bash
+ PID/LWP ELAPSD CPU SYSCALL(args) = return
+ 6215/1: 57 37 write(0x2, "h\0", 0x1) = 1 0
+ 6215/1: 357210 45 read(0x0, "e\0", 0x1) = 1 0
+ 6215/1: 53 37 write(0x2, "e\0", 0x1) = 1 0
+ 6215/1: 359510 46 read(0x0, "l\0", 0x1) = 1 0
+ 6215/1: 57 42 write(0x2, "l\0", 0x1) = 1 0
+ 6215/1: 166495 47 read(0x0, "l\0", 0x1) = 1 0
+ 6215/1: 56 40 write(0x2, "l\0", 0x1) = 1 0
+ 6215/1: 346076 44 read(0x0, "o\0", 0x1) = 1 0
+ 6215/1: 54 38 write(0x2, "o\0", 0x1) = 1 0
+ 6215/1: 349852 45 read(0x0, " \0", 0x1) = 1 0
+ 6215/1: 54 39 write(0x2, " \0", 0x1) = 1 0
+
+In the above, the slow elapsed times for reads are due to the process context
+switching off the CPU while we wait for the next keystroke. For example,
+the second line shows an on-CPU time of 45 us and an elapsed time of 357210 us.
+In fact, the elapsed times are equal to the inter-keystroke delays.
+
+
+What about the writes? Their elapsed times are longer than the on-CPU times
+also. Did we context switch off for them too? ... Lets run a different demo,
+
+ # dtruss -eo date
+ ELAPSD CPU SYSCALL(args) = return
+ Mon Jul 25 21:41:40 EST 2005
+ 44 23 resolvepath("/usr/bin/date\0", 0x80476CC, 0x3FF) = 13 0
+ 10 1 sysconfig(0x6, 0xB25A1, 0xFEC1D444) = 4096 0
+ 36 28 resolvepath("/usr/lib/ld.so.1\0", 0x80476CC, 0x3FF) = 12 0
+ 18 9 xstat(0x2, 0x8047FEB, 0x8047AF8) = 0 0
+ 25 16 open("/var/ld/ld.config\0", 0x0, 0x0) = -1 Err#2
+ 27 18 xstat(0x2, 0xD27FBF38, 0x80473B0) = 0 0
+ 17 9 resolvepath("/lib/libc.so.1\0", 0x8047438, 0x3FF) = 14 0
+ 21 13 open("/lib/libc.so.1\0", 0x0, 0x0) = 3 0
+ 30 22 mmap(0x10000, 0x1000, 0x5) = -763559936 0
+ 15 6 mmap(0x10000, 0xCE000, 0x0) = -764411904 0
+ 24 16 mmap(0xD2700000, 0xB5A45, 0x5) = -764411904 0
+ 21 12 mmap(0xD27C6000, 0x5EB3, 0x3) = -763600896 0
+ 18 9 mmap(0xD27CC000, 0x15C0, 0x3) = -763576320 0
+ 14 5 munmap(0xD27B6000, 0x10000) = 0 0
+ 186 176 memcntl(0xD2700000, 0x1B8D8, 0x4) = 0 0
+ 17 7 close(0x3) = 0 0
+ [...]
+
+For every syscall, the elapsed time is around 10 us (microseconds) slower
+than the on-cpu time. These aren't micro context switches, this is due to
+DTrace slowing down the program! The more closely we measure something the
+more we effect it. (See Heisenberg's uncertainty principle).
+
+Ok, so for the above output we can tell that each elapsed time is around 10 us
+longer than it should be. That's fine, since it's fairly consistant and not
+a huge difference. This is an x86 server with a 867 MHz CPU.
+
+
+Now lets try the same on an Ultra 5 with a 360 MHz CPU,
+
+ # dtruss -eo date
+ ELAPSD CPU SYSCALL(args) = return
+ 216 142 resolvepath("/usr/bin/date\0", 0xFFBFF338, 0x3FF) = 13 0
+ 234 187 resolvepath("/usr/lib/ld.so.1\0", 0xFFBFF338, 0x3FF) = 12 0
+ 113 67 stat("/usr/bin/date\0", 0xFFBFF818, 0xFFBFFFEB) = 0 0
+ 136 90 open("/var/ld/ld.config\0", 0x0, 0x0) = -1 Err#2
+ 107 61 stat("/opt/onbld/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = -1 Err#2
+ 98 54 stat("/opt/SUNWspro/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = -1 Err#2
+ 96 53 stat("/opt/SUNWmlib/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = -1 Err#2
+ 97 54 stat("/usr/sfw/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = -1 Err#2
+ 96 53 stat("/lib/libc.so.1\0", 0xFFBFF330, 0xFFBFF55C) = 0 0
+ 134 92 resolvepath("/lib/libc.so.1\0", 0xFFBFEF30, 0x3FF) = 14 0
+ 109 69 open("/lib/libc.so.1\0", 0x0, 0x0) = 3 0
+ 177 132 mmap(0x10000, 0x2000, 0x5) = -12976128 0
+ [...]
+
+Now the time difference is around 40 us, and fairly consistant.
+
+
+This difference is find so long as we bear it in mind. Or, run DTrace
+on faster servers where the difference is much less.
+
+
+
+* The output appears shuffled?
+
+Read the answer to this in ALLsnoop_notes.txt.
+
diff --git a/Notes/iosnoop_notes.txt b/Notes/iosnoop_notes.txt
new file mode 100644
index 000000000000..af3ab9bbbe20
--- /dev/null
+++ b/Notes/iosnoop_notes.txt
@@ -0,0 +1,99 @@
+**************************************************************************
+* The following are additional notes on the iosnoop program.
+*
+* $Id: iosnoop_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* What does the output represent?
+
+The output is disk events - I/O operations that cause the disk to physically
+read or write data. The output is not application I/O events which may be
+absorbed by memory caches - many of which will be. The output really is
+physical disk events.
+
+iosnoop uses probes from the "io" provider - which traces the block device
+driver before disk events happen. disk events. The stack goes like this,
+
+ application
+ |
+ V
+ syscall
+ |
+ V
+ vfs
+ |
+ V
+ ufs/zfs/...
+ |
+ V
+ block device driver
+ |
+ V
+ physical device driver
+ |
+ V
+ disk
+
+Due to caching (after vfs) few events will make it to the disk for iosnoop
+to see. If you want to trace all I/O activity, try using syscall provider
+based scripts first.
+
+
+* What do the elapsed and delta times mean?
+
+Glad you asked!
+
+The times may *not* be as useful as they appear. I should also add that
+this quickly becomes a very complex topic,
+
+There are two different delta times reported. -D prints the
+elapsed time from the disk request (strategy) to the disk completion
+iodone); -o prints the time for the disk to complete that event
+since it's last event (time between iodones, or since idle->strategy).
+
+The elapsed time is equivalent to the response time from the application
+request to the application completion. The delta time resembles the
+service time for this request (resembles means it will be generally
+correct, but not 100% accurate). The service time is the the time for the
+disk to complete the request, after it has travelled through any bus or
+queue.
+
+buuuttt.... you need to think carefully about what these times mean before
+jumping to conclusions. For example,
+
+ You troubleshoot an application by running iosnoop and filtering
+ on your application's PID. You notice large times for the disk events
+ (responce, service, for this example it doesn't matter).
+ Does this mean there is a problem with that application?
+ What could be happening is that a different application is also using
+ the disks at the same time, and is causing the disk heads to seek to
+ elsewhere on the disk surface - increasing both service and response time.
+
+hmmm! so you can't just look at one application, one set of numbers, and
+understand fully what is going on.
+
+But it gets worse. Disks implement "tagged queueing", where events in the
+queue are reshuffeled to promote "elevator seeking" of the disk heads (this
+reduces head seeking). So the time for a disk event can be effected not
+just by the previous event (and previous location the heads had seeked to),
+but the surrounding events that enter the queue.
+
+So the good and the bad. The good news is that iosnoop makes it easy to
+fetch disk event data on a live system, the bad news is that understanding
+all the data is not really easy.
+
+For further information on disk measurements see,
+
+ "How do disks really work?" - Adrian Cockcroft, SunWorld Online, June 1996
+ "Sun Performance and Tuning" - Adrian Cockcroft, Richard Pettit
+ "Solaris Internals" - Richard McDougall, Jim Mauro
+
+
+
+* The output appears shuffled?
+
+Read the answer to this in ALLsnoop_notes.txt.
+
diff --git a/Notes/iotop_notes.txt b/Notes/iotop_notes.txt
new file mode 100644
index 000000000000..9663ec7b5498
--- /dev/null
+++ b/Notes/iotop_notes.txt
@@ -0,0 +1,48 @@
+**************************************************************************
+* The following are additional notes on the iotop program.
+*
+* $Id: iotop_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* When using -P, how can a process exceed 100% I/O?
+
+These percentages are based on disk time. They are in terms of a single disk.
+
+200% could mean 2 disks @ 100%, or 4 @ 50%, or some such combination.
+
+I could have capped it at 100% by dividing by disk count. I didn't. Disk
+utilisation is an asymmetric resource (unlike CPUs, which are (mostly)
+symmetric), so it's unfair to divide by all the disks capacity as an
+application cannot use every disks capacity (eg, writing to a /opt disk only).
+
+Would it be wise to report utilisation as 10% of overall capacity, if it
+could mean that 1 disk was SATURATED out of ten? A value of 10% could
+understate the problem.
+
+Instead I add the utilisations and don't divide. 1 disk saturated out of 10
+would be reported as 100% utilisation. This has the danger of overstating
+the problem (consider all ten disks at 10% utilisation, this would also be
+reported as 100%).
+
+Nothing is perfect when you are summarising to a single value!
+
+
+
+* Beware of overcounting metadevices, such as SVM and Veritas.
+
+The current version of iotop reports on anything the kernel believes to be
+a block disk device. A problem happens when a metadevice contains physical
+disk devices, and iotop reports on activity to both the metadevice and
+the physical devices, which overcounts activity.
+
+Consider a metadevice that contains two physical disks which are both
+running at 100% utilised. iotop -P may report 300% utilisation, which is
+200% for the disks + 100% for the metadevice. We'd probably want to see
+a value of 200%, not 300%. Eliminating the counting of metadevices in DTrace
+isn't easy (without inelegant "hardwiring" of device types), however I do
+intend to find a way to fix this in future versions.
+
+
diff --git a/Notes/procsystime_notes.txt b/Notes/procsystime_notes.txt
new file mode 100644
index 000000000000..5e1c52f4e52c
--- /dev/null
+++ b/Notes/procsystime_notes.txt
@@ -0,0 +1,14 @@
+**************************************************************************
+* The following are extra notes on the procsystime command.
+*
+* $Id: procsystime_notes.txt 44 2007-09-17 07:47:20Z brendan $
+*
+* COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+**************************************************************************
+
+
+* Can I trust the elapsed and on-cpu times?
+
+See the documentation for this point in the dtruss_notes.txt file.
+
+
diff --git a/Perl/Readme b/Perl/Readme
new file mode 100644
index 000000000000..36fcab5e5232
--- /dev/null
+++ b/Perl/Readme
@@ -0,0 +1,38 @@
+Perl - DTracing Perl
+
+ These scripts trace the Perl programming language, and require a version
+ of Perl to be built with the DTrace probes patch applied.
+
+ The Perl DTrace provider was originally written by Alan Burlison, and
+ later rewritten by Richard Dawe. These scripts were written and tested
+ with Richard's patch to perl, which can be found in the comments on
+ Alan's original blog entry,
+
+ http://blogs.sun.com/alanbur/entry/dtrace_and_perl
+
+ To get this and these scripts working, the rough steps are,
+
+ 1. Download and extract perl 5.8.8 (www.cpan.org)
+ 2. Download Richard's patch
+ 3. Apply Richard's patch (gpatch -p1 -i patchfile)
+ 4. sh Configure
+ 5. make perldtrace.h
+ 6. /usr/sbin/dtrace -h -s perldtrace.d -o perldtrace.h
+ 7. make
+
+ If things go awry, you might find help by asking on the
+ dtrace-discuss@opensolaris.org mailing list.
+
+ Since the DTrace Perl provider may be developed further, there is a chance
+ that it has changed slightly by the time you are reading this, causing
+ these scripts to either break or behave oddly. Firstly, check for newer
+ versions of the DTraceToolkit; if it hasn't been updated and you need
+ to use these scripts immediately, then updating them shouldn't take
+ too long. The following was the state of the provider when these scripts
+ were written - check for changes and update the scripts accordingly,
+
+ provider perl {
+ probe sub-entry(subroutine, file, lineno)
+ probe sub-return(subroutine, file, lineno)
+ };
+
diff --git a/Perl/pl_calldist.d b/Perl/pl_calldist.d
new file mode 100755
index 000000000000..a4bd2da68bbc
--- /dev/null
+++ b/Perl/pl_calldist.d
@@ -0,0 +1,82 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_calldist.d - measure Perl elapsed times for subroutines.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_calldist.d 28 2007-09-13 10:49:37Z brendan $
+ *
+ * This traces Perl activity from all programs running on the system with
+ * Perl provider support.
+ *
+ * USAGE: pl_calldist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of elapsed time for Perl subroutines.
+ * Use pl_calltime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the Perl program
+ * 2 Type of call (sub)
+ * 3 Name of call
+ *
+ * Filename and subroutine names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+perl*:::sub-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->sub[self->depth] = timestamp;
+}
+
+perl*:::sub-return
+/self->sub[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->sub[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->sub[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg1));
+ this->name = copyinstr(arg0);
+
+ @types_incl[this->file, "sub", this->name] =
+ quantize(this->elapsed_incl / 1000);
+ @types_excl[this->file, "sub", this->name] =
+ quantize(this->elapsed_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+dtrace:::END
+{
+ printf("\nExclusive subroutine elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive subroutine elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Perl/pl_calltime.d b/Perl/pl_calltime.d
new file mode 100755
index 000000000000..0bf180420dd6
--- /dev/null
+++ b/Perl/pl_calltime.d
@@ -0,0 +1,89 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_calltime.d - measure Perl elapsed times for subroutines.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_calltime.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces Perl activity from all programs running on the system with
+ * Perl provider support.
+ *
+ * USAGE: pl_calltime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Perl program
+ * TYPE Type of call (sub/total)
+ * NAME Name of call
+ * TOTAL Total elapsed time for calls (us)
+ *
+ * Filename and subroutine names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+perl*:::sub-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->sub[self->depth] = timestamp;
+}
+
+perl*:::sub-return
+/self->sub[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->sub[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->sub[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg1));
+ this->name = copyinstr(arg0);
+
+ @num[this->file, "sub", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "sub", this->name] = sum(this->elapsed_incl);
+ @types_excl[this->file, "sub", this->name] = sum(this->elapsed_excl);
+ @types_excl["-", "total", "-"] = sum(this->elapsed_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive subroutine elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive subroutine elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Perl/pl_cpudist.d b/Perl/pl_cpudist.d
new file mode 100755
index 000000000000..94c421f436ce
--- /dev/null
+++ b/Perl/pl_cpudist.d
@@ -0,0 +1,82 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_cpudist.d - measure Perl on-CPU times for subroutines.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_cpudist.d 28 2007-09-13 10:49:37Z brendan $
+ *
+ * This traces Perl activity from all programs running on the system with
+ * Perl provider support.
+ *
+ * USAGE: pl_cpudist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of elapsed time for Perl subrotines.
+ * Use pl_cputime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the Perl program
+ * 2 Type of call (sub)
+ * 3 Name of call
+ *
+ * Filename and subroutine names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+perl*:::sub-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->sub[self->depth] = vtimestamp;
+}
+
+perl*:::sub-return
+/self->sub[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->sub[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->sub[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg1));
+ this->name = copyinstr(arg0);
+
+ @types_incl[this->file, "sub", this->name] =
+ quantize(this->oncpu_incl / 1000);
+ @types_excl[this->file, "sub", this->name] =
+ quantize(this->oncpu_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+dtrace:::END
+{
+ printf("\nExclusive subroutine on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive subroutine on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Perl/pl_cputime.d b/Perl/pl_cputime.d
new file mode 100755
index 000000000000..150f204210a7
--- /dev/null
+++ b/Perl/pl_cputime.d
@@ -0,0 +1,89 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_cputime.d - measure Perl on-CPU times for subroutines.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_cputime.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces Perl activity from all programs running on the system with
+ * Perl provider support.
+ *
+ * USAGE: pl_cputime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Perl program
+ * TYPE Type of call (sub/total)
+ * NAME Name of call (subroutine name)
+ * TOTAL Total on-CPU time for calls (us)
+ *
+ * Filename and subroutine names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+perl*:::sub-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->sub[self->depth] = vtimestamp;
+}
+
+perl*:::sub-return
+/self->sub[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->sub[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->sub[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg1));
+ this->name = copyinstr(arg0);
+
+ @num[this->file, "sub", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "sub", this->name] = sum(this->oncpu_incl);
+ @types_excl[this->file, "sub", this->name] = sum(this->oncpu_excl);
+ @types_excl["-", "total", "-"] = sum(this->oncpu_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive subroutine on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive subroutine on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Perl/pl_flow.d b/Perl/pl_flow.d
new file mode 100755
index 000000000000..7948db2bfd35
--- /dev/null
+++ b/Perl/pl_flow.d
@@ -0,0 +1,70 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_flow.d - snoop Perl execution showing subroutine flow.
+ * Written for the Solaris Perl DTrace provider.
+ *
+ * $Id: pl_flow.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces Perl activity from all Perl programs on the system
+ * running with Perl provider support.
+ *
+ * USAGE: pl_flow.d # hit Ctrl-C to end
+ *
+ * This watches Perl subroutine entries and returns, and indents child
+ * subroutine calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this subroutine belongs to
+ * SUB Subroutine name
+ *
+ * LEGEND:
+ * -> subroutine entry
+ * <- subroutine return
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-16s -- %s\n", "C", "TIME(us)", "FILE", "SUB");
+}
+
+perl*:::sub-entry
+{
+ printf("%3d %-16d %-16s %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg1)), self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+}
+
+perl*:::sub-return
+{
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-16s %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg1)), self->depth * 2, "", copyinstr(arg0));
+}
diff --git a/Perl/pl_flowinfo.d b/Perl/pl_flowinfo.d
new file mode 100755
index 000000000000..06769fdb9cd7
--- /dev/null
+++ b/Perl/pl_flowinfo.d
@@ -0,0 +1,86 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_flowinfo.d - snoop Perl subroutine flow with info using DTrace.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_flowinfo.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces activity from all Perl programs on the system that are
+ * running with Perl provider support.
+ *
+ * USAGE: pl_flowinfo.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the Perl program
+ * LINE Line number of filename
+ * TYPE Type of call (sub)
+ * SUB Perl subroutine
+ *
+ * LEGEND:
+ * -> subroutine entry
+ * <- subroutine return
+ *
+ * Filename and subroutine names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "SUB");
+}
+
+perl*:::sub-entry,
+perl*:::sub-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+perl*:::sub-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, this->delta,
+ basename(copyinstr(arg1)), arg2, "sub", self->depth * 2, "",
+ copyinstr(arg0));
+ self->depth++;
+ self->last = timestamp;
+}
+
+perl*:::sub-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%d %6d %10d %16s:%-4d %-8s %*s<- %s\n", cpu, pid, this->delta,
+ basename(copyinstr(arg1)), arg2, "sub", self->depth * 2, "",
+ copyinstr(arg0));
+ self->last = timestamp;
+}
diff --git a/Perl/pl_flowtime.d b/Perl/pl_flowtime.d
new file mode 100755
index 000000000000..1fa727cec769
--- /dev/null
+++ b/Perl/pl_flowtime.d
@@ -0,0 +1,88 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_flowtime.d - snoop Perl subroutines with flow and delta times.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_flowtime.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces shell activity from Perl programs on the system that are
+ * running with Perl provider support.
+ *
+ * USAGE: pl_flowtime.d # hit Ctrl-C to end
+ *
+ * This watches Perl subroutine entries and returns, and indents child
+ * subroutine calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this subroutine belongs to
+ * DELTA(us) Elapsed time from previous line to this line
+ * SUB Perl subroutine name
+ *
+ * LEGEND:
+ * -> method entry
+ * <- method return
+ *
+ * Filename and subroutine names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+self int last;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE",
+ "DELTA(us)", "SUB");
+}
+
+perl*:::sub-entry,
+perl*:::sub-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+perl*:::sub-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %-16d %-16s %9d %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg1)), this->delta, self->depth * 2, "",
+ copyinstr(arg0));
+ self->depth++;
+ self->last = timestamp;
+}
+
+perl*:::sub-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-16s %9d %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg1)), this->delta, self->depth * 2, "",
+ copyinstr(arg0));
+ self->last = timestamp;
+}
diff --git a/Perl/pl_malloc.d b/Perl/pl_malloc.d
new file mode 100755
index 000000000000..b71e7652d3d2
--- /dev/null
+++ b/Perl/pl_malloc.d
@@ -0,0 +1,81 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_malloc.d - Perl libc malloc analysis.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_malloc.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This is an expiremental script to identify who is calling malloc() for
+ * memory allocation, and to print distribution plots of the requested bytes.
+ * If a malloc() occured while in a Perl subroutine, then that subroutine is
+ * identified as responsible; else the caller of malloc() is identified as
+ * responsible - which will be a function from the Perl engine.
+ *
+ * USAGE: pl_malloc.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * Filename and subroutine names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+perl$target:::sub-entry
+{
+ self->file = basename(copyinstr(arg1));
+ self->name = copyinstr(arg0);
+}
+
+perl$target:::sub-return
+{
+ self->file = 0;
+ self->name = 0;
+}
+
+pid$target:libc:malloc:entry
+/self->file != NULL/
+{
+ @malloc_sub_size[self->file, self->name] = sum(arg0);
+ @malloc_sub_dist[self->file, self->name] = quantize(arg0);
+}
+
+pid$target:libc:malloc:entry
+/self->name == NULL/
+{
+ @malloc_lib_size[usym(ucaller)] = sum(arg0);
+ @malloc_lib_dist[usym(ucaller)] = quantize(arg0);
+}
+
+
+dtrace:::END
+{
+ printf("\nPerl malloc byte distributions by engine caller,\n\n");
+ printa(" %A, total bytes = %@d %@d\n", @malloc_lib_size,
+ @malloc_lib_dist);
+
+ printf("\nPerl malloc byte distributions by Perl file and ");
+ printf("subroutine,\n\n");
+ printa(" %s, %s, bytes total = %@d %@d\n", @malloc_sub_size,
+ @malloc_sub_dist);
+}
diff --git a/Perl/pl_subcalls.d b/Perl/pl_subcalls.d
new file mode 100755
index 000000000000..30d922fc1ad6
--- /dev/null
+++ b/Perl/pl_subcalls.d
@@ -0,0 +1,55 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_subcalls.d - measure Perl subroutine calls using DTrace.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_subcalls.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * This traces Perl activity from all running programs on the system
+ * which support the Perl DTrace provider.
+ *
+ * USAGE: pl_subcalls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename that contained the subroutine
+ * SUB Perl subroutine name
+ * CALLS Subroutine calls during this sample
+ *
+ * Filename and subroutine names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+perl*:::sub-entry
+{
+ @subs[basename(copyinstr(arg1)), copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %-32s %-32s %8s\n", "FILE", "SUB", "CALLS");
+ printa(" %-32s %-32s %@8d\n", @subs);
+}
diff --git a/Perl/pl_syscalls.d b/Perl/pl_syscalls.d
new file mode 100755
index 000000000000..9c5a7651e86a
--- /dev/null
+++ b/Perl/pl_syscalls.d
@@ -0,0 +1,65 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_syscalls.d - count Perl subroutine calls and syscalls using DTrace.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_syscalls.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * USAGE: pl_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Perl program
+ * TYPE Type of call (sub/syscall)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * Filename and subroutine names are printed if available.
+ * The filename for syscalls may be printed as "perl", if the program
+ * was invoked using the form "perl filename" rather than running the
+ * program with an interpreter line.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+self string filename;
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+perl$target:::sub-entry
+{
+ @calls[basename(copyinstr(arg1)), "sub", copyinstr(arg0)] = count();
+}
+
+syscall:::entry
+/pid == $target/
+{
+ @calls[basename(execname), "syscall", probefunc] = count();
+}
+
+dtrace:::END
+{
+ printf("\nCalls for PID %d,\n\n", $target);
+ printf(" %-32s %-10s %-22s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-32s %-10s %-22s %@8d\n", @calls);
+}
diff --git a/Perl/pl_syscolors.d b/Perl/pl_syscolors.d
new file mode 100755
index 000000000000..ec689f23337f
--- /dev/null
+++ b/Perl/pl_syscolors.d
@@ -0,0 +1,119 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_syscolors.d - trace Perl subroutine flow plus syscalls, in color.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_syscolors.d 27 2007-09-13 09:26:01Z brendan $
+ *
+ * USAGE: pl_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * This watches Perl subroutine entries and returns, and indents child
+ * subroutine calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the Perl program
+ * LINE Line number of filename
+ * TYPE Type of call (sub/syscall)
+ * NAME Perl subroutine or syscall name
+ *
+ * Filename and subroutine names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ /*
+ * The following are terminal color escape sequences.
+ * Change them to whatever you prefer, eg HTML font tags.
+ */
+ color_perl = "\033[2;35m"; /* violet, faint */
+ color_syscall = "\033[2;32m"; /* green, faint */
+ color_off = "\033[0m"; /* default */
+
+ printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "NAME");
+}
+
+perl$target:::sub-entry,
+perl$target:::sub-return,
+syscall:::entry,
+syscall:::return
+/self->last == 0 && pid == $target/
+{
+ self->last = timestamp;
+}
+
+perl$target:::sub-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_perl,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "sub",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+perl$target:::sub-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_perl,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "sub",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->last = timestamp;
+}
+
+syscall:::entry
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall,
+ cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+syscall:::return
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall,
+ cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+proc:::exit
+/pid == $target/
+{
+ exit(0);
+}
diff --git a/Perl/pl_who.d b/Perl/pl_who.d
new file mode 100755
index 000000000000..a461311816d9
--- /dev/null
+++ b/Perl/pl_who.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * pl_who.d - trace Perl subroutine execution by process using DTrace.
+ * Written for the Perl DTrace provider.
+ *
+ * $Id: pl_who.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * This traces Perl activity from all Perl programs on the system that are
+ * running with Perl provider support.
+ *
+ * USAGE: pl_who.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID of Perl
+ * UID User ID of the owner
+ * SUBS Number of subroutine calls
+ * FILE Pathname of the Perl program
+ *
+ * Filenames are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+perl*:::sub-entry
+{
+ @lines[pid, uid, copyinstr(arg1)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %6s %6s %s\n", "PID", "UID", "SUBS", "FILE");
+ printa(" %6d %6d %@6d %s\n", @lines);
+}
diff --git a/Php/Readme b/Php/Readme
new file mode 100644
index 000000000000..5c9101f227df
--- /dev/null
+++ b/Php/Readme
@@ -0,0 +1,39 @@
+Php - DTracing PHP
+
+ These scripts trace the PHP programming language, and require the PHP
+ DTrace extension module to be installed and enabled.
+
+ The PHP DTrace provider was written by Wes Furlong, and is available
+ for download both as source and in binary form. The easiest instructions
+ are currently at,
+
+ http://blogs.sun.com/shanti/entry/dtrace_support_for_php
+
+ which were written for Solaris and the coolstack distribution of PHP.
+ The steps are roughly,
+
+ 1. Download the extension library from the URL above
+ 2. Copy the library to your php/extensions/* directory
+ 3. Edit your php.ini and add,
+ extension="dtrace.so"
+
+ The website with the PHP DTrace provider source is,
+
+ http://pecl.php.net/package/DTrace
+
+ Here you can fetch the source to build the library yourself, especially
+ if Solaris binaries from the previous URL aren't going to work for you.
+
+ Since the DTrace PHP provider may be developed further, there is a chance
+ that it has changed slightly by the time you are reading this, causing
+ these scripts to either break or behave oddly. Firstly, check for newer
+ versions of the DTraceToolkit; if it hasn't been updated and you need
+ to use these scripts immediately, then updating them shouldn't take
+ too long. The following was the state of the provider when these scripts
+ were written - check for changes and update the scripts accordingly,
+
+ provider php {
+ probe function-entry(function, file, lineno)
+ probe function-return(function, file, lineno)
+ };
+
diff --git a/Php/php_calldist.d b/Php/php_calldist.d
new file mode 100755
index 000000000000..7a1b19e3e3f4
--- /dev/null
+++ b/Php/php_calldist.d
@@ -0,0 +1,83 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_calldist.d - measure PHP elapsed times for functions.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_calldist.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * This traces PHP activity from all programs running on the system with
+ * PHP provider support.
+ *
+ * USAGE: php_calldist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of elapsed time for PHP
+ * operations. Use php_calltime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the PHP program
+ * 2 Type of call (func)
+ * 3 Name of call
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+php*:::function-entry
+/arg0/
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+php*:::function-return
+/arg0 && self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg1));
+ this->name = copyinstr(arg0);
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->elapsed_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->elapsed_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+dtrace:::END
+{
+ printf("\nExclusive function elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive function elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Php/php_calltime.d b/Php/php_calltime.d
new file mode 100755
index 000000000000..dcb708c7ab91
--- /dev/null
+++ b/Php/php_calltime.d
@@ -0,0 +1,90 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_calltime.d - measure PHP elapsed times for functions.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_calltime.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * This traces PHP activity from all programs running on the system with
+ * PHP provider support.
+ *
+ * USAGE: php_calltime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the PHP program
+ * TYPE Type of call (func/total)
+ * NAME Name of call
+ * TOTAL Total elapsed time for calls (us)
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+php*:::function-entry
+/arg0/
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+php*:::function-return
+/arg0 && self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg1));
+ this->name = copyinstr(arg0);
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl);
+ @types_excl["-", "total", "-"] = sum(this->elapsed_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Php/php_cpudist.d b/Php/php_cpudist.d
new file mode 100755
index 000000000000..e10566c73cf8
--- /dev/null
+++ b/Php/php_cpudist.d
@@ -0,0 +1,83 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_cpudist.d - measure PHP on-CPU times for functions.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_cpudist.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * This traces PHP activity from all programs running on the system with
+ * PHP provider support.
+ *
+ * USAGE: php_cpudist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of elapsed time for PHP
+ * operations. Use php_cputime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the PHP program
+ * 2 Type of call (func)
+ * 3 Name of call
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+php*:::function-entry
+/arg0/
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = vtimestamp;
+}
+
+php*:::function-return
+/arg0 && self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg1));
+ this->name = copyinstr(arg0);
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->oncpu_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->oncpu_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+dtrace:::END
+{
+ printf("\nExclusive function on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive function on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Php/php_cputime.d b/Php/php_cputime.d
new file mode 100755
index 000000000000..856d5516f2f6
--- /dev/null
+++ b/Php/php_cputime.d
@@ -0,0 +1,90 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_cputime.d - measure PHP on-CPU times for functions.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_cputime.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * This traces PHP activity from all programs running on the system with
+ * PHP provider support.
+ *
+ * USAGE: php_cputime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the PHP program
+ * TYPE Type of call (func/total)
+ * NAME Name of call (function name)
+ * TOTAL Total on-CPU time for calls (us)
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+php*:::function-entry
+/arg0/
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = vtimestamp;
+}
+
+php*:::function-return
+/arg0 && self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg1));
+ this->name = copyinstr(arg0);
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl);
+ @types_excl["-", "total", "-"] = sum(this->oncpu_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Php/php_flow.d b/Php/php_flow.d
new file mode 100755
index 000000000000..49472eacf820
--- /dev/null
+++ b/Php/php_flow.d
@@ -0,0 +1,72 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_flow.d - snoop PHP execution showing function flow.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_flow.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * This traces PHP activity from all PHP programs on the system
+ * running with PHP provider support.
+ *
+ * USAGE: php_flow.d # hit Ctrl-C to end
+ *
+ * This watches PHP function entries and returns, and indents child
+ * function calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this function belongs to
+ * FUNC Function name
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-16s -- %s\n", "C", "TIME(us)", "FILE", "FUNC");
+}
+
+php*:::function-entry
+/arg0/
+{
+ printf("%3d %-16d %-16s %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg1)), self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+}
+
+php*:::function-return
+/arg0/
+{
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-16s %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg1)), self->depth * 2, "", copyinstr(arg0));
+}
diff --git a/Php/php_flowinfo.d b/Php/php_flowinfo.d
new file mode 100755
index 000000000000..e537574920ff
--- /dev/null
+++ b/Php/php_flowinfo.d
@@ -0,0 +1,88 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_flowinfo.d - snoop PHP function flow with info using DTrace.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_flowinfo.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * This traces activity from all PHP programs on the system that are
+ * running with PHP provider support.
+ *
+ * USAGE: php_flowinfo.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the PHP program
+ * LINE Line number of filename
+ * TYPE Type of call (func)
+ * FUNC PHP function
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%s %6s/%-4s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "TID",
+ "DELTA(us)", "FILE", "LINE", "TYPE", "FUNC");
+}
+
+php*:::function-entry,
+php*:::function-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+php*:::function-entry
+/arg0/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%d %6d/%-4d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, tid,
+ this->delta, basename(copyinstr(arg1)), arg2, "func",
+ self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+ self->last = timestamp;
+}
+
+php*:::function-return
+/arg0/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%d %6d/%-4d %10d %16s:%-4d %-8s %*s<- %s\n", cpu, pid, tid,
+ this->delta, basename(copyinstr(arg1)), arg2, "func",
+ self->depth * 2, "", copyinstr(arg0));
+ self->last = timestamp;
+}
diff --git a/Php/php_flowtime.d b/Php/php_flowtime.d
new file mode 100755
index 000000000000..cadb66ad120a
--- /dev/null
+++ b/Php/php_flowtime.d
@@ -0,0 +1,91 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_flowtime.d - snoop PHP functions with flow and delta times.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_flowtime.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * This traces shell activity from PHP programs on the system that are
+ * running with PHP provider support.
+ *
+ * USAGE: php_flowtime.d # hit Ctrl-C to end
+ *
+ * This watches PHP function entries and returns, and indents child
+ * function calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this function belongs to
+ * DELTA(us) Elapsed time from previous line to this line
+ * FUNC PHP function name
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+self int last;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE",
+ "DELTA(us)", "FUNC");
+}
+
+php*:::function-entry,
+php*:::function-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+php*:::function-entry
+/arg0/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %-16d %-16s %9d %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg1)), this->delta, self->depth * 2, "",
+ copyinstr(arg0));
+ self->depth++;
+ self->last = timestamp;
+}
+
+php*:::function-return
+/arg0/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-16s %9d %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg1)), this->delta, self->depth * 2, "",
+ copyinstr(arg0));
+ self->last = timestamp;
+}
diff --git a/Php/php_funccalls.d b/Php/php_funccalls.d
new file mode 100755
index 000000000000..8a0ddcef43b6
--- /dev/null
+++ b/Php/php_funccalls.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_funccalls.d - measure PHP function calls using DTrace.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_funccalls.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * This traces PHP activity from all running programs on the system
+ * which support the PHP DTrace provider.
+ *
+ * USAGE: php_funccalls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename that contained the function
+ * FUNC PHP function name
+ * CALLS Function calls during this sample
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+php*:::function-entry
+/arg0/
+{
+ @funcs[basename(copyinstr(arg1)), copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %-32s %-32s %8s\n", "FILE", "FUNC", "CALLS");
+ printa(" %-32s %-32s %@8d\n", @funcs);
+}
diff --git a/Php/php_malloc.d b/Php/php_malloc.d
new file mode 100755
index 000000000000..1ebab26ac201
--- /dev/null
+++ b/Php/php_malloc.d
@@ -0,0 +1,82 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_malloc.d - PHP libc malloc analysis.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_malloc.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * This is an expiremental script to identify who is calling malloc() for
+ * memory allocation, and to print distribution plots of the requested bytes.
+ * If a malloc() occured while in a PHP function, then that function is
+ * identified as responsible; else the caller of malloc() is identified as
+ * responsible - which will be a function from the PHP engine.
+ *
+ * USAGE: php_malloc.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+php$target:::function-entry
+/arg0/
+{
+ self->file = basename(copyinstr(arg1));
+ self->name = copyinstr(arg0);
+}
+
+php$target:::function-return
+{
+ self->file = 0;
+ self->name = 0;
+}
+
+pid$target:libc:malloc:entry
+/self->file != NULL/
+{
+ @malloc_func_size[self->file, self->name] = sum(arg1);
+ @malloc_func_dist[self->file, self->name] = quantize(arg1);
+}
+
+pid$target:libc:malloc:entry
+/self->name == NULL/
+{
+ @malloc_lib_size[usym(ucaller)] = sum(arg1);
+ @malloc_lib_dist[usym(ucaller)] = quantize(arg1);
+}
+
+
+dtrace:::END
+{
+ printf("\nPHP malloc byte distributions by engine caller,\n\n");
+ printa(" %A, total bytes = %@d %@d\n", @malloc_lib_size,
+ @malloc_lib_dist);
+
+ printf("\nPHP malloc byte distributions by PHP file and ");
+ printf("function,\n\n");
+ printa(" %s, %s, bytes total = %@d %@d\n", @malloc_func_size,
+ @malloc_func_dist);
+}
diff --git a/Php/php_syscalls.d b/Php/php_syscalls.d
new file mode 100755
index 000000000000..7917c24d94ec
--- /dev/null
+++ b/Php/php_syscalls.d
@@ -0,0 +1,75 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_syscalls.d - count PHP function calls and syscalls using DTrace.
+ * Written for the PHP DTrace provider.
+ *
+ * This traces syscalls that occured during a PHP function call.
+ *
+ * $Id: php_syscalls.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * USAGE: php_syscalls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * FILE Filename of the PHP program
+ * TYPE Type of call (func/syscall)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * Filename and function names are printed if available.
+ * The filename for syscalls may be printed as "php", if the program
+ * was invoked using the form "php filename" rather than running the
+ * program with an interpreter line.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+php*:::function-entry
+/arg0/
+{
+ @calls[pid, basename(copyinstr(arg1)), "func", copyinstr(arg0)] =
+ count();
+ self->php++;
+}
+
+php*:::function-return
+/arg0/
+{
+ self->php -= self->php == 0 ? 0 : 1;
+}
+
+syscall:::entry
+/self->php > 0/
+{
+ @calls[pid, basename(execname), "syscall", probefunc] = count();
+}
+
+dtrace:::END
+{
+ printf(" %-6s %-26s %-10s %-22s %8s\n", "PID", "FILE", "TYPE", "NAME",
+ "COUNT");
+ printa(" %-6d %-26s %-10s %-22s %@8d\n", @calls);
+}
diff --git a/Php/php_syscolors.d b/Php/php_syscolors.d
new file mode 100755
index 000000000000..ff5e9c957903
--- /dev/null
+++ b/Php/php_syscolors.d
@@ -0,0 +1,116 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_syscolors.d - trace PHP function flow plus syscalls, in color.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_syscolors.d 53 2007-09-24 04:58:38Z brendan $
+ *
+ * USAGE: php_syscolors.d # hit Ctrl-C to end
+ *
+ * This watches PHP function entries and returns, and indents child
+ * function calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the PHP program
+ * LINE Line number of filename
+ * TYPE Type of call (func/syscall)
+ * NAME PHP function or syscall name
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ color_php = "\033[2;35m"; /* violet, faint */
+ color_syscall = "\033[2;32m"; /* green, faint */
+ color_off = "\033[0m"; /* default */
+
+ self->depth = 0;
+ printf("%s %6s/%-4s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "TID",
+ "DELTA(us)", "FILE", "LINE", "TYPE", "NAME");
+}
+
+php*:::function-entry,
+php*:::function-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+php*:::function-entry
+/arg0/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d/%-4d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_php,
+ cpu, pid, tid, this->delta, basename(copyinstr(arg1)), arg2, "func",
+ self->depth * 2, "", copyinstr(arg0), color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+php*:::function-return
+/arg0/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->name = strjoin(strjoin(copyinstr(arg1), "::"), copyinstr(arg0));
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d/%-4d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_php,
+ cpu, pid, tid, this->delta, basename(copyinstr(arg1)), arg2, "func",
+ self->depth * 2, "", copyinstr(arg0), color_off);
+ self->last = timestamp;
+}
+
+syscall:::entry
+/self->last/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d/%-4d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall,
+ cpu, pid, tid, this->delta, "\"", "syscall", self->depth * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+syscall:::return
+/self->last/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d/%-4d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall,
+ cpu, pid, tid, this->delta, "\"", "syscall", self->depth * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+proc:::exit
+/pid == $target/
+{
+ exit(0);
+}
diff --git a/Php/php_who.d b/Php/php_who.d
new file mode 100755
index 000000000000..2ebb4b425f2a
--- /dev/null
+++ b/Php/php_who.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * php_who.d - trace PHP function execution by process using DTrace.
+ * Written for the PHP DTrace provider.
+ *
+ * $Id: php_who.d 51 2007-09-24 00:55:23Z brendan $
+ *
+ * This traces PHP activity from all PHP programs on the system that are
+ * running with PHP provider support.
+ *
+ * USAGE: php_who.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID of PHP
+ * UID User ID of the owner
+ * FUNCS Number of function calls
+ * FILE Pathname of the PHP program
+ *
+ * Filenames are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+php*:::function-entry
+{
+ @lines[pid, uid, copyinstr(arg1)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %6s %6s %s\n", "PID", "UID", "FUNCS", "FILE");
+ printa(" %6d %6d %@6d %s\n", @lines);
+}
diff --git a/Proc/Readme b/Proc/Readme
new file mode 100644
index 000000000000..acc36344627d
--- /dev/null
+++ b/Proc/Readme
@@ -0,0 +1,3 @@
+Proc - Process based analysis
+
+ This would include activity by PID, and syscall analysis.
diff --git a/Proc/crash.d b/Proc/crash.d
new file mode 100755
index 000000000000..c1ed397a2a11
--- /dev/null
+++ b/Proc/crash.d
@@ -0,0 +1,181 @@
+#!/usr/sbin/dtrace -Cs
+/*
+ * crash.d - Crashed Application info.
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * $Id: crash.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * When applications crash via a SIGSEGV or SIGBUS, a report of the
+ * process state is printed out.
+ *
+ * USAGE: crash.d
+ *
+ * FIELDS:
+ * Type Signal type
+ * Program Execname of process
+ * Agrs Argument listing of process
+ * PID Process ID
+ * TID Thread ID
+ * LWPs Number of Light Weight Processes
+ * PPID Parent Process ID
+ * UID User ID
+ * GID Group ID
+ * TaskID Task ID
+ * ProjID Project ID
+ * PoolID Pool ID
+ * ZoneID Zone ID
+ * zone Zone name
+ * CWD Current working directory
+ * errno Error number of last syscall
+ *
+ * SEE ALSO: mdb, pstack, coreadm
+ * app_crash.d - Greg Nakhimovsky & Morgan Herrington
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 29-May-2005 Brendan Gregg Created this.
+ * 24-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+#pragma D option destructive
+
+dtrace:::BEGIN
+{
+ printf("Waiting for crashing applications...\n");
+}
+
+/*
+ * Print Report Header
+ */
+proc:::signal-send
+/(args[2] == SIGBUS || args[2] == SIGSEGV) && pid == args[1]->pr_pid/
+{
+ stop();
+ self->elapsed = timestamp - curthread->t_procp->p_mstart;
+ self->crash = 1;
+
+ printf("\n-----------------------------------------------------\n");
+ printf("CRASH DETECTED at %Y\n", walltimestamp);
+ printf("-----------------------------------------------------\n");
+ printf("Type: %s\n", args[2] == SIGBUS ? "SIGBUS" : "SIGSEGV");
+ printf("Program: %s\n", execname);
+ printf("Args: %S\n", curpsinfo->pr_psargs);
+ printf("PID: %d\n", pid);
+ printf("TID: %d\n", tid);
+ printf("LWPs: %d\n", curthread->t_procp->p_lwpcnt);
+ printf("PPID: %d\n", ppid);
+ printf("UID: %d\n", uid);
+ printf("GID: %d\n", gid);
+ printf("TaskID: %d\n", curpsinfo->pr_taskid);
+ printf("ProjID: %d\n", curpsinfo->pr_projid);
+ printf("PoolID: %d\n", curpsinfo->pr_poolid);
+ printf("ZoneID: %d\n", curpsinfo->pr_zoneid);
+ printf("zone: %s\n", zonename);
+ printf("CWD: %s\n", cwd);
+ printf("errno: %d\n", errno);
+
+ printf("\nUser Stack Backtrace,");
+ ustack();
+
+ printf("\nKernel Stack Backtrace,");
+ stack();
+}
+
+/*
+ * Print Java Details
+ */
+proc:::signal-send
+/self->crash && execname == "java"/
+{
+ printf("\nJava Stack Backtrace,");
+ jstack();
+}
+
+/*
+ * Print Ancestors
+ */
+proc:::signal-send
+/self->crash/
+{
+ printf("\nAnsestors,\n");
+ self->level = 1;
+ self->procp = curthread->t_procp;
+ self->ptr = self->procp;
+}
+
+/* ancestory un-rolled loop, reverse order, 6 deep */
+proc:::signal-send /self->crash && self->ptr != 0/
+{
+ printf("%*s %d %S\n", self->level += 2, "",
+ self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs);
+ self->ptr = self->ptr->p_parent;
+}
+proc:::signal-send /self->crash && self->ptr != 0/
+{
+ printf("%*s %d %S\n", self->level += 2, "",
+ self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs);
+ self->ptr = self->ptr->p_parent;
+}
+proc:::signal-send /self->crash && self->ptr != 0/
+{
+ printf("%*s %d %S\n", self->level += 2, "",
+ self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs);
+ self->ptr = self->ptr->p_parent;
+}
+proc:::signal-send /self->crash && self->ptr != 0/
+{
+ printf("%*s %d %S\n", self->level += 2, "",
+ self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs);
+ self->ptr = self->ptr->p_parent;
+}
+proc:::signal-send /self->crash && self->ptr != 0/
+{
+ printf("%*s %d %S\n", self->level += 2, "",
+ self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs);
+ self->ptr = self->ptr->p_parent;
+}
+proc:::signal-send /self->crash && self->ptr != 0/
+{
+ printf("%*s %d %S\n", self->level += 2, "",
+ self->ptr->p_pidp->pid_id, self->ptr->p_user.u_psargs);
+ self->ptr = self->ptr->p_parent;
+}
+
+/*
+ * Print Report Footer
+ */
+proc:::signal-send
+/self->crash/
+{
+
+ printf("\nTimes,\n");
+ printf(" User: %d ticks\n", self->procp->p_utime);
+ printf(" Sys: %d ticks\n", self->procp->p_stime);
+ printf(" Elapsed: %d ms\n", self->elapsed/1000000);
+
+ printf("\nSizes,\n");
+ printf(" Heap: %d bytes\n", self->procp->p_brksize);
+ printf(" Stack: %d bytes\n", self->procp->p_stksize);
+
+ self->ptr = 0;
+ self->procp = 0;
+ self->crash = 0;
+ self->level = 0;
+ self->elapsed = 0;
+ system("/usr/bin/prun %d", pid);
+}
diff --git a/Proc/creatbyproc.d b/Proc/creatbyproc.d
new file mode 100755
index 000000000000..23e1f5459484
--- /dev/null
+++ b/Proc/creatbyproc.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * creatbyproc.d - file creat()s by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: creatbyproc.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+syscall::creat*:entry { printf("%s %s", execname, copyinstr(arg0)); }
diff --git a/Proc/dappprof b/Proc/dappprof
new file mode 100755
index 000000000000..5aed3cb03120
--- /dev/null
+++ b/Proc/dappprof
@@ -0,0 +1,239 @@
+#!/usr/bin/sh
+#
+# dappprof - profile user and library function usage.
+# Written using DTrace (Solaris 10 3/05).
+#
+# The default output traces user functions as they are called. Options
+# can be used to examine libraries and timestamps.
+#
+# $Id: dappprof 65 2007-10-04 11:09:40Z brendan $
+#
+# USAGE: dappprof [-acehoTU] [-u lib] { -p PID | command }
+#
+# -p PID # examine this PID
+# -a # print all details
+# -c # print call counts
+# -e # print elapsed times (us)
+# -o # print on cpu times (us)
+# -T # print totals
+# -u lib # trace this library instead
+# -U # trace all libraries + user functions
+# -b bufsize # dynamic variable buf size (default is "4m")
+# eg,
+# dappprof df -h # run and examine the "df -h" command
+# dappprof -p 1871 # examine PID 1871
+#
+# The elapsed times are interesting, to help identify calls that take
+# some time to complete (during which the process may have context
+# switched off the CPU).
+#
+# SEE ALSO: dapptrace # DTraceToolkit
+# dtruss # DTraceToolkit
+# apptrace
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 16-May-2005 Brendan Gregg Created this.
+# 17-Jul-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+opt_totals=0; opt_pid=0; pid=0; opt_lib=0; lib=""
+opt_elapsed=0; opt_cpu=0; opt_counts=0; opt_liball=0
+opt_command=0; command=""; opt_buf=0; buf="4m"
+
+### Process options
+while getopts ab:cehop:Tu:U name
+do
+ case $name in
+ a) opt_liball=1; opt_counts=1; opt_elapsed=1; opt_cpu=1
+ opt_totals=1 ;;
+ b) opt_buf=1; buf=$OPTARG ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ u) opt_lib=1; lib=$OPTARG ;;
+ U) opt_liball=1 ;;
+ c) opt_counts=1 ;;
+ e) opt_elapsed=1 ;;
+ o) opt_cpu=1 ;;
+ T) opt_totals=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: dappprof [-cehoTU] [-u lib] { -p PID | command }
+
+ -p PID # examine this PID
+ -a # print all details
+ -c # print syscall counts
+ -e # print elapsed times (us)
+ -o # print on cpu times
+ -T # print totals
+ -u lib # trace this library instead
+ -U # trace all libraries + user funcs
+ -b bufsize # dynamic variable buf size
+ eg,
+ dappprof df -h # run and examine "df -h"
+ dappprof -p 1871 # examine PID 1871
+ dappprof -ap 1871 # print all data
+ END
+ exit 1
+ esac
+done
+shift `expr $OPTIND - 1`
+
+### Option logic
+if [ $opt_pid -eq 0 ]; then
+ opt_command=1
+ if [ "$*" = "" ]; then
+ $0 -h
+ exit
+ fi
+ command="$*"
+fi
+if [ $opt_elapsed -eq 0 -a $opt_cpu -eq 0 -a $opt_counts -eq 0 ]; then
+ opt_elapsed=1;
+fi
+
+
+### Probe logic
+if [ $opt_liball -eq 1 ]; then
+ probe_entry='pid$target:::entry'
+ probe_return='pid$target:::return'
+elif [ $opt_lib -eq 1 ]; then
+ probe_entry='pid$target:'$lib'::entry'
+ probe_return='pid$target:'$lib'::return'
+else
+ probe_entry='pid$target:a.out::entry'
+ probe_return='pid$target:a.out::return'
+fi
+
+#################################
+# --- Main Program, DTrace ---
+#
+
+### Define D Script
+dtrace='
+ #pragma D option quiet
+
+ /*
+ * Command line arguments
+ */
+ inline int OPT_command = '$opt_command';
+ inline int OPT_liball = '$opt_liball';
+ inline int OPT_elapsed = '$opt_elapsed';
+ inline int OPT_cpu = '$opt_cpu';
+ inline int OPT_counts = '$opt_counts';
+ inline int OPT_totals = '$opt_totals';
+ inline int OPT_pid = '$opt_pid';
+ inline int PID = '$pid';
+ inline string NAME = "'$pname'";
+
+ dtrace:::BEGIN
+ /! OPT_command/
+ {
+ printf("Tracing... Hit Ctrl-C to end...\n");
+ }
+
+ /*
+ * Save syscall entry info
+ */
+ '$probe_entry'
+ {
+ /* set function depth */
+ this->fdepth = ++fdepth[probefunc];
+
+ /* set start details */
+ self->start[probefunc,this->fdepth] = timestamp;
+ self->vstart[probefunc,this->fdepth] = vtimestamp;
+
+ /* count occurances */
+ OPT_counts && OPT_liball ? @Counts[probemod,probefunc] = count() : 1;
+ OPT_counts && ! OPT_liball ? @Counts[probefunc] = count() : 1;
+ OPT_counts && OPT_totals && OPT_liball ?
+ @Counts["TOTAL:",""] = count() : 1;
+ OPT_counts && OPT_totals && ! OPT_liball ?
+ @Counts["TOTAL:"] = count() : 1;
+ }
+
+ /*
+ * Print return data
+ */
+ /* print 3 arg output - default */
+ '$probe_return'
+ /self->start[probefunc,fdepth[probefunc]]/
+ {
+ /* fetch function depth */
+ this->fdepth = fdepth[probefunc];
+
+ /* calculate elapsed time */
+ this->elapsed = timestamp - self->start[probefunc,this->fdepth];
+ self->start[probefunc,this->fdepth] = 0;
+ this->cpu = vtimestamp - self->vstart[probefunc,this->fdepth];
+ self->vstart[probefunc,this->fdepth] = 0;
+
+ /* save elapsed times */
+ OPT_elapsed && OPT_liball ?
+ @Elapsed[probemod,probefunc] = sum(this->elapsed) : 1;
+ OPT_elapsed && ! OPT_liball ?
+ @Elapsed[probefunc] = sum(this->elapsed) : 1;
+ OPT_elapsed && OPT_totals && OPT_liball ?
+ @Elapsed["TOTAL:",""] = sum(this->elapsed) : 1;
+ OPT_elapsed && OPT_totals && ! OPT_liball ?
+ @Elapsed["TOTAL:"] = sum(this->elapsed) : 1;
+
+ /* save cpu times */
+ OPT_cpu && OPT_liball ? @CPU[probemod,probefunc] = sum(this->cpu) : 1;
+ OPT_cpu && ! OPT_liball ? @CPU[probefunc] = sum(this->cpu) : 1;
+ OPT_cpu && OPT_totals && OPT_liball ?
+ @CPU["TOTAL:",""] = sum(this->cpu) : 1;
+ OPT_cpu && OPT_totals && ! OPT_liball ?
+ @CPU["TOTAL:"] = sum(this->cpu) : 1;
+
+ }
+
+ /* print counts */
+ dtrace:::END
+ {
+ /* print counts */
+ OPT_counts ? printf("\n%-49s %16s\n","CALL","COUNT") : 1;
+ OPT_counts && OPT_liball ? printa("%-16s %-32s %@16d\n",@Counts) : 1;
+ OPT_counts && ! OPT_liball ? printa("%-49s %@16d\n",@Counts) : 1;
+
+ /* print elapsed times */
+ OPT_elapsed ? printf("\n%-49s %16s\n","CALL","ELAPSED") : 1;
+ OPT_elapsed && OPT_liball ? printa("%-16s %-32s %@16d\n",@Elapsed) : 1;
+ OPT_elapsed && ! OPT_liball ? printa("%-49s %@16d\n",@Elapsed) : 1;
+
+ /* print cpu times */
+ OPT_cpu ? printf("\n%-49s %16s\n","CALL","CPU") : 1;
+ OPT_cpu && OPT_liball ? printa("%-16s %-32s %@16d\n",@CPU) : 1;
+ OPT_cpu && ! OPT_liball ? printa("%-49s %@16d\n",@CPU) : 1;
+ }
+'
+
+### Run DTrace
+if [ $opt_command -eq 1 ]; then
+ /usr/sbin/dtrace -x dynvarsize=$buf -x evaltime=exec -n "$dtrace" \
+ -c "$command" >&2
+else
+ /usr/sbin/dtrace -x dynvarsize=$buf -n "$dtrace" -p "$pid" >&2
+fi
+
diff --git a/Proc/dapptrace b/Proc/dapptrace
new file mode 100755
index 000000000000..7dece4ea0991
--- /dev/null
+++ b/Proc/dapptrace
@@ -0,0 +1,259 @@
+#!/usr/bin/sh
+#
+# dapptrace - trace user and library function usage.
+# Written using DTrace (Solaris 10 3/05).
+#
+# The default output traces user functions as they are called. Options
+# can be used to examine libraries and timestamps.
+#
+# $Id: dapptrace 65 2007-10-04 11:09:40Z brendan $
+#
+# USAGE: dapptrace [-acdeFlhoU] [-u lib] { -p PID | command }
+#
+# -p PID # examine this PID
+# -a # print all details
+# -c # print call counts
+# -d # print relative timestamps (us)
+# -e # print elapsed times (us)
+# -F # print flow indentation
+# -l # print pid/lwpid per line
+# -o # print on cpu times (us)
+# -u lib # trace this library instead
+# -U # trace all libraries + user functions
+# -b bufsize # dynamic variable buf size (default is "4m")
+# eg,
+# dapptrace df -h # run and examine the "df -h" command
+# dapptrace -p 1871 # examine PID 1871
+# dapptrace -Fp 1871 # print using flow indents
+# dapptrace -eop 1871 # print elapsed and CPU times
+#
+# The elapsed times are interesting, to help identify calls that take
+# some time to complete (during which the process may have context
+# switched off the CPU).
+#
+# SEE ALSO: dappprof # DTraceToolkit
+# dtruss # DTraceToolkit
+# apptrace
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 16-May-2005 Brendan Gregg Created this.
+# 17-Jul-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+opt_pid=0; pid=0; opt_indent=0; opt_lib=0; lib=""
+opt_elapsed=0; opt_cpu=0; opt_counts=0;
+opt_relative=0; opt_printid=0; opt_liball=0
+opt_command=0; command=""; opt_buf=0; buf="4m"
+
+### Process options
+while getopts ab:cdeFhlop:u:U name
+do
+ case $name in
+ a) opt_liball=1; opt_counts=1; opt_relative=1; opt_elapsed=1
+ opt_indent=1; opt_printid=1; opt_cpu=1 ;;
+ b) opt_buf=1; buf=$OPTARG ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ u) opt_lib=1; lib=$OPTARG ;;
+ U) opt_liball=1 ;;
+ c) opt_counts=1 ;;
+ d) opt_relative=1 ;;
+ e) opt_elapsed=1 ;;
+ F) opt_indent=1 ;;
+ l) opt_printid=1 ;;
+ o) opt_cpu=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: dapptrace [-acdeholFLU] [-u lib] { -p PID | command }
+
+ -p PID # examine this PID
+ -a # print all details
+ -c # print syscall counts
+ -d # print relative times (us)
+ -e # print elapsed times (us)
+ -F # print flow indentation
+ -l # print pid/lwpid
+ -o # print CPU on cpu times
+ -u lib # trace this library instead
+ -U # trace all libraries + user funcs
+ -b bufsize # dynamic variable buf size
+ eg,
+ dapptrace df -h # run and examine "df -h"
+ dapptrace -p 1871 # examine PID 1871
+ dapptrace -Fp 1871 # print using flow indents
+ dapptrace -eop 1871 # print elapsed and CPU times
+ END
+ exit 1
+ esac
+done
+shift `expr $OPTIND - 1`
+
+### Option logic
+if [ $opt_pid -eq 0 ]; then
+ opt_command=1
+ if [ "$*" = "" ]; then
+ $0 -h
+ exit
+ fi
+ command="$*"
+fi
+
+### Probe logic
+if [ $opt_liball -eq 1 ]; then
+ probe_entry='pid$target:::entry'
+ probe_return='pid$target:::return'
+elif [ $opt_lib -eq 1 ]; then
+ probe_entry='pid$target:'$lib'::entry'
+ probe_return='pid$target:'$lib'::return'
+else
+ probe_entry='pid$target:a.out::entry'
+ probe_return='pid$target:a.out::return'
+fi
+
+#################################
+# --- Main Program, DTrace ---
+#
+
+### Define D Script
+dtrace='
+ #pragma D option quiet
+
+ /*
+ * Command line arguments
+ */
+ inline int OPT_command = '$opt_command';
+ inline int OPT_liball = '$opt_liball';
+ inline int OPT_indent = '$opt_indent';
+ inline int OPT_printid = '$opt_printid';
+ inline int OPT_relative = '$opt_relative';
+ inline int OPT_elapsed = '$opt_elapsed';
+ inline int OPT_cpu = '$opt_cpu';
+ inline int OPT_counts = '$opt_counts';
+ inline int OPT_pid = '$opt_pid';
+ inline int PID = '$pid';
+ inline string NAME = "'$pname'";
+
+ dtrace:::BEGIN
+ {
+ /* print header */
+ OPT_printid ? printf("%-8s ","PID/LWP") : 1;
+ OPT_relative ? printf("%8s ","RELATIVE") : 1;
+ OPT_elapsed ? printf("%7s ","ELAPSD") : 1;
+ OPT_cpu ? printf("%6s ","CPU") : 1;
+ printf("CALL(args) \t\t = return\n");
+
+ /* indent depth */
+ depth = 0;
+ }
+
+ /*
+ * Save syscall entry info
+ */
+ '$probe_entry'
+ {
+ /* set function depth */
+ this->fdepth = ++fdepth[probefunc];
+ depth += 2;
+
+ /* set start details */
+ self->start[probefunc,this->fdepth] = timestamp;
+ self->vstart[probefunc,this->fdepth] = vtimestamp;
+
+ /* count occurances */
+ OPT_counts && OPT_liball ? @Counts[probemod,probefunc] = count() : 1;
+ OPT_counts && ! OPT_liball ? @Counts[probefunc] = count() : 1;
+
+ /* print optional fields */
+ OPT_printid ? printf("%5d/%d: ",pid,tid) : 1;
+ OPT_relative ? printf("%8d ",vtimestamp/1000) : 1;
+ OPT_elapsed ? printf(" . ") : 1;
+ OPT_cpu ? printf(" . ") : 1;
+ OPT_indent ? printf("%*s",depth,"") : 1;
+
+ /* print main data */
+ printf("-> ");
+ OPT_liball ? printf("%s:",probemod) : 1;
+ printf("%s(0x%X, 0x%X, 0x%X)\t\t\n",probefunc,arg0,arg1,arg2);
+
+ }
+
+ /*
+ * Print return data
+ */
+ /* print 3 arg output - default */
+ '$probe_return'
+ /self->start[probefunc,fdepth[probefunc]]/
+ {
+ /* fetch function depth */
+ this->fdepth = fdepth[probefunc];
+
+ /* calculate elapsed time */
+ this->elapsed = timestamp - self->start[probefunc,this->fdepth];
+ self->start[probefunc,this->fdepth] = 0;
+ this->cpu = vtimestamp - self->vstart[probefunc,this->fdepth];
+ self->vstart[probefunc,this->fdepth] = 0;
+
+ /* print optional fields */
+ OPT_printid ? printf("%5d/%d: ",pid,tid) : 1;
+ OPT_relative ? printf("%8d ",vtimestamp/1000) : 1;
+ OPT_elapsed ? printf("%7d ",this->elapsed/1000) : 1;
+ OPT_cpu ? printf("%6d ",this->cpu/1000) : 1;
+ OPT_indent ? printf("%*s",depth,"") : 1;
+
+ /* print main data */
+ printf("<- ");
+ OPT_liball ? printf("%s:",probemod) : 1;
+ printf("%s = %d\n",probefunc,(int)arg0);
+ depth -= 2;
+ fdepth[probefunc]--;
+ }
+
+ /* reset indent depth */
+ profile:::tick-1sec
+ {
+ /*
+ * some probes generated by the pid provider have entries
+ * but not returns. this is a klude to fix that problem. this
+ * also explains fdepth[probefunc] rather than a single depth.
+ */
+ depth = 0;
+ }
+
+ /* print counts */
+ dtrace:::END
+ {
+ OPT_counts ? printf("\n%-49s %16s\n","CALL","COUNT") : 1;
+ OPT_counts && OPT_liball ? printa("%-16s %-32s %@16d\n",@Counts) : 1;
+ OPT_counts && ! OPT_liball ? printa("%-49s %@16d\n",@Counts) : 1;
+ }
+'
+
+### Run DTrace
+if [ $opt_command -eq 1 ]; then
+ /usr/sbin/dtrace -x dynvarsize=$buf -x evaltime=exec -n "$dtrace" \
+ -c "$command" >&2
+else
+ /usr/sbin/dtrace -x dynvarsize=$buf -n "$dtrace" -p "$pid" >&2
+fi
+
diff --git a/Proc/fddist b/Proc/fddist
new file mode 100755
index 000000000000..b1fe17ad4d9e
--- /dev/null
+++ b/Proc/fddist
@@ -0,0 +1,116 @@
+#!/usr/bin/sh
+#
+# fddist - file descriptor usage distributions.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This prints distributions for read and write events by file descriptor,
+# by process. This can be used to determine which file descriptor a
+# process is doing the most I/O with.
+#
+# $Id: fddist 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: fddist [-r|-w] # hit Ctrl-C to end sample
+#
+# FIELDS:
+# EXEC process name
+# PID process ID
+# value file descriptor
+# count number of events
+#
+# BASED ON: /usr/demo/dtrace/lquantize.d
+#
+# SEE ALSO:
+# DTrace Guide "Aggregations" chapter (docs.sun.com)
+#
+# PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# 09-Jun-2005 Brendan Gregg Created this.
+# 20-Apr-2006 " " Last update.
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+opt_read=0; opt_write=0
+
+### Process options
+while getopts hrw name
+do
+ case $name in
+ r) opt_read=1 ;;
+ w) opt_write=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: fddist [-r|-w]
+ -r # reads only
+ -w # writes only
+ eg,
+ fddist # default, r+w counts
+ fddist -r # read count only
+ END
+ exit 1
+ esac
+done
+shift `expr $OPTIND - 1`
+
+### Option logic
+if [ $opt_read -eq 0 -a $opt_write -eq 0 ]; then
+ opt_read=1; opt_write=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+
+ inline int OPT_read = '$opt_read';
+ inline int OPT_write = '$opt_write';
+ inline int FDMAX = 255;
+
+ /* print header */
+ dtrace:::BEGIN
+ {
+ printf("Tracing ");
+ OPT_read && OPT_write ? printf("reads and writes") : 1;
+ OPT_read && ! OPT_write ? printf("reads") : 1;
+ ! OPT_read && OPT_write ? printf("writes") : 1;
+ printf("... Hit Ctrl-C to end.\n");
+ }
+
+ /* sample reads */
+ syscall::*read*:entry
+ /OPT_read/
+ {
+ @Count[execname, pid] = lquantize(arg0, 0, FDMAX, 1);
+ }
+
+ /* sample writes */
+ syscall::*write*:entry
+ /OPT_write/
+ {
+ @Count[execname, pid] = lquantize(arg0, 0, FDMAX, 1);
+ }
+
+ /* print report */
+ dtrace:::END
+ {
+ printa("EXEC: %-16s PID: %d\n%@d\n",@Count);
+ }
+'
diff --git a/Proc/filebyproc.d b/Proc/filebyproc.d
new file mode 100755
index 000000000000..d1f75897bf17
--- /dev/null
+++ b/Proc/filebyproc.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * filebyproc.d - snoop files opened by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: filebyproc.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+syscall::open*:entry { printf("%s %s", execname, copyinstr(arg0)); }
diff --git a/Proc/kill.d b/Proc/kill.d
new file mode 100755
index 000000000000..215625f84f4b
--- /dev/null
+++ b/Proc/kill.d
@@ -0,0 +1,63 @@
+#!/usr/sbin/dtrace -qs
+/*
+ * kill.d - watch process signals as they are sent (eg, kill -9).
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * $Id: kill.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: kill.d
+ *
+ * FIELDS:
+ * FROM source PID
+ * COMMAND source command name
+ * TO destination PID
+ * SIG destination signal ("9" for a kill -9)
+ * RESULT result of signal (-1 is for failure)
+ *
+ * SEE ALSO: Chapter 25, Solaris Dynamic Tracing Guide, docs.sun.com,
+ * for a solution using proc:::signal-send.
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-May-2004 Brendan Gregg Created this.
+ * 28-Jun-2005 " " Last update.
+ */
+
+dtrace:::BEGIN
+{
+ /* Print header */
+ printf("%5s %12s %5s %-6s %s\n",
+ "FROM", "COMMAND", "SIG", "TO", "RESULT");
+}
+
+syscall::kill:entry
+{
+ /* Record target PID and signal */
+ self->target = arg0;
+ self->signal = arg1;
+}
+
+syscall::kill:return
+{
+ /* Print source, target, and result */
+ printf("%5d %12s %5d %-6d %d\n",
+ pid, execname, self->signal, self->target, (int)arg0);
+
+ /* Cleanup memory */
+ self->target = 0;
+ self->signal = 0;
+}
diff --git a/Proc/lastwords b/Proc/lastwords
new file mode 100755
index 000000000000..1258cc94edb9
--- /dev/null
+++ b/Proc/lastwords
@@ -0,0 +1,90 @@
+#!/usr/bin/ksh
+#
+# lastwords - print last few syscalls for dying processes.
+# Written using DTrace (Solaris 10 3/05).
+#
+# $Id: lastwords 3 2007-08-01 10:50:08Z brendan $
+#
+# This prints the last few system calls for processes matching
+# the given name, when they exit. This makes use of a ring buffer
+# so that the impact on the system is minimised.
+#
+# USAGE: lastwords command
+# eg,
+# lastwords netscape
+#
+# FIELDS:
+# TIME Time of syscall return, ns
+# PID Process ID
+# EXEC Process name (execname)
+# SYSCALL System call
+# RETURN Return value for system call
+# ERR errno for system call
+#
+# BASED ON: /usr/demo/dtrace/ring.d
+#
+# SEE ALSO: DTrace Guide "Buffers and Buffering" chapter (docs.sun.com)
+# dtruss (DTraceToolkit)
+#
+# PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# 09-Jun-2005 Brendan Gregg Created this.
+# 20-Apr-2006 " " Last update.
+#
+
+### Usage
+function usage
+{
+ cat <<-END >&2
+ USAGE: lastwords command
+ eg,
+ lastwords netscape
+ END
+ exit 1
+}
+
+### Process arguments
+if (( $# != 1 )); then
+ usage
+fi
+command=$1
+
+print "Tracing... Waiting for $command to exit..."
+
+### Run DTrace
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+ #pragma D option bufpolicy=ring
+ #pragma D option bufsize=16k
+
+ syscall:::return
+ /execname == $$1/
+ {
+ /* buffer syscall details */
+ printf("%-18d %5d %12s %12s %10x %3d\n",
+ timestamp,pid,execname,probefunc,(int)arg0,errno);
+ }
+
+ proc::proc_exit:exit
+ /execname == $$1/
+ {
+ /* print, erm, footer */
+ printf("%-18s %5s %12s %12s %10s %3s\n",
+ "TIME","PID","EXEC","SYSCALL","RETURN","ERR");
+ exit(0);
+ }
+' "$command"
diff --git a/Proc/mmapfiles.d b/Proc/mmapfiles.d
new file mode 100755
index 000000000000..7690f509576b
--- /dev/null
+++ b/Proc/mmapfiles.d
@@ -0,0 +1,62 @@
+#!/usr/sbin/dtrace -s
+/*
+ * mmapfiles.d - mmap'd files by process.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * $Id: mmapfiles.d 14 2007-09-11 08:03:35Z brendan $
+ *
+ * USAGE: mmapfiles.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * MMAPS number of mmaps
+ * CMD process name
+ * PATHNAME pathname of mmap'd file
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 18-Oct-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+syscall::mmap:entry
+/(int)arg4 > 0/
+{
+ /*
+ * Fetch filename
+ */
+ this->filep = curthread->t_procp->p_user.u_finfo.fi_list[arg4].uf_file;
+ this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0;
+ self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ?
+ cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>";
+
+ /* Store Details */
+ @hits[execname, self->vpath] = count();
+}
+
+dtrace:::END
+{
+ /* Print Details */
+ printf("%5s %-16s %s\n", "MMAPS", "CMD", "PATHNAME");
+ printa("%@5d %-16s %s\n", @hits);
+}
diff --git a/Proc/newproc.d b/Proc/newproc.d
new file mode 100755
index 000000000000..6b6fad2af927
--- /dev/null
+++ b/Proc/newproc.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * newproc.d - snoop new processes as they are executed. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: newproc.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+proc:::exec-success { trace(curpsinfo->pr_psargs); }
diff --git a/Proc/pathopens.d b/Proc/pathopens.d
new file mode 100755
index 000000000000..10cd0c820568
--- /dev/null
+++ b/Proc/pathopens.d
@@ -0,0 +1,100 @@
+#!/usr/sbin/dtrace -s
+/*
+ * pathopens.d - full pathnames opened successfully count.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This program prints a count of the number of times files have been
+ * successfully opened. This is somewhat special in that the full pathname
+ * is calculated, even if the file open referred to a relative pathname.
+ *
+ * $Id: pathopens.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: fileopens.d
+ *
+ * FIELDS:
+ * PATHNAME full pathname
+ * COUNT number of successful opens
+ *
+ * Similar to a script from DExplorer.
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 28-Jun-2005 Brendan Gregg Created this.
+ * 12-Jan-2006 " " Fixed known error.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+syscall::open*:entry
+{
+ self->pathp = arg0;
+ self->ok = 1;
+}
+
+syscall::open*:return
+/self->ok && arg0 != -1/
+{
+ self->file = copyinstr(self->pathp);
+ self->char0 = copyin(self->pathp, 1);
+
+ /* fetch current working directory */
+ this->path = curthread->t_procp->p_user.u_cdir->v_path;
+
+ /*
+ * Make the full pathname
+ *
+ * This routine takes the cwd and the filename, and generates a
+ * full pathname. Sometimes the filename is absolute, so we must
+ * ignore the cwd. This also checks if the cwd ends in an
+ * unnecessary '/'.
+ */
+ this->len = strlen(this->path);
+ self->join = *(char *)(this->path + this->len - 1) == '/' ? "" : "/";
+ self->dir = strjoin(cwd, self->join);
+ self->dir = *(char *)self->char0 == '/' ? "" : self->dir;
+ self->full = strjoin(self->dir, self->file);
+
+ /* save to aggregation */
+ @num[self->full] = count();
+
+ /* cleanup */
+ self->join = 0;
+ self->full = 0;
+ self->dir = 0;
+ self->file = 0;
+ self->char0 = 0;
+}
+
+syscall::open*:return
+/self->ok/
+{
+ /* cleanup */
+ self->ok = 0;
+ self->pathp = 0;
+}
+
+dtrace:::END
+{
+ printf("%6s %s\n", "COUNT", "PATHNAME");
+ printa("%@6d %s\n", @num);
+}
diff --git a/Proc/pfilestat b/Proc/pfilestat
new file mode 100755
index 000000000000..c6aaba3a0c21
--- /dev/null
+++ b/Proc/pfilestat
@@ -0,0 +1,282 @@
+#!/usr/bin/sh
+#
+# pfilestat
+#
+# This prints I/O statistics for each file descriptor within a process.
+# In particular, the time break down during read() and write() events is
+# measured.
+#
+# $Id: pfilestat 4 2007-08-01 11:01:38Z brendan $
+#
+# USAGE: pfilestat [-r|-w] pid
+#
+# FIELDS:
+# STATE microstate: running, sleeping, waitcpu, read, write
+# FDUM File Descriptor ID
+# Time Percentage of wallclock time in each STATE
+# File Name of file, if known
+#
+# COPYRIGHT: Copyright (c) 2006 Richard McDougall.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# ToDo:
+# Trace readv() and writev().
+#
+# 20-Feb-2006 Richard McDougall created this.
+# 24-Feb-2006 Brendan Gregg tweaked code.
+# 20-Mar-2006 " " tweaked code.
+# 20-Mar-2006 " " last update.
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+opt_read=0; opt_write=0
+
+### Process options
+while getopts hrw name
+do
+ case $name in
+ r) opt_read=1 ;;
+ w) opt_write=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: pfilestat [-r|-w] pid
+ -r # reads only
+ -w # writes only
+ eg,
+ pfilestat pid # default, r+w counts
+ pfilestat -r pid # read count only
+ END
+ exit 1
+ esac
+done
+shift `expr $OPTIND - 1`
+
+PID=$1
+clearstr=`clear`
+
+if [ -z "$PID" ]
+then
+ echo "Must supply pid"
+ exit 1
+fi
+
+### Option logic
+if [ $opt_read -eq 0 -a $opt_write -eq 0 ]; then
+ opt_read=1; opt_write=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+
+ inline string CLEAR = "'$clearstr'";
+ inline int OPT_read = '$opt_read';
+ inline int OPT_write = '$opt_write';
+ inline int PID = '$PID';
+
+ unsigned long long totaltime;
+ unsigned long long totalbytes;
+
+ enum runstate {
+ READ,
+ WRITE,
+ OTHER
+ };
+
+ /* print header */
+ dtrace:::BEGIN
+ {
+ printf("Tracing ");
+ OPT_read && OPT_write ? printf("reads and writes") : 1;
+ OPT_read && ! OPT_write ? printf("reads") : 1;
+ ! OPT_read && OPT_write ? printf("writes") : 1;
+ printf("...");
+ totaltime = 0;
+ totalbytes = 0;
+ last = timestamp;
+ stamp = timestamp;
+ }
+
+ /* sample reads */
+ syscall::read:entry,
+ syscall::pread*:entry
+ /pid == PID && OPT_read/
+ {
+ runstate = READ;
+ @logical["running", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+
+ self->fd = arg0 + 1;
+ }
+
+ fbt::fop_read:entry,
+ fbt::fop_write:entry
+ /self->fd/
+ {
+ self->path = args[0]->v_path == 0 ? "<none>" :
+ cleanpath(args[0]->v_path);
+ }
+
+ syscall::read:return,
+ syscall::pread*:return
+ /pid == PID && OPT_read/
+ {
+ runstate = OTHER;
+ this->bytes = (int)arg0 > 0 ? (int)arg0 : 0;
+ @logical["read", self->fd - 1, self->path] = sum(timestamp - last);
+ @bytes["read", self->fd - 1, self->path] = sum(this->bytes);
+ totalbytes += this->bytes;
+ totaltime += timestamp - last;
+ last = timestamp;
+ self->path = 0;
+ self->fd = 0;
+ }
+
+
+ /* sample writes */
+ syscall::write:entry,
+ syscall::pwrite*:entry
+ /pid == PID && OPT_write/
+ {
+ runstate = WRITE;
+ @logical["running", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+
+ self->fd = (int)arg0 + 1;
+ }
+
+ syscall::write:return,
+ syscall::pwrite*:return
+ /pid == PID && OPT_write/
+ {
+ runstate = OTHER;
+ this->bytes = (int)arg0 > 0 ? (int)arg0 : 0;
+ @logical["write", self->fd - 1, self->path] = sum(timestamp - last);
+ @bytes["write", self->fd - 1, self->path] = sum(this->bytes);
+ totalbytes += this->bytes;
+ totaltime += timestamp - last;
+ last = timestamp;
+ self->path = 0;
+ self->fd = 0;
+ }
+
+ sched:::on-cpu
+ /pid == PID/
+ {
+ @logical["waitcpu", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+ }
+
+
+ sched:::off-cpu
+ /pid == PID/
+ {
+ @logical["running", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+ }
+
+ sched:::sleep
+ /pid == PID/
+ {
+ @logical["running", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+ }
+
+ sched:::wakeup
+ /args[1]->pr_pid == PID && runstate == OTHER/
+ {
+ @logical["sleep", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+ }
+
+ sched:::wakeup
+ /args[1]->pr_pid == PID && runstate == READ/
+ {
+ @logical["sleep-r", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+ }
+
+ sched:::wakeup
+ /args[1]->pr_pid == PID && runstate == WRITE/
+ {
+ @logical["sleep-w", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+ }
+
+ sched:::enqueue
+ /args[1]->pr_pid == PID/
+ {
+ @logical["waitcpu", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+ }
+
+ sched:::dequeue
+ /args[1]->pr_pid == PID/
+ {
+ @logical["waitcpu", (uint64_t)0, ""] = sum(timestamp - last);
+ totaltime += timestamp - last;
+ last = timestamp;
+ }
+
+ /* print report */
+ profile:::tick-5s
+ {
+ printf("%s", CLEAR);
+ normalize(@logical, totaltime / 100);
+ trunc(@logical, 10);
+ printf("%10s %7s %9s %-44s\n", "STATE", "FDNUM", "Time", "Filename");
+ printa("%10s %7d %@8d%% %-44.44s\n", @logical);
+ trunc(@logical);
+
+ delta = timestamp - stamp;
+ stamp = timestamp;
+ normalize(@bytes, (1024 * delta) / 1000000000);
+ trunc(@bytes, 10);
+ printf("\n%10s %7s %9s %-44s\n", "STATE", "FDNUM", "KB/s",
+ "Filename");
+ printa("%10s %7d %@9d %-44.44s\n", @bytes);
+ trunc(@bytes);
+
+ printf("\nTotal event time (ms): %d Total Mbytes/sec: %d\n",
+ totaltime / 1000000,
+ (totalbytes * 1000000000) / (delta * 1048576));
+
+ totaltime = 0;
+ totalbytes = 0;
+ last = timestamp;
+ }
+
+ dtrace:::END
+ {
+ trunc(@logical);
+ trunc(@bytes);
+ }
+'
diff --git a/Proc/pidpersec.d b/Proc/pidpersec.d
new file mode 100755
index 000000000000..71080b9e7527
--- /dev/null
+++ b/Proc/pidpersec.d
@@ -0,0 +1,57 @@
+#!/usr/sbin/dtrace -s
+/*
+ * pidpersec.d - print new PIDs per sec.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This script prints the number of new processes created per second.
+ *
+ * $Id: pidpersec.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: pidpersec.d
+ *
+ * FIELDS:
+ *
+ * TIME Time, as a string
+ * LASTPID Last PID created
+ * PID/s Number of processes created per second
+ *
+ * SEE ALSO: execsnoop
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Jun-2005 Brendan Gregg Created this.
+ * 09-Jun-2005 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("%-22s %8s %6s\n", "TIME", "LASTPID", "PID/s");
+ pids = 0;
+}
+
+proc:::exec-success
+{
+ pids++;
+}
+
+profile:::tick-1sec
+{
+ printf("%-22Y %8d %6d\n", walltimestamp, `mpid, pids);
+ pids = 0;
+}
diff --git a/Proc/readbytes.d b/Proc/readbytes.d
new file mode 100755
index 000000000000..67612a2d5e0f
--- /dev/null
+++ b/Proc/readbytes.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * readbytes.d - read bytes by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: readbytes.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+sysinfo:::readch { @bytes[execname] = sum(arg0); }
diff --git a/Proc/readdist.d b/Proc/readdist.d
new file mode 100755
index 000000000000..0d0346dd8b91
--- /dev/null
+++ b/Proc/readdist.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * readdist.d - read distribution by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: readdist.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+sysinfo:::readch { @dist[execname] = quantize(arg0); }
diff --git a/Proc/rwbbypid.d b/Proc/rwbbypid.d
new file mode 100755
index 000000000000..72cb00df59ed
--- /dev/null
+++ b/Proc/rwbbypid.d
@@ -0,0 +1,61 @@
+#!/usr/sbin/dtrace -s
+/*
+ * rwbbypid.d - read/write bytes by PID.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This script tracks the bytes read and written at the syscall level
+ * by processes, printing the totals in a report. This is tracking the
+ * successful number of bytes read or written.
+ *
+ * $Id: rwbbypid.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: rwbbypid.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD process name
+ * DIR direction, Read or Write
+ * BYTES total bytes
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 28-Jun-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sysinfo:::readch
+{
+ @bytes[pid, execname, "R"] = sum(arg0);
+}
+
+sysinfo:::writech
+{
+ @bytes[pid, execname, "W"] = sum(arg0);
+}
+
+dtrace:::END
+{
+ printf("%6s %-24s %4s %16s\n", "PID", "CMD", "DIR", "BYTES");
+ printa("%6d %-24s %4s %@16d\n", @bytes);
+}
diff --git a/Proc/rwbypid.d b/Proc/rwbypid.d
new file mode 100755
index 000000000000..e4f0432f1ae1
--- /dev/null
+++ b/Proc/rwbypid.d
@@ -0,0 +1,61 @@
+#!/usr/sbin/dtrace -s
+/*
+ * rwbypid.d - read/write calls by PID.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This script tracks the number of reads and writes at the syscall level
+ * by processes, printing the totals in a report. This matches reads
+ * and writes whether they succeed or not.
+ *
+ * $Id: rwbypid.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: rwbypid.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD process name
+ * DIR Read or Write
+ * COUNT total calls
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 28-Jun-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+syscall::*read*:entry
+{
+ @calls[pid, execname, "R"] = sum(arg0);
+}
+
+syscall::*write*:entry
+{
+ @calls[pid, execname, "W"] = sum(arg0);
+}
+
+dtrace:::END
+{
+ printf("%6s %-24s %4s %8s\n", "PID", "CMD", "DIR", "COUNT");
+ printa("%6d %-24s %4s %@8d\n", @calls);
+}
diff --git a/Proc/rwbytype.d b/Proc/rwbytype.d
new file mode 100755
index 000000000000..6705d99f3cdb
--- /dev/null
+++ b/Proc/rwbytype.d
@@ -0,0 +1,101 @@
+#!/usr/sbin/dtrace -s
+/*
+ * rwbytype.d - read/write bytes by vnode type.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This program identifies the vnode type of read/write activity - whether
+ * that is for regular files, sockets, character special devices, etc.
+ *
+ * $Id: rwbytype.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: rwbytype.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * PID number of rwbytype
+ * CMD process name
+ * VTYPE vnode type (describes I/O type)
+ * DIR direction (Read/Write)
+ * BYTES bytes transferred
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 18-Oct-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+typedef struct vtype2str {
+ string code;
+};
+
+translator struct vtype2str < int T > {
+ /* the order has been picked for performance reasons */
+ code =
+ T == 1 ? "reg" :
+ T == 9 ? "sock" :
+ T == 4 ? "chr" :
+ T == 6 ? "fifo" :
+ T == 8 ? "proc" :
+ T == 2 ? "dir" :
+ T == 3 ? "blk" :
+ T == 5 ? "lnk" :
+ T == 7 ? "door" :
+ T == 10 ? "port" :
+ T == 11 ? "bad" : "non";
+};
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+fbt::fop_read:entry,
+fbt::fop_write:entry
+{
+ self->type = xlate <struct vtype2str *>(args[0]->v_type)->code;
+ self->size = args[1]->uio_resid;
+ self->uiop = args[1];
+}
+
+fbt::fop_read:return
+/self->uiop/
+{
+ this->resid = self->uiop->uio_resid;
+ @bytes[pid, execname, self->type, "R"] = sum(self->size - this->resid);
+ self->type = 0;
+ self->size = 0;
+ self->uiop = 0;
+}
+
+/* this is delibrately redundant code for performance reasons */
+fbt::fop_write:return
+/self->uiop/
+{
+ this->resid = self->uiop->uio_resid;
+ @bytes[pid, execname, self->type, "W"] = sum(self->size - this->resid);
+ self->type = 0;
+ self->size = 0;
+ self->uiop = 0;
+}
+
+dtrace:::END
+{
+ printf("%-6s %-16s %6s %4s %9s\n",
+ "PID", "CMD", "VTYPE", "DIR", "BYTES");
+ printa("%-6d %-16s %6s %4s %@9d\n", @bytes);
+}
diff --git a/Proc/sampleproc b/Proc/sampleproc
new file mode 100755
index 000000000000..891be1465094
--- /dev/null
+++ b/Proc/sampleproc
@@ -0,0 +1,105 @@
+#!/usr/bin/ksh
+#
+# sampleproc - sample processes on the CPUs.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This program samples which process is on each CPU, at a particular
+# configurable rate. This can be used as an estimate for which process
+# is consuming the most CPU time.
+#
+# $Id: sampleproc 8 2007-08-06 05:55:26Z brendan $
+#
+# USAGE: sampleproc [hertz] # hit Ctrl-C to end sample
+#
+# FIELDS:
+# PID Process ID
+# COMMAND Command name
+# COUNT Number of samples
+# PERCENT Percent of CPU usage
+#
+# BASED ON: /usr/demo/dtrace/prof.d
+#
+# SEE ALSO:
+# DTrace Guide "profile Provider" chapter (docs.sun.com)
+#
+# PORTIONS: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# 09-Jun-2005 Brendan Gregg Created this.
+# 09-Jul-2005 " " Last update.
+
+### Usage
+function usage
+{
+ cat <<-END >&2
+ USAGE: sampleproc [hertz]
+ eg,
+ sampleproc # defaults to 100 hertz
+ sampleproc 1000 # 1000 hertz
+ END
+ exit 1
+}
+
+### Process arguments
+if (( $# == 0 )); then
+ hertz=100
+elif (( $# == 1 )); then
+ hertz=$1
+ if [[ "$hertz" = *[a-zA-Z]* ]]; then
+ print "ERROR2: $hertz hertz is invalid." >&2
+ exit 2
+ fi
+ if (( hertz > 5000 )); then
+ print "ERROR3: $hertz hertz is too fast (max 5000)." >&2
+ exit 3
+ fi
+ if (( hertz < 1 )); then
+ print "ERROR4: $hertz hertz is too low (min 1)." >&2
+ exit 4
+ fi
+else
+ usage
+fi
+
+### Run DTrace
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+
+ dtrace:::BEGIN
+ {
+ printf("Sampling at %d hertz... Hit Ctrl-C to end.\n",$1);
+ self->start = timestamp;
+ }
+
+ profile:::profile-$1
+ {
+ @Proc[pid, execname] = count();
+ @BigProc[pid, execname] = sum(1000); /* dont ask */
+ }
+
+ dtrace:::END
+ {
+ this->end = timestamp;
+
+ printf("%5s %-20s %10s\n", "PID", "CMD", "COUNT");
+ printa("%5d %-20s %10@d\n", @Proc);
+
+ normalize(@BigProc,
+ ((`ncpus_online * $1 * (this->end - self->start))/100000000));
+ printf("\n%5s %-20s %10s\n", "PID", "CMD", "PERCENT");
+ printa("%5d %-20s %10@d\n", @BigProc);
+ }
+' $hertz
diff --git a/Proc/shortlived.d b/Proc/shortlived.d
new file mode 100755
index 000000000000..268c370d11e8
--- /dev/null
+++ b/Proc/shortlived.d
@@ -0,0 +1,118 @@
+#!/usr/sbin/dtrace -qs
+/*
+ * shortlived.d - determine time spent by short lived processes.
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * $Id: shortlived.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: shortlived.d # wait, then hit Ctrl-C
+ *
+ * Applications that run many short lived processes can cause load
+ * on the system that is difficult to identify - the processes
+ * aren't sampled in time by programs such as prstat. This program
+ * illustrates how much time was spent processing those extra
+ * processes, and a table of process name by total times for each.
+ *
+ * SEE ALSO: execsnoop
+ *
+ * Notes:
+ * - The measurements are minimum values, not all of the overheads
+ * caused by process generation and destruction are measured (DTrace
+ * can do so, but the script would become seriously complex).
+ * - The summary values are accurate, the by program and by PPID values
+ * are usually slightly smaller due to rounding errors.
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 22-Apr-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+/*
+ * Start
+ */
+dtrace:::BEGIN
+{
+ /* save start time */
+ start = timestamp;
+
+ /* this is time spent on shortlived processes */
+ procs = 0;
+
+ /* print header */
+ printf("Tracing... Hit Ctrl-C to stop.\n");
+}
+
+/*
+ * Measure parent fork time
+ */
+syscall::*fork*:entry
+{
+ /* save start of fork */
+ self->fork = vtimestamp;
+}
+syscall::*fork*:return
+/arg0 != 0 && self->fork/
+{
+ /* record elapsed time for the fork syscall */
+ this->elapsed = vtimestamp - self->fork;
+ procs += this->elapsed;
+ self->fork = 0;
+}
+
+/*
+ * Measure child processes time
+ */
+syscall::*fork*:return
+/arg0 == 0/
+{
+ /* save start of child process */
+ self->start = vtimestamp;
+
+ /* memory cleanup */
+ self->fork = 0;
+}
+proc:::exit
+/self->start/
+{
+ /* record elapsed time for process execution */
+ this->elapsed = vtimestamp - self->start;
+ procs += this->elapsed;
+
+ /* sum elapsed by process name and ppid */
+ @Times_exec[execname] = sum(this->elapsed/1000000);
+ @Times_ppid[ppid] = sum(this->elapsed/1000000);
+
+ /* memory cleanup */
+ self->start = 0;
+}
+
+/*
+ * Print report
+ */
+dtrace:::END
+{
+ this->total = timestamp - start;
+ printf("short lived processes: %6d.%03d secs\n",
+ procs/1000000000, (procs%1000000000)/1000000);
+ printf("total sample duration: %6d.%03d secs\n",
+ this->total/1000000000, (this->total%1000000000)/1000000);
+ printf("\nTotal time by process name,\n");
+ printa("%18s %@12d ms\n", @Times_exec);
+ printf("\nTotal time by PPID,\n");
+ printa("%18d %@12d ms\n", @Times_ppid);
+}
diff --git a/Proc/sigdist.d b/Proc/sigdist.d
new file mode 100755
index 000000000000..c3b2bc075c61
--- /dev/null
+++ b/Proc/sigdist.d
@@ -0,0 +1,61 @@
+#!/usr/sbin/dtrace -s
+/*
+ * sigdist.d - signal distribution by process name.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * This is a simple DTrace script that prints the number of signals
+ * recieved by process and signal number. This script is also available
+ * as /usr/demo/dtrace/sig.d, where it originates.
+ *
+ * $Id: sigdist.d 4 2007-08-01 11:01:38Z brendan $
+ *
+ * USAGE: sigdist.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * SENDER process name of sender
+ * RECIPIENT process name of target
+ * SIG signal number, see signal(3head)
+ * COUNT number of signals sent
+ *
+ * BASED ON: /usr/demo/dtrace/sig.d
+ *
+ * SEE ALSO: DTrace Guide "proc Provider" chapter (docs.sun.com)
+ * kill.d(1M)
+ *
+ * PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Jun-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+proc:::signal-send
+{
+ @Count[execname, stringof(args[1]->pr_fname), args[2]] = count();
+}
+
+dtrace:::END
+{
+ printf("%16s %16s %6s %6s\n", "SENDER", "RECIPIENT", "SIG", "COUNT");
+ printa("%16s %16s %6d %6@d\n", @Count);
+}
diff --git a/Proc/stacksize.d b/Proc/stacksize.d
new file mode 100755
index 000000000000..fedcfbc6e788
--- /dev/null
+++ b/Proc/stacksize.d
@@ -0,0 +1,95 @@
+#!/usr/sbin/dtrace -s
+/*
+ * stacksize.d - measure stack size for running threads.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * $Id: stacksize.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: stacksize.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * value size of the user stack
+ * count number of samples at this size
+ *
+ * SEE ALSO: pmap(1)
+ *
+ * COPYRIGHT: Copyright (c) 2006 Jonathan Adams
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 16-Feb-2006 Jonathan Adams Created this.
+ * 16-Feb-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+this uintptr_t stkinfoptr;
+this uintptr_t stkptr;
+
+dtrace:::BEGIN
+{
+ trace("Sampling... Hit Ctrl-C to end\n");
+}
+
+sched:::on-cpu, profile:::profile-997
+{
+ this->stkinfoptr = 0;
+ this->stkptr = 0;
+}
+
+sched:::on-cpu, profile:::profile-997
+/execname != "sched"/
+{
+ this->stkinfoptr = curthread->t_lwp->lwp_ustack;
+ this->stkptr = (uintptr_t)0;
+}
+
+sched:::on-cpu, profile:::profile-997
+/this->stkinfoptr != 0 && curpsinfo->pr_dmodel == PR_MODEL_ILP32/
+{
+ this->stkinfo32 = (stack32_t *)copyin(this->stkinfoptr,
+ sizeof (stack32_t));
+ this->stktop = (uintptr_t)this->stkinfo32->ss_sp +
+ this->stkinfo32->ss_size;
+ this->stkptr = (uintptr_t)uregs[R_SP];
+}
+
+sched:::on-cpu, profile:::profile-997
+/this->stkinfoptr != 0 && curpsinfo->pr_dmodel == PR_MODEL_LP64/
+{
+ this->stkinfo = (stack_t *)copyin(this->stkinfoptr,
+ sizeof (stack_t));
+ this->stktop = (uintptr_t)this->stkinfo->ss_sp +
+ this->stkinfo->ss_size;
+ this->stkptr = (uintptr_t)uregs[R_SP];
+}
+
+sched:::on-cpu, profile:::profile-997
+/this->stkptr != 0/
+{
+ @sizes[execname] = quantize(this->stktop - this->stkptr);
+}
+
+dtrace:::ERROR
+{
+ @errors[execname] = count();
+}
+
+dtrace:::END
+{
+ printa(@sizes);
+ printf("\nErrors:\n");
+ printa(" %@d %s\n", @errors);
+}
diff --git a/Proc/sysbypid.d b/Proc/sysbypid.d
new file mode 100755
index 000000000000..bb806538c9d2
--- /dev/null
+++ b/Proc/sysbypid.d
@@ -0,0 +1,53 @@
+#!/usr/sbin/dtrace -s
+/*
+ * sysbypid.d - print sysinfo events by process.
+ * Uses DTrace (Solaris 10 3/05).
+ *
+ * $Id: sysbypid.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: sysbypid.d
+ *
+ * FIELDS:
+ * EXEC Process name
+ * PID Process ID
+ * SYS System statistic (see /usr/include/sys/sysinfo.h)
+ * VALUE Value by which statistic was incremented
+ *
+ * The virtual memory statistics are documented in the cpu_sysinfo struct
+ * in the /usr/include/sys/sysinfo.h file; and also in the sysinfo provider
+ * chapter of the DTrace Guide, http://docs.sun.com/db/doc/817-6223.
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 14-May-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN {
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sysinfo::: {
+ @Sys[execname, pid, probename] = sum(arg0);
+}
+
+dtrace:::END {
+ printf("%16s %8s %22s %8s\n", "EXEC", "PID", "SYS", "VALUE");
+ printa("%16s %8d %22s %@8d\n", @Sys);
+}
diff --git a/Proc/syscallbypid.d b/Proc/syscallbypid.d
new file mode 100755
index 000000000000..f33ac027ea9a
--- /dev/null
+++ b/Proc/syscallbypid.d
@@ -0,0 +1,54 @@
+#!/usr/sbin/dtrace -s
+/*
+ * syscallbypid.d - report on syscalls by PID.
+ * Written using DTrace (Solaris 10 3/05)
+ *
+ * $Id: syscallbypid.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: syscallbypid.d # hit Ctrl-C to end sample
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD process name
+ * SYSCALL syscall name
+ * COUNT number of syscalls for this PID
+ *
+ * This is based on a script from DExplorer.
+ *
+ * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 15-May-2005 Brendan Gregg Created this.
+ * 20-Apr-2006 " " Last update.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+syscall:::entry
+{
+ @num[pid, execname, probefunc] = count();
+}
+
+dtrace:::END
+{
+ printf("%6s %-24s %-24s %8s\n", "PID", "CMD", "SYSCALL", "COUNT");
+ printa("%6d %-24s %-24s %@8d\n", @num);
+}
diff --git a/Proc/syscallbyproc.d b/Proc/syscallbyproc.d
new file mode 100755
index 000000000000..d0faa75556e4
--- /dev/null
+++ b/Proc/syscallbyproc.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * syscallbyproc.d - report on syscalls by process name . DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: syscallbyproc.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+syscall:::entry { @num[execname] = count(); }
diff --git a/Proc/threaded.d b/Proc/threaded.d
new file mode 100755
index 000000000000..7f5770b54825
--- /dev/null
+++ b/Proc/threaded.d
@@ -0,0 +1,66 @@
+#!/usr/sbin/dtrace -s
+/*
+ * threaded.d - sample multi-threaded CPU usage.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This measures thread IDs as a process runs across multiple CPUs.
+ * It is a simple script that can help determine if a multi-threaded
+ * application is effectively using it's threads, or if the threads have
+ * serialised. See the example file in Docs/Examples/threaded_example.txt
+ * for a demonstration.
+ *
+ * $Id: threaded.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: threaded.d
+ *
+ * FIELDS:
+ * PID process ID
+ * CMD process name
+ * value thread ID
+ * count number of samples
+ *
+ * SEE ALSO: prstat -L
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * Author: Brendan Gregg [Sydney, Australia]
+ *
+ * 25-Jul-2005 Brendan Gregg Created this.
+ * 25-Jul-2005 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Sample at 100 Hertz
+ */
+profile:::profile-100
+/pid != 0/
+{
+ @sample[pid, execname] = lquantize(tid, 0, 128, 1);
+}
+
+/*
+ * Print output every 1 second
+ */
+profile:::tick-1sec
+{
+ printf("%Y,\n", walltimestamp);
+ printa("\n PID: %-8d CMD: %s\n%@d", @sample);
+ printf("\n");
+ trunc(@sample);
+}
diff --git a/Proc/topsysproc b/Proc/topsysproc
new file mode 100755
index 000000000000..5836f6848bc3
--- /dev/null
+++ b/Proc/topsysproc
@@ -0,0 +1,121 @@
+#!/usr/bin/sh
+#
+# topsysproc - display top syscalls by process name.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This program continually prints a report of the number of system calls
+# by process name, and refreshes the display every 1 second or as specified
+# at the command line. Similar data can be fetched with "prstat -m".
+#
+# $Id: topsysproc 19 2007-09-12 07:47:59Z brendan $
+#
+# USAGE: topsysproc [interval]
+#
+# FIELDS:
+# load avg load averages, see uptime(1)
+# syscalls total number of syscalls in this interval
+# PROCESS process name
+# COUNT number of occurances in this interval
+#
+# NOTE: There may be several PIDs with the same process name.
+#
+# SEE ALSO: prstat(1M)
+#
+# INSPIRATION: top(1) by William LeFebvre
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# 13-Jun-2005 Brendan Gregg Created this.
+# 20-Apr-2006 " " Last update.
+#
+
+#
+# Check options
+#
+if [ "$1" = "-h" -o "$1" = "--help" ]; then
+ cat <<-END
+ USAGE: topsysproc [interval]
+ eg,
+ topsysproc # default, 1 second updates
+ topsysproc 5 # 5 second updates
+ END
+ exit 1
+fi
+interval=1
+if [ "$1" -gt 0 ]; then
+ interval=$1
+fi
+
+#
+# Run DTrace
+#
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+ #pragma D option destructive
+
+ /* constants */
+ inline int INTERVAL = '$interval';
+ inline int SCREEN = 20;
+
+ /* variables */
+ dtrace:::BEGIN
+ {
+ secs = 0;
+ printf("Tracing... Please wait.\n");
+ }
+
+ /* record syscall event */
+ syscall:::entry
+ {
+ @Name[execname] = count();
+ @Total = count();
+ }
+
+ /* update screen */
+ profile:::tick-1sec
+ /++secs >= INTERVAL/
+ {
+ /* fetch load averages */
+ this->load1a = `hp_avenrun[0] / 65536;
+ this->load5a = `hp_avenrun[1] / 65536;
+ this->load15a = `hp_avenrun[2] / 65536;
+ this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536;
+ this->load5b = ((`hp_avenrun[1] % 65536) * 100) / 65536;
+ this->load15b = ((`hp_avenrun[2] % 65536) * 100) / 65536;
+
+ /* clear screen */
+ system("clear");
+
+ /* print load average */
+ printf("%Y, load average: %d.%02d, %d.%02d, %d.%02d",
+ walltimestamp, this->load1a, this->load1b, this->load5a,
+ this->load5b, this->load15a, this->load15b);
+
+ /* print syscall count */
+ printa(" syscalls: %@d\n",@Total);
+
+ /* print report */
+ trunc(@Name, SCREEN);
+ printf("\n %-25s %12s\n", "PROCESS", "COUNT");
+ printa(" %-25s %@12d\n", @Name);
+
+ /* reset variables */
+ trunc(@Name);
+ clear(@Total);
+ secs = 0;
+ }
+'
diff --git a/Proc/writebytes.d b/Proc/writebytes.d
new file mode 100755
index 000000000000..1fec0e9c22b2
--- /dev/null
+++ b/Proc/writebytes.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * writebytes.d - write bytes by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: writebytes.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+sysinfo:::writech { @bytes[execname] = sum(arg0); }
diff --git a/Proc/writedist.d b/Proc/writedist.d
new file mode 100755
index 000000000000..099c2525b6c6
--- /dev/null
+++ b/Proc/writedist.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * writedist.d - write distribution by process name. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: writedist.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+sysinfo:::writech { @dist[execname] = quantize(arg0); }
diff --git a/Python/Readme b/Python/Readme
new file mode 100644
index 000000000000..f183c74fe64d
--- /dev/null
+++ b/Python/Readme
@@ -0,0 +1,28 @@
+Python - DTracing Python
+
+ These scripts trace the Python programming language, and require a version
+ of Python which has been built with DTrace probes.
+
+ The Python DTrace provider was originally written by John Levon, and
+ was integrated into Solaris Nevada in build 65. If you are on a different
+ OS with DTrace and would like to use these scripts, you could download
+ Python and the Python DTrace provider patch listed in the comments here,
+
+ http://blogs.sun.com/levon/entry/python_and_dtrace_in_build
+
+ You will need patch and build Python for these probes to work.
+ Or, check if a pre-built package is available someone on opensolaris.org.
+
+ Since the DTrace Python provider may be developed further, there is a chance
+ that it has changed slightly by the time you are reading this, causing
+ these scripts to either break or behave oddly. Firstly, check for newer
+ versions of the DTraceToolkit; if it hasn't been updated and you need
+ to use these scripts immediately, then updating them shouldn't take
+ too long. The following was the state of the provider when these scripts
+ were written - check for changes and update the scripts accordingly,
+
+ provider python {
+ probe function-entry(file, subroutine, lineno)
+ probe function-return(file, subroutine, lineno)
+ };
+
diff --git a/Python/py_calldist.d b/Python/py_calldist.d
new file mode 100755
index 000000000000..1c64c10797ff
--- /dev/null
+++ b/Python/py_calldist.d
@@ -0,0 +1,82 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_calldist.d - measure Python elapsed times for functions.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_calldist.d 28 2007-09-13 10:49:37Z brendan $
+ *
+ * This traces Python activity from all programs running on the system with
+ * Python provider support.
+ *
+ * USAGE: py_calldist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of elapsed time for Python
+ * operations. Use py_calltime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the Python program
+ * 2 Type of call (func)
+ * 3 Name of call
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+python*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+python*:::function-return
+/self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->elapsed_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->elapsed_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+dtrace:::END
+{
+ printf("\nExclusive function elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive function elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Python/py_calltime.d b/Python/py_calltime.d
new file mode 100755
index 000000000000..d152b358d326
--- /dev/null
+++ b/Python/py_calltime.d
@@ -0,0 +1,89 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_calltime.d - measure Python elapsed times for functions.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_calltime.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces Python activity from all programs running on the system with
+ * Python provider support.
+ *
+ * USAGE: py_calltime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Python program
+ * TYPE Type of call (func/total)
+ * NAME Name of call
+ * TOTAL Total elapsed time for calls (us)
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+python*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+python*:::function-return
+/self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl);
+ @types_excl["-", "total", "-"] = sum(this->elapsed_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Python/py_cpudist.d b/Python/py_cpudist.d
new file mode 100755
index 000000000000..cf0e7b2a2411
--- /dev/null
+++ b/Python/py_cpudist.d
@@ -0,0 +1,82 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_cpudist.d - measure Python on-CPU times for functions.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_cpudist.d 28 2007-09-13 10:49:37Z brendan $
+ *
+ * This traces Python activity from all programs running on the system with
+ * Python provider support.
+ *
+ * USAGE: py_cpudist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of elapsed time for Python
+ * operations. Use py_cputime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the Python program
+ * 2 Type of call (func)
+ * 3 Name of call
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+python*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = vtimestamp;
+}
+
+python*:::function-return
+/self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->oncpu_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->oncpu_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+dtrace:::END
+{
+ printf("\nExclusive function on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive function on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Python/py_cputime.d b/Python/py_cputime.d
new file mode 100755
index 000000000000..ca40a93abed7
--- /dev/null
+++ b/Python/py_cputime.d
@@ -0,0 +1,89 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_cputime.d - measure Python on-CPU times for functions.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_cputime.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces Python activity from all programs running on the system with
+ * Python provider support.
+ *
+ * USAGE: py_cputime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Python program
+ * TYPE Type of call (func/total)
+ * NAME Name of call (function name)
+ * TOTAL Total on-CPU time for calls (us)
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+python*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = vtimestamp;
+}
+
+python*:::function-return
+/self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl);
+ @types_excl["-", "total", "-"] = sum(this->oncpu_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Python/py_flow.d b/Python/py_flow.d
new file mode 100755
index 000000000000..893ea7802c94
--- /dev/null
+++ b/Python/py_flow.d
@@ -0,0 +1,70 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_flow.d - snoop Python execution showing function flow.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_flow.d 51 2007-09-24 00:55:23Z brendan $
+ *
+ * This traces Python activity from all Python programs on the system
+ * running with Python provider support.
+ *
+ * USAGE: py_flow.d # hit Ctrl-C to end
+ *
+ * This watches Python function entries and returns, and indents child
+ * function calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this function belongs to
+ * FUNC Function name
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-16s -- %s\n", "C", "TIME(us)", "FILE", "FUNC");
+}
+
+python*:::function-entry
+{
+ printf("%3d %-16d %-16s %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1));
+ self->depth++;
+}
+
+python*:::function-return
+{
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-16s %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1));
+}
diff --git a/Python/py_flowinfo.d b/Python/py_flowinfo.d
new file mode 100755
index 000000000000..ccba1df7d364
--- /dev/null
+++ b/Python/py_flowinfo.d
@@ -0,0 +1,86 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_flowinfo.d - snoop Python function flow with info using DTrace.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_flowinfo.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces activity from all Python programs on the system that are
+ * running with Python provider support.
+ *
+ * USAGE: py_flowinfo.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the Python program
+ * LINE Line number of filename
+ * TYPE Type of call (func)
+ * FUNC Python function
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "FUNC");
+}
+
+python*:::function-entry,
+python*:::function-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+python*:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, this->delta,
+ basename(copyinstr(arg0)), arg2, "func", self->depth * 2, "",
+ copyinstr(arg1));
+ self->depth++;
+ self->last = timestamp;
+}
+
+python*:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%d %6d %10d %16s:%-4d %-8s %*s<- %s\n", cpu, pid, this->delta,
+ basename(copyinstr(arg0)), arg2, "func", self->depth * 2, "",
+ copyinstr(arg1));
+ self->last = timestamp;
+}
diff --git a/Python/py_flowtime.d b/Python/py_flowtime.d
new file mode 100755
index 000000000000..a339eace3aed
--- /dev/null
+++ b/Python/py_flowtime.d
@@ -0,0 +1,89 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_flowtime.d - snoop Python functions with flow and delta times.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_flowtime.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces shell activity from Python programs on the system that are
+ * running with Python provider support.
+ *
+ * USAGE: py_flowtime.d # hit Ctrl-C to end
+ *
+ * This watches Python function entries and returns, and indents child
+ * function calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this function belongs to
+ * DELTA(us) Elapsed time from previous line to this line
+ * FUNC Python function name
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+self int last;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE",
+ "DELTA(us)", "FUNC");
+}
+
+python*:::function-entry,
+python*:::function-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+python*:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %-16d %-16s %9d %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), this->delta, self->depth * 2, "",
+ copyinstr(arg1));
+ self->depth++;
+ self->last = timestamp;
+}
+
+python*:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-16s %9d %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), this->delta, self->depth * 2, "",
+ copyinstr(arg1));
+ self->last = timestamp;
+}
diff --git a/Python/py_funccalls.d b/Python/py_funccalls.d
new file mode 100755
index 000000000000..b430f293e2bb
--- /dev/null
+++ b/Python/py_funccalls.d
@@ -0,0 +1,55 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_funccalls.d - measure Python function calls using DTrace.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_funccalls.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * This traces Python activity from all running programs on the system
+ * which support the Python DTrace provider.
+ *
+ * USAGE: py_funccalls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename that contained the function
+ * FUNC Python function name
+ * CALLS Function calls during this sample
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+python*:::function-entry
+{
+ @funcs[basename(copyinstr(arg0)), copyinstr(arg1)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %-32s %-32s %8s\n", "FILE", "FUNC", "CALLS");
+ printa(" %-32s %-32s %@8d\n", @funcs);
+}
diff --git a/Python/py_malloc.d b/Python/py_malloc.d
new file mode 100755
index 000000000000..7f0860ea6360
--- /dev/null
+++ b/Python/py_malloc.d
@@ -0,0 +1,81 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_malloc.d - Python libc malloc analysis.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_malloc.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * This is an expiremental script to identify who is calling malloc() for
+ * memory allocation, and to print distribution plots of the requested bytes.
+ * If a malloc() occured while in a Python function, then that function is
+ * identified as responsible; else the caller of malloc() is identified as
+ * responsible - which will be a function from the Python engine.
+ *
+ * USAGE: py_malloc.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+python$target:::function-entry
+{
+ self->file = basename(copyinstr(arg0));
+ self->name = copyinstr(arg1);
+}
+
+python$target:::function-return
+{
+ self->file = 0;
+ self->name = 0;
+}
+
+pid$target:libc:malloc:entry
+/self->file != NULL/
+{
+ @malloc_func_size[self->file, self->name] = sum(arg0);
+ @malloc_func_dist[self->file, self->name] = quantize(arg0);
+}
+
+pid$target:libc:malloc:entry
+/self->name == NULL/
+{
+ @malloc_lib_size[usym(ucaller)] = sum(arg0);
+ @malloc_lib_dist[usym(ucaller)] = quantize(arg0);
+}
+
+
+dtrace:::END
+{
+ printf("\nPython malloc byte distributions by engine caller,\n\n");
+ printa(" %A, total bytes = %@d %@d\n", @malloc_lib_size,
+ @malloc_lib_dist);
+
+ printf("\nPython malloc byte distributions by Python file and ");
+ printf("function,\n\n");
+ printa(" %s, %s, bytes total = %@d %@d\n", @malloc_func_size,
+ @malloc_func_dist);
+}
diff --git a/Python/py_mallocstk.d b/Python/py_mallocstk.d
new file mode 100755
index 000000000000..ca428016b479
--- /dev/null
+++ b/Python/py_mallocstk.d
@@ -0,0 +1,49 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_mallocstk.d - Python libc malloc analysis with full stack traces.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_mallocstk.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * USAGE: py_mallocstk.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+/* tune as desired, */
+#pragma D option jstackframes=64
+#pragma D option jstackstrsize=1024
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+pid$target:libc:malloc:entry
+{
+ @mallocs[jstack()] = quantize(arg0);
+}
+
+dtrace:::END
+{
+ printf("\nPython malloc byte distributions by stack trace,\n\n");
+ printa(@mallocs);
+}
diff --git a/Python/py_profile.d b/Python/py_profile.d
new file mode 100755
index 000000000000..ff02df6e9327
--- /dev/null
+++ b/Python/py_profile.d
@@ -0,0 +1,79 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * py_profile.d - sample stack traces with Python translations using DTrace.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_profile.d 19 2007-09-12 07:47:59Z brendan $
+ *
+ * USAGE: py_profile.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * This samples stack traces for the process specified. This stack trace
+ * will cross the Python engine and system libraries, and insert
+ * translations for Python stack frames where appropriate. This is best
+ * explained with an example stack frame output,
+ *
+ * libpython2.4.so.1.0`PyEval_EvalFrame+0x2fbf
+ * [ ./func_loop.py:5 (func_c) ]
+ * libpython2.4.so.1.0`fast_function+0xa8
+ * libpython2.4.so.1.0`call_function+0xda
+ * libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ * [ ./func_loop.py:11 (func_b) ]
+ * libpython2.4.so.1.0`fast_function+0xa8
+ * libpython2.4.so.1.0`call_function+0xda
+ * libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ * [ ./func_loop.py:14 (func_a) ]
+ * libpython2.4.so.1.0`fast_function+0xa8
+ * libpython2.4.so.1.0`call_function+0xda
+ * libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf
+ * [ ./func_loop.py:16 (?) ]
+ *
+ * The lines in square brackets are the native Python frames, the rest
+ * are the Python engine.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option jstackstrsize=1024
+
+/*
+ * Tunables
+ */
+#define DEPTH 10 /* stack depth, frames */
+#define RATE 1001 /* sampling rate, Hertz */
+#define TOP 25 /* number of stacks to output */
+
+dtrace:::BEGIN
+{
+ printf("Sampling %d-level stacks at %d Hertz... Hit Ctrl-C to end.\n",
+ DEPTH, RATE);
+}
+
+profile-RATE
+/pid == $target/
+{
+ @stacks[jstack(DEPTH)] = count();
+}
+
+dtrace:::END
+{
+ trunc(@stacks, TOP);
+ printf("Top %d most frequently sampled stacks,\n", TOP);
+ printa(@stacks);
+}
diff --git a/Python/py_syscalls.d b/Python/py_syscalls.d
new file mode 100755
index 000000000000..2b3e44dc80b7
--- /dev/null
+++ b/Python/py_syscalls.d
@@ -0,0 +1,63 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_syscalls.d - count Python function calls and syscalls using DTrace.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_syscalls.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * USAGE: py_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Python program
+ * TYPE Type of call (func/syscall)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * Filename and function names are printed if available.
+ * The filename for syscalls may be printed as "python", if the program
+ * was invoked using the form "python filename" rather than running the
+ * program with an interpreter line.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+python$target:::function-entry
+{
+ @calls[basename(copyinstr(arg0)), "func", copyinstr(arg1)] = count();
+}
+
+syscall:::entry
+/pid == $target/
+{
+ @calls[basename(execname), "syscall", probefunc] = count();
+}
+
+dtrace:::END
+{
+ printf("\nCalls for PID %d,\n\n", $target);
+ printf(" %-32s %-10s %-22s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-32s %-10s %-22s %@8d\n", @calls);
+}
diff --git a/Python/py_syscolors.d b/Python/py_syscolors.d
new file mode 100755
index 000000000000..9f958ef23530
--- /dev/null
+++ b/Python/py_syscolors.d
@@ -0,0 +1,116 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_syscolors.d - trace Python function flow plus syscalls, in color.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_syscolors.d 27 2007-09-13 09:26:01Z brendan $
+ *
+ * USAGE: py_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * This watches Python function entries and returns, and indents child
+ * function calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the Python program
+ * LINE Line number of filename
+ * TYPE Type of call (func/syscall)
+ * NAME Python function or syscall name
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ color_python = "\033[2;35m"; /* violet, faint */
+ color_syscall = "\033[2;32m"; /* green, faint */
+ color_off = "\033[0m"; /* default */
+
+ self->depth = 0;
+ printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "NAME");
+}
+
+python$target:::function-entry,
+python$target:::function-return,
+syscall:::entry,
+syscall:::return
+/self->last == 0 && pid == $target/
+{
+ self->last = timestamp;
+}
+
+python$target:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_python,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "func",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+python$target:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_python,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "func",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->last = timestamp;
+}
+
+syscall:::entry
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall,
+ cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+syscall:::return
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall,
+ cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+proc:::exit
+/pid == $target/
+{
+ exit(0);
+}
diff --git a/Python/py_who.d b/Python/py_who.d
new file mode 100755
index 000000000000..3a772e34d85f
--- /dev/null
+++ b/Python/py_who.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * py_who.d - trace Python function execution by process using DTrace.
+ * Written for the Python DTrace provider.
+ *
+ * $Id: py_who.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * This traces Python activity from all Python programs on the system that are
+ * running with Python provider support.
+ *
+ * USAGE: py_who.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID of Python
+ * UID User ID of the owner
+ * FUNCS Number of function calls
+ * FILE Pathname of the Python program
+ *
+ * Filenames are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+python*:::function-entry
+{
+ @lines[pid, uid, copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %6s %6s %s\n", "PID", "UID", "FUNCS", "FILE");
+ printa(" %6d %6d %@6d %s\n", @lines);
+}
diff --git a/README b/README
new file mode 120000
index 000000000000..216661b1bdd6
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+Guide \ No newline at end of file
diff --git a/Ruby/Readme b/Ruby/Readme
new file mode 100644
index 000000000000..9dc3cc303981
--- /dev/null
+++ b/Ruby/Readme
@@ -0,0 +1,31 @@
+Ruby - DTracing Ruby
+
+ These scripts trace activity of the Ruby programming language, and
+ require the DTrace Ruby provider written by Joyent.
+
+ Currently, the DTrace Ruby provider is a seperate download either in
+ patch, source or binary form. Start with the "Ruby DTrace" link on
+ http://dtrace.joyent.com/, and after getting a version running, the
+ scripts in this directory should work.
+
+ Since the DTrace Ruby provider is under development, there is a chance
+ that it has changed slightly by the time you are reading this, causing
+ these scripts to either break or behave oddly. Firstly, check for newer
+ versions of the DTraceToolkit; if it hasn't been updated and you need
+ to use these scripts immediately, then updating them shouldn't take
+ too long. The following was the state of the provider when these scripts
+ were written - check for changes and update the scripts accordingly,
+
+ provider ruby {
+ probe function-entry(class, method, file, lineno);
+ probe function-return(class, method, file, lineno);
+ probe raise(errinfo, file, lineno);
+ probe rescue(file, lineno);
+ probe line(file, lineno);
+ probe gc-begin();
+ probe gc-end();
+ probe object-create-start(object, file, lineno);
+ probe object-create-done(object, file, lineno);
+ probe object-free(object);
+ };
+
diff --git a/Ruby/rb_calldist.d b/Ruby/rb_calldist.d
new file mode 100755
index 000000000000..e3018eaf9761
--- /dev/null
+++ b/Ruby/rb_calldist.d
@@ -0,0 +1,120 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_calldist.d - measure Ruby elapsed times for types of operation.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_calldist.d 28 2007-09-13 10:49:37Z brendan $
+ *
+ * This traces Ruby activity from all programs running on the system with
+ * Ruby provider support.
+ *
+ * USAGE: rb_calldist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of elapsed time for Ruby
+ * operations. Use rb_calltime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the Ruby program
+ * 2 Type of call (method/obj-new/gc)
+ * 3 Name of call
+ *
+ * Filename and method names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+ruby*:::function-return
+/self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg2));
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->elapsed_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->elapsed_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+ruby*:::object-create-start
+{
+ self->object = timestamp;
+}
+
+ruby*:::object-create-done
+/self->object/
+{
+ this->elapsed = timestamp - self->object;
+ self->object = 0;
+ this->file = basename(copyinstr(arg1));
+ this->file = this->file != NULL ? this->file : ".";
+
+ @types[this->file, "obj-new", copyinstr(arg0)] =
+ quantize(this->elapsed / 1000);
+
+ self->exclude[self->depth] += this->elapsed;
+}
+
+ruby*:::gc-begin
+{
+ self->gc = timestamp;
+}
+
+ruby*:::gc-end
+/self->gc/
+{
+ this->elapsed = timestamp - self->gc;
+ self->gc = 0;
+
+ @types[".", "gc", "-"] = quantize(this->elapsed / 1000);
+
+ self->exclude[self->depth] += this->elapsed;
+}
+
+dtrace:::END
+{
+ printf("\nElapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types);
+
+ printf("\nExclusive function elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive function elapsed times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Ruby/rb_calls.d b/Ruby/rb_calls.d
new file mode 100755
index 000000000000..10e3b5a75bc7
--- /dev/null
+++ b/Ruby/rb_calls.d
@@ -0,0 +1,87 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_calls.d - count Ruby calls using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_calls.d 28 2007-09-13 10:49:37Z brendan $
+ *
+ * This traces activity from all Ruby programs on the system that are
+ * running with Ruby provider support.
+ *
+ * USAGE: rb_calls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Ruby program
+ * TYPE Type of call (method/obj-new/...)
+ * NAME Descriptive name of call
+ * COUNT Number of calls during sample
+ *
+ * Filename and method names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::function-entry
+{
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+ @calls[basename(copyinstr(arg2)), "method", this->name] = count();
+}
+
+ruby*:::object-create-start
+{
+ this->name = copyinstr(arg0);
+ this->filename = basename(copyinstr(arg1));
+ this->filename = this->filename != NULL ? this->filename : ".";
+ @calls[this->filename, "obj-new", this->name] = count();
+}
+
+ruby*:::object-free
+{
+ this->name = copyinstr(arg0);
+ @calls[".", "obj-free", this->name] = count();
+}
+
+ruby*:::gc-begin
+{
+ @calls[".", "gc", "begin"] = count();
+}
+
+ruby*:::raise
+{
+ this->name = copyinstr(arg0);
+ @calls[basename(copyinstr(arg1)), "raise", this->name] = count();
+}
+
+ruby*:::rescue
+{
+ @calls[basename(copyinstr(arg0)), "rescue", "-"] = count();
+}
+
+dtrace:::END
+{
+ printf(" %-24s %-10s %-30s %8s\n", "FILE", "TYPE", "NAME", "CALLS");
+ printa(" %-24s %-10s %-30s %@8d\n", @calls);
+}
diff --git a/Ruby/rb_calltime.d b/Ruby/rb_calltime.d
new file mode 100755
index 000000000000..fac1261f917f
--- /dev/null
+++ b/Ruby/rb_calltime.d
@@ -0,0 +1,129 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_calltime.d - measure Ruby elapsed times for types of operation.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_calltime.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces Ruby activity from all programs running on the system with
+ * Ruby provider support.
+ *
+ * USAGE: rb_calltime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Ruby program
+ * TYPE Type of call (method/obj-new/gc/total)
+ * NAME Name of call
+ * TOTAL Total elapsed time for calls (us)
+ *
+ * Filename and method names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+ruby*:::function-return
+/self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg2));
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl);
+ @types_excl["-", "total", "-"] = sum(this->elapsed_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+ruby*:::object-create-start
+{
+ self->object = timestamp;
+}
+
+ruby*:::object-create-done
+/self->object/
+{
+ this->elapsed = timestamp - self->object;
+ self->object = 0;
+ this->file = basename(copyinstr(arg1));
+ this->file = this->file != NULL ? this->file : ".";
+ this->name = copyinstr(arg0);
+
+ @num[this->file, "obj-new", this->name] = count();
+ @types[this->file, "obj-new", this->name] = sum(this->elapsed);
+
+ self->exclude[self->depth] += this->elapsed;
+}
+
+ruby*:::gc-begin
+{
+ self->gc = timestamp;
+}
+
+ruby*:::gc-end
+/self->gc/
+{
+ this->elapsed = timestamp - self->gc;
+ self->gc = 0;
+ @num[".", "gc", "-"] = count();
+ @types[".", "gc", "-"] = sum(this->elapsed);
+ self->exclude[self->depth] += this->elapsed;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types, 1000);
+ printf("\nElapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Ruby/rb_cpudist.d b/Ruby/rb_cpudist.d
new file mode 100755
index 000000000000..daa4d1a8296a
--- /dev/null
+++ b/Ruby/rb_cpudist.d
@@ -0,0 +1,120 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_cpudist.d - measure Ruby on-CPU times for types of operation.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_cpudist.d 28 2007-09-13 10:49:37Z brendan $
+ *
+ * This traces Ruby activity from all programs running on the system with
+ * Ruby provider support.
+ *
+ * USAGE: rb_cpudist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of elapsed time for Ruby
+ * operations. Use rb_cputime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the Ruby program
+ * 2 Type of call (method/obj-new/gc)
+ * 3 Name of call
+ *
+ * Filename and method names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = vtimestamp;
+}
+
+ruby*:::function-return
+/self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg2));
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->oncpu_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->oncpu_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+ruby*:::object-create-start
+{
+ self->object = vtimestamp;
+}
+
+ruby*:::object-create-done
+/self->object/
+{
+ this->oncpu = vtimestamp - self->object;
+ self->object = 0;
+ this->file = basename(copyinstr(arg1));
+ this->file = this->file != NULL ? this->file : ".";
+
+ @types[this->file, "obj-new", copyinstr(arg0)] =
+ quantize(this->oncpu / 1000);
+
+ self->exclude[self->depth] += this->oncpu;
+}
+
+ruby*:::gc-begin
+{
+ self->gc = vtimestamp;
+}
+
+ruby*:::gc-end
+/self->gc/
+{
+ this->oncpu = vtimestamp - self->gc;
+ self->gc = 0;
+
+ @types[".", "gc", "-"] = quantize(this->oncpu / 1000);
+
+ self->exclude[self->depth] += this->oncpu;
+}
+
+dtrace:::END
+{
+ printf("\nOn-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types);
+
+ printf("\nExclusive function on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("\nInclusive function on-CPU times (us),\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Ruby/rb_cputime.d b/Ruby/rb_cputime.d
new file mode 100755
index 000000000000..d5885c8188ad
--- /dev/null
+++ b/Ruby/rb_cputime.d
@@ -0,0 +1,129 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_cputime.d - measure Ruby on-CPU times for types of operation.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_cputime.d 49 2007-09-17 12:03:20Z brendan $
+ *
+ * This traces Ruby activity from all programs running on the system with
+ * Ruby provider support.
+ *
+ * USAGE: rb_cputime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Ruby program
+ * TYPE Type of call (method/obj-new/gc/total)
+ * NAME Name of call
+ * TOTAL Total on-CPU time for calls (us)
+ *
+ * Filename and method names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = vtimestamp;
+}
+
+ruby*:::function-return
+/self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg2));
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl);
+ @types_excl["-", "total", "-"] = sum(this->oncpu_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+ruby*:::object-create-start
+{
+ self->object = vtimestamp;
+}
+
+ruby*:::object-create-done
+/self->object/
+{
+ this->oncpu = vtimestamp - self->object;
+ self->object = 0;
+ this->file = basename(copyinstr(arg1));
+ this->file = this->file != NULL ? this->file : ".";
+ this->name = copyinstr(arg0);
+
+ @num[this->file, "obj-new", this->name] = count();
+ @types[this->file, "obj-new", this->name] = sum(this->oncpu);
+
+ self->exclude[self->depth] += this->oncpu;
+}
+
+ruby*:::gc-begin
+{
+ self->gc = vtimestamp;
+}
+
+ruby*:::gc-end
+/self->gc/
+{
+ this->oncpu = vtimestamp - self->gc;
+ self->gc = 0;
+ @num[".", "gc", "-"] = count();
+ @types[".", "gc", "-"] = sum(this->oncpu);
+ self->exclude[self->depth] += this->oncpu;
+}
+
+dtrace:::END
+{
+ printf("\nCount,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types, 1000);
+ printf("\nElapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Ruby/rb_flow.d b/Ruby/rb_flow.d
new file mode 100755
index 000000000000..e4ff76001534
--- /dev/null
+++ b/Ruby/rb_flow.d
@@ -0,0 +1,72 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_flow.d - snoop Ruby execution showing method flow using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_flow.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces activity from all Ruby programs on the system that are
+ * running with Ruby provider support.
+ *
+ * USAGE: rb_flow.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this method belongs to
+ * CLASS::METHOD Ruby classname and method
+ *
+ * LEGEND:
+ * -> method entry
+ * <- method return
+ *
+ * Filename and method names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-22s -- %s\n", "C", "TIME(us)", "FILE",
+ "CLASS::METHOD");
+}
+
+ruby*:::function-entry
+{
+ printf("%3d %-16d %-22s %*s-> %s::%s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg2)), self->depth * 2, "", copyinstr(arg0),
+ copyinstr(arg1));
+ self->depth++;
+}
+
+ruby*:::function-return
+{
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-22s %*s<- %s::%s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg2)), self->depth * 2, "", copyinstr(arg0),
+ copyinstr(arg1));
+}
diff --git a/Ruby/rb_flowinfo.d b/Ruby/rb_flowinfo.d
new file mode 100755
index 000000000000..4657263a0b32
--- /dev/null
+++ b/Ruby/rb_flowinfo.d
@@ -0,0 +1,88 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_flowinfo.d - snoop Ruby function (method) flow with info using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_flowinfo.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces activity from all Ruby programs on the system that are
+ * running with Ruby provider support.
+ *
+ * USAGE: rb_flowinfo.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the Ruby program
+ * LINE Line number of filename
+ * TYPE Type of call (method)
+ * NAME Ruby class and method name
+ *
+ * LEGEND:
+ * -> method entry
+ * <- method return
+ *
+ * Filename and method names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "NAME");
+}
+
+ruby*:::function-entry,
+ruby*:::function-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+ruby*:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+ printf("%d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid, this->delta,
+ basename(copyinstr(arg2)), arg3, "method", self->depth * 2, "",
+ this->name);
+ self->depth++;
+ self->last = timestamp;
+}
+
+ruby*:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+ printf("%d %6d %10d %16s:%-4d %-8s %*s<- %s\n", cpu, pid, this->delta,
+ basename(copyinstr(arg2)), arg3, "method", self->depth * 2, "",
+ this->name);
+ self->last = timestamp;
+}
diff --git a/Ruby/rb_flowtime.d b/Ruby/rb_flowtime.d
new file mode 100755
index 000000000000..9b1c66803b2f
--- /dev/null
+++ b/Ruby/rb_flowtime.d
@@ -0,0 +1,84 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_flowtime.d - snoop Ruby function (method) flow using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_flowtime.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces activity from all Ruby programs on the system that are
+ * running with Ruby provider support.
+ *
+ * USAGE: rb_flowtime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this method belongs to
+ * DELTA(us) Elapsed time from previous line to this line
+ * CLASS::METHOD Ruby class and method name
+ *
+ * LEGEND:
+ * -> method entry
+ * <- method return
+ *
+ * Filename and method names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE",
+ "DELTA(us)", "CLASS::METHOD");
+}
+
+ruby*:::function-entry,
+ruby*:::function-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+ruby*:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %-16d %-16s %9d %*s-> %s::%s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg2)), this->delta, self->depth * 2, "",
+ copyinstr(arg0), copyinstr(arg1));
+ self->depth++;
+ self->last = timestamp;
+}
+
+ruby*:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-16s %9d %*s<- %s::%s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg2)), this->delta, self->depth * 2, "",
+ copyinstr(arg0), copyinstr(arg1));
+ self->last = timestamp;
+}
diff --git a/Ruby/rb_funccalls.d b/Ruby/rb_funccalls.d
new file mode 100755
index 000000000000..76215006cfb9
--- /dev/null
+++ b/Ruby/rb_funccalls.d
@@ -0,0 +1,57 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_funccalls.d - count Ruby function (method) calls using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_funccalls.d 20 2007-09-12 09:28:22Z brendan $
+ *
+ * This traces activity from all Ruby programs on the system that are
+ * running with Ruby provider support.
+ *
+ * USAGE: rb_funccalls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Ruby program
+ * METHOD Method name
+ * COUNT Number of calls during sample
+ *
+ * Filename and method names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::function-entry
+{
+ @funcs[basename(copyinstr(arg2)), copyinstr(arg0), copyinstr(arg1)] =
+ count();
+}
+
+dtrace:::END
+{
+ printf(" %-32.32s %-16s %-16s %8s\n", "FILE", "CLASS", "METHOD",
+ "CALLS");
+ printa(" %-32.32s %-16s %-16s %@8d\n", @funcs);
+}
diff --git a/Ruby/rb_lines.d b/Ruby/rb_lines.d
new file mode 100755
index 000000000000..438f1f11a679
--- /dev/null
+++ b/Ruby/rb_lines.d
@@ -0,0 +1,55 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_lines.d - trace Ruby line execution by process using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_lines.d 20 2007-09-12 09:28:22Z brendan $
+ *
+ * This traces Ruby activity from all Ruby programs on the system that are
+ * running with Ruby provider support.
+ *
+ * USAGE: rb_who.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Ruby program
+ * LINE Line number
+ * COUNT Number of times a line was executed
+ *
+ * Filenames are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::line
+{
+ @calls[basename(copyinstr(arg0)), arg1] = count();
+}
+
+dtrace:::END
+{
+ printf(" %32s:%-6s %10s\n", "FILE", "LINE", "COUNT");
+ printa(" %32s:%-6d %@10d\n", @calls);
+}
diff --git a/Ruby/rb_malloc.d b/Ruby/rb_malloc.d
new file mode 100755
index 000000000000..891b84050293
--- /dev/null
+++ b/Ruby/rb_malloc.d
@@ -0,0 +1,80 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_malloc.d - Ruby operations and libc malloc statistics.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_malloc.d 20 2007-09-12 09:28:22Z brendan $
+ *
+ * WARNING: This script is not 100% accurate; This prints libc malloc() byte
+ * distributions by "recent" Ruby operation, which we hope will be usually
+ * relevant. This is an experimental script that may be improved over time.
+ *
+ * USAGE: rb_malloc.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * 1 Filename of the Ruby program
+ * 2 Type of operation (method/objnew/startup)
+ * 3 Name of operation
+ *
+ * Filename and method names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+self string filename;
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby$target:::function-entry
+{
+ self->file = basename(copyinstr(arg2));
+ self->type = "method";
+ self->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+}
+
+ruby$target:::object-create-start
+{
+ self->file = basename(copyinstr(arg1));
+ self->type = "objnew";
+ self->name = copyinstr(arg0);
+}
+
+pid$target:libc:malloc:entry
+/self->file != NULL/
+{
+ @mallocs[self->file, self->type, self->name] = quantize(arg0);
+}
+
+pid$target:libc:malloc:entry
+/self->file == NULL/
+{
+ @mallocs["ruby", "startup", "-"] = quantize(arg0);
+}
+
+
+dtrace:::END
+{
+ printf("Ruby malloc byte distributions by recent Ruby operation,\n");
+ printa(" %s, %s, %s %@d\n", @mallocs);
+}
diff --git a/Ruby/rb_objcpu.d b/Ruby/rb_objcpu.d
new file mode 100755
index 000000000000..23c55e88592c
--- /dev/null
+++ b/Ruby/rb_objcpu.d
@@ -0,0 +1,61 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_objcpu.d - measure Ruby object creation on-CPU time using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_objcpu.d 20 2007-09-12 09:28:22Z brendan $
+ *
+ * This traces Ruby activity from all programs running on the system with
+ * Ruby provider support.
+ *
+ * USAGE: rb_objcpu.d # hit Ctrl-C to end
+ *
+ * Class names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::object-create-start
+{
+ self->vstart = vtimestamp;
+}
+
+ruby*:::object-create-done
+/self->vstart/
+{
+ this->oncpu = vtimestamp - self->vstart;
+ @total = sum(this->oncpu);
+ @dist[copyinstr(arg0)] = quantize(this->oncpu / 1000);
+ self->vstart = 0;
+}
+
+dtrace:::END
+{
+ normalize(@total, 1000000);
+ printa("Total object creation on-CPU time (ms): %@d\n\n", @total);
+ printf("Object creation on-CPU time distributions (us),\n");
+ printa(@dist);
+}
diff --git a/Ruby/rb_objnew.d b/Ruby/rb_objnew.d
new file mode 100755
index 000000000000..f6f00f1d7af9
--- /dev/null
+++ b/Ruby/rb_objnew.d
@@ -0,0 +1,55 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_objnew.d - count Ruby object creation using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_objnew.d 20 2007-09-12 09:28:22Z brendan $
+ *
+ * This traces Ruby activity from all programs running on the system with
+ * Ruby provider support.
+ *
+ * USAGE: rb_objnew.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Ruby program
+ * CLASS Class of new object
+ * COUNT Number of object creations during tracing
+ *
+ * Filename and class names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::object-create-done
+{
+ @objs[basename(copyinstr(arg1)), copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %-24s %-36s %8s\n", "FILE", "CLASS", "COUNT");
+ printa(" %-24.24s %-36s %@8d\n", @objs);
+}
diff --git a/Ruby/rb_stat.d b/Ruby/rb_stat.d
new file mode 100755
index 000000000000..6de19f6e5b41
--- /dev/null
+++ b/Ruby/rb_stat.d
@@ -0,0 +1,146 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_stat.d - Ruby operation stats using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_stat.d 20 2007-09-12 09:28:22Z brendan $
+ *
+ * This traces activity from all Ruby programs on the system that are
+ * running with Ruby provider support.
+ *
+ * USAGE: rb_stat.d [interval [count]]
+ *
+ * FIELDS:
+ * EXEC/s Ruby programs executed per second, including
+ * those without Ruby provider support
+ * METHOD/s Methods called, per second
+ * OBJNEW/s Objects created, per second
+ * OBJFRE/s Objects freed, per second
+ * RAIS/s Raises, per second
+ * RESC/s Rescues, per second
+ * GC/s Garbage collects, per second
+ *
+ * The numbers are counts for the interval specified. The default interval
+ * is 1 second.
+ *
+ * If you see a count in "EXECS" but not in the other columns, then your
+ * Ruby software is probably not running with the DTrace Ruby provider.
+ * See Ruby/Readme.
+ *
+ * Filename and method names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+inline int SCREEN = 21;
+
+dtrace:::BEGIN
+{
+ execs = methods = objnew = objfree = gc = raised = rescue = 0;
+ lines = SCREEN + 1;
+ interval = $1 ? $1 : 1;
+ counts = $2 ? $2 : -1;
+ secs = interval;
+ first = 1;
+}
+
+profile:::tick-1sec
+{
+ secs--;
+}
+
+/*
+ * Print Header
+ */
+dtrace:::BEGIN,
+profile:::tick-1sec
+/first || (secs == 0 && lines > SCREEN)/
+{
+ printf("%-20s %8s %8s %8s %8s %6s %6s %6s\n", "TIME", "EXEC/s",
+ "METHOD/s", "OBJNEW/s", "OBJFRE/s", "RAIS/s", "RESC/s", "GC/s");
+ lines = 0;
+ first = 0;
+}
+
+/*
+ * Tally Data
+ */
+proc:::exec-success
+/execname == "ruby"/
+{
+ execs++;
+}
+
+ruby*:::function-entry
+{
+ methods++;
+}
+
+ruby*:::object-create-start
+{
+ objnew++;
+}
+
+ruby*:::object-free
+{
+ objfree++;
+}
+
+ruby*:::raise
+{
+ raised++;
+}
+
+ruby*:::rescue
+{
+ rescue++;
+}
+
+ruby*:::gc-begin
+{
+ gc++;
+}
+
+/*
+ * Print Output
+ */
+profile:::tick-1sec
+/secs == 0/
+{
+ printf("%-20Y %8d %8d %8d %8d %6d %6d %6d\n", walltimestamp,
+ execs / interval, methods / interval, objnew / interval,
+ objfree / interval, raised / interval, rescue / interval,
+ gc / interval);
+ execs = methods = objnew = objfree = gc = raised = rescue = 0;
+ secs = interval;
+ lines++;
+ counts--;
+}
+
+/*
+ * End
+ */
+profile:::tick-1sec
+/counts == 0/
+{
+ exit(0);
+}
diff --git a/Ruby/rb_syscalls.d b/Ruby/rb_syscalls.d
new file mode 100755
index 000000000000..495060b9da80
--- /dev/null
+++ b/Ruby/rb_syscalls.d
@@ -0,0 +1,66 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_syscalls.d - count Ruby calls and syscalls using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_syscalls.d 20 2007-09-12 09:28:22Z brendan $
+ *
+ * USAGE: rb_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the Ruby program
+ * TYPE Type of call (method/syscall)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * Filename and method names are printed if available.
+ * The filename for syscalls may be printed as "ruby", if the program
+ * was invoked using the form "ruby filename" rather than running the
+ * program with an interpreter line.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+self string filename;
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby$target:::function-entry
+{
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+ @calls[basename(copyinstr(arg2)), "method", this->name] = count();
+}
+
+syscall:::entry
+/pid == $target/
+{
+ @calls[basename(execname), "syscall", probefunc] = count();
+}
+
+dtrace:::END
+{
+ printf("\nCalls for PID %d,\n\n", $target);
+ printf(" %-32s %-10s %-22s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-32s %-10s %-22s %@8d\n", @calls);
+}
diff --git a/Ruby/rb_syscolors.d b/Ruby/rb_syscolors.d
new file mode 100755
index 000000000000..e14ac0802e8a
--- /dev/null
+++ b/Ruby/rb_syscolors.d
@@ -0,0 +1,133 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_syscolors.d - trace Ruby method flow plus syscalls, in color.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_syscolors.d 27 2007-09-13 09:26:01Z brendan $
+ *
+ * USAGE: rb_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * This watches Ruby method entries and returns, and indents child
+ * function calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the Ruby program
+ * LINE Line number of filename
+ * TYPE Type of call (method/line/syscall)
+ * NAME Ruby method or syscall name
+ *
+ * Filename and method names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ /*
+ * The following are terminal color escape sequences.
+ * Change them to whatever you prefer, eg HTML font tags.
+ */
+ color_ruby = "\033[2;35m"; /* violet, faint */
+ color_line = "\033[1;35m"; /* violet, bold */
+ color_syscall = "\033[2;32m"; /* green, faint */
+ color_off = "\033[0m"; /* default */
+
+ printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "NAME");
+}
+
+ruby$target:::function-entry,
+ruby$target:::function-return,
+ruby$target:::line,
+syscall:::entry,
+syscall:::return
+/self->last == 0 && pid == $target/
+{
+ self->last = timestamp;
+}
+
+ruby$target:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_ruby,
+ cpu, pid, this->delta, basename(copyinstr(arg2)), arg3, "method",
+ self->depth * 2, "", this->name, color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+ruby$target:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ this->name = strjoin(strjoin(copyinstr(arg0), "::"), copyinstr(arg1));
+ self->depth--;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_ruby,
+ cpu, pid, this->delta, basename(copyinstr(arg2)), arg3, "method",
+ self->depth * 2, "", this->name, color_off);
+ self->last = timestamp;
+}
+
+ruby$target:::line
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-- %s\n", color_line,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg1, "line",
+ self->depth * 2, "", color_off);
+ self->last = timestamp;
+}
+
+syscall:::entry
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall,
+ cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "",
+ probefunc, color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+syscall:::return
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth--;
+ printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall,
+ cpu, pid, this->delta, "\"", "syscall", self->depth * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+proc:::exit
+/pid == $target/
+{
+ exit(0);
+}
diff --git a/Ruby/rb_who.d b/Ruby/rb_who.d
new file mode 100755
index 000000000000..01193689363e
--- /dev/null
+++ b/Ruby/rb_who.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * rb_who.d - trace Ruby line execution by process using DTrace.
+ * Written for the Ruby DTrace provider.
+ *
+ * $Id: rb_who.d 49 2007-09-17 12:03:20Z brendan $
+ *
+ * This traces Ruby activity from all Ruby programs on the system that are
+ * running with Ruby provider support.
+ *
+ * USAGE: rb_who.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID of Ruby
+ * UID User ID of the owner
+ * LINES Number of times a line was executed
+ * FILE Pathname of the Ruby program
+ *
+ * Filenames are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+ruby*:::line
+{
+ @lines[pid, uid, copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %6s %10s %s\n", "PID", "UID", "LINES", "FILE");
+ printa(" %6d %6d %@10d %s\n", @lines);
+}
diff --git a/Shell/Readme b/Shell/Readme
new file mode 100644
index 000000000000..9bf96ffdf8b5
--- /dev/null
+++ b/Shell/Readme
@@ -0,0 +1,35 @@
+Shell - DTracing Shell Scripting
+
+ These scripts trace activity of various shell programming languages,
+ and make use of specific shell DTrace providers, which are either
+ integrated or available for download from the shells page listed below.
+ Each script has a prefix to make the shell language clear.
+
+ http://www.opensolaris.org/os/community/dtrace/shells/
+
+ sh - the Bourne Shell. This provider was written by Alan Hargreaves and
+ is currently available both as a diff and in binary form from the shells
+ page.
+
+ Since the DTrace Shell providers are under development, there is a chance
+ that they have changed slightly by the time you are reading this, causing
+ these scripts to either break or behave oddly. Firstly, check for newer
+ versions of the DTraceToolkit; if it hasn't been updated and you need
+ to use these scripts immediately, then updating them shouldn't take
+ too long. The following was the state of the providers when these scripts
+ were written - check for changes and update the scripts accordingly,
+
+ provider sh {
+ probe function-entry(file, function, lineno);
+ probe function-return(file, function, rval);
+ probe builtin-entry(file, function, lineno);
+ probe builtin-return(file, function, rval);
+ probe command-entry(file, function, lineno);
+ probe command-return(file, function, rval);
+ probe script-start(file);
+ probe script-done(file, rval);
+ probe subshell-entry(file, childpid);
+ probe subshell-return(file, rval);
+ probe line(file, lineno);
+ };
+
diff --git a/Shell/sh_calldist.d b/Shell/sh_calldist.d
new file mode 100755
index 000000000000..e758bab9db16
--- /dev/null
+++ b/Shell/sh_calldist.d
@@ -0,0 +1,119 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_calldist.d - measure Bourne shell elapsed times for types of operation.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_calldist.d 28 2007-09-13 10:49:37Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_calldist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of elapsed time for shell
+ * operations. Use sh_calltime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the shell or shellscript
+ * 2 Type of call (func/builtin/cmd)
+ * 3 Name of call
+ *
+ * Filename and call names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sh*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+sh*:::function-return
+/self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->elapsed_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->elapsed_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+sh*:::builtin-entry
+{
+ self->builtin = timestamp;
+}
+
+sh*:::builtin-return
+/self->builtin/
+{
+ this->elapsed = timestamp - self->builtin;
+ self->builtin = 0;
+
+ @types[basename(copyinstr(arg0)), "builtin", copyinstr(arg1)] =
+ quantize(this->elapsed / 1000);
+
+ self->exclude[self->depth] += this->elapsed;
+}
+
+sh*:::command-entry
+{
+ self->command = timestamp;
+}
+
+sh*:::command-return
+/self->command/
+{
+ this->elapsed = timestamp - self->command;
+ self->command = 0;
+
+ @types[basename(copyinstr(arg0)), "cmd", copyinstr(arg1)] =
+ quantize(this->elapsed / 1000);
+
+ self->exclude[self->depth] += this->elapsed;
+}
+
+dtrace:::END
+{
+ printf("Elapsed times (us),\n\n");
+ printa(" %s, %s, %s %@d\n", @types);
+
+ printf("Exclusive function elapsed times (us),\n\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("Inclusive function elapsed times (us),\n\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Shell/sh_calls.d b/Shell/sh_calls.d
new file mode 100755
index 000000000000..2ad72f108f68
--- /dev/null
+++ b/Shell/sh_calls.d
@@ -0,0 +1,72 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_calls.d - count Bourne calls (func/builtin/cmd/subsh) using DTrace.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_calls.d 52 2007-09-24 04:28:01Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_calls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the shell or shellscript
+ * TYPE Type of call (func/builtin/cmd/subsh)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sh*:::function-entry
+{
+ @calls[basename(copyinstr(arg0)), "func", copyinstr(arg1)] = count();
+}
+
+sh*:::builtin-entry
+{
+ @calls[basename(copyinstr(arg0)), "builtin", copyinstr(arg1)] = count();
+}
+
+sh*:::command-entry
+{
+ @calls[basename(copyinstr(arg0)), "cmd", copyinstr(arg1)] = count();
+}
+
+sh*:::subshell-entry
+/arg1 != 0/
+{
+ @calls[basename(copyinstr(arg0)), "subsh", "-"] = count();
+}
+
+dtrace:::END
+{
+ printf(" %-22s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-22s %-10s %-32s %@8d\n", @calls);
+}
diff --git a/Shell/sh_calltime.d b/Shell/sh_calltime.d
new file mode 100755
index 000000000000..e3c72b4ae4f8
--- /dev/null
+++ b/Shell/sh_calltime.d
@@ -0,0 +1,136 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_calltime.d - measure Bourne shell elapsed times for types of operation.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_calltime.d 46 2007-09-17 10:25:36Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_calltime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the shell or shellscript
+ * TYPE Type of call (func/builtin/cmd/total)
+ * NAME Name of call
+ * TOTAL Total elapsed time for calls (us)
+ *
+ * Filename and call names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sh*:::function-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->function[self->depth] = timestamp;
+}
+
+sh*:::function-return
+/self->function[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->function[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->elapsed_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->elapsed_excl);
+ @types_excl["-", "total", "-"] = sum(this->elapsed_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+sh*:::builtin-entry
+{
+ self->builtin = timestamp;
+}
+
+sh*:::builtin-return
+/self->builtin/
+{
+ this->elapsed = timestamp - self->builtin;
+ self->builtin = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @num[this->file, "builtin", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types[this->file, "builtin", this->name] = sum(this->elapsed);
+ @types["-", "total", "-"] = sum(this->elapsed);
+
+ self->exclude[self->depth] += this->elapsed;
+}
+
+sh*:::command-entry
+{
+ self->command = timestamp;
+}
+
+sh*:::command-return
+/self->command/
+{
+ this->elapsed = timestamp - self->command;
+ self->command = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @num[this->file, "cmd", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types[this->file, "cmd", this->name] = sum(this->elapsed);
+ @types["-", "total", "-"] = sum(this->elapsed);
+
+ self->exclude[self->depth] += this->elapsed;
+}
+
+dtrace:::END
+{
+ printf("\nCounts,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types, 1000);
+ printf("\nElapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function elapsed times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Shell/sh_cpudist.d b/Shell/sh_cpudist.d
new file mode 100755
index 000000000000..0809fd5cd396
--- /dev/null
+++ b/Shell/sh_cpudist.d
@@ -0,0 +1,142 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_cpudist.d - measure Bourne shell on-CPU times for types of operation.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_cpudist.d 28 2007-09-13 10:49:37Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_cpudist.d # hit Ctrl-C to end
+ *
+ * This script prints distribution plots of on-CPU time for shell
+ * operations. Use sh_cputime.d for summary reports.
+ *
+ * FIELDS:
+ * 1 Filename of the shell or shellscript
+ * 2 Type of call (func/builtin/cmd)
+ * 3 Name of call
+ *
+ * Filename and call names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sh*:::function-entry
+{
+ self->depth++;
+ self->function[self->depth] = vtimestamp;
+ self->exclude[self->depth] = 0;
+}
+
+sh*:::function-return
+/self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @types_incl[this->file, "func", this->name] =
+ quantize(this->oncpu_incl / 1000);
+ @types_excl[this->file, "func", this->name] =
+ quantize(this->oncpu_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+sh*:::builtin-entry
+{
+ self->builtin = vtimestamp;
+}
+
+sh*:::builtin-return
+/self->builtin/
+{
+ this->oncpu = vtimestamp - self->builtin;
+ self->builtin = 0;
+
+ @types[basename(copyinstr(arg0)), "builtin", copyinstr(arg1)] =
+ quantize(this->oncpu / 1000);
+
+ self->exclude[self->depth] += this->oncpu;
+}
+
+sh*:::command-entry
+{
+ incmd[pid] = basename(copyinstr(arg0));
+ depth[pid] = self->depth;
+}
+
+sh*:::command-return
+{
+ incmd[pid] = 0;
+}
+
+proc:::exec-success
+{
+ /*
+ * Due to thread timing after fork(), this probe can fire before
+ * sh*:::command-entry has, which means we can't predicate this
+ * exec() away just yet. Store the vtimestamp in case it is needed.
+ */
+ self->command = vtimestamp;
+}
+
+proc:::exit
+/incmd[ppid] == NULL/
+{
+ self->command = 0;
+}
+
+proc:::exit
+/incmd[ppid] != NULL/
+{
+ this->oncpu = vtimestamp - self->command;
+ self->command = 0;
+
+ @types[incmd[ppid], "cmd", execname] = quantize(this->oncpu / 1000);
+
+ self->exclude[depth[ppid]] += this->oncpu;
+ incmd[ppid] = 0;
+ depth[ppid] = 0;
+}
+
+dtrace:::END
+{
+ printf("On-CPU times (us),\n\n");
+ printa(" %s, %s, %s %@d\n", @types);
+
+ printf("Exclusive function on-CPU times (us),\n\n");
+ printa(" %s, %s, %s %@d\n", @types_excl);
+
+ printf("Inclusive function on-CPU times (us),\n\n");
+ printa(" %s, %s, %s %@d\n", @types_incl);
+}
diff --git a/Shell/sh_cputime.d b/Shell/sh_cputime.d
new file mode 100755
index 000000000000..433ce8e2088b
--- /dev/null
+++ b/Shell/sh_cputime.d
@@ -0,0 +1,158 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_cputime.d - measure Bourne shell on-CPU times for types of operation.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_cputime.d 46 2007-09-17 10:25:36Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_cputime.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the shell or shellscript
+ * TYPE Type of call (func/builtin/cmd/total)
+ * NAME Name of call
+ * TOTAL Total on-CPU time for calls (us)
+ *
+ * Filename and call names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sh*:::function-entry
+{
+ self->depth++;
+ self->function[self->depth] = vtimestamp;
+ self->exclude[self->depth] = 0;
+}
+
+sh*:::function-return
+/self->function[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->function[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->function[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @num[this->file, "func", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types_incl[this->file, "func", this->name] = sum(this->oncpu_incl);
+ @types_excl[this->file, "func", this->name] = sum(this->oncpu_excl);
+ @types_excl["-", "total", "-"] = sum(this->oncpu_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+sh*:::builtin-entry
+{
+ self->builtin = vtimestamp;
+}
+
+sh*:::builtin-return
+/self->builtin/
+{
+ this->oncpu = vtimestamp - self->builtin;
+ self->builtin = 0;
+ this->file = basename(copyinstr(arg0));
+ this->name = copyinstr(arg1);
+
+ @num[this->file, "builtin", this->name] = count();
+ @num["-", "total", "-"] = count();
+ @types[this->file, "builtin", this->name] = sum(this->oncpu);
+ @types["-", "total", "-"] = sum(this->oncpu);
+
+ self->exclude[self->depth] += this->oncpu;
+}
+
+sh*:::command-entry
+{
+ incmd[pid] = basename(copyinstr(arg0));
+ depth[pid] = self->depth;
+}
+
+sh*:::command-return
+{
+ incmd[pid] = 0;
+}
+
+proc:::exec-success
+{
+ /*
+ * Due to thread timing after fork(), this probe can fire before
+ * sh*:::command-entry has, which means we can't predicate this
+ * exec() away just yet. Store the vtimestamp in case it is needed.
+ */
+ self->command = vtimestamp;
+}
+
+proc:::exit
+/incmd[ppid] == NULL/
+{
+ self->command = 0;
+}
+
+proc:::exit
+/incmd[ppid] != NULL/
+{
+ this->oncpu = vtimestamp - self->command;
+ self->command = 0;
+
+ @num[incmd[ppid], "cmd", execname] = count();
+ @num["-", "total", "-"] = count();
+ @types[incmd[ppid], "cmd", execname] = sum(this->oncpu);
+ @types["-", "total", "-"] = sum(this->oncpu);
+
+ self->exclude[depth[ppid]] += this->oncpu;
+ incmd[ppid] = 0;
+ depth[ppid] = 0;
+}
+
+dtrace:::END
+{
+ printf("\nCounts,\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-20s %-10s %-32s %@8d\n", @num);
+
+ normalize(@types, 1000);
+ printf("\nOn-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types);
+
+ normalize(@types_excl, 1000);
+ printf("\nExclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_excl);
+
+ normalize(@types_incl, 1000);
+ printf("\nInclusive function on-CPU times (us),\n");
+ printf(" %-20s %-10s %-32s %8s\n", "FILE", "TYPE", "NAME", "TOTAL");
+ printa(" %-20s %-10s %-32s %@8d\n", @types_incl);
+}
diff --git a/Shell/sh_flow.d b/Shell/sh_flow.d
new file mode 100755
index 000000000000..ff24f595cb8c
--- /dev/null
+++ b/Shell/sh_flow.d
@@ -0,0 +1,85 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_flow.d - snoop Bourne shell execution showing function flow using DTrace.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_flow.d 41 2007-09-17 02:20:10Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_flow.d # hit Ctrl-C to end
+ *
+ * This watches shell function entries and returns, and indents child
+ * function calls. Shell builtins are also printed.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this function belongs to
+ * NAME Shell function, builtin or command name
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ * > builtin
+ * | external command
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ self->depth = 0;
+ printf("%3s %-16s %-16s -- %s\n", "C", "TIME(us)", "FILE", "NAME");
+}
+
+sh*:::function-entry
+{
+ printf("%3d %-16d %-16s %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1));
+ self->depth++;
+}
+
+sh*:::function-return
+{
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-16s %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1));
+}
+
+sh*:::builtin-entry
+{
+ printf("%3d %-16d %-16s %*s> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1));
+}
+
+sh*:::command-entry
+{
+ printf("%3d %-16d %-16s %*s| %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), self->depth * 2, "", copyinstr(arg1));
+}
diff --git a/Shell/sh_flowinfo.d b/Shell/sh_flowinfo.d
new file mode 100755
index 000000000000..6da083681b17
--- /dev/null
+++ b/Shell/sh_flowinfo.d
@@ -0,0 +1,152 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_flowinfo.d - snoop Bourne shell flow with additional info.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_flowinfo.d 52 2007-09-24 04:28:01Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_flowinfo.d # hit Ctrl-C to end
+ *
+ * This watches shell function entries and returns, and indents child
+ * function calls. Shell builtins and external commands are also printed.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the shell script
+ * LINE Line number of filename
+ * TYPE Type of call (func/builtin/cmd/subsh)
+ * NAME Shell function, builtin or command name
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ self->depth = 0;
+ printf("%3s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "NAME");
+}
+
+sh*:::function-entry,
+sh*:::function-return,
+sh*:::builtin-entry,
+sh*:::builtin-return,
+sh*:::command-entry,
+sh*:::command-return,
+sh*:::subshell-entry,
+sh*:::subshell-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+sh*:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid,
+ this->delta, basename(copyinstr(arg0)), arg2, "func",
+ self->depth * 2, "", copyinstr(arg1));
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh*:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %10d %16s:- %-8s %*s<- %s\n", cpu, pid,
+ this->delta, basename(copyinstr(arg0)), "func", self->depth * 2,
+ "", copyinstr(arg1));
+ self->last = timestamp;
+}
+
+sh*:::builtin-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid,
+ this->delta, basename(copyinstr(arg0)), arg2, "builtin",
+ self->depth * 2, "", copyinstr(arg1));
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh*:::builtin-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %10d %16s:- %-8s %*s<- %s\n", cpu, pid,
+ this->delta, basename(copyinstr(arg0)), "builtin",
+ self->depth * 2, "", copyinstr(arg1));
+ self->last = timestamp;
+}
+
+sh*:::command-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %10d %16s:%-4d %-8s %*s-> %s\n", cpu, pid,
+ this->delta, basename(copyinstr(arg0)), arg2, "cmd",
+ self->depth * 2, "", copyinstr(arg1));
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh*:::command-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %10d %16s:- %-8s %*s<- %s\n", cpu, pid,
+ this->delta, basename(copyinstr(arg0)), "cmd",
+ self->depth * 2, "", copyinstr(arg1));
+ self->last = timestamp;
+}
+
+sh*:::subshell-entry
+/arg1 != 0/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %10d %16s:- %-8s %*s-> pid %d\n", cpu, pid,
+ this->delta, basename(copyinstr(arg0)), "subsh",
+ self->depth * 2, "", arg1);
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh*:::subshell-return
+/self->last/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %10d %16s:- %-8s %*s<- = %d\n", cpu, pid,
+ this->delta, basename(copyinstr(arg0)), "subsh",
+ self->depth * 2, "", arg1);
+ self->last = timestamp;
+}
diff --git a/Shell/sh_flowtime.d b/Shell/sh_flowtime.d
new file mode 100755
index 000000000000..5df118be1715
--- /dev/null
+++ b/Shell/sh_flowtime.d
@@ -0,0 +1,118 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_flowtime.d - snoop Bourne shell execution with flow and delta times.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_flowtime.d 45 2007-09-17 08:54:56Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_flowtime.d # hit Ctrl-C to end
+ *
+ * This watches shell function entries and returns, and indents child
+ * function calls. Shell builtins are also printed.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * FILE Filename that this function belongs to
+ * NAME Shell function or builtin name
+ *
+ * LEGEND:
+ * -> function entry
+ * <- function return
+ * > builtin
+ * | external command
+ *
+ * DELTAs:
+ * -> previous line to the start of this function
+ * <- previous line to the end of this function
+ * > previous line to the end of this builtin
+ * | previous line to the end of this command
+ *
+ * See sh_flowinfo.d for more verbose and more straightforward delta times.
+ *
+ * Filename and function names are printed if available.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+self uint64_t last;
+
+dtrace:::BEGIN
+{
+ printf("%3s %-16s %-16s %9s -- %s\n", "C", "TIME(us)", "FILE",
+ "DELTA(us)", "NAME");
+}
+
+sh*:::function-entry,
+sh*:::function-return,
+sh*:::builtin-return,
+sh*:::command-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+sh*:::function-entry
+{
+ this->elapsed = (timestamp - self->last) / 1000;
+ printf("%3d %-16d %-16s %9d %*s-> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), this->elapsed, self->depth * 2, "",
+ copyinstr(arg1));
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh*:::function-return
+{
+ this->elapsed = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %-16d %-16s %9d %*s<- %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), this->elapsed, self->depth * 2, "",
+ copyinstr(arg1));
+ self->last = timestamp;
+}
+
+sh*:::builtin-return
+{
+ this->elapsed = (timestamp - self->last) / 1000;
+ printf("%3d %-16d %-16s %9d %*s> %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), this->elapsed, self->depth * 2, "",
+ copyinstr(arg1));
+ self->last = timestamp;
+}
+
+sh*:::command-return
+{
+ this->elapsed = (timestamp - self->last) / 1000;
+ printf("%3d %-16d %-16s %9d %*s| %s\n", cpu, timestamp / 1000,
+ basename(copyinstr(arg0)), this->elapsed, self->depth * 2, "",
+ copyinstr(arg1));
+ self->last = timestamp;
+}
diff --git a/Shell/sh_lines.d b/Shell/sh_lines.d
new file mode 100755
index 000000000000..5cfeb4912102
--- /dev/null
+++ b/Shell/sh_lines.d
@@ -0,0 +1,55 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_lines.d - trace Bourne shell line execution using DTrace.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_lines.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_lines.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the shell or shellscript
+ * LINE Line number
+ * COUNT Number of times a line was executed
+ *
+ * Filenames are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sh*:::line
+{
+ @calls[basename(copyinstr(arg0)), arg1] = count();
+}
+
+dtrace:::END
+{
+ printf(" %32s:%-6s %10s\n", "FILE", "LINE", "COUNT");
+ printa(" %32s:%-6d %@10d\n", @calls);
+}
diff --git a/Shell/sh_pidcolors.d b/Shell/sh_pidcolors.d
new file mode 100755
index 000000000000..0196218580d0
--- /dev/null
+++ b/Shell/sh_pidcolors.d
@@ -0,0 +1,203 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_pidcolors.d - Demonstration of deeper DTrace Bourne shell analysis.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_pidcolors.d 27 2007-09-13 09:26:01Z brendan $
+ *
+ * USAGE: sh_pidcolors.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * This extends sh_syscolors.d by including some "pid" provider tracing
+ * as a starting point for deeper analysis. Currently it adds the probes,
+ *
+ * pid$target:a.out:e*:entry,
+ * pid$target:a.out:e*:return
+ *
+ * which means, all functions from the /usr/bin/sh binary that begin with
+ * the letter "e". This adds about 34 probes. Customise it to whichever
+ * parts of /usr/bin/sh or the system libraries you are interested in.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the shell script
+ * LINE Line number of filename
+ * TYPE Type of call (func/builtin/cmd/line/shell)
+ * NAME Shell function, builtin or command name
+ *
+ * The filename for syscalls may be printed as the shell name, if the
+ * script was invoked using the form "shell filename" rather than running
+ * the script with an interpreter line.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ color_shell = "\033[2;35m"; /* violet, faint */
+ color_line = "\033[1;35m"; /* violet, bold */
+ color_lib = "\033[2;34m"; /* blue, faint */
+ color_syscall = "\033[2;32m"; /* green, faint */
+ color_off = "\033[0m"; /* default */
+
+ printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "NAME");
+}
+
+sh$target:::function-entry,
+sh$target:::function-return,
+sh$target:::builtin-entry,
+sh$target:::command-entry,
+syscall:::entry,
+syscall:::return,
+/* Customize Here, */
+pid$target:a.out:e*:entry,
+pid$target:a.out:e*:return
+/self->last == 0 && pid == $target/
+{
+ self->last = timestamp;
+}
+
+sh$target:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "func",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh$target:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), "func",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->last = timestamp;
+}
+
+sh$target:::builtin-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh$target:::builtin-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->last = timestamp;
+}
+
+sh$target:::command-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh$target:::command-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->last = timestamp;
+}
+
+sh$target:::line
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-- %s\n", color_line,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg1, "line",
+ self->depth * 2, "", color_off);
+ self->last = timestamp;
+}
+
+/* Customise Here, */
+pid$target:a.out:e*:entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_lib,
+ cpu, pid, this->delta, basename(execname), "sh",
+ self->depth * 2, "", probefunc, color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+/* Customise Here, */
+pid$target:a.out:e*:return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_lib,
+ cpu, pid, this->delta, basename(execname), "sh",
+ self->depth * 2, "", probefunc, color_off);
+ self->last = timestamp;
+}
+
+syscall:::entry
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall,
+ cpu, pid, this->delta, basename(execname), "syscall",
+ self->depth * 2, "", probefunc, color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+syscall:::return
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall,
+ cpu, pid, this->delta, basename(execname), "syscall",
+ self->depth * 2, "", probefunc, color_off);
+ self->last = timestamp;
+}
+
+proc:::exit
+/pid == $target/
+{
+ exit(0);
+}
diff --git a/Shell/sh_stat.d b/Shell/sh_stat.d
new file mode 100755
index 000000000000..70e29b480ee3
--- /dev/null
+++ b/Shell/sh_stat.d
@@ -0,0 +1,133 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_stat.d - Bourne shell operation stats using DTrace.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_stat.d 52 2007-09-24 04:28:01Z brendan $
+ *
+ * This traces activity from all sh processes on the system that are running
+ * with sh provider support.
+ *
+ * USAGE: sh_stat.d [interval [count]]
+ *
+ * FIELDS:
+ * EXEC/s Bourne shells executed per second, including
+ * those without sh provider support
+ * FUNC/s Functions called, per second
+ * BLTIN/s Builtins called, per second
+ * SUB-SH/s Sub-shells called, per second
+ * CMD/s External commands called, per second
+ *
+ * The numbers are counts for the interval specified. The default interval
+ * is 1 second.
+ *
+ * If you see a count in "EXECS" but not in the other columns, then sh
+ * scripts may be running without the DTrace sh provider. See Shell/Readme.
+ *
+ * Filename and function names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+inline int SCREEN = 21;
+
+dtrace:::BEGIN
+{
+ execs = funcs = builtins = subs = cmds = 0;
+ lines = SCREEN + 1;
+ interval = $1 ? $1 : 1;
+ counts = $2 ? $2 : -1;
+ secs = interval;
+ first = 1;
+}
+
+profile:::tick-1sec
+{
+ secs--;
+}
+
+/*
+ * Print Header
+ */
+dtrace:::BEGIN,
+profile:::tick-1sec
+/first || (secs == 0 && lines > SCREEN)/
+{
+ printf("%-20s %8s %8s %8s %8s %8s\n", "TIME", "EXEC/s", "FUNCS/s",
+ "BLTINS/s", "SUB-SH/s", "CMD/s");
+ lines = 0;
+ first = 0;
+}
+
+/*
+ * Tally Data
+ */
+proc:::exec-success
+/execname == "sh"/
+{
+ execs++;
+}
+
+sh*:::function-entry
+{
+ funcs++;
+}
+
+sh*:::builtin-entry
+{
+ builtins++;
+}
+
+sh*:::subshell-entry
+/arg0 != 0/
+{
+ subs++;
+}
+
+sh*:::command-entry
+{
+ cmds++;
+}
+
+/*
+ * Print Output
+ */
+profile:::tick-1sec
+/secs == 0/
+{
+ printf("%-20Y %8d %8d %8d %8d %8d\n", walltimestamp, execs / interval,
+ funcs / interval, builtins / interval, subs / interval,
+ cmds / interval);
+ execs = funcs = builtins = subs = cmds = 0;
+ secs = interval;
+ lines++;
+ counts--;
+}
+
+/*
+ * End
+ */
+profile:::tick-1sec
+/counts == 0/
+{
+ exit(0);
+}
diff --git a/Shell/sh_syscalls.d b/Shell/sh_syscalls.d
new file mode 100755
index 000000000000..127bede5d8e1
--- /dev/null
+++ b/Shell/sh_syscalls.d
@@ -0,0 +1,83 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_syscalls.d - count Bourne calls and syscalls using DTrace.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_syscalls.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * USAGE: sh_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * FILE Filename of the shell or shellscript
+ * TYPE Type of call (func/builtin/cmd/syscall)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * Filename and function names are printed if available.
+ * The filename for syscalls may be printed as the shell name, if the
+ * script was invoked using the form "shell filename" rather than running
+ * the script with an interpreter line.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+self string filename;
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sh$target:::function-entry,
+sh$target:::builtin-entry,
+sh$target:::command-entry
+/self->filename == NULL/
+{
+ self->filename = basename(copyinstr(arg0));
+}
+
+sh$target:::function-entry
+{
+ @calls[self->filename, "func", copyinstr(arg1)] = count();
+}
+
+sh$target:::builtin-entry
+{
+ @calls[self->filename, "builtin", copyinstr(arg1)] = count();
+}
+
+sh$target:::command-entry
+{
+ @calls[self->filename, "cmd", copyinstr(arg1)] = count();
+}
+
+syscall:::entry
+/pid == $target/
+{
+ @calls[basename(execname), "syscall", probefunc] = count();
+}
+
+dtrace:::END
+{
+ printf("\nCalls for PID %d,\n\n", $target);
+ printf(" %-32s %-10s %-22s %8s\n", "FILE", "TYPE", "NAME", "COUNT");
+ printa(" %-32s %-10s %-22s %@8d\n", @calls);
+}
diff --git a/Shell/sh_syscolors.d b/Shell/sh_syscolors.d
new file mode 100755
index 000000000000..3622cb39f487
--- /dev/null
+++ b/Shell/sh_syscolors.d
@@ -0,0 +1,169 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_syscolors.d - trace Bourne shell flow plus syscalls, in color.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_syscolors.d 27 2007-09-13 09:26:01Z brendan $
+ *
+ * USAGE: sh_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * This watches shell function entries and returns, and indents child
+ * function calls. Shell builtins, commands and lines are also printed.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * FILE Filename of the shell script
+ * LINE Line number of filename
+ * TYPE Type of call (func/builtin/cmd/line/shell)
+ * NAME Shell function, builtin or command name
+ *
+ * The filename for syscalls may be printed as the shell name, if the
+ * script was invoked using the form "shell filename" rather than running
+ * the script with an interpreter line.
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ color_shell = "\033[2;35m"; /* violet, faint */
+ color_line = "\033[1;35m"; /* violet, bold */
+ color_syscall = "\033[2;32m"; /* green, faint */
+ color_off = "\033[0m"; /* default */
+
+ printf("%s %6s %10s %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
+ "FILE", "LINE", "TYPE", "NAME");
+}
+
+sh$target:::function-entry,
+sh$target:::function-return,
+sh$target:::builtin-entry,
+sh$target:::command-entry,
+sh$target:::line,
+syscall:::entry,
+syscall:::return
+/self->last == 0 && pid == $target/
+{
+ self->last = timestamp;
+}
+
+sh$target:::function-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "func",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh$target:::function-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), "func",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->last = timestamp;
+}
+
+sh$target:::builtin-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh$target:::builtin-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->last = timestamp;
+}
+
+sh$target:::command-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-> %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->depth++;
+ self->last = timestamp;
+}
+
+sh$target:::command-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s<- %s%s\n", color_shell,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd",
+ self->depth * 2, "", copyinstr(arg1), color_off);
+ self->last = timestamp;
+}
+
+sh$target:::line
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:%-4d %-8s %*s-- %s\n", color_line,
+ cpu, pid, this->delta, basename(copyinstr(arg0)), arg1, "line",
+ self->depth * 2, "", color_off);
+ self->last = timestamp;
+}
+
+syscall:::entry
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:- %-8s %*s-> %s%s\n", color_syscall,
+ cpu, pid, this->delta, basename(execname), "syscall",
+ self->depth * 2, "", probefunc, color_off);
+ self->last = timestamp;
+}
+
+syscall:::return
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%d %6d %10d %16s:- %-8s %*s<- %s%s\n", color_syscall,
+ cpu, pid, this->delta, basename(execname), "syscall",
+ self->depth * 2, "", probefunc, color_off);
+ self->last = timestamp;
+}
+
+proc:::exit
+/pid == $target/
+{
+ exit(0);
+}
diff --git a/Shell/sh_wasted.d b/Shell/sh_wasted.d
new file mode 100755
index 000000000000..e20db8ea6efe
--- /dev/null
+++ b/Shell/sh_wasted.d
@@ -0,0 +1,101 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_wasted.d - measure Bourne shell elapsed times for "wasted" commands.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_wasted.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * USAGE: sh_wasted.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * This script measures "wasted" commands - those which are called externally
+ * but are in fact builtins to the shell. Ever seen a script which calls
+ * /usr/bin/echo needlessly? This script measures that cost.
+ *
+ * FIELDS:
+ * FILE Filename of the shell or shellscript
+ * NAME Name of call
+ * TIME Total elapsed time for calls (us)
+ *
+ * IDEA: Mike Shapiro
+ *
+ * Filename and call names are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ isbuiltin["echo"] = 1;
+ isbuiltin["test"] = 1;
+ /* add builtins here */
+
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ self->start = timestamp;
+}
+
+sh$target:::command-entry
+{
+ self->command = timestamp;
+}
+
+sh$target:::command-return
+{
+ this->elapsed = timestamp - self->command;
+ this->path = copyinstr(arg1);
+ this->cmd = basename(this->path);
+}
+
+sh$target:::command-return
+/self->command && !isbuiltin[this->cmd]/
+{
+ @types_cmd[basename(copyinstr(arg0)), this->path] = sum(this->elapsed);
+ self->command = 0;
+}
+
+sh$target:::command-return
+/self->command/
+{
+ @types_wasted[basename(copyinstr(arg0)), this->path] =
+ sum(this->elapsed);
+ self->command = 0;
+}
+
+proc:::exit
+/pid == $target/
+{
+ exit(0);
+}
+
+dtrace:::END
+{
+ this->elapsed = (timestamp - self->start) / 1000;
+ printf("Script duration: %d us\n", this->elapsed);
+
+ normalize(@types_cmd, 1000);
+ printf("\nExternal command elapsed times,\n");
+ printf(" %-30s %-22s %8s\n", "FILE", "NAME", "TIME(us)");
+ printa(" %-30s %-22s %@8d\n", @types_cmd);
+
+ normalize(@types_wasted, 1000);
+ printf("\nWasted command elapsed times,\n");
+ printf(" %-30s %-22s %8s\n", "FILE", "NAME", "TIME(us)");
+ printa(" %-30s %-22s %@8d\n", @types_wasted);
+}
diff --git a/Shell/sh_who.d b/Shell/sh_who.d
new file mode 100755
index 000000000000..3e106ff80f50
--- /dev/null
+++ b/Shell/sh_who.d
@@ -0,0 +1,56 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * sh_who.d - trace Bourne shell line execution by process using DTrace.
+ * Written for the sh DTrace provider.
+ *
+ * $Id: sh_who.d 25 2007-09-12 09:51:58Z brendan $
+ *
+ * This traces shell activity from all Bourne shells on the system that are
+ * running with sh provider support.
+ *
+ * USAGE: sh_who.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID of the shell
+ * UID User ID of the owner
+ * LINES Number of times a line was executed
+ * FILE Pathname of the shell or shellscript
+ *
+ * Filenames are printed if available.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+sh*:::line
+{
+ @lines[pid, uid, copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %6s %6s %s\n", "PID", "UID", "LINES", "FILE");
+ printa(" %6d %6d %@6d %s\n", @lines);
+}
diff --git a/Snippits/Readme b/Snippits/Readme
new file mode 100644
index 000000000000..b54dc77583b0
--- /dev/null
+++ b/Snippits/Readme
@@ -0,0 +1,11 @@
+Snippits - DTrace code snippits
+
+ This directory has useful snippits of D scripting in seperate files.
+
+ When coding in DTrace, I frequently refer to the same chunks of code
+ from the same scripts, when I need to do certain things that I have
+ solved in the past. I also refer other people to them when asked.
+ This directory is a library for such "snippits" of code.
+
+ This directory does not contain runnable DTrace scripts.
+
diff --git a/Snippits/fd2pathname.txt b/Snippits/fd2pathname.txt
new file mode 100644
index 000000000000..b056e1318135
--- /dev/null
+++ b/Snippits/fd2pathname.txt
@@ -0,0 +1,32 @@
+You have a file descriptor (probably from a syscall), and you want the
+corresponding pathname.
+
+If you are on newer versions of DTrace, there is the fds[] array,
+
+# dtrace -n 'syscall::read:entry { @[fds[arg0].fi_pathname] = count(); }'
+dtrace: description 'syscall::read:entry ' matched 1 probe
+^C
+
+ /etc/minor_perm 2
+ /etc/mnttab 2
+ /etc/motd 2
+ /etc/magic 4
+ /usr/sbin/clri 5
+ /devices/pseudo/clone@0:ptm 6
+ /sbin/mount 6
+ /dev/pts/28 7
+ /devices/pseudo/consms@0:mouse 31
+ /devices/pseudo/conskbd@0:kbd 47
+ <unknown> 351
+
+easy.
+
+but if you are on an older version of DTrace, try this to convert from
+this->fd to self->vpath,
+
+ this->filep =
+ curthread->t_procp->p_user.u_finfo.fi_list[this->fd].uf_file;
+ this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0;
+ self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ?
+ cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>";
+
diff --git a/System/Readme b/System/Readme
new file mode 100644
index 000000000000..3d739da38ee0
--- /dev/null
+++ b/System/Readme
@@ -0,0 +1,3 @@
+System - System based analysis
+
+ This would include measuring system wide activity.
diff --git a/System/sar-c.d b/System/sar-c.d
new file mode 100755
index 000000000000..ef6319868583
--- /dev/null
+++ b/System/sar-c.d
@@ -0,0 +1,101 @@
+#!/usr/sbin/dtrace -s
+/*
+ * sar-c.d - sar -c demo in DTrace.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This has been written to demonstrate fetching similar data as sar -c
+ * from DTrace. This program is intended as a starting point for other
+ * DTrace scripts, by beginning with familiar statistics.
+ *
+ * $Id: sar-c.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: sar-c.d
+ *
+ * FIELDS:
+ * scall/s System calls
+ * sread/s reads
+ * swrit/s writes
+ * fork/s forks
+ * exec/s execs
+ * rchar/s read characters
+ * wchar/s write characters
+ *
+ * IDEA: David Rubio, who also wrote the original.
+ *
+ * NOTES:
+ * As this program does not use Kstat, there is no summary since boot line.
+ *
+ * SEE ALSO: sar(1)
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 12-Jun-2005 Brendan Gregg Created this.
+ * 12-Jun-2005 " " Last update.
+ */
+
+#pragma D option quiet
+
+inline int SCREEN = 21;
+
+/*
+ * Initialise variables
+ */
+dtrace:::BEGIN
+{
+ scall = 0; sread = 0; swrit = 0; fork = 0; exec = 0;
+ rchar = 0; wchar = 0;
+ lines = SCREEN + 1;
+}
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN,
+tick-1sec
+/lines++ > SCREEN/
+{
+ printf("%-20s %7s %7s %7s %7s %7s %8s %8s\n",
+ "Time", "scall/s", "sread/s", "swrit/s", "fork/s",
+ "exec/s", "rchar/s", "wchar/s");
+ lines = 0;
+}
+
+/*
+ * Probe events
+ */
+syscall:::entry { scall++; }
+sysinfo:::sysread { sread++; }
+sysinfo:::syswrite { swrit++; }
+sysinfo:::sysfork { fork++; }
+sysinfo:::sysvfork { fork++; }
+sysinfo:::sysexec { exec++; }
+sysinfo:::readch { rchar += arg0; }
+sysinfo:::writech { wchar += arg0; }
+
+/*
+ * Print output line
+ */
+profile:::tick-1sec
+{
+ /* print line */
+ printf("%20Y %7d %7d %7d %4d.00 %4d.00 %8d %8d\n",
+ walltimestamp, scall, sread, swrit, fork, exec, rchar, wchar);
+
+ /* clear counters */
+ scall = 0; sread = 0; swrit = 0; fork = 0; exec = 0;
+ rchar = 0; wchar = 0;
+}
diff --git a/System/syscallbysysc.d b/System/syscallbysysc.d
new file mode 100755
index 000000000000..86b8ac3e58a8
--- /dev/null
+++ b/System/syscallbysysc.d
@@ -0,0 +1,10 @@
+#!/usr/sbin/dtrace -s
+/*
+ * syscallbysysc.d - report on syscalls by syscall. DTrace OneLiner.
+ *
+ * This is a DTrace OneLiner from the DTraceToolkit.
+ *
+ * $Id: syscallbysysc.d 3 2007-08-01 10:50:08Z brendan $
+ */
+
+syscall:::entry { @num[probefunc] = count(); }
diff --git a/System/topsyscall b/System/topsyscall
new file mode 100755
index 000000000000..63ef8c620345
--- /dev/null
+++ b/System/topsyscall
@@ -0,0 +1,184 @@
+#!/usr/bin/ksh
+#
+# topsyscall - display top syscalls by syscall name.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This program continually prints a report of the top system calls,
+# and refreshes the display every 1 second or as specified at the
+# command line.
+#
+# $Id: topsyscall 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: topsyscall [-Cs] [interval [count]]
+#
+# -C # don't clear the screen
+# -s # print per second values
+#
+# FIELDS:
+# load avg load averages, see uptime(1)
+# syscalls total syscalls in this interval
+# syscalls/s syscalls per second
+# SYSCALL system call name
+# COUNT total syscalls in this interval
+# COUNT/s syscalls per second
+#
+# INSPIRATION: top(1) by William LeFebvre
+#
+# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# 13-Jun-2005 Brendan Gregg Created this.
+# 20-Apr-2006 " " Last update.
+#
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+count=-1; interval=1; opt_persec=0; opt_clear=1
+
+### Process options
+while getopts Chs name
+do
+ case $name in
+ C) opt_clear=0 ;;
+ s) opt_persec=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: topsyscall [-s] [interval [count]]
+ -C # don't clear the screen
+ -s # print per second values
+ eg,
+ topsyscall # default, 1 second updates
+ topsyscall 5 # 5 second updates
+ END
+ exit 1
+ esac
+done
+shift $(( $OPTIND - 1 ))
+
+### option logic
+if [[ "$1" > 0 ]]; then
+ interval=$1; shift
+fi
+if [[ "$1" > 0 ]]; then
+ count=$1; shift
+fi
+if (( opt_clear )); then
+ clearstr=`clear`
+else
+ clearstr=.
+fi
+
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+ #pragma D option destructive
+
+ /* constants */
+ inline int OPT_clear = '$opt_clear';
+ inline int OPT_persec = '$opt_persec';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+ inline int SCREEN = 20;
+ inline string CLEAR = "'$clearstr'";
+
+ /* variables */
+ dtrace:::BEGIN
+ {
+ secs = INTERVAL;
+ counts = COUNTER;
+ printf("Tracing... Please wait.\n");
+ }
+
+ /* record syscall event */
+ syscall:::entry
+ {
+ @Name[probefunc] = count();
+ @Total = count();
+ }
+
+ /* timer */
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+ /* update screen */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ /* fetch load averages */
+ this->load1a = `hp_avenrun[0] / 65536;
+ this->load5a = `hp_avenrun[1] / 65536;
+ this->load15a = `hp_avenrun[2] / 65536;
+ this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536;
+ this->load5b = ((`hp_avenrun[1] % 65536) * 100) / 65536;
+ this->load15b = ((`hp_avenrun[2] % 65536) * 100) / 65536;
+
+ /* clear screen */
+ OPT_clear ? printf("%s", CLEAR) : 1;
+
+ /* print load average */
+ printf("%Y, load average: %d.%02d, %d.%02d, %d.%02d",
+ walltimestamp, this->load1a, this->load1b, this->load5a,
+ this->load5b, this->load15a, this->load15b);
+
+ /* calculate per second values if needed */
+ OPT_persec ? normalize(@Total, INTERVAL) : 1;
+ OPT_persec ? normalize(@Name, INTERVAL) : 1;
+
+ /* print syscall count */
+ printf(" %s: ", OPT_persec ? "syscalls/s" : "syscalls");
+ printa("%@d\n",@Total);
+
+ /* print report */
+ trunc(@Name, SCREEN);
+ printf("\n %-25s %12s\n", "SYSCALL",
+ OPT_persec ? "COUNT/s" : "COUNT");
+ printa(" %-25s %@12d\n", @Name);
+ printf("\n");
+
+ /* reset variables */
+ trunc(@Name);
+ clear(@Total);
+ secs = INTERVAL;
+ counts--;
+ }
+
+ /*
+ * End of program
+ */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+
+ /*
+ * Cleanup for Ctrl-C
+ */
+ dtrace:::END
+ {
+ trunc(@Name);
+ trunc(@Total);
+ }
+'
+
diff --git a/System/uname-a.d b/System/uname-a.d
new file mode 100755
index 000000000000..777502109692
--- /dev/null
+++ b/System/uname-a.d
@@ -0,0 +1,53 @@
+#!/usr/sbin/dtrace -s
+/*
+ * uname-a.d - "uname -a" demo in DTrace.
+ * Written using DTrace (Solaris 10 3/05).
+ *
+ * This has been written to demonstrate fetching the "uname -a" info
+ * from a DTrace script, which turns out to be all kernel variables.
+ * This is intended as a starting point for other DTrace scripts, by
+ * beginning with familiar statistics.
+ *
+ * $Id: uname-a.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: uname-a.d
+ *
+ * FIELDS: See uname(1) manpage for documentation.
+ *
+ * SEE ALSO: uname
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * 24-Jul-2005 Brendan Gregg Created this.
+ * 24-Jul-2005 " " Last update.
+ */
+
+#pragma D option quiet
+#pragma D option bufsize=8k
+
+/* print system info */
+dtrace:::BEGIN
+{
+ printf("%s %s %s %s %s %s %s",
+ `utsname.sysname,
+ `utsname.nodename,
+ `utsname.release,
+ `utsname.version,
+ `utsname.machine,
+ `architecture,
+ `platform);
+
+ exit(0);
+}
diff --git a/Tcl/Readme b/Tcl/Readme
new file mode 100644
index 000000000000..68c73528085c
--- /dev/null
+++ b/Tcl/Readme
@@ -0,0 +1,39 @@
+Tcl - DTracing Tcl Programs
+
+ These scripts trace activity of the Tcl programming language, making use
+ of the Tcl DTrace provider which was integrated into the Tcl source in
+ version tcl8.4.16. See the Tcl DTrace wiki page for details:
+
+ http://wiki.tcl.tk/19923
+
+ This provider was written by Daniel Steffen and is currently available
+ by downloading and compiling the Tcl source with the --enable-dtrace
+ option to configure.
+
+ Since the DTrace Tcl provider could be developed a little further, there is
+ a chance that it has changed slightly by the time you are reading this,
+ causing these scripts to either break or behave oddly. Firstly, check for
+ newer versions of the DTraceToolkit; if it hasn't been updated and you need
+ to use these scripts immediately, then updating them shouldn't take
+ too long. The following was the state of the provider when these scripts
+ were written - check for changes and update the scripts accordingly,
+
+ provider tcl {
+ probe proc-entry(procname, argc, argv);
+ probe proc-return(procname, retcode);
+ probe proc-result(procname, retcode, retval, retobj);
+ probe proc-args(procname, args, ...);
+ probe cmd-entry(cmdname, argc, argv);
+ probe cmd-return(cmdname, retval);
+ probe cmd-args(procname, args, ...);
+ probe inst-start(instname, depth, stackobj);
+ probe inst-done(instname, depth, stackobj);
+ probe obj-create(object);
+ probe obj-free(object);
+ proobe tcl-probe(strings, ...);
+ };
+
+ Update: it looks like two new probes have recently been added to the
+ provider: proc-info and cmd-info. I'll need to update these scripts to
+ make use of these new probes.
+
diff --git a/Tcl/tcl_calldist.d b/Tcl/tcl_calldist.d
new file mode 100755
index 000000000000..47cbd4c9692d
--- /dev/null
+++ b/Tcl/tcl_calldist.d
@@ -0,0 +1,111 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * tcl_calldist.d - measure Tcl elapsed time for different types of operation.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_calldist.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * USAGE: tcl_calldist.d [top] # hit Ctrl-C to end
+ * eg,
+ * tcl_calldist.d # default, truncate to 10 lines
+ * tcl_calldist.d 25 # truncate each report section to 25 lines
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * FIELDS:
+ * 1 Process ID
+ * 2 Type of call (proc/cmd/total)
+ * 3 Name of call
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#define TOP 10 /* default output truncation */
+#define B_FALSE 0
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ top = $1 != 0 ? $1 : TOP;
+}
+
+tcl*:::proc-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->proc[self->depth] = timestamp;
+}
+
+tcl*:::proc-return
+/self->proc[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->proc[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->proc[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->name = copyinstr(arg0);
+
+ @types_incl[pid, "proc", this->name] =
+ quantize(this->elapsed_incl / 1000);
+ @types_excl[pid, "proc", this->name] =
+ quantize(this->elapsed_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+tcl*:::cmd-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->cmd[self->depth] = timestamp;
+}
+
+tcl*:::cmd-return
+/self->cmd[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->cmd[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->cmd[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->name = copyinstr(arg0);
+
+ @types_incl[pid, "cmd", this->name] =
+ quantize(this->elapsed_incl / 1000);
+ @types_excl[pid, "cmd", this->name] =
+ quantize(this->elapsed_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+dtrace:::END
+{
+ trunc(@types_excl, top);
+ printf("\nTop %d exclusive elapsed times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types_excl);
+
+ trunc(@types_incl, top);
+ printf("\nTop %d inclusive elapsed times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types_incl);
+}
diff --git a/Tcl/tcl_calls.d b/Tcl/tcl_calls.d
new file mode 100755
index 000000000000..755efe72bcb2
--- /dev/null
+++ b/Tcl/tcl_calls.d
@@ -0,0 +1,63 @@
+#!/usr/sbin/dtrace -ZCs
+/*
+ * tcl_calls.d - count Tcl calls (proc/cmd) using DTrace.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_calls.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_calls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * TYPE Type of call (see below)
+ * NAME Name of proc or cmd call
+ * COUNT Number of calls during sample
+ *
+ * TYPEs:
+ * proc procedure
+ * cmd command
+ *
+ * PORTIONS: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+tcl*:::proc-entry
+{
+ @calls[pid, "proc", copyinstr(arg0)] = count();
+}
+
+tcl*:::cmd-entry
+{
+ @calls[pid, "cmd", copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT");
+ printa(" %6d %-8s %-52s %@8d\n", @calls);
+}
diff --git a/Tcl/tcl_calltime.d b/Tcl/tcl_calltime.d
new file mode 100755
index 000000000000..bab2ade2d50c
--- /dev/null
+++ b/Tcl/tcl_calltime.d
@@ -0,0 +1,123 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * tcl_calltime.d - measure Tcl elapsed times for different types of operation.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_calltime.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * USAGE: tcl_calltime.d [top] # hit Ctrl-C to end
+ * eg,
+ * tcl_calltime.d # default, truncate to 10 lines
+ * tcl_calltime.d 25 # truncate each report section to 25 lines
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * FIELDS:
+ * PID Process ID
+ * TYPE Type of call (proc/cmd/total)
+ * NAME Name of call
+ * TOTAL Total elapsed time for calls (us)
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#define TOP 10 /* default output truncation */
+#define B_FALSE 0
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ top = $1 != 0 ? $1 : TOP;
+}
+
+tcl*:::proc-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->proc[self->depth] = timestamp;
+}
+
+tcl*:::proc-return
+/self->proc[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->proc[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->proc[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->name = copyinstr(arg0);
+
+ @num[pid, "proc", this->name] = count();
+ @num[0, "total", "-"] = count();
+ @types_incl[pid, "proc", this->name] = sum(this->elapsed_incl);
+ @types_excl[pid, "proc", this->name] = sum(this->elapsed_excl);
+ @types_excl[0, "total", "-"] = sum(this->elapsed_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+tcl*:::cmd-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->cmd[self->depth] = timestamp;
+}
+
+tcl*:::cmd-return
+/self->cmd[self->depth]/
+{
+ this->elapsed_incl = timestamp - self->cmd[self->depth];
+ this->elapsed_excl = this->elapsed_incl - self->exclude[self->depth];
+ self->cmd[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->name = copyinstr(arg0);
+
+ @num[pid, "cmd", this->name] = count();
+ @num[0, "total", "-"] = count();
+ @types_incl[pid, "cmd", this->name] = sum(this->elapsed_incl);
+ @types_excl[pid, "cmd", this->name] = sum(this->elapsed_excl);
+ @types_excl[0, "total", "-"] = sum(this->elapsed_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->elapsed_incl;
+}
+
+dtrace:::END
+{
+ trunc(@num, top);
+ printf("\nTop %d counts,\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "COUNT");
+ printa(" %6d %-10s %-48s %@8d\n", @num);
+
+ trunc(@types_excl, top);
+ normalize(@types_excl, 1000);
+ printf("\nTop %d exclusive elapsed times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types_excl);
+
+ trunc(@types_incl, top);
+ normalize(@types_incl, 1000);
+ printf("\nTop %d inclusive elapsed times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types_incl);
+}
diff --git a/Tcl/tcl_cpudist.d b/Tcl/tcl_cpudist.d
new file mode 100755
index 000000000000..69f4ba2bc2ef
--- /dev/null
+++ b/Tcl/tcl_cpudist.d
@@ -0,0 +1,111 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * tcl_cpudist.d - measure Tcl on-CPU time for different types of operation.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_cpudist.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * USAGE: tcl_cpudist.d [top] # hit Ctrl-C to end
+ * eg,
+ * tcl_cpudist.d # default, truncate to 10 lines
+ * tcl_cpudist.d 25 # truncate each report section to 25 lines
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * FIELDS:
+ * 1 Process ID
+ * 2 Type of call (proc/cmd/total)
+ * 3 Name of call
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#define TOP 10 /* default output truncation */
+#define B_FALSE 0
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ top = $1 != 0 ? $1 : TOP;
+}
+
+tcl*:::proc-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->proc[self->depth] = vtimestamp;
+}
+
+tcl*:::proc-return
+/self->proc[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->proc[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->proc[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->name = copyinstr(arg0);
+
+ @types_incl[pid, "proc", this->name] =
+ quantize(this->oncpu_incl / 1000);
+ @types_excl[pid, "proc", this->name] =
+ quantize(this->oncpu_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+tcl*:::cmd-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->cmd[self->depth] = vtimestamp;
+}
+
+tcl*:::cmd-return
+/self->cmd[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->cmd[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->cmd[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->name = copyinstr(arg0);
+
+ @types_incl[pid, "cmd", this->name] =
+ quantize(this->oncpu_incl / 1000);
+ @types_excl[pid, "cmd", this->name] =
+ quantize(this->oncpu_excl / 1000);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+dtrace:::END
+{
+ trunc(@types_excl, top);
+ printf("\nTop %d exclusive on-CPU times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types_excl);
+
+ trunc(@types_incl, top);
+ printf("\nTop %d inclusive on-CPU times (us),\n", top);
+ printa(" PID=%d, %s, %s %@d\n", @types_incl);
+}
diff --git a/Tcl/tcl_cputime.d b/Tcl/tcl_cputime.d
new file mode 100755
index 000000000000..a29a541ed74f
--- /dev/null
+++ b/Tcl/tcl_cputime.d
@@ -0,0 +1,123 @@
+#!/usr/sbin/dtrace -CZs
+/*
+ * tcl_cputime.d - measure Tcl on-CPU times for different types of operation.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_cputime.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * USAGE: tcl_cputime.d [top] # hit Ctrl-C to end
+ * eg,
+ * tcl_cputime.d # default, truncate to 10 lines
+ * tcl_cputime.d 25 # truncate each report section to 25 lines
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * FIELDS:
+ * PID Process ID
+ * TYPE Type of call (proc/cmd/total)
+ * NAME Name of call
+ * TOTAL Total on-CPU time for calls (us)
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#define TOP 10 /* default output truncation */
+#define B_FALSE 0
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+ top = $1 != 0 ? $1 : TOP;
+}
+
+tcl*:::proc-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->proc[self->depth] = vtimestamp;
+}
+
+tcl*:::proc-return
+/self->proc[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->proc[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->proc[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->name = copyinstr(arg0);
+
+ @num[pid, "proc", this->name] = count();
+ @num[0, "total", "-"] = count();
+ @types_incl[pid, "proc", this->name] = sum(this->oncpu_incl);
+ @types_excl[pid, "proc", this->name] = sum(this->oncpu_excl);
+ @types_excl[0, "total", "-"] = sum(this->oncpu_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+tcl*:::cmd-entry
+{
+ self->depth++;
+ self->exclude[self->depth] = 0;
+ self->cmd[self->depth] = vtimestamp;
+}
+
+tcl*:::cmd-return
+/self->cmd[self->depth]/
+{
+ this->oncpu_incl = vtimestamp - self->cmd[self->depth];
+ this->oncpu_excl = this->oncpu_incl - self->exclude[self->depth];
+ self->cmd[self->depth] = 0;
+ self->exclude[self->depth] = 0;
+ this->name = copyinstr(arg0);
+
+ @num[pid, "cmd", this->name] = count();
+ @num[0, "total", "-"] = count();
+ @types_incl[pid, "cmd", this->name] = sum(this->oncpu_incl);
+ @types_excl[pid, "cmd", this->name] = sum(this->oncpu_excl);
+ @types_excl[0, "total", "-"] = sum(this->oncpu_excl);
+
+ self->depth--;
+ self->exclude[self->depth] += this->oncpu_incl;
+}
+
+dtrace:::END
+{
+ trunc(@num, top);
+ printf("\nTop %d counts,\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "COUNT");
+ printa(" %6d %-10s %-48s %@8d\n", @num);
+
+ trunc(@types_excl, top);
+ normalize(@types_excl, 1000);
+ printf("\nTop %d exclusive on-CPU times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types_excl);
+
+ trunc(@types_incl, top);
+ normalize(@types_incl, 1000);
+ printf("\nTop %d inclusive on-CPU times (us),\n", top);
+ printf(" %6s %-10s %-48s %8s\n", "PID", "TYPE", "NAME", "TOTAL");
+ printa(" %6d %-10s %-48s %@8d\n", @types_incl);
+}
diff --git a/Tcl/tcl_flow.d b/Tcl/tcl_flow.d
new file mode 100755
index 000000000000..914682826998
--- /dev/null
+++ b/Tcl/tcl_flow.d
@@ -0,0 +1,86 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * tcl_flow.d - snoop Tcl execution showing procedure flow using DTrace.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_flow.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_flow.d # hit Ctrl-C to end
+ *
+ * This watches Tcl method entries and returns, and indents child
+ * method calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * PID Process ID
+ * CALL Tcl command or procedure name
+ *
+ * LEGEND:
+ * -> procedure entry
+ * <- procedure return
+ * > command entry
+ * < command return
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %6s %-16s -- %s\n", "C", "PID", "TIME(us)", "CALL");
+}
+
+tcl*:::proc-entry
+{
+ printf("%3d %6d %-16d %*s-> %s\n", cpu, pid, timestamp / 1000,
+ self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+}
+
+tcl*:::proc-return
+{
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %*s<- %s\n", cpu, pid, timestamp / 1000,
+ self->depth * 2, "", copyinstr(arg0));
+}
+
+tcl*:::cmd-entry
+{
+ printf("%3d %6d %-16d %*s > %s\n", cpu, pid, timestamp / 1000,
+ self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+}
+
+tcl*:::cmd-return
+{
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %*s < %s\n", cpu, pid, timestamp / 1000,
+ self->depth * 2, "", copyinstr(arg0));
+}
diff --git a/Tcl/tcl_flowtime.d b/Tcl/tcl_flowtime.d
new file mode 100755
index 000000000000..85f1b998a2e7
--- /dev/null
+++ b/Tcl/tcl_flowtime.d
@@ -0,0 +1,105 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * tcl_flowtime.d - snoop Tcl execution showing procedure flow and delta times.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_flowtime.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_flowtime.d # hit Ctrl-C to end
+ *
+ * This watches Tcl method entries and returns, and indents child
+ * method calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * TIME(us) Time since boot, us
+ * DELTA(us) Elapsed time from previous line to this line
+ * CALL Tcl command or procedure name
+ *
+ * LEGEND:
+ * -> procedure entry
+ * <- procedure return
+ * > command entry
+ * < command return
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %6s %-16s %9s -- %s\n", "C", "PID", "TIME(us)",
+ "DELTA(us)", "CALL");
+}
+
+tcl*:::proc-entry,
+tcl*:::proc-return,
+tcl*:::cmd-entry,
+tcl*:::cmd-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+tcl*:::proc-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %-16d %9d %*s-> %s\n", cpu, pid, timestamp / 1000,
+ this->delta, self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+ self->last = timestamp;
+}
+
+tcl*:::proc-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %9d %*s<- %s\n", cpu, pid, timestamp / 1000,
+ this->delta, self->depth * 2, "", copyinstr(arg0));
+ self->last = timestamp;
+}
+
+tcl*:::cmd-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %-16d %9d %*s > %s\n", cpu, pid, timestamp / 1000,
+ this->delta, self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+ self->last = timestamp;
+}
+
+tcl*:::cmd-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %9d %*s < %s\n", cpu, pid, timestamp / 1000,
+ this->delta, self->depth * 2, "", copyinstr(arg0));
+ self->last = timestamp;
+}
diff --git a/Tcl/tcl_ins.d b/Tcl/tcl_ins.d
new file mode 100755
index 000000000000..39518f9b54bc
--- /dev/null
+++ b/Tcl/tcl_ins.d
@@ -0,0 +1,57 @@
+#!/usr/sbin/dtrace -ZCs
+/*
+ * tcl_ins.d - count Tcl instructions using DTrace.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_ins.d 64 2007-10-04 08:35:29Z claire $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_calls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * TYPE Type of call (see below)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * TYPEs:
+ * inst instruction
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+tcl*:::inst-start
+{
+ @calls[pid, "inst", copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT");
+ printa(" %6d %-8s %-52s %@8d\n", @calls);
+}
diff --git a/Tcl/tcl_insflow.d b/Tcl/tcl_insflow.d
new file mode 100755
index 000000000000..ba5e01cbf671
--- /dev/null
+++ b/Tcl/tcl_insflow.d
@@ -0,0 +1,123 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * tcl_insflow.d - snoop Tcl execution showing procedure flow and delta times.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_insflow.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_insflow.d # hit Ctrl-C to end
+ *
+ * This watches Tcl method entries and returns, and indents child
+ * method calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * TIME(us) Time since boot, us
+ * DELTA(us) Elapsed time from previous line to this line
+ * TYPE Type of call (proc/cmd/inst)
+ * CALL Tcl command or procedure name
+ *
+ * LEGEND:
+ * proc procedure
+ * cmd command
+ * inst instruction
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %6s %-16s %9s %5s -- %s\n", "C", "PID", "TIME(us)",
+ "DELTA(us)", "TYPE", "CALL");
+}
+
+tcl*:::proc-entry,
+tcl*:::proc-return,
+tcl*:::cmd-entry,
+tcl*:::cmd-return
+/self->last == 0/
+{
+ self->last = timestamp;
+}
+
+tcl*:::proc-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %-16d %9d %5s %*s-> %s\n", cpu, pid, timestamp / 1000,
+ this->delta, "proc", self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+ self->last = timestamp;
+}
+
+tcl*:::proc-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %9d %5s %*s<- %s\n", cpu, pid, timestamp / 1000,
+ this->delta, "proc", self->depth * 2, "", copyinstr(arg0));
+ self->last = timestamp;
+}
+
+tcl*:::cmd-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %-16d %9d %5s %*s-> %s\n", cpu, pid, timestamp / 1000,
+ this->delta, "cmd", self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+ self->last = timestamp;
+}
+
+tcl*:::cmd-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %9d %5s %*s<- %s\n", cpu, pid, timestamp / 1000,
+ this->delta, "cmd", self->depth * 2, "", copyinstr(arg0));
+ self->last = timestamp;
+}
+
+tcl*:::inst-start
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%3d %6d %-16d %9d %5s %*s-> %s\n", cpu, pid, timestamp / 1000,
+ this->delta, "inst", self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+ self->last = timestamp;
+}
+
+tcl*:::inst-done
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %9d %5s %*s<- %s\n", cpu, pid, timestamp / 1000,
+ this->delta, "inst", self->depth * 2, "", copyinstr(arg0));
+ self->last = timestamp;
+}
diff --git a/Tcl/tcl_proccalls.d b/Tcl/tcl_proccalls.d
new file mode 100755
index 000000000000..c874362f096e
--- /dev/null
+++ b/Tcl/tcl_proccalls.d
@@ -0,0 +1,53 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * tcl_methodcalls.d - count Tcl method calls DTrace.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_proccalls.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_methodcalls.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * COUNT Number of calls during sample
+ * PROCEDURE Tcl procedure name
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+tcl*:::proc-entry
+{
+ @calls[pid, copyinstr(arg0)] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %8s %s\n", "PID", "COUNT", "PROCEDURE");
+ printa(" %6d %@8d %s\n", @calls);
+}
diff --git a/Tcl/tcl_procflow.d b/Tcl/tcl_procflow.d
new file mode 100755
index 000000000000..258c198266b8
--- /dev/null
+++ b/Tcl/tcl_procflow.d
@@ -0,0 +1,70 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * tcl_procflow.d - snoop Tcl execution showing procedure flow using DTrace.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_procflow.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_procflow.d # hit Ctrl-C to end
+ *
+ * This watches Tcl method entries and returns, and indents child
+ * method calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * TIME(us) Time since boot, us
+ * PID Process ID
+ * PROCEDURE Tcl procedure name
+ *
+ * LEGEND:
+ * -> proc entry
+ * <- proc return
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ printf("%3s %6s %-16s -- %s\n", "C", "PID", "TIME(us)", "PROCEDURE");
+}
+
+tcl*:::proc-entry
+{
+ printf("%3d %6d %-16d %*s-> %s\n", cpu, pid, timestamp / 1000,
+ self->depth * 2, "", copyinstr(arg0));
+ self->depth++;
+}
+
+tcl*:::proc-return
+{
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%3d %6d %-16d %*s<- %s\n", cpu, pid, timestamp / 1000,
+ self->depth * 2, "", copyinstr(arg0));
+}
diff --git a/Tcl/tcl_stat.d b/Tcl/tcl_stat.d
new file mode 100755
index 000000000000..a321d700cea7
--- /dev/null
+++ b/Tcl/tcl_stat.d
@@ -0,0 +1,137 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * tcl_stat.d - Tcl operation stats using DTrace.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_stat.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_stat.d [interval [count]]
+ *
+ * FIELDS:
+ * EXEC/s Tcl programs executed per second, including
+ * those without Tcl provider support
+ * PROC/s Procedures called, per second
+ * CMD/s Commands created, per second
+ * OBJNEW/s Objects created, per second
+ * OBJFRE/s Objects freed, per second
+ * OP/s Bytecode operations, per second
+ *
+ * The numbers are counts for the interval specified. The default interval
+ * is 1 second.
+ *
+ * If you see a count in "EXECS" but not in the other columns, then you
+ * may have older Tcl software that does not have the integrated DTrace
+ * provider (or newer software where the provider has changed).
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option defaultargs
+
+inline int SCREEN = 21;
+
+dtrace:::BEGIN
+{
+ execs = procs = cmds = objnew = objfree = ops = 0;
+ lines = SCREEN + 1;
+ interval = $1 ? $1 : 1;
+ counts = $2 ? $2 : -1;
+ secs = interval;
+ first = 1;
+}
+
+profile:::tick-1sec
+{
+ secs--;
+}
+
+/*
+ * Print Header
+ */
+dtrace:::BEGIN,
+profile:::tick-1sec
+/first || (secs == 0 && lines > SCREEN)/
+{
+ printf("%-20s %6s %8s %8s %8s %8s %8s\n", "TIME", "EXEC/s",
+ "PROC/s", "CMD/s", "OBJNEW/s", "OBJFRE/s", "OP/s");
+ lines = 0;
+ first = 0;
+}
+
+/*
+ * Tally Data
+ */
+proc:::exec-success
+/execname == "tcl" || execname == "tclsh"/
+{
+ execs++;
+}
+
+tcl*:::proc-entry
+{
+ procs++;
+}
+
+tcl*:::cmd-entry
+{
+ cmds++;
+}
+
+tcl*:::obj-create
+{
+ objnew++;
+}
+
+tcl*:::obj-free
+{
+ objfree++;
+}
+
+tcl*:::inst-start
+{
+ ops++;
+}
+
+/*
+ * Print Output
+ */
+profile:::tick-1sec
+/secs == 0/
+{
+ printf("%-20Y %6d %8d %8d %8d %8d %8d\n", walltimestamp,
+ execs / interval, procs / interval, cmds / interval,
+ objnew / interval, objfree / interval, ops / interval);
+ execs = procs = cmds = objnew = objfree = ops = 0;
+ secs = interval;
+ lines++;
+ counts--;
+}
+
+/*
+ * End
+ */
+profile:::tick-1sec
+/counts == 0/
+{
+ exit(0);
+}
diff --git a/Tcl/tcl_syscalls.d b/Tcl/tcl_syscalls.d
new file mode 100755
index 000000000000..239d7d0a447d
--- /dev/null
+++ b/Tcl/tcl_syscalls.d
@@ -0,0 +1,66 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * tcl_syscalls.d - count Tcl calls and syscalls using DTrace.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_syscalls.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_syscalls.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID
+ * TYPE Type of call (method/syscall)
+ * NAME Name of call
+ * COUNT Number of calls during sample
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+tcl$target:::proc-entry
+{
+ @calls[pid, "proc", copyinstr(arg0)] = count();
+}
+
+tcl$target:::cmd-entry
+{
+ @calls[pid, "cmd", copyinstr(arg0)] = count();
+}
+
+syscall:::entry
+/pid == $target/
+{
+ @calls[pid, "syscall", probefunc] = count();
+}
+
+
+dtrace:::END
+{
+ printf(" %6s %-8s %-52s %8s\n", "PID", "TYPE", "NAME", "COUNT");
+ printa(" %6d %-8s %-52s %@8d\n", @calls);
+}
diff --git a/Tcl/tcl_syscolors.d b/Tcl/tcl_syscolors.d
new file mode 100755
index 000000000000..f2529b5344d9
--- /dev/null
+++ b/Tcl/tcl_syscolors.d
@@ -0,0 +1,139 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * tcl_syscolors.d - trace Tcl program flow plus syscalls, in color.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_syscolors.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_syscolors.d { -p PID | -c cmd } # hit Ctrl-C to end
+ *
+ * This watches Tcl method entries and returns, and indents child
+ * method calls.
+ *
+ * FIELDS:
+ * C CPU-id
+ * PID Process ID
+ * TID Thread ID
+ * DELTA(us) Elapsed time from previous line to this line
+ * TYPE Type of call (proc/cmd/syscall)
+ * NAME Tcl proc/cmd or syscall name
+ *
+ * WARNING: Watch the first column carefully, it prints the CPU-id. If it
+ * changes, then it is very likely that the output has been shuffled.
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+#pragma D option switchrate=10
+
+self int depth;
+
+dtrace:::BEGIN
+{
+ color_tcl = "\033[2;35m"; /* violet, faint */
+ color_line = "\033[1;35m"; /* violet, bold */
+ color_syscall = "\033[2;32m"; /* green, faint */
+ color_off = "\033[0m"; /* default */
+
+ printf("%3s %6s %9s %-8s -- %s\n", "C", "PID", "DELTA(us)", "TYPE",
+ "NAME");
+}
+
+tcl$target:::method-entry,
+tcl$target:::method-return,
+syscall:::entry,
+syscall:::return
+/self->last == 0 && pid == $target/
+{
+ self->last = timestamp;
+}
+
+tcl$target:::proc-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%3d %6d %9d %-8s %*s-> %s%s\n", color_tcl, cpu,
+ pid, this->delta, "proc", self->depth * 2, "", copyinstr(arg0),
+ color_off);
+ self->depth++;
+ self->depthlast = self->depth;
+ self->last = timestamp;
+}
+
+tcl$target:::proc-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%3d %6d %9d %-8s %*s<- %s%s\n", color_tcl, cpu,
+ pid, this->delta, "proc", self->depth * 2, "", copyinstr(arg0),
+ color_off);
+ self->depthlast = self->depth;
+ self->last = timestamp;
+}
+
+tcl$target:::cmd-entry
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%3d %6d %9d %-8s %*s-> %s%s\n", color_tcl, cpu,
+ pid, this->delta, "cmd", self->depth * 2, "", copyinstr(arg0),
+ color_off);
+ self->depth++;
+ self->depthlast = self->depth;
+ self->last = timestamp;
+}
+
+tcl$target:::cmd-return
+{
+ this->delta = (timestamp - self->last) / 1000;
+ self->depth -= self->depth > 0 ? 1 : 0;
+ printf("%s%3d %6d %9d %-8s %*s<- %s%s\n", color_tcl, cpu,
+ pid, this->delta, "cmd", self->depth * 2, "", copyinstr(arg0),
+ color_off);
+ self->depthlast = self->depth;
+ self->last = timestamp;
+}
+
+syscall:::entry
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%3d %6d %9d %-8s %*s-> %s%s\n", color_syscall,
+ cpu, pid, this->delta, "syscall", self->depthlast * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+syscall:::return
+/pid == $target/
+{
+ this->delta = (timestamp - self->last) / 1000;
+ printf("%s%3d %6d %9d %-8s %*s<- %s%s\n", color_syscall,
+ cpu, pid, this->delta, "syscall", self->depthlast * 2, "",
+ probefunc, color_off);
+ self->last = timestamp;
+}
+
+proc:::exit
+/pid == $target/
+{
+ exit(0);
+}
diff --git a/Tcl/tcl_who.d b/Tcl/tcl_who.d
new file mode 100755
index 000000000000..424ad31bf573
--- /dev/null
+++ b/Tcl/tcl_who.d
@@ -0,0 +1,62 @@
+#!/usr/sbin/dtrace -Zs
+/*
+ * tcl_who.d - trace Tcl calls by process using DTrace.
+ * Written for the Tcl DTrace provider.
+ *
+ * $Id: tcl_who.d 63 2007-10-04 04:34:38Z brendan $
+ *
+ * This traces activity from all Tcl processes on the system with DTrace
+ * provider support (tcl8.4.16).
+ *
+ * USAGE: tcl_who.d # hit Ctrl-C to end
+ *
+ * FIELDS:
+ * PID Process ID of Tcl
+ * UID User ID of the owner
+ * CALLS Number of calls made (proc + cmd)
+ * ARGS Process name and arguments
+ *
+ * Calls is a measure of activity, and is a count of the procedures and
+ * commands that Tcl called.
+ *
+ * The argument list is truncated at 55 characters (up to 80 is easily
+ * available). To easily read the full argument list, use other system tools;
+ * on Solaris use "pargs PID".
+ *
+ * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-Sep-2007 Brendan Gregg Created this.
+ */
+
+#pragma D option quiet
+
+dtrace:::BEGIN
+{
+ printf("Tracing... Hit Ctrl-C to end.\n");
+}
+
+tcl*:::proc-entry,
+tcl*:::cmd-entry
+{
+ @calls[pid, uid, curpsinfo->pr_psargs] = count();
+}
+
+dtrace:::END
+{
+ printf(" %6s %6s %6s %-55s\n", "PID", "UID", "CALLS", "ARGS");
+ printa(" %6d %6d %@6d %-55.55s\n", @calls);
+}
diff --git a/User/Readme b/User/Readme
new file mode 100644
index 000000000000..d737125ca646
--- /dev/null
+++ b/User/Readme
@@ -0,0 +1,3 @@
+User - User based analysis
+
+ This would include activity by UID.
diff --git a/User/setuids.d b/User/setuids.d
new file mode 100755
index 000000000000..f66d4415dc73
--- /dev/null
+++ b/User/setuids.d
@@ -0,0 +1,82 @@
+#!/usr/sbin/dtrace -s
+/*
+ * setuids.d - snoop setuid calls. This can examine user logins.
+ * Written in DTrace (Solaris 10 3/05).
+ *
+ * $Id: setuids.d 3 2007-08-01 10:50:08Z brendan $
+ *
+ * USAGE: setuids.d
+ *
+ * FIELDS:
+ * UID user ID (from)
+ * SUID set user ID (to)
+ * PPID parent process ID
+ * PID process ID
+ * PCMD parent command
+ * CMD command (full arguments)
+ *
+ * SEE ALSO: BSM auditing
+ *
+ * COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+ *
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at Docs/cddl1.txt
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * CDDL HEADER END
+ *
+ * 09-May-2004 Brendan Gregg Created this.
+ * 08-May-2005 " " Used modern variable builtins.
+ * 28-Jul-2005 " " Last update.
+ */
+
+#pragma D option quiet
+
+/*
+ * Print header
+ */
+dtrace:::BEGIN
+{
+ printf("%5s %5s %5s %5s %-12s %s\n",
+ "UID", "SUID", "PPID", "PID", "PCMD", "CMD");
+}
+
+/*
+ * Save values
+ */
+syscall::setuid:entry
+{
+ self->uid = uid;
+ self->suid = arg0;
+ self->ok = 1;
+}
+
+/*
+ * Print output on success
+ */
+syscall::setuid:return
+/arg0 == 0 && self->ok/
+{
+ printf("%5d %5d %5d %5d %-12s %S\n",
+ self->uid, self->suid, ppid, pid,
+ curthread->t_procp->p_parent->p_user.u_comm,
+ curpsinfo->pr_psargs);
+}
+
+/*
+ * Cleanup
+ */
+syscall::setuid:return
+{
+ self->uid = 0;
+ self->suid = 0;
+ self->ok = 0;
+}
diff --git a/Version b/Version
new file mode 100644
index 000000000000..261c82361905
--- /dev/null
+++ b/Version
@@ -0,0 +1 @@
+DTraceToolkit version 0.99, 30-Sep-2007
diff --git a/Zones/Readme b/Zones/Readme
new file mode 100644
index 000000000000..578e720c217c
--- /dev/null
+++ b/Zones/Readme
@@ -0,0 +1,3 @@
+Zones - Zones based analysis
+
+ This would include activity by Zone.
diff --git a/Zones/zvmstat b/Zones/zvmstat
new file mode 100755
index 000000000000..e49f89c8ed54
--- /dev/null
+++ b/Zones/zvmstat
@@ -0,0 +1,277 @@
+#!/usr/bin/ksh
+#
+# zvmstat - print vmstat style info per Zone.
+# This uses DTrace (Solaris 10 3/05).
+#
+# This program must be run from the global zone as root.
+#
+# $Id: zvmstat 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: zvmstat [-ht] [interval [count]]
+#
+# zvmstat # default output
+# -t # print times
+# eg,
+# zvmstat 1 # print every 1 second
+# zvmstat 10 5 # print 5 x 10 second samples
+# zvmstat -t 5 # print every 5 seconds with time
+#
+#
+# FIELDS:
+# re page reclaims
+# mf minor faults
+# fr pages freed
+# sr scan rate
+# epi executable pages paged in
+# epo executable pages paged out
+# epf executable pages freed
+# api anonymous pages paged in
+# apo anonymous pages paged out
+# apf anonymous pages freed
+# fpi filesystem pages paged in
+# fpo filesystem pages paged out
+# fpf filesystem pages freed
+#
+# NOTES:
+# - Zone status should really be provided by Kstat, which currently
+# provides system wide values, per CPU and per processor set, but not per
+# zone. DTrace can fill this role in the meantime until Kstat supports zones.
+# - First output does not contain summary since boot.
+#
+# SEE ALSO: prstat -Z
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# BUGS:
+# - First output may not contain all zones due to how loops are achieved.
+# Check for newer versions.
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 11-May-2005 Brendan Gregg Created this.
+# 26-Jul-2005 " " Improved code.
+# 08-Jan-2006 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_time=0; interval=1; counts=1
+
+### process options
+while getopts ht name
+do
+ case $name in
+ t) opt_time=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: zvmstat [-ht] [interval [count]]
+ zvmstat # default output
+ -t # print times
+ eg,
+ zvmstat 1 # print every 1 second
+ zvmstat 10 5 # print 5 x 10 second samples
+ zvmstat -t 5 # print every 5 seconds with time
+ END
+ exit 1
+ esac
+done
+shift $(( OPTIND - 1 ))
+
+### option logic
+if (( "0$1" > 0 )); then
+ interval=$1; counts=-1; shift
+fi
+if (( "0$1" > 0 )); then
+ counts=$1; shift
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+dtrace -n '
+ #pragma D option quiet
+ #pragma D option destructive
+ #pragma D option switchrate=10
+
+ /*
+ * Command line arguments
+ */
+ inline int OPT_time = '$opt_time';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$counts';
+
+ /*
+ * Initialise variables
+ */
+ dtrace:::BEGIN
+ {
+ secs = INTERVAL;
+ counts = COUNTER;
+ zonemax = 0;
+ listing = 1;
+ re[""] = 0; pi[""] = 0; po[""] = 0;
+ mf[""] = 0; sr[""] = 0; fr[""] = 0;
+ epi[""] = 0; epo[""] = 0; epf[""] = 0;
+ api[""] = 0; apo[""] = 0; apf[""] = 0;
+ fpi[""] = 0; fpo[""] = 0; fpf[""] = 0;
+ }
+
+ /*
+ * Build zonelist array
+ *
+ * Here we want the output of a command to be saved into an array
+ * inside dtrace. This is done by running the command, sending the
+ * output to /dev/null, and by probing its write syscalls from dtrace.
+ *
+ * This is an example of a "scraper".
+ */
+
+ /*
+ * List zones
+ */
+ dtrace:::BEGIN
+ {
+ /* run zoneadm */
+ system("/usr/sbin/zoneadm list > /dev/null; echo END > /dev/null");
+ }
+
+ /*
+ * Scrape zone listing
+ */
+ syscall::write:entry
+ /listing && (execname == "zoneadm") &&
+ (curthread->t_procp->p_parent->p_ppid == $pid)/
+ {
+ /* read zoneadm output */
+ zonelist[zonemax] = stringof(copyin(arg1, arg2 - 1));
+
+ /* increment max number of zones */
+ zonemax++;
+ }
+
+ /*
+ * Finish scraping zones
+ */
+ syscall::write:entry
+ /listing && (execname == "sh") && (ppid == $pid)/
+ {
+ /*
+ * this end tag lets us know our zonelist has finished.
+ * thanks A. Packer.
+ */
+ listing = stringof(copyin(arg1, arg2 - 1)) == "END" ? 0 : 1;
+ }
+
+ /*
+ * Record vminfo counters
+ */
+ vminfo:::pgrec { re[zonename] += arg0; }
+ vminfo:::as_fault { mf[zonename] += arg0; }
+ vminfo:::scan { sr[zonename] += arg0; }
+ vminfo:::execpgin { epi[zonename] += arg0; }
+ vminfo:::execpgout { epo[zonename] += arg0; }
+ vminfo:::execfree { epf[zonename] += arg0; fr[zonename] += arg0; }
+ vminfo:::anonpgin { api[zonename] += arg0; }
+ vminfo:::anonpgout { apo[zonename] += arg0; }
+ vminfo:::anonfree { apf[zonename] += arg0; fr[zonename] += arg0; }
+ vminfo:::fspgin { fpi[zonename] += arg0; }
+ vminfo:::fspgout { fpo[zonename] += arg0; }
+ vminfo:::fsfree { fpf[zonename] += arg0; fr[zonename] += arg0; }
+
+ /*
+ * Timer
+ */
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+ /*
+ * Check for exit
+ */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+
+ /*
+ * Print header line
+ */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ /* set counters */
+ secs = INTERVAL;
+ counts--;
+ zonei = 0;
+
+ /* print time */
+ OPT_time ? printf("\n%Y,\n",walltimestamp) : 1;
+
+ /* print output line */
+ printf("%10s %4s %5s %4s %5s %4s %4s %4s %4s %4s %4s %4s %4s %4s\n",
+ "ZONE", "re", "mf", "fr", "sr", "epi", "epo", "epf", "api", "apo",
+ "apf", "fpi", "fpo", "fpf");
+
+ /* ensure zone writes are triggered */
+ printf(" \b");
+ }
+
+ /*
+ * Print zone status line
+ *
+ * This is a fairly interesting function in that it loops over the keys in
+ * an associative array and prints out the values. DTrace cant really do
+ * loops, and generally doesnt need to. We "cheat" by generating writes
+ * in the above probe which in turn trigger the probe below which
+ * contains the contents of each loop. Dont do this at home! We are
+ * supposed to use aggreagations instead, wherever possible.
+ *
+ * This is an example of a "feedback loop".
+ */
+ syscall::write:return
+ /pid == $pid && zonei < zonemax/
+ {
+ /* fetch zonename */
+ self->zone = zonelist[zonei];
+
+ /* print output */
+ printf("%10s %4d %5d %4d %5d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n",
+ self->zone, re[self->zone], mf[self->zone], fr[self->zone],
+ sr[self->zone], epi[self->zone], epo[self->zone],
+ epf[self->zone], api[self->zone], apo[self->zone],
+ apf[self->zone], fpi[self->zone], fpo[self->zone],
+ fpf[self->zone]);
+
+ /* clear values */
+ re[self->zone] = 0; mf[self->zone] = 0; fr[self->zone] = 0;
+ sr[self->zone] = 0; epi[self->zone] = 0; epo[self->zone] = 0;
+ epf[self->zone] = 0; api[self->zone] = 0; apo[self->zone] = 0;
+ apf[self->zone] = 0; fpi[self->zone] = 0; fpo[self->zone] = 0;
+ fpf[self->zone] = 0;
+ self->zone = 0;
+
+ /* go to next zone */
+ zonei++;
+ }
+'
+
diff --git a/dexplorer b/dexplorer
new file mode 100755
index 000000000000..002c80376359
--- /dev/null
+++ b/dexplorer
@@ -0,0 +1,547 @@
+#!/usr/bin/ksh
+#
+# dexplorer - DTrace system explorer, runs a collection of scripts.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This program automatically runs a collection of DTrace scripts to examine
+# many areas of the system, and places the output in a meaningful directory
+# structure that is tar'd and gzip'd.
+#
+# $Id: dexplorer 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: dexplorer [-yDT] [-d outputdir] [-i interval]
+#
+# -q # quiet mode
+# -y # "yes", don't prompt for confirmation
+# -D # don't delete output dir
+# -T # don't create output tar.gz
+# -d outputdir # output directory
+# -i interval # interval for each sample
+# eg,
+# dexplorer # default is 5 second samples
+# dexplorer -y -i30 # no prompting, with 30 second samples
+#
+# SEE ALSO: DTraceToolkit
+#
+# THANKS: David Visser, et all. for the idea and encouragement.
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# CODE:
+#
+# This is currently a monolithic script, and while it contains only
+# a few dozen straigftforward DTrace scripts I think it's desirable to
+# keep it that way. The scripts themselves have designed to be very
+# generic (eg, switching on all sdt:::), and are aggregations to keep a
+# limit on the size of the output.
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 23-Jun-2005 Brendan Gregg Created this.
+# 28-Jun-2005 " " Last update.
+
+#
+# Default variables
+#
+interval=5 # time of each sample
+verbose=1 # print screen output
+prompt=1 # prompt before run
+tar=1 # create tar file
+delete=1 # delete output dirs
+dtrace=/usr/sbin/dtrace # path to dtrace
+root=. # default output dir
+PATH=/usr/bin:/usr/sbin # safe path
+dir=de_`uname -n`_`date +%Y%m%d%H%M` # OUTPUT FILENAME
+samples=20 # max number of tests
+current=0 # current sample
+
+#
+# Process options
+#
+while getopts d:hi:qyDT name
+do
+ case $name in
+ d) root=$OPTARG ;;
+ i) interval=$OPTARG ;;
+ q) verbose=0 ;;
+ y) prompt=0 ;;
+ D) delete=0 ;;
+ T) tar=0 ;;
+ h|?) cat <<-END >&2
+ USAGE: dexplorer [-qyDT] [-d outputdir] [-i interval]
+
+ -q # quiet mode
+ -y # "yes", don't prompt for confirmation
+ -D # don't delete output dir
+ -T # don't create output tar.gz
+ -d outputdir # output directory
+ -i interval # interval for each sample
+ eg,
+ dexplorer # default is 5 second samples
+ dexplorer -y -i30 # no prompting, with 30 second samples
+ END
+ exit 1
+ esac
+done
+shift $(( OPTIND - 1 ))
+
+#
+# Confirm path
+#
+if [[ "$prompt" == "1" ]] ; then
+ if [[ "$root" == "." ]]; then
+ print "Output dir will be the current dir ($PWD)."
+ else
+ print "Output dir will be $root"
+ fi
+ print -n "Hit enter for yes, or type path: "
+ read ans junk
+ if [[ "$ans" == [yY] || "$ans" == [yY]es ]]; then
+ print "WARNING: I didn't ask for \"$ans\"!"
+ print "\tI was asking for the path or just enter."
+ print "\tignoring \"$ans\"..."
+ fi
+ if [[ "$ans" != "" ]]; then
+ root=$ans
+ print "Output is now $root."
+ fi
+fi
+
+#
+# Sanity checks
+#
+if [[ "$interval" == *[a-zA-Z]* ]]; then
+ print "ERROR2: Invalid interval $interval.\n"
+ print "Please use a number of seconds."
+ exit 2
+fi
+if (( ${#interval} < 1 )); then
+ print "ERROR3: Length of interval $interval too short.\n"
+ print "Minimum 1 second."
+ exit 3
+fi
+if [[ ! -d "$root" ]]; then
+ print "ERROR4: Output directory \"$root\" does not exist.\n"
+ print "Perhaps try a mkdir first?"
+ print "or use an existing dir, eg \"/tmp\""
+ exit 4
+fi
+if [[ ! -w "$root" ]]; then
+ print "ERROR5: Can't write to output directory \"$root\".\n"
+ print "Are you logged in as root?"
+ print "Perhaps try another directory, eg \"/tmp\""
+ exit 5
+fi
+if [[ `$dtrace -b1k -qn 'BEGIN { trace(pid); exit(0); }'` == "" ]]; then
+ print "ERROR6: Unable to run dtrace!\n"
+ print "Perhaps this is a permission problem? Try running as root."
+ exit 6
+fi
+
+# calculate total time
+(( total = interval * samples ))
+if (( total > 180 )); then
+ (( total = total / 60 ))
+ total="$total minutes"
+else
+ total="$total seconds"
+fi
+
+#
+# Common Functions
+#
+function decho {
+ if (( verbose )); then print "$*"; fi
+}
+clean="sed /^\$/d"
+header='dtrace:::BEGIN {
+ printf("%Y, ", walltimestamp);
+ printf("%s %s %s %s %s, ", `utsname.sysname, `utsname.nodename,
+ `utsname.release, `utsname.version, `utsname.machine);
+ printf("%d secs\n",'$interval');
+ }
+ profile:::tick-'$interval'sec { exit(0); }
+ '
+function dstatus {
+ if (( verbose )); then
+ (( percent = current * 100 / samples ))
+ printf "%3d%% $*\n" $percent
+ (( current = current + 1 ))
+ fi
+}
+
+########################################
+# START #
+########################################
+
+#
+# Make dirs
+#
+err=0
+cd $root
+(( err = err + $? ))
+mkdir $dir
+(( err = err + $? ))
+cd $dir
+(( err = err + $? ))
+base1=${PWD##*/}
+base2=${dir##*/}
+if [[ "$base1" != "$base2" || "$err" != "0" ]]; then
+ print "ERROR7: tried to mkdir $dir from $root, but something failed.\n"
+ print "Check directories before rerunning."
+ exit 7
+fi
+mkdir Cpu
+mkdir Disk
+mkdir Mem
+mkdir Net
+mkdir Proc
+mkdir Info
+
+#
+# Create Log
+#
+decho "Starting dexplorer ver 0.76."
+decho "Sample interval is $interval seconds. Total run is > $total."
+( print "dexplorer ver 0.76\n------------------"
+print -n "System: "
+uname -a
+print -n "Start: "
+date ) > log
+
+#
+# Capture Standard Info
+#
+args='pid,ppid,uid,gid,projid,zoneid,pset,pri,nice,'
+args=$args'class,vsz,rss,time,pcpu,pmem,args'
+uname -a > Info/uname-a # System
+psrinfo -v > Info/psrinfo-v # CPU
+prtconf > Info/prtconf # Memory (+ devices)
+df -k > Info/df-k # Disk
+ifconfig -a > Info/ifconfig-a # Network
+ps -eo $args > Info/ps-o # Processes
+uptime > Info/uptime # Load
+
+#
+# Cpu Tests, DTrace
+#
+
+dstatus "Interrupts by CPU..."
+$dtrace -qn "$header"'
+ sdt:::interrupt-start { @num[cpu] = count(); }
+ dtrace:::END
+ {
+ printf("%-16s %16s\n", "CPU", "INTERRUPTS");
+ printa("%-16d %@16d\n", @num);
+ }
+' | $clean > Cpu/interrupt_by_cpu
+
+dstatus "Interrupt times..."
+$dtrace -qn "$header"'
+ sdt:::interrupt-start { self->ts = vtimestamp; }
+ sdt:::interrupt-complete
+ /self->ts && arg0 != 0/
+ {
+ this->devi = (struct dev_info *)arg0;
+ self->name = this->devi != 0 ?
+ stringof(`devnamesp[this->devi->devi_major].dn_name) : "?";
+ this->inst = this->devi != 0 ? this->devi->devi_instance : 0;
+ @num[self->name, this->inst] = sum(vtimestamp - self->ts);
+ self->name = 0;
+ }
+ sdt:::interrupt-complete { self->ts = 0; }
+ dtrace:::END
+ {
+ printf("%11s %16s\n", "DEVICE", "TIME (ns)");
+ printa("%10s%-3d %@16d\n", @num);
+ }
+' | $clean > Cpu/interrupt_time
+
+dstatus "Dispatcher queue length by CPU..."
+$dtrace -qn "$header"'
+ profile:::profile-1000
+ {
+ this->num = curthread->t_cpu->cpu_disp->disp_nrunnable;
+ @length[cpu] = lquantize(this->num, 0, 100, 1);
+ }
+ dtrace:::END { printa(" CPU %d%@d\n", @length); }
+' | $clean > Cpu/dispqlen_by_cpu
+
+dstatus "Sdt counts..."
+$dtrace -qn "$header"'
+ sdt:::{ @num[probefunc, probename] = count(); }
+ dtrace:::END
+ {
+ printf("%-32s %-32s %10s\n", "FUNC", "NAME", "COUNT");
+ printa("%-32s %-32s %@10d\n", @num);
+ }
+' | $clean > Cpu/sdt_count
+
+#
+# Disk Tests, DTrace
+#
+
+dstatus "Pages paged in by process..."
+$dtrace -qn "$header"'
+ vminfo:::pgpgin { @pg[pid, execname] = sum(arg0); }
+ dtrace:::END
+ {
+ printf("%6s %-16s %16s\n", "PID", "CMD", "PAGES");
+ printa("%6d %-16s %@16d\n", @pg);
+ }
+' | $clean > Disk/pgpgin_by_process
+
+dstatus "Files opened successfully count..."
+$dtrace -qn "$header"'
+ syscall::open*:entry { self->file = copyinstr(arg0); self->ok = 1; }
+ syscall::open*:return /self->ok && arg0 != -1/
+ {
+ @num[self->file] = count();
+ }
+ syscall::open*:return /self->ok/ { self->file = 0; self->ok = 0; }
+ dtrace:::END
+ {
+ printf("%-64s %8s\n", "FILE", "COUNT");
+ printa("%-64s %@8d\n", @num);
+ }
+' | $clean > Disk/fileopen_count
+
+dstatus "Disk I/O size distribution by process..."
+$dtrace -qn "$header"'
+ io:::start { @size[pid, execname] = quantize(args[0]->b_bcount); }
+' | $clean > Disk/sizedist_by_process
+
+#
+# Mem Tests, DTrace
+#
+
+dstatus "Minor faults by process..."
+$dtrace -qn "$header"'
+ vminfo:::as_fault { @mem[pid, execname] = sum(arg0); }
+ dtrace:::END
+ {
+ printf("%6s %-16s %16s\n", "PID", "CMD", "MINFAULTS");
+ printa("%6d %-16s %@16d\n", @mem);
+ }
+' | $clean > Mem/minf_by_process
+
+
+dstatus "Vminfo data by process..."
+$dtrace -qn "$header"'
+ vminfo::: { @data[pid, execname, probename] = sum(arg0); }
+ dtrace:::END
+ {
+ printf("%6s %-16s %-16s %16s\n",
+ "PID", "CMD", "STATISTIC", "VALUE");
+ printa("%6d %-16s %-16s %@16d\n", @data);
+ }
+' | $clean > Mem/vminfo_by_process
+
+#
+# Net Tests, DTrace
+#
+
+dstatus "Mib data by mib statistic..."
+$dtrace -qn "$header"'
+ mib::: { @data[probename] = sum(arg0); }
+ dtrace:::END
+ {
+ printf("%-32s %16s\n", "STATISTIC", "VALUE");
+ printa("%-32s %@16d\n", @data);
+ }
+' | $clean > Net/mib_data
+
+dstatus "TCP write bytes by process..."
+$dtrace -qn "$header"'
+ fbt:ip:tcp_output:entry
+ {
+ this->size = msgdsize(args[1]);
+ @size[pid, execname] = sum(this->size);
+ }
+ dtrace:::END
+ {
+ printf("%6s %-16s %12s\n", "PID", "CMD", "BYTES");
+ printa("%6d %-16s %@12d\n", @size);
+ }
+' | $clean > Net/tcpw_by_process
+
+#
+# Proc Tests, DTrace
+#
+
+dstatus "Sample process @ 1000 Hz..."
+$dtrace -qn "$header"'
+ profile:::profile-1000
+ {
+ @num[pid, curpsinfo->pr_psargs] = count();
+ }
+ dtrace:::END
+ {
+ printf("%6s %12s %s\n", "PID", "SAMPLES", "ARGS");
+ printa("%6d %@12d %S\n", @num);
+ }
+' | $clean > Proc/sample_process
+
+dstatus "Syscall count by process..."
+$dtrace -qn "$header"'
+ syscall:::entry { @num[pid, execname, probefunc] = count(); }
+ dtrace:::END
+ {
+ printf("%6s %-24s %-24s %8s\n",
+ "PID", "CMD", "SYSCALL", "COUNT");
+ printa("%6d %-24s %-24s %@8d\n", @num);
+ }
+' | $clean > Proc/syscall_by_process
+
+dstatus "Syscall count by syscall..."
+$dtrace -qn "$header"'
+ syscall:::entry { @num[probefunc] = count(); }
+ dtrace:::END
+ {
+ printf("%-32s %16s\n", "SYSCALL", "COUNT");
+ printa("%-32s %@16d\n", @num);
+ }
+' | $clean > Proc/syscall_count
+
+dstatus "Read bytes by process..."
+$dtrace -qn "$header"'
+ sysinfo:::readch { @bytes[pid, execname] = sum(arg0); }
+ dtrace:::END
+ {
+ printf("%6s %-16s %16s\n", "PID", "CMD", "BYTES");
+ printa("%6d %-16s %@16d\n", @bytes);
+ }
+' | $clean > Proc/readb_by_process
+
+dstatus "Write bytes by process..."
+$dtrace -qn "$header"'
+ sysinfo:::writech { @bytes[pid, execname] = sum(arg0); }
+ dtrace:::END
+ {
+ printf("%6s %-16s %16s\n", "PID", "CMD", "BYTES");
+ printa("%6d %-16s %@16d\n", @bytes);
+ }
+' | $clean > Proc/writeb_by_process
+
+dstatus "Sysinfo counts by process..."
+$dtrace -qn "$header"'
+ sysinfo::: { @num[pid, execname, probename] = sum(arg0); }
+ dtrace:::END
+ {
+ printf("%6s %-16s %-16s %16s\n",
+ "PID", "CMD", "STATISTIC", "COUNT");
+ printa("%6d %-16s %-16s %@16d\n", @num);
+ }
+' | $clean > Proc/sysinfo_by_process
+
+dstatus "New process counts with arguments..."
+$dtrace -qn "$header"'
+ proc:::exec-success
+ {
+ @num[pid, ppid, curpsinfo->pr_psargs] = count();
+ }
+ dtrace:::END
+ {
+ printf("%6s %6s %8s %s\n", "PID", "PPID", "COUNT", "ARGS");
+ printa("%6d %6d %@8d %S\n", @num);
+ }
+' | $clean > Proc/newprocess_count
+
+dstatus "Signal counts..."
+$dtrace -qn "$header"'
+ proc:::signal-send {
+ @num[execname,args[2],stringof(args[1]->pr_fname)] = count();
+ }
+ dtrace:::END
+ {
+ printf("%-16s %-8s %-16s %8s\n",
+ "FROM", "SIG", "TO", "COUNT");
+ printa("%-16s %-8d %-16s %@8d\n", @num);
+ }
+' | $clean > Proc/signal_count
+
+dstatus "Syscall error counts..."
+$dtrace -qn "$header"'
+ syscall:::return /(int)arg0 == -1/
+ {
+ @num[pid, execname, probefunc, errno] = count();
+ }
+ dtrace:::END
+ {
+ printf("%6s %-16s %-32s %-6s %8s\n",
+ "PID", "CMD", "SYSCALL", "ERRNO", "COUNT");
+ printa("%6d %-16s %-32s %-6d %@8d\n", @num);
+ }
+' | $clean > Proc/syscall_errors
+
+
+###########
+# Done
+#
+( print -n "End: "
+date ) >> log
+decho "100% Done."
+if (( tar )); then
+ cd ..
+ tar cf $dir.tar $dir
+ gzip $dir.tar
+ decho "File is $dir.tar.gz"
+fi
+if (( delete && tar )); then
+ cd $dir
+ # this could be all an "rm -r $dir", but since it will be run
+ # as root on production servers - lets be analy cautious,
+ rm Cpu/interrupt_by_cpu
+ rm Cpu/interrupt_time
+ rm Cpu/dispqlen_by_cpu
+ rm Cpu/sdt_count
+ rm Disk/pgpgin_by_process
+ rm Disk/fileopen_count
+ rm Disk/sizedist_by_process
+ rm Mem/minf_by_process
+ rm Mem/vminfo_by_process
+ rm Net/mib_data
+ rm Net/tcpw_by_process
+ rm Proc/sample_process
+ rm Proc/syscall_by_process
+ rm Proc/syscall_count
+ rm Proc/readb_by_process
+ rm Proc/writeb_by_process
+ rm Proc/sysinfo_by_process
+ rm Proc/newprocess_count
+ rm Proc/signal_count
+ rm Proc/syscall_errors
+ rmdir Cpu
+ rmdir Disk
+ rmdir Mem
+ rmdir Net
+ rmdir Proc
+ rm Info/uname-a
+ rm Info/psrinfo-v
+ rm Info/prtconf
+ rm Info/df-k
+ rm Info/ifconfig-a
+ rm Info/ps-o
+ rm Info/uptime
+ rmdir Info
+ rm log
+ cd ..
+ rmdir $dir
+else
+ decho "Directory is $dir"
+fi
+
diff --git a/dvmstat b/dvmstat
new file mode 100755
index 000000000000..41f40e39e785
--- /dev/null
+++ b/dvmstat
@@ -0,0 +1,250 @@
+#!/usr/bin/sh
+#
+# dvmstat - vmstat by PID/name/command.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This program provides vmstat like data for one particular PID, a
+# process name, or when running a command. It prints statistics
+# every second.
+#
+# $Id: dvmstat 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: dvmstat { -p PID | -n name | command }
+# eg,
+# dvmstat -p 1871 # examine PID 1871
+# dvmstat -n tar # examine processes called "tar"
+# dvmstat df -h # run and examine "df -h"
+#
+# FIELDS:
+# re page reclaims Kbytes
+# maj major faults Kbytes
+# mf minor faults Kbytes
+# fr page frees Kbytes
+# epi executable page ins Kbytes
+# epo executable page out Kbytes
+# api anonymous page ins Kbytes
+# apo anonymous page outs Kbytes
+# fpi filesystem page ins Kbytes
+# fpo filesystem page outs Kbytes
+# sy system calls number
+#
+# SEE ALSO: vmstat(1M)
+#
+# NOTES:
+#
+# When using dvmstat to run a command - if the command takes some time
+# to execute, dvmstat will print output every second. If the command runs
+# in less than a second, then the only one line of output will be printed.
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 12-Jun-2005 Brendan Gregg Created this.
+# 08-Jan-2006 " " Last update.
+#
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+opt_pid=0; opt_name=0; pid=0; pname="."; opt_command=0; command=""
+
+### Process options
+while getopts hn:p: name
+do
+ case $name in
+ p) opt_pid=1; pid=$OPTARG ;;
+ n) opt_name=1; pname=$OPTARG ;;
+ h|?) cat <<-END >&2
+ USAGE: dvmstat [-h] { -p PID | -n name | command }
+ -p PID # examine this PID
+ -n name # examine this process name
+ eg,
+ dvmstat -p 1871 # examine PID 1871
+ dvmstat -n tar # examine processes called "tar"
+ dvmstat df -h # run and examine "df -h"
+ END
+ exit 1
+ esac
+done
+shift `expr $OPTIND - 1`
+
+
+### Option logic
+if [ $opt_pid -eq 0 -a $opt_name -eq 0 ]; then
+ opt_command=1
+ if [ "$*" = "" ]; then
+ $0 -h
+ exit
+ fi
+ command="$*"
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+dtrace='
+ #pragma D option quiet
+
+ /*
+ * Command line arguments
+ */
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_name = '$opt_name';
+ inline int OPT_command = '$opt_command';
+ inline int PID = '$pid';
+ inline string NAME = "'$pname'";
+ inline string COMMAND = "'$command'";
+ inline int SCREEN = 21;
+
+ /*
+ * Initialise variables
+ */
+ dtrace:::BEGIN
+ {
+ epi = 0; epo = 0; api = 0; apo = 0; fpi = 0; fpo = 0;
+ re = 0; mf = 0; maj = 0; fr = 0; sy = 0;
+ lines = SCREEN + 1;
+ header = 0;
+ }
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN,
+ dtrace:::END,
+ profile:::tick-1sec
+ /(OPT_command && probename == "END") ||
+ (!(OPT_command && probename == "BEGIN") && lines++ > SCREEN)/
+ {
+ printf("%6s %5s %5s %4s %4s %4s %4s %4s %4s %4s %6s\n",
+ "re", "maj", "mf", "fr", "epi", "epo", "api", "apo",
+ "fpi", "fpo", "sy");
+ lines = 0;
+ }
+
+ /*
+ * Probe events
+ *
+ * this intentionally does not use an associative array for storing data,
+ * for reasons of performance.
+ */
+
+ vminfo:::execpgin
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { epi += arg0; }
+
+ vminfo:::execpgout
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { epo += arg0; }
+
+ vminfo:::anonpgin
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { api += arg0; }
+
+ vminfo:::anonpgout
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { apo += arg0; }
+
+ vminfo:::fspgin
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { fpi += arg0; }
+
+ vminfo:::fspgout
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { fpo += arg0; }
+
+ vminfo:::pgrec
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { re += arg0; }
+
+ vminfo:::as_fault
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { mf += arg0; }
+
+ vminfo:::maj_fault
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { maj += arg0; }
+
+ vminfo:::dfree
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { fr += arg0; }
+
+ syscall:::entry
+ /(OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ { sy++; }
+
+ /*
+ * Print output line
+ */
+ profile:::tick-1sec,
+ dtrace:::END
+ {
+ /* convert to Kbytes */
+ re *= `_pagesize / 1024;
+ maj *= `_pagesize / 1024;
+ mf *= `_pagesize / 1024;
+ fr *= `_pagesize / 1024;
+ epi *= `_pagesize / 1024;
+ epo *= `_pagesize / 1024;
+ api *= `_pagesize / 1024;
+ apo *= `_pagesize / 1024;
+ fpi *= `_pagesize / 1024;
+ fpo *= `_pagesize / 1024;
+
+ /* print line */
+ printf("%6d %5d %5d %4d %4d %4d %4d %4d %4d %4d %6d\n",
+ re, maj, mf, fr, epi, epo, api, apo, fpi, fpo, sy);
+
+ /* clear counters */
+ epi = 0; epo = 0; api = 0; apo = 0; fpi = 0; fpo = 0;
+ re = 0; mf = 0; maj = 0; fr = 0; sy = 0;
+ }
+'
+
+### Run DTrace
+if [ $opt_command -eq 1 ]; then
+ /usr/sbin/dtrace -n "$dtrace" -x evaltime=exec -c "$command" >&2
+else
+ /usr/sbin/dtrace -n "$dtrace" >&2
+fi
+
diff --git a/errinfo b/errinfo
new file mode 100755
index 000000000000..79160b18e57b
--- /dev/null
+++ b/errinfo
@@ -0,0 +1,180 @@
+#!/usr/bin/perl
+#
+# errinfo - report on syscall failures and print errno error messages.
+# Written using Perl and DTrace (Solaris 10 03/05)
+#
+# When system calls fail, an errno variable is set to convay a meaningful
+# message to the end user - so long as the program does something with it
+# (eg, "ls" printing "No such file or directory"). This program fetches
+# and prints details for all syscall failures along with their message,
+# whether the failing program is already printing this info or not.
+#
+# $Id: errinfo 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: errinfo [-ch] [-p PID] [-n name]
+#
+# -c # counts - aggregate style
+# -p PID # examine this PID only
+# -n name # examine processes with this name only
+# eg,
+# errinfo # default output - snoop event style
+# errinfo -n ssh # examine "ssh" processes only
+# errinfo -cn ssh # examine "ssh" using counts
+#
+# FIELDS:
+# EXEC Program name (truncated)
+# SYSCALL System call name
+# ERR Value of errno
+# DESC Description of errno message
+#
+# SEE ALSO: /usr/include/sys/errno.h
+#
+# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 18-Apr-2005 Brendan Gregg Created this.
+# 20-Apr-2006 " " Last update.
+#
+
+use Getopt::Std;
+
+#
+# Defaults
+#
+$FILTER = "";
+$COUNT = 0;
+
+#
+# Command line arguments
+#
+&Usage() if $ARGV[0] eq "--help";
+getopts('ch:n:p:') || &Usage();
+&Usage() if $opt_h;
+$COUNT = 1 if $opt_c;
+$FILTER = "&& execname == \"$opt_n\"" if defined $opt_n;
+$FILTER = "&& pid == $opt_p" if defined $opt_p;
+
+#
+# Load errno descriptions
+#
+open(ERRNO,"/usr/include/sys/errno.h") || die "ERROR1: reading errno.h: $!\n";
+while (chomp($line = <ERRNO>)) {
+ next unless $line =~ /^#define/;
+ ($errno,$desc) = $line =~ /^#define\s+\S+\s+(\d+)\s+\/\*(.*)\*\//;
+ $Errno{$errno} = $desc;
+}
+close ERRNO;
+
+#
+# Declare DTrace script
+#
+ if ($COUNT) { # aggregate style
+$dtrace = <<END;
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+ syscall:::return
+ /errno != 0 && pid != \$pid $FILTER/
+ {
+ \@Errs[execname, probefunc, errno] = count();
+ }
+ dtrace:::END {
+ printa("%s %s %d %\@d\\n", \@Errs);
+ }'
+END
+ } else { # snoop style
+$dtrace = <<END;
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+ #pragma D option switchrate=5hz
+ syscall:::return
+ /errno != 0 && pid != \$pid $FILTER/
+ {
+ printf("%s %s %d\\n", execname, probefunc, errno);
+ }'
+END
+ }
+
+#
+# Cleanup on signals
+#
+$SIG{INT} = \&Cleanup_Signal; # Ctrl-C
+$SIG{QUIT} = \&Cleanup_Signal; # Ctrl-\
+$SIG{TERM} = \&Cleanup_Signal; # TERM
+
+#
+# Run DTrace, process output
+#
+
+if ($COUNT) {
+ print STDERR "Tracing... Hit Ctrl-C to end.\n";
+ $header = 1;
+} else {
+ printf("%16s %16s %4s %s\n","EXEC","SYSCALL","ERR","DESC");
+}
+
+### Open DTrace
+open(DTRACE,"$dtrace |") || die "ERROR2: Can't start dtrace (perms?): $!\n";
+
+### Process DTrace output
+while (chomp($line = <DTRACE>)) {
+
+ ### Print count header
+ if ($COUNT && $header) {
+ printf("\n%16s %16s %4s %6s %s\n",
+ "EXEC","SYSCALL","ERR","COUNT","DESC");
+ $header = 0;
+ }
+
+ ### Split data
+ ($execname,$syscall,$errno,$counts) = split(' ',$line);
+ next if $errno eq "";
+
+ ### Fetch errno description
+ $desc = $Errno{$errno};
+
+ ### Print output line
+ if ($COUNT) {
+ printf("%16s %16s %4d %6d %s\n",
+ $execname,$syscall,$errno,$counts,$desc);
+ } else {
+ printf("%16s %16s %4d %s\n",$execname,$syscall,$errno,$desc);
+ }
+}
+close(DTRACE);
+
+#
+# Triggered by signals
+#
+sub Cleanup_Signal {
+}
+
+#
+# Usage message
+#
+sub Usage {
+ print STDERR "USAGE: errinfo [-ch] [-p PID] [-n name]\n";
+ print STDERR <<ENDUSAGE;
+ eg,
+ errinfo # default output - snoop event style
+ -c # counts - aggregate style
+ -p 871 # examine PID 871 only
+ -n ssh # examine processes with the name "ssh" only
+ -cn ssh # examine "ssh" using counts
+ENDUSAGE
+ exit(1);
+}
diff --git a/execsnoop b/execsnoop
new file mode 100755
index 000000000000..96e647c2482c
--- /dev/null
+++ b/execsnoop
@@ -0,0 +1,174 @@
+#!/usr/bin/sh
+#
+# execsnoop - snoop process execution as it occurs.
+# Written using DTrace (Solaris 10 3/05).
+#
+# $Id: execsnoop 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: execsnoop [-a|-A|-ehjsvZ] [-c command]
+#
+# execsnoop # default output
+#
+# -a # print all data
+# -A # dump all data, space delimited
+# -e # safe output - parseable
+# -j # print project ID
+# -s # print start time, us
+# -v # print start time, string
+# -Z # print zonename
+# -c command # command name to snoop
+# eg,
+# execsnoop -v # human readable timestamps
+# execsnoop -Z # print zonename
+# execsnoop -c ls # snoop ls commands only
+#
+# The parseable output ensures that the ARGS field doesn't contain
+# any "\n"s, which normally sometimes can - and would wreck postprocessing.
+#
+# FIELDS:
+# UID User ID
+# PID Process ID
+# PPID Parent Process ID
+# COMM command name for the process
+# ARGS argument listing for the process
+# ZONE zonename
+# PROJ project ID
+# TIME timestamp for the command, us
+# STRTIME timestamp for the command, string
+#
+# SEE ALSO: BSM auditing.
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 27-Mar-2004 Brendan Gregg Created this.
+# 21-Jan-2005 " " Wrapped in sh to provide options.
+# 08-May-2005 " " Rewritten for performance.
+# 14-May-2005 " " Added zonename.
+# 02-Jul-2005 " " Added projid, safe printing.
+# 11-Sep-2005 " " Increased switchrate.
+# 11-Sep-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_dump=0; opt_cmd=0; opt_time=0; opt_timestr=0; filter=0; command=.
+opt_zone=0; opt_safe=0; opt_proj=0
+
+### process options
+while getopts aAc:ehjsvZ name
+do
+ case $name in
+ a) opt_time=1; opt_timestr=1; opt_zone=1; opt_proj=1 ;;
+ A) opt_dump=1 ;;
+ c) opt_cmd=1; command=$OPTARG ;;
+ e) opt_safe=1 ;;
+ j) opt_proj=1 ;;
+ s) opt_time=1 ;;
+ v) opt_timestr=1 ;;
+ Z) opt_zone=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: execsnoop [-a|-A|-ehjsvZ] [-c command]
+ execsnoop # default output
+ -a # print all data
+ -A # dump all data, space delimited
+ -e # safe output, parseable
+ -j # print project ID
+ -s # print start time, us
+ -v # print start time, string
+ -Z # print zonename
+ -c command # command name to snoop
+ eg,
+ execsnoop -v # human readable timestamps
+ execsnoop -Z # print zonename
+ execsnoop -c ls # snoop ls commands only
+ END
+ exit 1
+ esac
+done
+
+### option logic
+if [ $opt_dump -eq 1 ]; then
+ opt_time=0; opt_timestr=0; opt_zone=0; opt_proj=0
+fi
+if [ $opt_cmd -eq 1 ]; then
+ filter=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_dump = '$opt_dump';
+ inline int OPT_cmd = '$opt_cmd';
+ inline int OPT_time = '$opt_time';
+ inline int OPT_timestr = '$opt_timestr';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_safe = '$opt_safe';
+ inline int OPT_proj = '$opt_proj';
+ inline int FILTER = '$filter';
+ inline string COMMAND = "'$command'";
+
+ #pragma D option quiet
+ #pragma D option switchrate=10hz
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ /* print optional headers */
+ OPT_time ? printf("%-14s ", "TIME") : 1;
+ OPT_timestr ? printf("%-20s ", "STRTIME") : 1;
+ OPT_zone ? printf("%-10s ", "ZONE") : 1;
+ OPT_proj ? printf("%5s ", "PROJ") : 1;
+
+ /* print main headers */
+ OPT_dump ? printf("%s %s %s %s %s %s %s %s\n",
+ "TIME", "ZONE", "PROJ", "UID", "PID", "PPID", "COMM", "ARGS") :
+ printf("%5s %6s %6s %s\n", "UID", "PID", "PPID", "ARGS");
+ }
+
+ /*
+ * Print exec event
+ */
+ syscall::exec:return, syscall::exece:return
+ /(FILTER == 0) || (OPT_cmd == 1 && COMMAND == execname)/
+ {
+ /* print optional fields */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%-10s ", zonename) : 1;
+ OPT_proj ? printf("%5d ", curpsinfo->pr_projid) : 1;
+
+ /* print main data */
+ OPT_dump ? printf("%d %s %d %d %d %d %s ", timestamp/1000,
+ zonename, curpsinfo->pr_projid, uid, pid, ppid, execname) :
+ printf("%5d %6d %6d ", uid, pid, ppid);
+ OPT_safe ? printf("%S\n", curpsinfo->pr_psargs) :
+ printf("%s\n", curpsinfo->pr_psargs);
+ }
+'
diff --git a/hotkernel b/hotkernel
new file mode 100755
index 000000000000..84d3362ff077
--- /dev/null
+++ b/hotkernel
@@ -0,0 +1,125 @@
+#!/usr/bin/perl -w
+#
+# hotkernel - sample on-CPU kernel-level functions and modules.
+# Written using Perl and DTrace (Solaris 10 03/05)
+#
+# This samples the on-CPU function at 1001 Hertz, for a simple yet
+# effective kernel-level profiling tool for sampling exclusive function time.
+# The output will identify which function is on the CPU the most - which is
+# the hottest. See Notes/ALLexclusive_notes.txt for an explanation of
+# exclusive time.
+#
+# $Id: hotkernel 65 2007-10-04 11:09:40Z brendan $
+#
+# USAGE: hotkernel [-hm]
+#
+# -h # help
+# -m # match modules, not functions
+# eg,
+# hotkernel # sample kernel functions
+# hotkernel -m # sample kernel modules
+#
+# FIELDS:
+# FUNCTION Function name
+# MODULE Module name
+# COUNT Number of samples
+# PCNT Percentage of total samples
+#
+# COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 29-Jun-2006 Brendan Gregg Created this.
+# 29-Jun-2006 " " Last update.
+#
+
+use strict;
+use Getopt::Std;
+
+#
+# Command Line Arguments
+#
+my $args;
+usage() if defined $ARGV[0] and $ARGV[0] eq "--help";
+getopts('hm') or usage();
+usage() if defined $main::opt_h and $main::opt_h;
+my $mods = defined $main::opt_m and $main::opt_m ? 1 : 0;
+
+#
+# Cleanup on signals
+#
+$SIG{INT} = \&cleanupsig; # Ctrl-C
+$SIG{QUIT} = \&cleanupsig; # Ctrl-\
+$SIG{TERM} = \&cleanupsig; # TERM
+
+#
+# Declare DTrace script
+#
+my $dtrace = <<END;
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+ profile:::profile-1001hz
+ /arg0/
+ {
+ \@pc[arg0] = count();
+ }
+ dtrace:::END
+ {
+ printa("%a %\@d\\n", \@pc);
+ }
+'
+END
+
+#
+# Run DTrace, process output
+#
+my %Count;
+my $total;
+open DTRACE, "$dtrace |" or die "ERROR1: Can't run dtrace (perms?): $!\n";
+print "Sampling... Hit Ctrl-C to end.\n";
+while (my $line = <DTRACE>) {
+ next if $line =~ /^\s*$/;
+ my ($addr, $count) = split ' ', $line;
+ my ($name, $offset) = split /\+/, $addr;
+ next if $name eq "0x0";
+ $name =~ s/\`.*// if $mods;
+ $Count{$name} += $count;
+ $total += $count;
+}
+close DTRACE;
+
+#
+# Print final report
+#
+printf "\n%-52s %8s %6s\n", $mods ? "MODULE" : "FUNCTION", "COUNT", "PCNT";
+foreach my $name (sort { $Count{$a} <=> $Count{$b} } keys %Count) {
+ printf "%-52s %8d %5.1f%%\n", $name, $Count{$name},
+ 100 * $Count{$name} / ($total ? $total : 1);
+}
+
+#
+# Subroutines
+#
+sub cleanupsig {
+}
+sub usage {
+ print STDERR "USAGE: hotkernel [-hm]\n";
+ print STDERR " eg,\n";
+ print STDERR " hotkernel # sample kernel functions\n";
+ print STDERR " hotkernel -m # sample kernel modules\n";
+ exit 1;
+}
diff --git a/hotuser b/hotuser
new file mode 100755
index 000000000000..2377487c7f7b
--- /dev/null
+++ b/hotuser
@@ -0,0 +1,139 @@
+#!/usr/bin/perl -w
+#
+# hotuser - sample on-CPU user-level functions and libraries.
+# Written using Perl and DTrace (Solaris 10 03/05)
+#
+# This samples the on-CPU function at 1001 Hertz, for a simple yet
+# effective user-level profiling tool for sampling exclusive function time.
+# The output will identify which function is on the CPU the most - which
+# is the hottest. See Notes/ALLexclusive_notes.txt for an explanation of
+# exclusive time.
+#
+# $Id: hotuser 65 2007-10-04 11:09:40Z brendan $
+#
+# USAGE: hotuser [-hl] { -c command | -p PID }
+#
+# -h # help
+# -l # match libraries, not functions
+# -p PID # examine this PID
+# -c command # run and examine this command
+# eg,
+# hotuser -p 81 # sample user functions from PID 81
+# hotuser -lp 81 # sample user libraries from PID 81
+# hotuser -p `pgrep -n Xorg` # sample Xorg
+#
+# FIELDS:
+# FUNCTION Function name
+# LIBRARY Library name
+# COUNT Number of samples
+# PCNT Percentage of total samples
+#
+# COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 29-Jun-2006 Brendan Gregg Created this.
+# 29-Jun-2006 " " Last update.
+#
+
+use strict;
+use Getopt::Std;
+
+#
+# Command Line Arguments
+#
+my $args;
+usage() if defined $ARGV[0] and $ARGV[0] eq "--help";
+getopts('c:hlp:') or usage();
+usage() if defined $main::opt_h and $main::opt_h;
+my $libs = defined $main::opt_l and $main::opt_l ? 1 : 0;
+if (defined $main::opt_c) {
+ $args = "-c $main::opt_c";
+}
+elsif (defined $main::opt_p) {
+ $args = "-p $main::opt_p";
+}
+else {
+ usage();
+}
+
+#
+# Cleanup on signals
+#
+$SIG{INT} = \&cleanupsig; # Ctrl-C
+$SIG{QUIT} = \&cleanupsig; # Ctrl-\
+$SIG{TERM} = \&cleanupsig; # TERM
+
+#
+# Declare DTrace script
+#
+my $dtrace = <<END;
+/usr/sbin/dtrace -n '
+ #pragma D option quiet
+ profile:::profile-1001hz
+ /pid == \$target/
+ {
+ \@pc[arg1] = count();
+ }
+ dtrace:::END
+ {
+ printa("OUT: %A %\@d\\n", \@pc);
+ }
+' '$args'
+END
+
+#
+# Run DTrace, process output
+#
+my %Count;
+my $total;
+open DTRACE, "$dtrace |" or die "ERROR1: Can't run dtrace (perms?): $!\n";
+print "Sampling... Hit Ctrl-C to end.\n";
+while (my $line = <DTRACE>) {
+ next if $line =~ /^\s*$/;
+ next if $line !~ /^OUT: /;
+ my ($tag, $addr, $count) = split ' ', $line;
+ my ($name, $offset) = split /\+/, $addr;
+ next if $name eq "0x0";
+ $name =~ s/\`.*// if $libs;
+ $Count{$name} += $count;
+ $total += $count;
+}
+close DTRACE;
+
+#
+# Print final report
+#
+printf "\n%-52s %8s %6s\n", $libs ? "LIBRARY" : "FUNCTION", "COUNT", "PCNT";
+foreach my $name (sort { $Count{$a} <=> $Count{$b} } keys %Count) {
+ printf "%-52s %8d %5.1f%%\n", $name, $Count{$name},
+ 100 * $Count{$name} / ($total ? $total : 1);
+}
+
+#
+# Subroutines
+#
+sub cleanupsig {
+}
+sub usage {
+ print STDERR "USAGE: hotuser [-hl] { -c command | -p PID }\n";
+ print STDERR " eg,\n";
+ print STDERR " hotuser -p 81 # sample user funcs for PID 81\n";
+ print STDERR " hotuser -lp 81 # sample user libs for PID 81\n";
+ print STDERR " hotuser -p `pgrep -n Xorg` # sample Xorg\n";
+ exit 1;
+}
diff --git a/install b/install
new file mode 100755
index 000000000000..1962c46290e3
--- /dev/null
+++ b/install
@@ -0,0 +1,151 @@
+#!/usr/bin/ksh
+#
+# install - installer for the DTraceToolkit
+#
+# This is a fairly simple script, most of it is error checking.
+# All the script does is copy the DTraceToolkit files to another directory,
+# with various checks. The user could have copied the files themselves, this
+# script doesn't do anything special to them. It's really here in case
+# people extrace the toolkit and go looking for an installer.
+#
+# 15-May-2005 Brendan Gregg Created this.
+
+DEBUG=0 # print debug data
+TEETH=1 # does this script have teeth
+SLEEP=1 # pause on messages
+PATH=/usr/bin
+
+### Ensure we know where we are,
+dir=${0%/*}
+cd $dir
+(( DEBUG )) && print "DEBUG: dir $dir"
+
+### Print welcome,
+print "DTraceToolkit Installation\n---------------------------"
+cat Version
+print "\nhit Ctrl-C any time you wish to quit.\n\n"
+
+### Fetch location,
+print -n "Enter target directory for installation [/opt/DTT]: "
+read loc junk
+if [[ "$loc" == "" ]]; then loc="/opt/DTT"; fi
+print ""
+(( DEBUG )) && print "DEBUG: loc $loc"
+
+### Sanity check,
+if print "$loc" | grep '^[./]*$' > /dev/null; then
+ print "ERROR1: Location \"$loc\" is ambiguous.\n."
+ (( SLEEP )) && sleep 1
+ print ".\tTry a full path, like \"/opt/DTT\"\n."
+ print ".\tSorry!\n"
+ exit 1
+fi
+
+### Evilness check,
+if print "$loc" | grep '[^a-zA-Z0-9_.-/]' > /dev/null; then
+ print "ERROR2: Sorry, location \"$loc\" contains bad characters.\n."
+ (( SLEEP )) && sleep 1
+ print ".\tTry a path like \"/opt/DTT\"\n."
+ print ".\tSorry!\n"
+ exit 2
+fi
+
+### Process location,
+basename=${loc%/*}
+nodename=${loc##*/}
+if [[ "$basename" == "" ]]; then basename="/"; fi
+(( DEBUG )) && print "DEBUG: basename $basename"
+(( DEBUG )) && print "DEBUG: nodename $nodename"
+
+### Check parent dir exists,
+if [[ ! -d "$basename" ]]; then
+ print "ERROR3: Parent directory \"$basename\" does not exist!\n."
+ (( SLEEP )) && sleep 1
+ print ".\tI'm not sure what you want me to do here, if you were"
+ print ".\tserious about the above parent directory - then run"
+ print ".\ta \"mkdir -p $basename\" first, then rerun this script.\n."
+ print ".\tSorry!\n"
+ exit 3
+fi
+
+### Check parent dir perms,
+if [[ ! -w "$basename" ]]; then
+ print "ERROR4: Can't write to parent directory \"$basename\"!\n."
+ (( SLEEP )) && sleep 1
+ print ".\tSince I can't write to this directory, I can't install the"
+ print ".\tDTraceToolkit. You are currently logged in as,\n."
+ id | sed 's/^/. /'
+ print ".\n.\tand the directory has permissions,\n."
+ ls -ld "$basename" | awk '{ print ".\t\t",$1,$2,$3,$4,"..." }'
+ owner=`ls -ld "$basename" | awk '{ print $3 }'`
+ print ".\n.\tMaybe you need to run \"su - $owner\" first?\n."
+ print ".\tSorry!\n"
+ exit 4
+fi
+
+### Check if toolkit is already installed,
+if [[ -d "$loc" ]]; then
+ print "Warning: Possible old version of the DTraceToolkit found."
+ print "\tThis will DELETE the files in $loc, then install the toolkit."
+ (( SLEEP )) && sleep 1
+ if [[ ! -f "$loc/Version" ]]; then
+ print "\nWARNING: $loc doesn't look like an old DTraceToolkit!"
+ (( SLEEP )) && sleep 1
+ fi
+ print -n "\nContinue (will run \"rm -rf $loc\"). Are you sure (y/N)?: "
+ read ans junk
+ if [[ "$ans" != "y" ]]; then
+ print "\nExiting..."
+ exit 5
+ fi
+ if (( TEETH )); then
+ rm -rf "$loc"
+ else
+ print COMMAND: rm -rf \"$loc\"
+ fi
+fi
+
+### Make new toolkit dir,
+print "\nMaking directory \"$loc\"...\n"
+if (( TEETH )); then
+ mkdir -p "$loc"
+else
+ print COMMAND: mkdir -p \"$loc\"
+fi
+if [[ ! -d "$loc" || ! -w "$loc" ]]; then
+ print "ERROR6: Creation of \"$loc\" failed.\n."
+ (( SLEEP )) && sleep 1
+ print ".\tCheck directory location and try again.\n."
+ print ".\tSorry!\n"
+ exit 6
+fi
+
+### Copy files across,
+print "\nCopying DTraceToolkit files...\n"
+if (( TEETH )); then
+ tar cf - . | (cd "$loc"; tar xvf -)
+else
+ print COMMAND: "tar cf - . | (cd \"$loc\"; tar xvf -)"
+fi
+error=$?
+if [[ ! -f "$loc/install" ]]; then error=1; fi
+if (( error )); then
+ print "ERROR7: Failure during copy.\n."
+ (( SLEEP )) && sleep 1
+ print ".\tCheck source \"$dir\" and destination \"$loc\", then"
+ print ".\ttry again.\n."
+ print ".\tSorry!\n"
+ exit 7
+fi
+
+### Delete installer,
+if (( TEETH )); then
+ rm "$loc/install"
+else
+ print COMMAND: rm \"$loc/install\"
+fi
+
+### Finished,
+print "\nFinished.\n"
+print "Installed to \"$loc\". See $loc/Guide for how to get started.\n"
+
diff --git a/iopattern b/iopattern
new file mode 100755
index 000000000000..e825f9f77fba
--- /dev/null
+++ b/iopattern
@@ -0,0 +1,277 @@
+#!/usr/bin/ksh
+#
+# iopattern - print disk I/O pattern.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This prints details on the I/O access pattern for the disks, such as
+# percentage of events that were of a random or sequential nature.
+# By default totals for all disks are printed.
+#
+# $Id: iopattern 65 2007-10-04 11:09:40Z brendan $
+#
+# USAGE: iopattern [-v] [-d device] [-f filename] [-m mount_point]
+# [interval [count]]
+#
+# -v # print timestamp, string
+# -d device # instance name to snoop (eg, dad0)
+# -f filename # full pathname of file to snoop
+# -m mount_point # this FS only (will skip raw events)
+# eg,
+# iopattern # default output, 1 second intervals
+# iopattern 10 # 10 second samples
+# iopattern 5 12 # print 12 x 5 second samples
+# iopattern -m / # snoop events on filesystem / only
+#
+# FIELDS:
+# %RAN percentage of events of a random nature
+# %SEQ percentage of events of a sequential nature
+# COUNT number of I/O events
+# MIN minimum I/O event size
+# MAX maximum I/O event size
+# AVG average I/O event size
+# KR total kilobytes read during sample
+# KW total kilobytes written during sample
+# DEVICE device name
+# MOUNT mount point
+# FILE filename
+# TIME timestamp, string
+#
+# NOTES:
+#
+# An event is considered random when the heads seek. This program prints
+# the percentage of events that are random. The size of the seek is not
+# measured - it's either random or not.
+#
+# SEE ALSO: iosnoop, iotop
+#
+# IDEA: Ryan Matteson
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 25-Jul-2005 Brendan Gregg Created this.
+# 25-Jul-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_device=0; opt_file=0; opt_mount=0; opt_time=0
+filter=0; device=.; filename=.; mount=.; interval=1; count=-1
+
+### process options
+while getopts d:f:hm:v name
+do
+ case $name in
+ d) opt_device=1; device=$OPTARG ;;
+ f) opt_file=1; filename=$OPTARG ;;
+ m) opt_mount=1; mount=$OPTARG ;;
+ v) opt_time=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: iopattern [-v] [-d device] [-f filename] [-m mount_point]
+ [interval [count]]
+
+ -v # print timestamp
+ -d device # instance name to snoop
+ -f filename # snoop this file only
+ -m mount_point # this FS only
+ eg,
+ iopattern # default output, 1 second samples
+ iopattern 10 # 10 second samples
+ iopattern 5 12 # print 12 x 5 second samples
+ iopattern -m / # snoop events on filesystem / only
+ END
+ exit 1
+ esac
+done
+
+shift $(( $OPTIND - 1 ))
+
+### option logic
+if [[ "$1" > 0 ]]; then
+ interval=$1; shift
+fi
+if [[ "$1" > 0 ]]; then
+ count=$1; shift
+fi
+if (( opt_device || opt_mount || opt_file )); then
+ filter=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_time = '$opt_time';
+ inline int OPT_device = '$opt_device';
+ inline int OPT_mount = '$opt_mount';
+ inline int OPT_file = '$opt_file';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+ inline int FILTER = '$filter';
+ inline string DEVICE = "'$device'";
+ inline string FILENAME = "'$filename'";
+ inline string MOUNT = "'$mount'";
+
+ #pragma D option quiet
+
+ int last_loc[string];
+
+ /*
+ * Program start
+ */
+ dtrace:::BEGIN
+ {
+ /* starting values */
+ diskcnt = 0;
+ diskmin = 0;
+ diskmax = 0;
+ diskran = 0;
+ diskr = 0;
+ diskw = 0;
+ counts = COUNTER;
+ secs = INTERVAL;
+ LINES = 20;
+ line = 0;
+ last_event[""] = 0;
+ }
+
+ /*
+ * Print header
+ */
+ profile:::tick-1sec
+ /line <= 0 /
+ {
+ /* print optional headers */
+ OPT_time ? printf("%-20s ", "TIME") : 1;
+ OPT_device ? printf("%-9s ", "DEVICE") : 1;
+ OPT_mount ? printf("%-12s ", "MOUNT") : 1;
+ OPT_file ? printf("%-12s ", "FILE") : 1;
+
+ /* print header */
+ printf("%4s %4s %6s %6s %6s %6s %6s %6s\n",
+ "%RAN", "%SEQ", "COUNT", "MIN", "MAX", "AVG", "KR", "KW");
+
+ line = LINES;
+ }
+
+ /*
+ * Check event is being traced
+ */
+ io:genunix::done
+ {
+ /* default is to trace unless filtering */
+ self->ok = FILTER ? 0 : 1;
+
+ /* check each filter */
+ (OPT_device == 1 && DEVICE == args[1]->dev_statname)? self->ok = 1 : 1;
+ (OPT_file == 1 && FILENAME == args[2]->fi_pathname) ? self->ok = 1 : 1;
+ (OPT_mount == 1 && MOUNT == args[2]->fi_mount) ? self->ok = 1 : 1;
+ }
+
+ /*
+ * Process and Print completion
+ */
+ io:genunix::done
+ /self->ok/
+ {
+ /*
+ * Save details
+ */
+ this->loc = args[0]->b_blkno * 512;
+ this->pre = last_loc[args[1]->dev_statname];
+ diskr += args[0]->b_flags & B_READ ? args[0]->b_bcount : 0;
+ diskw += args[0]->b_flags & B_READ ? 0 : args[0]->b_bcount;
+ diskran += this->pre == this->loc ? 0 : 1;
+ diskcnt++;
+ diskmin = diskmin == 0 ? args[0]->b_bcount :
+ (diskmin > args[0]->b_bcount ? args[0]->b_bcount : diskmin);
+ diskmax = diskmax < args[0]->b_bcount ? args[0]->b_bcount : diskmax;
+
+ /* save disk location */
+ last_loc[args[1]->dev_statname] = this->loc + args[0]->b_bcount;
+
+ /* cleanup */
+ self->ok = 0;
+ }
+
+ /*
+ * Timer
+ */
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+ /*
+ * Print Output
+ */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ /* calculate diskavg */
+ diskavg = diskcnt > 0 ? (diskr + diskw) / diskcnt : 0;
+
+ /* convert counters to Kbytes */
+ diskr /= 1024;
+ diskw /= 1024;
+
+ /* convert to percentages */
+ diskran = diskcnt == 0 ? 0 : (diskran * 100) / diskcnt;
+ diskseq = diskcnt == 0 ? 0 : 100 - diskran;
+
+ /* print optional fields */
+ OPT_time ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_device ? printf("%-9s ", DEVICE) : 1;
+ OPT_mount ? printf("%-12s ", MOUNT) : 1;
+ OPT_file ? printf("%-12s ", FILENAME) : 1;
+
+ /* print data */
+ printf("%4d %4d %6d %6d %6d %6d %6d %6d\n",
+ diskran, diskseq, diskcnt, diskmin, diskmax, diskavg,
+ diskr, diskw);
+
+ /* clear data */
+ diskmin = 0;
+ diskmax = 0;
+ diskcnt = 0;
+ diskran = 0;
+ diskr = 0;
+ diskw = 0;
+
+ secs = INTERVAL;
+ counts--;
+ line--;
+ }
+
+ /*
+ * End of program
+ */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+'
diff --git a/iosnoop b/iosnoop
new file mode 100755
index 000000000000..00931d275e09
--- /dev/null
+++ b/iosnoop
@@ -0,0 +1,367 @@
+#!/usr/bin/sh
+#
+# iosnoop - A program to print disk I/O events as they happen, with useful
+# details such as UID, PID, filename, command, etc.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This is measuring disk events that have made it past system caches.
+#
+# $Id: iosnoop 8 2007-08-06 05:55:26Z brendan $
+#
+# USAGE: iosnoop [-a|-A|-DeghiNostv] [-d device] [-f filename]
+# [-m mount_point] [-n name] [-p PID]
+#
+# iosnoop # default output
+#
+# -a # print all data (mostly)
+# -A # dump all data, space delimited
+# -D # print time delta, us (elapsed)
+# -e # print device name
+# -g # print command arguments
+# -i # print device instance
+# -N # print major and minor numbers
+# -o # print disk delta time, us
+# -s # print start time, us
+# -t # print completion time, us
+# -v # print completion time, string
+# -d device # instance name to snoop (eg, dad0)
+# -f filename # full pathname of file to snoop
+# -m mount_point # this FS only (will skip raw events)
+# -n name # this process name only
+# -p PID # this PID only
+# eg,
+# iosnoop -v # human readable timestamps
+# iosnoop -N # print major and minor numbers
+# iosnoop -m / # snoop events on the root filesystem only
+#
+# FIELDS:
+# UID user ID
+# PID process ID
+# PPID parennt process ID
+# COMM command name for the process
+# ARGS argument listing for the process
+# SIZE size of operation, bytes
+# BLOCK disk block for the operation (location)
+# STIME timestamp for the disk request, us
+# TIME timestamp for the disk completion, us
+# DELTA elapsed time from request to completion, us
+# DTIME time for disk to complete request, us
+# STRTIME timestamp for the disk completion, string
+# DEVICE device name
+# INS device instance number
+# D direction, Read or Write
+# MOUNT mount point
+# FILE filename (basename) for io operation
+#
+# NOTE:
+# - There are two different delta times reported. -D prints the
+# elapsed time from the disk request (strategy) to the disk completion
+# (iodone); -o prints the time for the disk to complete that event
+# since it's last event (time between iodones), or, the time to the
+# strategy if the disk had been idle.
+# - When filtering on PID or process name, be aware that poor disk event
+# times may be due to events that have been filtered away, for example
+# another process that may be seeking the disk heads elsewhere.
+#
+# SEE ALSO: BigAdmin: DTrace, http://www.sun.com/bigadmin/content/dtrace
+# Solaris Dynamic Tracing Guide, http://docs.sun.com
+# DTrace Tools, http://www.brendangregg.com/dtrace.html
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 12-Mar-2004 Brendan Gregg Created this, build 51.
+# 23-May-2004 " " Fixed mntpt bug.
+# 10-Oct-2004 " " Rewritten to use the io provider, build 63.
+# 04-Jan-2005 " " Wrapped in sh to provide options.
+# 08-May-2005 " " Rewritten for perfromance.
+# 15-Jul-2005 " " Improved DTIME calculation.
+# 25-Jul-2005 " " Added -p, -n. Improved code.
+# 17-Sep-2005 " " Increased switchrate.
+# 17-Sep-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_dump=0; opt_device=0; opt_delta=0; opt_devname=0; opt_file=0; opt_args=0;
+opt_mount=0; opt_start=0 opt_end=0; opt_endstr=0; opt_ins=0; opt_nums=0
+opt_dtime=0; filter=0; device=.; filename=.; mount=.; pname=.; pid=0
+opt_name=0; opt_pid=0
+
+### process options
+while getopts aAd:Def:ghim:Nn:op:stv name
+do
+ case $name in
+ a) opt_devname=1; opt_args=1; opt_endstr=1; opt_nums=1 ;;
+ A) opt_dump=1 ;;
+ d) opt_device=1; device=$OPTARG ;;
+ D) opt_delta=1 ;;
+ e) opt_devname=1 ;;
+ f) opt_file=1; filename=$OPTARG ;;
+ g) opt_args=1 ;;
+ i) opt_ins=1 ;;
+ N) opt_nums=1 ;;
+ n) opt_name=1; pname=$OPTARG ;;
+ o) opt_dtime=1 ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ m) opt_mount=1; mount=$OPTARG ;;
+ s) opt_start=1 ;;
+ t) opt_end=1 ;;
+ v) opt_endstr=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: iosnoop [-a|-A|-DeghiNostv] [-d device] [-f filename]
+ [-m mount_point] [-n name] [-p PID]
+ iosnoop # default output
+ -a # print all data (mostly)
+ -A # dump all data, space delimited
+ -D # print time delta, us (elapsed)
+ -e # print device name
+ -g # print command arguments
+ -i # print device instance
+ -N # print major and minor numbers
+ -o # print disk delta time, us
+ -s # print start time, us
+ -t # print completion time, us
+ -v # print completion time, string
+ -d device # instance name to snoop
+ -f filename # snoop this file only
+ -m mount_point # this FS only
+ -n name # this process name only
+ -p PID # this PID only
+ eg,
+ iosnoop -v # human readable timestamps
+ iosnoop -N # print major and minor numbers
+ iosnoop -m / # snoop events on filesystem / only
+ END
+ exit 1
+ esac
+done
+
+### option logic
+if [ $opt_dump -eq 1 ]; then
+ opt_delta=0; opt_devname=0; opt_args=2; opt_start=0;
+ opt_end=0; opt_endstr=0; opt_nums=0; opt_ins=0; opt_dtime=0
+fi
+if [ $opt_device -eq 1 -o $opt_file -eq 1 -o $opt_mount -eq 1 -o \
+ $opt_name -eq 1 -o $opt_pid -eq 1 ]; then
+ filter=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_dump = '$opt_dump';
+ inline int OPT_device = '$opt_device';
+ inline int OPT_delta = '$opt_delta';
+ inline int OPT_devname = '$opt_devname';
+ inline int OPT_file = '$opt_file';
+ inline int OPT_args = '$opt_args';
+ inline int OPT_ins = '$opt_ins';
+ inline int OPT_nums = '$opt_nums';
+ inline int OPT_dtime = '$opt_dtime';
+ inline int OPT_mount = '$opt_mount';
+ inline int OPT_start = '$opt_start';
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_name = '$opt_name';
+ inline int OPT_end = '$opt_end';
+ inline int OPT_endstr = '$opt_endstr';
+ inline int FILTER = '$filter';
+ inline int PID = '$pid';
+ inline string DEVICE = "'$device'";
+ inline string FILENAME = "'$filename'";
+ inline string MOUNT = "'$mount'";
+ inline string NAME = "'$pname'";
+
+ #pragma D option quiet
+ #pragma D option switchrate=10hz
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ last_event[""] = 0;
+
+ /* print optional headers */
+ OPT_start ? printf("%-14s ","STIME") : 1;
+ OPT_end ? printf("%-14s ","TIME") : 1;
+ OPT_endstr ? printf("%-20s ","STRTIME") : 1;
+ OPT_devname ? printf("%-7s ","DEVICE") : 1;
+ OPT_ins ? printf("%-3s ","INS") : 1;
+ OPT_nums ? printf("%-3s %-3s ","MAJ","MIN") : 1;
+ OPT_delta ? printf("%-10s ","DELTA") : 1;
+ OPT_dtime ? printf("%-10s ","DTIME") : 1;
+
+ /* print main headers */
+ OPT_dump ?
+ printf("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n",
+ "TIME", "STIME", "DELTA", "DEVICE", "INS", "MAJ", "MIN", "UID",
+ "PID", "PPID", "D", "BLOCK", "SIZE", "MOUNT", "FILE", "PATH",
+ "COMM","ARGS") :
+ printf("%5s %5s %1s %8s %6s ", "UID", "PID", "D", "BLOCK", "SIZE");
+ OPT_args == 0 ? printf("%10s %s\n", "COMM", "PATHNAME") : 1;
+ OPT_args == 1 ? printf("%28s %s\n", "PATHNAME", "ARGS") : 1;
+ }
+
+ /*
+ * Check event is being traced
+ */
+ io:genunix::start
+ {
+ /* default is to trace unless filtering, */
+ self->ok = FILTER ? 0 : 1;
+
+ /* check each filter, */
+ (OPT_device == 1 && DEVICE == args[1]->dev_statname)? self->ok = 1 : 1;
+ (OPT_file == 1 && FILENAME == args[2]->fi_pathname) ? self->ok = 1 : 1;
+ (OPT_mount == 1 && MOUNT == args[2]->fi_mount) ? self->ok = 1 : 1;
+ (OPT_name == 1 && NAME == execname) ? self->ok = 1 : 1;
+ (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1;
+ }
+
+ /*
+ * Reset last_event for disk idle -> start
+ * this prevents idle time being counted as disk time.
+ */
+ io:genunix::start
+ /! pending[args[1]->dev_statname]/
+ {
+ /* save last disk event */
+ last_event[args[1]->dev_statname] = timestamp;
+ }
+
+ /*
+ * Store entry details
+ */
+ io:genunix::start
+ /self->ok/
+ {
+ /* these are used as a unique disk event key, */
+ this->dev = args[0]->b_edev;
+ this->blk = args[0]->b_blkno;
+
+ /* save disk event details, */
+ start_uid[this->dev, this->blk] = uid;
+ start_pid[this->dev, this->blk] = pid;
+ start_ppid[this->dev, this->blk] = ppid;
+ start_args[this->dev, this->blk] = (char *)curpsinfo->pr_psargs;
+ start_comm[this->dev, this->blk] = execname;
+ start_time[this->dev, this->blk] = timestamp;
+
+ /* increase disk event pending count */
+ pending[args[1]->dev_statname]++;
+
+ self->ok = 0;
+ }
+
+ /*
+ * Process and Print completion
+ */
+ io:genunix::done
+ /start_time[args[0]->b_edev, args[0]->b_blkno]/
+ {
+ /* decrease disk event pending count */
+ pending[args[1]->dev_statname]--;
+
+ /*
+ * Process details
+ */
+
+ /* fetch entry values */
+ this->dev = args[0]->b_edev;
+ this->blk = args[0]->b_blkno;
+ this->suid = start_uid[this->dev, this->blk];
+ this->spid = start_pid[this->dev, this->blk];
+ this->sppid = start_ppid[this->dev, this->blk];
+ self->sargs = (int)start_args[this->dev, this->blk] == 0 ?
+ "" : start_args[this->dev, this->blk];
+ self->scomm = start_comm[this->dev, this->blk];
+ this->stime = start_time[this->dev, this->blk];
+ this->etime = timestamp; /* endtime */
+ this->delta = this->etime - this->stime;
+ this->dtime = last_event[args[1]->dev_statname] == 0 ? 0 :
+ timestamp - last_event[args[1]->dev_statname];
+
+ /* memory cleanup */
+ start_uid[this->dev, this->blk] = 0;
+ start_pid[this->dev, this->blk] = 0;
+ start_ppid[this->dev, this->blk] = 0;
+ start_args[this->dev, this->blk] = 0;
+ start_time[this->dev, this->blk] = 0;
+ start_comm[this->dev, this->blk] = 0;
+ start_rw[this->dev, this->blk] = 0;
+
+ /*
+ * Print details
+ */
+
+ /* print optional fields */
+ OPT_start ? printf("%-14d ", this->stime/1000) : 1;
+ OPT_end ? printf("%-14d ", this->etime/1000) : 1;
+ OPT_endstr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_devname ? printf("%-7s ", args[1]->dev_statname) : 1;
+ OPT_ins ? printf("%3d ", args[1]->dev_instance) : 1;
+ OPT_nums ? printf("%3d %3d ",
+ args[1]->dev_major, args[1]->dev_minor) : 1;
+ OPT_delta ? printf("%-10d ", this->delta/1000) : 1;
+ OPT_dtime ? printf("%-10d ", this->dtime/1000) : 1;
+
+ /* print main fields */
+ OPT_dump ?
+ printf("%d %d %d %s %d %d %d %d %d %d %s %d %d %s %s %s %s %S\n",
+ this->etime/1000, this->stime/1000, this->delta/1000,
+ args[1]->dev_statname, args[1]->dev_instance, args[1]->dev_major,
+ args[1]->dev_minor, this->suid, this->spid, this->sppid,
+ args[0]->b_flags & B_READ ? "R" : "W",
+ args[0]->b_blkno, args[0]->b_bcount, args[2]->fi_mount,
+ args[2]->fi_name, args[2]->fi_pathname, self->scomm, self->sargs) :
+ printf("%5d %5d %1s %8d %6d ",
+ this->suid, this->spid, args[0]->b_flags & B_READ ? "R" : "W",
+ args[0]->b_blkno, args[0]->b_bcount);
+ OPT_args == 0 ? printf("%10s %s\n", self->scomm, args[2]->fi_pathname)
+ : 1;
+ OPT_args == 1 ? printf("%28s %S\n",
+ args[2]->fi_pathname, self->sargs) : 1;
+
+ /* save last disk event */
+ last_event[args[1]->dev_statname] = timestamp;
+
+ /* cleanup */
+ self->scomm = 0;
+ self->sargs = 0;
+ }
+
+ /*
+ * Prevent pending from underflowing
+ * this can happen if this program is started during disk events.
+ */
+ io:genunix::done
+ /pending[args[1]->dev_statname] < 0/
+ {
+ pending[args[1]->dev_statname] = 0;
+ }
+'
diff --git a/iotop b/iotop
new file mode 100755
index 000000000000..788c49285129
--- /dev/null
+++ b/iotop
@@ -0,0 +1,422 @@
+#!/usr/bin/ksh
+#
+# iotop - display top disk I/O events by process.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This is measuring disk events that have made it past system caches.
+#
+# $Id: iotop 8 2007-08-06 05:55:26Z brendan $
+#
+# USAGE: iotop [-C] [-D|-o|-P] [-j|-Z] [-d device] [-f filename]
+# [-m mount_point] [-t top] [interval [count]]
+#
+# iotop # default output, 5 second intervals
+#
+# -C # don't clear the screen
+# -D # print delta times, elapsed, us
+# -j # print project ID
+# -o # print disk delta times, us
+# -P # print %I/O (disk delta times)
+# -Z # print zone ID
+# -d device # instance name to snoop (eg, dad0)
+# -f filename # full pathname of file to snoop
+# -m mount_point # this FS only (will skip raw events)
+# -t top # print top number only
+# eg,
+# iotop 1 # 1 second samples
+# iotop -C # don't clear the screen
+# iotop -P # print %I/O (time based)
+# iotop -j # print project IDs
+# iotop -Z # print zone IDs
+# iotop -t 20 # print top 20 lines only
+# iotop -C 5 12 # print 12 x 5 second samples
+#
+# FIELDS:
+# UID user ID
+# PID process ID
+# PPID parent process ID
+# PROJ project ID
+# ZONE zone ID
+# CMD process command name
+# DEVICE device name
+# MAJ device major number
+# MIN device minor number
+# D direction, Read or Write
+# BYTES total size of operations, bytes
+# ELAPSED total elapsed from request to completion, us
+# DISKTIME total time for disk to complete request, us
+# %I/O percent disk I/O, based on time (DISKTIME)
+# load 1 min load average
+# disk_r total disk read Kbytes for sample
+# disk_w total disk write Kbytes for sample
+#
+# NOTE:
+# * There are two different delta times reported. -D prints the
+# elapsed time from the disk request (strategy) to the disk completion
+# (iodone); -o prints the time for the disk to complete that event
+# since it's last event (time between iodones), or, the time to the
+# strategy if the disk had been idle.
+# * The %I/O value can exceed 100%. It represents how busy a process is
+# making the disks, in terms of a single disk. A value of 200% could
+# mean 2 disks are busy at 100%, or 4 disks at 50%...
+#
+# SEE ALSO: iosnoop
+# BigAdmin: DTrace, http://www.sun.com/bigadmin/content/dtrace
+# Solaris Dynamic Tracing Guide, http://docs.sun.com
+# DTrace Tools, http://www.brendangregg.com/dtrace.html
+#
+# INSPIRATION: top(1) by William LeFebvre
+#
+# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# KNOWN BUGS:
+# - This can print errors while running on servers with Veritas volumes.
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 15-Jul-2005 Brendan Gregg Created this.
+# 20-Apr-2006 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_device=0; opt_file=0; opt_mount=0; opt_clear=1; opt_proj=0; opt_zone=0
+opt_percent=0; opt_def=1; opt_bytes=1; filter=0; device=.; filename=.; mount=.
+opt_top=0; opt_elapsed=0; opt_dtime=0; interval=5; count=-1; top=0
+
+### process options
+while getopts CDd:f:hjm:oPt:Z name
+do
+ case $name in
+ C) opt_clear=0 ;;
+ D) opt_elapsed=1; opt_bytes=0 ;;
+ d) opt_device=1; device=$OPTARG ;;
+ f) opt_file=1; filename=$OPTARG ;;
+ j) opt_proj=1; opt_def=0 ;;
+ m) opt_mount=1; mount=$OPTARG ;;
+ o) opt_dtime=1; opt_bytes=0 ;;
+ P) opt_percent=1; opt_dtime=1; opt_bytes=0 ;;
+ t) opt_top=1; top=$OPTARG ;;
+ Z) opt_zone=1; opt_def=0 ;;
+ h|?) cat <<-END >&2
+ USAGE: iotop [-C] [-D|-o|-P] [-j|-Z] [-d device] [-f filename]
+ [-m mount_point] [-t top] [interval [count]]
+
+ -C # don't clear the screen
+ -D # print delta times, elapsed, us
+ -j # print project ID
+ -o # print disk delta times, us
+ -P # print %I/O (disk delta times)
+ -Z # print zone ID
+ -d device # instance name to snoop
+ -f filename # snoop this file only
+ -m mount_point # this FS only
+ -t top # print top number only
+ eg,
+ iotop # default output, 5 second samples
+ iotop 1 # 1 second samples
+ iotop -P # print %I/O (time based)
+ iotop -m / # snoop events on filesystem / only
+ iotop -t 20 # print top 20 lines only
+ iotop -C 5 12 # print 12 x 5 second samples
+ END
+ exit 1
+ esac
+done
+
+shift $(( $OPTIND - 1 ))
+
+### option logic
+if [[ "$1" > 0 ]]; then
+ interval=$1; shift
+fi
+if [[ "$1" > 0 ]]; then
+ count=$1; shift
+fi
+if (( opt_proj && opt_zone )); then
+ opt_proj=0
+fi
+if (( opt_elapsed && opt_dtime )); then
+ opt_elapsed=0
+fi
+if (( opt_device || opt_mount || opt_file )); then
+ filter=1
+fi
+if (( opt_clear )); then
+ clearstr=`clear`
+else
+ clearstr=.
+fi
+
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_def = '$opt_def';
+ inline int OPT_proj = '$opt_proj';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_clear = '$opt_clear';
+ inline int OPT_bytes = '$opt_bytes';
+ inline int OPT_elapsed = '$opt_elapsed';
+ inline int OPT_dtime = '$opt_dtime';
+ inline int OPT_percent = '$opt_percent';
+ inline int OPT_device = '$opt_device';
+ inline int OPT_mount = '$opt_mount';
+ inline int OPT_file = '$opt_file';
+ inline int OPT_top = '$opt_top';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+ inline int FILTER = '$filter';
+ inline int TOP = '$top';
+ inline string DEVICE = "'$device'";
+ inline string FILENAME = "'$filename'";
+ inline string MOUNT = "'$mount'";
+ inline string CLEAR = "'$clearstr'";
+
+ #pragma D option quiet
+
+ /* boost the following if you get "dynamic variable drops" */
+ #pragma D option dynvarsize=8m
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ last_event[""] = 0;
+
+ /* starting values */
+ counts = COUNTER;
+ secs = INTERVAL;
+ disk_r = 0;
+ disk_w = 0;
+
+ printf("Tracing... Please wait.\n");
+ }
+
+ /*
+ * Check event is being traced
+ */
+ io:genunix::start,
+ io:genunix::done
+ {
+ /* default is to trace unless filtering, */
+ this->ok = FILTER ? 0 : 1;
+
+ /* check each filter, */
+ (OPT_device == 1 && DEVICE == args[1]->dev_statname)? this->ok = 1 : 1;
+ (OPT_file == 1 && FILENAME == args[2]->fi_pathname) ? this->ok = 1 : 1;
+ (OPT_mount == 1 && MOUNT == args[2]->fi_mount) ? this->ok = 1 : 1;
+ }
+
+ /*
+ * Reset last_event for disk idle -> start
+ * this prevents idle time being counted as disk time.
+ */
+ io:genunix::start
+ /! pending[args[1]->dev_statname]/
+ {
+ /* save last disk event */
+ last_event[args[1]->dev_statname] = timestamp;
+ }
+
+ /*
+ * Store entry details
+ */
+ io:genunix::start
+ /this->ok/
+ {
+ /* these are used as a unique disk event key, */
+ this->dev = args[0]->b_edev;
+ this->blk = args[0]->b_blkno;
+
+ /* save disk event details, */
+ start_uid[this->dev, this->blk] = uid;
+ start_pid[this->dev, this->blk] = pid;
+ start_ppid[this->dev, this->blk] = ppid;
+ start_comm[this->dev, this->blk] = execname;
+ start_time[this->dev, this->blk] = timestamp;
+ start_proj[this->dev, this->blk] = curpsinfo->pr_projid;
+ start_zone[this->dev, this->blk] = curpsinfo->pr_zoneid;
+ start_rw[this->dev, this->blk] = args[0]->b_flags & B_READ ? "R" : "W";
+ disk_r += args[0]->b_flags & B_READ ? args[0]->b_bcount : 0;
+ disk_w += args[0]->b_flags & B_READ ? 0 : args[0]->b_bcount;
+
+ /* increase disk event pending count */
+ pending[args[1]->dev_statname]++;
+ }
+
+ /*
+ * Process and Print completion
+ */
+ io:genunix::done
+ /this->ok/
+ {
+ /* decrease disk event pending count */
+ pending[args[1]->dev_statname]--;
+
+ /*
+ * Process details
+ */
+
+ /* fetch entry values */
+ this->dev = args[0]->b_edev;
+ this->blk = args[0]->b_blkno;
+ this->suid = start_uid[this->dev, this->blk];
+ this->spid = start_pid[this->dev, this->blk];
+ this->sppid = start_ppid[this->dev, this->blk];
+ this->sproj = start_proj[this->dev, this->blk];
+ this->szone = start_zone[this->dev, this->blk];
+ self->scomm = start_comm[this->dev, this->blk];
+ this->stime = start_time[this->dev, this->blk];
+ this->etime = timestamp; /* endtime */
+ this->elapsed = this->etime - this->stime;
+ self->rw = start_rw[this->dev, this->blk];
+ this->dtime = last_event[args[1]->dev_statname] == 0 ? 0 :
+ timestamp - last_event[args[1]->dev_statname];
+
+ /* memory cleanup */
+ start_uid[this->dev, this->blk] = 0;
+ start_pid[this->dev, this->blk] = 0;
+ start_ppid[this->dev, this->blk] = 0;
+ start_time[this->dev, this->blk] = 0;
+ start_comm[this->dev, this->blk] = 0;
+ start_zone[this->dev, this->blk] = 0;
+ start_proj[this->dev, this->blk] = 0;
+ start_rw[this->dev, this->blk] = 0;
+
+ /*
+ * Choose statistic to track
+ */
+ OPT_bytes ? this->value = args[0]->b_bcount : 1;
+ OPT_elapsed ? this->value = this->elapsed / 1000 : 1;
+ OPT_dtime ? this->value = this->dtime / 1000 : 1;
+
+ /*
+ * Save details
+ */
+ OPT_def ? @out[this->suid, this->spid, this->sppid, self->scomm,
+ args[1]->dev_statname, args[1]->dev_major, args[1]->dev_minor,
+ self->rw] = sum(this->value) : 1;
+ OPT_proj ? @out[this->sproj, this->spid, this->sppid, self->scomm,
+ args[1]->dev_statname, args[1]->dev_major, args[1]->dev_minor,
+ self->rw] = sum(this->value) : 1;
+ OPT_zone ? @out[this->szone, this->spid, this->sppid, self->scomm,
+ args[1]->dev_statname, args[1]->dev_major, args[1]->dev_minor,
+ self->rw] = sum(this->value) : 1;
+
+ /* save last disk event */
+ last_event[args[1]->dev_statname] = timestamp;
+
+ self->scomm = 0;
+ self->rw = 0;
+ }
+
+ /*
+ * Prevent pending from underflowing
+ * this can happen if this program is started during disk events.
+ */
+ io:genunix::done
+ /pending[args[1]->dev_statname] < 0/
+ {
+ pending[args[1]->dev_statname] = 0;
+ }
+
+ /*
+ * Timer
+ */
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+ /*
+ * Print Report
+ */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ /* fetch 1 min load average */
+ this->load1a = `hp_avenrun[0] / 65536;
+ this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536;
+
+ /* convert counters to Kbytes */
+ disk_r /= 1024;
+ disk_w /= 1024;
+
+ /* print status */
+ OPT_clear ? printf("%s", CLEAR) : 1;
+ printf("%Y, load: %d.%02d, disk_r: %6d KB, disk_w: %6d KB\n\n",
+ walltimestamp, this->load1a, this->load1b, disk_r, disk_w);
+
+ /* print headers */
+ OPT_def ? printf(" UID ") : 1;
+ OPT_proj ? printf(" PROJ ") : 1;
+ OPT_zone ? printf(" ZONE ") : 1;
+ printf("%6s %6s %-16s %-7s %3s %3s %1s",
+ "PID", "PPID", "CMD", "DEVICE", "MAJ", "MIN", "D");
+ OPT_bytes ? printf(" %16s\n", "BYTES") : 1;
+ OPT_elapsed ? printf(" %16s\n", "ELAPSED") : 1;
+ OPT_dtime && ! OPT_percent ? printf(" %16s\n", "DISKTIME") : 1;
+ OPT_dtime && OPT_percent ? printf(" %6s\n", "%I/O") : 1;
+
+ /* truncate to top lines if needed */
+ OPT_top ? trunc(@out, TOP) : 1;
+
+ /* normalise to percentage if needed */
+ OPT_percent ? normalize(@out, INTERVAL * 10000) : 1;
+
+ /* print data */
+ ! OPT_percent ?
+ printa("%5d %6d %6d %-16s %-7s %3d %3d %1s %16@d\n", @out) :
+ printa("%5d %6d %6d %-16s %-7s %3d %3d %1s %6@d\n", @out);
+ printf("\n");
+
+ /* clear data */
+ trunc(@out);
+ disk_r = 0;
+ disk_w = 0;
+ secs = INTERVAL;
+ counts--;
+ }
+
+ /*
+ * End of program
+ */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+
+ /*
+ * Cleanup for Ctrl-C
+ */
+ dtrace:::END
+ {
+ trunc(@out);
+ }
+'
diff --git a/opensnoop b/opensnoop
new file mode 100755
index 000000000000..5b1a89bc543e
--- /dev/null
+++ b/opensnoop
@@ -0,0 +1,244 @@
+#!/usr/bin/sh
+#
+# opensnoop - snoop file opens as they occur.
+# Written using DTrace (Solaris 10 3/05).
+#
+# $Id: opensnoop 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: opensnoop [-a|-A|-ceghsvxZ] [-f pathname] [-n name] [-p PID]
+#
+# opensnoop # default output
+#
+# -a # print most data
+# -A # dump all data, space delimited
+# -c # print cwd of process
+# -e # print errno value
+# -g # print command arguments
+# -s # print start time, us
+# -v # print start time, string
+# -x # only print failed opens
+# -Z # print zonename
+# -f pathname # file pathname to snoop
+# -n name # command name to snoop
+# -p PID # process ID to snoop
+# eg,
+# opensnoop -v # human readable timestamps
+# opensnoop -e # see error codes
+# opensnoop -f /etc/passwd # snoop this file only
+#
+# FIELDS:
+# ZONE Zone name
+# UID User ID
+# PID Process ID
+# PPID Parent Process ID
+# FD file descriptor (-1 for error)
+# ERR errno value (see /usr/include/sys/errno.h)
+# CWD print current working directory of process
+# PATH pathname for file open
+# COMM command name for the process
+# ARGS argument listing for the process
+# TIME timestamp for the open event, us
+# STRTIME timestamp for the open event, string
+#
+# SEE ALSO: truss, BSM auditing.
+#
+# COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 09-May-2004 Brendan Gregg Created this.
+# 21-Jan-2005 " " Wrapped in sh to provide options.
+# 08-May-2005 " " Rewritten for performance.
+# 14-May-2005 " " Added errno.
+# 28-Jun-2005 " " Added cwd, zonename.
+# 17-Sep-2005 " " Increased switchrate, fixed page fault bug.
+# 16-Jan-2006 " " Added -n, -p.
+# 16-Jan-2006 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+opt_dump=0; opt_file=0; opt_time=0; opt_timestr=0; opt_args=0
+opt_zone=0; opt_cwd=0; opt_failonly=0; opt_err=0; filter=0; pathname=.
+opt_name=0; opt_pid=0; pname=.; pid=0
+
+### Process options
+while getopts aAcef:ghn:p:svxZ name
+do
+ case $name in
+ a) opt_time=1; opt_timestr=1; opt_args=1; opt_err=1 ;;
+ A) opt_dump=1 ;;
+ c) opt_cwd=1 ;;
+ e) opt_err=1 ;;
+ g) opt_args=1 ;;
+ f) opt_file=1; pathname=$OPTARG ;;
+ n) opt_name=1; pname=$OPTARG ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ s) opt_time=1 ;;
+ v) opt_timestr=1 ;;
+ x) opt_failonly=1 ;;
+ Z) opt_zone=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: opensnoop [-a|-A|-ceghsvxZ] [-f pathname]
+ [-n name] [-p PID]
+ opensnoop # default output
+ -a # print most data
+ -A # dump all data, space delimited
+ -c # print cwd of process
+ -e # print errno value
+ -g # print command arguments
+ -s # print start time, us
+ -v # print start time, string
+ -x # only print failed opens
+ -Z # print zonename
+ -f pathname # pathname name to snoop
+ -n name # process name to snoop
+ -p PID # process ID to snoop
+ eg,
+ opensnoop -v # human readable timestamps
+ opensnoop -e # see error codes
+ opensnoop -f /etc/motd # snoop this file only
+ END
+ exit 1
+ esac
+done
+
+### Option logic
+if [ $opt_dump -eq 1 ]; then
+ opt_zone=0; opt_cwd=0; opt_time=0; opt_timestr=0; opt_args=2
+fi
+if [ $opt_name -eq 1 -o $opt_pid -eq 1 ]; then
+ filter=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_dump = '$opt_dump';
+ inline int OPT_file = '$opt_file';
+ inline int OPT_args = '$opt_args';
+ inline int OPT_cwd = '$opt_cwd';
+ inline int OPT_err = '$opt_err';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_time = '$opt_time';
+ inline int OPT_timestr = '$opt_timestr';
+ inline int OPT_failonly = '$opt_failonly';
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_name = '$opt_name';
+ inline int FILTER = '$filter';
+ inline int PID = '$pid';
+ inline string PATHNAME = "'$pathname'";
+ inline string NAME = "'$pname'";
+
+ #pragma D option quiet
+ #pragma D option switchrate=10hz
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ /*
+ * ternary operators are used to improve performance.
+ * OPT_args is unusual in that it can have one of three values.
+ */
+
+ /* print optional headers */
+ OPT_time ? printf("%-14s ", "TIME") : 1;
+ OPT_timestr ? printf("%-20s ", "STRTIME") : 1;
+ OPT_zone ? printf("%-10s ", "ZONE") : 1;
+
+ /* print dump headers */
+ OPT_dump ? printf("%s %s %s %s %s %s %s %s %s %s %s", "ZONE",
+ "TIME", "UID", "PID", "PPID", "COMM", "FD", "ERR", "CWD",
+ "PATH", "ARGS") : printf("%5s %6s ","UID","PID");
+
+ /* print main headers */
+ OPT_args == 0 ? printf("%-12s ", "COMM") : 1;
+ OPT_dump == 0 ? printf("%3s ", "FD") : 1;
+ OPT_err ? printf("%3s ", "ERR") : 1;
+ OPT_cwd ? printf("%-20s ", "CWD") : 1;
+ OPT_dump == 0 ? printf("%-20s ", "PATH") : 1;
+ OPT_args == 1 ? printf("%s", "ARGS") : 1;
+ printf("\n");
+ }
+
+ /*
+ * Print open event
+ */
+ syscall::open:entry, syscall::open64:entry
+ {
+ /* save pathname */
+ self->pathp = arg0;
+
+ /* default is to trace unless filtering */
+ self->ok = FILTER ? 0 : 1;
+
+ /* check each filter */
+ (OPT_name == 1 && NAME == execname) ? self->ok = 1 : 1;
+ (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1;
+ /* OPT_file is checked on return to ensure pathp is mapped */
+ }
+
+ syscall::open:return, syscall::open64:return
+ /self->ok && (! OPT_failonly || (int)arg0 < 0) &&
+ ((OPT_file == 0) || (OPT_file == 1 && PATHNAME == copyinstr(self->pathp)))/
+ {
+ /* print optional fields */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%-10s ", zonename) : 1;
+
+ /* print dump fields */
+ OPT_dump ? printf("%s %d %d %d %d %s %d %d %s %s %S", zonename,
+ timestamp/1000, uid, pid, ppid, execname, (int)arg0, errno,
+ cwd, copyinstr(self->pathp), curpsinfo->pr_psargs) :
+ printf("%5d %6d ", uid, pid);
+
+ /* print main fields */
+ OPT_args == 0 ? printf("%-12s ", execname) : 1;
+ OPT_dump == 0 ? printf("%3d ", (int)arg0) : 1;
+ OPT_err ? printf("%3d ", errno) : 1;
+ OPT_cwd ? printf("%-20s ", cwd) : 1;
+ OPT_dump == 0 ? printf("%-20s ", copyinstr(self->pathp)) : 1;
+ OPT_args == 1 ? printf("%S", curpsinfo->pr_psargs) : 1;
+ printf("\n");
+
+ /* cleanup */
+ self->pathp = 0;
+ self->ok = 0;
+ }
+
+ /*
+ * Cleanup
+ */
+ syscall::open:return, syscall::open64:return
+ /self->ok/
+ {
+ self->pathp = 0;
+ self->ok = 0;
+ }
+'
diff --git a/procsystime b/procsystime
new file mode 100755
index 000000000000..32da4b76381e
--- /dev/null
+++ b/procsystime
@@ -0,0 +1,233 @@
+#!/usr/bin/sh
+#
+# procsystime - print process system call time details.
+# Written using DTrace (Solaris 10 3/05).
+#
+# $Id: procsystime 4 2007-08-01 11:01:38Z brendan $
+#
+# USAGE: procsystime [-acehoT] [ -p PID | -n name | command ]
+#
+# -p PID # examine this PID
+# -n name # examine this process name
+# -a # print all details
+# -c # print syscall counts
+# -e # print elapsed times
+# -o # print CPU times
+# -T # print totals
+# eg,
+# procsystime -p 1871 # examine PID 1871
+# procsystime -n tar # examine processes called "tar"
+# procsystime -aTn bash # print all details for bash shells
+# procsystime df -h # run and examine "df -h"
+#
+# The elapsed times are interesting, to help identify syscalls that take
+# some time to complete (during which the process may have slept). CPU time
+# helps us identify syscalls that are consuming CPU cycles to run.
+#
+# FIELDS:
+# SYSCALL System call name
+# TIME (ns) Total time, nanoseconds
+# COUNT Number of occurrences
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 27-Apr-2005 Brendan Gregg Created this.
+# 08-Jun-2005 " " Added command option.
+# 22-Sep-2005 " " Allowed systemwide tracing.
+# 22-Sep-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+opt_filter=0; opt_pid=0; opt_name=0; pid=0; pname=".";
+opt_elapsed=0; opt_cpu=0; opt_counts=0; opt_totals=0
+opt_command=0; command="";
+
+### Process options
+while getopts acehn:op:T name
+do
+ case $name in
+ p) opt_filter=1; opt_pid=1; pid=$OPTARG ;;
+ n) opt_filter=1; opt_name=1; pname=$OPTARG ;;
+ a) opt_totals=1; opt_elapsed=1; opt_cpu=1; opt_counts=1 ;;
+ e) opt_elapsed=1 ;;
+ c) opt_counts=1 ;;
+ o) opt_cpu=1 ;;
+ T) opt_totals=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: procsystime [-aceho] [ -p PID | -n name | command ]
+ -p PID # examine this PID
+ -n name # examine this process name
+ -a # print all details
+ -e # print elapsed times
+ -c # print syscall counts
+ -o # print CPU times
+ -T # print totals
+ eg,
+ procsystime -p 1871 # examine PID 1871
+ procsystime -n tar # examine processes called "tar"
+ procsystime -aTn bash # print all details for bash
+ procsystime df -h # run and examine "df -h"
+ END
+ exit 1
+ esac
+done
+shift `expr $OPTIND - 1`
+
+### Option logic
+if [ $opt_pid -eq 0 -a $opt_name -eq 0 -a "$*" != "" ]; then
+ opt_filter=1
+ opt_command=1
+ command="$*"
+fi
+if [ $opt_elapsed -eq 0 -a $opt_cpu -eq 0 -a $opt_counts -eq 0 ]; then
+ opt_elapsed=1;
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+dtrace='
+ #pragma D option quiet
+
+ /*
+ * Command line arguments
+ */
+ inline int OPT_elapsed = '$opt_elapsed';
+ inline int OPT_cpu = '$opt_cpu';
+ inline int OPT_counts = '$opt_counts';
+ inline int OPT_filter = '$opt_filter';
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_name = '$opt_name';
+ inline int OPT_totals = '$opt_totals';
+ inline int OPT_command = '$opt_command';
+ inline int PID = '$pid';
+ inline string NAME = "'$pname'";
+ inline string COMMAND = "'$command'";
+
+ dtrace:::BEGIN
+ {
+ self->start = 0;
+ self->vstart = 0;
+ }
+ dtrace:::BEGIN
+ /! OPT_command/
+ {
+ printf("Tracing... Hit Ctrl-C to end...\n");
+ }
+
+ /*
+ * Set start timestamp and counts
+ */
+ syscall:::entry
+ /(! OPT_filter) ||
+ (OPT_pid && pid == PID) ||
+ (OPT_name && execname == NAME) ||
+ (OPT_command && pid == $target)/
+ {
+ self->ok = 1;
+ }
+ syscall:::entry
+ /self->ok/
+ {
+ OPT_counts ? @Counts[probefunc] = count() : 1;
+ (OPT_counts && OPT_totals) ? @Counts["TOTAL:"] = count() : 1;
+ OPT_elapsed ? self->start = timestamp : 1;
+ OPT_cpu ? self->vstart = vtimestamp : 1;
+ self->ok = 0;
+ }
+
+ /*
+ * Calculate time deltas
+ */
+ syscall:::return
+ /self->start/
+ {
+ this->elapsed = timestamp - self->start;
+ @Elapsed[probefunc] = sum(this->elapsed);
+ OPT_totals ? @Elapsed["TOTAL:"] = sum(this->elapsed) : 1;
+ self->start = 0;
+ }
+ syscall:::return
+ /self->vstart/
+ {
+ this->cpu = vtimestamp - self->vstart;
+ @CPU[probefunc] = sum(this->cpu);
+ OPT_totals ? @CPU["TOTAL:"] = sum(this->cpu) : 1;
+ self->vstart = 0;
+ }
+
+ /*
+ * Elapsed time report
+ */
+ dtrace:::END
+ /OPT_elapsed/
+ {
+ printf("\nElapsed Times for ");
+ OPT_pid ? printf("PID %d,\n\n",PID) : 1;
+ OPT_name ? printf("processes %s,\n\n",NAME) : 1;
+ OPT_command ? printf("command %s,\n\n",COMMAND) : 1;
+ (! OPT_filter) ? printf("all processes,\n\n") : 1;
+ printf("%16s %18s\n","SYSCALL","TIME (ns)");
+ printa("%16s %@18d\n",@Elapsed);
+ }
+
+ /*
+ * CPU time report
+ */
+ dtrace:::END
+ /OPT_cpu/
+ {
+ printf("\nCPU Times for ");
+ OPT_pid ? printf("PID %d,\n\n",PID) : 1;
+ OPT_name ? printf("processes %s,\n\n",NAME) : 1;
+ OPT_command ? printf("command %s,\n\n",COMMAND) : 1;
+ (! OPT_filter) ? printf("all processes,\n\n") : 1;
+ printf("%16s %18s\n","SYSCALL","TIME (ns)");
+ printa("%16s %@18d\n",@CPU);
+ }
+
+ /*
+ * Syscall count report
+ */
+ dtrace:::END
+ /OPT_counts/
+ {
+ printf("\nSyscall Counts for ");
+ OPT_pid ? printf("PID %d,\n\n",PID) : 1;
+ OPT_name ? printf("processes %s,\n\n",NAME) : 1;
+ OPT_command ? printf("command %s,\n\n",COMMAND) : 1;
+ (! OPT_filter) ? printf("all processes,\n\n") : 1;
+ printf("%16s %18s\n","SYSCALL","COUNT");
+ OPT_counts ? printa("%16s %@18d\n",@Counts) : 1;
+ }
+'
+
+### Run DTrace
+if [ $opt_command -eq 1 ]; then
+ /usr/sbin/dtrace -n "$dtrace" -x evaltime=exec -c "$command" >&2
+else
+ /usr/sbin/dtrace -n "$dtrace" >&2
+fi
+
diff --git a/rwsnoop b/rwsnoop
new file mode 100755
index 000000000000..9d4932487cce
--- /dev/null
+++ b/rwsnoop
@@ -0,0 +1,234 @@
+#!/usr/bin/ksh
+#
+# rwsnoop - snoop read/write events.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This is measuring reads and writes at the application level. This matches
+# the syscalls read, write, pread and pwrite.
+#
+# $Id: rwsnoop 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: rwsnoop [-jPtvZ] [-n name] [-p pid]
+#
+# rwsnoop # default output
+#
+# -j # print project ID
+# -P # print parent process ID
+# -t # print timestamp, us
+# -v # print time, string
+# -Z # print zone ID
+# -n name # this process name only
+# -p PID # this PID only
+# eg,
+# rwsnoop -Z # print zone ID
+# rwsnoop -n bash # monitor processes named "bash"
+# rwsnoop > out.txt # recommended
+#
+# NOTE:
+# rwsnoop usually prints plenty of output, which itself will cause
+# more output. It can be better to redirect the output of rwsnoop
+# to a file to prevent this.
+#
+# FIELDS:
+# TIME Timestamp, us
+# TIMESTR Time, string
+# ZONE Zone ID
+# PROJ Project ID
+# UID User ID
+# PID Process ID
+# PPID Parent Process ID
+# CMD Process name
+# D Direction, Read or Write
+# BYTES Total bytes during sample, -1 for error
+# FILE Filename, if file based
+#
+# Reads and writes that are not file based, for example with sockets, will
+# print "<unknown>" as the filename.
+#
+# SEE ALSO: rwtop
+#
+# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# TODO:
+# Track readv and writev.
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 24-Jul-2005 Brendan Gregg Created this.
+# 17-Sep-2005 " " Increased switchrate.
+# 17-Sep-2005 " " Last update.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_name=0; opt_pid=0; opt_proj=0; opt_zone=0; opt_time=0; opt_timestr=0
+opt_bytes=1; filter=0; pname=.; pid=0; opt_ppid=0
+
+### process options
+while getopts n:Pp:jtvZ name
+do
+ case $name in
+ n) opt_name=1; pname=$OPTARG ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ P) opt_ppid=1 ;;
+ j) opt_proj=1 ;;
+ t) opt_time=1 ;;
+ v) opt_timestr=1 ;;
+ Z) opt_zone=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: rwsnoop [-jPtvZ] [-n name] [-p pid]
+
+ -j # print project ID
+ -P # print parent process ID
+ -t # print timestamp, us
+ -v # print time, string
+ -Z # print zone ID
+ -n name # this process name only
+ -p PID # this PID only
+ eg,
+ rwsnoop # default output
+ rwsnoop -Z # print zone ID
+ rwsnoop -n bash # monitor processes named "bash"
+ END
+ exit 1
+ esac
+done
+
+shift $(( $OPTIND - 1 ))
+
+### option logic
+if (( opt_name || opt_pid )); then
+ filter=1
+fi
+
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_proj = '$opt_proj';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_bytes = '$opt_bytes';
+ inline int OPT_name = '$opt_name';
+ inline int OPT_ppid = '$opt_ppid';
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_time = '$opt_time';
+ inline int OPT_timestr = '$opt_timestr';
+ inline int FILTER = '$filter';
+ inline int PID = '$pid';
+ inline string NAME = "'$pname'";
+
+ #pragma D option quiet
+ #pragma D option switchrate=10hz
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ /* print header */
+ OPT_time ? printf("%-14s ", "TIME") : 1;
+ OPT_timestr ? printf("%-20s ", "TIMESTR") : 1;
+ OPT_proj ? printf("%5s ", "PROJ") : 1;
+ OPT_zone ? printf("%5s ", "ZONE") : 1;
+ OPT_ppid ? printf("%6s ", "PPID") : 1;
+ printf("%5s %6s %-12s %1s %7s %s\n",
+ "UID", "PID", "CMD", "D", "BYTES", "FILE");
+ }
+
+ /*
+ * Check event is being traced
+ */
+ syscall::*read:entry,
+ syscall::*write:entry
+ /pid != $pid/
+ {
+ /* default is to trace unless filtering, */
+ self->ok = FILTER ? 0 : 1;
+
+ /* check each filter, */
+ (OPT_name == 1 && NAME == execname)? self->ok = 1 : 1;
+ (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1;
+
+ /* save file descriptor */
+ self->fd = self->ok ? arg0 : 0;
+ }
+
+ /*
+ * Save read details
+ */
+ syscall::*read:return
+ /self->ok/
+ {
+ self->rw = "R";
+ self->size = arg0;
+ }
+
+ /*
+ * Save write details
+ */
+ syscall::*write:entry
+ /self->ok/
+ {
+ self->rw = "W";
+ self->size = arg2;
+ }
+
+ /*
+ * Process event
+ */
+ syscall::*read:return,
+ syscall::*write:entry
+ /self->ok/
+ {
+ /*
+ * Fetch filename
+ */
+ this->filistp = curthread->t_procp->p_user.u_finfo.fi_list;
+ this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp +
+ (uint64_t)self->fd * (uint64_t)sizeof(uf_entry_t));
+ this->filep = this->ufentryp->uf_file;
+ this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0;
+ self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ?
+ cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>";
+
+ /*
+ * Print details
+ */
+ OPT_time ? printf("%-14d ", timestamp / 1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_proj ? printf("%5d ", curpsinfo->pr_projid) : 1;
+ OPT_zone ? printf("%5d ", curpsinfo->pr_zoneid) : 1;
+ OPT_ppid ? printf("%6d ", ppid) : 1;
+ printf("%5d %6d %-12.12s %1s %7d %s\n",
+ uid, pid, execname, self->rw, (int)self->size, self->vpath);
+
+ self->ok = 0;
+ self->fd = 0;
+ self->rw = 0;
+ self->size = 0;
+ self->vpath = 0;
+ }
+'
diff --git a/rwtop b/rwtop
new file mode 100755
index 000000000000..ed0a6faaa475
--- /dev/null
+++ b/rwtop
@@ -0,0 +1,292 @@
+#!/usr/bin/ksh
+#
+# rwtop - display top read/write bytes by process.
+# Written using DTrace (Solaris 10 3/05).
+#
+# This is measuring reads and writes at the application level. This matches
+# read and write system calls.
+#
+# $Id: rwtop 3 2007-08-01 10:50:08Z brendan $
+#
+# USAGE: rwtop [-cC] [-j|-Z] [-n name] [-p pid]
+# [-t top] [interval [count]]
+#
+# rwtop # default output, 5 second samples
+#
+# -C # don't clear the screen
+# -c # print counts
+# -j # print project ID
+# -Z # print zone ID
+# -n name # this process name only
+# -p PID # this PID only
+# -t top # print top number only
+# eg,
+# rwtop 1 # 1 second samples
+# rwtop -t 10 # print top 10 only
+# rwtop -n bash # monitor processes named "bash"
+# rwtop -C 5 12 # print 12 x 5 second samples
+#
+# FIELDS:
+# ZONE Zone ID
+# PROJ Project ID
+# UID User ID
+# PID Process ID
+# PPID Parent Process ID
+# CMD Process name
+# D Direction, Read or Write
+# BYTES Total bytes during sample
+# app_r total reads during sample, Kbytes
+# app_w total writes during sample, Kbytes
+#
+# SEE ALSO: iotop
+#
+# INSPIRATION: top(1) by William LeFebvre
+#
+# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 24-Jul-2005 Brendan Gregg Created this.
+# 20-Apr-2006 " " Last update.
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### default variables
+opt_name=0; opt_pid=0; opt_clear=1; opt_proj=0; opt_zone=0
+opt_def=1; opt_bytes=1; filter=0; pname=.; pid=0
+opt_top=0; opt_count=0; interval=5; count=-1; top=0
+
+### process options
+while getopts Cchn:p:jt:Z name
+do
+ case $name in
+ C) opt_clear=0 ;;
+ c) opt_count=1; opt_bytes=0 ;;
+ n) opt_name=1; pname=$OPTARG ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ j) opt_proj=1; opt_def=0 ;;
+ t) opt_top=1; top=$OPTARG ;;
+ Z) opt_zone=1; opt_def=0 ;;
+ h|?) cat <<-END >&2
+ USAGE: rwtop [-cC] [-j|-Z] [-n name] [-p pid]
+ [-t top] [interval [count]]
+
+ -C # don't clear the screen
+ -c # print counts
+ -j # print project ID
+ -Z # print zone ID
+ -n name # this process name only
+ -p PID # this PID only
+ -t top # print top number only
+ eg,
+ rwtop # default output, 5 second samples
+ rwtop 1 # 1 second samples
+ rwtop -t 10 # print top 10 only
+ rwtop -n bash # monitor processes named "bash"
+ rwtop -C 5 12 # print 12 x 5 second samples
+ END
+ exit 1
+ esac
+done
+
+shift $(( $OPTIND - 1 ))
+
+### option logic
+if [[ "$1" > 0 ]]; then
+ interval=$1; shift
+fi
+if [[ "$1" > 0 ]]; then
+ count=$1; shift
+fi
+if (( opt_proj && opt_zone )); then
+ opt_proj=0
+fi
+if (( opt_name || opt_pid )); then
+ filter=1
+fi
+if (( opt_clear )); then
+ clearstr=`clear`
+else
+ clearstr=.
+fi
+
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_def = '$opt_def';
+ inline int OPT_proj = '$opt_proj';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_clear = '$opt_clear';
+ inline int OPT_bytes = '$opt_bytes';
+ inline int OPT_count = '$opt_count';
+ inline int OPT_name = '$opt_name';
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_top = '$opt_top';
+ inline int INTERVAL = '$interval';
+ inline int COUNTER = '$count';
+ inline int FILTER = '$filter';
+ inline int TOP = '$top';
+ inline int PID = '$pid';
+ inline string NAME = "'$pname'";
+ inline string CLEAR = "'$clearstr'";
+
+ #pragma D option quiet
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ /* starting values */
+ counts = COUNTER;
+ secs = INTERVAL;
+ app_r = 0;
+ app_w = 0;
+
+ printf("Tracing... Please wait.\n");
+ }
+
+ /*
+ * Check event is being traced
+ */
+ sysinfo:::readch,
+ sysinfo:::writech
+ /pid != $pid/
+ {
+ /* default is to trace unless filtering, */
+ this->ok = FILTER ? 0 : 1;
+
+ /* check each filter, */
+ (OPT_name == 1 && NAME == execname)? this->ok = 1 : 1;
+ (OPT_pid == 1 && PID == pid) ? this->ok = 1 : 1;
+ }
+
+ /*
+ * Increment tallys
+ */
+ sysinfo:::readch
+ /this->ok/
+ {
+ app_r += arg0;
+ }
+ sysinfo:::writech
+ /this->ok/
+ {
+ app_w += arg0;
+ }
+
+ /*
+ * Process event
+ */
+ sysinfo:::readch,
+ sysinfo:::writech
+ /this->ok/
+ {
+ /* choose statistic to track */
+ this->value = OPT_bytes ? arg0 : 1;
+
+ /*
+ * Save details
+ */
+ OPT_def ? @out[uid, pid, ppid, execname,
+ probename == "readch" ? "R" : "W"] = sum(this->value) : 1;
+ OPT_proj ? @out[curpsinfo->pr_projid, pid, ppid, execname,
+ probename == "readch" ? "R" : "W"] = sum(this->value) : 1;
+ OPT_zone ? @out[curpsinfo->pr_zoneid, pid, ppid, execname,
+ probename == "readch" ? "R" : "W"] = sum(this->value) : 1;
+
+ this->ok = 0;
+ }
+
+ /*
+ * Timer
+ */
+ profile:::tick-1sec
+ {
+ secs--;
+ }
+
+ /*
+ * Print Report
+ */
+ profile:::tick-1sec
+ /secs == 0/
+ {
+ /* fetch 1 min load average */
+ this->load1a = `hp_avenrun[0] / 65536;
+ this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536;
+
+ /* convert counters to Kbytes */
+ app_r /= 1024;
+ app_w /= 1024;
+
+ /* print status */
+ OPT_clear ? printf("%s", CLEAR) : 1;
+ printf("%Y, load: %d.%02d, app_r: %6d KB, app_w: %6d KB\n\n",
+ walltimestamp, this->load1a, this->load1b, app_r, app_w);
+
+ /* print headers */
+ OPT_def ? printf(" UID ") : 1;
+ OPT_proj ? printf(" PROJ ") : 1;
+ OPT_zone ? printf(" ZONE ") : 1;
+ printf("%6s %6s %-16s %1s",
+ "PID", "PPID", "CMD", "D");
+ OPT_bytes ? printf(" %16s\n", "BYTES") : 1;
+ OPT_count ? printf(" %16s\n", "COUNT") : 1;
+
+ /* truncate to top lines if needed */
+ OPT_top ? trunc(@out, TOP) : 1;
+
+ /* print data */
+ printa("%5d %6d %6d %-16s %1s %16@d\n", @out);
+ printf("\n");
+
+ /* clear data */
+ trunc(@out);
+ app_r = 0;
+ app_w = 0;
+ secs = INTERVAL;
+ counts--;
+ }
+
+ /*
+ * End of program
+ */
+ profile:::tick-1sec
+ /counts == 0/
+ {
+ exit(0);
+ }
+
+ /*
+ * Cleanup for Ctrl-C
+ */
+ dtrace:::END
+ {
+ trunc(@out);
+ }
+'
+
diff --git a/statsnoop b/statsnoop
new file mode 100755
index 000000000000..6284fb5060f3
--- /dev/null
+++ b/statsnoop
@@ -0,0 +1,286 @@
+#!/usr/bin/sh
+#
+# statsnoop - snoop file stats as they occur.
+# Written using DTrace (Solaris 10 3/05).
+#
+# $Id: statsnoop 65 2007-10-04 11:09:40Z brendan $
+#
+# USAGE: statsnoop [-a|-A|-ceghlsvxZ] [-f pathname] [-t syscall]
+# [-n name] [-p PID]
+#
+# statsnoop # default output
+#
+# -a # print most data
+# -A # dump all data, space delimited
+# -c # print cwd of process
+# -e # print errno value
+# -g # print command arguments
+# -l # print syscall type
+# -s # print start time, us
+# -v # print start time, string
+# -x # only print failed stats
+# -Z # print zonename
+# -f pathname # file pathname to snoop
+# -n name # command name to snoop
+# -p PID # process ID to snoop
+# -t syscall # stat syscall to trace
+# eg,
+# statsnoop -v # human readable timestamps
+# statsnoop -S # syscall type
+# statsnoop -e # see error codes
+# statsnoop -f /etc/passwd # snoop this file only
+#
+# FIELDS:
+# ZONE Zone name
+# UID User ID
+# PID Process ID
+# PPID Parent Process ID
+# FD file descriptor (-1 for error)
+# ERR errno value (see /usr/include/sys/errno.h)
+# TYPE syscall type
+# CWD current working directory of process
+# PATH pathname for file stat
+# COMM command name for the process
+# ARGS argument listing for the process
+# TIME timestamp for the stat event, us
+# STRTIME timestamp for the stat event, string
+#
+# SEE ALSO: truss, BSM auditing.
+#
+# COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at Docs/cddl1.txt
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# CDDL HEADER END
+#
+# Author: Brendan Gregg [Sydney, Australia]
+#
+# 09-Sep-2007 Brendan Gregg Created this.
+#
+
+
+##############################
+# --- Process Arguments ---
+#
+
+### Default variables
+opt_dump=0; opt_file=0; opt_time=0; opt_timestr=0; opt_args=0
+opt_zone=0; opt_cwd=0; opt_failonly=0; opt_err=0; filter=0; pathname=.
+opt_name=0; opt_pid=0; opt_type=0; opt_trace=0; pname=.; pid=0; trace=.
+
+### Process options
+while getopts aAcef:ghln:p:st:vxZ name
+do
+ case $name in
+ a) opt_time=1; opt_timestr=1; opt_args=1; opt_err=1 ;;
+ A) opt_dump=1 ;;
+ c) opt_cwd=1 ;;
+ e) opt_err=1 ;;
+ g) opt_args=1 ;;
+ f) opt_file=1; pathname=$OPTARG ;;
+ l) opt_type=1 ;;
+ n) opt_name=1; pname=$OPTARG ;;
+ p) opt_pid=1; pid=$OPTARG ;;
+ s) opt_time=1 ;;
+ t) opt_trace=1; trace=$OPTARG ;;
+ v) opt_timestr=1 ;;
+ x) opt_failonly=1 ;;
+ Z) opt_zone=1 ;;
+ h|?) cat <<-END >&2
+ USAGE: statsnoop [-a|-A|-ceghlsvxZ] [-f pathname] [-t syscall]
+ [-n execname] [-p PID]
+ statsnoop # default output
+ -a # print most data
+ -A # dump all data, space delimited
+ -c # print cwd of process
+ -e # print errno value
+ -g # print command arguments
+ -l # print syscall type
+ -s # print start time, us
+ -v # print start time, string
+ -x # only print failed stats
+ -Z # print zonename
+ -f pathname # pathname name to snoop
+ -n name # process name to snoop
+ -p PID # process ID to snoop
+ -t syscall # stat syscall to trace
+ eg,
+ statsnoop -v # human readable timestamps
+ statsnoop -e # see error codes
+ statsnoop -f /etc/motd # snoop this file only
+ END
+ exit 1
+ esac
+done
+
+### Option logic
+if [ $opt_dump -eq 1 ]; then
+ opt_zone=0; opt_cwd=0; opt_time=0; opt_timestr=0; opt_type=0
+ opt_args=2
+fi
+if [ $opt_name -eq 1 -o $opt_pid -eq 1 -o $opt_trace -eq 1 ]; then
+ filter=1
+fi
+
+
+#################################
+# --- Main Program, DTrace ---
+#
+/usr/sbin/dtrace -n '
+ /*
+ * Command line arguments
+ */
+ inline int OPT_dump = '$opt_dump';
+ inline int OPT_file = '$opt_file';
+ inline int OPT_args = '$opt_args';
+ inline int OPT_cwd = '$opt_cwd';
+ inline int OPT_err = '$opt_err';
+ inline int OPT_zone = '$opt_zone';
+ inline int OPT_time = '$opt_time';
+ inline int OPT_timestr = '$opt_timestr';
+ inline int OPT_type = '$opt_type';
+ inline int OPT_failonly = '$opt_failonly';
+ inline int OPT_pid = '$opt_pid';
+ inline int OPT_name = '$opt_name';
+ inline int OPT_trace = '$opt_trace';
+ inline int FILTER = '$filter';
+ inline int PID = '$pid';
+ inline string PATHNAME = "'$pathname'";
+ inline string NAME = "'$pname'";
+ inline string TRACE = "'$trace'";
+
+ #pragma D option quiet
+ #pragma D option switchrate=10hz
+
+ /*
+ * Print header
+ */
+ dtrace:::BEGIN
+ {
+ /* print optional headers */
+ OPT_time ? printf("%-14s ", "TIME") : 1;
+ OPT_timestr ? printf("%-20s ", "STRTIME") : 1;
+ OPT_zone ? printf("%-10s ", "ZONE") : 1;
+
+ /* print dump headers */
+ OPT_dump ? printf("%s %s %s %s %s %s %s %s %s %s %s", "ZONE",
+ "TIME", "UID", "PID", "PPID", "COMM", "FD", "ERR", "CWD",
+ "PATH", "ARGS") : printf("%5s %6s ","UID","PID");
+
+ /* print main headers */
+ OPT_args == 0 ? printf("%-12s ", "COMM") : 1;
+ OPT_dump == 0 ? printf("%3s ", "FD") : 1;
+ OPT_err ? printf("%3s ", "ERR") : 1;
+ OPT_cwd ? printf("%-20s ", "CWD") : 1;
+ OPT_type ? printf("%-8s ", "TYPE") : 1;
+ OPT_dump == 0 ? printf("%-20s ", "PATH") : 1;
+ OPT_args == 1 ? printf("%s", "ARGS") : 1;
+ printf("\n");
+ }
+
+ /*
+ * Print stat event
+ */
+ syscall::stat:entry, syscall::stat64:entry, syscall::xstat:entry,
+ syscall::lstat:entry, syscall::lstat64:entry, syscall::lxstat:entry,
+ syscall::fstat:entry, syscall::fstat64:entry, syscall::fxstat:entry
+ {
+ /* default is to trace unless filtering */
+ self->ok = FILTER ? 0 : 1;
+
+ /* check each filter */
+ (OPT_name == 1 && NAME == execname) ? self->ok = 1 : 1;
+ (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1;
+ (OPT_trace == 1 && TRACE == probefunc) ? self->ok = 1 : 1;
+ }
+
+ syscall::stat:entry, syscall::stat64:entry,
+ syscall::lstat:entry, syscall::lstat64:entry, syscall::lxstat:entry
+ /self->ok/
+ {
+ self->pathp = arg0;
+ }
+
+ syscall::xstat:entry
+ /self->ok/
+ {
+ self->pathp = arg1;
+ }
+
+ syscall::stat:return, syscall::stat64:return, syscall::xstat:return,
+ syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return
+ /self->ok/
+ {
+ self->path = copyinstr(self->pathp);
+ self->pathp = 0;
+ }
+
+ syscall::fstat:return, syscall::fstat64:entry, syscall::fxstat:entry
+ /self->ok/
+ {
+ self->filep = curthread->t_procp->p_user.u_finfo.fi_list[arg0].uf_file;
+ }
+
+ syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return
+ /self->ok/
+ {
+ this->vnodep = self->filep != 0 ? self->filep->f_vnode : 0;
+ self->path = this->vnodep ? (this->vnodep->v_path != 0 ?
+ cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>";
+ self->filep = 0;
+ }
+
+ syscall::stat:return, syscall::stat64:return, syscall::xstat:return,
+ syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return,
+ syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return
+ /self->ok && (! OPT_failonly || (int)arg0 < 0) &&
+ ((OPT_file == 0) || (OPT_file == 1 && PATHNAME == copyinstr(self->pathp)))/
+ {
+ /* print optional fields */
+ OPT_time ? printf("%-14d ", timestamp/1000) : 1;
+ OPT_timestr ? printf("%-20Y ", walltimestamp) : 1;
+ OPT_zone ? printf("%-10s ", zonename) : 1;
+
+ /* print dump fields */
+ OPT_dump ? printf("%s %d %d %d %d %s %d %d %s %s %S", zonename,
+ timestamp/1000, uid, pid, ppid, execname, (int)arg0, errno,
+ cwd, self->path, curpsinfo->pr_psargs) :
+ printf("%5d %6d ", uid, pid);
+
+ /* print main fields */
+ OPT_args == 0 ? printf("%-12.12s ", execname) : 1;
+ OPT_dump == 0 ? printf("%3d ", (int)arg0) : 1;
+ OPT_err ? printf("%3d ", errno) : 1;
+ OPT_cwd ? printf("%-20s ", cwd) : 1;
+ OPT_type ? printf("%-8s ", probefunc) : 1;
+ OPT_dump == 0 ? printf("%-20s ", self->path) : 1;
+ OPT_args == 1 ? printf("%S", curpsinfo->pr_psargs) : 1;
+ printf("\n");
+
+ /* cleanup */
+ self->path = 0;
+ self->ok = 0;
+ }
+
+ /*
+ * Cleanup
+ */
+ syscall::stat:return, syscall::stat64:return, syscall::xstat:return,
+ syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return,
+ syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return
+ /self->ok/
+ {
+ self->path = 0;
+ self->ok = 0;
+ }
+'