From 055173dba4a263acf10325a49eebf82915369ed2 Mon Sep 17 00:00:00 2001 From: "George V. Neville-Neil" Date: Sat, 12 May 2012 20:38:18 +0000 Subject: [PATCH] Add the remaining scripts from the DTraceToolkit, version 0.99, to the vendor tree. http://www.brendangregg.com/dtrace.html#DTraceToolkit --- Apps/Readme | 5 + Apps/httpdstat.d | 132 +++ Apps/nfswizard.d | 102 ++ Apps/shellsnoop | 268 +++++ Apps/weblatency.d | 186 ++++ Bin/anonpgpid.d | 1 + Bin/bitesize.d | 1 + Bin/connections | 1 + Bin/cpudists | 1 + Bin/cputimes | 1 + Bin/cputypes.d | 1 + Bin/cpuwalk.d | 1 + Bin/crash.d | 1 + Bin/creatbyproc.d | 1 + Bin/cswstat.d | 1 + Bin/dappprof | 1 + Bin/dapptrace | 1 + Bin/dexplorer | 1 + Bin/diskhits | 1 + Bin/dispqlen.d | 1 + Bin/dnlcps.d | 1 + Bin/dnlcsnoop.d | 1 + Bin/dnlcstat | 1 + Bin/dtruss | 1 + Bin/dvmstat | 1 + Bin/errinfo | 1 + Bin/execsnoop | 1 + Bin/fddist | 1 + Bin/filebyproc.d | 1 + Bin/fspaging.d | 1 + Bin/fsrw.d | 1 + Bin/guess.d | 1 + Bin/hotkernel | 1 + Bin/hotspot.d | 1 + Bin/hotuser | 1 + Bin/httpdstat.d | 1 + Bin/icmpstat.d | 1 + Bin/intbycpu.d | 1 + Bin/intoncpu.d | 1 + Bin/inttimes.d | 1 + Bin/iofile.d | 1 + Bin/iofileb.d | 1 + Bin/iopattern | 1 + Bin/iopending | 1 + Bin/iosnoop | 1 + Bin/iotop | 1 + Bin/j_calldist.d | 1 + Bin/j_calls.d | 1 + Bin/j_calltime.d | 1 + Bin/j_classflow.d | 1 + Bin/j_cpudist.d | 1 + Bin/j_cputime.d | 1 + Bin/j_events.d | 1 + Bin/j_flow.d | 1 + Bin/j_flowtime.d | 1 + Bin/j_methodcalls.d | 1 + Bin/j_objnew.d | 1 + Bin/j_package.d | 1 + Bin/j_profile.d | 1 + Bin/j_stat.d | 1 + Bin/j_syscalls.d | 1 + Bin/j_syscolors.d | 1 + Bin/j_thread.d | 1 + Bin/j_who.d | 1 + Bin/js_calldist.d | 1 + Bin/js_calls.d | 1 + Bin/js_calltime.d | 1 + Bin/js_cpudist.d | 1 + Bin/js_cputime.d | 1 + Bin/js_execs.d | 1 + Bin/js_flow.d | 1 + Bin/js_flowinfo.d | 1 + Bin/js_flowtime.d | 1 + Bin/js_objcpu.d | 1 + Bin/js_objgc.d | 1 + Bin/js_objnew.d | 1 + Bin/js_stat.d | 1 + Bin/js_who.d | 1 + Bin/kill.d | 1 + Bin/kstat_types.d | 1 + Bin/lastwords | 1 + Bin/loads.d | 1 + Bin/lockbydist.d | 1 + Bin/lockbyproc.d | 1 + Bin/minfbypid.d | 1 + Bin/minfbyproc.d | 1 + Bin/mmapfiles.d | 1 + Bin/modcalls.d | 1 + Bin/newproc.d | 1 + Bin/nfswizard.d | 1 + Bin/opensnoop | 1 + Bin/pathopens.d | 1 + Bin/pfilestat | 1 + Bin/pgpginbypid.d | 1 + Bin/pgpginbyproc.d | 1 + Bin/php_calldist.d | 1 + Bin/php_calltime.d | 1 + Bin/php_cpudist.d | 1 + Bin/php_cputime.d | 1 + Bin/php_flow.d | 1 + Bin/php_flowinfo.d | 1 + Bin/php_flowtime.d | 1 + Bin/php_funccalls.d | 1 + Bin/php_malloc.d | 1 + Bin/php_syscalls.d | 1 + Bin/php_syscolors.d | 1 + Bin/php_who.d | 1 + Bin/pidpersec.d | 1 + Bin/pl_calldist.d | 1 + Bin/pl_calltime.d | 1 + Bin/pl_cpudist.d | 1 + Bin/pl_cputime.d | 1 + Bin/pl_flow.d | 1 + Bin/pl_flowinfo.d | 1 + Bin/pl_flowtime.d | 1 + Bin/pl_malloc.d | 1 + Bin/pl_subcalls.d | 1 + Bin/pl_syscalls.d | 1 + Bin/pl_syscolors.d | 1 + Bin/pl_who.d | 1 + Bin/priclass.d | 1 + Bin/pridist.d | 1 + Bin/procsystime | 1 + Bin/putnexts.d | 1 + Bin/py_calldist.d | 1 + Bin/py_calltime.d | 1 + Bin/py_cpudist.d | 1 + Bin/py_cputime.d | 1 + Bin/py_flow.d | 1 + Bin/py_flowinfo.d | 1 + Bin/py_flowtime.d | 1 + Bin/py_funccalls.d | 1 + Bin/py_malloc.d | 1 + Bin/py_mallocstk.d | 1 + Bin/py_profile.d | 1 + Bin/py_syscalls.d | 1 + Bin/py_syscolors.d | 1 + Bin/py_who.d | 1 + Bin/rb_calldist.d | 1 + Bin/rb_calls.d | 1 + Bin/rb_calltime.d | 1 + Bin/rb_cpudist.d | 1 + Bin/rb_cputime.d | 1 + Bin/rb_flow.d | 1 + Bin/rb_flowinfo.d | 1 + Bin/rb_flowtime.d | 1 + Bin/rb_funccalls.d | 1 + Bin/rb_lines.d | 1 + Bin/rb_malloc.d | 1 + Bin/rb_objcpu.d | 1 + Bin/rb_objnew.d | 1 + Bin/rb_stat.d | 1 + Bin/rb_syscalls.d | 1 + Bin/rb_syscolors.d | 1 + Bin/rb_who.d | 1 + Bin/readbytes.d | 1 + Bin/readdist.d | 1 + Bin/rfileio.d | 1 + Bin/rfsio.d | 1 + Bin/runocc.d | 1 + Bin/rwbbypid.d | 1 + Bin/rwbypid.d | 1 + Bin/rwbytype.d | 1 + Bin/rwsnoop | 1 + Bin/rwtop | 1 + Bin/sampleproc | 1 + Bin/sar-c.d | 1 + Bin/seeksize.d | 1 + Bin/setuids.d | 1 + Bin/sh_calldist.d | 1 + Bin/sh_calls.d | 1 + Bin/sh_calltime.d | 1 + Bin/sh_cpudist.d | 1 + Bin/sh_cputime.d | 1 + Bin/sh_flow.d | 1 + Bin/sh_flowinfo.d | 1 + Bin/sh_flowtime.d | 1 + Bin/sh_lines.d | 1 + Bin/sh_pidcolors.d | 1 + Bin/sh_stat.d | 1 + Bin/sh_syscalls.d | 1 + Bin/sh_syscolors.d | 1 + Bin/sh_wasted.d | 1 + Bin/sh_who.d | 1 + Bin/shellsnoop | 1 + Bin/shortlived.d | 1 + Bin/sigdist.d | 1 + Bin/stacksize.d | 1 + Bin/statsnoop | 1 + Bin/swapinfo.d | 1 + Bin/sysbypid.d | 1 + Bin/syscallbypid.d | 1 + Bin/syscallbyproc.d | 1 + Bin/syscallbysysc.d | 1 + Bin/tcl_calldist.d | 1 + Bin/tcl_calls.d | 1 + Bin/tcl_calltime.d | 1 + Bin/tcl_cpudist.d | 1 + Bin/tcl_cputime.d | 1 + Bin/tcl_flow.d | 1 + Bin/tcl_flowtime.d | 1 + Bin/tcl_ins.d | 1 + Bin/tcl_insflow.d | 1 + Bin/tcl_proccalls.d | 1 + Bin/tcl_procflow.d | 1 + Bin/tcl_stat.d | 1 + Bin/tcl_syscalls.d | 1 + Bin/tcl_syscolors.d | 1 + Bin/tcl_who.d | 1 + Bin/tcpsnoop | 1 + Bin/tcpsnoop.d | 1 + Bin/tcpsnoop_snv | 1 + Bin/tcpsnoop_snv.d | 1 + Bin/tcpstat.d | 1 + Bin/tcptop | 1 + Bin/tcptop_snv | 1 + Bin/tcpwdist.d | 1 + Bin/threaded.d | 1 + Bin/topsyscall | 1 + Bin/topsysproc | 1 + Bin/udpstat.d | 1 + Bin/uname-a.d | 1 + Bin/vmbypid.d | 1 + Bin/vmstat-p.d | 1 + Bin/vmstat.d | 1 + Bin/vopstat | 1 + Bin/weblatency.d | 1 + Bin/whatexec.d | 1 + Bin/woof.d | 1 + Bin/wpm.d | 1 + Bin/writebytes.d | 1 + Bin/writedist.d | 1 + Bin/xcallsbypid.d | 1 + Bin/xvmstat | 1 + Bin/zvmstat | 1 + Code/Java/Func_abc.java | 26 + Code/Java/Func_loop.java | 19 + Code/JavaScript/func_clock.html | 39 + Code/JavaScript/func_slow.html | 31 + Code/Perl/func_abc.pl | 20 + Code/Perl/func_malloc.pl | 18 + Code/Perl/func_slow.pl | 20 + Code/Perl/hello.pl | 3 + Code/Perl/hello_strict.pl | 5 + Code/Php/func_abc.php | 23 + Code/Python/func_abc.py | 19 + Code/Python/func_slow.py | 26 + Code/Readme | 16 + Code/Ruby/func_abc.rb | 20 + Code/Ruby/func_slow.rb | 32 + Code/Shell/func_abc.sh | 23 + Code/Shell/func_slow.sh | 35 + Code/Shell/func_waste.sh | 23 + Code/Tcl/func_abc.tcl | 20 + Code/Tcl/func_slow.tcl | 29 + Cpu/Readme | 3 + Cpu/cputypes.d | 66 ++ Cpu/cpuwalk.d | 72 ++ Cpu/dispqlen.d | 52 + Cpu/intbycpu.d | 49 + Cpu/intoncpu.d | 66 ++ Cpu/inttimes.d | 73 ++ Cpu/loads.d | 58 + Cpu/runocc.d | 56 + Cpu/xcallsbypid.d | 51 + Disk/Readme | 3 + Disk/bitesize.d | 81 ++ Disk/diskhits | 113 ++ Disk/hotspot.d | 71 ++ Disk/iofile.d | 79 ++ Disk/iofileb.d | 59 + Disk/iopending | 261 +++++ Disk/seeksize.d | 85 ++ Docs/Contents | 152 +++ Docs/Examples | 1 + Docs/Faq | 126 +++ Docs/History | 249 +++++ Docs/Index | 1 + Docs/Links | 30 + Docs/Maintainer | 6 + Docs/Notes | 1 + Docs/Readme | 21 + Docs/ToDo | 7 + Docs/Who | 74 ++ Docs/cddl1.txt | 385 +++++++ Docs/oneliners.txt | 81 ++ Examples/Copyright | 1 + Examples/Readme | 21 + Examples/anonpgpid_example.txt | 73 ++ Examples/bitesize_example.txt | 74 ++ Examples/connections_example.txt | 23 + Examples/cpudists_example.txt | 276 +++++ Examples/cputimes_example.txt | 210 ++++ Examples/cputypes_example.txt | 40 + Examples/cpuwalk_example.txt | 85 ++ Examples/crash_example.txt | 68 ++ Examples/creatbyproc_example.txt | 23 + Examples/cswstat_example.txt | 25 + Examples/dappprof_example.txt | 71 ++ Examples/dapptrace_example.txt | 215 ++++ Examples/dexplorer_example.txt | 95 ++ Examples/diskhits_example.txt | 107 ++ Examples/dispqlen_example.txt | 62 ++ Examples/dnlcps_example.txt | 47 + Examples/dnlcsnoop_example.txt | 88 ++ Examples/dnlcstat_example.txt | 40 + Examples/dtruss_example.txt | 120 +++ Examples/dvmstat_example.txt | 91 ++ Examples/errinfo_example.txt | 90 ++ Examples/execsnoop_example.txt | 78 ++ Examples/fddist_example.txt | 38 + Examples/filebyproc_example.txt | 27 + Examples/fspaging_example.txt | 32 + Examples/fsrw_example.txt | 129 +++ Examples/guess_example.txt | 39 + Examples/hotkernel_example.txt | 153 +++ Examples/hotspot_example.txt | 34 + Examples/hotuser_example.txt | 107 ++ Examples/httpdstat_example.txt | 36 + Examples/icmpstat_example.txt | 29 + Examples/intbycpu_example.txt | 11 + Examples/intoncpu_example.txt | 93 ++ Examples/inttimes_example.txt | 18 + Examples/iofile_example.txt | 35 + Examples/iofileb_example.txt | 23 + Examples/iopattern_example.txt | 57 + Examples/iopending_example.txt | 126 +++ Examples/iosnoop_example.txt | 39 + Examples/iotop_example.txt | 142 +++ Examples/j_calldist_example.txt | 247 +++++ Examples/j_calls_example.txt | 137 +++ Examples/j_calltime_example.txt | 67 ++ Examples/j_classflow_example.txt | 89 ++ Examples/j_cpudist_example.txt | 252 +++++ Examples/j_cputime_example.txt | 75 ++ Examples/j_events_example.txt | 134 +++ Examples/j_flow_example.txt | 1292 ++++++++++++++++++++++ Examples/j_flowtime_example.txt | 1287 ++++++++++++++++++++++ Examples/j_methodcalls_example.txt | 999 +++++++++++++++++ Examples/j_objnew_example.txt | 1460 +++++++++++++++++++++++++ Examples/j_package_example.txt | 44 + Examples/j_profile_example.txt | 209 ++++ Examples/j_stat_example.txt | 33 + Examples/j_syscalls_example.txt | 165 +++ Examples/j_syscolors_example.txt | 1550 +++++++++++++++++++++++++++ Examples/j_thread_example.txt | 20 + Examples/j_who_example.txt | 17 + Examples/js_calldist_example.txt | 110 ++ Examples/js_calls_example.txt | 312 ++++++ Examples/js_calltime_example.txt | 60 ++ Examples/js_cpudist_example.txt | 112 ++ Examples/js_cputime_example.txt | 69 ++ Examples/js_execs_example.txt | 15 + Examples/js_flow_example.txt | 41 + Examples/js_flowinfo_example.txt | 42 + Examples/js_flowtime_example.txt | 42 + Examples/js_objcpu_example.txt | 317 ++++++ Examples/js_objgc_example.txt | 230 ++++ Examples/js_objnew_example.txt | 100 ++ Examples/js_stat_example.txt | 35 + Examples/js_who_example.txt | 59 + Examples/kill_example.txt | 12 + Examples/kstat_types_example.txt | 1358 +++++++++++++++++++++++ Examples/lastwords_example.txt | 81 ++ Examples/loads_example.txt | 19 + Examples/lockbydist_example.txt | 114 ++ Examples/lockbyproc_example.txt | 42 + Examples/minfbypid_example.txt | 20 + Examples/minfbyproc_example.txt | 14 + Examples/mmapfiles_example.txt | 109 ++ Examples/modcalls_example.txt | 47 + Examples/newproc_example.txt | 19 + Examples/nfswizard_example.txt | 67 ++ Examples/oneliners_examples.txt | 307 ++++++ Examples/opensnoop_example.txt | 110 ++ Examples/pathopens_example.txt | 32 + Examples/pfilestat_example.txt | 200 ++++ Examples/pgpginbypid_example.txt | 14 + Examples/pgpginbyproc_example.txt | 13 + Examples/php_calldist_example.txt | 84 ++ Examples/php_calltime_example.txt | 51 + Examples/php_cpudist_example.txt | 84 ++ Examples/php_cputime_example.txt | 58 + Examples/php_flow_example.txt | 36 + Examples/php_flowinfo_example.txt | 40 + Examples/php_flowtime_example.txt | 41 + Examples/php_funccalls_example.txt | 17 + Examples/php_malloc_example.txt | 23 + Examples/php_syscalls_example.txt | 22 + Examples/php_syscolors_example.txt | 63 ++ Examples/php_who_example.txt | 10 + Examples/pidpersec_example.txt | 33 + Examples/pl_calldist_example.txt | 456 ++++++++ Examples/pl_calltime_example.txt | 150 +++ Examples/pl_cpudist_example.txt | 470 ++++++++ Examples/pl_cputime_example.txt | 151 +++ Examples/pl_flow_example.txt | 179 ++++ Examples/pl_flowinfo_example.txt | 188 ++++ Examples/pl_flowtime_example.txt | 199 ++++ Examples/pl_malloc_example.txt | 79 ++ Examples/pl_subcalls_example.txt | 53 + Examples/pl_syscalls_example.txt | 50 + Examples/pl_syscolors_example.txt | 183 ++++ Examples/pl_who_example.txt | 41 + Examples/priclass_example.txt | 82 ++ Examples/pridist_example.txt | 238 ++++ Examples/procsystime_example.txt | 149 +++ Examples/putnexts_example.txt | 520 +++++++++ Examples/py_calldist_example.txt | 966 +++++++++++++++++ Examples/py_calltime_example.txt | 255 +++++ Examples/py_cpudist_example.txt | 966 +++++++++++++++++ Examples/py_cputime_example.txt | 262 +++++ Examples/py_flow_example.txt | 485 +++++++++ Examples/py_flowinfo_example.txt | 485 +++++++++ Examples/py_flowtime_example.txt | 487 +++++++++ Examples/py_funccalls_example.txt | 89 ++ Examples/py_malloc_example.txt | 508 +++++++++ Examples/py_mallocstk_example.txt | 314 ++++++ Examples/py_profile_example.txt | 399 +++++++ Examples/py_syscalls_example.txt | 129 +++ Examples/py_syscolors_example.txt | 584 ++++++++++ Examples/py_who_example.txt | 34 + Examples/rb_calldist_example.txt | 153 +++ Examples/rb_calls_example.txt | 29 + Examples/rb_calltime_example.txt | 77 ++ Examples/rb_cpudist_example.txt | 199 ++++ Examples/rb_cputime_example.txt | 81 ++ Examples/rb_flow_example.txt | 54 + Examples/rb_flowinfo_example.txt | 54 + Examples/rb_flowtime_example.txt | 56 + Examples/rb_funccalls_example.txt | 25 + Examples/rb_lines_example.txt | 30 + Examples/rb_malloc_example.txt | 120 +++ Examples/rb_objcpu_example.txt | 51 + Examples/rb_objnew_example.txt | 21 + Examples/rb_stat_example.txt | 22 + Examples/rb_syscalls_example.txt | 54 + Examples/rb_syscolors_example.txt | 331 ++++++ Examples/rb_who_example.txt | 20 + Examples/readbytes_example.txt | 22 + Examples/readdist_example.txt | 35 + Examples/rfileio_example.txt | 94 ++ Examples/rfsio_example.txt | 82 ++ Examples/runocc_example.txt | 53 + Examples/rwbbypid_example.txt | 26 + Examples/rwbypid_example.txt | 19 + Examples/rwbytype_example.txt | 37 + Examples/rwsnoop_example.txt | 98 ++ Examples/rwtop_example.txt | 59 + Examples/sampleproc_example.txt | 62 ++ Examples/sar-c_example.txt | 55 + Examples/seeksize_example.txt | 197 ++++ Examples/setuids_example.txt | 28 + Examples/sh_calldist_example.txt | 309 ++++++ Examples/sh_calls_example.txt | 60 ++ Examples/sh_calltime_example.txt | 144 +++ Examples/sh_cpudist_example.txt | 92 ++ Examples/sh_cputime_example.txt | 131 +++ Examples/sh_flow_example.txt | 129 +++ Examples/sh_flowinfo_example.txt | 242 +++++ Examples/sh_flowtime_example.txt | 131 +++ Examples/sh_lines_example.txt | 32 + Examples/sh_pidcolors_example.txt | 574 ++++++++++ Examples/sh_stat_example.txt | 44 + Examples/sh_syscalls_example.txt | 59 + Examples/sh_syscolors_example.txt | 328 ++++++ Examples/sh_wasted_example.txt | 45 + Examples/sh_who_example.txt | 45 + Examples/shellsnoop_example.txt | 112 ++ Examples/shortlived_example.txt | 57 + Examples/sigdist_example.txt | 18 + Examples/stacksize_example.txt | 87 ++ Examples/statsnoop_example.txt | 94 ++ Examples/swapinfo_example.txt | 22 + Examples/sysbypid_example.txt | 45 + Examples/syscallbypid_example.txt | 50 + Examples/syscallbyproc_example.txt | 17 + Examples/syscallbysysc_example.txt | 24 + Examples/tcl_calldist_example.txt | 166 +++ Examples/tcl_calls_example.txt | 41 + Examples/tcl_calltime_example.txt | 61 ++ Examples/tcl_cpudist_example.txt | 164 +++ Examples/tcl_cputime_example.txt | 67 ++ Examples/tcl_flow_example.txt | 195 ++++ Examples/tcl_flowtime_example.txt | 197 ++++ Examples/tcl_ins_example.txt | 46 + Examples/tcl_insflow_example.txt | 997 +++++++++++++++++ Examples/tcl_proccalls_example.txt | 17 + Examples/tcl_procflow_example.txt | 29 + Examples/tcl_stat_example.txt | 24 + Examples/tcl_syscalls_example.txt | 66 ++ Examples/tcl_syscolors_example.txt | 563 ++++++++++ Examples/tcl_who_example.txt | 17 + Examples/tcpsnoop_d_example.txt | 41 + Examples/tcpsnoop_example.txt | 61 ++ Examples/tcpsnoop_snv_d_example.txt | 1 + Examples/tcpsnoop_snv_example.txt | 1 + Examples/tcpstat_example.txt | 22 + Examples/tcptop_example.txt | 28 + Examples/tcptop_snv_example.txt | 1 + Examples/tcpwdist_example.txt | 70 ++ Examples/threaded_example.txt | 108 ++ Examples/topsyscall_example.txt | 65 ++ Examples/topsysproc_example.txt | 56 + Examples/udpstat_example.txt | 39 + Examples/uname-a_example.txt | 15 + Examples/vmbypid_example.txt | 32 + Examples/vmstat-p_example.txt | 51 + Examples/vmstat_example.txt | 45 + Examples/vopstat_example.txt | 89 ++ Examples/weblatency_example.txt | 127 +++ Examples/whatexec_example.txt | 18 + Examples/woof_example.txt | 28 + Examples/wpm_example.txt | 57 + Examples/writebytes_example.txt | 26 + Examples/writedist_example.txt | 38 + Examples/xcallsbypid_example.txt | 17 + Examples/xvmstat_example.txt | 44 + Examples/zvmstat_example.txt | 34 + FS/Readme | 3 + FS/fspaging.d | 154 +++ FS/fsrw.d | 149 +++ FS/rfileio.d | 91 ++ FS/rfsio.d | 98 ++ FS/vopstat | 304 ++++++ Guide | 91 ++ Include/Readme | 18 + Include/test.ksh | 68 ++ Include/time.h | 38 + Include/tostr.h | 89 ++ Java/Readme | 17 + Java/j_calldist.d | 116 ++ Java/j_calls.d | 113 ++ Java/j_calltime.d | 129 +++ Java/j_classflow.d | 100 ++ Java/j_cpudist.d | 116 ++ Java/j_cputime.d | 129 +++ Java/j_events.d | 56 + Java/j_flow.d | 87 ++ Java/j_flowtime.d | 101 ++ Java/j_methodcalls.d | 60 ++ Java/j_objnew.d | 61 ++ Java/j_package.d | 56 + Java/j_profile.d | 78 ++ Java/j_stat.d | 148 +++ Java/j_syscalls.d | 68 ++ Java/j_syscolors.d | 135 +++ Java/j_thread.d | 64 ++ Java/j_who.d | 58 + JavaScript/Readme | 54 + JavaScript/js_calldist.d | 101 ++ JavaScript/js_calls.d | 76 ++ JavaScript/js_calltime.d | 115 ++ JavaScript/js_cpudist.d | 101 ++ JavaScript/js_cputime.d | 115 ++ JavaScript/js_execs.d | 51 + JavaScript/js_flow.d | 69 ++ JavaScript/js_flowinfo.d | 86 ++ JavaScript/js_flowtime.d | 84 ++ JavaScript/js_objcpu.d | 61 ++ JavaScript/js_objgc.d | 89 ++ JavaScript/js_objnew.d | 55 + JavaScript/js_stat.d | 120 +++ JavaScript/js_who.d | 56 + Kernel/Readme | 3 + Kernel/cpudists | 184 ++++ Kernel/cputimes | 203 ++++ Kernel/cswstat.d | 74 ++ Kernel/dnlcps.d | 68 ++ Kernel/dnlcsnoop.d | 92 ++ Kernel/dnlcstat | 162 +++ Kernel/kstat_types.d | 66 ++ Kernel/modcalls.d | 10 + Kernel/priclass.d | 67 ++ Kernel/pridist.d | 66 ++ Kernel/putnexts.d | 38 + Kernel/whatexec.d | 79 ++ License | 1 + Locks/lockbydist.d | 10 + Locks/lockbyproc.d | 10 + Man/Readme | 40 + Man/man1m/anonpgpid.d.1m | 54 + Man/man1m/bitesize.d.1m | 57 + Man/man1m/connections.1m | 77 ++ Man/man1m/cpudists.1m | 86 ++ Man/man1m/cputimes.1m | 87 ++ Man/man1m/cputypes.d.1m | 54 + Man/man1m/cpuwalk.d.1m | 53 + Man/man1m/crash.d.1m | 81 ++ Man/man1m/creatbyproc.d.1m | 55 + Man/man1m/cswstat.d.1m | 51 + Man/man1m/dappprof.1m | 98 ++ Man/man1m/dapptrace.1m | 112 ++ Man/man1m/dexplorer.1m | 64 ++ Man/man1m/diskhits.1m | 46 + Man/man1m/dispqlen.d.1m | 36 + Man/man1m/dnlcps.d.1m | 51 + Man/man1m/dnlcsnoop.d.1m | 52 + Man/man1m/dnlcstat.1m | 57 + Man/man1m/dtruss.1m | 123 +++ Man/man1m/dvmstat.1m | 93 ++ Man/man1m/errinfo.1m | 85 ++ Man/man1m/execsnoop.1m | 108 ++ Man/man1m/fddist.1m | 63 ++ Man/man1m/filebyproc.d.1m | 56 + Man/man1m/fspaging.d.1m | 88 ++ Man/man1m/fsrw.d.1m | 80 ++ Man/man1m/guess.d.1m | 37 + Man/man1m/hotkernel.1m | 39 + Man/man1m/hotspot.d.1m | 51 + Man/man1m/hotuser.1m | 44 + Man/man1m/httpdstat.d.1m | 67 ++ Man/man1m/icmpstat.d.1m | 47 + Man/man1m/intbycpu.d.1m | 48 + Man/man1m/intoncpu.d.1m | 42 + Man/man1m/inttimes.d.1m | 43 + Man/man1m/iofile.d.1m | 49 + Man/man1m/iofileb.d.1m | 46 + Man/man1m/iopattern.1m | 112 ++ Man/man1m/iopending.1m | 89 ++ Man/man1m/iosnoop.1m | 167 +++ Man/man1m/iotop.1m | 154 +++ Man/man1m/j_calldist.d.1m | 48 + Man/man1m/j_calls.d.1m | 57 + Man/man1m/j_calltime.d.1m | 51 + Man/man1m/j_classflow.d.1m | 63 ++ Man/man1m/j_cpudist.d.1m | 48 + Man/man1m/j_cputime.d.1m | 51 + Man/man1m/j_events.d.1m | 46 + Man/man1m/j_flow.d.1m | 63 ++ Man/man1m/j_flowtime.d.1m | 69 ++ Man/man1m/j_methodcalls.d.1m | 45 + Man/man1m/j_objnew.d.1m | 45 + Man/man1m/j_package.d.1m | 44 + Man/man1m/j_profile.d.1m | 52 + Man/man1m/j_stat.d.1m | 68 ++ Man/man1m/j_syscalls.d.1m | 48 + Man/man1m/j_syscolors.d.1m | 65 ++ Man/man1m/j_thread.d.1m | 54 + Man/man1m/j_who.d.1m | 51 + Man/man1m/js_calldist.d.1m | 46 + Man/man1m/js_calls.d.1m | 49 + Man/man1m/js_calltime.d.1m | 49 + Man/man1m/js_cpudist.d.1m | 46 + Man/man1m/js_cputime.d.1m | 49 + Man/man1m/js_execs.d.1m | 46 + Man/man1m/js_flow.d.1m | 59 + Man/man1m/js_flowinfo.d.1m | 68 ++ Man/man1m/js_flowtime.d.1m | 62 ++ Man/man1m/js_objcpu.d.1m | 36 + Man/man1m/js_objgc.d.1m | 60 ++ Man/man1m/js_objnew.d.1m | 46 + Man/man1m/js_stat.d.1m | 52 + Man/man1m/js_who.d.1m | 49 + Man/man1m/kill.d.1m | 53 + Man/man1m/kstat_types.d.1m | 50 + Man/man1m/lastwords.1m | 56 + Man/man1m/loads.d.1m | 38 + Man/man1m/lockbydist.d.1m | 54 + Man/man1m/lockbyproc.d.1m | 47 + Man/man1m/minfbypid.d.1m | 46 + Man/man1m/minfbyproc.d.1m | 47 + Man/man1m/mmapfiles.d.1m | 42 + Man/man1m/modcalls.d.1m | 50 + Man/man1m/newproc.d.1m | 54 + Man/man1m/nfswizard.d.1m | 36 + Man/man1m/opensnoop.1m | 139 +++ Man/man1m/pathopens.d.1m | 38 + Man/man1m/pfilestat.1m | 87 ++ Man/man1m/pgpginbypid.d.1m | 47 + Man/man1m/pgpginbyproc.d.1m | 50 + Man/man1m/php_calldist.d.1m | 49 + Man/man1m/php_calltime.d.1m | 49 + Man/man1m/php_cpudist.d.1m | 49 + Man/man1m/php_cputime.d.1m | 49 + Man/man1m/php_flow.d.1m | 60 ++ Man/man1m/php_flowinfo.d.1m | 68 ++ Man/man1m/php_flowtime.d.1m | 65 ++ Man/man1m/php_funccalls.d.1m | 43 + Man/man1m/php_malloc.d.1m | 39 + Man/man1m/php_syscalls.d.1m | 54 + Man/man1m/php_syscolors.d.1m | 61 ++ Man/man1m/php_who.d.1m | 49 + Man/man1m/pidpersec.d.1m | 42 + Man/man1m/pl_calldist.d.1m | 49 + Man/man1m/pl_calltime.d.1m | 49 + Man/man1m/pl_cpudist.d.1m | 49 + Man/man1m/pl_cputime.d.1m | 49 + Man/man1m/pl_flow.d.1m | 60 ++ Man/man1m/pl_flowinfo.d.1m | 68 ++ Man/man1m/pl_flowtime.d.1m | 65 ++ Man/man1m/pl_malloc.d.1m | 39 + Man/man1m/pl_subcalls.d.1m | 43 + Man/man1m/pl_syscalls.d.1m | 49 + Man/man1m/pl_syscolors.d.1m | 61 ++ Man/man1m/pl_who.d.1m | 49 + Man/man1m/priclass.d.1m | 66 ++ Man/man1m/pridist.d.1m | 55 + Man/man1m/procsystime.1m | 108 ++ Man/man1m/putnexts.d.1m | 27 + Man/man1m/py_calldist.d.1m | 49 + Man/man1m/py_calltime.d.1m | 49 + Man/man1m/py_cpudist.d.1m | 49 + Man/man1m/py_cputime.d.1m | 49 + Man/man1m/py_flow.d.1m | 60 ++ Man/man1m/py_flowinfo.d.1m | 68 ++ Man/man1m/py_flowtime.d.1m | 65 ++ Man/man1m/py_funccalls.d.1m | 43 + Man/man1m/py_malloc.d.1m | 39 + Man/man1m/py_mallocstk.d.1m | 33 + Man/man1m/py_profile.d.1m | 54 + Man/man1m/py_syscalls.d.1m | 49 + Man/man1m/py_syscolors.d.1m | 61 ++ Man/man1m/py_who.d.1m | 49 + Man/man1m/rb_calldist.d.1m | 49 + Man/man1m/rb_calls.d.1m | 49 + Man/man1m/rb_calltime.d.1m | 49 + Man/man1m/rb_cpudist.d.1m | 49 + Man/man1m/rb_cputime.d.1m | 49 + Man/man1m/rb_flow.d.1m | 59 + Man/man1m/rb_flowinfo.d.1m | 68 ++ Man/man1m/rb_flowtime.d.1m | 62 ++ Man/man1m/rb_funccalls.d.1m | 46 + Man/man1m/rb_lines.d.1m | 46 + Man/man1m/rb_malloc.d.1m | 47 + Man/man1m/rb_objcpu.d.1m | 36 + Man/man1m/rb_objnew.d.1m | 46 + Man/man1m/rb_stat.d.1m | 66 ++ Man/man1m/rb_syscalls.d.1m | 49 + Man/man1m/rb_syscolors.d.1m | 61 ++ Man/man1m/rb_who.d.1m | 49 + Man/man1m/readbytes.d.1m | 47 + Man/man1m/readdist.d.1m | 54 + Man/man1m/rfileio.d.1m | 41 + Man/man1m/rfsio.d.1m | 41 + Man/man1m/runocc.d.1m | 46 + Man/man1m/rwbbypid.d.1m | 48 + Man/man1m/rwbypid.d.1m | 48 + Man/man1m/rwbytype.d.1m | 54 + Man/man1m/rwsnoop.1m | 104 ++ Man/man1m/rwtop.1m | 115 ++ Man/man1m/sampleproc.1m | 55 + Man/man1m/sar-c.d.1m | 62 ++ Man/man1m/seeksize.d.1m | 51 + Man/man1m/setuids.d.1m | 53 + Man/man1m/sh_calldist.d.1m | 49 + Man/man1m/sh_calls.d.1m | 49 + Man/man1m/sh_calltime.d.1m | 49 + Man/man1m/sh_cpudist.d.1m | 49 + Man/man1m/sh_cputime.d.1m | 49 + Man/man1m/sh_flow.d.1m | 66 ++ Man/man1m/sh_flowinfo.d.1m | 62 ++ Man/man1m/sh_flowtime.d.1m | 76 ++ Man/man1m/sh_lines.d.1m | 46 + Man/man1m/sh_pidcolors.d.1m | 70 ++ Man/man1m/sh_stat.d.1m | 59 + Man/man1m/sh_syscalls.d.1m | 49 + Man/man1m/sh_syscolors.d.1m | 63 ++ Man/man1m/sh_wasted.d.1m | 49 + Man/man1m/sh_who.d.1m | 49 + Man/man1m/shellsnoop.1m | 99 ++ Man/man1m/shortlived.d.1m | 37 + Man/man1m/sigdist.d.1m | 50 + Man/man1m/stacksize.d.1m | 42 + Man/man1m/statsnoop.1m | 140 +++ Man/man1m/swapinfo.d.1m | 88 ++ Man/man1m/sysbypid.d.1m | 50 + Man/man1m/syscallbypid.d.1m | 50 + Man/man1m/syscallbyproc.d.1m | 50 + Man/man1m/syscallbysysc.d.1m | 47 + Man/man1m/tcl_calldist.d.1m | 47 + Man/man1m/tcl_calls.d.1m | 68 ++ Man/man1m/tcl_calltime.d.1m | 50 + Man/man1m/tcl_cpudist.d.1m | 47 + Man/man1m/tcl_cputime.d.1m | 50 + Man/man1m/tcl_flow.d.1m | 66 ++ Man/man1m/tcl_flowtime.d.1m | 69 ++ Man/man1m/tcl_ins.d.1m | 50 + Man/man1m/tcl_insflow.d.1m | 69 ++ Man/man1m/tcl_proccalls.d.1m | 44 + Man/man1m/tcl_procflow.d.1m | 60 ++ Man/man1m/tcl_stat.d.1m | 61 ++ Man/man1m/tcl_syscalls.d.1m | 47 + Man/man1m/tcl_syscolors.d.1m | 59 + Man/man1m/tcl_who.d.1m | 54 + Man/man1m/tcpsnoop.1m | 116 ++ Man/man1m/tcpsnoop.d.1m | 68 ++ Man/man1m/tcpsnoop_snv.1m | 116 ++ Man/man1m/tcpsnoop_snv.d.1m | 68 ++ Man/man1m/tcpstat.d.1m | 58 + Man/man1m/tcptop.1m | 111 ++ Man/man1m/tcptop_snv.1m | 111 ++ Man/man1m/tcpwdist.d.1m | 60 ++ Man/man1m/threaded.d.1m | 50 + Man/man1m/topsyscall.1m | 73 ++ Man/man1m/topsysproc.1m | 75 ++ Man/man1m/udpstat.d.1m | 55 + Man/man1m/uname-a.d.1m | 35 + Man/man1m/vmbypid.d.1m | 50 + Man/man1m/vmstat-p.d.1m | 85 ++ Man/man1m/vmstat.d.1m | 79 ++ Man/man1m/vopstat.1m | 77 ++ Man/man1m/weblatency.d.1m | 63 ++ Man/man1m/whatexec.d.1m | 53 + Man/man1m/woof.d.1m | 46 + Man/man1m/wpm.d.1m | 34 + Man/man1m/writebytes.d.1m | 47 + Man/man1m/writedist.d.1m | 54 + Man/man1m/xcallsbypid.d.1m | 46 + Man/man1m/xvmstat.1m | 104 ++ Man/man1m/zvmstat.1m | 101 ++ Mem/Readme | 3 + Mem/anonpgpid.d | 75 ++ Mem/minfbypid.d | 57 + Mem/minfbyproc.d | 10 + Mem/pgpginbypid.d | 53 + Mem/pgpginbyproc.d | 10 + Mem/swapinfo.d | 149 +++ Mem/vmbypid.d | 54 + Mem/vmstat-p.d | 155 +++ Mem/vmstat.d | 137 +++ Mem/xvmstat | 217 ++++ Misc/Readme | 5 + Misc/guess.d | 118 ++ Misc/woof.d | 63 ++ Misc/wpm.d | 143 +++ Net/Readme | 4 + Net/connections | 178 +++ Net/icmpstat.d | 61 ++ Net/tcpsnoop | 581 ++++++++++ Net/tcpsnoop.d | 424 ++++++++ Net/tcpsnoop_snv | 583 ++++++++++ Net/tcpsnoop_snv.d | 426 ++++++++ Net/tcpstat.d | 91 ++ Net/tcptop | 579 ++++++++++ Net/tcptop_snv | 581 ++++++++++ Net/tcpwdist.d | 82 ++ Net/udpstat.d | 92 ++ Notes/ALLcolors_notes.txt | 127 +++ Notes/ALLelapsed_notes.txt | 46 + Notes/ALLexclusive_notes.txt | 78 ++ Notes/ALLfbt_notes.txt | 77 ++ Notes/ALLflow_notes.txt | 64 ++ Notes/ALLinclusive_notes.txt | 74 ++ Notes/ALLjava_notes.txt | 35 + Notes/ALLoncpu_notes.txt | 42 + Notes/ALLoverhead.txt | 96 ++ Notes/ALLperl_notes.txt | 44 + Notes/ALLsnoop_notes.txt | 94 ++ Notes/Readme | 21 + Notes/cputimes_notes.txt | 138 +++ Notes/dappprof_notes.txt | 14 + Notes/dapptrace_notes.txt | 19 + Notes/dtruss_notes.txt | 97 ++ Notes/iosnoop_notes.txt | 99 ++ Notes/iotop_notes.txt | 48 + Notes/procsystime_notes.txt | 14 + Perl/Readme | 38 + Perl/pl_calldist.d | 82 ++ Perl/pl_calltime.d | 89 ++ Perl/pl_cpudist.d | 82 ++ Perl/pl_cputime.d | 89 ++ Perl/pl_flow.d | 70 ++ Perl/pl_flowinfo.d | 86 ++ Perl/pl_flowtime.d | 88 ++ Perl/pl_malloc.d | 81 ++ Perl/pl_subcalls.d | 55 + Perl/pl_syscalls.d | 65 ++ Perl/pl_syscolors.d | 119 ++ Perl/pl_who.d | 56 + Php/Readme | 39 + Php/php_calldist.d | 83 ++ Php/php_calltime.d | 90 ++ Php/php_cpudist.d | 83 ++ Php/php_cputime.d | 90 ++ Php/php_flow.d | 72 ++ Php/php_flowinfo.d | 88 ++ Php/php_flowtime.d | 91 ++ Php/php_funccalls.d | 56 + Php/php_malloc.d | 82 ++ Php/php_syscalls.d | 75 ++ Php/php_syscolors.d | 116 ++ Php/php_who.d | 56 + Proc/Readme | 3 + Proc/crash.d | 181 ++++ Proc/creatbyproc.d | 10 + Proc/dappprof | 239 +++++ Proc/dapptrace | 259 +++++ Proc/fddist | 116 ++ Proc/filebyproc.d | 10 + Proc/kill.d | 63 ++ Proc/lastwords | 90 ++ Proc/mmapfiles.d | 62 ++ Proc/newproc.d | 10 + Proc/pathopens.d | 100 ++ Proc/pfilestat | 282 +++++ Proc/pidpersec.d | 57 + Proc/readbytes.d | 10 + Proc/readdist.d | 10 + Proc/rwbbypid.d | 61 ++ Proc/rwbypid.d | 61 ++ Proc/rwbytype.d | 101 ++ Proc/sampleproc | 105 ++ Proc/shortlived.d | 118 ++ Proc/sigdist.d | 61 ++ Proc/stacksize.d | 95 ++ Proc/sysbypid.d | 53 + Proc/syscallbypid.d | 54 + Proc/syscallbyproc.d | 10 + Proc/threaded.d | 66 ++ Proc/topsysproc | 121 +++ Proc/writebytes.d | 10 + Proc/writedist.d | 10 + Python/Readme | 28 + Python/py_calldist.d | 82 ++ Python/py_calltime.d | 89 ++ Python/py_cpudist.d | 82 ++ Python/py_cputime.d | 89 ++ Python/py_flow.d | 70 ++ Python/py_flowinfo.d | 86 ++ Python/py_flowtime.d | 89 ++ Python/py_funccalls.d | 55 + Python/py_malloc.d | 81 ++ Python/py_mallocstk.d | 49 + Python/py_profile.d | 79 ++ Python/py_syscalls.d | 63 ++ Python/py_syscolors.d | 116 ++ Python/py_who.d | 56 + README | 1 + Ruby/Readme | 31 + Ruby/rb_calldist.d | 120 +++ Ruby/rb_calls.d | 87 ++ Ruby/rb_calltime.d | 129 +++ Ruby/rb_cpudist.d | 120 +++ Ruby/rb_cputime.d | 129 +++ Ruby/rb_flow.d | 72 ++ Ruby/rb_flowinfo.d | 88 ++ Ruby/rb_flowtime.d | 84 ++ Ruby/rb_funccalls.d | 57 + Ruby/rb_lines.d | 55 + Ruby/rb_malloc.d | 80 ++ Ruby/rb_objcpu.d | 61 ++ Ruby/rb_objnew.d | 55 + Ruby/rb_stat.d | 146 +++ Ruby/rb_syscalls.d | 66 ++ Ruby/rb_syscolors.d | 133 +++ Ruby/rb_who.d | 56 + Shell/Readme | 35 + Shell/sh_calldist.d | 119 ++ Shell/sh_calls.d | 72 ++ Shell/sh_calltime.d | 136 +++ Shell/sh_cpudist.d | 142 +++ Shell/sh_cputime.d | 158 +++ Shell/sh_flow.d | 85 ++ Shell/sh_flowinfo.d | 152 +++ Shell/sh_flowtime.d | 118 ++ Shell/sh_lines.d | 55 + Shell/sh_pidcolors.d | 203 ++++ Shell/sh_stat.d | 133 +++ Shell/sh_syscalls.d | 83 ++ Shell/sh_syscolors.d | 169 +++ Shell/sh_wasted.d | 101 ++ Shell/sh_who.d | 56 + Snippits/Readme | 11 + Snippits/fd2pathname.txt | 32 + System/Readme | 3 + System/sar-c.d | 101 ++ System/syscallbysysc.d | 10 + System/topsyscall | 184 ++++ System/uname-a.d | 53 + Tcl/Readme | 39 + Tcl/tcl_calldist.d | 111 ++ Tcl/tcl_calls.d | 63 ++ Tcl/tcl_calltime.d | 123 +++ Tcl/tcl_cpudist.d | 111 ++ Tcl/tcl_cputime.d | 123 +++ Tcl/tcl_flow.d | 86 ++ Tcl/tcl_flowtime.d | 105 ++ Tcl/tcl_ins.d | 57 + Tcl/tcl_insflow.d | 123 +++ Tcl/tcl_proccalls.d | 53 + Tcl/tcl_procflow.d | 70 ++ Tcl/tcl_stat.d | 137 +++ Tcl/tcl_syscalls.d | 66 ++ Tcl/tcl_syscolors.d | 139 +++ Tcl/tcl_who.d | 62 ++ User/Readme | 3 + User/setuids.d | 82 ++ Version | 1 + Zones/Readme | 3 + Zones/zvmstat | 277 +++++ dexplorer | 547 ++++++++++ dvmstat | 250 +++++ errinfo | 180 ++++ execsnoop | 174 +++ hotkernel | 125 +++ hotuser | 139 +++ install | 151 +++ iopattern | 277 +++++ iosnoop | 367 +++++++ iotop | 422 ++++++++ opensnoop | 244 +++++ procsystime | 233 ++++ rwsnoop | 234 ++++ rwtop | 292 +++++ statsnoop | 286 +++++ 1006 files changed, 77925 insertions(+) create mode 100644 Apps/Readme create mode 100755 Apps/httpdstat.d create mode 100755 Apps/nfswizard.d create mode 100755 Apps/shellsnoop create mode 100755 Apps/weblatency.d create mode 120000 Bin/anonpgpid.d create mode 120000 Bin/bitesize.d create mode 120000 Bin/connections create mode 120000 Bin/cpudists create mode 120000 Bin/cputimes create mode 120000 Bin/cputypes.d create mode 120000 Bin/cpuwalk.d create mode 120000 Bin/crash.d create mode 120000 Bin/creatbyproc.d create mode 120000 Bin/cswstat.d create mode 120000 Bin/dappprof create mode 120000 Bin/dapptrace create mode 120000 Bin/dexplorer create mode 120000 Bin/diskhits create mode 120000 Bin/dispqlen.d create mode 120000 Bin/dnlcps.d create mode 120000 Bin/dnlcsnoop.d create mode 120000 Bin/dnlcstat create mode 120000 Bin/dtruss create mode 120000 Bin/dvmstat create mode 120000 Bin/errinfo create mode 120000 Bin/execsnoop create mode 120000 Bin/fddist create mode 120000 Bin/filebyproc.d create mode 120000 Bin/fspaging.d create mode 120000 Bin/fsrw.d create mode 120000 Bin/guess.d create mode 120000 Bin/hotkernel create mode 120000 Bin/hotspot.d create mode 120000 Bin/hotuser create mode 120000 Bin/httpdstat.d create mode 120000 Bin/icmpstat.d create mode 120000 Bin/intbycpu.d create mode 120000 Bin/intoncpu.d create mode 120000 Bin/inttimes.d create mode 120000 Bin/iofile.d create mode 120000 Bin/iofileb.d create mode 120000 Bin/iopattern create mode 120000 Bin/iopending create mode 120000 Bin/iosnoop create mode 120000 Bin/iotop create mode 120000 Bin/j_calldist.d create mode 120000 Bin/j_calls.d create mode 120000 Bin/j_calltime.d create mode 120000 Bin/j_classflow.d create mode 120000 Bin/j_cpudist.d create mode 120000 Bin/j_cputime.d create mode 120000 Bin/j_events.d create mode 120000 Bin/j_flow.d create mode 120000 Bin/j_flowtime.d create mode 120000 Bin/j_methodcalls.d create mode 120000 Bin/j_objnew.d create mode 120000 Bin/j_package.d create mode 120000 Bin/j_profile.d create mode 120000 Bin/j_stat.d create mode 120000 Bin/j_syscalls.d create mode 120000 Bin/j_syscolors.d create mode 120000 Bin/j_thread.d create mode 120000 Bin/j_who.d create mode 120000 Bin/js_calldist.d create mode 120000 Bin/js_calls.d create mode 120000 Bin/js_calltime.d create mode 120000 Bin/js_cpudist.d create mode 120000 Bin/js_cputime.d create mode 120000 Bin/js_execs.d create mode 120000 Bin/js_flow.d create mode 120000 Bin/js_flowinfo.d create mode 120000 Bin/js_flowtime.d create mode 120000 Bin/js_objcpu.d create mode 120000 Bin/js_objgc.d create mode 120000 Bin/js_objnew.d create mode 120000 Bin/js_stat.d create mode 120000 Bin/js_who.d create mode 120000 Bin/kill.d create mode 120000 Bin/kstat_types.d create mode 120000 Bin/lastwords create mode 120000 Bin/loads.d create mode 120000 Bin/lockbydist.d create mode 120000 Bin/lockbyproc.d create mode 120000 Bin/minfbypid.d create mode 120000 Bin/minfbyproc.d create mode 120000 Bin/mmapfiles.d create mode 120000 Bin/modcalls.d create mode 120000 Bin/newproc.d create mode 120000 Bin/nfswizard.d create mode 120000 Bin/opensnoop create mode 120000 Bin/pathopens.d create mode 120000 Bin/pfilestat create mode 120000 Bin/pgpginbypid.d create mode 120000 Bin/pgpginbyproc.d create mode 120000 Bin/php_calldist.d create mode 120000 Bin/php_calltime.d create mode 120000 Bin/php_cpudist.d create mode 120000 Bin/php_cputime.d create mode 120000 Bin/php_flow.d create mode 120000 Bin/php_flowinfo.d create mode 120000 Bin/php_flowtime.d create mode 120000 Bin/php_funccalls.d create mode 120000 Bin/php_malloc.d create mode 120000 Bin/php_syscalls.d create mode 120000 Bin/php_syscolors.d create mode 120000 Bin/php_who.d create mode 120000 Bin/pidpersec.d create mode 120000 Bin/pl_calldist.d create mode 120000 Bin/pl_calltime.d create mode 120000 Bin/pl_cpudist.d create mode 120000 Bin/pl_cputime.d create mode 120000 Bin/pl_flow.d create mode 120000 Bin/pl_flowinfo.d create mode 120000 Bin/pl_flowtime.d create mode 120000 Bin/pl_malloc.d create mode 120000 Bin/pl_subcalls.d create mode 120000 Bin/pl_syscalls.d create mode 120000 Bin/pl_syscolors.d create mode 120000 Bin/pl_who.d create mode 120000 Bin/priclass.d create mode 120000 Bin/pridist.d create mode 120000 Bin/procsystime create mode 120000 Bin/putnexts.d create mode 120000 Bin/py_calldist.d create mode 120000 Bin/py_calltime.d create mode 120000 Bin/py_cpudist.d create mode 120000 Bin/py_cputime.d create mode 120000 Bin/py_flow.d create mode 120000 Bin/py_flowinfo.d create mode 120000 Bin/py_flowtime.d create mode 120000 Bin/py_funccalls.d create mode 120000 Bin/py_malloc.d create mode 120000 Bin/py_mallocstk.d create mode 120000 Bin/py_profile.d create mode 120000 Bin/py_syscalls.d create mode 120000 Bin/py_syscolors.d create mode 120000 Bin/py_who.d create mode 120000 Bin/rb_calldist.d create mode 120000 Bin/rb_calls.d create mode 120000 Bin/rb_calltime.d create mode 120000 Bin/rb_cpudist.d create mode 120000 Bin/rb_cputime.d create mode 120000 Bin/rb_flow.d create mode 120000 Bin/rb_flowinfo.d create mode 120000 Bin/rb_flowtime.d create mode 120000 Bin/rb_funccalls.d create mode 120000 Bin/rb_lines.d create mode 120000 Bin/rb_malloc.d create mode 120000 Bin/rb_objcpu.d create mode 120000 Bin/rb_objnew.d create mode 120000 Bin/rb_stat.d create mode 120000 Bin/rb_syscalls.d create mode 120000 Bin/rb_syscolors.d create mode 120000 Bin/rb_who.d create mode 120000 Bin/readbytes.d create mode 120000 Bin/readdist.d create mode 120000 Bin/rfileio.d create mode 120000 Bin/rfsio.d create mode 120000 Bin/runocc.d create mode 120000 Bin/rwbbypid.d create mode 120000 Bin/rwbypid.d create mode 120000 Bin/rwbytype.d create mode 120000 Bin/rwsnoop create mode 120000 Bin/rwtop create mode 120000 Bin/sampleproc create mode 120000 Bin/sar-c.d create mode 120000 Bin/seeksize.d create mode 120000 Bin/setuids.d create mode 120000 Bin/sh_calldist.d create mode 120000 Bin/sh_calls.d create mode 120000 Bin/sh_calltime.d create mode 120000 Bin/sh_cpudist.d create mode 120000 Bin/sh_cputime.d create mode 120000 Bin/sh_flow.d create mode 120000 Bin/sh_flowinfo.d create mode 120000 Bin/sh_flowtime.d create mode 120000 Bin/sh_lines.d create mode 120000 Bin/sh_pidcolors.d create mode 120000 Bin/sh_stat.d create mode 120000 Bin/sh_syscalls.d create mode 120000 Bin/sh_syscolors.d create mode 120000 Bin/sh_wasted.d create mode 120000 Bin/sh_who.d create mode 120000 Bin/shellsnoop create mode 120000 Bin/shortlived.d create mode 120000 Bin/sigdist.d create mode 120000 Bin/stacksize.d create mode 120000 Bin/statsnoop create mode 120000 Bin/swapinfo.d create mode 120000 Bin/sysbypid.d create mode 120000 Bin/syscallbypid.d create mode 120000 Bin/syscallbyproc.d create mode 120000 Bin/syscallbysysc.d create mode 120000 Bin/tcl_calldist.d create mode 120000 Bin/tcl_calls.d create mode 120000 Bin/tcl_calltime.d create mode 120000 Bin/tcl_cpudist.d create mode 120000 Bin/tcl_cputime.d create mode 120000 Bin/tcl_flow.d create mode 120000 Bin/tcl_flowtime.d create mode 120000 Bin/tcl_ins.d create mode 120000 Bin/tcl_insflow.d create mode 120000 Bin/tcl_proccalls.d create mode 120000 Bin/tcl_procflow.d create mode 120000 Bin/tcl_stat.d create mode 120000 Bin/tcl_syscalls.d create mode 120000 Bin/tcl_syscolors.d create mode 120000 Bin/tcl_who.d create mode 120000 Bin/tcpsnoop create mode 120000 Bin/tcpsnoop.d create mode 120000 Bin/tcpsnoop_snv create mode 120000 Bin/tcpsnoop_snv.d create mode 120000 Bin/tcpstat.d create mode 120000 Bin/tcptop create mode 120000 Bin/tcptop_snv create mode 120000 Bin/tcpwdist.d create mode 120000 Bin/threaded.d create mode 120000 Bin/topsyscall create mode 120000 Bin/topsysproc create mode 120000 Bin/udpstat.d create mode 120000 Bin/uname-a.d create mode 120000 Bin/vmbypid.d create mode 120000 Bin/vmstat-p.d create mode 120000 Bin/vmstat.d create mode 120000 Bin/vopstat create mode 120000 Bin/weblatency.d create mode 120000 Bin/whatexec.d create mode 120000 Bin/woof.d create mode 120000 Bin/wpm.d create mode 120000 Bin/writebytes.d create mode 120000 Bin/writedist.d create mode 120000 Bin/xcallsbypid.d create mode 120000 Bin/xvmstat create mode 120000 Bin/zvmstat create mode 100644 Code/Java/Func_abc.java create mode 100644 Code/Java/Func_loop.java create mode 100644 Code/JavaScript/func_clock.html create mode 100644 Code/JavaScript/func_slow.html create mode 100755 Code/Perl/func_abc.pl create mode 100755 Code/Perl/func_malloc.pl create mode 100755 Code/Perl/func_slow.pl create mode 100755 Code/Perl/hello.pl create mode 100755 Code/Perl/hello_strict.pl create mode 100644 Code/Php/func_abc.php create mode 100755 Code/Python/func_abc.py create mode 100755 Code/Python/func_slow.py create mode 100644 Code/Readme create mode 100755 Code/Ruby/func_abc.rb create mode 100755 Code/Ruby/func_slow.rb create mode 100755 Code/Shell/func_abc.sh create mode 100755 Code/Shell/func_slow.sh create mode 100755 Code/Shell/func_waste.sh create mode 100644 Code/Tcl/func_abc.tcl create mode 100644 Code/Tcl/func_slow.tcl create mode 100644 Cpu/Readme create mode 100755 Cpu/cputypes.d create mode 100755 Cpu/cpuwalk.d create mode 100755 Cpu/dispqlen.d create mode 100755 Cpu/intbycpu.d create mode 100755 Cpu/intoncpu.d create mode 100755 Cpu/inttimes.d create mode 100755 Cpu/loads.d create mode 100755 Cpu/runocc.d create mode 100755 Cpu/xcallsbypid.d create mode 100644 Disk/Readme create mode 100755 Disk/bitesize.d create mode 100755 Disk/diskhits create mode 100755 Disk/hotspot.d create mode 100755 Disk/iofile.d create mode 100755 Disk/iofileb.d create mode 100755 Disk/iopending create mode 100755 Disk/seeksize.d create mode 100644 Docs/Contents create mode 120000 Docs/Examples create mode 100644 Docs/Faq create mode 100644 Docs/History create mode 120000 Docs/Index create mode 100644 Docs/Links create mode 100644 Docs/Maintainer create mode 120000 Docs/Notes create mode 100644 Docs/Readme create mode 100644 Docs/ToDo create mode 100644 Docs/Who create mode 100644 Docs/cddl1.txt create mode 100644 Docs/oneliners.txt create mode 100644 Examples/Copyright create mode 100644 Examples/Readme create mode 100644 Examples/anonpgpid_example.txt create mode 100644 Examples/bitesize_example.txt create mode 100644 Examples/connections_example.txt create mode 100644 Examples/cpudists_example.txt create mode 100644 Examples/cputimes_example.txt create mode 100644 Examples/cputypes_example.txt create mode 100644 Examples/cpuwalk_example.txt create mode 100644 Examples/crash_example.txt create mode 100644 Examples/creatbyproc_example.txt create mode 100644 Examples/cswstat_example.txt create mode 100644 Examples/dappprof_example.txt create mode 100644 Examples/dapptrace_example.txt create mode 100644 Examples/dexplorer_example.txt create mode 100644 Examples/diskhits_example.txt create mode 100644 Examples/dispqlen_example.txt create mode 100644 Examples/dnlcps_example.txt create mode 100644 Examples/dnlcsnoop_example.txt create mode 100644 Examples/dnlcstat_example.txt create mode 100644 Examples/dtruss_example.txt create mode 100644 Examples/dvmstat_example.txt create mode 100644 Examples/errinfo_example.txt create mode 100644 Examples/execsnoop_example.txt create mode 100644 Examples/fddist_example.txt create mode 100644 Examples/filebyproc_example.txt create mode 100644 Examples/fspaging_example.txt create mode 100644 Examples/fsrw_example.txt create mode 100644 Examples/guess_example.txt create mode 100644 Examples/hotkernel_example.txt create mode 100644 Examples/hotspot_example.txt create mode 100644 Examples/hotuser_example.txt create mode 100644 Examples/httpdstat_example.txt create mode 100644 Examples/icmpstat_example.txt create mode 100644 Examples/intbycpu_example.txt create mode 100644 Examples/intoncpu_example.txt create mode 100644 Examples/inttimes_example.txt create mode 100644 Examples/iofile_example.txt create mode 100644 Examples/iofileb_example.txt create mode 100644 Examples/iopattern_example.txt create mode 100644 Examples/iopending_example.txt create mode 100644 Examples/iosnoop_example.txt create mode 100644 Examples/iotop_example.txt create mode 100644 Examples/j_calldist_example.txt create mode 100644 Examples/j_calls_example.txt create mode 100644 Examples/j_calltime_example.txt create mode 100644 Examples/j_classflow_example.txt create mode 100644 Examples/j_cpudist_example.txt create mode 100644 Examples/j_cputime_example.txt create mode 100644 Examples/j_events_example.txt create mode 100644 Examples/j_flow_example.txt create mode 100644 Examples/j_flowtime_example.txt create mode 100644 Examples/j_methodcalls_example.txt create mode 100644 Examples/j_objnew_example.txt create mode 100644 Examples/j_package_example.txt create mode 100644 Examples/j_profile_example.txt create mode 100644 Examples/j_stat_example.txt create mode 100644 Examples/j_syscalls_example.txt create mode 100644 Examples/j_syscolors_example.txt create mode 100644 Examples/j_thread_example.txt create mode 100644 Examples/j_who_example.txt create mode 100644 Examples/js_calldist_example.txt create mode 100644 Examples/js_calls_example.txt create mode 100644 Examples/js_calltime_example.txt create mode 100644 Examples/js_cpudist_example.txt create mode 100644 Examples/js_cputime_example.txt create mode 100644 Examples/js_execs_example.txt create mode 100644 Examples/js_flow_example.txt create mode 100644 Examples/js_flowinfo_example.txt create mode 100644 Examples/js_flowtime_example.txt create mode 100644 Examples/js_objcpu_example.txt create mode 100644 Examples/js_objgc_example.txt create mode 100644 Examples/js_objnew_example.txt create mode 100644 Examples/js_stat_example.txt create mode 100644 Examples/js_who_example.txt create mode 100644 Examples/kill_example.txt create mode 100644 Examples/kstat_types_example.txt create mode 100644 Examples/lastwords_example.txt create mode 100644 Examples/loads_example.txt create mode 100644 Examples/lockbydist_example.txt create mode 100644 Examples/lockbyproc_example.txt create mode 100644 Examples/minfbypid_example.txt create mode 100644 Examples/minfbyproc_example.txt create mode 100644 Examples/mmapfiles_example.txt create mode 100644 Examples/modcalls_example.txt create mode 100644 Examples/newproc_example.txt create mode 100644 Examples/nfswizard_example.txt create mode 100644 Examples/oneliners_examples.txt create mode 100644 Examples/opensnoop_example.txt create mode 100644 Examples/pathopens_example.txt create mode 100644 Examples/pfilestat_example.txt create mode 100644 Examples/pgpginbypid_example.txt create mode 100644 Examples/pgpginbyproc_example.txt create mode 100644 Examples/php_calldist_example.txt create mode 100644 Examples/php_calltime_example.txt create mode 100644 Examples/php_cpudist_example.txt create mode 100644 Examples/php_cputime_example.txt create mode 100644 Examples/php_flow_example.txt create mode 100644 Examples/php_flowinfo_example.txt create mode 100644 Examples/php_flowtime_example.txt create mode 100644 Examples/php_funccalls_example.txt create mode 100644 Examples/php_malloc_example.txt create mode 100644 Examples/php_syscalls_example.txt create mode 100644 Examples/php_syscolors_example.txt create mode 100644 Examples/php_who_example.txt create mode 100644 Examples/pidpersec_example.txt create mode 100644 Examples/pl_calldist_example.txt create mode 100644 Examples/pl_calltime_example.txt create mode 100644 Examples/pl_cpudist_example.txt create mode 100644 Examples/pl_cputime_example.txt create mode 100644 Examples/pl_flow_example.txt create mode 100644 Examples/pl_flowinfo_example.txt create mode 100644 Examples/pl_flowtime_example.txt create mode 100644 Examples/pl_malloc_example.txt create mode 100644 Examples/pl_subcalls_example.txt create mode 100644 Examples/pl_syscalls_example.txt create mode 100644 Examples/pl_syscolors_example.txt create mode 100644 Examples/pl_who_example.txt create mode 100644 Examples/priclass_example.txt create mode 100644 Examples/pridist_example.txt create mode 100644 Examples/procsystime_example.txt create mode 100644 Examples/putnexts_example.txt create mode 100644 Examples/py_calldist_example.txt create mode 100644 Examples/py_calltime_example.txt create mode 100644 Examples/py_cpudist_example.txt create mode 100644 Examples/py_cputime_example.txt create mode 100644 Examples/py_flow_example.txt create mode 100644 Examples/py_flowinfo_example.txt create mode 100644 Examples/py_flowtime_example.txt create mode 100644 Examples/py_funccalls_example.txt create mode 100644 Examples/py_malloc_example.txt create mode 100644 Examples/py_mallocstk_example.txt create mode 100644 Examples/py_profile_example.txt create mode 100644 Examples/py_syscalls_example.txt create mode 100644 Examples/py_syscolors_example.txt create mode 100644 Examples/py_who_example.txt create mode 100644 Examples/rb_calldist_example.txt create mode 100644 Examples/rb_calls_example.txt create mode 100644 Examples/rb_calltime_example.txt create mode 100644 Examples/rb_cpudist_example.txt create mode 100644 Examples/rb_cputime_example.txt create mode 100644 Examples/rb_flow_example.txt create mode 100644 Examples/rb_flowinfo_example.txt create mode 100644 Examples/rb_flowtime_example.txt create mode 100644 Examples/rb_funccalls_example.txt create mode 100644 Examples/rb_lines_example.txt create mode 100644 Examples/rb_malloc_example.txt create mode 100644 Examples/rb_objcpu_example.txt create mode 100644 Examples/rb_objnew_example.txt create mode 100644 Examples/rb_stat_example.txt create mode 100644 Examples/rb_syscalls_example.txt create mode 100644 Examples/rb_syscolors_example.txt create mode 100644 Examples/rb_who_example.txt create mode 100644 Examples/readbytes_example.txt create mode 100644 Examples/readdist_example.txt create mode 100644 Examples/rfileio_example.txt create mode 100644 Examples/rfsio_example.txt create mode 100644 Examples/runocc_example.txt create mode 100644 Examples/rwbbypid_example.txt create mode 100644 Examples/rwbypid_example.txt create mode 100644 Examples/rwbytype_example.txt create mode 100644 Examples/rwsnoop_example.txt create mode 100644 Examples/rwtop_example.txt create mode 100644 Examples/sampleproc_example.txt create mode 100644 Examples/sar-c_example.txt create mode 100644 Examples/seeksize_example.txt create mode 100644 Examples/setuids_example.txt create mode 100644 Examples/sh_calldist_example.txt create mode 100644 Examples/sh_calls_example.txt create mode 100644 Examples/sh_calltime_example.txt create mode 100644 Examples/sh_cpudist_example.txt create mode 100644 Examples/sh_cputime_example.txt create mode 100644 Examples/sh_flow_example.txt create mode 100644 Examples/sh_flowinfo_example.txt create mode 100644 Examples/sh_flowtime_example.txt create mode 100644 Examples/sh_lines_example.txt create mode 100644 Examples/sh_pidcolors_example.txt create mode 100644 Examples/sh_stat_example.txt create mode 100644 Examples/sh_syscalls_example.txt create mode 100644 Examples/sh_syscolors_example.txt create mode 100644 Examples/sh_wasted_example.txt create mode 100644 Examples/sh_who_example.txt create mode 100644 Examples/shellsnoop_example.txt create mode 100644 Examples/shortlived_example.txt create mode 100644 Examples/sigdist_example.txt create mode 100644 Examples/stacksize_example.txt create mode 100644 Examples/statsnoop_example.txt create mode 100644 Examples/swapinfo_example.txt create mode 100644 Examples/sysbypid_example.txt create mode 100644 Examples/syscallbypid_example.txt create mode 100644 Examples/syscallbyproc_example.txt create mode 100644 Examples/syscallbysysc_example.txt create mode 100644 Examples/tcl_calldist_example.txt create mode 100644 Examples/tcl_calls_example.txt create mode 100644 Examples/tcl_calltime_example.txt create mode 100644 Examples/tcl_cpudist_example.txt create mode 100644 Examples/tcl_cputime_example.txt create mode 100644 Examples/tcl_flow_example.txt create mode 100644 Examples/tcl_flowtime_example.txt create mode 100644 Examples/tcl_ins_example.txt create mode 100644 Examples/tcl_insflow_example.txt create mode 100644 Examples/tcl_proccalls_example.txt create mode 100644 Examples/tcl_procflow_example.txt create mode 100644 Examples/tcl_stat_example.txt create mode 100644 Examples/tcl_syscalls_example.txt create mode 100644 Examples/tcl_syscolors_example.txt create mode 100644 Examples/tcl_who_example.txt create mode 100644 Examples/tcpsnoop_d_example.txt create mode 100644 Examples/tcpsnoop_example.txt create mode 120000 Examples/tcpsnoop_snv_d_example.txt create mode 120000 Examples/tcpsnoop_snv_example.txt create mode 100644 Examples/tcpstat_example.txt create mode 100644 Examples/tcptop_example.txt create mode 120000 Examples/tcptop_snv_example.txt create mode 100644 Examples/tcpwdist_example.txt create mode 100644 Examples/threaded_example.txt create mode 100644 Examples/topsyscall_example.txt create mode 100644 Examples/topsysproc_example.txt create mode 100644 Examples/udpstat_example.txt create mode 100644 Examples/uname-a_example.txt create mode 100644 Examples/vmbypid_example.txt create mode 100644 Examples/vmstat-p_example.txt create mode 100644 Examples/vmstat_example.txt create mode 100644 Examples/vopstat_example.txt create mode 100644 Examples/weblatency_example.txt create mode 100644 Examples/whatexec_example.txt create mode 100644 Examples/woof_example.txt create mode 100644 Examples/wpm_example.txt create mode 100644 Examples/writebytes_example.txt create mode 100644 Examples/writedist_example.txt create mode 100644 Examples/xcallsbypid_example.txt create mode 100644 Examples/xvmstat_example.txt create mode 100644 Examples/zvmstat_example.txt create mode 100644 FS/Readme create mode 100755 FS/fspaging.d create mode 100755 FS/fsrw.d create mode 100755 FS/rfileio.d create mode 100755 FS/rfsio.d create mode 100755 FS/vopstat create mode 100644 Guide create mode 100644 Include/Readme create mode 100755 Include/test.ksh create mode 100644 Include/time.h create mode 100644 Include/tostr.h create mode 100644 Java/Readme create mode 100755 Java/j_calldist.d create mode 100755 Java/j_calls.d create mode 100755 Java/j_calltime.d create mode 100755 Java/j_classflow.d create mode 100755 Java/j_cpudist.d create mode 100755 Java/j_cputime.d create mode 100755 Java/j_events.d create mode 100755 Java/j_flow.d create mode 100755 Java/j_flowtime.d create mode 100755 Java/j_methodcalls.d create mode 100755 Java/j_objnew.d create mode 100755 Java/j_package.d create mode 100755 Java/j_profile.d create mode 100755 Java/j_stat.d create mode 100755 Java/j_syscalls.d create mode 100755 Java/j_syscolors.d create mode 100755 Java/j_thread.d create mode 100755 Java/j_who.d create mode 100644 JavaScript/Readme create mode 100755 JavaScript/js_calldist.d create mode 100755 JavaScript/js_calls.d create mode 100755 JavaScript/js_calltime.d create mode 100755 JavaScript/js_cpudist.d create mode 100755 JavaScript/js_cputime.d create mode 100755 JavaScript/js_execs.d create mode 100755 JavaScript/js_flow.d create mode 100755 JavaScript/js_flowinfo.d create mode 100755 JavaScript/js_flowtime.d create mode 100755 JavaScript/js_objcpu.d create mode 100755 JavaScript/js_objgc.d create mode 100755 JavaScript/js_objnew.d create mode 100755 JavaScript/js_stat.d create mode 100755 JavaScript/js_who.d create mode 100644 Kernel/Readme create mode 100755 Kernel/cpudists create mode 100755 Kernel/cputimes create mode 100755 Kernel/cswstat.d create mode 100755 Kernel/dnlcps.d create mode 100755 Kernel/dnlcsnoop.d create mode 100755 Kernel/dnlcstat create mode 100755 Kernel/kstat_types.d create mode 100755 Kernel/modcalls.d create mode 100755 Kernel/priclass.d create mode 100755 Kernel/pridist.d create mode 100755 Kernel/putnexts.d create mode 100755 Kernel/whatexec.d create mode 120000 License create mode 100755 Locks/lockbydist.d create mode 100755 Locks/lockbyproc.d create mode 100644 Man/Readme create mode 100644 Man/man1m/anonpgpid.d.1m create mode 100644 Man/man1m/bitesize.d.1m create mode 100644 Man/man1m/connections.1m create mode 100644 Man/man1m/cpudists.1m create mode 100644 Man/man1m/cputimes.1m create mode 100644 Man/man1m/cputypes.d.1m create mode 100644 Man/man1m/cpuwalk.d.1m create mode 100644 Man/man1m/crash.d.1m create mode 100644 Man/man1m/creatbyproc.d.1m create mode 100644 Man/man1m/cswstat.d.1m create mode 100644 Man/man1m/dappprof.1m create mode 100644 Man/man1m/dapptrace.1m create mode 100644 Man/man1m/dexplorer.1m create mode 100644 Man/man1m/diskhits.1m create mode 100644 Man/man1m/dispqlen.d.1m create mode 100644 Man/man1m/dnlcps.d.1m create mode 100644 Man/man1m/dnlcsnoop.d.1m create mode 100644 Man/man1m/dnlcstat.1m create mode 100644 Man/man1m/dtruss.1m create mode 100644 Man/man1m/dvmstat.1m create mode 100644 Man/man1m/errinfo.1m create mode 100644 Man/man1m/execsnoop.1m create mode 100644 Man/man1m/fddist.1m create mode 100644 Man/man1m/filebyproc.d.1m create mode 100644 Man/man1m/fspaging.d.1m create mode 100644 Man/man1m/fsrw.d.1m create mode 100644 Man/man1m/guess.d.1m create mode 100644 Man/man1m/hotkernel.1m create mode 100644 Man/man1m/hotspot.d.1m create mode 100644 Man/man1m/hotuser.1m create mode 100644 Man/man1m/httpdstat.d.1m create mode 100644 Man/man1m/icmpstat.d.1m create mode 100644 Man/man1m/intbycpu.d.1m create mode 100644 Man/man1m/intoncpu.d.1m create mode 100644 Man/man1m/inttimes.d.1m create mode 100644 Man/man1m/iofile.d.1m create mode 100644 Man/man1m/iofileb.d.1m create mode 100644 Man/man1m/iopattern.1m create mode 100644 Man/man1m/iopending.1m create mode 100644 Man/man1m/iosnoop.1m create mode 100644 Man/man1m/iotop.1m create mode 100644 Man/man1m/j_calldist.d.1m create mode 100644 Man/man1m/j_calls.d.1m create mode 100644 Man/man1m/j_calltime.d.1m create mode 100644 Man/man1m/j_classflow.d.1m create mode 100644 Man/man1m/j_cpudist.d.1m create mode 100644 Man/man1m/j_cputime.d.1m create mode 100644 Man/man1m/j_events.d.1m create mode 100644 Man/man1m/j_flow.d.1m create mode 100644 Man/man1m/j_flowtime.d.1m create mode 100644 Man/man1m/j_methodcalls.d.1m create mode 100644 Man/man1m/j_objnew.d.1m create mode 100644 Man/man1m/j_package.d.1m create mode 100644 Man/man1m/j_profile.d.1m create mode 100644 Man/man1m/j_stat.d.1m create mode 100644 Man/man1m/j_syscalls.d.1m create mode 100644 Man/man1m/j_syscolors.d.1m create mode 100644 Man/man1m/j_thread.d.1m create mode 100644 Man/man1m/j_who.d.1m create mode 100644 Man/man1m/js_calldist.d.1m create mode 100644 Man/man1m/js_calls.d.1m create mode 100644 Man/man1m/js_calltime.d.1m create mode 100644 Man/man1m/js_cpudist.d.1m create mode 100644 Man/man1m/js_cputime.d.1m create mode 100644 Man/man1m/js_execs.d.1m create mode 100644 Man/man1m/js_flow.d.1m create mode 100644 Man/man1m/js_flowinfo.d.1m create mode 100644 Man/man1m/js_flowtime.d.1m create mode 100644 Man/man1m/js_objcpu.d.1m create mode 100644 Man/man1m/js_objgc.d.1m create mode 100644 Man/man1m/js_objnew.d.1m create mode 100644 Man/man1m/js_stat.d.1m create mode 100644 Man/man1m/js_who.d.1m create mode 100644 Man/man1m/kill.d.1m create mode 100644 Man/man1m/kstat_types.d.1m create mode 100644 Man/man1m/lastwords.1m create mode 100644 Man/man1m/loads.d.1m create mode 100644 Man/man1m/lockbydist.d.1m create mode 100644 Man/man1m/lockbyproc.d.1m create mode 100644 Man/man1m/minfbypid.d.1m create mode 100644 Man/man1m/minfbyproc.d.1m create mode 100644 Man/man1m/mmapfiles.d.1m create mode 100644 Man/man1m/modcalls.d.1m create mode 100644 Man/man1m/newproc.d.1m create mode 100644 Man/man1m/nfswizard.d.1m create mode 100644 Man/man1m/opensnoop.1m create mode 100644 Man/man1m/pathopens.d.1m create mode 100644 Man/man1m/pfilestat.1m create mode 100644 Man/man1m/pgpginbypid.d.1m create mode 100644 Man/man1m/pgpginbyproc.d.1m create mode 100644 Man/man1m/php_calldist.d.1m create mode 100644 Man/man1m/php_calltime.d.1m create mode 100644 Man/man1m/php_cpudist.d.1m create mode 100644 Man/man1m/php_cputime.d.1m create mode 100644 Man/man1m/php_flow.d.1m create mode 100644 Man/man1m/php_flowinfo.d.1m create mode 100644 Man/man1m/php_flowtime.d.1m create mode 100644 Man/man1m/php_funccalls.d.1m create mode 100644 Man/man1m/php_malloc.d.1m create mode 100644 Man/man1m/php_syscalls.d.1m create mode 100644 Man/man1m/php_syscolors.d.1m create mode 100644 Man/man1m/php_who.d.1m create mode 100644 Man/man1m/pidpersec.d.1m create mode 100644 Man/man1m/pl_calldist.d.1m create mode 100644 Man/man1m/pl_calltime.d.1m create mode 100644 Man/man1m/pl_cpudist.d.1m create mode 100644 Man/man1m/pl_cputime.d.1m create mode 100644 Man/man1m/pl_flow.d.1m create mode 100644 Man/man1m/pl_flowinfo.d.1m create mode 100644 Man/man1m/pl_flowtime.d.1m create mode 100644 Man/man1m/pl_malloc.d.1m create mode 100644 Man/man1m/pl_subcalls.d.1m create mode 100644 Man/man1m/pl_syscalls.d.1m create mode 100644 Man/man1m/pl_syscolors.d.1m create mode 100644 Man/man1m/pl_who.d.1m create mode 100644 Man/man1m/priclass.d.1m create mode 100644 Man/man1m/pridist.d.1m create mode 100644 Man/man1m/procsystime.1m create mode 100644 Man/man1m/putnexts.d.1m create mode 100644 Man/man1m/py_calldist.d.1m create mode 100644 Man/man1m/py_calltime.d.1m create mode 100644 Man/man1m/py_cpudist.d.1m create mode 100644 Man/man1m/py_cputime.d.1m create mode 100644 Man/man1m/py_flow.d.1m create mode 100644 Man/man1m/py_flowinfo.d.1m create mode 100644 Man/man1m/py_flowtime.d.1m create mode 100644 Man/man1m/py_funccalls.d.1m create mode 100644 Man/man1m/py_malloc.d.1m create mode 100644 Man/man1m/py_mallocstk.d.1m create mode 100644 Man/man1m/py_profile.d.1m create mode 100644 Man/man1m/py_syscalls.d.1m create mode 100644 Man/man1m/py_syscolors.d.1m create mode 100644 Man/man1m/py_who.d.1m create mode 100644 Man/man1m/rb_calldist.d.1m create mode 100644 Man/man1m/rb_calls.d.1m create mode 100644 Man/man1m/rb_calltime.d.1m create mode 100644 Man/man1m/rb_cpudist.d.1m create mode 100644 Man/man1m/rb_cputime.d.1m create mode 100644 Man/man1m/rb_flow.d.1m create mode 100644 Man/man1m/rb_flowinfo.d.1m create mode 100644 Man/man1m/rb_flowtime.d.1m create mode 100644 Man/man1m/rb_funccalls.d.1m create mode 100644 Man/man1m/rb_lines.d.1m create mode 100644 Man/man1m/rb_malloc.d.1m create mode 100644 Man/man1m/rb_objcpu.d.1m create mode 100644 Man/man1m/rb_objnew.d.1m create mode 100644 Man/man1m/rb_stat.d.1m create mode 100644 Man/man1m/rb_syscalls.d.1m create mode 100644 Man/man1m/rb_syscolors.d.1m create mode 100644 Man/man1m/rb_who.d.1m create mode 100644 Man/man1m/readbytes.d.1m create mode 100644 Man/man1m/readdist.d.1m create mode 100644 Man/man1m/rfileio.d.1m create mode 100644 Man/man1m/rfsio.d.1m create mode 100644 Man/man1m/runocc.d.1m create mode 100644 Man/man1m/rwbbypid.d.1m create mode 100644 Man/man1m/rwbypid.d.1m create mode 100644 Man/man1m/rwbytype.d.1m create mode 100644 Man/man1m/rwsnoop.1m create mode 100644 Man/man1m/rwtop.1m create mode 100644 Man/man1m/sampleproc.1m create mode 100644 Man/man1m/sar-c.d.1m create mode 100644 Man/man1m/seeksize.d.1m create mode 100644 Man/man1m/setuids.d.1m create mode 100644 Man/man1m/sh_calldist.d.1m create mode 100644 Man/man1m/sh_calls.d.1m create mode 100644 Man/man1m/sh_calltime.d.1m create mode 100644 Man/man1m/sh_cpudist.d.1m create mode 100644 Man/man1m/sh_cputime.d.1m create mode 100644 Man/man1m/sh_flow.d.1m create mode 100644 Man/man1m/sh_flowinfo.d.1m create mode 100644 Man/man1m/sh_flowtime.d.1m create mode 100644 Man/man1m/sh_lines.d.1m create mode 100644 Man/man1m/sh_pidcolors.d.1m create mode 100644 Man/man1m/sh_stat.d.1m create mode 100644 Man/man1m/sh_syscalls.d.1m create mode 100644 Man/man1m/sh_syscolors.d.1m create mode 100644 Man/man1m/sh_wasted.d.1m create mode 100644 Man/man1m/sh_who.d.1m create mode 100644 Man/man1m/shellsnoop.1m create mode 100644 Man/man1m/shortlived.d.1m create mode 100644 Man/man1m/sigdist.d.1m create mode 100644 Man/man1m/stacksize.d.1m create mode 100644 Man/man1m/statsnoop.1m create mode 100644 Man/man1m/swapinfo.d.1m create mode 100644 Man/man1m/sysbypid.d.1m create mode 100644 Man/man1m/syscallbypid.d.1m create mode 100644 Man/man1m/syscallbyproc.d.1m create mode 100644 Man/man1m/syscallbysysc.d.1m create mode 100644 Man/man1m/tcl_calldist.d.1m create mode 100644 Man/man1m/tcl_calls.d.1m create mode 100644 Man/man1m/tcl_calltime.d.1m create mode 100644 Man/man1m/tcl_cpudist.d.1m create mode 100644 Man/man1m/tcl_cputime.d.1m create mode 100644 Man/man1m/tcl_flow.d.1m create mode 100644 Man/man1m/tcl_flowtime.d.1m create mode 100644 Man/man1m/tcl_ins.d.1m create mode 100644 Man/man1m/tcl_insflow.d.1m create mode 100644 Man/man1m/tcl_proccalls.d.1m create mode 100644 Man/man1m/tcl_procflow.d.1m create mode 100644 Man/man1m/tcl_stat.d.1m create mode 100644 Man/man1m/tcl_syscalls.d.1m create mode 100644 Man/man1m/tcl_syscolors.d.1m create mode 100644 Man/man1m/tcl_who.d.1m create mode 100644 Man/man1m/tcpsnoop.1m create mode 100644 Man/man1m/tcpsnoop.d.1m create mode 100644 Man/man1m/tcpsnoop_snv.1m create mode 100644 Man/man1m/tcpsnoop_snv.d.1m create mode 100644 Man/man1m/tcpstat.d.1m create mode 100644 Man/man1m/tcptop.1m create mode 100644 Man/man1m/tcptop_snv.1m create mode 100644 Man/man1m/tcpwdist.d.1m create mode 100644 Man/man1m/threaded.d.1m create mode 100644 Man/man1m/topsyscall.1m create mode 100644 Man/man1m/topsysproc.1m create mode 100644 Man/man1m/udpstat.d.1m create mode 100644 Man/man1m/uname-a.d.1m create mode 100644 Man/man1m/vmbypid.d.1m create mode 100644 Man/man1m/vmstat-p.d.1m create mode 100644 Man/man1m/vmstat.d.1m create mode 100644 Man/man1m/vopstat.1m create mode 100644 Man/man1m/weblatency.d.1m create mode 100644 Man/man1m/whatexec.d.1m create mode 100644 Man/man1m/woof.d.1m create mode 100644 Man/man1m/wpm.d.1m create mode 100644 Man/man1m/writebytes.d.1m create mode 100644 Man/man1m/writedist.d.1m create mode 100644 Man/man1m/xcallsbypid.d.1m create mode 100644 Man/man1m/xvmstat.1m create mode 100644 Man/man1m/zvmstat.1m create mode 100644 Mem/Readme create mode 100755 Mem/anonpgpid.d create mode 100755 Mem/minfbypid.d create mode 100755 Mem/minfbyproc.d create mode 100755 Mem/pgpginbypid.d create mode 100755 Mem/pgpginbyproc.d create mode 100755 Mem/swapinfo.d create mode 100755 Mem/vmbypid.d create mode 100755 Mem/vmstat-p.d create mode 100755 Mem/vmstat.d create mode 100755 Mem/xvmstat create mode 100644 Misc/Readme create mode 100755 Misc/guess.d create mode 100755 Misc/woof.d create mode 100755 Misc/wpm.d create mode 100644 Net/Readme create mode 100755 Net/connections create mode 100755 Net/icmpstat.d create mode 100755 Net/tcpsnoop create mode 100755 Net/tcpsnoop.d create mode 100755 Net/tcpsnoop_snv create mode 100755 Net/tcpsnoop_snv.d create mode 100755 Net/tcpstat.d create mode 100755 Net/tcptop create mode 100755 Net/tcptop_snv create mode 100755 Net/tcpwdist.d create mode 100755 Net/udpstat.d create mode 100644 Notes/ALLcolors_notes.txt create mode 100644 Notes/ALLelapsed_notes.txt create mode 100644 Notes/ALLexclusive_notes.txt create mode 100644 Notes/ALLfbt_notes.txt create mode 100644 Notes/ALLflow_notes.txt create mode 100644 Notes/ALLinclusive_notes.txt create mode 100644 Notes/ALLjava_notes.txt create mode 100644 Notes/ALLoncpu_notes.txt create mode 100644 Notes/ALLoverhead.txt create mode 100644 Notes/ALLperl_notes.txt create mode 100644 Notes/ALLsnoop_notes.txt create mode 100644 Notes/Readme create mode 100644 Notes/cputimes_notes.txt create mode 100644 Notes/dappprof_notes.txt create mode 100644 Notes/dapptrace_notes.txt create mode 100644 Notes/dtruss_notes.txt create mode 100644 Notes/iosnoop_notes.txt create mode 100644 Notes/iotop_notes.txt create mode 100644 Notes/procsystime_notes.txt create mode 100644 Perl/Readme create mode 100755 Perl/pl_calldist.d create mode 100755 Perl/pl_calltime.d create mode 100755 Perl/pl_cpudist.d create mode 100755 Perl/pl_cputime.d create mode 100755 Perl/pl_flow.d create mode 100755 Perl/pl_flowinfo.d create mode 100755 Perl/pl_flowtime.d create mode 100755 Perl/pl_malloc.d create mode 100755 Perl/pl_subcalls.d create mode 100755 Perl/pl_syscalls.d create mode 100755 Perl/pl_syscolors.d create mode 100755 Perl/pl_who.d create mode 100644 Php/Readme create mode 100755 Php/php_calldist.d create mode 100755 Php/php_calltime.d create mode 100755 Php/php_cpudist.d create mode 100755 Php/php_cputime.d create mode 100755 Php/php_flow.d create mode 100755 Php/php_flowinfo.d create mode 100755 Php/php_flowtime.d create mode 100755 Php/php_funccalls.d create mode 100755 Php/php_malloc.d create mode 100755 Php/php_syscalls.d create mode 100755 Php/php_syscolors.d create mode 100755 Php/php_who.d create mode 100644 Proc/Readme create mode 100755 Proc/crash.d create mode 100755 Proc/creatbyproc.d create mode 100755 Proc/dappprof create mode 100755 Proc/dapptrace create mode 100755 Proc/fddist create mode 100755 Proc/filebyproc.d create mode 100755 Proc/kill.d create mode 100755 Proc/lastwords create mode 100755 Proc/mmapfiles.d create mode 100755 Proc/newproc.d create mode 100755 Proc/pathopens.d create mode 100755 Proc/pfilestat create mode 100755 Proc/pidpersec.d create mode 100755 Proc/readbytes.d create mode 100755 Proc/readdist.d create mode 100755 Proc/rwbbypid.d create mode 100755 Proc/rwbypid.d create mode 100755 Proc/rwbytype.d create mode 100755 Proc/sampleproc create mode 100755 Proc/shortlived.d create mode 100755 Proc/sigdist.d create mode 100755 Proc/stacksize.d create mode 100755 Proc/sysbypid.d create mode 100755 Proc/syscallbypid.d create mode 100755 Proc/syscallbyproc.d create mode 100755 Proc/threaded.d create mode 100755 Proc/topsysproc create mode 100755 Proc/writebytes.d create mode 100755 Proc/writedist.d create mode 100644 Python/Readme create mode 100755 Python/py_calldist.d create mode 100755 Python/py_calltime.d create mode 100755 Python/py_cpudist.d create mode 100755 Python/py_cputime.d create mode 100755 Python/py_flow.d create mode 100755 Python/py_flowinfo.d create mode 100755 Python/py_flowtime.d create mode 100755 Python/py_funccalls.d create mode 100755 Python/py_malloc.d create mode 100755 Python/py_mallocstk.d create mode 100755 Python/py_profile.d create mode 100755 Python/py_syscalls.d create mode 100755 Python/py_syscolors.d create mode 100755 Python/py_who.d create mode 120000 README create mode 100644 Ruby/Readme create mode 100755 Ruby/rb_calldist.d create mode 100755 Ruby/rb_calls.d create mode 100755 Ruby/rb_calltime.d create mode 100755 Ruby/rb_cpudist.d create mode 100755 Ruby/rb_cputime.d create mode 100755 Ruby/rb_flow.d create mode 100755 Ruby/rb_flowinfo.d create mode 100755 Ruby/rb_flowtime.d create mode 100755 Ruby/rb_funccalls.d create mode 100755 Ruby/rb_lines.d create mode 100755 Ruby/rb_malloc.d create mode 100755 Ruby/rb_objcpu.d create mode 100755 Ruby/rb_objnew.d create mode 100755 Ruby/rb_stat.d create mode 100755 Ruby/rb_syscalls.d create mode 100755 Ruby/rb_syscolors.d create mode 100755 Ruby/rb_who.d create mode 100644 Shell/Readme create mode 100755 Shell/sh_calldist.d create mode 100755 Shell/sh_calls.d create mode 100755 Shell/sh_calltime.d create mode 100755 Shell/sh_cpudist.d create mode 100755 Shell/sh_cputime.d create mode 100755 Shell/sh_flow.d create mode 100755 Shell/sh_flowinfo.d create mode 100755 Shell/sh_flowtime.d create mode 100755 Shell/sh_lines.d create mode 100755 Shell/sh_pidcolors.d create mode 100755 Shell/sh_stat.d create mode 100755 Shell/sh_syscalls.d create mode 100755 Shell/sh_syscolors.d create mode 100755 Shell/sh_wasted.d create mode 100755 Shell/sh_who.d create mode 100644 Snippits/Readme create mode 100644 Snippits/fd2pathname.txt create mode 100644 System/Readme create mode 100755 System/sar-c.d create mode 100755 System/syscallbysysc.d create mode 100755 System/topsyscall create mode 100755 System/uname-a.d create mode 100644 Tcl/Readme create mode 100755 Tcl/tcl_calldist.d create mode 100755 Tcl/tcl_calls.d create mode 100755 Tcl/tcl_calltime.d create mode 100755 Tcl/tcl_cpudist.d create mode 100755 Tcl/tcl_cputime.d create mode 100755 Tcl/tcl_flow.d create mode 100755 Tcl/tcl_flowtime.d create mode 100755 Tcl/tcl_ins.d create mode 100755 Tcl/tcl_insflow.d create mode 100755 Tcl/tcl_proccalls.d create mode 100755 Tcl/tcl_procflow.d create mode 100755 Tcl/tcl_stat.d create mode 100755 Tcl/tcl_syscalls.d create mode 100755 Tcl/tcl_syscolors.d create mode 100755 Tcl/tcl_who.d create mode 100644 User/Readme create mode 100755 User/setuids.d create mode 100644 Version create mode 100644 Zones/Readme create mode 100755 Zones/zvmstat create mode 100755 dexplorer create mode 100755 dvmstat create mode 100755 errinfo create mode 100755 execsnoop create mode 100755 hotkernel create mode 100755 hotuser create mode 100755 install create mode 100755 iopattern create mode 100755 iosnoop create mode 100755 iotop create mode 100755 opensnoop create mode 100755 procsystime create mode 100755 rwsnoop create mode 100755 rwtop create mode 100755 statsnoop 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 @@ + + +func_clock, JavaScript + + + +
+ + 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 @@ + +func_slow, JavaScript + + + + 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 @@ + 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 + disk_io dad1 R 2048 0 + 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 + 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 "" 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 + disk_io dad1 R 8192 0 + disk_io dad1 R 2048 0 + disk_io dad1 R 2048 0 + 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 + 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 + disk_io dad1 R 2048 0 + 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 + 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 + 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 + 0 0 W 6496304 1024 sched + 0 3 W 6498797 512 fsflush + 0 0 W 1067 512 sched + 0 0 W 6496304 1024 sched + 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 + 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. + 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. + 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. 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. 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. 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. 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. 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. 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. 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. 5430 + 311358 method java/lang/String.charAt 6079 + 311358 method java/lang/String. 7306 + 311358 method java/lang/StringBuilder.append 10240 + 311358 method java/util/StringTokenizer.scanToken 11075 + 311358 method java/net/URL. 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. 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. + 0 311461 4790094765459 <- java/io/BufferedOutputStream. + 0 311461 4790094779559 -> java/io/BufferedOutputStream. + 0 311461 4790094779595 <- java/io/BufferedOutputStream. + 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. + 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. + 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. + 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. + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher. + 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. 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. 1212 + 311374 method java/lang/StringBuilder.append 1228 + 311374 method java/io/UnixFileSystem.normalize 1402 + 311374 method java/lang/String. 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. 27677 + 311374 method sun/misc/Launcher. 28566 + 311374 method sun/misc/Launcher. 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. + 0 311403 4789112583207 -> java/lang/Object.registerNatives + 0 311403 4789112583323 <- java/lang/Object.registerNatives + 0 311403 4789112583333 <- java/lang/Object. + 0 311403 4789112583343 -> java/lang/String. + 0 311403 4789112583732 -> java/lang/String$CaseInsensitiveComparator. + 0 311403 4789112583743 -> java/lang/String$CaseInsensitiveComparator. + 0 311403 4789112583752 -> java/lang/Object. + 0 311403 4789112583760 <- java/lang/Object. + 0 311403 4789112583767 <- java/lang/String$CaseInsensitiveComparator. + 0 311403 4789112583774 <- java/lang/String$CaseInsensitiveComparator. + 0 311403 4789112583783 <- java/lang/String. + 0 311403 4789112583849 -> java/lang/System. + 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. + 0 311403 4789112584058 -> java/lang/ThreadGroup. + 0 311403 4789112584068 -> java/lang/Object. + 0 311403 4789112584075 <- java/lang/Object. + 0 311403 4789112584100 <- java/lang/ThreadGroup. + 0 311403 4789112584109 -> java/lang/ThreadGroup. + 0 311403 4789112584116 -> java/lang/Object. + 0 311403 4789112584123 <- java/lang/Object. + 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. + 0 311403 4789112584385 -> java/lang/Thread. + 0 311403 4789112584396 -> java/lang/Thread.registerNatives + 0 311403 4789112584421 <- java/lang/Thread.registerNatives + 0 311403 4789112584779 -> java/lang/RuntimePermission. + 0 311403 4789112584789 -> java/security/BasicPermission. + 0 311403 4789112584798 -> java/security/Permission. + 0 311403 4789112584806 -> java/lang/Object. + 0 311403 4789112584814 <- java/lang/Object. + 0 311403 4789112584823 <- java/security/Permission. + 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. + 0 311403 4789112584910 <- java/lang/RuntimePermission. + 0 311403 4789112585319 -> sun/misc/SoftCache. + 0 311403 4789112585329 -> java/util/AbstractMap. + 0 311403 4789112585337 -> java/lang/Object. + 0 311403 4789112585345 <- java/lang/Object. + 0 311403 4789112585355 <- java/util/AbstractMap. + 0 311403 4789112585485 -> java/lang/ref/ReferenceQueue. + 0 311403 4789112585554 -> java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585564 -> java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585572 -> java/lang/ref/ReferenceQueue. + 0 311403 4789112585581 -> java/lang/Object. + 0 311403 4789112585589 <- java/lang/Object. + 0 311403 4789112585646 -> java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585656 -> java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585664 -> java/lang/Object. + 0 311403 4789112585671 <- java/lang/Object. + 0 311403 4789112585678 <- java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585685 <- java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585696 <- java/lang/ref/ReferenceQueue. + 0 311403 4789112585702 <- java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585709 <- java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585717 -> java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585723 -> java/lang/ref/ReferenceQueue$Null. + 0 311403 4789112585729 -> java/lang/ref/ReferenceQueue. + 0 311403 4789112585736 -> java/lang/Object. + 0 311403 4789112585743 <- java/lang/Object. + 0 311403 4789112585748 -> java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585755 -> java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585761 -> java/lang/Object. + 0 311403 4789112585768 <- java/lang/Object. + 0 311403 4789112585796 <- java/lang/ref/ReferenceQueue$Lock. + 0 311403 4789112585803 <- java/lang/ref/ReferenceQueue$Lock. +[... 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. + 0 311403 4789112983106 -> java/nio/CharBuffer. + 0 311403 4789112983113 -> java/nio/Buffer. + 0 311403 4789112983119 -> java/lang/Object. + 0 311403 4789112983126 <- java/lang/Object. + 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. + 0 311403 4789112983166 <- java/nio/CharBuffer. + 0 311403 4789112983173 <- java/nio/HeapCharBuffer. + 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. + 0 311403 4789112984169 -> java/nio/CharBuffer. + 0 311403 4789112984175 -> java/nio/Buffer. + 0 311403 4789112984181 -> java/lang/Object. + 0 311403 4789112984189 <- java/lang/Object. + 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. + 0 311403 4789112984228 <- java/nio/CharBuffer. + 0 311403 4789112984234 <- java/nio/HeapCharBuffer. + 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. + 0 311403 4789113990293 -> java/nio/CharBuffer. + 0 311403 4789113990299 -> java/nio/Buffer. + 0 311403 4789113990306 -> java/lang/Object. + 0 311403 4789113990313 <- java/lang/Object. + 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. + 0 311403 4789113990354 <- java/nio/CharBuffer. + 0 311403 4789113990360 <- java/nio/HeapCharBuffer. + 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. + 0 311403 4789113991131 -> java/nio/CharBuffer. + 0 311403 4789113991137 -> java/nio/Buffer. + 0 311403 4789113991143 -> java/lang/Object. + 0 311403 4789113991150 <- java/lang/Object. + 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. + 0 311403 4789113991189 <- java/nio/CharBuffer. + 0 311403 4789113991196 <- java/nio/HeapCharBuffer. + 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. + 0 311403 4789115000294 -> java/nio/CharBuffer. + 0 311403 4789115000301 -> java/nio/Buffer. + 0 311403 4789115000307 -> java/lang/Object. + 0 311403 4789115000315 <- java/lang/Object. + 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. + 0 311403 4789115000355 <- java/nio/CharBuffer. + 0 311403 4789115000362 <- java/nio/HeapCharBuffer. + 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. + 0 311403 4789115001133 -> java/nio/CharBuffer. + 0 311403 4789115001139 -> java/nio/Buffer. + 0 311403 4789115001145 -> java/lang/Object. + 0 311403 4789115001152 <- java/lang/Object. + 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. + 0 311403 4789115001191 <- java/nio/CharBuffer. + 0 311403 4789115001198 <- java/nio/HeapCharBuffer. + 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. + 0 311403 4789116010388 -> java/lang/Object. + 0 311403 4789116010395 <- java/lang/Object. + 0 311403 4789116010402 -> java/lang/Object. + 0 311403 4789116010409 <- java/lang/Object. + 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. + 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. + 0 311403 4789116011032 -> java/util/AbstractList$Itr. + 0 311403 4789116011042 -> java/lang/Object. + 0 311403 4789116011050 <- java/lang/Object. + 0 311403 4789116011062 <- java/util/AbstractList$Itr. + 0 311403 4789116011069 <- java/util/AbstractList$Itr. + 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. + 0 311403 4789116011452 -> java/util/IdentityHashMap$KeySet. + 0 311403 4789116011462 -> java/util/AbstractSet. + 0 311403 4789116011469 -> java/util/AbstractCollection. + 0 311403 4789116011475 -> java/lang/Object. + 0 311403 4789116011483 <- java/lang/Object. + 0 311403 4789116011490 <- java/util/AbstractCollection. + 0 311403 4789116011497 <- java/util/AbstractSet. + 0 311403 4789116011503 <- java/util/IdentityHashMap$KeySet. + 0 311403 4789116011510 <- java/util/IdentityHashMap$KeySet. + 0 311403 4789116011528 <- java/util/IdentityHashMap.keySet + 0 311403 4789116011538 -> java/util/IdentityHashMap$KeySet.iterator + 0 311403 4789116011727 -> java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011737 -> java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011748 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011757 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011766 -> java/lang/Object. + 0 311403 4789116011774 <- java/lang/Object. + 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. + 0 311403 4789116011828 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011835 <- java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011842 <- java/util/IdentityHashMap$KeyIterator. + 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. + 0 311403 4789116011886 -> java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011892 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011899 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011905 -> java/lang/Object. + 0 311403 4789116011912 <- java/lang/Object. + 0 311403 4789116011919 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011926 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311403 4789116011934 <- java/util/IdentityHashMap$KeyIterator. + 0 311403 4789116011940 <- java/util/IdentityHashMap$KeyIterator. + 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. + 0 311403 4789116012333 -> java/util/LinkedHashSet. + 0 311403 4789116012343 -> java/util/HashSet. + 0 311403 4789116012350 -> java/util/AbstractSet. + 0 311403 4789116012356 -> java/util/AbstractCollection. + 0 311403 4789116012362 -> java/lang/Object. + 0 311403 4789116012370 <- java/lang/Object. + 0 311403 4789116012377 <- java/util/AbstractCollection. + 0 311403 4789116012384 <- java/util/AbstractSet. + 0 311403 4789116012394 -> java/util/LinkedHashMap. + 0 311403 4789116012404 -> java/util/HashMap. + 0 311403 4789116012410 -> java/util/AbstractMap. + 0 311403 4789116012417 -> java/lang/Object. + 0 311403 4789116012424 <- java/lang/Object. + 0 311403 4789116012431 <- java/util/AbstractMap. + 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. + 0 311403 4789116012469 -> java/util/HashMap$Entry. + 0 311403 4789116012476 -> java/lang/Object. + 0 311403 4789116012482 <- java/lang/Object. + 0 311403 4789116012489 <- java/util/HashMap$Entry. + 0 311403 4789116012496 <- java/util/LinkedHashMap$Entry. + 0 311403 4789116012503 <- java/util/LinkedHashMap.init + 0 311403 4789116012510 <- java/util/HashMap. + 0 311403 4789116012516 <- java/util/LinkedHashMap. + 0 311403 4789116012523 <- java/util/HashSet. + 0 311403 4789116012529 <- java/util/LinkedHashSet. + 0 311403 4789116012538 <- java/io/DeleteOnExitHook. + 0 311403 4789116012547 -> java/io/DeleteOnExitHook.hook + 0 311403 4789116012556 -> java/io/DeleteOnExitHook. + 0 311403 4789116012565 -> java/lang/Object. + 0 311403 4789116012572 <- java/lang/Object. + 0 311403 4789116012579 <- java/io/DeleteOnExitHook. + 0 311403 4789116012586 <- java/io/DeleteOnExitHook.hook + 0 311403 4789116012594 -> java/io/DeleteOnExitHook.run + 0 311403 4789116012605 -> java/util/ArrayList. + 0 311403 4789116012612 -> java/util/AbstractList. + 0 311403 4789116012618 -> java/util/AbstractCollection. + 0 311403 4789116012624 -> java/lang/Object. + 0 311403 4789116012631 <- java/lang/Object. + 0 311403 4789116012638 <- java/util/AbstractCollection. + 0 311403 4789116012645 <- java/util/AbstractList. + 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. + 0 311403 4789116012791 -> java/util/HashMap$KeySet. + 0 311403 4789116012801 -> java/util/AbstractSet. + 0 311403 4789116012807 -> java/util/AbstractCollection. + 0 311403 4789116012814 -> java/lang/Object. + 0 311403 4789116012821 <- java/lang/Object. + 0 311403 4789116012828 <- java/util/AbstractCollection. + 0 311403 4789116012835 <- java/util/AbstractSet. + 0 311403 4789116012841 <- java/util/HashMap$KeySet. + 0 311403 4789116012848 <- java/util/HashMap$KeySet. + 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. + 0 311403 4789116013066 -> java/util/LinkedHashMap$KeyIterator. + 0 311403 4789116013076 -> java/util/LinkedHashMap$LinkedHashIterator. + 0 311403 4789116013085 -> java/util/LinkedHashMap$LinkedHashIterator. + 0 311403 4789116013095 -> java/lang/Object. + 0 311403 4789116013102 <- java/lang/Object. + 0 311403 4789116013117 <- java/util/LinkedHashMap$LinkedHashIterator. + 0 311403 4789116013125 <- java/util/LinkedHashMap$LinkedHashIterator. + 0 311403 4789116013132 <- java/util/LinkedHashMap$KeyIterator. + 0 311403 4789116013138 <- java/util/LinkedHashMap$KeyIterator. + 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. + 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. + 0 311403 4789116013250 -> java/util/AbstractList$Itr. + 0 311403 4789116013256 -> java/lang/Object. + 0 311403 4789116013263 <- java/lang/Object. + 0 311403 4789116013270 <- java/util/AbstractList$Itr. + 0 311403 4789116013276 <- java/util/AbstractList$Itr. + 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. + 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. + 0 311481/2 4790256871121 12 -> java/lang/String. + 0 311481/2 4790256871518 397 -> java/lang/String$CaseInsensitiveComparator. + 0 311481/2 4790256871531 12 -> java/lang/String$CaseInsensitiveComparator. + 0 311481/2 4790256871541 10 -> java/lang/Object. + 0 311481/2 4790256871549 7 <- java/lang/Object. + 0 311481/2 4790256871558 8 <- java/lang/String$CaseInsensitiveComparator. + 0 311481/2 4790256871566 7 <- java/lang/String$CaseInsensitiveComparator. + 0 311481/2 4790256871575 9 <- java/lang/String. + 0 311481/2 4790256871644 68 -> java/lang/System. + 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. + 0 311481/2 4790256871870 78 -> java/lang/ThreadGroup. + 0 311481/2 4790256871881 10 -> java/lang/Object. + 0 311481/2 4790256871889 7 <- java/lang/Object. + 0 311481/2 4790256871906 17 <- java/lang/ThreadGroup. + 0 311481/2 4790256871918 11 -> java/lang/ThreadGroup. + 0 311481/2 4790256871926 7 -> java/lang/Object. + 0 311481/2 4790256871933 7 <- java/lang/Object. + 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. + 0 311481/2 4790256872201 187 -> java/lang/Thread. + 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. + 0 311481/2 4790256872618 11 -> java/security/BasicPermission. + 0 311481/2 4790256872628 9 -> java/security/Permission. + 0 311481/2 4790256872637 9 -> java/lang/Object. + 0 311481/2 4790256872645 7 <- java/lang/Object. + 0 311481/2 4790256872656 10 <- java/security/Permission. + 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. + 0 311481/2 4790256872753 7 <- java/lang/RuntimePermission. + 0 311481/2 4790256873195 442 -> sun/misc/SoftCache. + 0 311481/2 4790256873208 12 -> java/util/AbstractMap. + 0 311481/2 4790256873218 9 -> java/lang/Object. + 0 311481/2 4790256873226 7 <- java/lang/Object. + 0 311481/2 4790256873238 11 <- java/util/AbstractMap. + 0 311481/2 4790256873371 133 -> java/lang/ref/ReferenceQueue. + 0 311481/2 4790256873443 72 -> java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873454 10 -> java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873464 9 -> java/lang/ref/ReferenceQueue. + 0 311481/2 4790256873474 9 -> java/lang/Object. + 0 311481/2 4790256873481 7 <- java/lang/Object. + 0 311481/2 4790256873542 60 -> java/lang/ref/ReferenceQueue$Lock. + 0 311481/2 4790256873553 10 -> java/lang/ref/ReferenceQueue$Lock. + 0 311481/2 4790256873562 9 -> java/lang/Object. + 0 311481/2 4790256873570 7 <- java/lang/Object. + 0 311481/2 4790256873578 7 <- java/lang/ref/ReferenceQueue$Lock. + 0 311481/2 4790256873585 7 <- java/lang/ref/ReferenceQueue$Lock. + 0 311481/2 4790256873597 11 <- java/lang/ref/ReferenceQueue. + 0 311481/2 4790256873604 7 <- java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873612 7 <- java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873622 9 -> java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873629 7 -> java/lang/ref/ReferenceQueue$Null. + 0 311481/2 4790256873636 7 -> java/lang/ref/ReferenceQueue. + 0 311481/2 4790256873644 7 -> java/lang/Object. + 0 311481/2 4790256873651 6 <- java/lang/Object. + 0 311481/2 4790256873659 7 -> java/lang/ref/ReferenceQueue$Lock. +[... 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. + 0 311481/2 4790257388560 7 -> java/nio/CharBuffer. + 0 311481/2 4790257388567 7 -> java/nio/Buffer. + 0 311481/2 4790257388574 7 -> java/lang/Object. + 0 311481/2 4790257388582 7 <- java/lang/Object. + 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. + 0 311481/2 4790257388628 7 <- java/nio/CharBuffer. + 0 311481/2 4790257388635 7 <- java/nio/HeapCharBuffer. + 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. + 0 311481/2 4790257389872 7 -> java/nio/CharBuffer. + 0 311481/2 4790257389879 7 -> java/nio/Buffer. + 0 311481/2 4790257389886 6 -> java/lang/Object. + 0 311481/2 4790257389893 7 <- java/lang/Object. + 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. + 0 311481/2 4790257389938 7 <- java/nio/CharBuffer. + 0 311481/2 4790257389946 7 <- java/nio/HeapCharBuffer. + 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. + 0 311481/2 4790258400544 7 -> java/nio/CharBuffer. + 0 311481/2 4790258400551 7 -> java/nio/Buffer. + 0 311481/2 4790258400559 7 -> java/lang/Object. + 0 311481/2 4790258400566 7 <- java/lang/Object. + 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. + 0 311481/2 4790258400612 7 <- java/nio/CharBuffer. + 0 311481/2 4790258400620 7 <- java/nio/HeapCharBuffer. + 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. + 0 311481/2 4790258401497 7 -> java/nio/CharBuffer. + 0 311481/2 4790258401504 7 -> java/nio/Buffer. + 0 311481/2 4790258401511 7 -> java/lang/Object. + 0 311481/2 4790258401518 7 <- java/lang/Object. + 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. + 0 311481/2 4790258401563 7 <- java/nio/CharBuffer. + 0 311481/2 4790258401570 7 <- java/nio/HeapCharBuffer. + 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. + 0 311481/2 4790259410618 7 -> java/nio/CharBuffer. + 0 311481/2 4790259410625 7 -> java/nio/Buffer. + 0 311481/2 4790259410633 7 -> java/lang/Object. + 0 311481/2 4790259410640 7 <- java/lang/Object. + 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. + 0 311481/2 4790259410686 7 <- java/nio/CharBuffer. + 0 311481/2 4790259410694 7 <- java/nio/HeapCharBuffer. + 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. + 0 311481/2 4790259411572 7 -> java/nio/CharBuffer. + 0 311481/2 4790259411579 7 -> java/nio/Buffer. + 0 311481/2 4790259411586 6 -> java/lang/Object. + 0 311481/2 4790259411594 7 <- java/lang/Object. + 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. + 0 311481/2 4790259411638 7 <- java/nio/CharBuffer. + 0 311481/2 4790259411646 7 <- java/nio/HeapCharBuffer. + 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. + 0 311481/2 4790260420447 8 -> java/lang/Object. + 0 311481/2 4790260420454 7 <- java/lang/Object. + 0 311481/2 4790260420464 9 -> java/lang/Object. + 0 311481/2 4790260420471 7 <- java/lang/Object. + 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. + 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. + 0 311481/2 4790260421156 12 -> java/util/AbstractList$Itr. + 0 311481/2 4790260421168 11 -> java/lang/Object. + 0 311481/2 4790260421175 7 <- java/lang/Object. + 0 311481/2 4790260421189 13 <- java/util/AbstractList$Itr. + 0 311481/2 4790260421197 7 <- java/util/AbstractList$Itr. + 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. + 0 311481/2 4790260421610 11 -> java/util/IdentityHashMap$KeySet. + 0 311481/2 4790260421622 11 -> java/util/AbstractSet. + 0 311481/2 4790260421629 7 -> java/util/AbstractCollection. + 0 311481/2 4790260421637 7 -> java/lang/Object. + 0 311481/2 4790260421644 7 <- java/lang/Object. + 0 311481/2 4790260421652 8 <- java/util/AbstractCollection. + 0 311481/2 4790260421660 7 <- java/util/AbstractSet. + 0 311481/2 4790260421668 7 <- java/util/IdentityHashMap$KeySet. + 0 311481/2 4790260421675 7 <- java/util/IdentityHashMap$KeySet. + 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. + 0 311481/2 4790260421894 11 -> java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260421905 11 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260421915 10 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260421926 10 -> java/lang/Object. + 0 311481/2 4790260421934 7 <- java/lang/Object. + 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. + 0 311481/2 4790260421994 8 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422002 7 <- java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260422010 7 <- java/util/IdentityHashMap$KeyIterator. + 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. + 0 311481/2 4790260422060 7 -> java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260422068 7 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422075 7 -> java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422083 7 -> java/lang/Object. + 0 311481/2 4790260422090 7 <- java/lang/Object. + 0 311481/2 4790260422098 8 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422106 8 <- java/util/IdentityHashMap$IdentityHashMapIterator. + 0 311481/2 4790260422114 7 <- java/util/IdentityHashMap$KeyIterator. + 0 311481/2 4790260422121 7 <- java/util/IdentityHashMap$KeyIterator. + 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. + 0 311481/2 4790260422461 143 -> java/util/LinkedHashSet. + 0 311481/2 4790260422473 12 -> java/util/HashSet. + 0 311481/2 4790260422481 7 -> java/util/AbstractSet. + 0 311481/2 4790260422488 7 -> java/util/AbstractCollection. + 0 311481/2 4790260422495 7 -> java/lang/Object. + 0 311481/2 4790260422502 7 <- java/lang/Object. + 0 311481/2 4790260422511 8 <- java/util/AbstractCollection. + 0 311481/2 4790260422519 7 <- java/util/AbstractSet. + 0 311481/2 4790260422531 12 -> java/util/LinkedHashMap. + 0 311481/2 4790260422541 10 -> java/util/HashMap. + 0 311481/2 4790260422549 7 -> java/util/AbstractMap. + 0 311481/2 4790260422556 7 -> java/lang/Object. + 0 311481/2 4790260422563 7 <- java/lang/Object. + 0 311481/2 4790260422571 7 <- java/util/AbstractMap. + 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. + 0 311481/2 4790260422615 7 -> java/util/HashMap$Entry. + 0 311481/2 4790260422623 7 -> java/lang/Object. + 0 311481/2 4790260422630 6 <- java/lang/Object. + 0 311481/2 4790260422638 7 <- java/util/HashMap$Entry. + 0 311481/2 4790260422645 7 <- java/util/LinkedHashMap$Entry. + 0 311481/2 4790260422653 7 <- java/util/LinkedHashMap.init + 0 311481/2 4790260422660 7 <- java/util/HashMap. + 0 311481/2 4790260422668 7 <- java/util/LinkedHashMap. + 0 311481/2 4790260422676 7 <- java/util/HashSet. + 0 311481/2 4790260422683 7 <- java/util/LinkedHashSet. + 0 311481/2 4790260422692 9 <- java/io/DeleteOnExitHook. + 0 311481/2 4790260422703 10 -> java/io/DeleteOnExitHook.hook + 0 311481/2 4790260422713 10 -> java/io/DeleteOnExitHook. + 0 311481/2 4790260422723 9 -> java/lang/Object. + 0 311481/2 4790260422730 7 <- java/lang/Object. + 0 311481/2 4790260422738 7 <- java/io/DeleteOnExitHook. + 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. + 0 311481/2 4790260422775 7 -> java/util/AbstractList. + 0 311481/2 4790260422783 7 -> java/util/AbstractCollection. + 0 311481/2 4790260422790 7 -> java/lang/Object. + 0 311481/2 4790260422797 7 <- java/lang/Object. + 0 311481/2 4790260422805 7 <- java/util/AbstractCollection. + 0 311481/2 4790260422813 7 <- java/util/AbstractList. + 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. + 0 311481/2 4790260422967 10 -> java/util/HashMap$KeySet. + 0 311481/2 4790260422978 10 -> java/util/AbstractSet. + 0 311481/2 4790260422985 7 -> java/util/AbstractCollection. + 0 311481/2 4790260422993 7 -> java/lang/Object. + 0 311481/2 4790260423000 7 <- java/lang/Object. + 0 311481/2 4790260423008 7 <- java/util/AbstractCollection. + 0 311481/2 4790260423015 7 <- java/util/AbstractSet. + 0 311481/2 4790260423023 7 <- java/util/HashMap$KeySet. + 0 311481/2 4790260423031 7 <- java/util/HashMap$KeySet. + 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. + 0 311481/2 4790260423254 11 -> java/util/LinkedHashMap$KeyIterator. + 0 311481/2 4790260423266 11 -> java/util/LinkedHashMap$LinkedHashIterator. + 0 311481/2 4790260423276 9 -> java/util/LinkedHashMap$LinkedHashIterator. + 0 311481/2 4790260423286 10 -> java/lang/Object. + 0 311481/2 4790260423294 7 <- java/lang/Object. + 0 311481/2 4790260423311 16 <- java/util/LinkedHashMap$LinkedHashIterator. + 0 311481/2 4790260423319 8 <- java/util/LinkedHashMap$LinkedHashIterator. + 0 311481/2 4790260423327 7 <- java/util/LinkedHashMap$KeyIterator. + 0 311481/2 4790260423334 7 <- java/util/LinkedHashMap$KeyIterator. + 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. + 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. + 0 311481/2 4790260423460 7 -> java/util/AbstractList$Itr. + 0 311481/2 4790260423468 7 -> java/lang/Object. + 0 311481/2 4790260423475 7 <- java/lang/Object. + 0 311481/2 4790260423483 7 <- java/util/AbstractList$Itr. + 0 311481/2 4790260423490 7 <- java/util/AbstractList$Itr. + 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. + 311492 1 java/io/BufferedReader. + 311492 1 java/io/BufferedReader.close + 311492 1 java/io/BufferedWriter. + 311492 1 java/io/Console$1$1. + 311492 1 java/io/Console$1$1.run + 311492 1 java/io/Console$1. + 311492 1 java/io/Console$1.consoleRestoreHook + 311492 1 java/io/Console. + 311492 1 java/io/Console.access$600 + 311492 1 java/io/DataInputStream. + 311492 1 java/io/DataInputStream.readFully + 311492 1 java/io/DeleteOnExitHook. + 311492 1 java/io/DeleteOnExitHook. + 311492 1 java/io/DeleteOnExitHook.hook + 311492 1 java/io/DeleteOnExitHook.run + 311492 1 java/io/File$1. + 311492 1 java/io/File$1.run + 311492 1 java/io/File. + 311492 1 java/io/File.lastModified + 311492 1 java/io/File.length + 311492 1 java/io/FileDescriptor. + 311492 1 java/io/FileDescriptor.initIDs + 311492 1 java/io/FileInputStream. + 311492 1 java/io/FileInputStream.available + 311492 1 java/io/FileInputStream.initIDs + 311492 1 java/io/FileOutputStream. + 311492 1 java/io/FileOutputStream.initIDs + 311492 1 java/io/FilePermission.newPermissionCollection + 311492 1 java/io/FilePermissionCollection. + 311492 1 java/io/FilePermissionCollection. + 311492 1 java/io/FilePermissionCollection.add + 311492 1 java/io/FileReader. + 311492 1 java/io/FileSystem. + 311492 1 java/io/FileSystem. + 311492 1 java/io/FileSystem.getFileSystem + 311492 1 java/io/FilterInputStream.close + 311492 1 java/io/InputStreamReader. + 311492 1 java/io/InputStreamReader.close + 311492 1 java/io/ObjectStreamClass. + 311492 1 java/io/ObjectStreamClass.initNative + 311492 1 java/io/UnixFileSystem. + 311492 1 java/io/UnixFileSystem. + 311492 1 java/io/UnixFileSystem.getLastModifiedTime + 311492 1 java/io/UnixFileSystem.getLength + 311492 1 java/io/UnixFileSystem.initIDs + 311492 1 java/lang/AbstractStringBuilder. + 311492 1 java/lang/ApplicationShutdownHooks. + 311492 1 java/lang/ApplicationShutdownHooks. + 311492 1 java/lang/ApplicationShutdownHooks.hook + 311492 1 java/lang/ApplicationShutdownHooks.run + 311492 1 java/lang/Boolean. + 311492 1 java/lang/Byte. + 311492 1 java/lang/Character. + 311492 1 java/lang/CharacterDataLatin1. + 311492 1 java/lang/Class. + 311492 1 java/lang/Class.access$302 + 311492 1 java/lang/Class.registerNatives + 311492 1 java/lang/ClassLoader$3. + 311492 1 java/lang/ClassLoader$3.run + 311492 1 java/lang/ClassLoader$NativeLibrary. + 311492 1 java/lang/ClassLoader$NativeLibrary.getFromClass + 311492 1 java/lang/ClassLoader$NativeLibrary.load + 311492 1 java/lang/ClassLoader. + 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. + 311492 1 java/lang/Compiler$1.run + 311492 1 java/lang/Compiler. + 311492 1 java/lang/Compiler.registerNatives + 311492 1 java/lang/Double. + 311492 1 java/lang/Double.doubleToLongBits + 311492 1 java/lang/Double.doubleToRawLongBits + 311492 1 java/lang/Error. + 311492 1 java/lang/Float. + 311492 1 java/lang/Float.floatToIntBits + 311492 1 java/lang/Float.floatToRawIntBits + 311492 1 java/lang/IncompatibleClassChangeError. + 311492 1 java/lang/Integer. + 311492 1 java/lang/LinkageError. + 311492 1 java/lang/Long. + 311492 1 java/lang/Math. + 311492 1 java/lang/NoSuchMethodError. + 311492 1 java/lang/Object. + 311492 1 java/lang/Object.notifyAll + 311492 1 java/lang/Object.registerNatives + 311492 1 java/lang/Runtime. + 311492 1 java/lang/Runtime. + 311492 1 java/lang/Runtime.loadLibrary0 + 311492 1 java/lang/Runtime.maxMemory + 311492 1 java/lang/Short. + 311492 1 java/lang/Shutdown. + 311492 1 java/lang/Shutdown.runHooks + 311492 1 java/lang/Shutdown.sequence + 311492 1 java/lang/Shutdown.shutdown + 311492 1 java/lang/String. + 311492 1 java/lang/String.checkBounds + 311492 1 java/lang/String.length + 311492 1 java/lang/String.trim + 311492 1 java/lang/StringBuffer. + 311492 1 java/lang/StringCoding$StringDecoder.decode + 311492 1 java/lang/StringCoding. + 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. + 311492 1 java/lang/System. + 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. + 311492 1 java/lang/SystemClassLoaderAction.run + 311492 1 java/lang/Terminator$1. + 311492 1 java/lang/Terminator. + 311492 1 java/lang/Terminator.setup + 311492 1 java/lang/Thread. + 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. + 311492 1 java/lang/ThreadLocal$ThreadLocalMap. + 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. + 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. + 311492 1 java/lang/ref/Finalizer$FinalizerThread.run + 311492 1 java/lang/ref/Finalizer. + 311492 1 java/lang/ref/Finalizer.access$000 + 311492 1 java/lang/ref/Reference$ReferenceHandler. + 311492 1 java/lang/ref/Reference$ReferenceHandler.run + 311492 1 java/lang/ref/Reference. + 311492 1 java/lang/ref/Reference.access$200 + 311492 1 java/lang/ref/ReferenceQueue. + 311492 1 java/lang/ref/ReferenceQueue.reallyPoll + 311492 1 java/lang/reflect/AccessibleObject. + 311492 1 java/lang/reflect/Constructor. + 311492 1 java/lang/reflect/Field. + 311492 1 java/lang/reflect/Field.getName + 311492 1 java/lang/reflect/Method. + 311492 1 java/lang/reflect/Method.getModifiers + 311492 1 java/lang/reflect/Modifier. + 311492 1 java/lang/reflect/Modifier.isVolatile + 311492 1 java/lang/reflect/ReflectAccess. + 311492 1 java/lang/reflect/ReflectPermission. + 311492 1 java/net/ContentHandler. + 311492 1 java/net/Parts.getQuery + 311492 1 java/net/URL. + 311492 1 java/net/URL.openConnection + 311492 1 java/net/URLClassLoader$7. + 311492 1 java/net/URLClassLoader. + 311492 1 java/net/URLClassLoader.access$000 + 311492 1 java/net/URLClassLoader.defineClass + 311492 1 java/net/URLClassLoader.getPermissions + 311492 1 java/net/URLConnection. + 311492 1 java/net/URLConnection. + 311492 1 java/net/UnknownContentHandler. + 311492 1 java/nio/Bits. + 311492 1 java/nio/ByteOrder. + 311492 1 java/nio/charset/Charset. + 311492 1 java/nio/charset/Charset. + 311492 1 java/nio/charset/CharsetDecoder. + 311492 1 java/nio/charset/CharsetDecoder.flush + 311492 1 java/nio/charset/CharsetDecoder.implFlush + 311492 1 java/nio/charset/CharsetEncoder. + 311492 1 java/nio/charset/CoderResult$1. + 311492 1 java/nio/charset/CoderResult$2. + 311492 1 java/nio/charset/CoderResult. + 311492 1 java/nio/charset/CodingErrorAction. + 311492 1 java/nio/charset/spi/CharsetProvider. + 311492 1 java/security/AccessControlContext. + 311492 1 java/security/BasicPermission.newPermissionCollection + 311492 1 java/security/BasicPermissionCollection. + 311492 1 java/security/BasicPermissionCollection. + 311492 1 java/security/BasicPermissionCollection.add + 311492 1 java/security/CodeSource. + 311492 1 java/security/Permissions. + 311492 1 java/security/Policy$UnsupportedEmptyCollection. + 311492 1 java/security/Policy. + 311492 1 java/security/PrivilegedActionException. + 311492 1 java/security/ProtectionDomain. + 311492 1 java/security/ProtectionDomain. + 311492 1 java/security/SecureClassLoader. + 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. + 311492 1 java/util/BitSet. + 311492 1 java/util/BitSet.initWords + 311492 1 java/util/Collections$SynchronizedMap. + 311492 1 java/util/Collections. + 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. + 311492 1 java/util/HashSet.iterator + 311492 1 java/util/HashSet.size + 311492 1 java/util/Hashtable$EmptyEnumerator. + 311492 1 java/util/Hashtable$EmptyIterator. + 311492 1 java/util/Hashtable. + 311492 1 java/util/IdentityHashMap. + 311492 1 java/util/IdentityHashMap. + 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. + 311492 1 java/util/Locale. + 311492 1 java/util/Locale.getInstance + 311492 1 java/util/Properties. + 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. + 311492 1 java/util/concurrent/atomic/AtomicInteger. + 311492 1 java/util/concurrent/atomic/AtomicInteger.get + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl. + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl. + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater. + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater.newUpdater + 311492 1 java/util/concurrent/locks/AbstractQueuedSynchronizer. + 311492 1 java/util/concurrent/locks/AbstractQueuedSynchronizer.getState + 311492 1 java/util/jar/JarEntry. + 311492 1 java/util/jar/JarFile$JarFileEntry. + 311492 1 java/util/jar/JarFile. + 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. + 311492 1 java/util/jar/JavaUtilJarAccessImpl.jarFileHasClassPathAttribute + 311492 1 java/util/zip/Inflater. + 311492 1 java/util/zip/Inflater. + 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. + 311492 1 java/util/zip/InflaterInputStream.ensureOpen + 311492 1 java/util/zip/InflaterInputStream.read + 311492 1 java/util/zip/ZipEntry. + 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. + 311492 1 java/util/zip/ZipFile$1.close + 311492 1 java/util/zip/ZipFile$1.fill + 311492 1 java/util/zip/ZipFile$ZipFileInputStream. + 311492 1 java/util/zip/ZipFile$ZipFileInputStream.read + 311492 1 java/util/zip/ZipFile. + 311492 1 java/util/zip/ZipFile. + 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. + 311492 1 sun/misc/FileURLMapper.exists + 311492 1 sun/misc/JarIndex.getJarIndex + 311492 1 sun/misc/Launcher$AppClassLoader$1. + 311492 1 sun/misc/Launcher$AppClassLoader$1.run + 311492 1 sun/misc/Launcher$AppClassLoader. + 311492 1 sun/misc/Launcher$AppClassLoader. + 311492 1 sun/misc/Launcher$AppClassLoader.getAppClassLoader + 311492 1 sun/misc/Launcher$AppClassLoader.getPermissions + 311492 1 sun/misc/Launcher$ExtClassLoader$1. + 311492 1 sun/misc/Launcher$ExtClassLoader$1.run + 311492 1 sun/misc/Launcher$ExtClassLoader. + 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. + 311492 1 sun/misc/Launcher. + 311492 1 sun/misc/Launcher. + 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. + 311492 1 sun/misc/Resource. + 311492 1 sun/misc/Resource.getByteBuffer + 311492 1 sun/misc/Resource.getBytes + 311492 1 sun/misc/Resource.getCodeSigners + 311492 1 sun/misc/SharedSecrets. + 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. + 311492 1 sun/misc/SignalHandler. + 311492 1 sun/misc/SoftCache. + 311492 1 sun/misc/URLClassPath$FileLoader$1. + 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. + 311492 1 sun/misc/URLClassPath$FileLoader.getResource + 311492 1 sun/misc/URLClassPath$JarLoader$1. + 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. + 311492 1 sun/misc/URLClassPath.access$300 + 311492 1 sun/misc/Unsafe. + 311492 1 sun/misc/Unsafe. + 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. + 311492 1 sun/misc/VM.booted + 311492 1 sun/misc/VM.initialize + 311492 1 sun/misc/VM.initializeOSEnvironment + 311492 1 sun/misc/Version. + 311492 1 sun/net/www/MessageHeader. + 311492 1 sun/net/www/MessageHeader.grow + 311492 1 sun/net/www/ParseUtil. + 311492 1 sun/net/www/URLConnection. + 311492 1 sun/net/www/protocol/file/FileURLConnection. + 311492 1 sun/net/www/protocol/file/FileURLConnection. + 311492 1 sun/net/www/protocol/file/FileURLConnection.getPermission + 311492 1 sun/net/www/protocol/file/Handler. + 311492 1 sun/net/www/protocol/file/Handler.createFileURLConnection + 311492 1 sun/nio/cs/FastCharsetProvider. + 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. + 311492 1 sun/nio/cs/StandardCharsets. + 311492 1 sun/nio/cs/StreamDecoder. + 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. + 311492 1 sun/nio/cs/Surrogate$Parser. + 311492 1 sun/nio/cs/US_ASCII$Decoder. + 311492 1 sun/nio/cs/US_ASCII$Encoder. + 311492 1 sun/nio/cs/US_ASCII. + 311492 1 sun/reflect/Reflection. + 311492 1 sun/reflect/ReflectionFactory$1. + 311492 1 sun/reflect/ReflectionFactory$1.run + 311492 1 sun/reflect/ReflectionFactory. + 311492 1 sun/reflect/ReflectionFactory. + 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. + 311492 1 sun/security/util/Debug. + 311492 2 java/io/BufferedInputStream. + 311492 2 java/io/BufferedOutputStream. + 311492 2 java/io/BufferedReader. + 311492 2 java/io/BufferedReader.fill + 311492 2 java/io/ExpiringCache$1. + 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. + 311492 2 java/io/FilePermission$1. + 311492 2 java/io/FilePermission. + 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. + 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. + 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. + 311492 2 java/lang/ClassLoader.initializePath + 311492 2 java/lang/ClassNotFoundException. + 311492 2 java/lang/Object.clone + 311492 2 java/lang/Runtime.getRuntime + 311492 2 java/lang/String$CaseInsensitiveComparator. + 311492 2 java/lang/String.concat + 311492 2 java/lang/String.regionMatches + 311492 2 java/lang/StringCoding$StringDecoder. + 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. + 311492 2 java/lang/ref/Reference$Lock. + 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. + 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. + 311492 2 java/net/URLClassLoader$1.run + 311492 2 java/net/URLClassLoader. + 311492 2 java/net/URLClassLoader.findClass + 311492 2 java/net/URLStreamHandler.parseURL + 311492 2 java/net/URLStreamHandler.setURL + 311492 2 java/nio/ByteOrder. + 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. + 311492 2 java/nio/charset/CoderResult.isError + 311492 2 java/security/AccessControlContext. + 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. + 311492 2 java/security/Permissions.add + 311492 2 java/security/Permissions.getPermissionCollection + 311492 2 java/security/SecureClassLoader. + 311492 2 java/util/AbstractList.iterator + 311492 2 java/util/BitSet.ensureCapacity + 311492 2 java/util/Collections$EmptyList. + 311492 2 java/util/Collections$EmptyMap. + 311492 2 java/util/Collections$EmptySet. + 311492 2 java/util/Collections$ReverseComparator. + 311492 2 java/util/HashMap$KeySet. + 311492 2 java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 311492 2 java/util/IdentityHashMap$KeySet. + 311492 2 java/util/IdentityHashMap$KeySet.iterator + 311492 2 java/util/LinkedHashMap$KeyIterator. + 311492 2 java/util/LinkedHashMap$LinkedHashIterator. + 311492 2 java/util/Properties. + 311492 2 java/util/StringTokenizer.setMaxDelimCodePoint + 311492 2 java/util/concurrent/ConcurrentHashMap. + 311492 2 java/util/jar/JarFile. + 311492 2 java/util/zip/Inflater.inflate + 311492 2 java/util/zip/Inflater.inflateBytes + 311492 2 java/util/zip/ZipEntry. + 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. + 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. + 311492 2 sun/misc/Resource.cachedInputStream + 311492 2 sun/misc/URLClassPath. + 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. + 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. + 311492 2 sun/nio/cs/StandardCharsets$Cache. + 311492 2 sun/nio/cs/StandardCharsets$Classes. + 311492 2 sun/nio/cs/StreamDecoder. + 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. + 311492 2 sun/nio/cs/US_ASCII.newEncoder + 311492 2 sun/reflect/DelegatingConstructorAccessorImpl. + 311492 2 sun/reflect/DelegatingConstructorAccessorImpl.setDelegate + 311492 2 sun/reflect/NativeConstructorAccessorImpl. + 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. + 311492 3 java/io/FileInputStream.read + 311492 3 java/io/FileInputStream.readBytes + 311492 3 java/io/FilterInputStream. + 311492 3 java/io/PrintStream.newLine + 311492 3 java/io/PrintStream.print + 311492 3 java/io/PrintStream.println + 311492 3 java/io/Reader. + 311492 3 java/lang/Boolean. + 311492 3 java/lang/Class$3. + 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. + 311492 3 java/lang/Integer. + 311492 3 java/lang/Object.wait + 311492 3 java/lang/RuntimePermission. + 311492 3 java/lang/Shutdown.add + 311492 3 java/lang/Thread.sleep + 311492 3 java/lang/ThreadLocal. + 311492 3 java/lang/ThreadLocal.getMap + 311492 3 java/lang/ThreadLocal.nextHashCode + 311492 3 java/lang/ref/WeakReference. + 311492 3 java/lang/reflect/Constructor.newInstance + 311492 3 java/net/URLStreamHandler. + 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. + 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. + 311492 3 java/util/Hashtable.rehash + 311492 3 java/util/LinkedHashMap. + 311492 3 java/util/LinkedHashMap.init + 311492 3 java/util/Stack. + 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. + 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. + 311492 4 java/io/BufferedWriter. + 311492 4 java/io/ExpiringCache$Entry.timestamp + 311492 4 java/io/ExpiringCache. + 311492 4 java/io/File.compareTo + 311492 4 java/io/File.equals + 311492 4 java/io/FilePermission$1.run + 311492 4 java/io/FilterOutputStream. + 311492 4 java/io/PrintStream. + 311492 4 java/io/UnixFileSystem.compare + 311492 4 java/lang/Character.toUpperCase + 311492 4 java/lang/Class.getDeclaredFields0 + 311492 4 java/lang/Number. + 311492 4 java/lang/Shutdown$Lock. + 311492 4 java/lang/String.compareTo + 311492 4 java/lang/ThreadGroup.getParent + 311492 4 java/lang/Throwable. + 311492 4 java/lang/Throwable.fillInStackTrace + 311492 4 java/lang/ref/ReferenceQueue$Null. + 311492 4 java/lang/ref/ReferenceQueue. + 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. + 311492 4 java/nio/charset/CoderResult$Cache. + 311492 4 java/security/BasicPermission. + 311492 4 java/security/BasicPermission.init + 311492 4 java/util/AbstractList$Itr. + 311492 4 java/util/ArrayList.toArray + 311492 4 java/util/Collections$SynchronizedMap.get + 311492 4 java/util/IdentityHashMap$IdentityHashMapIterator. + 311492 4 java/util/IdentityHashMap$KeyIterator. + 311492 4 java/util/LinkedHashMap$Entry.recordAccess + 311492 4 java/util/StringTokenizer. + 311492 4 java/util/zip/ZipFile.ensureOpen + 311492 4 sun/misc/MetaIndex. + 311492 4 sun/misc/MetaIndex.mayContain + 311492 4 sun/nio/cs/FastCharsetProvider.canonicalize + 311492 4 sun/nio/cs/StreamEncoder. + 311492 4 sun/nio/cs/US_ASCII$Encoder. + 311492 4 sun/nio/cs/US_ASCII.newDecoder + 311492 4 sun/reflect/ConstructorAccessorImpl. + 311492 4 sun/reflect/MagicAccessorImpl. + 311492 4 sun/reflect/Reflection.filterFields + 311492 4 sun/reflect/ReflectionFactory$GetReflectionFactoryAction. + 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. + 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. + 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. + 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. + 311492 6 java/io/OutputStreamWriter.flushBuffer + 311492 6 java/io/OutputStreamWriter.write + 311492 6 java/io/UnixFileSystem.canonicalize0 + 311492 6 java/io/Writer. + 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. + 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. + 311492 6 java/nio/HeapByteBuffer. + 311492 6 java/nio/charset/CharsetDecoder.decode + 311492 6 java/nio/charset/CharsetEncoder.encode + 311492 6 java/security/Permission. + 311492 6 java/util/AbstractSet. + 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. + 311492 6 sun/misc/URLClassPath$3.run + 311492 6 sun/misc/URLClassPath$JarLoader.isOptimizable + 311492 6 sun/misc/URLClassPath$Loader. + 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. + 311492 7 java/lang/ClassLoader.checkPackageAccess + 311492 7 java/lang/ref/SoftReference. + 311492 7 java/util/Dictionary. + 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. + 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. + 311492 8 java/lang/ref/Finalizer. + 311492 8 java/lang/ref/Finalizer.add + 311492 8 java/lang/ref/Finalizer.register + 311492 8 java/lang/ref/ReferenceQueue$Lock. + 311492 8 java/lang/reflect/AccessibleObject. + 311492 8 java/nio/charset/CharsetDecoder. + 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. + 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. + 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. + 311492 11 java/nio/CharBuffer. + 311492 11 java/nio/HeapCharBuffer. + 311492 12 java/io/BufferedWriter.ensureOpen + 311492 12 java/io/ExpiringCache$1.removeEldestEntry + 311492 12 java/io/ExpiringCache$Entry. + 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. + 311492 15 java/lang/Object.hashCode + 311492 15 java/nio/charset/Charset.checkName + 311492 15 java/util/ArrayList. + 311492 15 java/util/HashMap.addEntry + 311492 15 java/util/LinkedHashMap$Entry. + 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. + 311492 16 java/util/concurrent/ConcurrentHashMap$Segment.setTable + 311492 16 java/util/concurrent/locks/AbstractOwnableSynchronizer. + 311492 16 java/util/concurrent/locks/AbstractQueuedSynchronizer. + 311492 16 java/util/concurrent/locks/ReentrantLock$NonfairSync. + 311492 16 java/util/concurrent/locks/ReentrantLock$Sync. + 311492 16 java/util/concurrent/locks/ReentrantLock. + 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. + 311492 17 java/util/Locale.getDefault + 311492 17 sun/security/action/GetPropertyAction. + 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. + 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. + 311492 20 java/nio/ByteBuffer.array + 311492 20 java/util/AbstractList. + 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. + 311492 23 java/util/concurrent/ConcurrentHashMap$HashEntry. + 311492 24 java/nio/charset/CoderResult.isUnderflow + 311492 24 java/util/AbstractMap. + 311492 24 java/util/Vector.elementAt + 311492 25 java/lang/Class.getClassLoader + 311492 26 java/util/AbstractCollection. + 311492 26 java/util/ArrayList.add + 311492 26 java/util/ArrayList.ensureCapacity + 311492 27 java/lang/ClassLoader.loadClass + 311492 27 java/net/URL. + 311492 28 java/lang/ClassLoader.check + 311492 28 java/lang/ClassLoader.checkName + 311492 28 java/lang/ref/Reference. + 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. + 311492 30 java/util/LinkedHashMap.get + 311492 33 java/util/HashMap.put + 311492 33 java/util/Vector. + 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. + 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. + 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. + 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. + 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. + 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. + 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. 1 + 311536 method java/io/BufferedReader. 1 + 311536 method java/io/BufferedReader.close 1 + 311536 method java/io/BufferedWriter. 1 + 311536 method java/io/Console$1$1. 1 + 311536 method java/io/Console$1$1.run 1 + 311536 method java/io/Console$1. 1 + 311536 method java/io/Console$1.consoleRestoreHook 1 + 311536 method java/io/Console. 1 + 311536 method java/io/Console.access$600 1 + 311536 method java/io/DataInputStream. 1 + 311536 method java/io/DataInputStream.readFully 1 + 311536 method java/io/DeleteOnExitHook. 1 + 311536 method java/io/DeleteOnExitHook. 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. 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. 20 + 311536 method java/nio/ByteBuffer.array 20 + 311536 method java/util/AbstractList. 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. 23 + 311536 method java/util/concurrent/ConcurrentHashMap$HashEntry. 23 + 311536 syscall stat64 23 + 311536 method java/nio/charset/CoderResult.isUnderflow 24 + 311536 method java/util/AbstractMap. 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. 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. 27 + 311536 method java/lang/ClassLoader.check 28 + 311536 method java/lang/ClassLoader.checkName 28 + 311536 method java/lang/ref/Reference. 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. 30 + 311536 method java/util/LinkedHashMap.get 30 + 311536 syscall priocntlsys 30 + 311536 method java/util/HashMap.put 33 + 311536 method java/util/Vector. 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. 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. 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. 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. 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. 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. 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. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +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. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +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. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +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. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +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. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +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. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +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. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 9 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +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. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +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. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +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. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +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. +0 311542/2 10 method -> java/nio/CharBuffer. +0 311542/2 10 method -> java/nio/Buffer. +0 311542/2 9 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +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. +0 311542/2 10 method <- java/nio/CharBuffer. +0 311542/2 10 method <- java/nio/HeapCharBuffer. +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. +0 311542/2 12 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +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. +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. +0 311542/2 28 method -> java/util/AbstractList$Itr. +0 311542/2 17 method -> java/lang/Object. +0 311542/2 12 method <- java/lang/Object. +0 311542/2 25 method <- java/util/AbstractList$Itr. +0 311542/2 11 method <- java/util/AbstractList$Itr. +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. +0 311542/2 14 method -> java/util/IdentityHashMap$KeySet. +0 311542/2 14 method -> java/util/AbstractSet. +0 311542/2 10 method -> java/util/AbstractCollection. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method <- java/util/AbstractCollection. +0 311542/2 10 method <- java/util/AbstractSet. +0 311542/2 10 method <- java/util/IdentityHashMap$KeySet. +0 311542/2 10 method <- java/util/IdentityHashMap$KeySet. +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. +0 311542/2 14 method -> java/util/IdentityHashMap$KeyIterator. +0 311542/2 14 method -> java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 13 method -> java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 57 method -> java/lang/Object. +0 311542/2 11 method <- java/lang/Object. +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. +0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator. +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. +0 311542/2 10 method -> java/util/IdentityHashMap$KeyIterator. +0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator. +0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator. +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. +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. +0 311542/2 15 method -> java/util/HashSet. +0 311542/2 10 method -> java/util/AbstractSet. +0 311542/2 10 method -> java/util/AbstractCollection. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method <- java/util/AbstractCollection. +0 311542/2 10 method <- java/util/AbstractSet. +0 311542/2 15 method -> java/util/LinkedHashMap. +0 311542/2 13 method -> java/util/HashMap. +0 311542/2 10 method -> java/util/AbstractMap. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 10 method <- java/util/AbstractMap. +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. +0 311542/2 10 method -> java/util/HashMap$Entry. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +0 311542/2 10 method <- java/util/HashMap$Entry. +0 311542/2 10 method <- java/util/LinkedHashMap$Entry. +0 311542/2 10 method <- java/util/LinkedHashMap.init +0 311542/2 10 method <- java/util/HashMap. +0 311542/2 10 method <- java/util/LinkedHashMap. +0 311542/2 10 method <- java/util/HashSet. +0 311542/2 10 method <- java/util/LinkedHashSet. +0 311542/2 12 method <- java/io/DeleteOnExitHook. +0 311542/2 13 method -> java/io/DeleteOnExitHook.hook +0 311542/2 13 method -> java/io/DeleteOnExitHook. +0 311542/2 12 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 10 method <- java/io/DeleteOnExitHook. +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. +0 311542/2 10 method -> java/util/AbstractList. +0 311542/2 10 method -> java/util/AbstractCollection. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +0 311542/2 10 method <- java/util/AbstractCollection. +0 311542/2 10 method <- java/util/AbstractList. +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. +0 311542/2 14 method -> java/util/HashMap$KeySet. +0 311542/2 14 method -> java/util/AbstractSet. +0 311542/2 10 method -> java/util/AbstractCollection. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 11 method <- java/util/AbstractCollection. +0 311542/2 10 method <- java/util/AbstractSet. +0 311542/2 10 method <- java/util/HashMap$KeySet. +0 311542/2 10 method <- java/util/HashMap$KeySet. +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. +0 311542/2 14 method -> java/util/LinkedHashMap$KeyIterator. +0 311542/2 14 method -> java/util/LinkedHashMap$LinkedHashIterator. +0 311542/2 12 method -> java/util/LinkedHashMap$LinkedHashIterator. +0 311542/2 13 method -> java/lang/Object. +0 311542/2 10 method <- java/lang/Object. +0 311542/2 19 method <- java/util/LinkedHashMap$LinkedHashIterator. +0 311542/2 11 method <- java/util/LinkedHashMap$LinkedHashIterator. +0 311542/2 10 method <- java/util/LinkedHashMap$KeyIterator. +0 311542/2 10 method <- java/util/LinkedHashMap$KeyIterator. +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. +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. +0 311542/2 10 method -> java/util/AbstractList$Itr. +0 311542/2 10 method -> java/lang/Object. +0 311542/2 9 method <- java/lang/Object. +0 311542/2 10 method <- java/util/AbstractList$Itr. +0 311542/2 10 method <- java/util/AbstractList$Itr. +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 + obj-free BarProp 1 + obj-free CSSStyleDeclaration 1 + obj-free Global Scope Polluter 1 + obj-free HTMLCollection 1 + obj-free HTMLDocument 1 + obj-free HTMLHtmlElement 1 + obj-free KeyboardEvent 1 + obj-free Location 1 + obj-free NodeList 1 + obj-free StyleSheetList 1 + obj-free TreeSelection 1 + obj-free Window 1 + obj-free XULCommandDispatcher 1 + obj-free chrome://global/content/bindings/scrollbar.xml#scrollbar 8c35ec2 1 + obj-free nsXPCComponents_Classes 1 + obj-free xpcTempGlobalClass 1 + obj-new BarProp 1 + obj-new CSSStyleDeclaration 1 + obj-new Global Scope Polluter 1 + obj-new HTMLCollection 1 + obj-new HTMLDocument 1 + obj-new HTMLHtmlElement 1 + obj-new KeyboardEvent 1 + obj-new NodeList 1 + obj-new StyleSheetList 1 + obj-new TreeSelection 1 + obj-new Window 1 + obj-new XULCommandDispatcher 1 + obj-new chrome://global/content/bindings/popup.xml#popup 8befc22 1 + obj-new chrome://global/content/bindings/popup.xml#popup 8befcea 1 + obj-new chrome://global/content/bindings/scrollbar.xml#scrollbar 8ce1c1a 1 + obj-new nsXPCComponents_Classes 1 + 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 + obj-free BoxObject 2 + obj-free HTMLBodyElement 2 + obj-free JSOptions 2 + obj-free JavaArray 2 + obj-free JavaClass 2 + obj-free JavaMember 2 + obj-free JavaObject 2 + obj-free PageTransitionEvent 2 + obj-free nsJSCID 2 + obj-new BoxObject 2 + obj-new HTMLBodyElement 2 + obj-new JSOptions 2 + obj-new JavaArray 2 + obj-new JavaClass 2 + obj-new JavaMember 2 + obj-new JavaObject 2 + 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 2 + dom.js func 2 + events.js func 2 + firebug.js func appendChild 2 + firebug.js obj-new XPC_WN_NoMods_Proto_JSClass 2 + general.xml func getAttribute 2 + layout.js func 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 2 + style.js func 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 + obj-free DOM Constructor.prototype 3 + obj-free With 3 + obj-free nsXPCComponents 3 + obj-new Array 3 + obj-new DOM Constructor.prototype 3 + obj-new With 3 + obj-new XPC_WN_NoMods_Proto_JSClass 3 + 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 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 + obj-free Call 5 + view.js func 5 + obj-free XPCNativeWrapper 6 + obj-free XPC_WN_NoMods_Proto_JSClass 6 + 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 6 + webdeveloper.js obj-new Function 6 + obj-new Object 7 + firebug.js func removeAttribute 7 + tabbrowser.xml obj-new Function 7 + tree.xml func QueryInterface 7 + obj-free Array 8 + browser.js func hasAttribute 8 + globalOverlay.js func removeAttribute 8 + reporterOverlay.js func 8 + browser.js func getElementById 9 + browser.js func setAttribute 9 + browser.xml obj-new Function 9 + webdeveloper.js func getElementById 9 + obj-free Constructor 10 + obj-free Object 10 + obj-free XPC_WN_ModsAllowed_Proto_JSClass 10 + obj-new Constructor 10 + 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 + obj-free XULElement 16 + button.xml func hasAttribute 16 + obj-free Event 17 + browser.js func 17 + obj-new Event 18 + text.xml func getAttribute 19 + firebug.js func getAttribute 20 + globalOverlay.js func setAttribute 20 + obj-free MouseEvent 22 + obj-new MouseEvent 22 + globalOverlay.js func isCommandEnabled 22 + webdeveloper.js func setAttribute 22 + obj-free String 26 + firebug.js func setAttribute 26 + obj-free RegExp 28 + 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 + obj-free XPCWrappedNative_NoHelper 32 + obj-new XPCWrappedNative_NoHelper 32 + consoleAPI.js obj-new Function 33 + browser.xml func QueryInterface 38 + obj-free JavaPackage 41 + obj-new JavaPackage 41 + scrollbar.xml obj-new Function 61 + firebug.js func 62 + text.xml exec . 84 + obj-new XULElement 85 + obj-new Function 172 + 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 + 5 Function + func_clock.html 6 Date + 7 MouseEvent + + FILE TOTAL CLASS 2007 Sep 23 22:59:30 + browser.js 3 Function + 5 Function + func_clock.html 7 Date + 10 MouseEvent + + FILE TOTAL CLASS 2007 Sep 23 22:59:31 + 1 Constructor + 1 HTMLBodyElement + 1 XPCNativeWrapper + 1 XPC_WN_ModsAllowed_Proto_JSClass + browser.js 1 Array + browser.js 1 XPCNativeWrapper + popup.xml 1 Array + func_clock.html 7 Date + 13 MouseEvent + 18 Function + browser.js 20 Function + + FILE TOTAL CLASS 2007 Sep 23 22:59:32 + 1 BoxObject + 1 Constructor + 1 HTMLBodyElement + 1 NodeList + 1 UIEvent + 1 XPCNativeWrapper + 1 XPC_WN_ModsAllowed_Proto_JSClass + 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a + 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 + 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 + 15 MouseEvent + bookmarks.js 19 Error + browser.js 20 Function + bookmarks.js 22 Function + 39 XPCWrappedNative_NoHelper + 44 Function + 60 RegExp + 191 XULElement + +[... 39 seconds deleted ...] + + FILE TOTAL CLASS 2007 Sep 23 23:00:10 + 1 HTMLBodyElement + 1 HTMLCollection + 1 TreeColumns + 1 XPCNativeWrapper + 1 XPC_WN_NoMods_Proto_JSClass + 1 XULTreeBuilder + 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a + 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba + 1 chrome://global/content/bindings/tree.xml#treebody 84caa3a + 1 chrome://global/content/bindings/tree.xml#treebody 84e3a72 + 1 nsXPCComponents_Interfaces + 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 + 2 Constructor + 2 UIEvent + 2 XPC_WN_ModsAllowed_Proto_JSClass + 2 nsXPCComponents_Classes + browser.js 2 nsJSCID + browser.js 2 nsJSIID + utilityOverlay.js 2 nsJSCID + utilityOverlay.js 2 nsJSIID + 3 Array + 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 + 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 + 157 MouseEvent + firebug-service.js 172 Function + 307 XPCWrappedNative_NoHelper + 388 RegExp + 488 Event + 876 XULElement + 1221 Function + + FILE TOTAL CLASS 2007 Sep 23 23:00:11 + -94 Date + -34 Function + -4 MouseEvent + -2 Array + -1 HTMLBodyElement + -1 HTMLCollection + -1 XPCNativeWrapper + -1 XPC_WN_ModsAllowed_Proto_JSClass + 0 Array + 0 HTMLBodyElement + 0 HTMLCollection + 0 RegExp + 0 TreeColumns + 0 UIEvent + 0 XPC_WN_NoMods_Proto_JSClass + 0 XULTreeBuilder + 0 nsXPCComponents_Classes + 0 nsXPCComponents_Interfaces + 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 + 1 NodeList + 1 XPCNativeWrapper + 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a + 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba + 1 chrome://global/content/bindings/tree.xml#treebody 84caa3a + 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 + 2 Constructor + 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 + 6 Event + 6 MouseEvent + bookmarks.js 9 XPCWrappedNative_NoHelper + 10 XPCWrappedNative_NoHelper + bookmarks.js 10 Object + browser.js 10 Function + bookmarks.js 15 Function + firebug-service.js 16 Function + 18 BoxObject + bookmarks.js 75 Error + 79 Function + 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 + BarProp 1 + CSSStyleDeclaration 1 + Global Scope Polluter 1 + HTMLBodyElement 1 + HTMLDocument 1 + HTMLHtmlElement 1 + NodeList 1 + StyleSheetList 1 + TreeSelection 1 + Window 1 + XULCommandDispatcher 1 + chrome://global/content/bindings/popup.xml#popup 8c35c92 1 + chrome://global/content/bindings/popup.xml#popup 8fb299a 1 + chrome://global/content/bindings/scrollbar.xml#scrollbar 8fb2ea2 1 + nsXPCComponents_Classes 1 + 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 + BoxObject 2 + JSOptions 2 + JavaArray 2 + JavaClass 2 + JavaMember 2 + JavaObject 2 + PageTransitionEvent 2 + autocomplete.xml Function 2 + firebug.js XPC_WN_NoMods_Proto_JSClass 2 + reporterOverlay.js Function 2 + tree.xml Function 2 + Array 3 + DOM Constructor.prototype 3 + With 3 + XPC_WN_NoMods_Proto_JSClass 3 + 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 + XPCNativeWrapper 5 + browser.js String 6 + Object 7 + tabbrowser.xml Function 7 + XPC_WN_ModsAllowed_Proto_JSClass 8 + Constructor 9 + browser.xml Function 9 + firebug.js Function 10 + MouseEvent 12 + XPCWrappedNative_NoHelper 13 + KeyboardEvent 14 + XULElement 16 + Event 29 + browser.js Function 33 + consoleAPI.js Function 33 + JavaPackage 41 + scrollbar.xml Function 61 + 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% + 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 + + 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 + + , 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 + + , 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 + 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 + 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 + 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 + + , 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 + + , 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 + 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 + 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 + 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 -> ? + 0 3064371851146 <- ? + 0 3064371851155 os.py <- _exists + 0 3064371851162 os.py -> _exists + 0 3064371851186 -> ? + 0 3064371851195 <- ? + 0 3064371851213 os.py <- _exists + 0 3064371851220 os.py -> _exists + 0 3064371851242 -> ? + 0 3064371851249 <- ? + 0 3064371851257 os.py <- _exists + 0 3064371851266 os.py -> _exists + 0 3064371851286 -> ? + 0 3064371851293 <- ? + 0 3064371851300 os.py <- _exists + 0 3064371851310 os.py -> _exists + 0 3064371851330 -> ? + 0 3064371851337 <- ? + 0 3064371851344 os.py <- _exists + 0 3064371851354 os.py -> _exists + 0 3064371851374 -> ? + 0 3064371851381 <- ? + 0 3064371851388 os.py <- _exists + 0 3064371851395 os.py -> _exists + 0 3064371851415 -> ? + 0 3064371851423 <- ? + 0 3064371851436 os.py <- _exists + 0 3064371851445 os.py -> _exists + 0 3064371851465 -> ? + 0 3064371851473 <- ? + 0 3064371851485 os.py <- _exists + 0 3064371851493 os.py -> _exists + 0 3064371851514 -> ? + 0 3064371851522 <- ? + 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 -> ? + 0 3064371852277 <- ? + 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 -> ? + 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 <- ? + 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 :0 func -> ? +0 145424 10 :0 func <- ? +0 145424 9 os.py:504 func <- _exists +0 145424 9 os.py:501 func -> _exists +0 145424 24 :0 func -> ? +0 145424 9 :0 func <- ? +0 145424 15 os.py:506 func <- _exists +0 145424 9 os.py:501 func -> _exists +0 145424 23 :0 func -> ? +0 145424 8 :0 func <- ? +0 145424 9 os.py:504 func <- _exists +0 145424 26 os.py:501 func -> _exists +0 145424 23 :0 func -> ? +0 145424 8 :0 func <- ? +0 145424 8 os.py:504 func <- _exists +0 145424 11 os.py:501 func -> _exists +0 145424 22 :0 func -> ? +0 145424 8 :0 func <- ? +0 145424 8 os.py:504 func <- _exists +0 145424 11 os.py:501 func -> _exists +0 145424 22 :0 func -> ? +0 145424 8 :0 func <- ? +0 145424 8 os.py:504 func <- _exists +0 145424 9 os.py:501 func -> _exists +0 145424 21 :0 func -> ? +0 145424 9 :0 func <- ? +0 145424 14 os.py:506 func <- _exists +0 145424 10 os.py:501 func -> _exists +0 145424 22 :0 func -> ? +0 145424 9 :0 func <- ? +0 145424 13 os.py:506 func <- _exists +0 145424 11 os.py:501 func -> _exists +0 145424 22 :0 func -> ? +0 145424 8 :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 :0 func -> ? +0 145424 9 :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 :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 :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 607 -> ? + 0 3064660322955 8 <- ? + 0 3064660322963 os.py 8 <- _exists + 0 3064660322972 os.py 8 -> _exists + 0 3064660322996 23 -> ? + 0 3064660323005 8 <- ? + 0 3064660323020 os.py 14 <- _exists + 0 3064660323029 os.py 8 -> _exists + 0 3064660323051 22 -> ? + 0 3064660323059 7 <- ? + 0 3064660323067 os.py 8 <- _exists + 0 3064660323077 os.py 10 -> _exists + 0 3064660323098 21 -> ? + 0 3064660323106 7 <- ? + 0 3064660323114 os.py 8 <- _exists + 0 3064660323125 os.py 10 -> _exists + 0 3064660323146 21 -> ? + 0 3064660323154 7 <- ? + 0 3064660323162 os.py 8 <- _exists + 0 3064660323173 os.py 10 -> _exists + 0 3064660323194 21 -> ? + 0 3064660323202 7 <- ? + 0 3064660323210 os.py 8 <- _exists + 0 3064660323218 os.py 8 -> _exists + 0 3064660323239 21 -> ? + 0 3064660323247 8 <- ? + 0 3064660323261 os.py 13 <- _exists + 0 3064660323271 os.py 10 -> _exists + 0 3064660323293 21 -> ? + 0 3064660323301 8 <- ? + 0 3064660323314 os.py 12 <- _exists + 0 3064660323324 os.py 10 -> _exists + 0 3064660323345 21 -> ? + 0 3064660323354 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 25 -> ? + 0 3064660324015 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 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 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 + ? 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 + [ :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 + 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 + 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 + 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 + 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 + ^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 "" 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) : "") : ""; + 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) : "") : ""; + + /* 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 + + *.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["", "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["", 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 + +#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 "" 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 + +#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 +#include +#include +#include +#include + + #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 +#include +#include +#include +#include + +/* + * 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 = ""; + 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 +#include +#include + +/* + * 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 = ""; + 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 +#include +#include +#include +#include + +/* + * 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 = ""; + 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 +#include +#include + +/* + * 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 = ""; + 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 +#include +#include +#include +#include + +/* + * 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 = ""; + 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 +#include +#include +#include +#include + +/* + * 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 = ""; + 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 = ""; /* violet, faint */ + color_line = ""; /* violet, bold */ + color_syscall = ""; /* green, faint */ + color_off = ""; /* default */ + } + +Other tweaks can be made to either print the output in a
 tagged block;
+or as seperate lines ending in 
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", + + + { + self->start = timestamp; + } + + + { + 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", + + + { + self->vstart = vtimestamp; + } + + + { + 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 + 183711020149 0 3058 W 60673 1024 sync + +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) : "") : ""; + + /* 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 ? "" : + 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 (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 + 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) : "") : ""; + 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 = )) { + 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 = <)) { + + ### 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 <&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 = <) { + 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 = <) { + 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 "" 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) : "") : ""; + + /* + * 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) : "") : ""; + 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; + } +'