diff options
author | George V. Neville-Neil <gnn@FreeBSD.org> | 2012-05-12 21:25:48 +0000 |
---|---|---|
committer | George V. Neville-Neil <gnn@FreeBSD.org> | 2012-05-12 21:25:48 +0000 |
commit | f2f9999d8b198d4aeef3bada3ccee3b1e4a2a38a (patch) | |
tree | 349c87edcb2d1f2a1040b9630b1fddf85a3484a0 | |
parent | 6130ff50fb1a60f79a45bda8862a80e0e1643abe (diff) | |
parent | 055173dba4a263acf10325a49eebf82915369ed2 (diff) | |
download | src-test2-f2f9999d8b198d4aeef3bada3ccee3b1e4a2a38a.tar.gz src-test2-f2f9999d8b198d4aeef3bada3ccee3b1e4a2a38a.zip |
Notes
1007 files changed, 77934 insertions, 6 deletions
diff --git a/cddl/contrib/dtracetoolkit/Apps/Readme b/cddl/contrib/dtracetoolkit/Apps/Readme new file mode 100644 index 000000000000..3a6812f4bfa2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Apps/httpdstat.d b/cddl/contrib/dtracetoolkit/Apps/httpdstat.d new file mode 100755 index 000000000000..a053482a6c15 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Apps/nfswizard.d b/cddl/contrib/dtracetoolkit/Apps/nfswizard.d new file mode 100755 index 000000000000..c63bc33dfa4e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Apps/shellsnoop b/cddl/contrib/dtracetoolkit/Apps/shellsnoop new file mode 100755 index 000000000000..95f42c046529 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Apps/weblatency.d b/cddl/contrib/dtracetoolkit/Apps/weblatency.d new file mode 100755 index 000000000000..8d96d5cdd88b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Bin/anonpgpid.d b/cddl/contrib/dtracetoolkit/Bin/anonpgpid.d new file mode 120000 index 000000000000..f48a5104fc69 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/anonpgpid.d @@ -0,0 +1 @@ +../Mem/anonpgpid.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/bitesize.d b/cddl/contrib/dtracetoolkit/Bin/bitesize.d new file mode 120000 index 000000000000..6f984e083f9e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/bitesize.d @@ -0,0 +1 @@ +../Disk/bitesize.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/connections b/cddl/contrib/dtracetoolkit/Bin/connections new file mode 120000 index 000000000000..1be9a640e58a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/connections @@ -0,0 +1 @@ +../Net/connections
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cpudists b/cddl/contrib/dtracetoolkit/Bin/cpudists new file mode 120000 index 000000000000..91f0d8022968 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cpudists @@ -0,0 +1 @@ +../Kernel/cpudists
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cputimes b/cddl/contrib/dtracetoolkit/Bin/cputimes new file mode 120000 index 000000000000..219dbbc6ca64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cputimes @@ -0,0 +1 @@ +../Kernel/cputimes
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cputypes.d b/cddl/contrib/dtracetoolkit/Bin/cputypes.d new file mode 120000 index 000000000000..da583feb485f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cputypes.d @@ -0,0 +1 @@ +../Cpu/cputypes.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cpuwalk.d b/cddl/contrib/dtracetoolkit/Bin/cpuwalk.d new file mode 120000 index 000000000000..5a1c26e74bfd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cpuwalk.d @@ -0,0 +1 @@ +../Cpu/cpuwalk.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/crash.d b/cddl/contrib/dtracetoolkit/Bin/crash.d new file mode 120000 index 000000000000..d3a3cf8c78d1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/crash.d @@ -0,0 +1 @@ +../Proc/crash.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/creatbyproc.d b/cddl/contrib/dtracetoolkit/Bin/creatbyproc.d new file mode 120000 index 000000000000..fecd0f32021f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/creatbyproc.d @@ -0,0 +1 @@ +../Proc/creatbyproc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/cswstat.d b/cddl/contrib/dtracetoolkit/Bin/cswstat.d new file mode 120000 index 000000000000..ea54280e10a0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/cswstat.d @@ -0,0 +1 @@ +../Kernel/cswstat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dappprof b/cddl/contrib/dtracetoolkit/Bin/dappprof new file mode 120000 index 000000000000..e4fc32ef5658 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dappprof @@ -0,0 +1 @@ +../Proc/dappprof
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dapptrace b/cddl/contrib/dtracetoolkit/Bin/dapptrace new file mode 120000 index 000000000000..1d38cb5ee7c4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dapptrace @@ -0,0 +1 @@ +../Proc/dapptrace
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dexplorer b/cddl/contrib/dtracetoolkit/Bin/dexplorer new file mode 120000 index 000000000000..41c36e49bd9d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dexplorer @@ -0,0 +1 @@ +../dexplorer
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/diskhits b/cddl/contrib/dtracetoolkit/Bin/diskhits new file mode 120000 index 000000000000..4a57310d9333 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/diskhits @@ -0,0 +1 @@ +../Disk/diskhits
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dispqlen.d b/cddl/contrib/dtracetoolkit/Bin/dispqlen.d new file mode 120000 index 000000000000..1073e0b863f1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dispqlen.d @@ -0,0 +1 @@ +../Cpu/dispqlen.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dnlcps.d b/cddl/contrib/dtracetoolkit/Bin/dnlcps.d new file mode 120000 index 000000000000..efca13ceaf41 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dnlcps.d @@ -0,0 +1 @@ +../Kernel/dnlcps.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dnlcsnoop.d b/cddl/contrib/dtracetoolkit/Bin/dnlcsnoop.d new file mode 120000 index 000000000000..247868728e05 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dnlcsnoop.d @@ -0,0 +1 @@ +../Kernel/dnlcsnoop.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dnlcstat b/cddl/contrib/dtracetoolkit/Bin/dnlcstat new file mode 120000 index 000000000000..baec18905456 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dnlcstat @@ -0,0 +1 @@ +../Kernel/dnlcstat
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dtruss b/cddl/contrib/dtracetoolkit/Bin/dtruss new file mode 120000 index 000000000000..90c00c6fe124 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dtruss @@ -0,0 +1 @@ +../dtruss
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/dvmstat b/cddl/contrib/dtracetoolkit/Bin/dvmstat new file mode 120000 index 000000000000..1b92321f0d47 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/dvmstat @@ -0,0 +1 @@ +../dvmstat
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/errinfo b/cddl/contrib/dtracetoolkit/Bin/errinfo new file mode 120000 index 000000000000..fbecf4da7e2a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/errinfo @@ -0,0 +1 @@ +../errinfo
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/execsnoop b/cddl/contrib/dtracetoolkit/Bin/execsnoop new file mode 120000 index 000000000000..3a0dde2b1d5c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/execsnoop @@ -0,0 +1 @@ +../execsnoop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/fddist b/cddl/contrib/dtracetoolkit/Bin/fddist new file mode 120000 index 000000000000..11d6e20f3714 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/fddist @@ -0,0 +1 @@ +../Proc/fddist
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/filebyproc.d b/cddl/contrib/dtracetoolkit/Bin/filebyproc.d new file mode 120000 index 000000000000..5c2b2c596a7c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/filebyproc.d @@ -0,0 +1 @@ +../Proc/filebyproc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/fspaging.d b/cddl/contrib/dtracetoolkit/Bin/fspaging.d new file mode 120000 index 000000000000..54db157bb489 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/fspaging.d @@ -0,0 +1 @@ +../FS/fspaging.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/fsrw.d b/cddl/contrib/dtracetoolkit/Bin/fsrw.d new file mode 120000 index 000000000000..829e583e25b0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/fsrw.d @@ -0,0 +1 @@ +../FS/fsrw.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/guess.d b/cddl/contrib/dtracetoolkit/Bin/guess.d new file mode 120000 index 000000000000..b5a41fdf9de6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/guess.d @@ -0,0 +1 @@ +../Misc/guess.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/hotkernel b/cddl/contrib/dtracetoolkit/Bin/hotkernel new file mode 120000 index 000000000000..0b872c32e98b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/hotkernel @@ -0,0 +1 @@ +../hotkernel
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/hotspot.d b/cddl/contrib/dtracetoolkit/Bin/hotspot.d new file mode 120000 index 000000000000..dad526acd3fd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/hotspot.d @@ -0,0 +1 @@ +../Disk/hotspot.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/hotuser b/cddl/contrib/dtracetoolkit/Bin/hotuser new file mode 120000 index 000000000000..4ff615e9c289 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/hotuser @@ -0,0 +1 @@ +../hotuser
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/httpdstat.d b/cddl/contrib/dtracetoolkit/Bin/httpdstat.d new file mode 120000 index 000000000000..5d8900d5aa2e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/httpdstat.d @@ -0,0 +1 @@ +../Apps/httpdstat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/icmpstat.d b/cddl/contrib/dtracetoolkit/Bin/icmpstat.d new file mode 120000 index 000000000000..1d63bb75875f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/icmpstat.d @@ -0,0 +1 @@ +../Net/icmpstat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/intbycpu.d b/cddl/contrib/dtracetoolkit/Bin/intbycpu.d new file mode 120000 index 000000000000..4897057d6937 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/intbycpu.d @@ -0,0 +1 @@ +../Cpu/intbycpu.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/intoncpu.d b/cddl/contrib/dtracetoolkit/Bin/intoncpu.d new file mode 120000 index 000000000000..814c7be06dab --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/intoncpu.d @@ -0,0 +1 @@ +../Cpu/intoncpu.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/inttimes.d b/cddl/contrib/dtracetoolkit/Bin/inttimes.d new file mode 120000 index 000000000000..5b179eecfe32 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/inttimes.d @@ -0,0 +1 @@ +../Cpu/inttimes.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iofile.d b/cddl/contrib/dtracetoolkit/Bin/iofile.d new file mode 120000 index 000000000000..8c63c1626464 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iofile.d @@ -0,0 +1 @@ +../Disk/iofile.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iofileb.d b/cddl/contrib/dtracetoolkit/Bin/iofileb.d new file mode 120000 index 000000000000..7d6d404ad0c3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iofileb.d @@ -0,0 +1 @@ +../Disk/iofileb.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iopattern b/cddl/contrib/dtracetoolkit/Bin/iopattern new file mode 120000 index 000000000000..0257e0f83f0d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iopattern @@ -0,0 +1 @@ +../iopattern
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iopending b/cddl/contrib/dtracetoolkit/Bin/iopending new file mode 120000 index 000000000000..6ba932823527 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iopending @@ -0,0 +1 @@ +../Disk/iopending
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iosnoop b/cddl/contrib/dtracetoolkit/Bin/iosnoop new file mode 120000 index 000000000000..2b86bcb70f63 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iosnoop @@ -0,0 +1 @@ +../iosnoop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/iotop b/cddl/contrib/dtracetoolkit/Bin/iotop new file mode 120000 index 000000000000..14c124b300c1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/iotop @@ -0,0 +1 @@ +../iotop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_calldist.d b/cddl/contrib/dtracetoolkit/Bin/j_calldist.d new file mode 120000 index 000000000000..3d40bca13089 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_calldist.d @@ -0,0 +1 @@ +../Java/j_calldist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_calls.d b/cddl/contrib/dtracetoolkit/Bin/j_calls.d new file mode 120000 index 000000000000..81ddfc590d22 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_calls.d @@ -0,0 +1 @@ +../Java/j_calls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_calltime.d b/cddl/contrib/dtracetoolkit/Bin/j_calltime.d new file mode 120000 index 000000000000..5261cabcb917 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_calltime.d @@ -0,0 +1 @@ +../Java/j_calltime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_classflow.d b/cddl/contrib/dtracetoolkit/Bin/j_classflow.d new file mode 120000 index 000000000000..e6fb86ad0140 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_classflow.d @@ -0,0 +1 @@ +../Java/j_classflow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/j_cpudist.d new file mode 120000 index 000000000000..22f9adf86a0c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_cpudist.d @@ -0,0 +1 @@ +../Java/j_cpudist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_cputime.d b/cddl/contrib/dtracetoolkit/Bin/j_cputime.d new file mode 120000 index 000000000000..bfb684366074 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_cputime.d @@ -0,0 +1 @@ +../Java/j_cputime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_events.d b/cddl/contrib/dtracetoolkit/Bin/j_events.d new file mode 120000 index 000000000000..385456118aae --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_events.d @@ -0,0 +1 @@ +../Java/j_events.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_flow.d b/cddl/contrib/dtracetoolkit/Bin/j_flow.d new file mode 120000 index 000000000000..852a740c83bd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_flow.d @@ -0,0 +1 @@ +../Java/j_flow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/j_flowtime.d new file mode 120000 index 000000000000..c0f9faeed015 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_flowtime.d @@ -0,0 +1 @@ +../Java/j_flowtime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_methodcalls.d b/cddl/contrib/dtracetoolkit/Bin/j_methodcalls.d new file mode 120000 index 000000000000..9e5e17f43288 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_methodcalls.d @@ -0,0 +1 @@ +../Java/j_methodcalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_objnew.d b/cddl/contrib/dtracetoolkit/Bin/j_objnew.d new file mode 120000 index 000000000000..b91ddafd2cb9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_objnew.d @@ -0,0 +1 @@ +../Java/j_objnew.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_package.d b/cddl/contrib/dtracetoolkit/Bin/j_package.d new file mode 120000 index 000000000000..7627671107c8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_package.d @@ -0,0 +1 @@ +../Java/j_package.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_profile.d b/cddl/contrib/dtracetoolkit/Bin/j_profile.d new file mode 120000 index 000000000000..270532ca7971 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_profile.d @@ -0,0 +1 @@ +../Java/j_profile.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_stat.d b/cddl/contrib/dtracetoolkit/Bin/j_stat.d new file mode 120000 index 000000000000..128f913603f2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_stat.d @@ -0,0 +1 @@ +../Java/j_stat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/j_syscalls.d new file mode 120000 index 000000000000..fae39687ab58 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_syscalls.d @@ -0,0 +1 @@ +../Java/j_syscalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/j_syscolors.d new file mode 120000 index 000000000000..4acffad372b7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_syscolors.d @@ -0,0 +1 @@ +../Java/j_syscolors.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_thread.d b/cddl/contrib/dtracetoolkit/Bin/j_thread.d new file mode 120000 index 000000000000..f88296ce202f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_thread.d @@ -0,0 +1 @@ +../Java/j_thread.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/j_who.d b/cddl/contrib/dtracetoolkit/Bin/j_who.d new file mode 120000 index 000000000000..f2aba284055c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/j_who.d @@ -0,0 +1 @@ +../Java/j_who.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_calldist.d b/cddl/contrib/dtracetoolkit/Bin/js_calldist.d new file mode 120000 index 000000000000..93277b09ba67 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_calldist.d @@ -0,0 +1 @@ +../JavaScript/js_calldist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_calls.d b/cddl/contrib/dtracetoolkit/Bin/js_calls.d new file mode 120000 index 000000000000..9c27755e5f7b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_calls.d @@ -0,0 +1 @@ +../JavaScript/js_calls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_calltime.d b/cddl/contrib/dtracetoolkit/Bin/js_calltime.d new file mode 120000 index 000000000000..6ec2eedd737d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_calltime.d @@ -0,0 +1 @@ +../JavaScript/js_calltime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/js_cpudist.d new file mode 120000 index 000000000000..2d0c07ab5370 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_cpudist.d @@ -0,0 +1 @@ +../JavaScript/js_cpudist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_cputime.d b/cddl/contrib/dtracetoolkit/Bin/js_cputime.d new file mode 120000 index 000000000000..1c5c716a3b16 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_cputime.d @@ -0,0 +1 @@ +../JavaScript/js_cputime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_execs.d b/cddl/contrib/dtracetoolkit/Bin/js_execs.d new file mode 120000 index 000000000000..2f5c4a6861fd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_execs.d @@ -0,0 +1 @@ +../JavaScript/js_execs.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_flow.d b/cddl/contrib/dtracetoolkit/Bin/js_flow.d new file mode 120000 index 000000000000..ea2f3e78fab5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_flow.d @@ -0,0 +1 @@ +../JavaScript/js_flow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/js_flowinfo.d new file mode 120000 index 000000000000..0edb8bd84ac8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_flowinfo.d @@ -0,0 +1 @@ +../JavaScript/js_flowinfo.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/js_flowtime.d new file mode 120000 index 000000000000..cec488cbfe96 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_flowtime.d @@ -0,0 +1 @@ +../JavaScript/js_flowtime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_objcpu.d b/cddl/contrib/dtracetoolkit/Bin/js_objcpu.d new file mode 120000 index 000000000000..51aacf53ef04 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_objcpu.d @@ -0,0 +1 @@ +../JavaScript/js_objcpu.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_objgc.d b/cddl/contrib/dtracetoolkit/Bin/js_objgc.d new file mode 120000 index 000000000000..06f84602208c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_objgc.d @@ -0,0 +1 @@ +../JavaScript/js_objgc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_objnew.d b/cddl/contrib/dtracetoolkit/Bin/js_objnew.d new file mode 120000 index 000000000000..1a7fc16abac7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_objnew.d @@ -0,0 +1 @@ +../JavaScript/js_objnew.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_stat.d b/cddl/contrib/dtracetoolkit/Bin/js_stat.d new file mode 120000 index 000000000000..b2bc6da5871f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_stat.d @@ -0,0 +1 @@ +../JavaScript/js_stat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/js_who.d b/cddl/contrib/dtracetoolkit/Bin/js_who.d new file mode 120000 index 000000000000..40bea74dbd19 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/js_who.d @@ -0,0 +1 @@ +../JavaScript/js_who.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/kill.d b/cddl/contrib/dtracetoolkit/Bin/kill.d new file mode 120000 index 000000000000..d8c4a73c0d55 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/kill.d @@ -0,0 +1 @@ +../Proc/kill.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/kstat_types.d b/cddl/contrib/dtracetoolkit/Bin/kstat_types.d new file mode 120000 index 000000000000..156079c0e12c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/kstat_types.d @@ -0,0 +1 @@ +../Kernel/kstat_types.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/lastwords b/cddl/contrib/dtracetoolkit/Bin/lastwords new file mode 120000 index 000000000000..54fc3ae2cb8c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/lastwords @@ -0,0 +1 @@ +../Proc/lastwords
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/loads.d b/cddl/contrib/dtracetoolkit/Bin/loads.d new file mode 120000 index 000000000000..842dd94cce0b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/loads.d @@ -0,0 +1 @@ +../Cpu/loads.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/lockbydist.d b/cddl/contrib/dtracetoolkit/Bin/lockbydist.d new file mode 120000 index 000000000000..5e9b4a51ea77 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/lockbydist.d @@ -0,0 +1 @@ +../Locks/lockbydist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/lockbyproc.d b/cddl/contrib/dtracetoolkit/Bin/lockbyproc.d new file mode 120000 index 000000000000..d16d9412107e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/lockbyproc.d @@ -0,0 +1 @@ +../Locks/lockbyproc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/minfbypid.d b/cddl/contrib/dtracetoolkit/Bin/minfbypid.d new file mode 120000 index 000000000000..b8ccf800e540 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/minfbypid.d @@ -0,0 +1 @@ +../Mem/minfbypid.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/minfbyproc.d b/cddl/contrib/dtracetoolkit/Bin/minfbyproc.d new file mode 120000 index 000000000000..955320335515 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/minfbyproc.d @@ -0,0 +1 @@ +../Mem/minfbyproc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/mmapfiles.d b/cddl/contrib/dtracetoolkit/Bin/mmapfiles.d new file mode 120000 index 000000000000..728fd7551873 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/mmapfiles.d @@ -0,0 +1 @@ +../Proc/mmapfiles.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/modcalls.d b/cddl/contrib/dtracetoolkit/Bin/modcalls.d new file mode 120000 index 000000000000..fe49549de232 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/modcalls.d @@ -0,0 +1 @@ +../Kernel/modcalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/newproc.d b/cddl/contrib/dtracetoolkit/Bin/newproc.d new file mode 120000 index 000000000000..9387784fc719 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/newproc.d @@ -0,0 +1 @@ +../Proc/newproc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/nfswizard.d b/cddl/contrib/dtracetoolkit/Bin/nfswizard.d new file mode 120000 index 000000000000..ddc19d2f8042 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/nfswizard.d @@ -0,0 +1 @@ +../Apps/nfswizard.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/opensnoop b/cddl/contrib/dtracetoolkit/Bin/opensnoop new file mode 120000 index 000000000000..3fcae8514482 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/opensnoop @@ -0,0 +1 @@ +../opensnoop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pathopens.d b/cddl/contrib/dtracetoolkit/Bin/pathopens.d new file mode 120000 index 000000000000..21c28a5017ba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pathopens.d @@ -0,0 +1 @@ +../Proc/pathopens.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pfilestat b/cddl/contrib/dtracetoolkit/Bin/pfilestat new file mode 120000 index 000000000000..333765ff98db --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pfilestat @@ -0,0 +1 @@ +../Proc/pfilestat
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pgpginbypid.d b/cddl/contrib/dtracetoolkit/Bin/pgpginbypid.d new file mode 120000 index 000000000000..cfa2d799f0bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pgpginbypid.d @@ -0,0 +1 @@ +../Mem/pgpginbypid.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pgpginbyproc.d b/cddl/contrib/dtracetoolkit/Bin/pgpginbyproc.d new file mode 120000 index 000000000000..4e9a8b754f58 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pgpginbyproc.d @@ -0,0 +1 @@ +../Mem/pgpginbyproc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_calldist.d b/cddl/contrib/dtracetoolkit/Bin/php_calldist.d new file mode 120000 index 000000000000..5ac4b43e2f7f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_calldist.d @@ -0,0 +1 @@ +../Php/php_calldist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_calltime.d b/cddl/contrib/dtracetoolkit/Bin/php_calltime.d new file mode 120000 index 000000000000..49fb14b78cd9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_calltime.d @@ -0,0 +1 @@ +../Php/php_calltime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/php_cpudist.d new file mode 120000 index 000000000000..6e6595e00e1b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_cpudist.d @@ -0,0 +1 @@ +../Php/php_cpudist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_cputime.d b/cddl/contrib/dtracetoolkit/Bin/php_cputime.d new file mode 120000 index 000000000000..3e8ccb942b01 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_cputime.d @@ -0,0 +1 @@ +../Php/php_cputime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_flow.d b/cddl/contrib/dtracetoolkit/Bin/php_flow.d new file mode 120000 index 000000000000..fa86f75a0bb4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_flow.d @@ -0,0 +1 @@ +../Php/php_flow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/php_flowinfo.d new file mode 120000 index 000000000000..52ef64b7f459 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_flowinfo.d @@ -0,0 +1 @@ +../Php/php_flowinfo.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/php_flowtime.d new file mode 120000 index 000000000000..67dbe844b304 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_flowtime.d @@ -0,0 +1 @@ +../Php/php_flowtime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_funccalls.d b/cddl/contrib/dtracetoolkit/Bin/php_funccalls.d new file mode 120000 index 000000000000..2ba056bfe5e7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_funccalls.d @@ -0,0 +1 @@ +../Php/php_funccalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_malloc.d b/cddl/contrib/dtracetoolkit/Bin/php_malloc.d new file mode 120000 index 000000000000..9c51d8344eb2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_malloc.d @@ -0,0 +1 @@ +../Php/php_malloc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/php_syscalls.d new file mode 120000 index 000000000000..6587c4e1c387 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_syscalls.d @@ -0,0 +1 @@ +../Php/php_syscalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/php_syscolors.d new file mode 120000 index 000000000000..463f287a412d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_syscolors.d @@ -0,0 +1 @@ +../Php/php_syscolors.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/php_who.d b/cddl/contrib/dtracetoolkit/Bin/php_who.d new file mode 120000 index 000000000000..31d6acfd5773 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/php_who.d @@ -0,0 +1 @@ +../Php/php_who.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pidpersec.d b/cddl/contrib/dtracetoolkit/Bin/pidpersec.d new file mode 120000 index 000000000000..2ec6eb14514c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pidpersec.d @@ -0,0 +1 @@ +../Proc/pidpersec.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_calldist.d b/cddl/contrib/dtracetoolkit/Bin/pl_calldist.d new file mode 120000 index 000000000000..d5ef923a2672 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_calldist.d @@ -0,0 +1 @@ +../Perl/pl_calldist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_calltime.d b/cddl/contrib/dtracetoolkit/Bin/pl_calltime.d new file mode 120000 index 000000000000..38986ec85b66 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_calltime.d @@ -0,0 +1 @@ +../Perl/pl_calltime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/pl_cpudist.d new file mode 120000 index 000000000000..ce4703602d09 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_cpudist.d @@ -0,0 +1 @@ +../Perl/pl_cpudist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_cputime.d b/cddl/contrib/dtracetoolkit/Bin/pl_cputime.d new file mode 120000 index 000000000000..66ea2f7867fe --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_cputime.d @@ -0,0 +1 @@ +../Perl/pl_cputime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_flow.d b/cddl/contrib/dtracetoolkit/Bin/pl_flow.d new file mode 120000 index 000000000000..b5d566e1e13a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_flow.d @@ -0,0 +1 @@ +../Perl/pl_flow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/pl_flowinfo.d new file mode 120000 index 000000000000..ad53e51a6c75 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_flowinfo.d @@ -0,0 +1 @@ +../Perl/pl_flowinfo.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/pl_flowtime.d new file mode 120000 index 000000000000..89bee37932e2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_flowtime.d @@ -0,0 +1 @@ +../Perl/pl_flowtime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_malloc.d b/cddl/contrib/dtracetoolkit/Bin/pl_malloc.d new file mode 120000 index 000000000000..025e4ef92f42 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_malloc.d @@ -0,0 +1 @@ +../Perl/pl_malloc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_subcalls.d b/cddl/contrib/dtracetoolkit/Bin/pl_subcalls.d new file mode 120000 index 000000000000..350f8c120550 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_subcalls.d @@ -0,0 +1 @@ +../Perl/pl_subcalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/pl_syscalls.d new file mode 120000 index 000000000000..a1ab6e5e939d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_syscalls.d @@ -0,0 +1 @@ +../Perl/pl_syscalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/pl_syscolors.d new file mode 120000 index 000000000000..ebc087f4e4a0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_syscolors.d @@ -0,0 +1 @@ +../Perl/pl_syscolors.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pl_who.d b/cddl/contrib/dtracetoolkit/Bin/pl_who.d new file mode 120000 index 000000000000..398de670a223 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pl_who.d @@ -0,0 +1 @@ +../Perl/pl_who.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/priclass.d b/cddl/contrib/dtracetoolkit/Bin/priclass.d new file mode 120000 index 000000000000..09cd160a7375 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/priclass.d @@ -0,0 +1 @@ +../Kernel/priclass.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/pridist.d b/cddl/contrib/dtracetoolkit/Bin/pridist.d new file mode 120000 index 000000000000..3c25cbdd35d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/pridist.d @@ -0,0 +1 @@ +../Kernel/pridist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/procsystime b/cddl/contrib/dtracetoolkit/Bin/procsystime new file mode 120000 index 000000000000..891c2a1d2f08 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/procsystime @@ -0,0 +1 @@ +../procsystime
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/putnexts.d b/cddl/contrib/dtracetoolkit/Bin/putnexts.d new file mode 120000 index 000000000000..23cba6e46535 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/putnexts.d @@ -0,0 +1 @@ +../Kernel/putnexts.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_calldist.d b/cddl/contrib/dtracetoolkit/Bin/py_calldist.d new file mode 120000 index 000000000000..4a007c54fff1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_calldist.d @@ -0,0 +1 @@ +../Python/py_calldist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_calltime.d b/cddl/contrib/dtracetoolkit/Bin/py_calltime.d new file mode 120000 index 000000000000..6f1c400aba08 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_calltime.d @@ -0,0 +1 @@ +../Python/py_calltime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/py_cpudist.d new file mode 120000 index 000000000000..76ce8db570a0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_cpudist.d @@ -0,0 +1 @@ +../Python/py_cpudist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_cputime.d b/cddl/contrib/dtracetoolkit/Bin/py_cputime.d new file mode 120000 index 000000000000..d11dd87ac40d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_cputime.d @@ -0,0 +1 @@ +../Python/py_cputime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_flow.d b/cddl/contrib/dtracetoolkit/Bin/py_flow.d new file mode 120000 index 000000000000..bf1485aff777 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_flow.d @@ -0,0 +1 @@ +../Python/py_flow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/py_flowinfo.d new file mode 120000 index 000000000000..adc611499207 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_flowinfo.d @@ -0,0 +1 @@ +../Python/py_flowinfo.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/py_flowtime.d new file mode 120000 index 000000000000..1ae51db26bf5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_flowtime.d @@ -0,0 +1 @@ +../Python/py_flowtime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_funccalls.d b/cddl/contrib/dtracetoolkit/Bin/py_funccalls.d new file mode 120000 index 000000000000..81015120f6ab --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_funccalls.d @@ -0,0 +1 @@ +../Python/py_funccalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_malloc.d b/cddl/contrib/dtracetoolkit/Bin/py_malloc.d new file mode 120000 index 000000000000..ed37a3b05678 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_malloc.d @@ -0,0 +1 @@ +../Python/py_malloc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_mallocstk.d b/cddl/contrib/dtracetoolkit/Bin/py_mallocstk.d new file mode 120000 index 000000000000..d2bb1bbfc71e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_mallocstk.d @@ -0,0 +1 @@ +../Python/py_mallocstk.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_profile.d b/cddl/contrib/dtracetoolkit/Bin/py_profile.d new file mode 120000 index 000000000000..3eb72196f3f0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_profile.d @@ -0,0 +1 @@ +../Python/py_profile.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/py_syscalls.d new file mode 120000 index 000000000000..ecf137c31404 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_syscalls.d @@ -0,0 +1 @@ +../Python/py_syscalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/py_syscolors.d new file mode 120000 index 000000000000..6781115d28a3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_syscolors.d @@ -0,0 +1 @@ +../Python/py_syscolors.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/py_who.d b/cddl/contrib/dtracetoolkit/Bin/py_who.d new file mode 120000 index 000000000000..28db7e5f3e03 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/py_who.d @@ -0,0 +1 @@ +../Python/py_who.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_calldist.d b/cddl/contrib/dtracetoolkit/Bin/rb_calldist.d new file mode 120000 index 000000000000..8067860713ce --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_calldist.d @@ -0,0 +1 @@ +../Ruby/rb_calldist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_calls.d b/cddl/contrib/dtracetoolkit/Bin/rb_calls.d new file mode 120000 index 000000000000..266bacb2bf13 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_calls.d @@ -0,0 +1 @@ +../Ruby/rb_calls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_calltime.d b/cddl/contrib/dtracetoolkit/Bin/rb_calltime.d new file mode 120000 index 000000000000..f00df1a616bd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_calltime.d @@ -0,0 +1 @@ +../Ruby/rb_calltime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/rb_cpudist.d new file mode 120000 index 000000000000..6e77cc33b7f5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_cpudist.d @@ -0,0 +1 @@ +../Ruby/rb_cpudist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_cputime.d b/cddl/contrib/dtracetoolkit/Bin/rb_cputime.d new file mode 120000 index 000000000000..88d9138ef8f6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_cputime.d @@ -0,0 +1 @@ +../Ruby/rb_cputime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_flow.d b/cddl/contrib/dtracetoolkit/Bin/rb_flow.d new file mode 120000 index 000000000000..1a0f490cde70 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_flow.d @@ -0,0 +1 @@ +../Ruby/rb_flow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/rb_flowinfo.d new file mode 120000 index 000000000000..b8130191c8f5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_flowinfo.d @@ -0,0 +1 @@ +../Ruby/rb_flowinfo.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/rb_flowtime.d new file mode 120000 index 000000000000..911ea08907cf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_flowtime.d @@ -0,0 +1 @@ +../Ruby/rb_flowtime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_funccalls.d b/cddl/contrib/dtracetoolkit/Bin/rb_funccalls.d new file mode 120000 index 000000000000..2a3ac9a4adcf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_funccalls.d @@ -0,0 +1 @@ +../Ruby/rb_funccalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_lines.d b/cddl/contrib/dtracetoolkit/Bin/rb_lines.d new file mode 120000 index 000000000000..3447ccfedde3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_lines.d @@ -0,0 +1 @@ +../Ruby/rb_lines.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_malloc.d b/cddl/contrib/dtracetoolkit/Bin/rb_malloc.d new file mode 120000 index 000000000000..b3e2ba77de96 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_malloc.d @@ -0,0 +1 @@ +../Ruby/rb_malloc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_objcpu.d b/cddl/contrib/dtracetoolkit/Bin/rb_objcpu.d new file mode 120000 index 000000000000..ac7d6a22403f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_objcpu.d @@ -0,0 +1 @@ +../Ruby/rb_objcpu.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_objnew.d b/cddl/contrib/dtracetoolkit/Bin/rb_objnew.d new file mode 120000 index 000000000000..ca7689888eac --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_objnew.d @@ -0,0 +1 @@ +../Ruby/rb_objnew.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_stat.d b/cddl/contrib/dtracetoolkit/Bin/rb_stat.d new file mode 120000 index 000000000000..7a0e2aef1101 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_stat.d @@ -0,0 +1 @@ +../Ruby/rb_stat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/rb_syscalls.d new file mode 120000 index 000000000000..1b15e57e4647 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_syscalls.d @@ -0,0 +1 @@ +../Ruby/rb_syscalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/rb_syscolors.d new file mode 120000 index 000000000000..4fd3d6a0c423 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_syscolors.d @@ -0,0 +1 @@ +../Ruby/rb_syscolors.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rb_who.d b/cddl/contrib/dtracetoolkit/Bin/rb_who.d new file mode 120000 index 000000000000..effc0ce82217 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rb_who.d @@ -0,0 +1 @@ +../Ruby/rb_who.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/readbytes.d b/cddl/contrib/dtracetoolkit/Bin/readbytes.d new file mode 120000 index 000000000000..4b82f0ced66c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/readbytes.d @@ -0,0 +1 @@ +../Proc/readbytes.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/readdist.d b/cddl/contrib/dtracetoolkit/Bin/readdist.d new file mode 120000 index 000000000000..d73e49cec889 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/readdist.d @@ -0,0 +1 @@ +../Proc/readdist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rfileio.d b/cddl/contrib/dtracetoolkit/Bin/rfileio.d new file mode 120000 index 000000000000..a73a1bcfbfb9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rfileio.d @@ -0,0 +1 @@ +../FS/rfileio.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rfsio.d b/cddl/contrib/dtracetoolkit/Bin/rfsio.d new file mode 120000 index 000000000000..2dcbe2cd1493 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rfsio.d @@ -0,0 +1 @@ +../FS/rfsio.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/runocc.d b/cddl/contrib/dtracetoolkit/Bin/runocc.d new file mode 120000 index 000000000000..9b856b366296 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/runocc.d @@ -0,0 +1 @@ +../Cpu/runocc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwbbypid.d b/cddl/contrib/dtracetoolkit/Bin/rwbbypid.d new file mode 120000 index 000000000000..be6540134d50 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwbbypid.d @@ -0,0 +1 @@ +../Proc/rwbbypid.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwbypid.d b/cddl/contrib/dtracetoolkit/Bin/rwbypid.d new file mode 120000 index 000000000000..9dcec04b7b39 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwbypid.d @@ -0,0 +1 @@ +../Proc/rwbypid.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwbytype.d b/cddl/contrib/dtracetoolkit/Bin/rwbytype.d new file mode 120000 index 000000000000..a02b48d0a46d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwbytype.d @@ -0,0 +1 @@ +../Proc/rwbytype.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwsnoop b/cddl/contrib/dtracetoolkit/Bin/rwsnoop new file mode 120000 index 000000000000..3398d039476f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwsnoop @@ -0,0 +1 @@ +../rwsnoop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/rwtop b/cddl/contrib/dtracetoolkit/Bin/rwtop new file mode 120000 index 000000000000..64e421bd72a5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/rwtop @@ -0,0 +1 @@ +../rwtop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sampleproc b/cddl/contrib/dtracetoolkit/Bin/sampleproc new file mode 120000 index 000000000000..7bdd2896b6f2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sampleproc @@ -0,0 +1 @@ +../Proc/sampleproc
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sar-c.d b/cddl/contrib/dtracetoolkit/Bin/sar-c.d new file mode 120000 index 000000000000..9a2221025781 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sar-c.d @@ -0,0 +1 @@ +../System/sar-c.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/seeksize.d b/cddl/contrib/dtracetoolkit/Bin/seeksize.d new file mode 120000 index 000000000000..3f853d79798c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/seeksize.d @@ -0,0 +1 @@ +../Disk/seeksize.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/setuids.d b/cddl/contrib/dtracetoolkit/Bin/setuids.d new file mode 120000 index 000000000000..43dbf8a72365 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/setuids.d @@ -0,0 +1 @@ +../User/setuids.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_calldist.d b/cddl/contrib/dtracetoolkit/Bin/sh_calldist.d new file mode 120000 index 000000000000..abc69280fe66 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_calldist.d @@ -0,0 +1 @@ +../Shell/sh_calldist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_calls.d b/cddl/contrib/dtracetoolkit/Bin/sh_calls.d new file mode 120000 index 000000000000..2fa61317e21c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_calls.d @@ -0,0 +1 @@ +../Shell/sh_calls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_calltime.d b/cddl/contrib/dtracetoolkit/Bin/sh_calltime.d new file mode 120000 index 000000000000..35331d361607 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_calltime.d @@ -0,0 +1 @@ +../Shell/sh_calltime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/sh_cpudist.d new file mode 120000 index 000000000000..d2fd1ce9d9f0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_cpudist.d @@ -0,0 +1 @@ +../Shell/sh_cpudist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_cputime.d b/cddl/contrib/dtracetoolkit/Bin/sh_cputime.d new file mode 120000 index 000000000000..7188fc50a32e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_cputime.d @@ -0,0 +1 @@ +../Shell/sh_cputime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_flow.d b/cddl/contrib/dtracetoolkit/Bin/sh_flow.d new file mode 120000 index 000000000000..fc02ecf33544 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_flow.d @@ -0,0 +1 @@ +../Shell/sh_flow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_flowinfo.d b/cddl/contrib/dtracetoolkit/Bin/sh_flowinfo.d new file mode 120000 index 000000000000..10da77a9e072 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_flowinfo.d @@ -0,0 +1 @@ +../Shell/sh_flowinfo.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/sh_flowtime.d new file mode 120000 index 000000000000..c3c3cb8a0cf8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_flowtime.d @@ -0,0 +1 @@ +../Shell/sh_flowtime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_lines.d b/cddl/contrib/dtracetoolkit/Bin/sh_lines.d new file mode 120000 index 000000000000..918890ebfb93 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_lines.d @@ -0,0 +1 @@ +../Shell/sh_lines.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_pidcolors.d b/cddl/contrib/dtracetoolkit/Bin/sh_pidcolors.d new file mode 120000 index 000000000000..24ae05471166 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_pidcolors.d @@ -0,0 +1 @@ +../Shell/sh_pidcolors.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_stat.d b/cddl/contrib/dtracetoolkit/Bin/sh_stat.d new file mode 120000 index 000000000000..0dafd999b0e0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_stat.d @@ -0,0 +1 @@ +../Shell/sh_stat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/sh_syscalls.d new file mode 120000 index 000000000000..0402c76e8e02 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_syscalls.d @@ -0,0 +1 @@ +../Shell/sh_syscalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/sh_syscolors.d new file mode 120000 index 000000000000..c79f82883525 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_syscolors.d @@ -0,0 +1 @@ +../Shell/sh_syscolors.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_wasted.d b/cddl/contrib/dtracetoolkit/Bin/sh_wasted.d new file mode 120000 index 000000000000..564fc98adfeb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_wasted.d @@ -0,0 +1 @@ +../Shell/sh_wasted.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sh_who.d b/cddl/contrib/dtracetoolkit/Bin/sh_who.d new file mode 120000 index 000000000000..ca00fab11e4d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sh_who.d @@ -0,0 +1 @@ +../Shell/sh_who.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/shellsnoop b/cddl/contrib/dtracetoolkit/Bin/shellsnoop new file mode 120000 index 000000000000..84169abed066 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/shellsnoop @@ -0,0 +1 @@ +../Apps/shellsnoop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/shortlived.d b/cddl/contrib/dtracetoolkit/Bin/shortlived.d new file mode 120000 index 000000000000..6c234cf6dc4b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/shortlived.d @@ -0,0 +1 @@ +../Proc/shortlived.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sigdist.d b/cddl/contrib/dtracetoolkit/Bin/sigdist.d new file mode 120000 index 000000000000..838da2686546 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sigdist.d @@ -0,0 +1 @@ +../Proc/sigdist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/stacksize.d b/cddl/contrib/dtracetoolkit/Bin/stacksize.d new file mode 120000 index 000000000000..cb6fec40bb79 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/stacksize.d @@ -0,0 +1 @@ +../Proc/stacksize.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/statsnoop b/cddl/contrib/dtracetoolkit/Bin/statsnoop new file mode 120000 index 000000000000..445e361554aa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/statsnoop @@ -0,0 +1 @@ +../statsnoop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/swapinfo.d b/cddl/contrib/dtracetoolkit/Bin/swapinfo.d new file mode 120000 index 000000000000..e5cd10f76920 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/swapinfo.d @@ -0,0 +1 @@ +../Mem/swapinfo.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/sysbypid.d b/cddl/contrib/dtracetoolkit/Bin/sysbypid.d new file mode 120000 index 000000000000..761ada95b82f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/sysbypid.d @@ -0,0 +1 @@ +../Proc/sysbypid.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/syscallbypid.d b/cddl/contrib/dtracetoolkit/Bin/syscallbypid.d new file mode 120000 index 000000000000..eca83c7bf2d6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/syscallbypid.d @@ -0,0 +1 @@ +../Proc/syscallbypid.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/syscallbyproc.d b/cddl/contrib/dtracetoolkit/Bin/syscallbyproc.d new file mode 120000 index 000000000000..0260655574bb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/syscallbyproc.d @@ -0,0 +1 @@ +../Proc/syscallbyproc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/syscallbysysc.d b/cddl/contrib/dtracetoolkit/Bin/syscallbysysc.d new file mode 120000 index 000000000000..43258f1ebdc4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/syscallbysysc.d @@ -0,0 +1 @@ +../System/syscallbysysc.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_calldist.d b/cddl/contrib/dtracetoolkit/Bin/tcl_calldist.d new file mode 120000 index 000000000000..6e3cf23de470 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_calldist.d @@ -0,0 +1 @@ +../Tcl/tcl_calldist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_calls.d b/cddl/contrib/dtracetoolkit/Bin/tcl_calls.d new file mode 120000 index 000000000000..3a48d0b3eda1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_calls.d @@ -0,0 +1 @@ +../Tcl/tcl_calls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_calltime.d b/cddl/contrib/dtracetoolkit/Bin/tcl_calltime.d new file mode 120000 index 000000000000..32cead5d1edc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_calltime.d @@ -0,0 +1 @@ +../Tcl/tcl_calltime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_cpudist.d b/cddl/contrib/dtracetoolkit/Bin/tcl_cpudist.d new file mode 120000 index 000000000000..1724115a9b64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_cpudist.d @@ -0,0 +1 @@ +../Tcl/tcl_cpudist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_cputime.d b/cddl/contrib/dtracetoolkit/Bin/tcl_cputime.d new file mode 120000 index 000000000000..e8269db5c879 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_cputime.d @@ -0,0 +1 @@ +../Tcl/tcl_cputime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_flow.d b/cddl/contrib/dtracetoolkit/Bin/tcl_flow.d new file mode 120000 index 000000000000..4f3e01f16541 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_flow.d @@ -0,0 +1 @@ +../Tcl/tcl_flow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_flowtime.d b/cddl/contrib/dtracetoolkit/Bin/tcl_flowtime.d new file mode 120000 index 000000000000..3664f7a1100e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_flowtime.d @@ -0,0 +1 @@ +../Tcl/tcl_flowtime.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_ins.d b/cddl/contrib/dtracetoolkit/Bin/tcl_ins.d new file mode 120000 index 000000000000..d7480340a0ff --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_ins.d @@ -0,0 +1 @@ +../Tcl/tcl_ins.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_insflow.d b/cddl/contrib/dtracetoolkit/Bin/tcl_insflow.d new file mode 120000 index 000000000000..9f716bda057e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_insflow.d @@ -0,0 +1 @@ +../Tcl/tcl_insflow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_proccalls.d b/cddl/contrib/dtracetoolkit/Bin/tcl_proccalls.d new file mode 120000 index 000000000000..704e0b5cf20f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_proccalls.d @@ -0,0 +1 @@ +../Tcl/tcl_proccalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_procflow.d b/cddl/contrib/dtracetoolkit/Bin/tcl_procflow.d new file mode 120000 index 000000000000..51da9dcd15bf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_procflow.d @@ -0,0 +1 @@ +../Tcl/tcl_procflow.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_stat.d b/cddl/contrib/dtracetoolkit/Bin/tcl_stat.d new file mode 120000 index 000000000000..7f9659a2e8c1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_stat.d @@ -0,0 +1 @@ +../Tcl/tcl_stat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_syscalls.d b/cddl/contrib/dtracetoolkit/Bin/tcl_syscalls.d new file mode 120000 index 000000000000..aec76739ca2c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_syscalls.d @@ -0,0 +1 @@ +../Tcl/tcl_syscalls.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_syscolors.d b/cddl/contrib/dtracetoolkit/Bin/tcl_syscolors.d new file mode 120000 index 000000000000..890ea5ff3a2c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_syscolors.d @@ -0,0 +1 @@ +../Tcl/tcl_syscolors.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcl_who.d b/cddl/contrib/dtracetoolkit/Bin/tcl_who.d new file mode 120000 index 000000000000..7917b5ed7bab --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcl_who.d @@ -0,0 +1 @@ +../Tcl/tcl_who.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpsnoop b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop new file mode 120000 index 000000000000..7f7b37d4394d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop @@ -0,0 +1 @@ +../Net/tcpsnoop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpsnoop.d b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop.d new file mode 120000 index 000000000000..ad9ccf93a10d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop.d @@ -0,0 +1 @@ +../Net/tcpsnoop.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv new file mode 120000 index 000000000000..7ea5a09274d6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv @@ -0,0 +1 @@ +../Net/tcpsnoop_snv
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv.d b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv.d new file mode 120000 index 000000000000..a2321e0d5947 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpsnoop_snv.d @@ -0,0 +1 @@ +../Net/tcpsnoop_snv.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpstat.d b/cddl/contrib/dtracetoolkit/Bin/tcpstat.d new file mode 120000 index 000000000000..176f0e322756 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpstat.d @@ -0,0 +1 @@ +../Net/tcpstat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcptop b/cddl/contrib/dtracetoolkit/Bin/tcptop new file mode 120000 index 000000000000..a97fec359309 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcptop @@ -0,0 +1 @@ +../Net/tcptop
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcptop_snv b/cddl/contrib/dtracetoolkit/Bin/tcptop_snv new file mode 120000 index 000000000000..ad75a7b77596 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcptop_snv @@ -0,0 +1 @@ +../Net/tcptop_snv
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/tcpwdist.d b/cddl/contrib/dtracetoolkit/Bin/tcpwdist.d new file mode 120000 index 000000000000..0be2a4139776 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/tcpwdist.d @@ -0,0 +1 @@ +../Net/tcpwdist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/threaded.d b/cddl/contrib/dtracetoolkit/Bin/threaded.d new file mode 120000 index 000000000000..b9febd847996 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/threaded.d @@ -0,0 +1 @@ +../Proc/threaded.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/topsyscall b/cddl/contrib/dtracetoolkit/Bin/topsyscall new file mode 120000 index 000000000000..b9a2eec61fac --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/topsyscall @@ -0,0 +1 @@ +../System/topsyscall
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/topsysproc b/cddl/contrib/dtracetoolkit/Bin/topsysproc new file mode 120000 index 000000000000..d523f507cf9e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/topsysproc @@ -0,0 +1 @@ +../Proc/topsysproc
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/udpstat.d b/cddl/contrib/dtracetoolkit/Bin/udpstat.d new file mode 120000 index 000000000000..11d0bca5f36f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/udpstat.d @@ -0,0 +1 @@ +../Net/udpstat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/uname-a.d b/cddl/contrib/dtracetoolkit/Bin/uname-a.d new file mode 120000 index 000000000000..11251757f57e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/uname-a.d @@ -0,0 +1 @@ +../System/uname-a.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/vmbypid.d b/cddl/contrib/dtracetoolkit/Bin/vmbypid.d new file mode 120000 index 000000000000..16e5ac4edadb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/vmbypid.d @@ -0,0 +1 @@ +../Mem/vmbypid.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/vmstat-p.d b/cddl/contrib/dtracetoolkit/Bin/vmstat-p.d new file mode 120000 index 000000000000..a75e5a1b1544 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/vmstat-p.d @@ -0,0 +1 @@ +../Mem/vmstat-p.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/vmstat.d b/cddl/contrib/dtracetoolkit/Bin/vmstat.d new file mode 120000 index 000000000000..395ba5f80858 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/vmstat.d @@ -0,0 +1 @@ +../Mem/vmstat.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/vopstat b/cddl/contrib/dtracetoolkit/Bin/vopstat new file mode 120000 index 000000000000..f38b57905d6e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/vopstat @@ -0,0 +1 @@ +../FS/vopstat
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/weblatency.d b/cddl/contrib/dtracetoolkit/Bin/weblatency.d new file mode 120000 index 000000000000..c16bb2ee361b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/weblatency.d @@ -0,0 +1 @@ +../Apps/weblatency.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/whatexec.d b/cddl/contrib/dtracetoolkit/Bin/whatexec.d new file mode 120000 index 000000000000..660ff83826b7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/whatexec.d @@ -0,0 +1 @@ +../Kernel/whatexec.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/woof.d b/cddl/contrib/dtracetoolkit/Bin/woof.d new file mode 120000 index 000000000000..a380d7c2f2ca --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/woof.d @@ -0,0 +1 @@ +../Misc/woof.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/wpm.d b/cddl/contrib/dtracetoolkit/Bin/wpm.d new file mode 120000 index 000000000000..fee9c99a1efb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/wpm.d @@ -0,0 +1 @@ +../Misc/wpm.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/writebytes.d b/cddl/contrib/dtracetoolkit/Bin/writebytes.d new file mode 120000 index 000000000000..586cbd75ba86 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/writebytes.d @@ -0,0 +1 @@ +../Proc/writebytes.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/writedist.d b/cddl/contrib/dtracetoolkit/Bin/writedist.d new file mode 120000 index 000000000000..3710f132fe16 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/writedist.d @@ -0,0 +1 @@ +../Proc/writedist.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/xcallsbypid.d b/cddl/contrib/dtracetoolkit/Bin/xcallsbypid.d new file mode 120000 index 000000000000..08c7feca8235 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/xcallsbypid.d @@ -0,0 +1 @@ +../Cpu/xcallsbypid.d
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/xvmstat b/cddl/contrib/dtracetoolkit/Bin/xvmstat new file mode 120000 index 000000000000..24008fbb4672 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/xvmstat @@ -0,0 +1 @@ +../Mem/xvmstat
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Bin/zvmstat b/cddl/contrib/dtracetoolkit/Bin/zvmstat new file mode 120000 index 000000000000..41c7dbbb31e0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Bin/zvmstat @@ -0,0 +1 @@ +../Zones/zvmstat
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Code/Java/Func_abc.java b/cddl/contrib/dtracetoolkit/Code/Java/Func_abc.java new file mode 100644 index 000000000000..c14012e4988e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Java/Func_loop.java b/cddl/contrib/dtracetoolkit/Code/Java/Func_loop.java new file mode 100644 index 000000000000..81be852bb7f1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/JavaScript/func_clock.html b/cddl/contrib/dtracetoolkit/Code/JavaScript/func_clock.html new file mode 100644 index 000000000000..c25610b30f2c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/JavaScript/func_clock.html @@ -0,0 +1,39 @@ +<HTML> +<HEAD> +<TITLE>func_clock, JavaScript</TITLE> +<SCRIPT type="text/javascript"> +function func_c() { + document.getElementById('now').innerHTML += "Function C<br>" + for (i = 0; i < 30000; i++) { + j = i + 1 + } +} + +function func_b() { + document.getElementById('now').innerHTML += "Function B<br>" + for (i = 0; i < 20000; i++) { + j = i + 1 + } + func_c() +} + +function func_a() { + document.getElementById('now').innerHTML += "Function A<br>" + for (i = 0; i < 10000; i++) { + j = i + 1 + } + func_b() +} + +function start() { + now = new Date() + document.getElementById('now').innerHTML = now + "<br>" + func_a() + var timeout = setTimeout('start()', 1000) +} +</SCRIPT> +</HEAD> +<BODY onload="start()"> +<DIV id="now"></DIV> +</BODY> +</HTML> diff --git a/cddl/contrib/dtracetoolkit/Code/JavaScript/func_slow.html b/cddl/contrib/dtracetoolkit/Code/JavaScript/func_slow.html new file mode 100644 index 000000000000..14fdfda3870c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/JavaScript/func_slow.html @@ -0,0 +1,31 @@ +<HTML> +<HEAD><TITLE>func_slow, JavaScript</TITLE></HEAD> +<BODY> +<SCRIPT type="text/javascript"> +function func_c() { + document.write("Function C<br>") + for (i = 0; i < 30000; i++) { + j = i + 1 + } +} + +function func_b() { + document.write("Function B<br>") + for (i = 0; i < 20000; i++) { + j = i + 1 + } + func_c() +} + +function func_a() { + document.write("Function A<br>") + for (i = 0; i < 10000; i++) { + j = i + 1 + } + func_b() +} + +func_a() +</SCRIPT> +</BODY> +</HTML> diff --git a/cddl/contrib/dtracetoolkit/Code/Perl/func_abc.pl b/cddl/contrib/dtracetoolkit/Code/Perl/func_abc.pl new file mode 100755 index 000000000000..394f1c2b245a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Perl/func_malloc.pl b/cddl/contrib/dtracetoolkit/Code/Perl/func_malloc.pl new file mode 100755 index 000000000000..5340c82b2cdc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Perl/func_slow.pl b/cddl/contrib/dtracetoolkit/Code/Perl/func_slow.pl new file mode 100755 index 000000000000..f32d09ed9bf8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Perl/hello.pl b/cddl/contrib/dtracetoolkit/Code/Perl/hello.pl new file mode 100755 index 000000000000..3ca70a2847c8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Perl/hello.pl @@ -0,0 +1,3 @@ +#!./perl + +print "Hello World!\n"; diff --git a/cddl/contrib/dtracetoolkit/Code/Perl/hello_strict.pl b/cddl/contrib/dtracetoolkit/Code/Perl/hello_strict.pl new file mode 100755 index 000000000000..78003a971448 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Perl/hello_strict.pl @@ -0,0 +1,5 @@ +#!./perl -w + +use strict; + +print "Hello World!\n"; diff --git a/cddl/contrib/dtracetoolkit/Code/Php/func_abc.php b/cddl/contrib/dtracetoolkit/Code/Php/func_abc.php new file mode 100644 index 000000000000..916561157881 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Code/Php/func_abc.php @@ -0,0 +1,23 @@ +<?php +function func_c() +{ + echo "Function C\n"; + sleep(1); +} + +function func_b() +{ + echo "Function B\n"; + sleep(1); + func_c(); +} + +function func_a() +{ + echo "Function A\n"; + sleep(1); + func_b(); +} + +func_a(); +?> diff --git a/cddl/contrib/dtracetoolkit/Code/Python/func_abc.py b/cddl/contrib/dtracetoolkit/Code/Python/func_abc.py new file mode 100755 index 000000000000..0d4919fb8930 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Python/func_slow.py b/cddl/contrib/dtracetoolkit/Code/Python/func_slow.py new file mode 100755 index 000000000000..9cba9c5b1204 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Readme b/cddl/contrib/dtracetoolkit/Code/Readme new file mode 100644 index 000000000000..f8b16d79b7e4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Ruby/func_abc.rb b/cddl/contrib/dtracetoolkit/Code/Ruby/func_abc.rb new file mode 100755 index 000000000000..75adaf9f7ff1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Ruby/func_slow.rb b/cddl/contrib/dtracetoolkit/Code/Ruby/func_slow.rb new file mode 100755 index 000000000000..87a498c6a3b1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Shell/func_abc.sh b/cddl/contrib/dtracetoolkit/Code/Shell/func_abc.sh new file mode 100755 index 000000000000..b44ce570ab93 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Shell/func_slow.sh b/cddl/contrib/dtracetoolkit/Code/Shell/func_slow.sh new file mode 100755 index 000000000000..3407646f9c64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Shell/func_waste.sh b/cddl/contrib/dtracetoolkit/Code/Shell/func_waste.sh new file mode 100755 index 000000000000..bfeeecb4ef4e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Tcl/func_abc.tcl b/cddl/contrib/dtracetoolkit/Code/Tcl/func_abc.tcl new file mode 100644 index 000000000000..c84acb074882 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Code/Tcl/func_slow.tcl b/cddl/contrib/dtracetoolkit/Code/Tcl/func_slow.tcl new file mode 100644 index 000000000000..d4fc59894680 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Cpu/Readme b/cddl/contrib/dtracetoolkit/Cpu/Readme new file mode 100644 index 000000000000..e0f8698c71b2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Cpu/Readme @@ -0,0 +1,3 @@ +Cpu - CPU based analysis + + This would include activity by CPU. diff --git a/cddl/contrib/dtracetoolkit/Cpu/cputypes.d b/cddl/contrib/dtracetoolkit/Cpu/cputypes.d new file mode 100755 index 000000000000..213af9efa935 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Cpu/cpuwalk.d b/cddl/contrib/dtracetoolkit/Cpu/cpuwalk.d new file mode 100755 index 000000000000..495f64bb5f95 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Cpu/dispqlen.d b/cddl/contrib/dtracetoolkit/Cpu/dispqlen.d new file mode 100755 index 000000000000..46742c5a02b1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Cpu/intbycpu.d b/cddl/contrib/dtracetoolkit/Cpu/intbycpu.d new file mode 100755 index 000000000000..606f40280564 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Cpu/intoncpu.d b/cddl/contrib/dtracetoolkit/Cpu/intoncpu.d new file mode 100755 index 000000000000..b32685ab689b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Cpu/inttimes.d b/cddl/contrib/dtracetoolkit/Cpu/inttimes.d new file mode 100755 index 000000000000..926a566553e5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Cpu/loads.d b/cddl/contrib/dtracetoolkit/Cpu/loads.d new file mode 100755 index 000000000000..681e8f6beb7d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Cpu/runocc.d b/cddl/contrib/dtracetoolkit/Cpu/runocc.d new file mode 100755 index 000000000000..a2b046971a2c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Cpu/xcallsbypid.d b/cddl/contrib/dtracetoolkit/Cpu/xcallsbypid.d new file mode 100755 index 000000000000..b08027c2a254 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Disk/Readme b/cddl/contrib/dtracetoolkit/Disk/Readme new file mode 100644 index 000000000000..37a5301cb466 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Disk/bitesize.d b/cddl/contrib/dtracetoolkit/Disk/bitesize.d new file mode 100755 index 000000000000..f2e8ea4fcc3b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Disk/diskhits b/cddl/contrib/dtracetoolkit/Disk/diskhits new file mode 100755 index 000000000000..3d72e4ade583 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Disk/hotspot.d b/cddl/contrib/dtracetoolkit/Disk/hotspot.d new file mode 100755 index 000000000000..6ab6ee45d69a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Disk/iofile.d b/cddl/contrib/dtracetoolkit/Disk/iofile.d new file mode 100755 index 000000000000..255057a7ebd7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Disk/iofileb.d b/cddl/contrib/dtracetoolkit/Disk/iofileb.d new file mode 100755 index 000000000000..e7572f338ad1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Disk/iopending b/cddl/contrib/dtracetoolkit/Disk/iopending new file mode 100755 index 000000000000..ef9d4da7a625 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Disk/seeksize.d b/cddl/contrib/dtracetoolkit/Disk/seeksize.d new file mode 100755 index 000000000000..963d9ad6d637 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/Contents b/cddl/contrib/dtracetoolkit/Docs/Contents new file mode 100644 index 000000000000..525fd05b85a7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/Examples b/cddl/contrib/dtracetoolkit/Docs/Examples new file mode 120000 index 000000000000..309832683601 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Examples @@ -0,0 +1 @@ +../Examples
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Docs/Faq b/cddl/contrib/dtracetoolkit/Docs/Faq new file mode 100644 index 000000000000..4919cac9fc51 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/History b/cddl/contrib/dtracetoolkit/Docs/History new file mode 100644 index 000000000000..d92bf11436e4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/Index b/cddl/contrib/dtracetoolkit/Docs/Index new file mode 120000 index 000000000000..9ae9ea0ab582 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Index @@ -0,0 +1 @@ +Contents
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Docs/Links b/cddl/contrib/dtracetoolkit/Docs/Links new file mode 100644 index 000000000000..182bb548b5b2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/Maintainer b/cddl/contrib/dtracetoolkit/Docs/Maintainer new file mode 100644 index 000000000000..3a8bb429a1c4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/Notes b/cddl/contrib/dtracetoolkit/Docs/Notes new file mode 120000 index 000000000000..e0856feb2688 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Docs/Notes @@ -0,0 +1 @@ +../Notes
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Docs/Readme b/cddl/contrib/dtracetoolkit/Docs/Readme new file mode 100644 index 000000000000..1f98f38d30f1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/ToDo b/cddl/contrib/dtracetoolkit/Docs/ToDo new file mode 100644 index 000000000000..5561ea4b17ad --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/Who b/cddl/contrib/dtracetoolkit/Docs/Who new file mode 100644 index 000000000000..f1019a9b92b1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/cddl1.txt b/cddl/contrib/dtracetoolkit/Docs/cddl1.txt new file mode 100644 index 000000000000..b3487ade1b87 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Docs/oneliners.txt b/cddl/contrib/dtracetoolkit/Docs/oneliners.txt new file mode 100644 index 000000000000..fca2aa313e2f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/Copyright b/cddl/contrib/dtracetoolkit/Examples/Copyright new file mode 100644 index 000000000000..d802fe9086b4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/Copyright @@ -0,0 +1 @@ +The examples in this directory are copyright to their author. diff --git a/cddl/contrib/dtracetoolkit/Examples/Readme b/cddl/contrib/dtracetoolkit/Examples/Readme new file mode 100644 index 000000000000..762a3312abf8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/anonpgpid_example.txt b/cddl/contrib/dtracetoolkit/Examples/anonpgpid_example.txt new file mode 100644 index 000000000000..b505f3d1596f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/bitesize_example.txt b/cddl/contrib/dtracetoolkit/Examples/bitesize_example.txt new file mode 100644 index 000000000000..dcc697d5070d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/connections_example.txt b/cddl/contrib/dtracetoolkit/Examples/connections_example.txt new file mode 100644 index 000000000000..e39d063113a8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/cpudists_example.txt b/cddl/contrib/dtracetoolkit/Examples/cpudists_example.txt new file mode 100644 index 000000000000..aa8256b7b7a9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/cputimes_example.txt b/cddl/contrib/dtracetoolkit/Examples/cputimes_example.txt new file mode 100644 index 000000000000..253a7a34bd6e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/cputypes_example.txt b/cddl/contrib/dtracetoolkit/Examples/cputypes_example.txt new file mode 100644 index 000000000000..158a43f15875 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/cpuwalk_example.txt b/cddl/contrib/dtracetoolkit/Examples/cpuwalk_example.txt new file mode 100644 index 000000000000..34afa959815e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/crash_example.txt b/cddl/contrib/dtracetoolkit/Examples/crash_example.txt new file mode 100644 index 000000000000..f0034d3b74d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/creatbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/creatbyproc_example.txt new file mode 100644 index 000000000000..295e07ff2fbb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/cswstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/cswstat_example.txt new file mode 100644 index 000000000000..d45347c64f33 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/dappprof_example.txt b/cddl/contrib/dtracetoolkit/Examples/dappprof_example.txt new file mode 100644 index 000000000000..a2c3935939c2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/dapptrace_example.txt b/cddl/contrib/dtracetoolkit/Examples/dapptrace_example.txt new file mode 100644 index 000000000000..f19606ceca51 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/dexplorer_example.txt b/cddl/contrib/dtracetoolkit/Examples/dexplorer_example.txt new file mode 100644 index 000000000000..cba6171c350e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/diskhits_example.txt b/cddl/contrib/dtracetoolkit/Examples/diskhits_example.txt new file mode 100644 index 000000000000..6fe3a859a972 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/dispqlen_example.txt b/cddl/contrib/dtracetoolkit/Examples/dispqlen_example.txt new file mode 100644 index 000000000000..f3542c00ea82 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/dnlcps_example.txt b/cddl/contrib/dtracetoolkit/Examples/dnlcps_example.txt new file mode 100644 index 000000000000..eed35b41f70a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/dnlcsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/dnlcsnoop_example.txt new file mode 100644 index 000000000000..45915f1088b4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/dnlcstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/dnlcstat_example.txt new file mode 100644 index 000000000000..a6ce1d6ec3d5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/dtruss_example.txt b/cddl/contrib/dtracetoolkit/Examples/dtruss_example.txt new file mode 100644 index 000000000000..107fc1978426 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/dvmstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/dvmstat_example.txt new file mode 100644 index 000000000000..1fb7fbb739d1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/errinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/errinfo_example.txt new file mode 100644 index 000000000000..1dcb28d29db9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/execsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/execsnoop_example.txt new file mode 100644 index 000000000000..e55682a9e64a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/fddist_example.txt b/cddl/contrib/dtracetoolkit/Examples/fddist_example.txt new file mode 100644 index 000000000000..3d943b9e0185 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/filebyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/filebyproc_example.txt new file mode 100644 index 000000000000..8267da2fc083 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/fspaging_example.txt b/cddl/contrib/dtracetoolkit/Examples/fspaging_example.txt new file mode 100644 index 000000000000..c29cb086b832 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/fspaging_example.txt @@ -0,0 +1,32 @@ +The following is a short sample of output from the fspaging.d script. + + +fspaging.d traces syscall read and writes, vnode interface reads, writes, +getpage and putpage, and disk io. + + # ./fspaging.d + Event Device RW Size Offset Path + disk_io dad1 R 1024 0 /extra1 + disk_io dad1 R 8192 0 <none> + disk_io dad1 R 2048 0 <none> + sc-write . W 51200 0 /extra1/outfile + fop_write . W 51200 0 /extra1/outfile + fop_getpage . R 8192 0 /extra1/50k + disk_io dad1 R 8192 0 /extra1/50k + disk_ra dad1 R 8192 8 /extra1/50k + fop_getpage . R 8192 8 /extra1/50k + disk_ra dad1 R 34816 16 /extra1/50k + fop_getpage . R 8192 16 /extra1/50k + fop_getpage . R 8192 24 /extra1/50k + fop_getpage . R 8192 32 /extra1/50k + fop_getpage . R 8192 40 /extra1/50k + fop_getpage . R 8192 48 /extra1/50k + fop_putpage . W 8192 0 /extra1/outfile + fop_putpage . W 8192 8 /extra1/outfile + fop_putpage . W 8192 16 /extra1/outfile + fop_putpage . W 8192 24 /extra1/outfile + fop_putpage . W 8192 32 /extra1/outfile + fop_putpage . W 8192 40 /extra1/outfile + disk_io dad1 W 51200 0 /extra1/outfile + +For a full discussion of this example, see fsrw_example.txt. diff --git a/cddl/contrib/dtracetoolkit/Examples/fsrw_example.txt b/cddl/contrib/dtracetoolkit/Examples/fsrw_example.txt new file mode 100644 index 000000000000..b153303738ee --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/fsrw_example.txt @@ -0,0 +1,129 @@ +The following are demonstrations of the fsrw.d script. + + +Here the fsrw.d script was running while a 50 Kbyte file was read, + + # ./fsrw.d + Event Device RW Size Offset Path + sc-read . R 8192 0 /extra1/50k + fop_read . R 8192 0 /extra1/50k + disk_io cmdk0 R 8192 0 /extra1/50k + disk_ra cmdk0 R 8192 8 /extra1/50k + sc-read . R 8192 8 /extra1/50k + fop_read . R 8192 8 /extra1/50k + disk_ra cmdk0 R 34816 16 /extra1/50k + sc-read . R 8192 16 /extra1/50k + fop_read . R 8192 16 /extra1/50k + sc-read . R 8192 24 /extra1/50k + fop_read . R 8192 24 /extra1/50k + sc-read . R 8192 32 /extra1/50k + fop_read . R 8192 32 /extra1/50k + sc-read . R 8192 40 /extra1/50k + fop_read . R 8192 40 /extra1/50k + sc-read . R 8192 48 /extra1/50k + fop_read . R 8192 48 /extra1/50k + sc-read . R 8192 50 /extra1/50k + fop_read . R 8192 50 /extra1/50k + ^C + +By looking closely at the Offset (Kbytes) and Size of each transaction, we +can see how the read() system calls (sc-read) were satisfied by the file +system. There were 8 read() system calls, and 3 disk events - 2 of which were +UFS read-ahead (disk_ra). The final read-ahead was for 34 Kbytes and began +with an offset of 16 Kbytes, which read the remaining file data (34 + 16 = 50 +Kbytes). The subsequent read() system calls and corresponding fop_read() calls +returned from the page cache. + + + +The following demonstrates how a logical I/O is broken up into multiple +physical I/O events. Here a dd command was used to read 1 Mbytes from the +/var/sadm/install/contents file while fsrw.d was tracing. + + # ./fsrw.d + Event Device RW Size Offset Path + sc-read . R 1048576 0 /var/sadm/install/contents + fop_read . R 1048576 0 /var/sadm/install/contents + disk_ra cmdk0 R 4096 72 /var/sadm/install/contents + disk_ra cmdk0 R 8192 96 <none> + disk_ra cmdk0 R 57344 96 /var/sadm/install/contents + disk_ra cmdk0 R 57344 152 /var/sadm/install/contents + disk_ra cmdk0 R 57344 208 /var/sadm/install/contents + disk_ra cmdk0 R 49152 264 /var/sadm/install/contents + disk_ra cmdk0 R 57344 312 /var/sadm/install/contents + disk_ra cmdk0 R 57344 368 /var/sadm/install/contents + disk_ra cmdk0 R 57344 424 /var/sadm/install/contents + disk_ra cmdk0 R 57344 480 /var/sadm/install/contents + disk_ra cmdk0 R 57344 536 /var/sadm/install/contents + disk_ra cmdk0 R 57344 592 /var/sadm/install/contents + disk_ra cmdk0 R 57344 648 /var/sadm/install/contents + disk_ra cmdk0 R 57344 704 /var/sadm/install/contents + disk_ra cmdk0 R 57344 760 /var/sadm/install/contents + disk_ra cmdk0 R 57344 816 /var/sadm/install/contents + disk_ra cmdk0 R 57344 872 /var/sadm/install/contents + disk_ra cmdk0 R 57344 928 /var/sadm/install/contents + disk_ra cmdk0 R 57344 984 /var/sadm/install/contents + disk_ra cmdk0 R 57344 1040 /var/sadm/install/contents + ^C + +Both the read() syscall (sc-read) and the fop_read() call asked the file system +for 1048576 bytes, which was then broken into numerous disk I/O events of up to +56 Kbytes in size. The 8192 byte read with a path of "<none>" is likely to be +the file system reading the indirect block pointers for the +/var/sadm/install/contents file (something DTrace could confirm in detail). + + + + +The following traces activity as a cp command copies a 50 Kbyte file. + + # ./fsrw.d + Event Device RW Size Offset Path + disk_io dad1 R 1024 0 /extra1 + disk_io dad1 R 8192 0 <none> + disk_io dad1 R 8192 0 <none> + disk_io dad1 R 2048 0 <none> + disk_io dad1 R 2048 0 <none> + sc-write . W 51200 0 /extra1/outfile + fop_write . W 51200 0 /extra1/outfile + disk_io dad1 R 8192 0 /extra1/50k + disk_ra dad1 R 8192 8 /extra1/50k + disk_ra dad1 R 34816 16 /extra1/50k + disk_io dad1 R 2048 0 <none> + disk_io dad1 W 49152 0 /extra1/outfile + ^C + +Reads including UFS read-ahead can be seen as the file is read. +The output finishes with disk writes as the new file is flushed to disk. +The syscall write() and fop_write() can be seen to the /extra1/outfile, +however there is no syscall read() or fop_read() to /extra1/50k - which +we may have expected to occur before the writes. This is due to the way +the cp command now works, it uses mmap() to map files in for reading. +This activity can be seen if we also trace fop_getpage() and fop_putpage(), +as the fspaging.d dtrace script does. + + # ./fspaging.d + Event Device RW Size Offset Path + disk_io dad1 R 1024 0 /extra1 + disk_io dad1 R 8192 0 <none> + disk_io dad1 R 2048 0 <none> + sc-write . W 51200 0 /extra1/outfile + fop_write . W 51200 0 /extra1/outfile + fop_getpage . R 8192 0 /extra1/50k + disk_io dad1 R 8192 0 /extra1/50k + disk_ra dad1 R 8192 8 /extra1/50k + fop_getpage . R 8192 8 /extra1/50k + disk_ra dad1 R 34816 16 /extra1/50k + fop_getpage . R 8192 16 /extra1/50k + fop_getpage . R 8192 24 /extra1/50k + fop_getpage . R 8192 32 /extra1/50k + fop_getpage . R 8192 40 /extra1/50k + fop_getpage . R 8192 48 /extra1/50k + fop_putpage . W 8192 0 /extra1/outfile + fop_putpage . W 8192 8 /extra1/outfile + fop_putpage . W 8192 16 /extra1/outfile + fop_putpage . W 8192 24 /extra1/outfile + fop_putpage . W 8192 32 /extra1/outfile + fop_putpage . W 8192 40 /extra1/outfile + disk_io dad1 W 51200 0 /extra1/outfile + diff --git a/cddl/contrib/dtracetoolkit/Examples/guess_example.txt b/cddl/contrib/dtracetoolkit/Examples/guess_example.txt new file mode 100644 index 000000000000..74be8b3a4d81 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/hotkernel_example.txt b/cddl/contrib/dtracetoolkit/Examples/hotkernel_example.txt new file mode 100644 index 000000000000..d8a5aec0b98f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/hotspot_example.txt b/cddl/contrib/dtracetoolkit/Examples/hotspot_example.txt new file mode 100644 index 000000000000..179ba8d0a18f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/hotuser_example.txt b/cddl/contrib/dtracetoolkit/Examples/hotuser_example.txt new file mode 100644 index 000000000000..c038acd6cda8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/httpdstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/httpdstat_example.txt new file mode 100644 index 000000000000..b9f59e8ca687 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/icmpstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/icmpstat_example.txt new file mode 100644 index 000000000000..e8b8cfe6500b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/intbycpu_example.txt b/cddl/contrib/dtracetoolkit/Examples/intbycpu_example.txt new file mode 100644 index 000000000000..5ed213cba6ba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/intoncpu_example.txt b/cddl/contrib/dtracetoolkit/Examples/intoncpu_example.txt new file mode 100644 index 000000000000..ed408eb6a17d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/inttimes_example.txt b/cddl/contrib/dtracetoolkit/Examples/inttimes_example.txt new file mode 100644 index 000000000000..384d700ba234 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/iofile_example.txt b/cddl/contrib/dtracetoolkit/Examples/iofile_example.txt new file mode 100644 index 000000000000..f4fc476910f0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/iofile_example.txt @@ -0,0 +1,35 @@ +The following is a demonstration of the iofile.d script, + + +Here we run it while a tar command is backing up /var/adm, + + # iofile.d + Tracing... Hit Ctrl-C to end. + ^C + PID CMD TIME FILE + 5206 tar 109 /var/adm/acct/nite + 5206 tar 110 /var/adm/acct/sum + 5206 tar 114 /var/adm/acct/fiscal + 5206 tar 117 /var/adm/messages.3 + 5206 tar 172 /var/adm/sa + 5206 tar 3605 /var/adm/messages.2 + 5206 tar 4548 /var/adm/spellhist + 5206 tar 5769 /var/adm/exacct/brendan1task + 5206 tar 6416 /var/adm/acct + 5206 tar 7587 /var/adm/messages.1 + 5206 tar 8246 /var/adm/exacct/task + 5206 tar 8320 /var/adm/pool + 5206 tar 8973 /var/adm/pool/history + 5206 tar 9183 /var/adm/exacct + 3 fsflush 10882 <none> + 5206 tar 11861 /var/adm/exacct/flow + 5206 tar 12042 /var/adm/messages.0 + 5206 tar 12408 /var/adm/sm.bin + 5206 tar 13021 /var/adm/sulog + 5206 tar 19007 /var/adm/streams + 5206 tar 21811 <none> + 5206 tar 24918 /var/adm/exacct/proc + +In the above output, we can see that the tar command spent 24918 us (25 ms) +waiting for disk I/O on the /var/adm/exacct/proc file. + diff --git a/cddl/contrib/dtracetoolkit/Examples/iofileb_example.txt b/cddl/contrib/dtracetoolkit/Examples/iofileb_example.txt new file mode 100644 index 000000000000..21597f7e776d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/iopattern_example.txt b/cddl/contrib/dtracetoolkit/Examples/iopattern_example.txt new file mode 100644 index 000000000000..818a4a22e6dc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/iopending_example.txt b/cddl/contrib/dtracetoolkit/Examples/iopending_example.txt new file mode 100644 index 000000000000..f4bc8225c867 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/iosnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/iosnoop_example.txt new file mode 100644 index 000000000000..addb7dcbbe46 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/iosnoop_example.txt @@ -0,0 +1,39 @@ +The following demonstrates iosnoop. It was run on a system that was +fairly quiet until a tar command was run, + +# ./iosnoop + UID PID D BLOCK SIZE COMM PATHNAME + 0 0 W 1067 512 sched <none> + 0 0 W 6496304 1024 sched <none> + 0 3 W 6498797 512 fsflush <none> + 0 0 W 1067 512 sched <none> + 0 0 W 6496304 1024 sched <none> + 100 443 R 892288 4096 Xsun /usr/openwin/bin/Xsun + 100 443 R 891456 4096 Xsun /usr/openwin/bin/Xsun + 100 15795 R 3808 8192 tar /usr/bin/eject + 100 15795 R 35904 6144 tar /usr/bin/eject + 100 15795 R 39828 6144 tar /usr/bin/env + 100 15795 R 3872 8192 tar /usr/bin/expr + 100 15795 R 21120 7168 tar /usr/bin/expr + 100 15795 R 43680 6144 tar /usr/bin/false + 100 15795 R 44176 6144 tar /usr/bin/fdetach + 100 15795 R 3920 8192 tar /usr/bin/fdformat + 100 15795 R 3936 8192 tar /usr/bin/fdformat + 100 15795 R 4080 8192 tar /usr/bin/fdformat + 100 15795 R 9680 3072 tar /usr/bin/fdformat + 100 15795 R 4096 8192 tar /usr/bin/fgrep + 100 15795 R 46896 6144 tar /usr/bin/fgrep + 100 15795 R 4112 8192 tar /usr/bin/file + 100 15795 R 4128 8192 tar /usr/bin/file + 100 15795 R 4144 8192 tar /usr/bin/file + 100 15795 R 21552 7168 tar /usr/bin/file + 100 15795 R 4192 8192 tar /usr/bin/fmli + 100 15795 R 4208 8192 tar /usr/bin/fmli + 100 15795 R 4224 57344 tar /usr/bin/fmli + 100 15795 R 4336 24576 tar /usr/bin/fmli + 100 15795 R 695792 8192 tar <none> + 100 15795 R 696432 57344 tar /usr/bin/fmli +[...] + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/iotop_example.txt b/cddl/contrib/dtracetoolkit/Examples/iotop_example.txt new file mode 100644 index 000000000000..8cf55c189ba3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/j_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_calldist_example.txt new file mode 100644 index 000000000000..b659c0afc3ed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_calldist_example.txt @@ -0,0 +1,247 @@ +This is an example of j_calldist.d showing the elapsed times for different +types of Java operations. + +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0), and produces the output in graphical format, showing +a histogram of the amount of time taken by each call. Method calls are only +visible when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +Because of the extensive results returned otherwise, this script will show you +a configurable number of results in each section. The default (as in this +example) is ten. + +Here we see it tracing the activity of Code/Java/Func_abc. + +# j_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 elapsed times (us), + +Top 10 exclusive method elapsed times (us), + PID=311342, method, sun/net/www/ParseUtil.decode + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@ 3 + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@ 5 + 2048 |@@@@ 1 + 4096 | 0 + + PID=311342, method, java/net/URLClassLoader.<clinit> + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, java/util/jar/JarFile.hasClassPathAttribute + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, java/util/zip/ZipFile.read + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, sun/nio/cs/US_ASCII.newEncoder + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, java/util/zip/ZipFile.getInputStream + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, sun/nio/cs/US_ASCII.newDecoder + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@ 1 + 16 |@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@@@@@@@@@ 1 + 16384 | 0 + + PID=311342, method, java/util/HashMap.<init> + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@ 8 + 16 |@@@@@@@@@@@@@@@@ 9 + 32 |@@@@@@@@@ 5 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@@ 1 + 16384 | 0 + + PID=311342, method, java/io/UnixFileSystem.normalize + value ------------- Distribution ------------- count + 4 | 0 + 8 |@ 1 + 16 | 0 + 32 | 0 + 64 |@@@@@@@@@ 8 + 128 |@@@@@@@@@@@@@ 11 + 256 |@@@@@@ 5 + 512 |@@@@@@@@@ 8 + 1024 | 0 + 2048 | 0 + 4096 |@ 1 + 8192 | 0 + + PID=311342, method, java/lang/Thread.sleep + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + +Top 10 inclusive method elapsed times (us), + PID=311342, method, java/net/URLClassLoader$1.run + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@ 1 + 131072 | 0 + + PID=311342, method, java/net/URLClassLoader.findClass + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + 65536 |@@@@@@@@@@@@@@@@@@@@ 1 + 131072 | 0 + + PID=311342, method, sun/misc/URLClassPath.getLoader + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@ 1 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 |@@@@@@ 2 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 8192 | 0 + 16384 |@@@ 1 + 32768 | 0 + 65536 |@@@ 1 + 131072 | 0 + + PID=311342, method, java/lang/ClassLoader.loadClass + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@ 6 + 256 |@@@@@@@@@@@@@@@@@@@@@@ 15 + 512 |@@@@ 3 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 | 0 + 32768 | 0 + 65536 |@@@@ 3 + 131072 | 0 + + PID=311342, method, java/security/AccessController.doPrivileged + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@ 2 + 32 |@ 1 + 64 |@@@@ 4 + 128 |@@@@@@@@@@@@@@@@ 17 + 256 |@ 1 + 512 |@@@@ 4 + 1024 |@@ 2 + 2048 |@ 1 + 4096 |@@@@@@ 6 + 8192 |@ 1 + 16384 |@@ 2 + 32768 | 0 + 65536 |@@ 2 + 131072 | 0 + + PID=311342, method, Func_abc.func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + PID=311342, method, Func_abc.func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + PID=311342, method, java/lang/Thread.sleep + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 1048576 | 0 + + PID=311342, method, Func_abc.func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + PID=311342, method, Func_abc.main + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + +The elapsed times section is empty. It would show us anything that is not a +Java method - garbage collection for example. However there was nothing of +the kind in this example. + +The exclusive method elapsed times show us the time spent in the top ten most +time consuming methods, not including time spent in subroutines called by +those methods. + +The inclusive method elapsed times show us the time spent in the top ten most +time consuming methods including time spent in subroutines called by those +methods. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. diff --git a/cddl/contrib/dtracetoolkit/Examples/j_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_calls_example.txt new file mode 100644 index 000000000000..3aacb2c9025c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_calls_example.txt @@ -0,0 +1,137 @@ +The following are examples of running the j_calls.d script. + +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0). Method calls and object allocation are only visible +when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +Here we see it running on Code/Java/Func_abc + +# j_calls.d +Tracing... Hit Ctrl-C to end. +^C + + PID TYPE NAME COUNT + 311334 cload Func_abc 1 + 311334 cload java/io/BufferedInputStream 1 + 311334 cload java/io/BufferedOutputStream 1 + 311334 cload java/io/BufferedReader 1 + 311334 cload java/io/BufferedWriter 1 + 311334 cload java/io/Closeable 1 + 311334 cload java/io/Console 1 + 311334 cload java/io/Console$1 1 + 311334 cload java/io/Console$1$1 1 + 311334 cload java/io/DataInput 1 + 311334 cload java/io/DataInputStream 1 + 311334 cload java/io/DeleteOnExitHook 1 + 311334 cload java/io/ExpiringCache 1 + 311334 cload java/io/ExpiringCache$1 1 + 311334 cload java/io/ExpiringCache$Entry 1 + 311334 cload java/io/File 1 + 311334 cload java/io/File$1 1 + 311334 cload java/io/FileDescriptor 1 + 311334 cload java/io/FileInputStream 1 + 311334 cload java/io/FileOutputStream 1 + 311334 cload java/io/FilePermission 1 + 311334 cload java/io/FilePermission$1 1 + 311334 cload java/io/FilePermissionCollection 1 + 311334 cload java/io/FileReader 1 + 311334 cload java/io/FileSystem 1 + 311334 cload java/io/FilterInputStream 1 + 311334 cload java/io/FilterOutputStream 1 + 311334 cload java/io/Flushable 1 + 311334 cload java/io/InputStream 1 + 311334 cload java/io/InputStreamReader 1 + 311334 cload java/io/ObjectStreamClass 1 + 311334 cload java/io/ObjectStreamField 1 + 311334 cload java/io/OutputStream 1 + 311334 cload java/io/OutputStreamWriter 1 + 311334 cload java/io/PrintStream 1 + 311334 cload java/io/Reader 1 + 311334 cload java/io/Serializable 1 + 311334 cload java/io/UnixFileSystem 1 + 311334 cload java/io/Writer 1 + 311334 cload java/lang/AbstractStringBuilder 1 + 311334 cload java/lang/Appendable 1 + 311334 cload java/lang/ApplicationShutdownHooks 1 + 311334 cload java/lang/ArithmeticException 1 + 311334 cload java/lang/ArrayStoreException 1 + 311334 cload java/lang/Boolean 1 + 311334 cload java/lang/Byte 1 + 311334 cload java/lang/CharSequence 1 + 311334 cload java/lang/Character 1 + 311334 cload java/lang/CharacterDataLatin1 1 + 311334 cload java/lang/Class 1 +[... 1400 lines truncated ...] + 311334 method java/lang/Class.getClassLoader0 34 + 311334 method java/lang/String.toLowerCase 34 + 311334 method sun/security/action/GetPropertyAction.run 34 + 311334 method java/nio/CharBuffer.arrayOffset 36 + 311334 method java/util/HashMap.getEntry 36 + 311334 method java/io/File.<init> 37 + 311334 method java/io/UnixFileSystem.prefixLength 37 + 311334 oalloc java/io/File 37 + 311334 oalloc java/lang/reflect/Field 37 + 311334 method java/io/BufferedReader.readLine 38 + 311334 method java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread 38 + 311334 method java/lang/CharacterDataLatin1.toLowerCase 41 + 311334 method java/lang/CharacterDataLatin1.getProperties 43 + 311334 method java/security/AccessController.doPrivileged 43 + 311334 method java/util/Vector.size 43 + 311334 method java/nio/Buffer.position 44 + 311334 method java/nio/ByteBuffer.arrayOffset 44 + 311334 method java/lang/System.getProperty 48 + 311334 method java/util/Properties.getProperty 50 + 311334 method java/util/BitSet.expandTo 51 + 311334 method java/util/BitSet.set 51 + 311334 method java/lang/System.checkKey 56 + 311334 method java/lang/Thread.currentThread 57 + 311334 method java/util/Hashtable$Entry.<init> 57 + 311334 oalloc [Ljava/lang/String; 57 + 311334 oalloc java/util/Hashtable$Entry 57 + 311334 method java/util/Hashtable.get 59 + 311334 method java/util/Hashtable.put 63 + 311334 method java/util/BitSet.checkInvariants 71 + 311334 method java/util/BitSet.wordIndex 72 + 311334 method java/lang/StringBuilder.<init> 73 + 311334 method java/lang/StringBuilder.toString 73 + 311334 oalloc java/lang/StringBuilder 73 + 311334 method java/lang/AbstractStringBuilder.expandCapacity 81 + 311334 method java/util/HashMap.hash 81 + 311334 method java/util/HashMap.indexFor 81 + 311334 method java/lang/AbstractStringBuilder.<init> 82 + 311334 method java/lang/Character.toLowerCase 82 + 311334 method java/lang/String.startsWith 83 + 311334 method java/util/Arrays.copyOf 87 + 311334 method java/lang/String.lastIndexOf 90 + 311334 method java/lang/String.substring 94 + 311334 method java/util/Arrays.copyOfRange 107 + 311334 method java/lang/String.getChars 156 + 311334 method java/lang/System.getSecurityManager 174 + 311334 method java/lang/String.<init> 175 + 311334 method java/lang/String.equals 202 + 311334 method java/lang/Math.min 208 + 311334 method java/lang/String.hashCode 213 + 311334 method java/lang/String.indexOf 302 + 311334 oalloc [Ljava/lang/Object; 326 + 311334 method java/lang/System.arraycopy 360 + 311334 oalloc [I 374 + 311334 oalloc java/lang/Class 395 + 311334 oalloc [B 406 + 311334 oalloc [S 486 + 311334 method java/lang/StringBuilder.append 533 + 311334 oalloc [[I 541 + 311334 method java/lang/AbstractStringBuilder.append 549 + 311334 method java/lang/Object.<init> 823 + 311334 oalloc java/lang/String 931 + 311334 oalloc [C 1076 + 311334 method java/lang/String.charAt 1960 + +This shows us each of the events associated with the PID 311334, and the +number of times each event happened. These events can be of type cload (class +load), method (method call), mcompile (method compile), mload (compiled method +load), oalloc (object alloc) or thread (thread start). + +In this case you can see 1960 calls to java/lang/String.charAt, and 1076 +object allocations of type [C. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_calltime_example.txt new file mode 100644 index 000000000000..937e06f2a08a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_calltime_example.txt @@ -0,0 +1,67 @@ +The following are examples of j_calltime.d. + +This script traces the elapsed time of Java methods and prints a report of the +top ten in each category. This number is configurable with simple edit of +the DTrace script + +Here it traces the example program, Code/Java/Func_abc + +# j_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 counts, + PID TYPE NAME COUNT + 311358 method java/lang/String.equals 202 + 311358 method java/lang/Math.min 208 + 311358 method java/lang/String.hashCode 213 + 311358 method java/lang/String.indexOf 302 + 311358 method java/lang/System.arraycopy 360 + 311358 method java/lang/StringBuilder.append 533 + 311358 method java/lang/AbstractStringBuilder.append 549 + 311358 method java/lang/Object.<init> 823 + 311358 method java/lang/String.charAt 1960 + 0 total - 12020 + +Top 10 elapsed times (us), + PID TYPE NAME TOTAL + +Top 10 exclusive method elapsed times (us), + PID TYPE NAME TOTAL + 311358 method java/nio/ByteBuffer.<init> 5430 + 311358 method java/lang/String.charAt 6079 + 311358 method java/lang/String.<init> 7306 + 311358 method java/lang/StringBuilder.append 10240 + 311358 method java/util/StringTokenizer.scanToken 11075 + 311358 method java/net/URL.<clinit> 12519 + 311358 method java/io/UnixFileSystem.normalize 13218 + 311358 method sun/net/www/ParseUtil.decode 14208 + 311358 method java/lang/Thread.sleep 3016374 + 0 total - 3344993 + +Top 10 inclusive method elapsed times (us), + PID TYPE NAME TOTAL + 311358 method sun/misc/Launcher.<clinit> 129120 + 311358 method java/lang/ClassLoader.initSystemClassLoader 129851 + 311358 method java/lang/ClassLoader.getSystemClassLoader 129897 + 311358 method java/lang/ClassLoader.loadClass 267404 + 311358 method java/security/AccessController.doPrivileged 278364 + 311358 method Func_abc.func_c 1009971 + 311358 method Func_abc.func_b 2019995 + 311358 method java/lang/Thread.sleep 3016374 + 311358 method Func_abc.func_a 3027043 + 311358 method Func_abc.main 3027068 + +Counts shows us how many times each different method was called, and how +many methods were called in total. + +The exclusive method elapsed times show the time that each method spent +processing code - while not in other method. + +The inclusive method elapsed times show the time that each method spent +processing code, including the time spent in other calls. + +These elapsed times are the absolute time from when the method began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_classflow_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_classflow_example.txt new file mode 100644 index 000000000000..b8a9b75000cd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_classflow_example.txt @@ -0,0 +1,89 @@ +Following are examples of j_classflow.d. + +This watches Java method entries and returns from all Java processes on the +system with hotspot provider support (1.6.0) and the flag +"+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + +Here we can see it run on Code/Java/Func_abc. + +# j_classflow.d Func_abc + C PID TIME(us) -- CLASS.METHOD + 0 311425 4789778117827 -> Func_abc.main + 0 311425 4789778117844 -> Func_abc.func_a + 0 311425 4789779120071 -> Func_abc.func_b + 0 311425 4789780130070 -> Func_abc.func_c + 0 311425 4789781140067 <- Func_abc.func_c + 0 311425 4789781140079 <- Func_abc.func_b + 0 311425 4789781140087 <- Func_abc.func_a + 0 311425 4789781140095 <- Func_abc.main +^C + +The first column, C gives us the CPU ID. + +The second column, TIME(us), gives us the time since boot in microseconds. + +The third column, PID gives us the Process ID. + +The fourth column, CLASS.METHOD gives us the Java class and method name. + +We can see that Func_abc.main called Func.abc.func_a, which in turn +called Func_abc.funcb etc. + +Here we can see an example of running it on java/io/BufferedOutputStream + +# j_classflow.d java/io/BufferedOutputStream + C PID TIME(us) -- CLASS.METHOD + 0 311461 4790094765413 -> java/io/BufferedOutputStream.<init> + 0 311461 4790094765459 <- java/io/BufferedOutputStream.<init> + 0 311461 4790094779559 -> java/io/BufferedOutputStream.<init> + 0 311461 4790094779595 <- java/io/BufferedOutputStream.<init> + 0 311461 4790094965883 -> java/io/BufferedOutputStream.write + 0 311461 4790094965913 <- java/io/BufferedOutputStream.write + 0 311461 4790094965926 -> java/io/BufferedOutputStream.flush + 0 311461 4790094965936 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966279 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966293 <- java/io/BufferedOutputStream.flush + 0 311461 4790094966588 -> java/io/BufferedOutputStream.write + 0 311461 4790094966602 <- java/io/BufferedOutputStream.write + 0 311461 4790094966610 -> java/io/BufferedOutputStream.flush + 0 311461 4790094966618 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966778 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966787 <- java/io/BufferedOutputStream.flush + 0 311461 4790094966811 -> java/io/BufferedOutputStream.flush + 0 311461 4790094966819 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966828 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790094966836 <- java/io/BufferedOutputStream.flush + 0 311461 4790095970345 -> java/io/BufferedOutputStream.write + 0 311461 4790095970372 <- java/io/BufferedOutputStream.write + 0 311461 4790095970382 -> java/io/BufferedOutputStream.flush + 0 311461 4790095970390 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970453 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970462 <- java/io/BufferedOutputStream.flush + 0 311461 4790095970737 -> java/io/BufferedOutputStream.write + 0 311461 4790095970751 <- java/io/BufferedOutputStream.write + 0 311461 4790095970759 -> java/io/BufferedOutputStream.flush + 0 311461 4790095970766 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970795 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970804 <- java/io/BufferedOutputStream.flush + 0 311461 4790095970828 -> java/io/BufferedOutputStream.flush + 0 311461 4790095970836 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970844 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790095970853 <- java/io/BufferedOutputStream.flush + 0 311461 4790096980348 -> java/io/BufferedOutputStream.write + 0 311461 4790096980373 <- java/io/BufferedOutputStream.write + 0 311461 4790096980383 -> java/io/BufferedOutputStream.flush + 0 311461 4790096980391 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980452 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980460 <- java/io/BufferedOutputStream.flush + 0 311461 4790096980735 -> java/io/BufferedOutputStream.write + 0 311461 4790096980749 <- java/io/BufferedOutputStream.write + 0 311461 4790096980757 -> java/io/BufferedOutputStream.flush + 0 311461 4790096980765 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980794 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980803 <- java/io/BufferedOutputStream.flush + 0 311461 4790096980826 -> java/io/BufferedOutputStream.flush + 0 311461 4790096980834 -> java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980843 <- java/io/BufferedOutputStream.flushBuffer + 0 311461 4790096980851 <- java/io/BufferedOutputStream.flush + + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_cpudist_example.txt new file mode 100644 index 000000000000..15abac649a5f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_cpudist_example.txt @@ -0,0 +1,252 @@ +This is an example of j_cpudist.d showing the elapsed times for different +types of Java operations. + +This traces activity from all Java processes on the system with hotspot +provider support (1.6.0), and produces the output in graphical format, showing +a histogram of the amount of time taken by each call. Method calls are only +visible when using the flag "+ExtendedDTraceProbes". eg, +java -XX:+ExtendedDTraceProbes classfile + +Because of the extensive results returned otherwise, this script will show you +a configurable number of results in each section. The default (as in this +example) is ten. + +Here we see it tracing the activity of Code/Java/Func_abc. + +# j_cpudist.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 on-CPU times (us), + +Top 10 exclusive method on-CPU times (us), + PID=311364, method, java/lang/AbstractStringBuilder.append + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 382 + 2 |@@@@@@@@@@@ 151 + 4 |@ 13 + 8 | 1 + 16 | 1 + 32 | 1 + 64 | 0 + + PID=311364, method, java/util/Arrays.copyOf + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 68 + 4 |@@@@@@@ 15 + 8 | 0 + 16 | 0 + 32 | 1 + 64 | 1 + 128 | 0 + 256 |@ 2 + 512 | 0 + + PID=311364, method, java/io/UnixFileSystem.normalize + value ------------- Distribution ------------- count + 1 | 0 + 2 |@ 1 + 4 | 0 + 8 |@@@@@@@@@@@ 9 + 16 |@@@@@@@@@@@@@@ 12 + 32 |@@@@@@ 5 + 64 |@@@@@@@ 6 + 128 |@ 1 + 256 | 0 + + PID=311364, method, java/io/File.<clinit> + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + PID=311364, method, sun/misc/URLClassPath$JarLoader.getJarFile + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + PID=311364, method, java/io/FilePermission$1.run + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@ 1 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 |@@@@@@@@@@ 1 + 2048 | 0 + + PID=311364, method, java/lang/StringBuilder.append + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 526 + 4 | 2 + 8 | 0 + 16 | 4 + 32 | 1 + 64 | 0 + + PID=311364, method, java/lang/String.<init> + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 162 + 4 |@@ 10 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 1 + 128 | 0 + 256 | 1 + 512 | 0 + 1024 | 1 + 2048 | 0 + + PID=311364, method, java/lang/String.charAt + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1953 + 2 | 3 + 4 | 1 + 8 | 1 + 16 | 2 + 32 | 0 + + PID=311364, method, java/lang/System.initializeSystemClass + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + +Top 10 inclusive method on-CPU times (us), + PID=311364, method, sun/misc/Launcher$ExtClassLoader.<init> + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher$ExtClassLoader.getExtClassLoader + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher$ExtClassLoader.getExtURLs + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher.<clinit> + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher.<init> + value ------------- Distribution ------------- count + 8192 | 0 + 16384 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32768 | 0 + + PID=311364, method, java/lang/ClassLoader.loadClassInternal + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 128 |@@@@@@@@@ 2 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 |@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/Launcher$AppClassLoader.loadClass + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 128 |@@@@@@@@@ 2 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 | 0 + 16384 |@@@@ 1 + 32768 | 0 + + PID=311364, method, sun/misc/URLClassPath.getLoader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@ 1 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 |@@@ 1 + 512 |@@@@@@@@@@@@@@@@@@@@@@ 7 + 1024 |@@@@@@ 2 + 2048 | 0 + 4096 |@@@ 1 + 8192 |@@@ 1 + 16384 | 0 + + PID=311364, method, java/lang/ClassLoader.loadClass + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@ 6 + 64 |@@@@@@@@@@@@@@@@@@@@@ 14 + 128 |@@@@@@ 4 + 256 | 0 + 512 | 0 + 1024 | 0 + 2048 | 0 + 4096 | 0 + 8192 |@ 1 + 16384 |@@@ 2 + 32768 | 0 + + PID=311364, method, java/security/AccessController.doPrivileged + value ------------- Distribution ------------- count + 2 | 0 + 4 |@ 1 + 8 |@@@@ 4 + 16 |@@@@@@@@@@ 11 + 32 |@@@@@@@@@@ 11 + 64 | 0 + 128 |@@@ 3 + 256 |@ 1 + 512 |@@@@@ 5 + 1024 |@@ 2 + 2048 |@ 1 + 4096 |@ 1 + 8192 |@@ 2 + 16384 |@ 1 + 32768 | 0 + +The elapsed times section is empty. It would show us anything that is not a +Java method - garbage collection for example. However there was nothing of +the kind in this example. + +The exclusive method elapsed times show us the time spent on-CPU by the most +time consuming methods, not including time spent in subroutines called by +those methods. + +The inclusive method elapsed times show us the time spent on-CPU by the top +ten most time consuming methods including time spent in subroutines called by +those methods. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_cputime_example.txt new file mode 100644 index 000000000000..0947cc05cbcd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_cputime_example.txt @@ -0,0 +1,75 @@ +The following are examples of j_cputime.d. + +This script traces the on-CPU time of Java methods and prints a report. Here +it traces the example program, Code/Java/Func_abc + +# j_cputime.d +Tracing... Hit Ctrl-C to end. +^C + +Top 10 counts, + PID TYPE NAME COUNT + 311374 method java/lang/String.equals 202 + 311374 method java/lang/Math.min 208 + 311374 method java/lang/String.hashCode 213 + 311374 method java/lang/String.indexOf 302 + 311374 method java/lang/System.arraycopy 360 + 311374 method java/lang/StringBuilder.append 533 + 311374 method java/lang/AbstractStringBuilder.append 549 + 311374 method java/lang/Object.<init> 823 + 311374 method java/lang/String.charAt 1960 + 0 total - 12020 + +Top 10 on-CPU times (us), + PID TYPE NAME TOTAL + +Top 10 exclusive method on-CPU times (us), + PID TYPE NAME TOTAL + 311374 method java/io/FilePermission$1.run 1055 + 311374 method java/util/Arrays.copyOf 1110 + 311374 method sun/net/www/ParseUtil.decode 1161 + 311374 method java/io/File.<clinit> 1212 + 311374 method java/lang/StringBuilder.append 1228 + 311374 method java/io/UnixFileSystem.normalize 1402 + 311374 method java/lang/String.<init> 2251 + 311374 method java/lang/String.charAt 2262 + 311374 method java/lang/System.initializeSystemClass 2751 + 0 total - 99868 + +Top 10 inclusive method on-CPU times (us), + PID TYPE NAME TOTAL + 311374 method java/lang/ClassLoader.loadClassInternal 25826 + 311374 method sun/misc/Launcher$ExtClassLoader.getExtClassLoader 25914 + 311374 method java/net/URL.<init> 27677 + 311374 method sun/misc/Launcher.<init> 28566 + 311374 method sun/misc/Launcher.<clinit> 28744 + 311374 method java/lang/ClassLoader.initSystemClassLoader 29241 + 311374 method java/lang/ClassLoader.getSystemClassLoader 29249 + 311374 method java/lang/System.initializeSystemClass 33814 + 311374 method java/lang/ClassLoader.loadClass 66564 + 311374 method java/security/AccessController.doPrivileged 67499 + +You can see that it prints the top ten results in each of four categories. + +The first section reports how many times each subroutine was called, and it's +type. + +The second section reports on the on-CPU time of anything that was not of type +"method", in this case - none. + +The exclusive method on-CPU times shows, amongst other results, that +java/lang/String.charAt spent around 2,200 microseconds on-CPU. This times +excludes time spent in other subroutines. + +The inclusive method on-CPU times show the times that various methods +spent on-CPU. This includes the time spent in other subroutines called. + +These on-CPU times are the time the thread spent running on a CPU, from when +the subroutine began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_events_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_events_example.txt new file mode 100644 index 000000000000..2c48700f3d21 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/j_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_flow_example.txt new file mode 100644 index 000000000000..433bef314224 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_flow_example.txt @@ -0,0 +1,1292 @@ +The following are examples of j_flow.d. + +This is a simple script to trace the not-so-simple flow of Java methods and +classes. Here it traces the example program, Code/Java/func_abc + +# j_flow.d + C PID TIME(us) -- CLASS.METHOD + 0 311403 4789112583163 -> java/lang/Object.<clinit> + 0 311403 4789112583207 -> java/lang/Object.registerNatives + 0 311403 4789112583323 <- java/lang/Object.registerNatives + 0 311403 4789112583333 <- java/lang/Object.<clinit> + 0 311403 4789112583343 -> java/lang/String.<clinit> + 0 311403 4789112583732 -> java/lang/String$CaseInsensitiveComparator.<init> + 0 311403 4789112583743 -> java/lang/String$CaseInsensitiveComparator.<init> + 0 311403 4789112583752 -> java/lang/Object.<init> + 0 311403 4789112583760 <- java/lang/Object.<init> + 0 311403 4789112583767 <- java/lang/String$CaseInsensitiveComparator.<init> + 0 311403 4789112583774 <- java/lang/String$CaseInsensitiveComparator.<init> + 0 311403 4789112583783 <- java/lang/String.<clinit> + 0 311403 4789112583849 -> java/lang/System.<clinit> + 0 311403 4789112583859 -> java/lang/System.registerNatives + 0 311403 4789112583878 <- java/lang/System.registerNatives + 0 311403 4789112583887 -> java/lang/System.nullInputStream + 0 311403 4789112583895 -> java/lang/System.currentTimeMillis + 0 311403 4789112583905 <- java/lang/System.currentTimeMillis + 0 311403 4789112583913 <- java/lang/System.nullInputStream + 0 311403 4789112583923 -> java/lang/System.nullPrintStream + 0 311403 4789112583929 -> java/lang/System.currentTimeMillis + 0 311403 4789112583937 <- java/lang/System.currentTimeMillis + 0 311403 4789112583944 <- java/lang/System.nullPrintStream + 0 311403 4789112583951 -> java/lang/System.nullPrintStream + 0 311403 4789112583958 -> java/lang/System.currentTimeMillis + 0 311403 4789112583965 <- java/lang/System.currentTimeMillis + 0 311403 4789112583972 <- java/lang/System.nullPrintStream + 0 311403 4789112583982 <- java/lang/System.<clinit> + 0 311403 4789112584058 -> java/lang/ThreadGroup.<init> + 0 311403 4789112584068 -> java/lang/Object.<init> + 0 311403 4789112584075 <- java/lang/Object.<init> + 0 311403 4789112584100 <- java/lang/ThreadGroup.<init> + 0 311403 4789112584109 -> java/lang/ThreadGroup.<init> + 0 311403 4789112584116 -> java/lang/Object.<init> + 0 311403 4789112584123 <- java/lang/Object.<init> + 0 311403 4789112584139 -> java/lang/ThreadGroup.checkAccess + 0 311403 4789112584148 -> java/lang/System.getSecurityManager + 0 311403 4789112584157 <- java/lang/System.getSecurityManager + 0 311403 4789112584164 <- java/lang/ThreadGroup.checkAccess + 0 311403 4789112584175 -> java/lang/ThreadGroup.add + 0 311403 4789112584196 <- java/lang/ThreadGroup.add + 0 311403 4789112584202 <- java/lang/ThreadGroup.<init> + 0 311403 4789112584385 -> java/lang/Thread.<clinit> + 0 311403 4789112584396 -> java/lang/Thread.registerNatives + 0 311403 4789112584421 <- java/lang/Thread.registerNatives + 0 311403 4789112584779 -> java/lang/RuntimePermission.<init> + 0 311403 4789112584789 -> java/security/BasicPermission.<init> + 0 311403 4789112584798 -> java/security/Permission.<init> + 0 311403 4789112584806 -> java/lang/Object.<init> + 0 311403 4789112584814 <- java/lang/Object.<init> + 0 311403 4789112584823 <- java/security/Permission.<init> + 0 311403 4789112584831 -> java/security/BasicPermission.init + 0 311403 4789112584842 -> java/lang/String.length + 0 311403 4789112584850 <- java/lang/String.length + 0 311403 4789112584860 -> java/lang/String.charAt + 0 311403 4789112584869 <- java/lang/String.charAt + 0 311403 4789112584880 -> java/lang/String.equals + 0 311403 4789112584888 <- java/lang/String.equals + 0 311403 4789112584896 <- java/security/BasicPermission.init + 0 311403 4789112584903 <- java/security/BasicPermission.<init> + 0 311403 4789112584910 <- java/lang/RuntimePermission.<init> + 0 311403 4789112585319 -> sun/misc/SoftCache.<init> + 0 311403 4789112585329 -> java/util/AbstractMap.<init> + 0 311403 4789112585337 -> java/lang/Object.<init> + 0 311403 4789112585345 <- java/lang/Object.<init> + 0 311403 4789112585355 <- java/util/AbstractMap.<init> + 0 311403 4789112585485 -> java/lang/ref/ReferenceQueue.<clinit> + 0 311403 4789112585554 -> java/lang/ref/ReferenceQueue$Null.<init> + 0 311403 4789112585564 -> java/lang/ref/ReferenceQueue$Null.<init> + 0 311403 4789112585572 -> java/lang/ref/ReferenceQueue.<init> + 0 311403 4789112585581 -> java/lang/Object.<init> + 0 311403 4789112585589 <- java/lang/Object.<init> + 0 311403 4789112585646 -> java/lang/ref/ReferenceQueue$Lock.<init> + 0 311403 4789112585656 -> java/lang/ref/ReferenceQueue$Lock.<init> + 0 311403 4789112585664 -> java/lang/Object.<init> + 0 311403 4789112585671 <- java/lang/Object.<init> + 0 311403 4789112585678 <- java/lang/ref/ReferenceQueue$Lock.<init> + 0 311403 4789112585685 <- java/lang/ref/ReferenceQueue$Lock.<init> + 0 311403 4789112585696 <- java/lang/ref/ReferenceQueue.<init> + 0 311403 4789112585702 <- java/lang/ref/ReferenceQueue$Null.<init> + 0 311403 4789112585709 <- java/lang/ref/ReferenceQueue$Null.<init> + 0 311403 4789112585717 -> java/lang/ref/ReferenceQueue$Null.<init> + 0 311403 4789112585723 -> java/lang/ref/ReferenceQueue$Null.<init> + 0 311403 4789112585729 -> java/lang/ref/ReferenceQueue.<init> + 0 311403 4789112585736 -> java/lang/Object.<init> + 0 311403 4789112585743 <- java/lang/Object.<init> + 0 311403 4789112585748 -> java/lang/ref/ReferenceQueue$Lock.<init> + 0 311403 4789112585755 -> java/lang/ref/ReferenceQueue$Lock.<init> + 0 311403 4789112585761 -> java/lang/Object.<init> + 0 311403 4789112585768 <- java/lang/Object.<init> + 0 311403 4789112585796 <- java/lang/ref/ReferenceQueue$Lock.<init> + 0 311403 4789112585803 <- java/lang/ref/ReferenceQueue$Lock.<init> +[... 22800 lines truncated ...] + 0 311403 4789112982170 <- java/lang/reflect/Method.getModifiers + 0 311403 4789112982182 -> Func_abc.main + 0 311403 4789112982193 -> Func_abc.func_a + 0 311403 4789112982201 -> java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112982208 -> java/lang/System.getSecurityManager + 0 311403 4789112982215 <- java/lang/System.getSecurityManager + 0 311403 4789112982221 -> java/util/HashSet.add + 0 311403 4789112982228 -> java/util/HashMap.put + 0 311403 4789112982234 -> java/lang/Object.hashCode + 0 311403 4789112982241 <- java/lang/Object.hashCode + 0 311403 4789112982247 -> java/util/HashMap.hash + 0 311403 4789112982254 <- java/util/HashMap.hash + 0 311403 4789112982260 -> java/util/HashMap.indexFor + 0 311403 4789112982267 <- java/util/HashMap.indexFor + 0 311403 4789112982274 <- java/util/HashMap.put + 0 311403 4789112982280 <- java/util/HashSet.add + 0 311403 4789112982287 <- java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112982349 -> java/lang/ClassLoader.loadClassInternal + 0 311403 4789112982356 -> java/lang/ClassLoader.loadClass + 0 311403 4789112982363 -> sun/misc/Launcher$AppClassLoader.loadClass + 0 311403 4789112982369 -> java/lang/String.lastIndexOf + 0 311403 4789112982376 -> java/lang/String.lastIndexOf + 0 311403 4789112982384 <- java/lang/String.lastIndexOf + 0 311403 4789112982391 <- java/lang/String.lastIndexOf + 0 311403 4789112982396 -> java/lang/System.getSecurityManager + 0 311403 4789112982404 <- java/lang/System.getSecurityManager + 0 311403 4789112982410 -> java/lang/ClassLoader.loadClass + 0 311403 4789112982416 -> java/lang/ClassLoader.findLoadedClass + 0 311403 4789112982422 -> java/lang/ClassLoader.check + 0 311403 4789112982429 <- java/lang/ClassLoader.check + 0 311403 4789112982435 -> java/lang/ClassLoader.checkName + 0 311403 4789112982442 -> java/lang/String.indexOf + 0 311403 4789112982448 -> java/lang/String.indexOf + 0 311403 4789112982456 <- java/lang/String.indexOf + 0 311403 4789112982462 <- java/lang/String.indexOf + 0 311403 4789112982468 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112982475 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112982481 -> java/lang/String.charAt + 0 311403 4789112982488 <- java/lang/String.charAt + 0 311403 4789112982495 <- java/lang/ClassLoader.checkName + 0 311403 4789112982501 -> java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112982510 <- java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112982517 <- java/lang/ClassLoader.findLoadedClass + 0 311403 4789112982524 -> java/lang/ClassLoader.loadClass + 0 311403 4789112982530 -> java/lang/ClassLoader.findLoadedClass + 0 311403 4789112982536 -> java/lang/ClassLoader.check + 0 311403 4789112982543 <- java/lang/ClassLoader.check + 0 311403 4789112982549 -> java/lang/ClassLoader.checkName + 0 311403 4789112982555 -> java/lang/String.indexOf + 0 311403 4789112982561 -> java/lang/String.indexOf + 0 311403 4789112982569 <- java/lang/String.indexOf + 0 311403 4789112982576 <- java/lang/String.indexOf + 0 311403 4789112982582 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112982589 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112982594 -> java/lang/String.charAt + 0 311403 4789112982602 <- java/lang/String.charAt + 0 311403 4789112982608 <- java/lang/ClassLoader.checkName + 0 311403 4789112982614 -> java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112982623 <- java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112982630 <- java/lang/ClassLoader.findLoadedClass + 0 311403 4789112982636 -> java/lang/ClassLoader.findBootstrapClass0 + 0 311403 4789112982642 -> java/lang/ClassLoader.check + 0 311403 4789112982650 <- java/lang/ClassLoader.check + 0 311403 4789112982655 -> java/lang/ClassLoader.checkName + 0 311403 4789112982662 -> java/lang/String.indexOf + 0 311403 4789112982668 -> java/lang/String.indexOf + 0 311403 4789112982676 <- java/lang/String.indexOf + 0 311403 4789112982682 <- java/lang/String.indexOf + 0 311403 4789112982688 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112982695 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112982701 -> java/lang/String.charAt + 0 311403 4789112982708 <- java/lang/String.charAt + 0 311403 4789112982715 <- java/lang/ClassLoader.checkName + 0 311403 4789112982720 -> java/lang/ClassLoader.findBootstrapClass + 0 311403 4789112982730 <- java/lang/ClassLoader.findBootstrapClass + 0 311403 4789112982737 <- java/lang/ClassLoader.findBootstrapClass0 + 0 311403 4789112982744 <- java/lang/ClassLoader.loadClass + 0 311403 4789112982751 <- java/lang/ClassLoader.loadClass + 0 311403 4789112982757 <- sun/misc/Launcher$AppClassLoader.loadClass + 0 311403 4789112982764 <- java/lang/ClassLoader.loadClass + 0 311403 4789112982771 <- java/lang/ClassLoader.loadClassInternal + 0 311403 4789112982780 -> java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112982787 -> java/lang/System.getSecurityManager + 0 311403 4789112982794 <- java/lang/System.getSecurityManager + 0 311403 4789112982800 -> java/util/HashSet.add + 0 311403 4789112982806 -> java/util/HashMap.put + 0 311403 4789112982813 -> java/lang/Object.hashCode + 0 311403 4789112982820 <- java/lang/Object.hashCode + 0 311403 4789112982826 -> java/util/HashMap.hash + 0 311403 4789112982833 <- java/util/HashMap.hash + 0 311403 4789112982839 -> java/util/HashMap.indexFor + 0 311403 4789112982846 <- java/util/HashMap.indexFor + 0 311403 4789112982853 <- java/util/HashMap.put + 0 311403 4789112982859 <- java/util/HashSet.add + 0 311403 4789112982866 <- java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112982879 -> java/io/PrintStream.println + 0 311403 4789112982889 -> java/io/PrintStream.print + 0 311403 4789112982897 -> java/io/PrintStream.write + 0 311403 4789112982906 -> java/io/PrintStream.ensureOpen + 0 311403 4789112982916 <- java/io/PrintStream.ensureOpen + 0 311403 4789112982927 -> java/io/Writer.write + 0 311403 4789112982939 -> java/io/BufferedWriter.write + 0 311403 4789112982948 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789112982956 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789112982964 -> java/io/BufferedWriter.min + 0 311403 4789112982971 <- java/io/BufferedWriter.min + 0 311403 4789112982980 -> java/lang/String.getChars + 0 311403 4789112982987 -> java/lang/System.arraycopy + 0 311403 4789112982995 <- java/lang/System.arraycopy + 0 311403 4789112983002 <- java/lang/String.getChars + 0 311403 4789112983009 <- java/io/BufferedWriter.write + 0 311403 4789112983016 <- java/io/Writer.write + 0 311403 4789112983024 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789112983031 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789112983038 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789112983046 -> java/io/OutputStreamWriter.write + 0 311403 4789112983056 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789112983066 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789112983073 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789112983082 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789112983093 -> java/nio/CharBuffer.wrap + 0 311403 4789112983099 -> java/nio/HeapCharBuffer.<init> + 0 311403 4789112983106 -> java/nio/CharBuffer.<init> + 0 311403 4789112983113 -> java/nio/Buffer.<init> + 0 311403 4789112983119 -> java/lang/Object.<init> + 0 311403 4789112983126 <- java/lang/Object.<init> + 0 311403 4789112983133 -> java/nio/Buffer.limit + 0 311403 4789112983140 <- java/nio/Buffer.limit + 0 311403 4789112983146 -> java/nio/Buffer.position + 0 311403 4789112983153 <- java/nio/Buffer.position + 0 311403 4789112983160 <- java/nio/Buffer.<init> + 0 311403 4789112983166 <- java/nio/CharBuffer.<init> + 0 311403 4789112983173 <- java/nio/HeapCharBuffer.<init> + 0 311403 4789112983180 <- java/nio/CharBuffer.wrap + 0 311403 4789112983188 -> java/nio/Buffer.hasRemaining + 0 311403 4789112983196 <- java/nio/Buffer.hasRemaining + 0 311403 4789112983206 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789112983216 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789112983226 -> java/nio/CharBuffer.hasArray + 0 311403 4789112983233 <- java/nio/CharBuffer.hasArray + 0 311403 4789112983243 -> java/nio/ByteBuffer.hasArray + 0 311403 4789112983250 <- java/nio/ByteBuffer.hasArray + 0 311403 4789112983259 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789112983267 -> java/nio/CharBuffer.array + 0 311403 4789112983274 <- java/nio/CharBuffer.array + 0 311403 4789112983282 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112983289 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112983297 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112983305 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112983316 -> java/nio/ByteBuffer.array + 0 311403 4789112983323 <- java/nio/ByteBuffer.array + 0 311403 4789112983331 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983338 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983346 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983354 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983366 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112983374 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112983382 -> java/nio/Buffer.position + 0 311403 4789112983389 <- java/nio/Buffer.position + 0 311403 4789112983395 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983402 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983410 -> java/nio/Buffer.position + 0 311403 4789112983417 <- java/nio/Buffer.position + 0 311403 4789112983424 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789112983431 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789112983439 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789112983447 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789112983454 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112983462 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112983469 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789112983477 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112983485 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112983494 -> java/nio/Buffer.remaining + 0 311403 4789112983501 <- java/nio/Buffer.remaining + 0 311403 4789112983508 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789112983515 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789112983522 <- java/io/OutputStreamWriter.write + 0 311403 4789112983528 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789112983537 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789112983546 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789112983555 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789112983565 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789112983574 -> java/nio/Buffer.flip + 0 311403 4789112983581 <- java/nio/Buffer.flip + 0 311403 4789112983591 -> java/nio/ByteBuffer.array + 0 311403 4789112983598 <- java/nio/ByteBuffer.array + 0 311403 4789112983606 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983613 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112983623 -> java/io/PrintStream.write + 0 311403 4789112983629 -> java/io/PrintStream.ensureOpen + 0 311403 4789112983636 <- java/io/PrintStream.ensureOpen + 0 311403 4789112983645 -> java/io/BufferedOutputStream.write + 0 311403 4789112983657 -> java/lang/System.arraycopy + 0 311403 4789112983664 <- java/lang/System.arraycopy + 0 311403 4789112983671 <- java/io/BufferedOutputStream.write + 0 311403 4789112983679 -> java/io/BufferedOutputStream.flush + 0 311403 4789112983688 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112983698 -> java/io/FileOutputStream.write + 0 311403 4789112983707 -> java/io/FileOutputStream.writeBytes + 0 311403 4789112983860 <- java/io/FileOutputStream.writeBytes + 0 311403 4789112983868 <- java/io/FileOutputStream.write + 0 311403 4789112983874 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112983885 <- java/io/BufferedOutputStream.flush + 0 311403 4789112983892 <- java/io/PrintStream.write + 0 311403 4789112983901 -> java/nio/Buffer.clear + 0 311403 4789112983909 <- java/nio/Buffer.clear + 0 311403 4789112983915 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789112983922 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789112983929 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789112983936 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789112983946 -> java/lang/String.indexOf + 0 311403 4789112983952 -> java/lang/String.indexOf + 0 311403 4789112983961 <- java/lang/String.indexOf + 0 311403 4789112983967 <- java/lang/String.indexOf + 0 311403 4789112983974 <- java/io/PrintStream.write + 0 311403 4789112983981 <- java/io/PrintStream.print + 0 311403 4789112983989 -> java/io/PrintStream.newLine + 0 311403 4789112983995 -> java/io/PrintStream.ensureOpen + 0 311403 4789112984002 <- java/io/PrintStream.ensureOpen + 0 311403 4789112984010 -> java/io/BufferedWriter.newLine + 0 311403 4789112984019 -> java/io/Writer.write + 0 311403 4789112984025 -> java/io/BufferedWriter.write + 0 311403 4789112984031 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789112984039 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789112984045 -> java/io/BufferedWriter.min + 0 311403 4789112984052 <- java/io/BufferedWriter.min + 0 311403 4789112984058 -> java/lang/String.getChars + 0 311403 4789112984064 -> java/lang/System.arraycopy + 0 311403 4789112984072 <- java/lang/System.arraycopy + 0 311403 4789112984078 <- java/lang/String.getChars + 0 311403 4789112984085 <- java/io/BufferedWriter.write + 0 311403 4789112984092 <- java/io/Writer.write + 0 311403 4789112984099 <- java/io/BufferedWriter.newLine + 0 311403 4789112984104 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789112984111 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789112984118 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789112984124 -> java/io/OutputStreamWriter.write + 0 311403 4789112984130 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789112984137 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789112984144 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789112984150 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789112984156 -> java/nio/CharBuffer.wrap + 0 311403 4789112984163 -> java/nio/HeapCharBuffer.<init> + 0 311403 4789112984169 -> java/nio/CharBuffer.<init> + 0 311403 4789112984175 -> java/nio/Buffer.<init> + 0 311403 4789112984181 -> java/lang/Object.<init> + 0 311403 4789112984189 <- java/lang/Object.<init> + 0 311403 4789112984194 -> java/nio/Buffer.limit + 0 311403 4789112984202 <- java/nio/Buffer.limit + 0 311403 4789112984207 -> java/nio/Buffer.position + 0 311403 4789112984214 <- java/nio/Buffer.position + 0 311403 4789112984221 <- java/nio/Buffer.<init> + 0 311403 4789112984228 <- java/nio/CharBuffer.<init> + 0 311403 4789112984234 <- java/nio/HeapCharBuffer.<init> + 0 311403 4789112984241 <- java/nio/CharBuffer.wrap + 0 311403 4789112984247 -> java/nio/Buffer.hasRemaining + 0 311403 4789112984254 <- java/nio/Buffer.hasRemaining + 0 311403 4789112984260 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789112984266 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789112984273 -> java/nio/CharBuffer.hasArray + 0 311403 4789112984280 <- java/nio/CharBuffer.hasArray + 0 311403 4789112984286 -> java/nio/ByteBuffer.hasArray + 0 311403 4789112984293 <- java/nio/ByteBuffer.hasArray + 0 311403 4789112984299 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789112984305 -> java/nio/CharBuffer.array + 0 311403 4789112984312 <- java/nio/CharBuffer.array + 0 311403 4789112984318 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112984325 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112984331 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112984338 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112984344 -> java/nio/ByteBuffer.array + 0 311403 4789112984352 <- java/nio/ByteBuffer.array + 0 311403 4789112984358 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984365 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984371 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984378 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984384 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789112984391 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789112984397 -> java/nio/Buffer.position + 0 311403 4789112984404 <- java/nio/Buffer.position + 0 311403 4789112984410 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984417 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984423 -> java/nio/Buffer.position + 0 311403 4789112984430 <- java/nio/Buffer.position + 0 311403 4789112984437 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789112984444 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789112984450 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789112984457 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789112984463 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112984470 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112984477 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789112984483 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112984491 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789112984497 -> java/nio/Buffer.remaining + 0 311403 4789112984504 <- java/nio/Buffer.remaining + 0 311403 4789112984510 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789112984517 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789112984524 <- java/io/OutputStreamWriter.write + 0 311403 4789112984531 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789112984536 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789112984543 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789112984549 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789112984556 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789112984562 -> java/nio/Buffer.flip + 0 311403 4789112984569 <- java/nio/Buffer.flip + 0 311403 4789112984575 -> java/nio/ByteBuffer.array + 0 311403 4789112984582 <- java/nio/ByteBuffer.array + 0 311403 4789112984588 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984595 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789112984601 -> java/io/PrintStream.write + 0 311403 4789112984607 -> java/io/PrintStream.ensureOpen + 0 311403 4789112984615 <- java/io/PrintStream.ensureOpen + 0 311403 4789112984621 -> java/io/BufferedOutputStream.write + 0 311403 4789112984627 -> java/lang/System.arraycopy + 0 311403 4789112984635 <- java/lang/System.arraycopy + 0 311403 4789112984641 <- java/io/BufferedOutputStream.write + 0 311403 4789112984647 -> java/io/BufferedOutputStream.flush + 0 311403 4789112984654 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112984660 -> java/io/FileOutputStream.write + 0 311403 4789112984666 -> java/io/FileOutputStream.writeBytes + 0 311403 4789112984712 <- java/io/FileOutputStream.writeBytes + 0 311403 4789112984719 <- java/io/FileOutputStream.write + 0 311403 4789112984726 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112984733 <- java/io/BufferedOutputStream.flush + 0 311403 4789112984740 <- java/io/PrintStream.write + 0 311403 4789112984746 -> java/nio/Buffer.clear + 0 311403 4789112984753 <- java/nio/Buffer.clear + 0 311403 4789112984760 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789112984766 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789112984773 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789112984780 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789112984786 -> java/io/BufferedOutputStream.flush + 0 311403 4789112984792 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112984800 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789112984807 <- java/io/BufferedOutputStream.flush + 0 311403 4789112984813 <- java/io/PrintStream.newLine + 0 311403 4789112984820 <- java/io/PrintStream.println + 0 311403 4789112984835 -> java/lang/ClassLoader.loadClassInternal + 0 311403 4789112984842 -> java/lang/ClassLoader.loadClass + 0 311403 4789112984849 -> sun/misc/Launcher$AppClassLoader.loadClass + 0 311403 4789112984855 -> java/lang/String.lastIndexOf + 0 311403 4789112984862 -> java/lang/String.lastIndexOf + 0 311403 4789112984870 <- java/lang/String.lastIndexOf + 0 311403 4789112984877 <- java/lang/String.lastIndexOf + 0 311403 4789112984882 -> java/lang/System.getSecurityManager + 0 311403 4789112984890 <- java/lang/System.getSecurityManager + 0 311403 4789112984896 -> java/lang/ClassLoader.loadClass + 0 311403 4789112984902 -> java/lang/ClassLoader.findLoadedClass + 0 311403 4789112984908 -> java/lang/ClassLoader.check + 0 311403 4789112984915 <- java/lang/ClassLoader.check + 0 311403 4789112984921 -> java/lang/ClassLoader.checkName + 0 311403 4789112984927 -> java/lang/String.indexOf + 0 311403 4789112984934 -> java/lang/String.indexOf + 0 311403 4789112984942 <- java/lang/String.indexOf + 0 311403 4789112984948 <- java/lang/String.indexOf + 0 311403 4789112984954 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112984961 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112984967 -> java/lang/String.charAt + 0 311403 4789112984974 <- java/lang/String.charAt + 0 311403 4789112984981 <- java/lang/ClassLoader.checkName + 0 311403 4789112984987 -> java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112984998 <- java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112985005 <- java/lang/ClassLoader.findLoadedClass + 0 311403 4789112985011 -> java/lang/ClassLoader.loadClass + 0 311403 4789112985018 -> java/lang/ClassLoader.findLoadedClass + 0 311403 4789112985024 -> java/lang/ClassLoader.check + 0 311403 4789112985031 <- java/lang/ClassLoader.check + 0 311403 4789112985037 -> java/lang/ClassLoader.checkName + 0 311403 4789112985043 -> java/lang/String.indexOf + 0 311403 4789112985049 -> java/lang/String.indexOf + 0 311403 4789112985057 <- java/lang/String.indexOf + 0 311403 4789112985064 <- java/lang/String.indexOf + 0 311403 4789112985070 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112985077 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112985083 -> java/lang/String.charAt + 0 311403 4789112985090 <- java/lang/String.charAt + 0 311403 4789112985096 <- java/lang/ClassLoader.checkName + 0 311403 4789112985102 -> java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112985111 <- java/lang/ClassLoader.findLoadedClass0 + 0 311403 4789112985118 <- java/lang/ClassLoader.findLoadedClass + 0 311403 4789112985124 -> java/lang/ClassLoader.findBootstrapClass0 + 0 311403 4789112985130 -> java/lang/ClassLoader.check + 0 311403 4789112985138 <- java/lang/ClassLoader.check + 0 311403 4789112985143 -> java/lang/ClassLoader.checkName + 0 311403 4789112985150 -> java/lang/String.indexOf + 0 311403 4789112985156 -> java/lang/String.indexOf + 0 311403 4789112985164 <- java/lang/String.indexOf + 0 311403 4789112985170 <- java/lang/String.indexOf + 0 311403 4789112985176 -> sun/misc/VM.allowArraySyntax + 0 311403 4789112985183 <- sun/misc/VM.allowArraySyntax + 0 311403 4789112985189 -> java/lang/String.charAt + 0 311403 4789112985196 <- java/lang/String.charAt + 0 311403 4789112985203 <- java/lang/ClassLoader.checkName + 0 311403 4789112985208 -> java/lang/ClassLoader.findBootstrapClass + 0 311403 4789112985219 <- java/lang/ClassLoader.findBootstrapClass + 0 311403 4789112985226 <- java/lang/ClassLoader.findBootstrapClass0 + 0 311403 4789112985233 <- java/lang/ClassLoader.loadClass + 0 311403 4789112985240 <- java/lang/ClassLoader.loadClass + 0 311403 4789112985247 <- sun/misc/Launcher$AppClassLoader.loadClass + 0 311403 4789112985253 <- java/lang/ClassLoader.loadClass + 0 311403 4789112985260 <- java/lang/ClassLoader.loadClassInternal + 0 311403 4789112985270 -> java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112985277 -> java/lang/System.getSecurityManager + 0 311403 4789112985285 <- java/lang/System.getSecurityManager + 0 311403 4789112985291 -> java/util/HashSet.add + 0 311403 4789112985297 -> java/util/HashMap.put + 0 311403 4789112985304 -> java/lang/Object.hashCode + 0 311403 4789112985311 <- java/lang/Object.hashCode + 0 311403 4789112985317 -> java/util/HashMap.hash + 0 311403 4789112985324 <- java/util/HashMap.hash + 0 311403 4789112985330 -> java/util/HashMap.indexFor + 0 311403 4789112985337 <- java/util/HashMap.indexFor + 0 311403 4789112985344 <- java/util/HashMap.put + 0 311403 4789112985351 <- java/util/HashSet.add + 0 311403 4789112985358 <- java/lang/ClassLoader.checkPackageAccess + 0 311403 4789112985371 -> java/lang/Thread.currentThread + 0 311403 4789112985379 <- java/lang/Thread.currentThread + 0 311403 4789112985387 -> java/lang/Thread.sleep + 0 311403 4789113990048 <- java/lang/Thread.sleep + 0 311403 4789113990080 -> Func_abc.func_b + 0 311403 4789113990104 -> java/io/PrintStream.println + 0 311403 4789113990112 -> java/io/PrintStream.print + 0 311403 4789113990118 -> java/io/PrintStream.write + 0 311403 4789113990125 -> java/io/PrintStream.ensureOpen + 0 311403 4789113990133 <- java/io/PrintStream.ensureOpen + 0 311403 4789113990139 -> java/io/Writer.write + 0 311403 4789113990147 -> java/io/BufferedWriter.write + 0 311403 4789113990154 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789113990161 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789113990168 -> java/io/BufferedWriter.min + 0 311403 4789113990176 <- java/io/BufferedWriter.min + 0 311403 4789113990182 -> java/lang/String.getChars + 0 311403 4789113990189 -> java/lang/System.arraycopy + 0 311403 4789113990198 <- java/lang/System.arraycopy + 0 311403 4789113990205 <- java/lang/String.getChars + 0 311403 4789113990212 <- java/io/BufferedWriter.write + 0 311403 4789113990219 <- java/io/Writer.write + 0 311403 4789113990225 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789113990231 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789113990238 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789113990245 -> java/io/OutputStreamWriter.write + 0 311403 4789113990252 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789113990258 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789113990265 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789113990272 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789113990279 -> java/nio/CharBuffer.wrap + 0 311403 4789113990286 -> java/nio/HeapCharBuffer.<init> + 0 311403 4789113990293 -> java/nio/CharBuffer.<init> + 0 311403 4789113990299 -> java/nio/Buffer.<init> + 0 311403 4789113990306 -> java/lang/Object.<init> + 0 311403 4789113990313 <- java/lang/Object.<init> + 0 311403 4789113990320 -> java/nio/Buffer.limit + 0 311403 4789113990327 <- java/nio/Buffer.limit + 0 311403 4789113990333 -> java/nio/Buffer.position + 0 311403 4789113990340 <- java/nio/Buffer.position + 0 311403 4789113990347 <- java/nio/Buffer.<init> + 0 311403 4789113990354 <- java/nio/CharBuffer.<init> + 0 311403 4789113990360 <- java/nio/HeapCharBuffer.<init> + 0 311403 4789113990367 <- java/nio/CharBuffer.wrap + 0 311403 4789113990373 -> java/nio/Buffer.hasRemaining + 0 311403 4789113990381 <- java/nio/Buffer.hasRemaining + 0 311403 4789113990387 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789113990394 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789113990401 -> java/nio/CharBuffer.hasArray + 0 311403 4789113990409 <- java/nio/CharBuffer.hasArray + 0 311403 4789113990415 -> java/nio/ByteBuffer.hasArray + 0 311403 4789113990422 <- java/nio/ByteBuffer.hasArray + 0 311403 4789113990428 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789113990435 -> java/nio/CharBuffer.array + 0 311403 4789113990442 <- java/nio/CharBuffer.array + 0 311403 4789113990448 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113990455 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113990461 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113990468 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113990475 -> java/nio/ByteBuffer.array + 0 311403 4789113990482 <- java/nio/ByteBuffer.array + 0 311403 4789113990488 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990495 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990501 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990508 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990517 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113990524 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113990529 -> java/nio/Buffer.position + 0 311403 4789113990537 <- java/nio/Buffer.position + 0 311403 4789113990542 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990550 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990555 -> java/nio/Buffer.position + 0 311403 4789113990563 <- java/nio/Buffer.position + 0 311403 4789113990569 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789113990576 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789113990583 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789113990590 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789113990596 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113990603 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113990610 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789113990616 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113990624 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113990630 -> java/nio/Buffer.remaining + 0 311403 4789113990637 <- java/nio/Buffer.remaining + 0 311403 4789113990643 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789113990650 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789113990657 <- java/io/OutputStreamWriter.write + 0 311403 4789113990664 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789113990670 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789113990677 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789113990683 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789113990690 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789113990697 -> java/nio/Buffer.flip + 0 311403 4789113990704 <- java/nio/Buffer.flip + 0 311403 4789113990710 -> java/nio/ByteBuffer.array + 0 311403 4789113990717 <- java/nio/ByteBuffer.array + 0 311403 4789113990723 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990730 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113990736 -> java/io/PrintStream.write + 0 311403 4789113990742 -> java/io/PrintStream.ensureOpen + 0 311403 4789113990749 <- java/io/PrintStream.ensureOpen + 0 311403 4789113990756 -> java/io/BufferedOutputStream.write + 0 311403 4789113990763 -> java/lang/System.arraycopy + 0 311403 4789113990770 <- java/lang/System.arraycopy + 0 311403 4789113990777 <- java/io/BufferedOutputStream.write + 0 311403 4789113990783 -> java/io/BufferedOutputStream.flush + 0 311403 4789113990790 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113990797 -> java/io/FileOutputStream.write + 0 311403 4789113990803 -> java/io/FileOutputStream.writeBytes + 0 311403 4789113990841 <- java/io/FileOutputStream.writeBytes + 0 311403 4789113990848 <- java/io/FileOutputStream.write + 0 311403 4789113990855 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113990862 <- java/io/BufferedOutputStream.flush + 0 311403 4789113990869 <- java/io/PrintStream.write + 0 311403 4789113990875 -> java/nio/Buffer.clear + 0 311403 4789113990882 <- java/nio/Buffer.clear + 0 311403 4789113990888 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789113990895 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789113990902 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789113990909 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789113990915 -> java/lang/String.indexOf + 0 311403 4789113990922 -> java/lang/String.indexOf + 0 311403 4789113990930 <- java/lang/String.indexOf + 0 311403 4789113990936 <- java/lang/String.indexOf + 0 311403 4789113990943 <- java/io/PrintStream.write + 0 311403 4789113990950 <- java/io/PrintStream.print + 0 311403 4789113990956 -> java/io/PrintStream.newLine + 0 311403 4789113990962 -> java/io/PrintStream.ensureOpen + 0 311403 4789113990969 <- java/io/PrintStream.ensureOpen + 0 311403 4789113990975 -> java/io/BufferedWriter.newLine + 0 311403 4789113990981 -> java/io/Writer.write + 0 311403 4789113990988 -> java/io/BufferedWriter.write + 0 311403 4789113990994 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789113991001 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789113991007 -> java/io/BufferedWriter.min + 0 311403 4789113991014 <- java/io/BufferedWriter.min + 0 311403 4789113991020 -> java/lang/String.getChars + 0 311403 4789113991026 -> java/lang/System.arraycopy + 0 311403 4789113991034 <- java/lang/System.arraycopy + 0 311403 4789113991040 <- java/lang/String.getChars + 0 311403 4789113991047 <- java/io/BufferedWriter.write + 0 311403 4789113991054 <- java/io/Writer.write + 0 311403 4789113991060 <- java/io/BufferedWriter.newLine + 0 311403 4789113991066 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789113991072 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789113991080 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789113991086 -> java/io/OutputStreamWriter.write + 0 311403 4789113991092 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789113991098 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789113991106 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789113991112 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789113991118 -> java/nio/CharBuffer.wrap + 0 311403 4789113991124 -> java/nio/HeapCharBuffer.<init> + 0 311403 4789113991131 -> java/nio/CharBuffer.<init> + 0 311403 4789113991137 -> java/nio/Buffer.<init> + 0 311403 4789113991143 -> java/lang/Object.<init> + 0 311403 4789113991150 <- java/lang/Object.<init> + 0 311403 4789113991156 -> java/nio/Buffer.limit + 0 311403 4789113991163 <- java/nio/Buffer.limit + 0 311403 4789113991169 -> java/nio/Buffer.position + 0 311403 4789113991176 <- java/nio/Buffer.position + 0 311403 4789113991182 <- java/nio/Buffer.<init> + 0 311403 4789113991189 <- java/nio/CharBuffer.<init> + 0 311403 4789113991196 <- java/nio/HeapCharBuffer.<init> + 0 311403 4789113991202 <- java/nio/CharBuffer.wrap + 0 311403 4789113991208 -> java/nio/Buffer.hasRemaining + 0 311403 4789113991215 <- java/nio/Buffer.hasRemaining + 0 311403 4789113991221 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789113991281 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789113991287 -> java/nio/CharBuffer.hasArray + 0 311403 4789113991295 <- java/nio/CharBuffer.hasArray + 0 311403 4789113991301 -> java/nio/ByteBuffer.hasArray + 0 311403 4789113991308 <- java/nio/ByteBuffer.hasArray + 0 311403 4789113991314 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789113991320 -> java/nio/CharBuffer.array + 0 311403 4789113991328 <- java/nio/CharBuffer.array + 0 311403 4789113991333 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113991341 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113991347 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113991354 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113991360 -> java/nio/ByteBuffer.array + 0 311403 4789113991367 <- java/nio/ByteBuffer.array + 0 311403 4789113991373 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991380 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991386 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991393 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991400 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789113991407 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789113991413 -> java/nio/Buffer.position + 0 311403 4789113991420 <- java/nio/Buffer.position + 0 311403 4789113991426 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991433 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991439 -> java/nio/Buffer.position + 0 311403 4789113991446 <- java/nio/Buffer.position + 0 311403 4789113991453 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789113991459 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789113991465 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789113991473 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789113991479 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113991486 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113991493 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789113991499 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113991506 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789113991512 -> java/nio/Buffer.remaining + 0 311403 4789113991519 <- java/nio/Buffer.remaining + 0 311403 4789113991526 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789113991533 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789113991539 <- java/io/OutputStreamWriter.write + 0 311403 4789113991546 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789113991552 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789113991559 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789113991565 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789113991572 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789113991578 -> java/nio/Buffer.flip + 0 311403 4789113991585 <- java/nio/Buffer.flip + 0 311403 4789113991591 -> java/nio/ByteBuffer.array + 0 311403 4789113991598 <- java/nio/ByteBuffer.array + 0 311403 4789113991604 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991611 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789113991617 -> java/io/PrintStream.write + 0 311403 4789113991623 -> java/io/PrintStream.ensureOpen + 0 311403 4789113991630 <- java/io/PrintStream.ensureOpen + 0 311403 4789113991636 -> java/io/BufferedOutputStream.write + 0 311403 4789113991643 -> java/lang/System.arraycopy + 0 311403 4789113991651 <- java/lang/System.arraycopy + 0 311403 4789113991657 <- java/io/BufferedOutputStream.write + 0 311403 4789113991663 -> java/io/BufferedOutputStream.flush + 0 311403 4789113991670 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113991676 -> java/io/FileOutputStream.write + 0 311403 4789113991682 -> java/io/FileOutputStream.writeBytes + 0 311403 4789113991701 <- java/io/FileOutputStream.writeBytes + 0 311403 4789113991708 <- java/io/FileOutputStream.write + 0 311403 4789113991720 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113991728 <- java/io/BufferedOutputStream.flush + 0 311403 4789113991734 <- java/io/PrintStream.write + 0 311403 4789113991740 -> java/nio/Buffer.clear + 0 311403 4789113991747 <- java/nio/Buffer.clear + 0 311403 4789113991754 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789113991761 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789113991768 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789113991774 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789113991780 -> java/io/BufferedOutputStream.flush + 0 311403 4789113991787 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113991794 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789113991801 <- java/io/BufferedOutputStream.flush + 0 311403 4789113991808 <- java/io/PrintStream.newLine + 0 311403 4789113991815 <- java/io/PrintStream.println + 0 311403 4789113991821 -> java/lang/Thread.currentThread + 0 311403 4789113991828 <- java/lang/Thread.currentThread + 0 311403 4789113991834 -> java/lang/Thread.sleep + 0 311403 4789115000050 <- java/lang/Thread.sleep + 0 311403 4789115000081 -> Func_abc.func_c + 0 311403 4789115000105 -> java/io/PrintStream.println + 0 311403 4789115000113 -> java/io/PrintStream.print + 0 311403 4789115000120 -> java/io/PrintStream.write + 0 311403 4789115000126 -> java/io/PrintStream.ensureOpen + 0 311403 4789115000134 <- java/io/PrintStream.ensureOpen + 0 311403 4789115000141 -> java/io/Writer.write + 0 311403 4789115000148 -> java/io/BufferedWriter.write + 0 311403 4789115000155 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789115000162 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789115000170 -> java/io/BufferedWriter.min + 0 311403 4789115000177 <- java/io/BufferedWriter.min + 0 311403 4789115000183 -> java/lang/String.getChars + 0 311403 4789115000191 -> java/lang/System.arraycopy + 0 311403 4789115000199 <- java/lang/System.arraycopy + 0 311403 4789115000206 <- java/lang/String.getChars + 0 311403 4789115000213 <- java/io/BufferedWriter.write + 0 311403 4789115000220 <- java/io/Writer.write + 0 311403 4789115000226 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789115000233 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789115000240 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789115000246 -> java/io/OutputStreamWriter.write + 0 311403 4789115000253 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789115000260 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789115000267 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789115000274 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789115000281 -> java/nio/CharBuffer.wrap + 0 311403 4789115000288 -> java/nio/HeapCharBuffer.<init> + 0 311403 4789115000294 -> java/nio/CharBuffer.<init> + 0 311403 4789115000301 -> java/nio/Buffer.<init> + 0 311403 4789115000307 -> java/lang/Object.<init> + 0 311403 4789115000315 <- java/lang/Object.<init> + 0 311403 4789115000321 -> java/nio/Buffer.limit + 0 311403 4789115000328 <- java/nio/Buffer.limit + 0 311403 4789115000334 -> java/nio/Buffer.position + 0 311403 4789115000342 <- java/nio/Buffer.position + 0 311403 4789115000348 <- java/nio/Buffer.<init> + 0 311403 4789115000355 <- java/nio/CharBuffer.<init> + 0 311403 4789115000362 <- java/nio/HeapCharBuffer.<init> + 0 311403 4789115000368 <- java/nio/CharBuffer.wrap + 0 311403 4789115000374 -> java/nio/Buffer.hasRemaining + 0 311403 4789115000382 <- java/nio/Buffer.hasRemaining + 0 311403 4789115000388 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789115000396 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789115000402 -> java/nio/CharBuffer.hasArray + 0 311403 4789115000410 <- java/nio/CharBuffer.hasArray + 0 311403 4789115000416 -> java/nio/ByteBuffer.hasArray + 0 311403 4789115000424 <- java/nio/ByteBuffer.hasArray + 0 311403 4789115000430 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789115000436 -> java/nio/CharBuffer.array + 0 311403 4789115000444 <- java/nio/CharBuffer.array + 0 311403 4789115000450 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115000457 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115000463 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115000470 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115000476 -> java/nio/ByteBuffer.array + 0 311403 4789115000483 <- java/nio/ByteBuffer.array + 0 311403 4789115000489 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000496 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000502 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000509 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000518 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115000525 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115000531 -> java/nio/Buffer.position + 0 311403 4789115000538 <- java/nio/Buffer.position + 0 311403 4789115000544 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000551 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000557 -> java/nio/Buffer.position + 0 311403 4789115000564 <- java/nio/Buffer.position + 0 311403 4789115000570 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789115000577 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789115000584 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789115000591 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789115000597 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115000605 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115000611 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789115000617 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115000625 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115000631 -> java/nio/Buffer.remaining + 0 311403 4789115000638 <- java/nio/Buffer.remaining + 0 311403 4789115000645 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789115000652 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789115000658 <- java/io/OutputStreamWriter.write + 0 311403 4789115000665 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789115000671 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789115000678 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789115000685 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789115000692 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789115000698 -> java/nio/Buffer.flip + 0 311403 4789115000705 <- java/nio/Buffer.flip + 0 311403 4789115000711 -> java/nio/ByteBuffer.array + 0 311403 4789115000718 <- java/nio/ByteBuffer.array + 0 311403 4789115000724 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000731 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115000738 -> java/io/PrintStream.write + 0 311403 4789115000744 -> java/io/PrintStream.ensureOpen + 0 311403 4789115000751 <- java/io/PrintStream.ensureOpen + 0 311403 4789115000758 -> java/io/BufferedOutputStream.write + 0 311403 4789115000764 -> java/lang/System.arraycopy + 0 311403 4789115000772 <- java/lang/System.arraycopy + 0 311403 4789115000778 <- java/io/BufferedOutputStream.write + 0 311403 4789115000785 -> java/io/BufferedOutputStream.flush + 0 311403 4789115000791 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115000798 -> java/io/FileOutputStream.write + 0 311403 4789115000805 -> java/io/FileOutputStream.writeBytes + 0 311403 4789115000843 <- java/io/FileOutputStream.writeBytes + 0 311403 4789115000850 <- java/io/FileOutputStream.write + 0 311403 4789115000857 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115000864 <- java/io/BufferedOutputStream.flush + 0 311403 4789115000871 <- java/io/PrintStream.write + 0 311403 4789115000877 -> java/nio/Buffer.clear + 0 311403 4789115000884 <- java/nio/Buffer.clear + 0 311403 4789115000891 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789115000897 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789115000904 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789115000911 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789115000917 -> java/lang/String.indexOf + 0 311403 4789115000924 -> java/lang/String.indexOf + 0 311403 4789115000932 <- java/lang/String.indexOf + 0 311403 4789115000939 <- java/lang/String.indexOf + 0 311403 4789115000945 <- java/io/PrintStream.write + 0 311403 4789115000952 <- java/io/PrintStream.print + 0 311403 4789115000958 -> java/io/PrintStream.newLine + 0 311403 4789115000964 -> java/io/PrintStream.ensureOpen + 0 311403 4789115000971 <- java/io/PrintStream.ensureOpen + 0 311403 4789115000977 -> java/io/BufferedWriter.newLine + 0 311403 4789115000983 -> java/io/Writer.write + 0 311403 4789115000990 -> java/io/BufferedWriter.write + 0 311403 4789115000996 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789115001003 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789115001009 -> java/io/BufferedWriter.min + 0 311403 4789115001016 <- java/io/BufferedWriter.min + 0 311403 4789115001022 -> java/lang/String.getChars + 0 311403 4789115001029 -> java/lang/System.arraycopy + 0 311403 4789115001036 <- java/lang/System.arraycopy + 0 311403 4789115001042 <- java/lang/String.getChars + 0 311403 4789115001049 <- java/io/BufferedWriter.write + 0 311403 4789115001056 <- java/io/Writer.write + 0 311403 4789115001062 <- java/io/BufferedWriter.newLine + 0 311403 4789115001068 -> java/io/BufferedWriter.flushBuffer + 0 311403 4789115001075 -> java/io/BufferedWriter.ensureOpen + 0 311403 4789115001082 <- java/io/BufferedWriter.ensureOpen + 0 311403 4789115001088 -> java/io/OutputStreamWriter.write + 0 311403 4789115001094 -> sun/nio/cs/StreamEncoder.write + 0 311403 4789115001101 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789115001108 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311403 4789115001114 -> sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789115001120 -> java/nio/CharBuffer.wrap + 0 311403 4789115001127 -> java/nio/HeapCharBuffer.<init> + 0 311403 4789115001133 -> java/nio/CharBuffer.<init> + 0 311403 4789115001139 -> java/nio/Buffer.<init> + 0 311403 4789115001145 -> java/lang/Object.<init> + 0 311403 4789115001152 <- java/lang/Object.<init> + 0 311403 4789115001158 -> java/nio/Buffer.limit + 0 311403 4789115001165 <- java/nio/Buffer.limit + 0 311403 4789115001171 -> java/nio/Buffer.position + 0 311403 4789115001178 <- java/nio/Buffer.position + 0 311403 4789115001185 <- java/nio/Buffer.<init> + 0 311403 4789115001191 <- java/nio/CharBuffer.<init> + 0 311403 4789115001198 <- java/nio/HeapCharBuffer.<init> + 0 311403 4789115001204 <- java/nio/CharBuffer.wrap + 0 311403 4789115001210 -> java/nio/Buffer.hasRemaining + 0 311403 4789115001217 <- java/nio/Buffer.hasRemaining + 0 311403 4789115001223 -> java/nio/charset/CharsetEncoder.encode + 0 311403 4789115001230 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789115001236 -> java/nio/CharBuffer.hasArray + 0 311403 4789115001243 <- java/nio/CharBuffer.hasArray + 0 311403 4789115001249 -> java/nio/ByteBuffer.hasArray + 0 311403 4789115001256 <- java/nio/ByteBuffer.hasArray + 0 311403 4789115001262 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789115001269 -> java/nio/CharBuffer.array + 0 311403 4789115001276 <- java/nio/CharBuffer.array + 0 311403 4789115001281 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115001288 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115001294 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115001302 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115001308 -> java/nio/ByteBuffer.array + 0 311403 4789115001315 <- java/nio/ByteBuffer.array + 0 311403 4789115001320 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001328 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001334 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001341 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001347 -> java/nio/CharBuffer.arrayOffset + 0 311403 4789115001354 <- java/nio/CharBuffer.arrayOffset + 0 311403 4789115001360 -> java/nio/Buffer.position + 0 311403 4789115001367 <- java/nio/Buffer.position + 0 311403 4789115001373 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001380 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001386 -> java/nio/Buffer.position + 0 311403 4789115001393 <- java/nio/Buffer.position + 0 311403 4789115001400 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311403 4789115001407 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311403 4789115001413 -> java/nio/charset/CoderResult.isOverflow + 0 311403 4789115001420 <- java/nio/charset/CoderResult.isOverflow + 0 311403 4789115001426 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115001433 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115001440 <- java/nio/charset/CharsetEncoder.encode + 0 311403 4789115001446 -> java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115001453 <- java/nio/charset/CoderResult.isUnderflow + 0 311403 4789115001459 -> java/nio/Buffer.remaining + 0 311403 4789115001466 <- java/nio/Buffer.remaining + 0 311403 4789115001473 <- sun/nio/cs/StreamEncoder.implWrite + 0 311403 4789115001480 <- sun/nio/cs/StreamEncoder.write + 0 311403 4789115001487 <- java/io/OutputStreamWriter.write + 0 311403 4789115001493 <- java/io/BufferedWriter.flushBuffer + 0 311403 4789115001499 -> java/io/OutputStreamWriter.flushBuffer + 0 311403 4789115001506 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789115001512 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789115001519 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789115001525 -> java/nio/Buffer.flip + 0 311403 4789115001532 <- java/nio/Buffer.flip + 0 311403 4789115001538 -> java/nio/ByteBuffer.array + 0 311403 4789115001545 <- java/nio/ByteBuffer.array + 0 311403 4789115001551 -> java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001558 <- java/nio/ByteBuffer.arrayOffset + 0 311403 4789115001564 -> java/io/PrintStream.write + 0 311403 4789115001570 -> java/io/PrintStream.ensureOpen + 0 311403 4789115001577 <- java/io/PrintStream.ensureOpen + 0 311403 4789115001583 -> java/io/BufferedOutputStream.write + 0 311403 4789115001590 -> java/lang/System.arraycopy + 0 311403 4789115001597 <- java/lang/System.arraycopy + 0 311403 4789115001604 <- java/io/BufferedOutputStream.write + 0 311403 4789115001610 -> java/io/BufferedOutputStream.flush + 0 311403 4789115001621 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115001628 -> java/io/FileOutputStream.write + 0 311403 4789115001634 -> java/io/FileOutputStream.writeBytes + 0 311403 4789115001652 <- java/io/FileOutputStream.writeBytes + 0 311403 4789115001706 <- java/io/FileOutputStream.write + 0 311403 4789115001713 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115001720 <- java/io/BufferedOutputStream.flush + 0 311403 4789115001727 <- java/io/PrintStream.write + 0 311403 4789115001733 -> java/nio/Buffer.clear + 0 311403 4789115001740 <- java/nio/Buffer.clear + 0 311403 4789115001747 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311403 4789115001753 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311403 4789115001760 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311403 4789115001767 <- java/io/OutputStreamWriter.flushBuffer + 0 311403 4789115001773 -> java/io/BufferedOutputStream.flush + 0 311403 4789115001779 -> java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115001787 <- java/io/BufferedOutputStream.flushBuffer + 0 311403 4789115001794 <- java/io/BufferedOutputStream.flush + 0 311403 4789115001801 <- java/io/PrintStream.newLine + 0 311403 4789115001807 <- java/io/PrintStream.println + 0 311403 4789115001813 -> java/lang/Thread.currentThread + 0 311403 4789115001821 <- java/lang/Thread.currentThread + 0 311403 4789115001827 -> java/lang/Thread.sleep + 0 311403 4789116010060 <- java/lang/Thread.sleep + 0 311403 4789116010073 <- Func_abc.func_c + 0 311403 4789116010080 <- Func_abc.func_b + 0 311403 4789116010086 <- Func_abc.func_a + 0 311403 4789116010093 <- Func_abc.main + 0 311403 4789116010118 -> java/lang/Thread.exit + 0 311403 4789116010145 -> java/lang/ThreadGroup.remove + 0 311403 4789116010160 -> java/lang/System.arraycopy + 0 311403 4789116010169 <- java/lang/System.arraycopy + 0 311403 4789116010178 -> java/lang/Object.notifyAll + 0 311403 4789116010192 <- java/lang/Object.notifyAll + 0 311403 4789116010199 <- java/lang/ThreadGroup.remove + 0 311403 4789116010212 <- java/lang/Thread.exit + 0 311403 4789116010380 -> java/lang/Thread.<init> + 0 311403 4789116010388 -> java/lang/Object.<init> + 0 311403 4789116010395 <- java/lang/Object.<init> + 0 311403 4789116010402 -> java/lang/Object.<init> + 0 311403 4789116010409 <- java/lang/Object.<init> + 0 311403 4789116010415 -> java/lang/Thread.init + 0 311403 4789116010422 -> java/lang/Thread.currentThread + 0 311403 4789116010430 <- java/lang/Thread.currentThread + 0 311403 4789116010436 -> java/lang/System.getSecurityManager + 0 311403 4789116010444 <- java/lang/System.getSecurityManager + 0 311403 4789116010450 -> java/lang/ThreadGroup.checkAccess + 0 311403 4789116010457 -> java/lang/System.getSecurityManager + 0 311403 4789116010464 <- java/lang/System.getSecurityManager + 0 311403 4789116010471 <- java/lang/ThreadGroup.checkAccess + 0 311403 4789116010477 -> java/lang/ThreadGroup.addUnstarted + 0 311403 4789116010484 <- java/lang/ThreadGroup.addUnstarted + 0 311403 4789116010491 -> java/lang/String.toCharArray + 0 311403 4789116010499 -> java/lang/String.getChars + 0 311403 4789116010506 -> java/lang/System.arraycopy + 0 311403 4789116010514 <- java/lang/System.arraycopy + 0 311403 4789116010521 <- java/lang/String.getChars + 0 311403 4789116010527 <- java/lang/String.toCharArray + 0 311403 4789116010534 -> java/lang/Thread.getContextClassLoader + 0 311403 4789116010541 <- java/lang/Thread.getContextClassLoader + 0 311403 4789116010548 -> java/security/AccessController.getContext + 0 311403 4789116010554 -> java/security/AccessController.getStackAccessControlContext + 0 311403 4789116010569 <- java/security/AccessController.getStackAccessControlContext + 0 311403 4789116010576 -> java/security/AccessControlContext.optimize + 0 311403 4789116010583 -> java/security/AccessController.getInheritedAccessControlContext + 0 311403 4789116010591 <- java/security/AccessController.getInheritedAccessControlContext + 0 311403 4789116010599 <- java/security/AccessControlContext.optimize + 0 311403 4789116010606 <- java/security/AccessController.getContext + 0 311403 4789116010612 -> java/lang/Thread.setPriority + 0 311403 4789116010618 -> java/lang/Thread.checkAccess + 0 311403 4789116010625 -> java/lang/System.getSecurityManager + 0 311403 4789116010632 <- java/lang/System.getSecurityManager + 0 311403 4789116010639 <- java/lang/Thread.checkAccess + 0 311403 4789116010645 -> java/lang/Thread.setPriority0 + 0 311403 4789116010664 <- java/lang/Thread.setPriority0 + 0 311403 4789116010671 <- java/lang/Thread.setPriority + 0 311403 4789116010678 -> java/lang/Thread.nextThreadID + 0 311403 4789116010686 <- java/lang/Thread.nextThreadID + 0 311403 4789116010693 <- java/lang/Thread.init + 0 311403 4789116010700 <- java/lang/Thread.<init> + 0 311403 4789116010707 -> java/lang/ThreadGroup.add + 0 311403 4789116010716 <- java/lang/ThreadGroup.add + 0 311403 4789116010729 -> java/lang/Shutdown.shutdown + 0 311403 4789116010740 -> java/lang/Shutdown.sequence + 0 311403 4789116010748 -> java/lang/Shutdown.runHooks + 0 311403 4789116010758 -> java/util/AbstractList.iterator + 0 311403 4789116011022 -> java/util/AbstractList$Itr.<init> + 0 311403 4789116011032 -> java/util/AbstractList$Itr.<init> + 0 311403 4789116011042 -> java/lang/Object.<init> + 0 311403 4789116011050 <- java/lang/Object.<init> + 0 311403 4789116011062 <- java/util/AbstractList$Itr.<init> + 0 311403 4789116011069 <- java/util/AbstractList$Itr.<init> + 0 311403 4789116011076 <- java/util/AbstractList.iterator + 0 311403 4789116011087 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116011099 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116011107 -> java/util/AbstractList$Itr.next + 0 311403 4789116011115 -> java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116011123 <- java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116011131 -> java/util/ArrayList.get + 0 311403 4789116011138 -> java/util/ArrayList.RangeCheck + 0 311403 4789116011145 <- java/util/ArrayList.RangeCheck + 0 311403 4789116011152 <- java/util/ArrayList.get + 0 311403 4789116011159 <- java/util/AbstractList$Itr.next + 0 311403 4789116011170 -> java/io/Console$1$1.run + 0 311403 4789116011180 -> java/io/Console.access$600 + 0 311403 4789116011189 <- java/io/Console.access$600 + 0 311403 4789116011196 <- java/io/Console$1$1.run + 0 311403 4789116011202 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116011209 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116011215 -> java/util/AbstractList$Itr.next + 0 311403 4789116011221 -> java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116011229 <- java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116011235 -> java/util/ArrayList.get + 0 311403 4789116011241 -> java/util/ArrayList.RangeCheck + 0 311403 4789116011248 <- java/util/ArrayList.RangeCheck + 0 311403 4789116011255 <- java/util/ArrayList.get + 0 311403 4789116011262 <- java/util/AbstractList$Itr.next + 0 311403 4789116011268 -> java/lang/ApplicationShutdownHooks.run + 0 311403 4789116011280 -> java/util/IdentityHashMap.keySet + 0 311403 4789116011442 -> java/util/IdentityHashMap$KeySet.<init> + 0 311403 4789116011452 -> java/util/IdentityHashMap$KeySet.<init> + 0 311403 4789116011462 -> java/util/AbstractSet.<init> + 0 311403 4789116011469 -> java/util/AbstractCollection.<init> + 0 311403 4789116011475 -> java/lang/Object.<init> + 0 311403 4789116011483 <- java/lang/Object.<init> + 0 311403 4789116011490 <- java/util/AbstractCollection.<init> + 0 311403 4789116011497 <- java/util/AbstractSet.<init> + 0 311403 4789116011503 <- java/util/IdentityHashMap$KeySet.<init> + 0 311403 4789116011510 <- java/util/IdentityHashMap$KeySet.<init> + 0 311403 4789116011528 <- java/util/IdentityHashMap.keySet + 0 311403 4789116011538 -> java/util/IdentityHashMap$KeySet.iterator + 0 311403 4789116011727 -> java/util/IdentityHashMap$KeyIterator.<init> + 0 311403 4789116011737 -> java/util/IdentityHashMap$KeyIterator.<init> + 0 311403 4789116011748 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311403 4789116011757 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311403 4789116011766 -> java/lang/Object.<init> + 0 311403 4789116011774 <- java/lang/Object.<init> + 0 311403 4789116011784 -> java/util/IdentityHashMap.access$000 + 0 311403 4789116011793 <- java/util/IdentityHashMap.access$000 + 0 311403 4789116011803 -> java/util/IdentityHashMap.access$200 + 0 311403 4789116011811 <- java/util/IdentityHashMap.access$200 + 0 311403 4789116011821 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311403 4789116011828 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311403 4789116011835 <- java/util/IdentityHashMap$KeyIterator.<init> + 0 311403 4789116011842 <- java/util/IdentityHashMap$KeyIterator.<init> + 0 311403 4789116011849 <- java/util/IdentityHashMap$KeySet.iterator + 0 311403 4789116011858 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311403 4789116011866 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311403 4789116011873 -> java/util/IdentityHashMap$KeySet.iterator + 0 311403 4789116011879 -> java/util/IdentityHashMap$KeyIterator.<init> + 0 311403 4789116011886 -> java/util/IdentityHashMap$KeyIterator.<init> + 0 311403 4789116011892 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311403 4789116011899 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311403 4789116011905 -> java/lang/Object.<init> + 0 311403 4789116011912 <- java/lang/Object.<init> + 0 311403 4789116011919 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311403 4789116011926 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311403 4789116011934 <- java/util/IdentityHashMap$KeyIterator.<init> + 0 311403 4789116011940 <- java/util/IdentityHashMap$KeyIterator.<init> + 0 311403 4789116011947 <- java/util/IdentityHashMap$KeySet.iterator + 0 311403 4789116011953 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311403 4789116011961 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311403 4789116011968 <- java/lang/ApplicationShutdownHooks.run + 0 311403 4789116011974 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116011982 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116011988 -> java/util/AbstractList$Itr.next + 0 311403 4789116011994 -> java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116012002 <- java/util/AbstractList$Itr.checkForComodification + 0 311403 4789116012008 -> java/util/ArrayList.get + 0 311403 4789116012014 -> java/util/ArrayList.RangeCheck + 0 311403 4789116012021 <- java/util/ArrayList.RangeCheck + 0 311403 4789116012028 <- java/util/ArrayList.get + 0 311403 4789116012035 <- java/util/AbstractList$Itr.next + 0 311403 4789116012041 -> java/io/File$1.run + 0 311403 4789116012187 -> java/io/DeleteOnExitHook.<clinit> + 0 311403 4789116012333 -> java/util/LinkedHashSet.<init> + 0 311403 4789116012343 -> java/util/HashSet.<init> + 0 311403 4789116012350 -> java/util/AbstractSet.<init> + 0 311403 4789116012356 -> java/util/AbstractCollection.<init> + 0 311403 4789116012362 -> java/lang/Object.<init> + 0 311403 4789116012370 <- java/lang/Object.<init> + 0 311403 4789116012377 <- java/util/AbstractCollection.<init> + 0 311403 4789116012384 <- java/util/AbstractSet.<init> + 0 311403 4789116012394 -> java/util/LinkedHashMap.<init> + 0 311403 4789116012404 -> java/util/HashMap.<init> + 0 311403 4789116012410 -> java/util/AbstractMap.<init> + 0 311403 4789116012417 -> java/lang/Object.<init> + 0 311403 4789116012424 <- java/lang/Object.<init> + 0 311403 4789116012431 <- java/util/AbstractMap.<init> + 0 311403 4789116012438 -> java/lang/Float.isNaN + 0 311403 4789116012445 <- java/lang/Float.isNaN + 0 311403 4789116012456 -> java/util/LinkedHashMap.init + 0 311403 4789116012463 -> java/util/LinkedHashMap$Entry.<init> + 0 311403 4789116012469 -> java/util/HashMap$Entry.<init> + 0 311403 4789116012476 -> java/lang/Object.<init> + 0 311403 4789116012482 <- java/lang/Object.<init> + 0 311403 4789116012489 <- java/util/HashMap$Entry.<init> + 0 311403 4789116012496 <- java/util/LinkedHashMap$Entry.<init> + 0 311403 4789116012503 <- java/util/LinkedHashMap.init + 0 311403 4789116012510 <- java/util/HashMap.<init> + 0 311403 4789116012516 <- java/util/LinkedHashMap.<init> + 0 311403 4789116012523 <- java/util/HashSet.<init> + 0 311403 4789116012529 <- java/util/LinkedHashSet.<init> + 0 311403 4789116012538 <- java/io/DeleteOnExitHook.<clinit> + 0 311403 4789116012547 -> java/io/DeleteOnExitHook.hook + 0 311403 4789116012556 -> java/io/DeleteOnExitHook.<init> + 0 311403 4789116012565 -> java/lang/Object.<init> + 0 311403 4789116012572 <- java/lang/Object.<init> + 0 311403 4789116012579 <- java/io/DeleteOnExitHook.<init> + 0 311403 4789116012586 <- java/io/DeleteOnExitHook.hook + 0 311403 4789116012594 -> java/io/DeleteOnExitHook.run + 0 311403 4789116012605 -> java/util/ArrayList.<init> + 0 311403 4789116012612 -> java/util/AbstractList.<init> + 0 311403 4789116012618 -> java/util/AbstractCollection.<init> + 0 311403 4789116012624 -> java/lang/Object.<init> + 0 311403 4789116012631 <- java/lang/Object.<init> + 0 311403 4789116012638 <- java/util/AbstractCollection.<init> + 0 311403 4789116012645 <- java/util/AbstractList.<init> + 0 311403 4789116012654 -> java/util/AbstractCollection.toArray + 0 311403 4789116012664 -> java/util/HashSet.size + 0 311403 4789116012674 <- java/util/HashSet.size + 0 311403 4789116012682 -> java/util/HashSet.iterator + 0 311403 4789116012691 -> java/util/HashMap.keySet + 0 311403 4789116012782 -> java/util/HashMap$KeySet.<init> + 0 311403 4789116012791 -> java/util/HashMap$KeySet.<init> + 0 311403 4789116012801 -> java/util/AbstractSet.<init> + 0 311403 4789116012807 -> java/util/AbstractCollection.<init> + 0 311403 4789116012814 -> java/lang/Object.<init> + 0 311403 4789116012821 <- java/lang/Object.<init> + 0 311403 4789116012828 <- java/util/AbstractCollection.<init> + 0 311403 4789116012835 <- java/util/AbstractSet.<init> + 0 311403 4789116012841 <- java/util/HashMap$KeySet.<init> + 0 311403 4789116012848 <- java/util/HashMap$KeySet.<init> + 0 311403 4789116012855 <- java/util/HashMap.keySet + 0 311403 4789116012864 -> java/util/HashMap$KeySet.iterator + 0 311403 4789116012874 -> java/util/LinkedHashMap.newKeyIterator + 0 311403 4789116013056 -> java/util/LinkedHashMap$KeyIterator.<init> + 0 311403 4789116013066 -> java/util/LinkedHashMap$KeyIterator.<init> + 0 311403 4789116013076 -> java/util/LinkedHashMap$LinkedHashIterator.<init> + 0 311403 4789116013085 -> java/util/LinkedHashMap$LinkedHashIterator.<init> + 0 311403 4789116013095 -> java/lang/Object.<init> + 0 311403 4789116013102 <- java/lang/Object.<init> + 0 311403 4789116013117 <- java/util/LinkedHashMap$LinkedHashIterator.<init> + 0 311403 4789116013125 <- java/util/LinkedHashMap$LinkedHashIterator.<init> + 0 311403 4789116013132 <- java/util/LinkedHashMap$KeyIterator.<init> + 0 311403 4789116013138 <- java/util/LinkedHashMap$KeyIterator.<init> + 0 311403 4789116013145 <- java/util/LinkedHashMap.newKeyIterator + 0 311403 4789116013152 <- java/util/HashMap$KeySet.iterator + 0 311403 4789116013159 <- java/util/HashSet.iterator + 0 311403 4789116013168 -> java/util/LinkedHashMap$LinkedHashIterator.hasNext + 0 311403 4789116013176 <- java/util/LinkedHashMap$LinkedHashIterator.hasNext + 0 311403 4789116013183 <- java/util/AbstractCollection.toArray + 0 311403 4789116013190 -> java/lang/Object.getClass + 0 311403 4789116013198 <- java/lang/Object.getClass + 0 311403 4789116013206 <- java/util/ArrayList.<init> + 0 311403 4789116013216 -> java/util/Collections.reverse + 0 311403 4789116013228 <- java/util/Collections.reverse + 0 311403 4789116013236 -> java/util/AbstractList.iterator + 0 311403 4789116013243 -> java/util/AbstractList$Itr.<init> + 0 311403 4789116013250 -> java/util/AbstractList$Itr.<init> + 0 311403 4789116013256 -> java/lang/Object.<init> + 0 311403 4789116013263 <- java/lang/Object.<init> + 0 311403 4789116013270 <- java/util/AbstractList$Itr.<init> + 0 311403 4789116013276 <- java/util/AbstractList$Itr.<init> + 0 311403 4789116013283 <- java/util/AbstractList.iterator + 0 311403 4789116013292 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116013299 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116013306 <- java/io/DeleteOnExitHook.run + 0 311403 4789116013313 <- java/io/File$1.run + 0 311403 4789116013319 -> java/util/AbstractList$Itr.hasNext + 0 311403 4789116013326 <- java/util/AbstractList$Itr.hasNext + 0 311403 4789116013333 <- java/lang/Shutdown.runHooks + 0 311403 4789116013342 <- java/lang/Shutdown.sequence + 0 311403 4789116013349 <- java/lang/Shutdown.shutdown + +The fourth column is indented by 2 spaces to show when a new method begins. +This shows what is calling what. + +The TIME(us) column shows time from boot in microseconds. + +If the output looks strange, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + +I truncated the above output by 22800 lines so that it would fit. To make +sense of the output, try searching for "Func_abc" or using grep. The +lines were, + + 0 311403 4789112982182 -> Func_abc.main + 0 311403 4789112982193 -> Func_abc.func_a + 0 311403 4789113990080 -> Func_abc.func_b + 0 311403 4789115000081 -> Func_abc.func_c + 0 311403 4789116010073 <- Func_abc.func_c + 0 311403 4789116010080 <- Func_abc.func_b + 0 311403 4789116010086 <- Func_abc.func_a + 0 311403 4789116010093 <- Func_abc.main + +You can also use the j_classflow.d script to only trace one class. + +If you see "drops" warnings, see the Notes/ALLjava_notes.txt file for details. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_flowtime_example.txt new file mode 100644 index 000000000000..22c6a612f873 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_flowtime_example.txt @@ -0,0 +1,1287 @@ +The following are examples of j_flowtime.d. + +This is a simple script to trace the timing and the not-so-simple flow of +Java methods and classes. Here it traces the example program, +Code/Java/func_abc + +# j_flowtime.d + C PID/TID TIME(us) DELTA(us) -- CLASS.METHOD + 0 311481/2 4790256870903 2 -> java/lang/Object.<clinit> + 0 311481/2 4790256870950 46 -> java/lang/Object.registerNatives + 0 311481/2 4790256871090 140 <- java/lang/Object.registerNatives + 0 311481/2 4790256871109 18 <- java/lang/Object.<clinit> + 0 311481/2 4790256871121 12 -> java/lang/String.<clinit> + 0 311481/2 4790256871518 397 -> java/lang/String$CaseInsensitiveComparator.<init> + 0 311481/2 4790256871531 12 -> java/lang/String$CaseInsensitiveComparator.<init> + 0 311481/2 4790256871541 10 -> java/lang/Object.<init> + 0 311481/2 4790256871549 7 <- java/lang/Object.<init> + 0 311481/2 4790256871558 8 <- java/lang/String$CaseInsensitiveComparator.<init> + 0 311481/2 4790256871566 7 <- java/lang/String$CaseInsensitiveComparator.<init> + 0 311481/2 4790256871575 9 <- java/lang/String.<clinit> + 0 311481/2 4790256871644 68 -> java/lang/System.<clinit> + 0 311481/2 4790256871656 11 -> java/lang/System.registerNatives + 0 311481/2 4790256871675 18 <- java/lang/System.registerNatives + 0 311481/2 4790256871686 10 -> java/lang/System.nullInputStream + 0 311481/2 4790256871695 9 -> java/lang/System.currentTimeMillis + 0 311481/2 4790256871705 10 <- java/lang/System.currentTimeMillis + 0 311481/2 4790256871714 8 <- java/lang/System.nullInputStream + 0 311481/2 4790256871726 11 -> java/lang/System.nullPrintStream + 0 311481/2 4790256871734 7 -> java/lang/System.currentTimeMillis + 0 311481/2 4790256871741 7 <- java/lang/System.currentTimeMillis + 0 311481/2 4790256871749 7 <- java/lang/System.nullPrintStream + 0 311481/2 4790256871758 9 -> java/lang/System.nullPrintStream + 0 311481/2 4790256871766 7 -> java/lang/System.currentTimeMillis + 0 311481/2 4790256871773 7 <- java/lang/System.currentTimeMillis + 0 311481/2 4790256871781 7 <- java/lang/System.nullPrintStream + 0 311481/2 4790256871792 10 <- java/lang/System.<clinit> + 0 311481/2 4790256871870 78 -> java/lang/ThreadGroup.<init> + 0 311481/2 4790256871881 10 -> java/lang/Object.<init> + 0 311481/2 4790256871889 7 <- java/lang/Object.<init> + 0 311481/2 4790256871906 17 <- java/lang/ThreadGroup.<init> + 0 311481/2 4790256871918 11 -> java/lang/ThreadGroup.<init> + 0 311481/2 4790256871926 7 -> java/lang/Object.<init> + 0 311481/2 4790256871933 7 <- java/lang/Object.<init> + 0 311481/2 4790256871945 12 -> java/lang/ThreadGroup.checkAccess + 0 311481/2 4790256871955 10 -> java/lang/System.getSecurityManager + 0 311481/2 4790256871964 8 <- java/lang/System.getSecurityManager + 0 311481/2 4790256871972 8 <- java/lang/ThreadGroup.checkAccess + 0 311481/2 4790256871984 12 -> java/lang/ThreadGroup.add + 0 311481/2 4790256872006 21 <- java/lang/ThreadGroup.add + 0 311481/2 4790256872014 8 <- java/lang/ThreadGroup.<init> + 0 311481/2 4790256872201 187 -> java/lang/Thread.<clinit> + 0 311481/2 4790256872213 12 -> java/lang/Thread.registerNatives + 0 311481/2 4790256872239 25 <- java/lang/Thread.registerNatives + 0 311481/2 4790256872606 367 -> java/lang/RuntimePermission.<init> + 0 311481/2 4790256872618 11 -> java/security/BasicPermission.<init> + 0 311481/2 4790256872628 9 -> java/security/Permission.<init> + 0 311481/2 4790256872637 9 -> java/lang/Object.<init> + 0 311481/2 4790256872645 7 <- java/lang/Object.<init> + 0 311481/2 4790256872656 10 <- java/security/Permission.<init> + 0 311481/2 4790256872666 10 -> java/security/BasicPermission.init + 0 311481/2 4790256872677 11 -> java/lang/String.length + 0 311481/2 4790256872686 8 <- java/lang/String.length + 0 311481/2 4790256872697 11 -> java/lang/String.charAt + 0 311481/2 4790256872707 10 <- java/lang/String.charAt + 0 311481/2 4790256872720 12 -> java/lang/String.equals + 0 311481/2 4790256872728 8 <- java/lang/String.equals + 0 311481/2 4790256872737 9 <- java/security/BasicPermission.init + 0 311481/2 4790256872745 7 <- java/security/BasicPermission.<init> + 0 311481/2 4790256872753 7 <- java/lang/RuntimePermission.<init> + 0 311481/2 4790256873195 442 -> sun/misc/SoftCache.<init> + 0 311481/2 4790256873208 12 -> java/util/AbstractMap.<init> + 0 311481/2 4790256873218 9 -> java/lang/Object.<init> + 0 311481/2 4790256873226 7 <- java/lang/Object.<init> + 0 311481/2 4790256873238 11 <- java/util/AbstractMap.<init> + 0 311481/2 4790256873371 133 -> java/lang/ref/ReferenceQueue.<clinit> + 0 311481/2 4790256873443 72 -> java/lang/ref/ReferenceQueue$Null.<init> + 0 311481/2 4790256873454 10 -> java/lang/ref/ReferenceQueue$Null.<init> + 0 311481/2 4790256873464 9 -> java/lang/ref/ReferenceQueue.<init> + 0 311481/2 4790256873474 9 -> java/lang/Object.<init> + 0 311481/2 4790256873481 7 <- java/lang/Object.<init> + 0 311481/2 4790256873542 60 -> java/lang/ref/ReferenceQueue$Lock.<init> + 0 311481/2 4790256873553 10 -> java/lang/ref/ReferenceQueue$Lock.<init> + 0 311481/2 4790256873562 9 -> java/lang/Object.<init> + 0 311481/2 4790256873570 7 <- java/lang/Object.<init> + 0 311481/2 4790256873578 7 <- java/lang/ref/ReferenceQueue$Lock.<init> + 0 311481/2 4790256873585 7 <- java/lang/ref/ReferenceQueue$Lock.<init> + 0 311481/2 4790256873597 11 <- java/lang/ref/ReferenceQueue.<init> + 0 311481/2 4790256873604 7 <- java/lang/ref/ReferenceQueue$Null.<init> + 0 311481/2 4790256873612 7 <- java/lang/ref/ReferenceQueue$Null.<init> + 0 311481/2 4790256873622 9 -> java/lang/ref/ReferenceQueue$Null.<init> + 0 311481/2 4790256873629 7 -> java/lang/ref/ReferenceQueue$Null.<init> + 0 311481/2 4790256873636 7 -> java/lang/ref/ReferenceQueue.<init> + 0 311481/2 4790256873644 7 -> java/lang/Object.<init> + 0 311481/2 4790256873651 6 <- java/lang/Object.<init> + 0 311481/2 4790256873659 7 -> java/lang/ref/ReferenceQueue$Lock.<init> +[... 22800 lines truncated ...] + 0 311481/2 4790257387424 7 <- java/util/HashMap.indexFor + 0 311481/2 4790257387432 8 <- java/util/HashMap.put + 0 311481/2 4790257387440 7 <- java/util/HashSet.add + 0 311481/2 4790257387447 7 <- java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257387473 26 -> java/lang/reflect/Method.getModifiers + 0 311481/2 4790257387486 12 <- java/lang/reflect/Method.getModifiers + 0 311481/2 4790257387500 14 -> Func_abc.main + 0 311481/2 4790257387512 11 -> Func_abc.func_a + 0 311481/2 4790257387522 9 -> java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257387530 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790257387537 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790257387545 8 -> java/util/HashSet.add + 0 311481/2 4790257387552 7 -> java/util/HashMap.put + 0 311481/2 4790257387559 7 -> java/lang/Object.hashCode + 0 311481/2 4790257387567 7 <- java/lang/Object.hashCode + 0 311481/2 4790257387574 7 -> java/util/HashMap.hash + 0 311481/2 4790257387581 7 <- java/util/HashMap.hash + 0 311481/2 4790257387589 7 -> java/util/HashMap.indexFor + 0 311481/2 4790257387596 7 <- java/util/HashMap.indexFor + 0 311481/2 4790257387604 8 <- java/util/HashMap.put + 0 311481/2 4790257387611 7 <- java/util/HashSet.add + 0 311481/2 4790257387619 7 <- java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257387683 64 -> java/lang/ClassLoader.loadClassInternal + 0 311481/2 4790257387691 8 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257387699 7 -> sun/misc/Launcher$AppClassLoader.loadClass + 0 311481/2 4790257387706 7 -> java/lang/String.lastIndexOf + 0 311481/2 4790257387713 7 -> java/lang/String.lastIndexOf + 0 311481/2 4790257387722 8 <- java/lang/String.lastIndexOf + 0 311481/2 4790257387729 7 <- java/lang/String.lastIndexOf + 0 311481/2 4790257387737 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790257387760 22 <- java/lang/System.getSecurityManager + 0 311481/2 4790257387768 7 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257387775 7 -> java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257387782 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257387789 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257387797 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257387805 7 -> java/lang/String.indexOf + 0 311481/2 4790257387812 7 -> java/lang/String.indexOf + 0 311481/2 4790257387820 8 <- java/lang/String.indexOf + 0 311481/2 4790257387828 7 <- java/lang/String.indexOf + 0 311481/2 4790257387835 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257387843 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257387850 7 -> java/lang/String.charAt + 0 311481/2 4790257387857 7 <- java/lang/String.charAt + 0 311481/2 4790257387865 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257387873 7 -> java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257387883 9 <- java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257387890 7 <- java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257387899 8 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257387906 7 -> java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257387913 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257387920 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257387928 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257387935 7 -> java/lang/String.indexOf + 0 311481/2 4790257387942 7 -> java/lang/String.indexOf + 0 311481/2 4790257387951 8 <- java/lang/String.indexOf + 0 311481/2 4790257387958 7 <- java/lang/String.indexOf + 0 311481/2 4790257387966 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257387973 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257387981 7 -> java/lang/String.charAt + 0 311481/2 4790257387988 7 <- java/lang/String.charAt + 0 311481/2 4790257387995 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257388003 7 -> java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257388012 8 <- java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257388020 7 <- java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257388028 7 -> java/lang/ClassLoader.findBootstrapClass0 + 0 311481/2 4790257388035 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257388042 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257388050 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257388057 7 -> java/lang/String.indexOf + 0 311481/2 4790257388064 7 -> java/lang/String.indexOf + 0 311481/2 4790257388072 8 <- java/lang/String.indexOf + 0 311481/2 4790257388080 7 <- java/lang/String.indexOf + 0 311481/2 4790257388087 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257388094 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257388102 7 -> java/lang/String.charAt + 0 311481/2 4790257388109 7 <- java/lang/String.charAt + 0 311481/2 4790257388117 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257388124 7 -> java/lang/ClassLoader.findBootstrapClass + 0 311481/2 4790257388134 9 <- java/lang/ClassLoader.findBootstrapClass + 0 311481/2 4790257388142 8 <- java/lang/ClassLoader.findBootstrapClass0 + 0 311481/2 4790257388150 8 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257388158 7 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257388166 7 <- sun/misc/Launcher$AppClassLoader.loadClass + 0 311481/2 4790257388173 7 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257388181 7 <- java/lang/ClassLoader.loadClassInternal + 0 311481/2 4790257388193 11 -> java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257388200 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790257388207 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790257388215 7 -> java/util/HashSet.add + 0 311481/2 4790257388223 7 -> java/util/HashMap.put + 0 311481/2 4790257388230 7 -> java/lang/Object.hashCode + 0 311481/2 4790257388237 7 <- java/lang/Object.hashCode + 0 311481/2 4790257388245 7 -> java/util/HashMap.hash + 0 311481/2 4790257388252 7 <- java/util/HashMap.hash + 0 311481/2 4790257388260 7 -> java/util/HashMap.indexFor + 0 311481/2 4790257388267 7 <- java/util/HashMap.indexFor + 0 311481/2 4790257388275 7 <- java/util/HashMap.put + 0 311481/2 4790257388282 7 <- java/util/HashSet.add + 0 311481/2 4790257388290 7 <- java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257388305 15 -> java/io/PrintStream.println + 0 311481/2 4790257388316 11 -> java/io/PrintStream.print + 0 311481/2 4790257388326 9 -> java/io/PrintStream.write + 0 311481/2 4790257388335 9 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790257388345 10 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790257388358 12 -> java/io/Writer.write + 0 311481/2 4790257388371 13 -> java/io/BufferedWriter.write + 0 311481/2 4790257388382 10 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257388389 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257388399 10 -> java/io/BufferedWriter.min + 0 311481/2 4790257388407 7 <- java/io/BufferedWriter.min + 0 311481/2 4790257388417 10 -> java/lang/String.getChars + 0 311481/2 4790257388425 8 -> java/lang/System.arraycopy + 0 311481/2 4790257388434 8 <- java/lang/System.arraycopy + 0 311481/2 4790257388442 7 <- java/lang/String.getChars + 0 311481/2 4790257388450 8 <- java/io/BufferedWriter.write + 0 311481/2 4790257388457 7 <- java/io/Writer.write + 0 311481/2 4790257388467 10 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790257388475 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257388482 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257388493 10 -> java/io/OutputStreamWriter.write + 0 311481/2 4790257388504 11 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790257388515 10 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790257388522 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790257388533 10 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790257388544 11 -> java/nio/CharBuffer.wrap + 0 311481/2 4790257388552 8 -> java/nio/HeapCharBuffer.<init> + 0 311481/2 4790257388560 7 -> java/nio/CharBuffer.<init> + 0 311481/2 4790257388567 7 -> java/nio/Buffer.<init> + 0 311481/2 4790257388574 7 -> java/lang/Object.<init> + 0 311481/2 4790257388582 7 <- java/lang/Object.<init> + 0 311481/2 4790257388590 8 -> java/nio/Buffer.limit + 0 311481/2 4790257388598 7 <- java/nio/Buffer.limit + 0 311481/2 4790257388605 7 -> java/nio/Buffer.position + 0 311481/2 4790257388612 7 <- java/nio/Buffer.position + 0 311481/2 4790257388620 7 <- java/nio/Buffer.<init> + 0 311481/2 4790257388628 7 <- java/nio/CharBuffer.<init> + 0 311481/2 4790257388635 7 <- java/nio/HeapCharBuffer.<init> + 0 311481/2 4790257388643 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790257388654 10 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790257388661 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790257388673 11 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790257388684 10 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790257388695 10 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790257388702 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790257388714 11 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790257388722 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790257388732 10 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790257388742 9 -> java/nio/CharBuffer.array + 0 311481/2 4790257388749 7 <- java/nio/CharBuffer.array + 0 311481/2 4790257388759 9 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388766 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388776 9 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388784 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388797 13 -> java/nio/ByteBuffer.array + 0 311481/2 4790257388804 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790257388814 9 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388821 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388831 9 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388838 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388853 14 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388861 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257388871 9 -> java/nio/Buffer.position + 0 311481/2 4790257388878 7 <- java/nio/Buffer.position + 0 311481/2 4790257388886 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388893 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257388903 9 -> java/nio/Buffer.position + 0 311481/2 4790257388910 7 <- java/nio/Buffer.position + 0 311481/2 4790257388918 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790257388925 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790257388936 10 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790257388943 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790257388953 9 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257388961 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257388969 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790257388979 10 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257388987 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257388998 11 -> java/nio/Buffer.remaining + 0 311481/2 4790257389005 7 <- java/nio/Buffer.remaining + 0 311481/2 4790257389013 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790257389020 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790257389028 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790257389113 85 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790257389125 11 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790257389135 9 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790257389146 11 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790257389158 11 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790257389167 9 -> java/nio/Buffer.flip + 0 311481/2 4790257389174 7 <- java/nio/Buffer.flip + 0 311481/2 4790257389186 11 -> java/nio/ByteBuffer.array + 0 311481/2 4790257389193 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790257389203 9 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257389210 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257389222 11 -> java/io/PrintStream.write + 0 311481/2 4790257389230 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790257389237 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790257389248 11 -> java/io/BufferedOutputStream.write + 0 311481/2 4790257389261 12 -> java/lang/System.arraycopy + 0 311481/2 4790257389268 7 <- java/lang/System.arraycopy + 0 311481/2 4790257389276 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790257389286 9 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790257389295 9 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257389307 11 -> java/io/FileOutputStream.write + 0 311481/2 4790257389317 10 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790257389479 162 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790257389489 9 <- java/io/FileOutputStream.write + 0 311481/2 4790257389497 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257389509 12 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790257389517 8 <- java/io/PrintStream.write + 0 311481/2 4790257389527 10 -> java/nio/Buffer.clear + 0 311481/2 4790257389536 8 <- java/nio/Buffer.clear + 0 311481/2 4790257389543 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790257389551 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790257389559 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790257389566 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790257389579 12 -> java/lang/String.indexOf + 0 311481/2 4790257389586 7 -> java/lang/String.indexOf + 0 311481/2 4790257389595 8 <- java/lang/String.indexOf + 0 311481/2 4790257389602 7 <- java/lang/String.indexOf + 0 311481/2 4790257389610 7 <- java/io/PrintStream.write + 0 311481/2 4790257389617 7 <- java/io/PrintStream.print + 0 311481/2 4790257389627 9 -> java/io/PrintStream.newLine + 0 311481/2 4790257389635 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790257389642 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790257389651 9 -> java/io/BufferedWriter.newLine + 0 311481/2 4790257389661 9 -> java/io/Writer.write + 0 311481/2 4790257389668 7 -> java/io/BufferedWriter.write + 0 311481/2 4790257389713 44 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257389721 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257389729 8 -> java/io/BufferedWriter.min + 0 311481/2 4790257389737 7 <- java/io/BufferedWriter.min + 0 311481/2 4790257389744 7 -> java/lang/String.getChars + 0 311481/2 4790257389752 7 -> java/lang/System.arraycopy + 0 311481/2 4790257389760 7 <- java/lang/System.arraycopy + 0 311481/2 4790257389767 7 <- java/lang/String.getChars + 0 311481/2 4790257389775 7 <- java/io/BufferedWriter.write + 0 311481/2 4790257389783 7 <- java/io/Writer.write + 0 311481/2 4790257389790 7 <- java/io/BufferedWriter.newLine + 0 311481/2 4790257389798 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790257389805 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257389812 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790257389820 7 -> java/io/OutputStreamWriter.write + 0 311481/2 4790257389828 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790257389835 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790257389842 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790257389850 7 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790257389857 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790257389865 7 -> java/nio/HeapCharBuffer.<init> + 0 311481/2 4790257389872 7 -> java/nio/CharBuffer.<init> + 0 311481/2 4790257389879 7 -> java/nio/Buffer.<init> + 0 311481/2 4790257389886 6 -> java/lang/Object.<init> + 0 311481/2 4790257389893 7 <- java/lang/Object.<init> + 0 311481/2 4790257389901 7 -> java/nio/Buffer.limit + 0 311481/2 4790257389908 7 <- java/nio/Buffer.limit + 0 311481/2 4790257389916 7 -> java/nio/Buffer.position + 0 311481/2 4790257389923 7 <- java/nio/Buffer.position + 0 311481/2 4790257389930 7 <- java/nio/Buffer.<init> + 0 311481/2 4790257389938 7 <- java/nio/CharBuffer.<init> + 0 311481/2 4790257389946 7 <- java/nio/HeapCharBuffer.<init> + 0 311481/2 4790257389953 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790257389961 7 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790257389968 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790257389976 7 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790257389984 7 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790257389991 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790257389998 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790257390760 761 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790257390772 11 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790257390782 10 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790257390790 7 -> java/nio/CharBuffer.array + 0 311481/2 4790257390797 7 <- java/nio/CharBuffer.array + 0 311481/2 4790257390805 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390812 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390820 8 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390828 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390836 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790257390844 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790257390851 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390859 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390866 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390874 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390883 8 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390890 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790257390898 8 -> java/nio/Buffer.position + 0 311481/2 4790257390906 7 <- java/nio/Buffer.position + 0 311481/2 4790257390913 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390921 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257390928 7 -> java/nio/Buffer.position + 0 311481/2 4790257390936 7 <- java/nio/Buffer.position + 0 311481/2 4790257390943 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790257390951 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790257390959 8 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790257390967 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790257390974 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257390982 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257390990 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790257390998 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257391005 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790257391013 8 -> java/nio/Buffer.remaining + 0 311481/2 4790257391020 7 <- java/nio/Buffer.remaining + 0 311481/2 4790257391028 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790257391036 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790257391044 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790257391052 8 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790257391060 7 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790257391067 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790257391075 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790257391082 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790257391090 7 -> java/nio/Buffer.flip + 0 311481/2 4790257391097 7 <- java/nio/Buffer.flip + 0 311481/2 4790257391105 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790257391112 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790257391120 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257391127 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790257391135 8 -> java/io/PrintStream.write + 0 311481/2 4790257391142 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790257391150 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790257391158 8 -> java/io/BufferedOutputStream.write + 0 311481/2 4790257391166 7 -> java/lang/System.arraycopy + 0 311481/2 4790257391174 8 <- java/lang/System.arraycopy + 0 311481/2 4790257391182 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790257391190 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790257391197 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257391205 7 -> java/io/FileOutputStream.write + 0 311481/2 4790257391212 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790257391280 67 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790257391289 9 <- java/io/FileOutputStream.write + 0 311481/2 4790257391297 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257391305 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790257391313 7 <- java/io/PrintStream.write + 0 311481/2 4790257391321 7 -> java/nio/Buffer.clear + 0 311481/2 4790257391329 7 <- java/nio/Buffer.clear + 0 311481/2 4790257391336 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790257391344 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790257391352 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790257391359 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790257391368 8 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790257391375 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257391383 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790257391391 8 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790257391398 7 <- java/io/PrintStream.newLine + 0 311481/2 4790257391406 7 <- java/io/PrintStream.println + 0 311481/2 4790257391439 32 -> java/lang/ClassLoader.loadClassInternal + 0 311481/2 4790257391447 8 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257391455 7 -> sun/misc/Launcher$AppClassLoader.loadClass + 0 311481/2 4790257391463 7 -> java/lang/String.lastIndexOf + 0 311481/2 4790257391471 7 -> java/lang/String.lastIndexOf + 0 311481/2 4790257391479 8 <- java/lang/String.lastIndexOf + 0 311481/2 4790257391487 7 <- java/lang/String.lastIndexOf + 0 311481/2 4790257391495 8 -> java/lang/System.getSecurityManager + 0 311481/2 4790257391503 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790257391511 8 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257391518 7 -> java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257391526 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257391533 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257391541 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257391549 7 -> java/lang/String.indexOf + 0 311481/2 4790257391556 7 -> java/lang/String.indexOf + 0 311481/2 4790257391564 8 <- java/lang/String.indexOf + 0 311481/2 4790257391572 7 <- java/lang/String.indexOf + 0 311481/2 4790257391580 8 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391587 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391595 7 -> java/lang/String.charAt + 0 311481/2 4790257391603 7 <- java/lang/String.charAt + 0 311481/2 4790257391610 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257391618 7 -> java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257391633 14 <- java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257391641 8 <- java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257391651 9 -> java/lang/ClassLoader.loadClass + 0 311481/2 4790257391658 7 -> java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257391665 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257391672 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257391680 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257391688 7 -> java/lang/String.indexOf + 0 311481/2 4790257391695 7 -> java/lang/String.indexOf + 0 311481/2 4790257391703 8 <- java/lang/String.indexOf + 0 311481/2 4790257391711 7 <- java/lang/String.indexOf + 0 311481/2 4790257391718 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391725 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391733 7 -> java/lang/String.charAt + 0 311481/2 4790257391740 7 <- java/lang/String.charAt + 0 311481/2 4790257391748 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257391755 7 -> java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257391765 9 <- java/lang/ClassLoader.findLoadedClass0 + 0 311481/2 4790257391773 8 <- java/lang/ClassLoader.findLoadedClass + 0 311481/2 4790257391781 8 -> java/lang/ClassLoader.findBootstrapClass0 + 0 311481/2 4790257391788 7 -> java/lang/ClassLoader.check + 0 311481/2 4790257391795 7 <- java/lang/ClassLoader.check + 0 311481/2 4790257391803 7 -> java/lang/ClassLoader.checkName + 0 311481/2 4790257391810 7 -> java/lang/String.indexOf + 0 311481/2 4790257391817 7 -> java/lang/String.indexOf + 0 311481/2 4790257391825 7 <- java/lang/String.indexOf + 0 311481/2 4790257391833 7 <- java/lang/String.indexOf + 0 311481/2 4790257391840 7 -> sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391848 7 <- sun/misc/VM.allowArraySyntax + 0 311481/2 4790257391855 7 -> java/lang/String.charAt + 0 311481/2 4790257391862 7 <- java/lang/String.charAt + 0 311481/2 4790257391870 7 <- java/lang/ClassLoader.checkName + 0 311481/2 4790257391877 7 -> java/lang/ClassLoader.findBootstrapClass + 0 311481/2 4790257391891 13 <- java/lang/ClassLoader.findBootstrapClass + 0 311481/2 4790257391899 7 <- java/lang/ClassLoader.findBootstrapClass0 + 0 311481/2 4790257391907 8 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257391915 7 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257391922 7 <- sun/misc/Launcher$AppClassLoader.loadClass + 0 311481/2 4790257391930 7 <- java/lang/ClassLoader.loadClass + 0 311481/2 4790257391938 7 <- java/lang/ClassLoader.loadClassInternal + 0 311481/2 4790257391954 16 -> java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257391962 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790257391969 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790257391978 8 -> java/util/HashSet.add + 0 311481/2 4790257391986 8 -> java/util/HashMap.put + 0 311481/2 4790257391994 7 -> java/lang/Object.hashCode + 0 311481/2 4790257392001 7 <- java/lang/Object.hashCode + 0 311481/2 4790257392009 8 -> java/util/HashMap.hash + 0 311481/2 4790257392017 7 <- java/util/HashMap.hash + 0 311481/2 4790257392025 7 -> java/util/HashMap.indexFor + 0 311481/2 4790257392032 7 <- java/util/HashMap.indexFor + 0 311481/2 4790257392040 8 <- java/util/HashMap.put + 0 311481/2 4790257392048 7 <- java/util/HashSet.add + 0 311481/2 4790257392055 7 <- java/lang/ClassLoader.checkPackageAccess + 0 311481/2 4790257392076 20 -> java/lang/Thread.currentThread + 0 311481/2 4790257392084 8 <- java/lang/Thread.currentThread + 0 311481/2 4790257392094 10 -> java/lang/Thread.sleep + 0 311481/2 4790258400253 1008158 <- java/lang/Thread.sleep + 0 311481/2 4790258400299 45 -> Func_abc.func_b + 0 311481/2 4790258400329 30 -> java/io/PrintStream.println + 0 311481/2 4790258400338 8 -> java/io/PrintStream.print + 0 311481/2 4790258400345 7 -> java/io/PrintStream.write + 0 311481/2 4790258400353 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790258400361 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790258400369 8 -> java/io/Writer.write + 0 311481/2 4790258400378 8 -> java/io/BufferedWriter.write + 0 311481/2 4790258400386 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258400393 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258400402 9 -> java/io/BufferedWriter.min + 0 311481/2 4790258400410 7 <- java/io/BufferedWriter.min + 0 311481/2 4790258400418 8 -> java/lang/String.getChars + 0 311481/2 4790258400426 8 -> java/lang/System.arraycopy + 0 311481/2 4790258400435 8 <- java/lang/System.arraycopy + 0 311481/2 4790258400442 7 <- java/lang/String.getChars + 0 311481/2 4790258400451 8 <- java/io/BufferedWriter.write + 0 311481/2 4790258400458 7 <- java/io/Writer.write + 0 311481/2 4790258400466 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790258400474 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258400481 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258400489 8 -> java/io/OutputStreamWriter.write + 0 311481/2 4790258400497 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790258400504 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790258400511 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790258400520 8 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790258400528 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790258400536 7 -> java/nio/HeapCharBuffer.<init> + 0 311481/2 4790258400544 7 -> java/nio/CharBuffer.<init> + 0 311481/2 4790258400551 7 -> java/nio/Buffer.<init> + 0 311481/2 4790258400559 7 -> java/lang/Object.<init> + 0 311481/2 4790258400566 7 <- java/lang/Object.<init> + 0 311481/2 4790258400574 8 -> java/nio/Buffer.limit + 0 311481/2 4790258400582 7 <- java/nio/Buffer.limit + 0 311481/2 4790258400590 7 -> java/nio/Buffer.position + 0 311481/2 4790258400597 7 <- java/nio/Buffer.position + 0 311481/2 4790258400604 7 <- java/nio/Buffer.<init> + 0 311481/2 4790258400612 7 <- java/nio/CharBuffer.<init> + 0 311481/2 4790258400620 7 <- java/nio/HeapCharBuffer.<init> + 0 311481/2 4790258400627 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790258400635 8 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790258400643 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790258400651 8 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790258400659 8 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790258400667 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790258400675 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790258400683 8 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790258400690 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790258400698 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790258400706 7 -> java/nio/CharBuffer.array + 0 311481/2 4790258400713 7 <- java/nio/CharBuffer.array + 0 311481/2 4790258400721 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400728 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400736 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400743 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400752 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790258400759 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790258400766 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400774 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400781 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400789 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400799 9 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400806 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258400813 7 -> java/nio/Buffer.position + 0 311481/2 4790258400821 7 <- java/nio/Buffer.position + 0 311481/2 4790258400828 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400836 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258400843 7 -> java/nio/Buffer.position + 0 311481/2 4790258400850 7 <- java/nio/Buffer.position + 0 311481/2 4790258400858 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790258400866 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790258400874 8 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790258400881 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790258400889 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258400896 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258400904 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790258400912 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258400919 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258400927 8 -> java/nio/Buffer.remaining + 0 311481/2 4790258400934 7 <- java/nio/Buffer.remaining + 0 311481/2 4790258400942 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790258400950 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790258400957 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790258400965 7 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790258400973 8 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790258400981 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790258400988 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790258400996 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790258401004 7 -> java/nio/Buffer.flip + 0 311481/2 4790258401011 6 <- java/nio/Buffer.flip + 0 311481/2 4790258401019 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790258401026 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790258401033 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401041 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401049 7 -> java/io/PrintStream.write + 0 311481/2 4790258401056 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790258401063 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790258401071 8 -> java/io/BufferedOutputStream.write + 0 311481/2 4790258401079 7 -> java/lang/System.arraycopy + 0 311481/2 4790258401087 7 <- java/lang/System.arraycopy + 0 311481/2 4790258401094 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790258401103 8 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790258401110 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258401118 7 -> java/io/FileOutputStream.write + 0 311481/2 4790258401125 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790258401164 39 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790258401173 8 <- java/io/FileOutputStream.write + 0 311481/2 4790258401181 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258401189 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790258401196 7 <- java/io/PrintStream.write + 0 311481/2 4790258401204 7 -> java/nio/Buffer.clear + 0 311481/2 4790258401212 7 <- java/nio/Buffer.clear + 0 311481/2 4790258401219 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790258401227 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790258401235 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790258401242 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790258401251 8 -> java/lang/String.indexOf + 0 311481/2 4790258401258 7 -> java/lang/String.indexOf + 0 311481/2 4790258401266 8 <- java/lang/String.indexOf + 0 311481/2 4790258401274 7 <- java/lang/String.indexOf + 0 311481/2 4790258401281 7 <- java/io/PrintStream.write + 0 311481/2 4790258401289 7 <- java/io/PrintStream.print + 0 311481/2 4790258401297 7 -> java/io/PrintStream.newLine + 0 311481/2 4790258401304 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790258401311 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790258401319 7 -> java/io/BufferedWriter.newLine + 0 311481/2 4790258401326 7 -> java/io/Writer.write + 0 311481/2 4790258401334 7 -> java/io/BufferedWriter.write + 0 311481/2 4790258401341 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258401348 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258401356 7 -> java/io/BufferedWriter.min + 0 311481/2 4790258401363 7 <- java/io/BufferedWriter.min + 0 311481/2 4790258401371 7 -> java/lang/String.getChars + 0 311481/2 4790258401378 7 -> java/lang/System.arraycopy + 0 311481/2 4790258401385 7 <- java/lang/System.arraycopy + 0 311481/2 4790258401393 7 <- java/lang/String.getChars + 0 311481/2 4790258401401 7 <- java/io/BufferedWriter.write + 0 311481/2 4790258401408 7 <- java/io/Writer.write + 0 311481/2 4790258401416 7 <- java/io/BufferedWriter.newLine + 0 311481/2 4790258401423 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790258401430 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258401438 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790258401446 7 -> java/io/OutputStreamWriter.write + 0 311481/2 4790258401453 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790258401460 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790258401467 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790258401475 7 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790258401482 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790258401490 7 -> java/nio/HeapCharBuffer.<init> + 0 311481/2 4790258401497 7 -> java/nio/CharBuffer.<init> + 0 311481/2 4790258401504 7 -> java/nio/Buffer.<init> + 0 311481/2 4790258401511 7 -> java/lang/Object.<init> + 0 311481/2 4790258401518 7 <- java/lang/Object.<init> + 0 311481/2 4790258401526 7 -> java/nio/Buffer.limit + 0 311481/2 4790258401533 7 <- java/nio/Buffer.limit + 0 311481/2 4790258401541 7 -> java/nio/Buffer.position + 0 311481/2 4790258401548 7 <- java/nio/Buffer.position + 0 311481/2 4790258401556 7 <- java/nio/Buffer.<init> + 0 311481/2 4790258401563 7 <- java/nio/CharBuffer.<init> + 0 311481/2 4790258401570 7 <- java/nio/HeapCharBuffer.<init> + 0 311481/2 4790258401578 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790258401586 7 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790258401593 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790258401601 7 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790258401608 7 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790258401615 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790258401623 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790258401630 7 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790258401638 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790258401645 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790258401653 7 -> java/nio/CharBuffer.array + 0 311481/2 4790258401660 7 <- java/nio/CharBuffer.array + 0 311481/2 4790258401667 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401675 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401682 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401690 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401697 7 -> java/nio/ByteBuffer.array + 0 311481/2 4790258401705 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790258401712 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401719 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401727 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401734 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401743 8 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401750 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790258401757 7 -> java/nio/Buffer.position + 0 311481/2 4790258401765 7 <- java/nio/Buffer.position + 0 311481/2 4790258401772 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401780 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401787 7 -> java/nio/Buffer.position + 0 311481/2 4790258401794 7 <- java/nio/Buffer.position + 0 311481/2 4790258401802 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790258401809 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790258401817 7 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790258401825 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790258401832 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258401840 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258401848 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790258401855 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258401863 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790258401871 7 -> java/nio/Buffer.remaining + 0 311481/2 4790258401878 7 <- java/nio/Buffer.remaining + 0 311481/2 4790258401885 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790258401893 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790258401901 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790258401908 7 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790258401916 7 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790258401923 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790258401931 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790258401938 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790258401945 7 -> java/nio/Buffer.flip + 0 311481/2 4790258401952 7 <- java/nio/Buffer.flip + 0 311481/2 4790258401960 7 -> java/nio/ByteBuffer.array + 0 311481/2 4790258401967 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790258401975 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401982 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790258401990 7 -> java/io/PrintStream.write + 0 311481/2 4790258401997 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790258402004 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790258402012 7 -> java/io/BufferedOutputStream.write + 0 311481/2 4790258402020 7 -> java/lang/System.arraycopy + 0 311481/2 4790258402027 7 <- java/lang/System.arraycopy + 0 311481/2 4790258402035 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790258402042 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790258402050 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258402057 7 -> java/io/FileOutputStream.write + 0 311481/2 4790258402064 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790258402082 17 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790258402090 8 <- java/io/FileOutputStream.write + 0 311481/2 4790258402098 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258402106 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790258402113 7 <- java/io/PrintStream.write + 0 311481/2 4790258402121 7 -> java/nio/Buffer.clear + 0 311481/2 4790258402128 7 <- java/nio/Buffer.clear + 0 311481/2 4790258402136 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790258402143 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790258402151 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790258402159 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790258402166 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790258402174 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258402181 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790258402189 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790258402196 7 <- java/io/PrintStream.newLine + 0 311481/2 4790258402204 7 <- java/io/PrintStream.println + 0 311481/2 4790258402212 7 -> java/lang/Thread.currentThread + 0 311481/2 4790258402220 7 <- java/lang/Thread.currentThread + 0 311481/2 4790258402228 7 -> java/lang/Thread.sleep + 0 311481/2 4790259410328 1008099 <- java/lang/Thread.sleep + 0 311481/2 4790259410374 46 -> Func_abc.func_c + 0 311481/2 4790259410404 29 -> java/io/PrintStream.println + 0 311481/2 4790259410412 8 -> java/io/PrintStream.print + 0 311481/2 4790259410420 7 -> java/io/PrintStream.write + 0 311481/2 4790259410428 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790259410435 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790259410444 8 -> java/io/Writer.write + 0 311481/2 4790259410453 8 -> java/io/BufferedWriter.write + 0 311481/2 4790259410460 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259410467 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259410477 9 -> java/io/BufferedWriter.min + 0 311481/2 4790259410484 7 <- java/io/BufferedWriter.min + 0 311481/2 4790259410492 8 -> java/lang/String.getChars + 0 311481/2 4790259410501 8 -> java/lang/System.arraycopy + 0 311481/2 4790259410509 8 <- java/lang/System.arraycopy + 0 311481/2 4790259410517 7 <- java/lang/String.getChars + 0 311481/2 4790259410525 8 <- java/io/BufferedWriter.write + 0 311481/2 4790259410533 7 <- java/io/Writer.write + 0 311481/2 4790259410541 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790259410548 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259410555 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259410563 8 -> java/io/OutputStreamWriter.write + 0 311481/2 4790259410571 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790259410579 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790259410586 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790259410595 8 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790259410602 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790259410610 7 -> java/nio/HeapCharBuffer.<init> + 0 311481/2 4790259410618 7 -> java/nio/CharBuffer.<init> + 0 311481/2 4790259410625 7 -> java/nio/Buffer.<init> + 0 311481/2 4790259410633 7 -> java/lang/Object.<init> + 0 311481/2 4790259410640 7 <- java/lang/Object.<init> + 0 311481/2 4790259410648 8 -> java/nio/Buffer.limit + 0 311481/2 4790259410656 7 <- java/nio/Buffer.limit + 0 311481/2 4790259410664 7 -> java/nio/Buffer.position + 0 311481/2 4790259410671 7 <- java/nio/Buffer.position + 0 311481/2 4790259410678 7 <- java/nio/Buffer.<init> + 0 311481/2 4790259410686 7 <- java/nio/CharBuffer.<init> + 0 311481/2 4790259410694 7 <- java/nio/HeapCharBuffer.<init> + 0 311481/2 4790259410701 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790259410710 8 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790259410717 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790259410725 8 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790259410733 8 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790259410741 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790259410749 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790259410757 8 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790259410764 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790259410772 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790259410780 7 -> java/nio/CharBuffer.array + 0 311481/2 4790259410787 7 <- java/nio/CharBuffer.array + 0 311481/2 4790259410795 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410802 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410810 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410817 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410826 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790259410833 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790259410841 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410848 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410855 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410863 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410873 9 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410880 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259410888 7 -> java/nio/Buffer.position + 0 311481/2 4790259410895 7 <- java/nio/Buffer.position + 0 311481/2 4790259410902 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410910 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259410917 7 -> java/nio/Buffer.position + 0 311481/2 4790259410924 7 <- java/nio/Buffer.position + 0 311481/2 4790259410932 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790259410940 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790259410948 8 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790259410955 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790259410963 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259410970 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259410978 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790259410986 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259410993 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411001 8 -> java/nio/Buffer.remaining + 0 311481/2 4790259411008 7 <- java/nio/Buffer.remaining + 0 311481/2 4790259411016 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790259411024 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790259411031 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790259411039 7 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790259411047 8 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790259411055 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790259411062 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790259411070 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790259411077 7 -> java/nio/Buffer.flip + 0 311481/2 4790259411084 6 <- java/nio/Buffer.flip + 0 311481/2 4790259411092 8 -> java/nio/ByteBuffer.array + 0 311481/2 4790259411100 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790259411107 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411114 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411122 7 -> java/io/PrintStream.write + 0 311481/2 4790259411130 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790259411137 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790259411145 8 -> java/io/BufferedOutputStream.write + 0 311481/2 4790259411153 7 -> java/lang/System.arraycopy + 0 311481/2 4790259411160 7 <- java/lang/System.arraycopy + 0 311481/2 4790259411168 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790259411176 8 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790259411184 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259411192 7 -> java/io/FileOutputStream.write + 0 311481/2 4790259411199 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790259411241 41 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790259411249 8 <- java/io/FileOutputStream.write + 0 311481/2 4790259411257 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259411265 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790259411272 7 <- java/io/PrintStream.write + 0 311481/2 4790259411280 7 -> java/nio/Buffer.clear + 0 311481/2 4790259411288 7 <- java/nio/Buffer.clear + 0 311481/2 4790259411295 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790259411303 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790259411310 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790259411318 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790259411326 8 -> java/lang/String.indexOf + 0 311481/2 4790259411334 7 -> java/lang/String.indexOf + 0 311481/2 4790259411342 8 <- java/lang/String.indexOf + 0 311481/2 4790259411349 7 <- java/lang/String.indexOf + 0 311481/2 4790259411357 7 <- java/io/PrintStream.write + 0 311481/2 4790259411365 7 <- java/io/PrintStream.print + 0 311481/2 4790259411372 7 -> java/io/PrintStream.newLine + 0 311481/2 4790259411380 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790259411387 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790259411395 7 -> java/io/BufferedWriter.newLine + 0 311481/2 4790259411402 7 -> java/io/Writer.write + 0 311481/2 4790259411409 7 -> java/io/BufferedWriter.write + 0 311481/2 4790259411416 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259411423 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259411431 7 -> java/io/BufferedWriter.min + 0 311481/2 4790259411439 7 <- java/io/BufferedWriter.min + 0 311481/2 4790259411446 7 -> java/lang/String.getChars + 0 311481/2 4790259411454 7 -> java/lang/System.arraycopy + 0 311481/2 4790259411461 7 <- java/lang/System.arraycopy + 0 311481/2 4790259411468 7 <- java/lang/String.getChars + 0 311481/2 4790259411476 7 <- java/io/BufferedWriter.write + 0 311481/2 4790259411484 7 <- java/io/Writer.write + 0 311481/2 4790259411491 7 <- java/io/BufferedWriter.newLine + 0 311481/2 4790259411499 7 -> java/io/BufferedWriter.flushBuffer + 0 311481/2 4790259411506 7 -> java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259411513 7 <- java/io/BufferedWriter.ensureOpen + 0 311481/2 4790259411521 7 -> java/io/OutputStreamWriter.write + 0 311481/2 4790259411528 7 -> sun/nio/cs/StreamEncoder.write + 0 311481/2 4790259411535 7 -> sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790259411543 7 <- sun/nio/cs/StreamEncoder.ensureOpen + 0 311481/2 4790259411550 7 -> sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790259411558 7 -> java/nio/CharBuffer.wrap + 0 311481/2 4790259411565 7 -> java/nio/HeapCharBuffer.<init> + 0 311481/2 4790259411572 7 -> java/nio/CharBuffer.<init> + 0 311481/2 4790259411579 7 -> java/nio/Buffer.<init> + 0 311481/2 4790259411586 6 -> java/lang/Object.<init> + 0 311481/2 4790259411594 7 <- java/lang/Object.<init> + 0 311481/2 4790259411601 7 -> java/nio/Buffer.limit + 0 311481/2 4790259411608 7 <- java/nio/Buffer.limit + 0 311481/2 4790259411616 7 -> java/nio/Buffer.position + 0 311481/2 4790259411623 7 <- java/nio/Buffer.position + 0 311481/2 4790259411631 7 <- java/nio/Buffer.<init> + 0 311481/2 4790259411638 7 <- java/nio/CharBuffer.<init> + 0 311481/2 4790259411646 7 <- java/nio/HeapCharBuffer.<init> + 0 311481/2 4790259411653 7 <- java/nio/CharBuffer.wrap + 0 311481/2 4790259411661 7 -> java/nio/Buffer.hasRemaining + 0 311481/2 4790259411668 7 <- java/nio/Buffer.hasRemaining + 0 311481/2 4790259411676 7 -> java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790259411684 7 -> sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790259411691 7 -> java/nio/CharBuffer.hasArray + 0 311481/2 4790259411698 7 <- java/nio/CharBuffer.hasArray + 0 311481/2 4790259411706 7 -> java/nio/ByteBuffer.hasArray + 0 311481/2 4790259411713 7 <- java/nio/ByteBuffer.hasArray + 0 311481/2 4790259411721 7 -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790259411728 7 -> java/nio/CharBuffer.array + 0 311481/2 4790259411735 7 <- java/nio/CharBuffer.array + 0 311481/2 4790259411743 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411750 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411758 7 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411765 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411773 7 -> java/nio/ByteBuffer.array + 0 311481/2 4790259411780 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790259411787 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411795 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411802 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411809 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411818 8 -> java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411825 7 <- java/nio/CharBuffer.arrayOffset + 0 311481/2 4790259411833 7 -> java/nio/Buffer.position + 0 311481/2 4790259411840 7 <- java/nio/Buffer.position + 0 311481/2 4790259411847 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411855 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259411862 7 -> java/nio/Buffer.position + 0 311481/2 4790259411869 7 <- java/nio/Buffer.position + 0 311481/2 4790259411877 7 <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 0 311481/2 4790259411885 7 <- sun/nio/cs/US_ASCII$Encoder.encodeLoop + 0 311481/2 4790259411893 8 -> java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790259411900 7 <- java/nio/charset/CoderResult.isOverflow + 0 311481/2 4790259411908 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411915 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411923 7 <- java/nio/charset/CharsetEncoder.encode + 0 311481/2 4790259411931 7 -> java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411938 7 <- java/nio/charset/CoderResult.isUnderflow + 0 311481/2 4790259411946 7 -> java/nio/Buffer.remaining + 0 311481/2 4790259411953 7 <- java/nio/Buffer.remaining + 0 311481/2 4790259411960 7 <- sun/nio/cs/StreamEncoder.implWrite + 0 311481/2 4790259411968 7 <- sun/nio/cs/StreamEncoder.write + 0 311481/2 4790259411976 7 <- java/io/OutputStreamWriter.write + 0 311481/2 4790259411983 7 <- java/io/BufferedWriter.flushBuffer + 0 311481/2 4790259411991 7 -> java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790259411999 7 -> sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790259412006 7 -> sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790259412013 7 -> sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790259412021 7 -> java/nio/Buffer.flip + 0 311481/2 4790259412028 6 <- java/nio/Buffer.flip + 0 311481/2 4790259412035 7 -> java/nio/ByteBuffer.array + 0 311481/2 4790259412043 7 <- java/nio/ByteBuffer.array + 0 311481/2 4790259412050 7 -> java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259412057 7 <- java/nio/ByteBuffer.arrayOffset + 0 311481/2 4790259412065 7 -> java/io/PrintStream.write + 0 311481/2 4790259412072 7 -> java/io/PrintStream.ensureOpen + 0 311481/2 4790259412080 7 <- java/io/PrintStream.ensureOpen + 0 311481/2 4790259412087 7 -> java/io/BufferedOutputStream.write + 0 311481/2 4790259412095 7 -> java/lang/System.arraycopy + 0 311481/2 4790259412102 7 <- java/lang/System.arraycopy + 0 311481/2 4790259412110 7 <- java/io/BufferedOutputStream.write + 0 311481/2 4790259412118 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790259412125 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259412132 7 -> java/io/FileOutputStream.write + 0 311481/2 4790259412140 7 -> java/io/FileOutputStream.writeBytes + 0 311481/2 4790259412157 17 <- java/io/FileOutputStream.writeBytes + 0 311481/2 4790259412165 8 <- java/io/FileOutputStream.write + 0 311481/2 4790259412172 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259412180 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790259412188 7 <- java/io/PrintStream.write + 0 311481/2 4790259412195 7 -> java/nio/Buffer.clear + 0 311481/2 4790259412203 7 <- java/nio/Buffer.clear + 0 311481/2 4790259412210 7 <- sun/nio/cs/StreamEncoder.writeBytes + 0 311481/2 4790259412218 7 <- sun/nio/cs/StreamEncoder.implFlushBuffer + 0 311481/2 4790259412226 7 <- sun/nio/cs/StreamEncoder.flushBuffer + 0 311481/2 4790259412233 7 <- java/io/OutputStreamWriter.flushBuffer + 0 311481/2 4790259412241 7 -> java/io/BufferedOutputStream.flush + 0 311481/2 4790259412248 7 -> java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259412256 7 <- java/io/BufferedOutputStream.flushBuffer + 0 311481/2 4790259412263 7 <- java/io/BufferedOutputStream.flush + 0 311481/2 4790259412271 7 <- java/io/PrintStream.newLine + 0 311481/2 4790259412279 7 <- java/io/PrintStream.println + 0 311481/2 4790259412287 8 -> java/lang/Thread.currentThread + 0 311481/2 4790259412294 7 <- java/lang/Thread.currentThread + 0 311481/2 4790259412302 7 -> java/lang/Thread.sleep + 0 311481/2 4790260420044 1007741 <- java/lang/Thread.sleep + 0 311481/2 4790260420073 29 <- Func_abc.func_c + 0 311481/2 4790260420081 7 <- Func_abc.func_b + 0 311481/2 4790260420088 7 <- Func_abc.func_a + 0 311481/2 4790260420096 7 <- Func_abc.main + 0 311481/2 4790260420121 24 -> java/lang/Thread.exit + 0 311481/2 4790260420153 32 -> java/lang/ThreadGroup.remove + 0 311481/2 4790260420169 15 -> java/lang/System.arraycopy + 0 311481/2 4790260420178 8 <- java/lang/System.arraycopy + 0 311481/2 4790260420190 11 -> java/lang/Object.notifyAll + 0 311481/2 4790260420203 13 <- java/lang/Object.notifyAll + 0 311481/2 4790260420211 8 <- java/lang/ThreadGroup.remove + 0 311481/2 4790260420225 13 <- java/lang/Thread.exit + 0 311481/2 4790260420438 212 -> java/lang/Thread.<init> + 0 311481/2 4790260420447 8 -> java/lang/Object.<init> + 0 311481/2 4790260420454 7 <- java/lang/Object.<init> + 0 311481/2 4790260420464 9 -> java/lang/Object.<init> + 0 311481/2 4790260420471 7 <- java/lang/Object.<init> + 0 311481/2 4790260420479 8 -> java/lang/Thread.init + 0 311481/2 4790260420486 7 -> java/lang/Thread.currentThread + 0 311481/2 4790260420494 7 <- java/lang/Thread.currentThread + 0 311481/2 4790260420503 8 -> java/lang/System.getSecurityManager + 0 311481/2 4790260420511 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790260420519 8 -> java/lang/ThreadGroup.checkAccess + 0 311481/2 4790260420526 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790260420534 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790260420542 8 <- java/lang/ThreadGroup.checkAccess + 0 311481/2 4790260420550 8 -> java/lang/ThreadGroup.addUnstarted + 0 311481/2 4790260420558 7 <- java/lang/ThreadGroup.addUnstarted + 0 311481/2 4790260420567 9 -> java/lang/String.toCharArray + 0 311481/2 4790260420575 8 -> java/lang/String.getChars + 0 311481/2 4790260420584 8 -> java/lang/System.arraycopy + 0 311481/2 4790260420592 8 <- java/lang/System.arraycopy + 0 311481/2 4790260420599 7 <- java/lang/String.getChars + 0 311481/2 4790260420607 7 <- java/lang/String.toCharArray + 0 311481/2 4790260420615 7 -> java/lang/Thread.getContextClassLoader + 0 311481/2 4790260420622 7 <- java/lang/Thread.getContextClassLoader + 0 311481/2 4790260420631 8 -> java/security/AccessController.getContext + 0 311481/2 4790260420638 7 -> java/security/AccessController.getStackAccessControlContext + 0 311481/2 4790260420653 14 <- java/security/AccessController.getStackAccessControlContext + 0 311481/2 4790260420662 8 -> java/security/AccessControlContext.optimize + 0 311481/2 4790260420670 8 -> java/security/AccessController.getInheritedAccessControlContext + 0 311481/2 4790260420678 8 <- java/security/AccessController.getInheritedAccessControlContext + 0 311481/2 4790260420687 8 <- java/security/AccessControlContext.optimize + 0 311481/2 4790260420695 7 <- java/security/AccessController.getContext + 0 311481/2 4790260420703 8 -> java/lang/Thread.setPriority + 0 311481/2 4790260420710 7 -> java/lang/Thread.checkAccess + 0 311481/2 4790260420718 7 -> java/lang/System.getSecurityManager + 0 311481/2 4790260420725 7 <- java/lang/System.getSecurityManager + 0 311481/2 4790260420732 7 <- java/lang/Thread.checkAccess + 0 311481/2 4790260420741 8 -> java/lang/Thread.setPriority0 + 0 311481/2 4790260420760 19 <- java/lang/Thread.setPriority0 + 0 311481/2 4790260420768 8 <- java/lang/Thread.setPriority + 0 311481/2 4790260420777 8 -> java/lang/Thread.nextThreadID + 0 311481/2 4790260420785 8 <- java/lang/Thread.nextThreadID + 0 311481/2 4790260420793 7 <- java/lang/Thread.init + 0 311481/2 4790260420801 7 <- java/lang/Thread.<init> + 0 311481/2 4790260420810 9 -> java/lang/ThreadGroup.add + 0 311481/2 4790260420819 8 <- java/lang/ThreadGroup.add + 0 311481/2 4790260420834 15 -> java/lang/Shutdown.shutdown + 0 311481/2 4790260420846 12 -> java/lang/Shutdown.sequence + 0 311481/2 4790260420855 9 -> java/lang/Shutdown.runHooks + 0 311481/2 4790260420867 11 -> java/util/AbstractList.iterator + 0 311481/2 4790260421144 277 -> java/util/AbstractList$Itr.<init> + 0 311481/2 4790260421156 12 -> java/util/AbstractList$Itr.<init> + 0 311481/2 4790260421168 11 -> java/lang/Object.<init> + 0 311481/2 4790260421175 7 <- java/lang/Object.<init> + 0 311481/2 4790260421189 13 <- java/util/AbstractList$Itr.<init> + 0 311481/2 4790260421197 7 <- java/util/AbstractList$Itr.<init> + 0 311481/2 4790260421205 7 <- java/util/AbstractList.iterator + 0 311481/2 4790260421218 13 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260421229 11 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260421240 10 -> java/util/AbstractList$Itr.next + 0 311481/2 4790260421249 9 -> java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260421256 7 <- java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260421267 10 -> java/util/ArrayList.get + 0 311481/2 4790260421274 7 -> java/util/ArrayList.RangeCheck + 0 311481/2 4790260421282 7 <- java/util/ArrayList.RangeCheck + 0 311481/2 4790260421290 7 <- java/util/ArrayList.get + 0 311481/2 4790260421297 7 <- java/util/AbstractList$Itr.next + 0 311481/2 4790260421310 12 -> java/io/Console$1$1.run + 0 311481/2 4790260421321 10 -> java/io/Console.access$600 + 0 311481/2 4790260421330 9 <- java/io/Console.access$600 + 0 311481/2 4790260421338 7 <- java/io/Console$1$1.run + 0 311481/2 4790260421346 7 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260421353 7 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260421361 7 -> java/util/AbstractList$Itr.next + 0 311481/2 4790260421368 7 -> java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260421376 7 <- java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260421384 8 -> java/util/ArrayList.get + 0 311481/2 4790260421391 7 -> java/util/ArrayList.RangeCheck + 0 311481/2 4790260421398 7 <- java/util/ArrayList.RangeCheck + 0 311481/2 4790260421406 7 <- java/util/ArrayList.get + 0 311481/2 4790260421414 7 <- java/util/AbstractList$Itr.next + 0 311481/2 4790260421422 8 -> java/lang/ApplicationShutdownHooks.run + 0 311481/2 4790260421435 13 -> java/util/IdentityHashMap.keySet + 0 311481/2 4790260421598 163 -> java/util/IdentityHashMap$KeySet.<init> + 0 311481/2 4790260421610 11 -> java/util/IdentityHashMap$KeySet.<init> + 0 311481/2 4790260421622 11 -> java/util/AbstractSet.<init> + 0 311481/2 4790260421629 7 -> java/util/AbstractCollection.<init> + 0 311481/2 4790260421637 7 -> java/lang/Object.<init> + 0 311481/2 4790260421644 7 <- java/lang/Object.<init> + 0 311481/2 4790260421652 8 <- java/util/AbstractCollection.<init> + 0 311481/2 4790260421660 7 <- java/util/AbstractSet.<init> + 0 311481/2 4790260421668 7 <- java/util/IdentityHashMap$KeySet.<init> + 0 311481/2 4790260421675 7 <- java/util/IdentityHashMap$KeySet.<init> + 0 311481/2 4790260421683 7 <- java/util/IdentityHashMap.keySet + 0 311481/2 4790260421695 11 -> java/util/IdentityHashMap$KeySet.iterator + 0 311481/2 4790260421882 187 -> java/util/IdentityHashMap$KeyIterator.<init> + 0 311481/2 4790260421894 11 -> java/util/IdentityHashMap$KeyIterator.<init> + 0 311481/2 4790260421905 11 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311481/2 4790260421915 10 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311481/2 4790260421926 10 -> java/lang/Object.<init> + 0 311481/2 4790260421934 7 <- java/lang/Object.<init> + 0 311481/2 4790260421945 11 -> java/util/IdentityHashMap.access$000 + 0 311481/2 4790260421954 8 <- java/util/IdentityHashMap.access$000 + 0 311481/2 4790260421967 12 -> java/util/IdentityHashMap.access$200 + 0 311481/2 4790260421975 8 <- java/util/IdentityHashMap.access$200 + 0 311481/2 4790260421986 10 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311481/2 4790260421994 8 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311481/2 4790260422002 7 <- java/util/IdentityHashMap$KeyIterator.<init> + 0 311481/2 4790260422010 7 <- java/util/IdentityHashMap$KeyIterator.<init> + 0 311481/2 4790260422018 7 <- java/util/IdentityHashMap$KeySet.iterator + 0 311481/2 4790260422029 11 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311481/2 4790260422037 8 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311481/2 4790260422045 8 -> java/util/IdentityHashMap$KeySet.iterator + 0 311481/2 4790260422053 7 -> java/util/IdentityHashMap$KeyIterator.<init> + 0 311481/2 4790260422060 7 -> java/util/IdentityHashMap$KeyIterator.<init> + 0 311481/2 4790260422068 7 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311481/2 4790260422075 7 -> java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311481/2 4790260422083 7 -> java/lang/Object.<init> + 0 311481/2 4790260422090 7 <- java/lang/Object.<init> + 0 311481/2 4790260422098 8 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311481/2 4790260422106 8 <- java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 0 311481/2 4790260422114 7 <- java/util/IdentityHashMap$KeyIterator.<init> + 0 311481/2 4790260422121 7 <- java/util/IdentityHashMap$KeyIterator.<init> + 0 311481/2 4790260422129 7 <- java/util/IdentityHashMap$KeySet.iterator + 0 311481/2 4790260422137 7 -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311481/2 4790260422145 7 <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 0 311481/2 4790260422153 8 <- java/lang/ApplicationShutdownHooks.run + 0 311481/2 4790260422161 7 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260422168 7 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260422176 7 -> java/util/AbstractList$Itr.next + 0 311481/2 4790260422183 7 -> java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260422191 7 <- java/util/AbstractList$Itr.checkForComodification + 0 311481/2 4790260422199 8 -> java/util/ArrayList.get + 0 311481/2 4790260422206 7 -> java/util/ArrayList.RangeCheck + 0 311481/2 4790260422213 7 <- java/util/ArrayList.RangeCheck + 0 311481/2 4790260422221 7 <- java/util/ArrayList.get + 0 311481/2 4790260422229 7 <- java/util/AbstractList$Itr.next + 0 311481/2 4790260422237 8 -> java/io/File$1.run + 0 311481/2 4790260422318 81 -> java/io/DeleteOnExitHook.<clinit> + 0 311481/2 4790260422461 143 -> java/util/LinkedHashSet.<init> + 0 311481/2 4790260422473 12 -> java/util/HashSet.<init> + 0 311481/2 4790260422481 7 -> java/util/AbstractSet.<init> + 0 311481/2 4790260422488 7 -> java/util/AbstractCollection.<init> + 0 311481/2 4790260422495 7 -> java/lang/Object.<init> + 0 311481/2 4790260422502 7 <- java/lang/Object.<init> + 0 311481/2 4790260422511 8 <- java/util/AbstractCollection.<init> + 0 311481/2 4790260422519 7 <- java/util/AbstractSet.<init> + 0 311481/2 4790260422531 12 -> java/util/LinkedHashMap.<init> + 0 311481/2 4790260422541 10 -> java/util/HashMap.<init> + 0 311481/2 4790260422549 7 -> java/util/AbstractMap.<init> + 0 311481/2 4790260422556 7 -> java/lang/Object.<init> + 0 311481/2 4790260422563 7 <- java/lang/Object.<init> + 0 311481/2 4790260422571 7 <- java/util/AbstractMap.<init> + 0 311481/2 4790260422580 9 -> java/lang/Float.isNaN + 0 311481/2 4790260422588 7 <- java/lang/Float.isNaN + 0 311481/2 4790260422600 12 -> java/util/LinkedHashMap.init + 0 311481/2 4790260422608 8 -> java/util/LinkedHashMap$Entry.<init> + 0 311481/2 4790260422615 7 -> java/util/HashMap$Entry.<init> + 0 311481/2 4790260422623 7 -> java/lang/Object.<init> + 0 311481/2 4790260422630 6 <- java/lang/Object.<init> + 0 311481/2 4790260422638 7 <- java/util/HashMap$Entry.<init> + 0 311481/2 4790260422645 7 <- java/util/LinkedHashMap$Entry.<init> + 0 311481/2 4790260422653 7 <- java/util/LinkedHashMap.init + 0 311481/2 4790260422660 7 <- java/util/HashMap.<init> + 0 311481/2 4790260422668 7 <- java/util/LinkedHashMap.<init> + 0 311481/2 4790260422676 7 <- java/util/HashSet.<init> + 0 311481/2 4790260422683 7 <- java/util/LinkedHashSet.<init> + 0 311481/2 4790260422692 9 <- java/io/DeleteOnExitHook.<clinit> + 0 311481/2 4790260422703 10 -> java/io/DeleteOnExitHook.hook + 0 311481/2 4790260422713 10 -> java/io/DeleteOnExitHook.<init> + 0 311481/2 4790260422723 9 -> java/lang/Object.<init> + 0 311481/2 4790260422730 7 <- java/lang/Object.<init> + 0 311481/2 4790260422738 7 <- java/io/DeleteOnExitHook.<init> + 0 311481/2 4790260422746 7 <- java/io/DeleteOnExitHook.hook + 0 311481/2 4790260422756 10 -> java/io/DeleteOnExitHook.run + 0 311481/2 4790260422768 12 -> java/util/ArrayList.<init> + 0 311481/2 4790260422775 7 -> java/util/AbstractList.<init> + 0 311481/2 4790260422783 7 -> java/util/AbstractCollection.<init> + 0 311481/2 4790260422790 7 -> java/lang/Object.<init> + 0 311481/2 4790260422797 7 <- java/lang/Object.<init> + 0 311481/2 4790260422805 7 <- java/util/AbstractCollection.<init> + 0 311481/2 4790260422813 7 <- java/util/AbstractList.<init> + 0 311481/2 4790260422824 11 -> java/util/AbstractCollection.toArray + 0 311481/2 4790260422835 10 -> java/util/HashSet.size + 0 311481/2 4790260422844 9 <- java/util/HashSet.size + 0 311481/2 4790260422855 10 -> java/util/HashSet.iterator + 0 311481/2 4790260422865 9 -> java/util/HashMap.keySet + 0 311481/2 4790260422956 91 -> java/util/HashMap$KeySet.<init> + 0 311481/2 4790260422967 10 -> java/util/HashMap$KeySet.<init> + 0 311481/2 4790260422978 10 -> java/util/AbstractSet.<init> + 0 311481/2 4790260422985 7 -> java/util/AbstractCollection.<init> + 0 311481/2 4790260422993 7 -> java/lang/Object.<init> + 0 311481/2 4790260423000 7 <- java/lang/Object.<init> + 0 311481/2 4790260423008 7 <- java/util/AbstractCollection.<init> + 0 311481/2 4790260423015 7 <- java/util/AbstractSet.<init> + 0 311481/2 4790260423023 7 <- java/util/HashMap$KeySet.<init> + 0 311481/2 4790260423031 7 <- java/util/HashMap$KeySet.<init> + 0 311481/2 4790260423038 7 <- java/util/HashMap.keySet + 0 311481/2 4790260423049 10 -> java/util/HashMap$KeySet.iterator + 0 311481/2 4790260423060 11 -> java/util/LinkedHashMap.newKeyIterator + 0 311481/2 4790260423243 182 -> java/util/LinkedHashMap$KeyIterator.<init> + 0 311481/2 4790260423254 11 -> java/util/LinkedHashMap$KeyIterator.<init> + 0 311481/2 4790260423266 11 -> java/util/LinkedHashMap$LinkedHashIterator.<init> + 0 311481/2 4790260423276 9 -> java/util/LinkedHashMap$LinkedHashIterator.<init> + 0 311481/2 4790260423286 10 -> java/lang/Object.<init> + 0 311481/2 4790260423294 7 <- java/lang/Object.<init> + 0 311481/2 4790260423311 16 <- java/util/LinkedHashMap$LinkedHashIterator.<init> + 0 311481/2 4790260423319 8 <- java/util/LinkedHashMap$LinkedHashIterator.<init> + 0 311481/2 4790260423327 7 <- java/util/LinkedHashMap$KeyIterator.<init> + 0 311481/2 4790260423334 7 <- java/util/LinkedHashMap$KeyIterator.<init> + 0 311481/2 4790260423342 7 <- java/util/LinkedHashMap.newKeyIterator + 0 311481/2 4790260423350 7 <- java/util/HashMap$KeySet.iterator + 0 311481/2 4790260423357 7 <- java/util/HashSet.iterator + 0 311481/2 4790260423369 11 -> java/util/LinkedHashMap$LinkedHashIterator.hasNext + 0 311481/2 4790260423377 8 <- java/util/LinkedHashMap$LinkedHashIterator.hasNext + 0 311481/2 4790260423385 8 <- java/util/AbstractCollection.toArray + 0 311481/2 4790260423393 8 -> java/lang/Object.getClass + 0 311481/2 4790260423402 8 <- java/lang/Object.getClass + 0 311481/2 4790260423410 8 <- java/util/ArrayList.<init> + 0 311481/2 4790260423422 11 -> java/util/Collections.reverse + 0 311481/2 4790260423435 13 <- java/util/Collections.reverse + 0 311481/2 4790260423445 10 -> java/util/AbstractList.iterator + 0 311481/2 4790260423453 8 -> java/util/AbstractList$Itr.<init> + 0 311481/2 4790260423460 7 -> java/util/AbstractList$Itr.<init> + 0 311481/2 4790260423468 7 -> java/lang/Object.<init> + 0 311481/2 4790260423475 7 <- java/lang/Object.<init> + 0 311481/2 4790260423483 7 <- java/util/AbstractList$Itr.<init> + 0 311481/2 4790260423490 7 <- java/util/AbstractList$Itr.<init> + 0 311481/2 4790260423498 7 <- java/util/AbstractList.iterator + 0 311481/2 4790260423508 10 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260423516 7 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260423524 8 <- java/io/DeleteOnExitHook.run + 0 311481/2 4790260423532 7 <- java/io/File$1.run + 0 311481/2 4790260423539 7 -> java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260423547 7 <- java/util/AbstractList$Itr.hasNext + 0 311481/2 4790260423554 7 <- java/lang/Shutdown.runHooks + 0 311481/2 4790260423564 9 <- java/lang/Shutdown.sequence + 0 311481/2 4790260423572 7 <- java/lang/Shutdown.shutdown + +I truncated 22800 lines from the above output to make it fit here. + +The fifth column is indented by 2 spaces to show when a new method begins. +This shows which method is calling which. + +The TIME(us) column shows time since boot. + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. + +The FILE column shows file that was being executed. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +Try skimming down the "DELTA(us)" column to find the largest delta time, +and see what lines it corresponds with. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + +If you see "drops" warnings, see the Notes/ALLjava_notes.txt file for details. + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_methodcalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_methodcalls_example.txt new file mode 100644 index 000000000000..22a2b4d1a7e9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_methodcalls_example.txt @@ -0,0 +1,999 @@ +The following are examples of running the j_methodcalls.d script. + +This traces calls to methods from all Java processes on the system with hotspot +provider support (1.6.0). Method calls are only visible when using the flag +"+ExtendedDTraceProbes". eg, java -XX:+ExtendedDTraceProbes classfile + +Here we see it running on Code/Java/Func_abc + +# j_methodcalls_example.txt +Tracing... Hit Ctrl-C to end. + + PID COUNT CLASS.METHOD + 311492 1 Func_abc.func_a + 311492 1 Func_abc.func_b + 311492 1 Func_abc.func_c + 311492 1 Func_abc.main + 311492 1 java/io/BufferedInputStream.<clinit> + 311492 1 java/io/BufferedReader.<clinit> + 311492 1 java/io/BufferedReader.close + 311492 1 java/io/BufferedWriter.<clinit> + 311492 1 java/io/Console$1$1.<init> + 311492 1 java/io/Console$1$1.run + 311492 1 java/io/Console$1.<init> + 311492 1 java/io/Console$1.consoleRestoreHook + 311492 1 java/io/Console.<clinit> + 311492 1 java/io/Console.access$600 + 311492 1 java/io/DataInputStream.<init> + 311492 1 java/io/DataInputStream.readFully + 311492 1 java/io/DeleteOnExitHook.<clinit> + 311492 1 java/io/DeleteOnExitHook.<init> + 311492 1 java/io/DeleteOnExitHook.hook + 311492 1 java/io/DeleteOnExitHook.run + 311492 1 java/io/File$1.<init> + 311492 1 java/io/File$1.run + 311492 1 java/io/File.<clinit> + 311492 1 java/io/File.lastModified + 311492 1 java/io/File.length + 311492 1 java/io/FileDescriptor.<clinit> + 311492 1 java/io/FileDescriptor.initIDs + 311492 1 java/io/FileInputStream.<clinit> + 311492 1 java/io/FileInputStream.available + 311492 1 java/io/FileInputStream.initIDs + 311492 1 java/io/FileOutputStream.<clinit> + 311492 1 java/io/FileOutputStream.initIDs + 311492 1 java/io/FilePermission.newPermissionCollection + 311492 1 java/io/FilePermissionCollection.<clinit> + 311492 1 java/io/FilePermissionCollection.<init> + 311492 1 java/io/FilePermissionCollection.add + 311492 1 java/io/FileReader.<init> + 311492 1 java/io/FileSystem.<clinit> + 311492 1 java/io/FileSystem.<init> + 311492 1 java/io/FileSystem.getFileSystem + 311492 1 java/io/FilterInputStream.close + 311492 1 java/io/InputStreamReader.<init> + 311492 1 java/io/InputStreamReader.close + 311492 1 java/io/ObjectStreamClass.<clinit> + 311492 1 java/io/ObjectStreamClass.initNative + 311492 1 java/io/UnixFileSystem.<clinit> + 311492 1 java/io/UnixFileSystem.<init> + 311492 1 java/io/UnixFileSystem.getLastModifiedTime + 311492 1 java/io/UnixFileSystem.getLength + 311492 1 java/io/UnixFileSystem.initIDs + 311492 1 java/lang/AbstractStringBuilder.<clinit> + 311492 1 java/lang/ApplicationShutdownHooks.<clinit> + 311492 1 java/lang/ApplicationShutdownHooks.<init> + 311492 1 java/lang/ApplicationShutdownHooks.hook + 311492 1 java/lang/ApplicationShutdownHooks.run + 311492 1 java/lang/Boolean.<clinit> + 311492 1 java/lang/Byte.<clinit> + 311492 1 java/lang/Character.<clinit> + 311492 1 java/lang/CharacterDataLatin1.<clinit> + 311492 1 java/lang/Class.<clinit> + 311492 1 java/lang/Class.access$302 + 311492 1 java/lang/Class.registerNatives + 311492 1 java/lang/ClassLoader$3.<init> + 311492 1 java/lang/ClassLoader$3.run + 311492 1 java/lang/ClassLoader$NativeLibrary.<init> + 311492 1 java/lang/ClassLoader$NativeLibrary.getFromClass + 311492 1 java/lang/ClassLoader$NativeLibrary.load + 311492 1 java/lang/ClassLoader.<clinit> + 311492 1 java/lang/ClassLoader.access$100 + 311492 1 java/lang/ClassLoader.addClass + 311492 1 java/lang/ClassLoader.checkCerts + 311492 1 java/lang/ClassLoader.defineClass + 311492 1 java/lang/ClassLoader.defineClass1 + 311492 1 java/lang/ClassLoader.defineClassSourceLocation + 311492 1 java/lang/ClassLoader.getSystemClassLoader + 311492 1 java/lang/ClassLoader.initSystemClassLoader + 311492 1 java/lang/ClassLoader.loadLibrary + 311492 1 java/lang/ClassLoader.loadLibrary0 + 311492 1 java/lang/ClassLoader.postDefineClass + 311492 1 java/lang/ClassLoader.preDefineClass + 311492 1 java/lang/ClassLoader.registerNatives + 311492 1 java/lang/Compiler$1.<init> + 311492 1 java/lang/Compiler$1.run + 311492 1 java/lang/Compiler.<clinit> + 311492 1 java/lang/Compiler.registerNatives + 311492 1 java/lang/Double.<clinit> + 311492 1 java/lang/Double.doubleToLongBits + 311492 1 java/lang/Double.doubleToRawLongBits + 311492 1 java/lang/Error.<init> + 311492 1 java/lang/Float.<clinit> + 311492 1 java/lang/Float.floatToIntBits + 311492 1 java/lang/Float.floatToRawIntBits + 311492 1 java/lang/IncompatibleClassChangeError.<init> + 311492 1 java/lang/Integer.<clinit> + 311492 1 java/lang/LinkageError.<init> + 311492 1 java/lang/Long.<clinit> + 311492 1 java/lang/Math.<clinit> + 311492 1 java/lang/NoSuchMethodError.<init> + 311492 1 java/lang/Object.<clinit> + 311492 1 java/lang/Object.notifyAll + 311492 1 java/lang/Object.registerNatives + 311492 1 java/lang/Runtime.<clinit> + 311492 1 java/lang/Runtime.<init> + 311492 1 java/lang/Runtime.loadLibrary0 + 311492 1 java/lang/Runtime.maxMemory + 311492 1 java/lang/Short.<clinit> + 311492 1 java/lang/Shutdown.<clinit> + 311492 1 java/lang/Shutdown.runHooks + 311492 1 java/lang/Shutdown.sequence + 311492 1 java/lang/Shutdown.shutdown + 311492 1 java/lang/String.<clinit> + 311492 1 java/lang/String.checkBounds + 311492 1 java/lang/String.length + 311492 1 java/lang/String.trim + 311492 1 java/lang/StringBuffer.<clinit> + 311492 1 java/lang/StringCoding$StringDecoder.decode + 311492 1 java/lang/StringCoding.<clinit> + 311492 1 java/lang/StringCoding.access$000 + 311492 1 java/lang/StringCoding.access$100 + 311492 1 java/lang/StringCoding.decode + 311492 1 java/lang/StringCoding.deref + 311492 1 java/lang/StringCoding.lookupCharset + 311492 1 java/lang/StringCoding.safeTrim + 311492 1 java/lang/StringCoding.scale + 311492 1 java/lang/StringCoding.set + 311492 1 java/lang/System$2.<init> + 311492 1 java/lang/System.<clinit> + 311492 1 java/lang/System.getCallerClass + 311492 1 java/lang/System.initProperties + 311492 1 java/lang/System.initializeSystemClass + 311492 1 java/lang/System.loadLibrary + 311492 1 java/lang/System.mapLibraryName + 311492 1 java/lang/System.nullInputStream + 311492 1 java/lang/System.registerNatives + 311492 1 java/lang/System.setErr0 + 311492 1 java/lang/System.setIn0 + 311492 1 java/lang/System.setOut0 + 311492 1 java/lang/SystemClassLoaderAction.<init> + 311492 1 java/lang/SystemClassLoaderAction.run + 311492 1 java/lang/Terminator$1.<init> + 311492 1 java/lang/Terminator.<clinit> + 311492 1 java/lang/Terminator.setup + 311492 1 java/lang/Thread.<clinit> + 311492 1 java/lang/Thread.exit + 311492 1 java/lang/Thread.getPriority + 311492 1 java/lang/Thread.interrupted + 311492 1 java/lang/Thread.isInterrupted + 311492 1 java/lang/Thread.registerNatives + 311492 1 java/lang/Thread.setContextClassLoader + 311492 1 java/lang/ThreadGroup.remove + 311492 1 java/lang/ThreadLocal$ThreadLocalMap$Entry.<init> + 311492 1 java/lang/ThreadLocal$ThreadLocalMap.<init> + 311492 1 java/lang/ThreadLocal$ThreadLocalMap.access$100 + 311492 1 java/lang/ThreadLocal$ThreadLocalMap.set + 311492 1 java/lang/ThreadLocal$ThreadLocalMap.setThreshold + 311492 1 java/lang/ThreadLocal.<clinit> + 311492 1 java/lang/ThreadLocal.createMap + 311492 1 java/lang/ThreadLocal.get + 311492 1 java/lang/ThreadLocal.initialValue + 311492 1 java/lang/ThreadLocal.set + 311492 1 java/lang/ThreadLocal.setInitialValue + 311492 1 java/lang/ref/Finalizer$FinalizerThread.<init> + 311492 1 java/lang/ref/Finalizer$FinalizerThread.run + 311492 1 java/lang/ref/Finalizer.<clinit> + 311492 1 java/lang/ref/Finalizer.access$000 + 311492 1 java/lang/ref/Reference$ReferenceHandler.<init> + 311492 1 java/lang/ref/Reference$ReferenceHandler.run + 311492 1 java/lang/ref/Reference.<clinit> + 311492 1 java/lang/ref/Reference.access$200 + 311492 1 java/lang/ref/ReferenceQueue.<clinit> + 311492 1 java/lang/ref/ReferenceQueue.reallyPoll + 311492 1 java/lang/reflect/AccessibleObject.<clinit> + 311492 1 java/lang/reflect/Constructor.<clinit> + 311492 1 java/lang/reflect/Field.<clinit> + 311492 1 java/lang/reflect/Field.getName + 311492 1 java/lang/reflect/Method.<clinit> + 311492 1 java/lang/reflect/Method.getModifiers + 311492 1 java/lang/reflect/Modifier.<clinit> + 311492 1 java/lang/reflect/Modifier.isVolatile + 311492 1 java/lang/reflect/ReflectAccess.<init> + 311492 1 java/lang/reflect/ReflectPermission.<init> + 311492 1 java/net/ContentHandler.<init> + 311492 1 java/net/Parts.getQuery + 311492 1 java/net/URL.<clinit> + 311492 1 java/net/URL.openConnection + 311492 1 java/net/URLClassLoader$7.<init> + 311492 1 java/net/URLClassLoader.<clinit> + 311492 1 java/net/URLClassLoader.access$000 + 311492 1 java/net/URLClassLoader.defineClass + 311492 1 java/net/URLClassLoader.getPermissions + 311492 1 java/net/URLConnection.<clinit> + 311492 1 java/net/URLConnection.<init> + 311492 1 java/net/UnknownContentHandler.<init> + 311492 1 java/nio/Bits.<clinit> + 311492 1 java/nio/ByteOrder.<clinit> + 311492 1 java/nio/charset/Charset.<clinit> + 311492 1 java/nio/charset/Charset.<init> + 311492 1 java/nio/charset/CharsetDecoder.<clinit> + 311492 1 java/nio/charset/CharsetDecoder.flush + 311492 1 java/nio/charset/CharsetDecoder.implFlush + 311492 1 java/nio/charset/CharsetEncoder.<clinit> + 311492 1 java/nio/charset/CoderResult$1.<init> + 311492 1 java/nio/charset/CoderResult$2.<init> + 311492 1 java/nio/charset/CoderResult.<clinit> + 311492 1 java/nio/charset/CodingErrorAction.<clinit> + 311492 1 java/nio/charset/spi/CharsetProvider.<init> + 311492 1 java/security/AccessControlContext.<clinit> + 311492 1 java/security/BasicPermission.newPermissionCollection + 311492 1 java/security/BasicPermissionCollection.<clinit> + 311492 1 java/security/BasicPermissionCollection.<init> + 311492 1 java/security/BasicPermissionCollection.add + 311492 1 java/security/CodeSource.<init> + 311492 1 java/security/Permissions.<clinit> + 311492 1 java/security/Policy$UnsupportedEmptyCollection.<init> + 311492 1 java/security/Policy.<clinit> + 311492 1 java/security/PrivilegedActionException.<init> + 311492 1 java/security/ProtectionDomain.<clinit> + 311492 1 java/security/ProtectionDomain.<init> + 311492 1 java/security/SecureClassLoader.<clinit> + 311492 1 java/security/SecureClassLoader.check + 311492 1 java/security/SecureClassLoader.defineClass + 311492 1 java/security/SecureClassLoader.getPermissions + 311492 1 java/security/SecureClassLoader.getProtectionDomain + 311492 1 java/util/AbstractCollection.toArray + 311492 1 java/util/BitSet.<clinit> + 311492 1 java/util/BitSet.<init> + 311492 1 java/util/BitSet.initWords + 311492 1 java/util/Collections$SynchronizedMap.<init> + 311492 1 java/util/Collections.<clinit> + 311492 1 java/util/Collections.reverse + 311492 1 java/util/Collections.synchronizedMap + 311492 1 java/util/HashMap$KeySet.iterator + 311492 1 java/util/HashMap.keySet + 311492 1 java/util/HashMap.size + 311492 1 java/util/HashSet.<clinit> + 311492 1 java/util/HashSet.iterator + 311492 1 java/util/HashSet.size + 311492 1 java/util/Hashtable$EmptyEnumerator.<init> + 311492 1 java/util/Hashtable$EmptyIterator.<init> + 311492 1 java/util/Hashtable.<clinit> + 311492 1 java/util/IdentityHashMap.<clinit> + 311492 1 java/util/IdentityHashMap.<init> + 311492 1 java/util/IdentityHashMap.access$000 + 311492 1 java/util/IdentityHashMap.access$200 + 311492 1 java/util/IdentityHashMap.init + 311492 1 java/util/IdentityHashMap.keySet + 311492 1 java/util/LinkedHashMap$LinkedHashIterator.hasNext + 311492 1 java/util/LinkedHashMap.newKeyIterator + 311492 1 java/util/LinkedHashSet.<init> + 311492 1 java/util/Locale.<clinit> + 311492 1 java/util/Locale.getInstance + 311492 1 java/util/Properties.<clinit> + 311492 1 java/util/StringTokenizer.countTokens + 311492 1 java/util/StringTokenizer.hasMoreTokens + 311492 1 java/util/Vector.contains + 311492 1 java/util/Vector.copyInto + 311492 1 java/util/Vector.indexOf + 311492 1 java/util/concurrent/ConcurrentHashMap$Segment.get + 311492 1 java/util/concurrent/ConcurrentHashMap$Segment.getFirst + 311492 1 java/util/concurrent/ConcurrentHashMap$Segment.newArray + 311492 1 java/util/concurrent/ConcurrentHashMap.get + 311492 1 java/util/concurrent/atomic/AtomicInteger.<clinit> + 311492 1 java/util/concurrent/atomic/AtomicInteger.<init> + 311492 1 java/util/concurrent/atomic/AtomicInteger.get + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<clinit> + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<init> + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater.<init> + 311492 1 java/util/concurrent/atomic/AtomicReferenceFieldUpdater.newUpdater + 311492 1 java/util/concurrent/locks/AbstractQueuedSynchronizer.<clinit> + 311492 1 java/util/concurrent/locks/AbstractQueuedSynchronizer.getState + 311492 1 java/util/jar/JarEntry.<init> + 311492 1 java/util/jar/JarFile$JarFileEntry.<init> + 311492 1 java/util/jar/JarFile.<clinit> + 311492 1 java/util/jar/JarFile.getManEntry + 311492 1 java/util/jar/JarFile.hasClassPathAttribute + 311492 1 java/util/jar/JarFile.isKnownToNotHaveClassPathAttribute + 311492 1 java/util/jar/JavaUtilJarAccessImpl.<init> + 311492 1 java/util/jar/JavaUtilJarAccessImpl.jarFileHasClassPathAttribute + 311492 1 java/util/zip/Inflater.<clinit> + 311492 1 java/util/zip/Inflater.<init> + 311492 1 java/util/zip/Inflater.finished + 311492 1 java/util/zip/Inflater.init + 311492 1 java/util/zip/Inflater.initIDs + 311492 1 java/util/zip/Inflater.needsDictionary + 311492 1 java/util/zip/Inflater.needsInput + 311492 1 java/util/zip/Inflater.setInput + 311492 1 java/util/zip/InflaterInputStream.<init> + 311492 1 java/util/zip/InflaterInputStream.ensureOpen + 311492 1 java/util/zip/InflaterInputStream.read + 311492 1 java/util/zip/ZipEntry.<clinit> + 311492 1 java/util/zip/ZipEntry.getSize + 311492 1 java/util/zip/ZipEntry.initFields + 311492 1 java/util/zip/ZipEntry.initIDs + 311492 1 java/util/zip/ZipFile$1.<init> + 311492 1 java/util/zip/ZipFile$1.close + 311492 1 java/util/zip/ZipFile$1.fill + 311492 1 java/util/zip/ZipFile$ZipFileInputStream.<init> + 311492 1 java/util/zip/ZipFile$ZipFileInputStream.read + 311492 1 java/util/zip/ZipFile.<clinit> + 311492 1 java/util/zip/ZipFile.<init> + 311492 1 java/util/zip/ZipFile.access$000 + 311492 1 java/util/zip/ZipFile.access$1000 + 311492 1 java/util/zip/ZipFile.access$1100 + 311492 1 java/util/zip/ZipFile.access$1200 + 311492 1 java/util/zip/ZipFile.access$800 + 311492 1 java/util/zip/ZipFile.access$900 + 311492 1 java/util/zip/ZipFile.ensureOpenOrZipException + 311492 1 java/util/zip/ZipFile.getCSize + 311492 1 java/util/zip/ZipFile.getInflater + 311492 1 java/util/zip/ZipFile.getMethod + 311492 1 java/util/zip/ZipFile.getTotal + 311492 1 java/util/zip/ZipFile.initIDs + 311492 1 java/util/zip/ZipFile.open + 311492 1 java/util/zip/ZipFile.read + 311492 1 java/util/zip/ZipFile.releaseInflater + 311492 1 sun/misc/ExtensionDependency.checkExtensionsDependencies + 311492 1 sun/misc/FileURLMapper.<init> + 311492 1 sun/misc/FileURLMapper.exists + 311492 1 sun/misc/JarIndex.getJarIndex + 311492 1 sun/misc/Launcher$AppClassLoader$1.<init> + 311492 1 sun/misc/Launcher$AppClassLoader$1.run + 311492 1 sun/misc/Launcher$AppClassLoader.<clinit> + 311492 1 sun/misc/Launcher$AppClassLoader.<init> + 311492 1 sun/misc/Launcher$AppClassLoader.getAppClassLoader + 311492 1 sun/misc/Launcher$AppClassLoader.getPermissions + 311492 1 sun/misc/Launcher$ExtClassLoader$1.<init> + 311492 1 sun/misc/Launcher$ExtClassLoader$1.run + 311492 1 sun/misc/Launcher$ExtClassLoader.<init> + 311492 1 sun/misc/Launcher$ExtClassLoader.getExtClassLoader + 311492 1 sun/misc/Launcher$ExtClassLoader.getExtDirs + 311492 1 sun/misc/Launcher$ExtClassLoader.getExtURLs + 311492 1 sun/misc/Launcher$Factory.<clinit> + 311492 1 sun/misc/Launcher.<clinit> + 311492 1 sun/misc/Launcher.<init> + 311492 1 sun/misc/Launcher.access$200 + 311492 1 sun/misc/Launcher.access$300 + 311492 1 sun/misc/Launcher.getClassPath + 311492 1 sun/misc/Launcher.getLauncher + 311492 1 sun/misc/Launcher.pathToURLs + 311492 1 sun/misc/MetaIndex.<clinit> + 311492 1 sun/misc/Resource.<init> + 311492 1 sun/misc/Resource.getByteBuffer + 311492 1 sun/misc/Resource.getBytes + 311492 1 sun/misc/Resource.getCodeSigners + 311492 1 sun/misc/SharedSecrets.<clinit> + 311492 1 sun/misc/SharedSecrets.getJavaIOAccess + 311492 1 sun/misc/SharedSecrets.getJavaIODeleteOnExitAccess + 311492 1 sun/misc/SharedSecrets.javaUtilJarAccess + 311492 1 sun/misc/SharedSecrets.setJavaIOAccess + 311492 1 sun/misc/SharedSecrets.setJavaIODeleteOnExitAccess + 311492 1 sun/misc/SharedSecrets.setJavaLangAccess + 311492 1 sun/misc/SharedSecrets.setJavaNetAccess + 311492 1 sun/misc/SharedSecrets.setJavaUtilJarAccess + 311492 1 sun/misc/Signal.<clinit> + 311492 1 sun/misc/SignalHandler.<clinit> + 311492 1 sun/misc/SoftCache.<init> + 311492 1 sun/misc/URLClassPath$FileLoader$1.<init> + 311492 1 sun/misc/URLClassPath$FileLoader$1.getCodeSourceURL + 311492 1 sun/misc/URLClassPath$FileLoader$1.getContentLength + 311492 1 sun/misc/URLClassPath$FileLoader$1.getInputStream + 311492 1 sun/misc/URLClassPath$FileLoader.<init> + 311492 1 sun/misc/URLClassPath$FileLoader.getResource + 311492 1 sun/misc/URLClassPath$JarLoader$1.<init> + 311492 1 sun/misc/URLClassPath$JarLoader$1.run + 311492 1 sun/misc/URLClassPath$JarLoader.access$502 + 311492 1 sun/misc/URLClassPath$JarLoader.access$600 + 311492 1 sun/misc/URLClassPath$JarLoader.access$702 + 311492 1 sun/misc/URLClassPath$JarLoader.getJarFile + 311492 1 sun/misc/URLClassPath$JarLoader.parseExtensionsDependencies + 311492 1 sun/misc/URLClassPath$Loader.getClassPath + 311492 1 sun/misc/URLClassPath.<clinit> + 311492 1 sun/misc/URLClassPath.access$300 + 311492 1 sun/misc/Unsafe.<clinit> + 311492 1 sun/misc/Unsafe.<init> + 311492 1 sun/misc/Unsafe.allocateMemory + 311492 1 sun/misc/Unsafe.ensureClassInitialized + 311492 1 sun/misc/Unsafe.freeMemory + 311492 1 sun/misc/Unsafe.getByte + 311492 1 sun/misc/Unsafe.putLong + 311492 1 sun/misc/Unsafe.registerNatives + 311492 1 sun/misc/VM.<clinit> + 311492 1 sun/misc/VM.booted + 311492 1 sun/misc/VM.initialize + 311492 1 sun/misc/VM.initializeOSEnvironment + 311492 1 sun/misc/Version.<clinit> + 311492 1 sun/net/www/MessageHeader.<init> + 311492 1 sun/net/www/MessageHeader.grow + 311492 1 sun/net/www/ParseUtil.<clinit> + 311492 1 sun/net/www/URLConnection.<init> + 311492 1 sun/net/www/protocol/file/FileURLConnection.<clinit> + 311492 1 sun/net/www/protocol/file/FileURLConnection.<init> + 311492 1 sun/net/www/protocol/file/FileURLConnection.getPermission + 311492 1 sun/net/www/protocol/file/Handler.<init> + 311492 1 sun/net/www/protocol/file/Handler.createFileURLConnection + 311492 1 sun/nio/cs/FastCharsetProvider.<init> + 311492 1 sun/nio/cs/StandardCharsets$Aliases.init + 311492 1 sun/nio/cs/StandardCharsets$Cache.init + 311492 1 sun/nio/cs/StandardCharsets$Classes.init + 311492 1 sun/nio/cs/StandardCharsets.<clinit> + 311492 1 sun/nio/cs/StandardCharsets.<init> + 311492 1 sun/nio/cs/StreamDecoder.<clinit> + 311492 1 sun/nio/cs/StreamDecoder.close + 311492 1 sun/nio/cs/StreamDecoder.forInputStreamReader + 311492 1 sun/nio/cs/StreamDecoder.implClose + 311492 1 sun/nio/cs/StreamDecoder.inReady + 311492 1 sun/nio/cs/StreamEncoder.<clinit> + 311492 1 sun/nio/cs/Surrogate$Parser.<clinit> + 311492 1 sun/nio/cs/US_ASCII$Decoder.<clinit> + 311492 1 sun/nio/cs/US_ASCII$Encoder.<clinit> + 311492 1 sun/nio/cs/US_ASCII.<init> + 311492 1 sun/reflect/Reflection.<clinit> + 311492 1 sun/reflect/ReflectionFactory$1.<init> + 311492 1 sun/reflect/ReflectionFactory$1.run + 311492 1 sun/reflect/ReflectionFactory.<clinit> + 311492 1 sun/reflect/ReflectionFactory.<init> + 311492 1 sun/reflect/ReflectionFactory.access$202 + 311492 1 sun/reflect/ReflectionFactory.setLangReflectAccess + 311492 1 sun/reflect/misc/ReflectUtil.ensureMemberAccess + 311492 1 sun/security/provider/PolicyFile.<clinit> + 311492 1 sun/security/util/Debug.<clinit> + 311492 2 java/io/BufferedInputStream.<init> + 311492 2 java/io/BufferedOutputStream.<init> + 311492 2 java/io/BufferedReader.<init> + 311492 2 java/io/BufferedReader.fill + 311492 2 java/io/ExpiringCache$1.<init> + 311492 2 java/io/File.list + 311492 2 java/io/FileInputStream.close + 311492 2 java/io/FileInputStream.close0 + 311492 2 java/io/FileInputStream.open + 311492 2 java/io/FileOutputStream.<init> + 311492 2 java/io/FilePermission$1.<init> + 311492 2 java/io/FilePermission.<init> + 311492 2 java/io/FilePermission.getMask + 311492 2 java/io/FilePermission.init + 311492 2 java/io/FileSystem.getBooleanProperty + 311492 2 java/io/InputStreamReader.read + 311492 2 java/io/OutputStreamWriter.<init> + 311492 2 java/io/PrintStream.init + 311492 2 java/io/UnixFileSystem.list + 311492 2 java/lang/Character.charCount + 311492 2 java/lang/CharacterDataLatin1.toUpperCase + 311492 2 java/lang/Class$1.<init> + 311492 2 java/lang/Class$1.run + 311492 2 java/lang/Class.arrayContentsEq + 311492 2 java/lang/Class.getConstructor0 + 311492 2 java/lang/Class.getDeclaredConstructors0 + 311492 2 java/lang/Class.isInterface + 311492 2 java/lang/Class.privateGetDeclaredConstructors + 311492 2 java/lang/ClassLoader.<init> + 311492 2 java/lang/ClassLoader.initializePath + 311492 2 java/lang/ClassNotFoundException.<init> + 311492 2 java/lang/Object.clone + 311492 2 java/lang/Runtime.getRuntime + 311492 2 java/lang/String$CaseInsensitiveComparator.<init> + 311492 2 java/lang/String.concat + 311492 2 java/lang/String.regionMatches + 311492 2 java/lang/StringCoding$StringDecoder.<init> + 311492 2 java/lang/System.getProperties + 311492 2 java/lang/System.nullPrintStream + 311492 2 java/lang/System.setProperties + 311492 2 java/lang/Thread.isAlive + 311492 2 java/lang/Thread.setDaemon + 311492 2 java/lang/Thread.start + 311492 2 java/lang/Thread.start0 + 311492 2 java/lang/ThreadGroup.<init> + 311492 2 java/lang/ref/Reference$Lock.<init> + 311492 2 java/lang/ref/Reference.access$100 + 311492 2 java/lang/ref/ReferenceQueue.remove + 311492 2 java/lang/ref/SoftReference.get + 311492 2 java/lang/reflect/AccessibleObject.setAccessible + 311492 2 java/lang/reflect/AccessibleObject.setAccessible0 + 311492 2 java/lang/reflect/Constructor.<init> + 311492 2 java/lang/reflect/Constructor.acquireConstructorAccessor + 311492 2 java/lang/reflect/Constructor.copy + 311492 2 java/lang/reflect/Constructor.getParameterTypes + 311492 2 java/lang/reflect/Modifier.isAbstract + 311492 2 java/lang/reflect/Modifier.isProtected + 311492 2 java/lang/reflect/ReflectAccess.copyConstructor + 311492 2 java/net/URL.set + 311492 2 java/net/URLClassLoader$1.<init> + 311492 2 java/net/URLClassLoader$1.run + 311492 2 java/net/URLClassLoader.<init> + 311492 2 java/net/URLClassLoader.findClass + 311492 2 java/net/URLStreamHandler.parseURL + 311492 2 java/net/URLStreamHandler.setURL + 311492 2 java/nio/ByteOrder.<init> + 311492 2 java/nio/CharBuffer.allocate + 311492 2 java/nio/HeapByteBuffer.compact + 311492 2 java/nio/charset/Charset.cache + 311492 2 java/nio/charset/CharsetDecoder.reset + 311492 2 java/nio/charset/CharsetEncoder.isLegalReplacement + 311492 2 java/nio/charset/CharsetEncoder.onMalformedInput + 311492 2 java/nio/charset/CharsetEncoder.onUnmappableCharacter + 311492 2 java/nio/charset/CharsetEncoder.replaceWith + 311492 2 java/nio/charset/CoderResult.<init> + 311492 2 java/nio/charset/CoderResult.isError + 311492 2 java/security/AccessControlContext.<init> + 311492 2 java/security/BasicPermission.getCanonicalName + 311492 2 java/security/CodeSource.getCertificates + 311492 2 java/security/CodeSource.hashCode + 311492 2 java/security/PermissionCollection.setReadOnly + 311492 2 java/security/Permissions.<init> + 311492 2 java/security/Permissions.add + 311492 2 java/security/Permissions.getPermissionCollection + 311492 2 java/security/SecureClassLoader.<init> + 311492 2 java/util/AbstractList.iterator + 311492 2 java/util/BitSet.ensureCapacity + 311492 2 java/util/Collections$EmptyList.<init> + 311492 2 java/util/Collections$EmptyMap.<init> + 311492 2 java/util/Collections$EmptySet.<init> + 311492 2 java/util/Collections$ReverseComparator.<init> + 311492 2 java/util/HashMap$KeySet.<init> + 311492 2 java/util/IdentityHashMap$IdentityHashMapIterator.hasNext + 311492 2 java/util/IdentityHashMap$KeySet.<init> + 311492 2 java/util/IdentityHashMap$KeySet.iterator + 311492 2 java/util/LinkedHashMap$KeyIterator.<init> + 311492 2 java/util/LinkedHashMap$LinkedHashIterator.<init> + 311492 2 java/util/Properties.<init> + 311492 2 java/util/StringTokenizer.setMaxDelimCodePoint + 311492 2 java/util/concurrent/ConcurrentHashMap.<init> + 311492 2 java/util/jar/JarFile.<init> + 311492 2 java/util/zip/Inflater.inflate + 311492 2 java/util/zip/Inflater.inflateBytes + 311492 2 java/util/zip/ZipEntry.<init> + 311492 2 java/util/zip/ZipFile$ZipFileInputStream.close + 311492 2 java/util/zip/ZipFile.freeEntry + 311492 2 java/util/zip/ZipFile.getInputStream + 311492 2 java/util/zip/ZipFile.getSize + 311492 2 sun/misc/FileURLMapper.getPath + 311492 2 sun/misc/Launcher$Factory.<init> + 311492 2 sun/misc/Launcher$Factory.createURLStreamHandler + 311492 2 sun/misc/Launcher.access$100 + 311492 2 sun/misc/MetaIndex.registerDirectory + 311492 2 sun/misc/NativeSignalHandler.<init> + 311492 2 sun/misc/Resource.cachedInputStream + 311492 2 sun/misc/URLClassPath.<init> + 311492 2 sun/misc/URLClassPath.getResource + 311492 2 sun/misc/URLClassPath.push + 311492 2 sun/misc/VM.maxDirectMemory + 311492 2 sun/misc/Version.init + 311492 2 sun/net/www/protocol/file/Handler.openConnection + 311492 2 sun/net/www/protocol/file/Handler.parseURL + 311492 2 sun/net/www/protocol/jar/Handler.<init> + 311492 2 sun/nio/cs/FastCharsetProvider.charsetForName + 311492 2 sun/nio/cs/FastCharsetProvider.lookup + 311492 2 sun/nio/cs/FastCharsetProvider.toLower + 311492 2 sun/nio/cs/StandardCharsets$Aliases.<init> + 311492 2 sun/nio/cs/StandardCharsets$Cache.<init> + 311492 2 sun/nio/cs/StandardCharsets$Classes.<init> + 311492 2 sun/nio/cs/StreamDecoder.<init> + 311492 2 sun/nio/cs/StreamDecoder.ensureOpen + 311492 2 sun/nio/cs/StreamDecoder.implRead + 311492 2 sun/nio/cs/StreamDecoder.read + 311492 2 sun/nio/cs/StreamDecoder.readBytes + 311492 2 sun/nio/cs/StreamEncoder.forOutputStreamWriter + 311492 2 sun/nio/cs/Surrogate$Parser.<init> + 311492 2 sun/nio/cs/US_ASCII.newEncoder + 311492 2 sun/reflect/DelegatingConstructorAccessorImpl.<init> + 311492 2 sun/reflect/DelegatingConstructorAccessorImpl.setDelegate + 311492 2 sun/reflect/NativeConstructorAccessorImpl.<init> + 311492 2 sun/reflect/NativeConstructorAccessorImpl.setParent + 311492 2 sun/reflect/Reflection.ensureMemberAccess + 311492 2 sun/reflect/Reflection.isSubclassOf + 311492 2 sun/reflect/Reflection.verifyMemberAccess + 311492 2 sun/reflect/ReflectionFactory.checkInitted + 311492 2 sun/reflect/ReflectionFactory.copyConstructor + 311492 2 sun/reflect/ReflectionFactory.newConstructorAccessor + 311492 2 sun/reflect/misc/ReflectUtil.checkPackageAccess + 311492 2 sun/security/provider/PolicyFile.canonPath + 311492 2 sun/util/PreHashedMap.put + 311492 3 java/io/BufferedWriter.newLine + 311492 3 java/io/FileInputStream.<init> + 311492 3 java/io/FileInputStream.read + 311492 3 java/io/FileInputStream.readBytes + 311492 3 java/io/FilterInputStream.<init> + 311492 3 java/io/PrintStream.newLine + 311492 3 java/io/PrintStream.print + 311492 3 java/io/PrintStream.println + 311492 3 java/io/Reader.<init> + 311492 3 java/lang/Boolean.<init> + 311492 3 java/lang/Class$3.<init> + 311492 3 java/lang/Class$3.run + 311492 3 java/lang/Class.forName + 311492 3 java/lang/Class.forName0 + 311492 3 java/lang/Class.newInstance + 311492 3 java/lang/Class.newInstance0 + 311492 3 java/lang/Exception.<init> + 311492 3 java/lang/Integer.<init> + 311492 3 java/lang/Object.wait + 311492 3 java/lang/RuntimePermission.<init> + 311492 3 java/lang/Shutdown.add + 311492 3 java/lang/Thread.sleep + 311492 3 java/lang/ThreadLocal.<init> + 311492 3 java/lang/ThreadLocal.getMap + 311492 3 java/lang/ThreadLocal.nextHashCode + 311492 3 java/lang/ref/WeakReference.<init> + 311492 3 java/lang/reflect/Constructor.newInstance + 311492 3 java/net/URLStreamHandler.<init> + 311492 3 java/nio/ByteBuffer.allocate + 311492 3 java/nio/charset/Charset.defaultCharset + 311492 3 java/nio/charset/Charset.lookup2 + 311492 3 java/nio/charset/CharsetDecoder.maxCharsPerByte + 311492 3 java/nio/charset/CodingErrorAction.<init> + 311492 3 java/util/AbstractList$Itr.checkForComodification + 311492 3 java/util/AbstractList$Itr.next + 311492 3 java/util/ArrayList.clear + 311492 3 java/util/HashSet.<init> + 311492 3 java/util/Hashtable.rehash + 311492 3 java/util/LinkedHashMap.<init> + 311492 3 java/util/LinkedHashMap.init + 311492 3 java/util/Stack.<init> + 311492 3 java/util/StringTokenizer.nextToken + 311492 3 java/util/concurrent/atomic/AtomicInteger.compareAndSet + 311492 3 java/util/concurrent/atomic/AtomicInteger.getAndAdd + 311492 3 java/util/jar/JarFile.getEntry + 311492 3 java/util/jar/JarFile.getJarEntry + 311492 3 java/util/zip/ZipFile.access$300 + 311492 3 sun/misc/Signal.<init> + 311492 3 sun/misc/Signal.findSignal + 311492 3 sun/misc/Signal.handle + 311492 3 sun/misc/Signal.handle0 + 311492 3 sun/misc/URLClassPath$JarLoader.ensureOpen + 311492 3 sun/reflect/DelegatingConstructorAccessorImpl.newInstance + 311492 3 sun/reflect/NativeConstructorAccessorImpl.newInstance + 311492 3 sun/reflect/NativeConstructorAccessorImpl.newInstance0 + 311492 3 sun/reflect/Reflection.getClassAccessFlags + 311492 3 sun/reflect/Reflection.quickCheckMemberAccess + 311492 3 sun/reflect/ReflectionFactory.inflationThreshold + 311492 3 sun/util/PreHashedMap.<init> + 311492 4 java/io/BufferedWriter.<init> + 311492 4 java/io/ExpiringCache$Entry.timestamp + 311492 4 java/io/ExpiringCache.<init> + 311492 4 java/io/File.compareTo + 311492 4 java/io/File.equals + 311492 4 java/io/FilePermission$1.run + 311492 4 java/io/FilterOutputStream.<init> + 311492 4 java/io/PrintStream.<init> + 311492 4 java/io/UnixFileSystem.compare + 311492 4 java/lang/Character.toUpperCase + 311492 4 java/lang/Class.getDeclaredFields0 + 311492 4 java/lang/Number.<init> + 311492 4 java/lang/Shutdown$Lock.<init> + 311492 4 java/lang/String.compareTo + 311492 4 java/lang/ThreadGroup.getParent + 311492 4 java/lang/Throwable.<init> + 311492 4 java/lang/Throwable.fillInStackTrace + 311492 4 java/lang/ref/ReferenceQueue$Null.<init> + 311492 4 java/lang/ref/ReferenceQueue.<init> + 311492 4 java/lang/reflect/Array.newArray + 311492 4 java/lang/reflect/Array.newInstance + 311492 4 java/lang/reflect/Constructor.setConstructorAccessor + 311492 4 java/lang/reflect/Modifier.isPublic + 311492 4 java/nio/HeapByteBuffer.ix + 311492 4 java/nio/charset/Charset.forName + 311492 4 java/nio/charset/CharsetDecoder.onMalformedInput + 311492 4 java/nio/charset/CharsetDecoder.onUnmappableCharacter + 311492 4 java/nio/charset/CharsetDecoder.replaceWith + 311492 4 java/nio/charset/CharsetEncoder.<init> + 311492 4 java/nio/charset/CoderResult$Cache.<init> + 311492 4 java/security/BasicPermission.<init> + 311492 4 java/security/BasicPermission.init + 311492 4 java/util/AbstractList$Itr.<init> + 311492 4 java/util/ArrayList.toArray + 311492 4 java/util/Collections$SynchronizedMap.get + 311492 4 java/util/IdentityHashMap$IdentityHashMapIterator.<init> + 311492 4 java/util/IdentityHashMap$KeyIterator.<init> + 311492 4 java/util/LinkedHashMap$Entry.recordAccess + 311492 4 java/util/StringTokenizer.<init> + 311492 4 java/util/zip/ZipFile.ensureOpen + 311492 4 sun/misc/MetaIndex.<init> + 311492 4 sun/misc/MetaIndex.mayContain + 311492 4 sun/nio/cs/FastCharsetProvider.canonicalize + 311492 4 sun/nio/cs/StreamEncoder.<init> + 311492 4 sun/nio/cs/US_ASCII$Encoder.<init> + 311492 4 sun/nio/cs/US_ASCII.newDecoder + 311492 4 sun/reflect/ConstructorAccessorImpl.<init> + 311492 4 sun/reflect/MagicAccessorImpl.<init> + 311492 4 sun/reflect/Reflection.filterFields + 311492 4 sun/reflect/ReflectionFactory$GetReflectionFactoryAction.<init> + 311492 4 sun/reflect/ReflectionFactory$GetReflectionFactoryAction.run + 311492 4 sun/reflect/ReflectionFactory.getReflectionFactory + 311492 4 sun/security/util/Debug.isOn + 311492 5 java/io/FileDescriptor.<init> + 311492 5 java/lang/Class.getModifiers + 311492 5 java/lang/Class.getName0 + 311492 5 java/lang/String.valueOf + 311492 5 java/nio/ByteBuffer.wrap + 311492 5 java/nio/charset/Charset.isSupported + 311492 5 java/security/PermissionCollection.<init> + 311492 5 java/util/AbstractList$Itr.hasNext + 311492 5 java/util/Hashtable.remove + 311492 5 java/util/StringTokenizer.scanToken + 311492 5 java/util/StringTokenizer.skipDelimiters + 311492 5 sun/misc/MetaIndex.forJar + 311492 5 sun/misc/URLClassPath$JarLoader.<init> + 311492 5 sun/misc/URLClassPath$JarLoader.getClassPath + 311492 5 sun/misc/URLClassPath$JarLoader.getResource + 311492 5 sun/misc/Unsafe.getUnsafe + 311492 5 sun/util/PreHashedMap.toV + 311492 6 java/io/BufferedOutputStream.write + 311492 6 java/io/BufferedWriter.flushBuffer + 311492 6 java/io/BufferedWriter.min + 311492 6 java/io/BufferedWriter.write + 311492 6 java/io/File.getAbsolutePath + 311492 6 java/io/FileOutputStream.write + 311492 6 java/io/FileOutputStream.writeBytes + 311492 6 java/io/OutputStream.<init> + 311492 6 java/io/OutputStreamWriter.flushBuffer + 311492 6 java/io/OutputStreamWriter.write + 311492 6 java/io/UnixFileSystem.canonicalize0 + 311492 6 java/io/Writer.<init> + 311492 6 java/io/Writer.write + 311492 6 java/lang/Class.checkMemberAccess + 311492 6 java/lang/Class.getComponentType + 311492 6 java/lang/Class.getDeclaredField + 311492 6 java/lang/Class.getName + 311492 6 java/lang/Class.getSuperclass + 311492 6 java/lang/Class.privateGetDeclaredFields + 311492 6 java/lang/Class.searchFields + 311492 6 java/lang/ThreadGroup.add + 311492 6 java/lang/reflect/Field.<init> + 311492 6 java/lang/reflect/Field.copy + 311492 6 java/lang/reflect/ReflectAccess.copyField + 311492 6 java/net/URL.getURLStreamHandler + 311492 6 java/net/URL.toExternalForm + 311492 6 java/net/URL.toString + 311492 6 java/net/URLStreamHandler.getDefaultPort + 311492 6 java/net/URLStreamHandler.getHostAddress + 311492 6 java/net/URLStreamHandler.hashCode + 311492 6 java/net/URLStreamHandler.toExternalForm + 311492 6 java/nio/Bits.byteOrder + 311492 6 java/nio/Buffer.clear + 311492 6 java/nio/ByteBuffer.<init> + 311492 6 java/nio/HeapByteBuffer.<init> + 311492 6 java/nio/charset/CharsetDecoder.decode + 311492 6 java/nio/charset/CharsetEncoder.encode + 311492 6 java/security/Permission.<init> + 311492 6 java/util/AbstractSet.<init> + 311492 6 java/util/HashMap.containsKey + 311492 6 java/util/Vector.add + 311492 6 java/util/concurrent/ConcurrentHashMap$Segment.rehash + 311492 6 sun/misc/Launcher.getFileURL + 311492 6 sun/misc/MetaIndex.getJarMap + 311492 6 sun/misc/URLClassPath$3.<init> + 311492 6 sun/misc/URLClassPath$3.run + 311492 6 sun/misc/URLClassPath$JarLoader.isOptimizable + 311492 6 sun/misc/URLClassPath$Loader.<init> + 311492 6 sun/misc/Unsafe.objectFieldOffset + 311492 6 sun/net/www/ParseUtil.fileToEncodedURL + 311492 6 sun/nio/cs/StreamEncoder.ensureOpen + 311492 6 sun/nio/cs/StreamEncoder.flushBuffer + 311492 6 sun/nio/cs/StreamEncoder.implFlushBuffer + 311492 6 sun/nio/cs/StreamEncoder.implWrite + 311492 6 sun/nio/cs/StreamEncoder.write + 311492 6 sun/nio/cs/StreamEncoder.writeBytes + 311492 6 sun/nio/cs/US_ASCII$Decoder.decodeArrayLoop + 311492 6 sun/nio/cs/US_ASCII$Decoder.decodeLoop + 311492 6 sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop + 311492 6 sun/nio/cs/US_ASCII$Encoder.encodeLoop + 311492 6 sun/reflect/ReflectionFactory.copyField + 311492 7 java/io/File.getCanonicalFile + 311492 7 java/io/InputStream.<init> + 311492 7 java/lang/ClassLoader.checkPackageAccess + 311492 7 java/lang/ref/SoftReference.<init> + 311492 7 java/util/Dictionary.<init> + 311492 7 java/util/HashSet.add + 311492 7 java/util/Stack.empty + 311492 7 java/util/Stack.pop + 311492 7 java/util/Stack.push + 311492 7 java/util/Vector.removeElementAt + 311492 7 java/util/zip/ZipFile.getEntry + 311492 7 sun/util/PreHashedMap.get + 311492 8 java/lang/Class.checkInitted + 311492 8 java/lang/Class.clearCachesOnClassRedefinition + 311492 8 java/lang/Class.getPrimitiveClass + 311492 8 java/lang/Class.getReflectionFactory + 311492 8 java/lang/Object.getClass + 311492 8 java/lang/System.setProperty + 311492 8 java/lang/Thread.<init> + 311492 8 java/lang/Thread.getContextClassLoader + 311492 8 java/lang/Thread.init + 311492 8 java/lang/Thread.nextThreadID + 311492 8 java/lang/ThreadGroup.addUnstarted + 311492 8 java/lang/ref/FinalReference.<init> + 311492 8 java/lang/ref/Finalizer.<init> + 311492 8 java/lang/ref/Finalizer.add + 311492 8 java/lang/ref/Finalizer.register + 311492 8 java/lang/ref/ReferenceQueue$Lock.<init> + 311492 8 java/lang/reflect/AccessibleObject.<init> + 311492 8 java/nio/charset/CharsetDecoder.<init> + 311492 8 java/security/AccessControlContext.optimize + 311492 8 java/security/AccessController.getInheritedAccessControlContext + 311492 8 java/util/Properties.setProperty + 311492 8 java/util/Stack.peek + 311492 8 sun/nio/cs/US_ASCII$Decoder.<init> + 311492 8 sun/reflect/ReflectionFactory.langReflectAccess + 311492 8 sun/security/util/Debug.getInstance + 311492 9 java/io/BufferedOutputStream.flush + 311492 9 java/io/BufferedOutputStream.flushBuffer + 311492 9 java/io/File.hashCode + 311492 9 java/io/File.isDirectory + 311492 9 java/io/PrintStream.write + 311492 9 java/io/UnixFileSystem.hashCode + 311492 9 java/lang/ClassLoader.findBootstrapClass + 311492 9 java/lang/ClassLoader.findBootstrapClass0 + 311492 9 java/lang/ClassLoader.getCallerClassLoader + 311492 9 java/lang/ClassLoader.loadClassInternal + 311492 9 java/lang/StringBuffer.<init> + 311492 9 java/lang/StringBuffer.toString + 311492 9 java/nio/Buffer.flip + 311492 9 java/util/ArrayList.RangeCheck + 311492 9 java/util/ArrayList.get + 311492 9 sun/misc/Launcher$AppClassLoader.loadClass + 311492 9 sun/net/www/ParseUtil.decode + 311492 9 sun/net/www/ParseUtil.lowMask + 311492 10 java/io/File.getCanonicalPath + 311492 10 java/io/ObjectStreamClass.getClassSignature + 311492 10 java/io/UnixFileSystem.canonicalize + 311492 10 java/lang/Class.isPrimitive + 311492 10 java/lang/Thread.setPriority + 311492 10 java/lang/Thread.setPriority0 + 311492 10 java/nio/CharBuffer.wrap + 311492 10 java/nio/charset/Charset.lookup + 311492 10 java/security/AccessController.getContext + 311492 10 java/security/AccessController.getStackAccessControlContext + 311492 10 java/util/Vector.addElement + 311492 11 java/lang/String.replace + 311492 11 java/lang/ThreadGroup.checkAccess + 311492 11 java/net/Parts.<init> + 311492 11 java/nio/CharBuffer.<init> + 311492 11 java/nio/HeapCharBuffer.<init> + 311492 12 java/io/BufferedWriter.ensureOpen + 311492 12 java/io/ExpiringCache$1.removeEldestEntry + 311492 12 java/io/ExpiringCache$Entry.<init> + 311492 12 java/io/ExpiringCache.put + 311492 12 java/io/File.exists + 311492 12 java/io/PrintStream.ensureOpen + 311492 12 java/lang/Class.isArray + 311492 12 java/lang/Thread.checkAccess + 311492 12 java/nio/ByteBuffer.hasArray + 311492 12 java/nio/CharBuffer.array + 311492 12 java/nio/CharBuffer.hasArray + 311492 12 java/nio/charset/CoderResult.isOverflow + 311492 12 java/util/HashMap.get + 311492 12 java/util/LinkedHashMap$Entry.access$600 + 311492 12 java/util/LinkedHashMap$Entry.addBefore + 311492 12 java/util/LinkedHashMap.addEntry + 311492 12 java/util/LinkedHashMap.createEntry + 311492 12 sun/net/www/ParseUtil.highMask + 311492 13 java/io/UnixFileSystem.parentOrNull + 311492 13 java/nio/Buffer.hasRemaining + 311492 13 java/nio/Buffer.remaining + 311492 13 sun/misc/URLClassPath.getLoader + 311492 13 sun/net/www/ParseUtil.encodePath + 311492 14 java/lang/Float.isNaN + 311492 14 java/net/URL.hashCode + 311492 14 java/util/Hashtable.<init> + 311492 15 java/lang/Object.hashCode + 311492 15 java/nio/charset/Charset.checkName + 311492 15 java/util/ArrayList.<init> + 311492 15 java/util/HashMap.addEntry + 311492 15 java/util/LinkedHashMap$Entry.<init> + 311492 16 java/io/UnixFileSystem.isAbsolute + 311492 16 java/lang/ClassLoader$NativeLibrary.find + 311492 16 java/lang/String.intern + 311492 16 java/util/Vector.ensureCapacityHelper + 311492 16 java/util/concurrent/ConcurrentHashMap$Segment.<init> + 311492 16 java/util/concurrent/ConcurrentHashMap$Segment.setTable + 311492 16 java/util/concurrent/locks/AbstractOwnableSynchronizer.<init> + 311492 16 java/util/concurrent/locks/AbstractQueuedSynchronizer.<init> + 311492 16 java/util/concurrent/locks/ReentrantLock$NonfairSync.<init> + 311492 16 java/util/concurrent/locks/ReentrantLock$Sync.<init> + 311492 16 java/util/concurrent/locks/ReentrantLock.<init> + 311492 16 sun/reflect/Reflection.getCallerClass + 311492 17 java/lang/ClassLoader.findNative + 311492 17 java/lang/Math.max + 311492 17 java/lang/String.toCharArray + 311492 17 java/nio/Buffer.<init> + 311492 17 java/util/Locale.getDefault + 311492 17 sun/security/action/GetPropertyAction.<init> + 311492 18 java/io/ExpiringCache.get + 311492 18 java/lang/Class.desiredAssertionStatus + 311492 18 java/lang/Class.desiredAssertionStatus0 + 311492 18 java/lang/ClassLoader.findLoadedClass + 311492 18 java/lang/ClassLoader.findLoadedClass0 + 311492 19 java/io/BufferedReader.ensureOpen + 311492 19 java/lang/System.currentTimeMillis + 311492 19 java/nio/Buffer.limit + 311492 19 java/util/Locale.<init> + 311492 19 java/util/Locale.createSingleton + 311492 19 java/util/concurrent/ConcurrentHashMap$Segment.put + 311492 19 java/util/concurrent/ConcurrentHashMap.put + 311492 19 java/util/concurrent/locks/AbstractQueuedSynchronizer.compareAndSetState + 311492 19 java/util/concurrent/locks/AbstractQueuedSynchronizer.release + 311492 19 java/util/concurrent/locks/AbstractQueuedSynchronizer.setState + 311492 19 java/util/concurrent/locks/ReentrantLock$NonfairSync.lock + 311492 19 java/util/concurrent/locks/ReentrantLock$Sync.tryRelease + 311492 19 java/util/concurrent/locks/ReentrantLock.lock + 311492 19 java/util/concurrent/locks/ReentrantLock.unlock + 311492 20 java/io/ObjectStreamField.<init> + 311492 20 java/nio/ByteBuffer.array + 311492 20 java/util/AbstractList.<init> + 311492 20 java/util/BitSet.get + 311492 20 java/util/concurrent/ConcurrentHashMap.hash + 311492 20 java/util/concurrent/ConcurrentHashMap.segmentFor + 311492 20 sun/misc/VM.isBooted + 311492 21 java/io/File.getName + 311492 21 java/io/UnixFileSystem.getBooleanAttributes + 311492 21 java/io/UnixFileSystem.getBooleanAttributes0 + 311492 21 java/lang/StringBuffer.append + 311492 21 java/nio/charset/Charset.atBugLevel + 311492 22 java/util/concurrent/ConcurrentHashMap$HashEntry.newArray + 311492 22 sun/misc/Unsafe.compareAndSwapInt + 311492 23 java/util/HashMap.<init> + 311492 23 java/util/concurrent/ConcurrentHashMap$HashEntry.<init> + 311492 24 java/nio/charset/CoderResult.isUnderflow + 311492 24 java/util/AbstractMap.<init> + 311492 24 java/util/Vector.elementAt + 311492 25 java/lang/Class.getClassLoader + 311492 26 java/util/AbstractCollection.<init> + 311492 26 java/util/ArrayList.add + 311492 26 java/util/ArrayList.ensureCapacity + 311492 27 java/lang/ClassLoader.loadClass + 311492 27 java/net/URL.<init> + 311492 28 java/lang/ClassLoader.check + 311492 28 java/lang/ClassLoader.checkName + 311492 28 java/lang/ref/Reference.<init> + 311492 29 java/lang/String.endsWith + 311492 29 sun/misc/VM.allowArraySyntax + 311492 30 java/io/ExpiringCache.entryFor + 311492 30 java/io/UnixFileSystem.resolve + 311492 30 java/util/HashMap$Entry.<init> + 311492 30 java/util/LinkedHashMap.get + 311492 33 java/util/HashMap.put + 311492 33 java/util/Vector.<init> + 311492 34 java/io/UnixFileSystem.normalize + 311492 34 java/lang/Class.getClassLoader0 + 311492 34 java/lang/String.toLowerCase + 311492 34 sun/security/action/GetPropertyAction.run + 311492 36 java/nio/CharBuffer.arrayOffset + 311492 36 java/util/HashMap.getEntry + 311492 37 java/io/File.<init> + 311492 37 java/io/UnixFileSystem.prefixLength + 311492 38 java/io/BufferedReader.readLine + 311492 38 java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread + 311492 41 java/lang/CharacterDataLatin1.toLowerCase + 311492 43 java/lang/CharacterDataLatin1.getProperties + 311492 43 java/security/AccessController.doPrivileged + 311492 43 java/util/Vector.size + 311492 44 java/nio/Buffer.position + 311492 44 java/nio/ByteBuffer.arrayOffset + 311492 48 java/lang/System.getProperty + 311492 50 java/util/Properties.getProperty + 311492 51 java/util/BitSet.expandTo + 311492 51 java/util/BitSet.set + 311492 56 java/lang/System.checkKey + 311492 57 java/lang/Thread.currentThread + 311492 57 java/util/Hashtable$Entry.<init> + 311492 59 java/util/Hashtable.get + 311492 63 java/util/Hashtable.put + 311492 71 java/util/BitSet.checkInvariants + 311492 72 java/util/BitSet.wordIndex + 311492 73 java/lang/StringBuilder.<init> + 311492 73 java/lang/StringBuilder.toString + 311492 81 java/lang/AbstractStringBuilder.expandCapacity + 311492 81 java/util/HashMap.hash + 311492 81 java/util/HashMap.indexFor + 311492 82 java/lang/AbstractStringBuilder.<init> + 311492 82 java/lang/Character.toLowerCase + 311492 83 java/lang/String.startsWith + 311492 87 java/util/Arrays.copyOf + 311492 90 java/lang/String.lastIndexOf + 311492 94 java/lang/String.substring + 311492 107 java/util/Arrays.copyOfRange + 311492 156 java/lang/String.getChars + 311492 174 java/lang/System.getSecurityManager + 311492 175 java/lang/String.<init> + 311492 202 java/lang/String.equals + 311492 208 java/lang/Math.min + 311492 213 java/lang/String.hashCode + 311492 302 java/lang/String.indexOf + 311492 360 java/lang/System.arraycopy + 311492 533 java/lang/StringBuilder.append + 311492 549 java/lang/AbstractStringBuilder.append + 311492 823 java/lang/Object.<init> + 311492 1960 java/lang/String.charAt + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_objnew_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_objnew_example.txt new file mode 100644 index 000000000000..433c38fcd880 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/j_package_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_package_example.txt new file mode 100644 index 000000000000..0d4da29d9e90 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/j_profile_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_profile_example.txt new file mode 100644 index 000000000000..bb45c4b3f759 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/j_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_stat_example.txt new file mode 100644 index 000000000000..6c7e12e99cfa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/j_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_syscalls_example.txt new file mode 100644 index 000000000000..911d4b0ec5c5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/j_syscalls_example.txt @@ -0,0 +1,165 @@ +The following are examples of j_syscalls.d. + +This is a simple script to count executed Java methods and system calls. +Here it traces an example program, Code/Java/Func_abc. + +# j_syscalls.d -c 'java -XX:+ExtendedDTraceProbes Func_abc' +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C + PID TYPE NAME COUNT + 311536 method Func_abc.func_a 1 + 311536 method Func_abc.func_b 1 + 311536 method Func_abc.func_c 1 + 311536 method Func_abc.main 1 + 311536 method java/io/BufferedInputStream.<clinit> 1 + 311536 method java/io/BufferedReader.<clinit> 1 + 311536 method java/io/BufferedReader.close 1 + 311536 method java/io/BufferedWriter.<clinit> 1 + 311536 method java/io/Console$1$1.<init> 1 + 311536 method java/io/Console$1$1.run 1 + 311536 method java/io/Console$1.<init> 1 + 311536 method java/io/Console$1.consoleRestoreHook 1 + 311536 method java/io/Console.<clinit> 1 + 311536 method java/io/Console.access$600 1 + 311536 method java/io/DataInputStream.<init> 1 + 311536 method java/io/DataInputStream.readFully 1 + 311536 method java/io/DeleteOnExitHook.<clinit> 1 + 311536 method java/io/DeleteOnExitHook.<init> 1 + 311536 method java/io/DeleteOnExitHook.hook 1 + 311536 method java/io/DeleteOnExitHook.run 1 +[... 900 lines truncated ...] + 311536 method java/io/ExpiringCache.get 18 + 311536 method java/lang/Class.desiredAssertionStatus 18 + 311536 method java/lang/Class.desiredAssertionStatus0 18 + 311536 method java/lang/ClassLoader.findLoadedClass 18 + 311536 method java/lang/ClassLoader.findLoadedClass0 18 + 311536 method java/io/BufferedReader.ensureOpen 19 + 311536 method java/lang/System.currentTimeMillis 19 + 311536 method java/nio/Buffer.limit 19 + 311536 method java/util/Locale.<init> 19 + 311536 method java/util/Locale.createSingleton 19 + 311536 method java/util/concurrent/ConcurrentHashMap$Segment.put 19 + 311536 method java/util/concurrent/ConcurrentHashMap.put 19 + 311536 method java/util/concurrent/locks/AbstractQueuedSynchronizer.compareAndSetState 19 + 311536 method java/util/concurrent/locks/AbstractQueuedSynchronizer.release 19 + 311536 method java/util/concurrent/locks/AbstractQueuedSynchronizer.setState 19 + 311536 method java/util/concurrent/locks/ReentrantLock$NonfairSync.lock 19 + 311536 method java/util/concurrent/locks/ReentrantLock$Sync.tryRelease 19 + 311536 method java/util/concurrent/locks/ReentrantLock.lock 19 + 311536 method java/util/concurrent/locks/ReentrantLock.unlock 19 + 311536 method java/io/ObjectStreamField.<init> 20 + 311536 method java/nio/ByteBuffer.array 20 + 311536 method java/util/AbstractList.<init> 20 + 311536 method java/util/BitSet.get 20 + 311536 method java/util/concurrent/ConcurrentHashMap.hash 20 + 311536 method java/util/concurrent/ConcurrentHashMap.segmentFor 20 + 311536 method sun/misc/VM.isBooted 20 + 311536 syscall memcntl 20 + 311536 method java/io/File.getName 21 + 311536 method java/io/UnixFileSystem.getBooleanAttributes 21 + 311536 method java/io/UnixFileSystem.getBooleanAttributes0 21 + 311536 method java/lang/StringBuffer.append 21 + 311536 method java/nio/charset/Charset.atBugLevel 21 + 311536 method java/util/concurrent/ConcurrentHashMap$HashEntry.newArray 22 + 311536 method sun/misc/Unsafe.compareAndSwapInt 22 + 311536 method java/util/HashMap.<init> 23 + 311536 method java/util/concurrent/ConcurrentHashMap$HashEntry.<init> 23 + 311536 syscall stat64 23 + 311536 method java/nio/charset/CoderResult.isUnderflow 24 + 311536 method java/util/AbstractMap.<init> 24 + 311536 method java/util/Vector.elementAt 24 + 311536 syscall munmap 24 + 311536 method java/lang/Class.getClassLoader 25 + 311536 syscall lwp_sigmask 25 + 311536 syscall sigaction 25 + 311536 method java/util/AbstractCollection.<init> 26 + 311536 method java/util/ArrayList.add 26 + 311536 method java/util/ArrayList.ensureCapacity 26 + 311536 method java/lang/ClassLoader.loadClass 27 + 311536 method java/net/URL.<init> 27 + 311536 method java/lang/ClassLoader.check 28 + 311536 method java/lang/ClassLoader.checkName 28 + 311536 method java/lang/ref/Reference.<init> 28 + 311536 method java/lang/String.endsWith 29 + 311536 method sun/misc/VM.allowArraySyntax 29 + 311536 method java/io/ExpiringCache.entryFor 30 + 311536 method java/io/UnixFileSystem.resolve 30 + 311536 method java/util/HashMap$Entry.<init> 30 + 311536 method java/util/LinkedHashMap.get 30 + 311536 syscall priocntlsys 30 + 311536 method java/util/HashMap.put 33 + 311536 method java/util/Vector.<init> 33 + 311536 method java/io/UnixFileSystem.normalize 34 + 311536 method java/lang/Class.getClassLoader0 34 + 311536 method java/lang/String.toLowerCase 34 + 311536 method sun/security/action/GetPropertyAction.run 34 + 311536 method java/nio/CharBuffer.arrayOffset 36 + 311536 method java/util/HashMap.getEntry 36 + 311536 method java/io/File.<init> 37 + 311536 method java/io/UnixFileSystem.prefixLength 37 + 311536 method java/io/BufferedReader.readLine 38 + 311536 method java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread 38 + 311536 syscall resolvepath 38 + 311536 method java/lang/CharacterDataLatin1.toLowerCase 41 + 311536 method java/lang/CharacterDataLatin1.getProperties 43 + 311536 method java/security/AccessController.doPrivileged 43 + 311536 method java/util/Vector.size 43 + 311536 method java/nio/Buffer.position 44 + 311536 method java/nio/ByteBuffer.arrayOffset 44 + 311536 method java/lang/System.getProperty 48 + 311536 method java/util/Properties.getProperty 50 + 311536 method java/util/BitSet.expandTo 51 + 311536 method java/util/BitSet.set 51 + 311536 syscall pollsys 55 + 311536 method java/lang/System.checkKey 56 + 311536 method java/lang/Thread.currentThread 57 + 311536 method java/util/Hashtable$Entry.<init> 57 + 311536 method java/util/Hashtable.get 59 + 311536 method java/util/Hashtable.put 63 + 311536 method java/util/BitSet.checkInvariants 71 + 311536 method java/util/BitSet.wordIndex 72 + 311536 method java/lang/StringBuilder.<init> 73 + 311536 method java/lang/StringBuilder.toString 73 + 311536 method java/lang/AbstractStringBuilder.expandCapacity 81 + 311536 method java/util/HashMap.hash 81 + 311536 method java/util/HashMap.indexFor 81 + 311536 method java/lang/AbstractStringBuilder.<init> 82 + 311536 method java/lang/Character.toLowerCase 82 + 311536 method java/lang/String.startsWith 83 + 311536 method java/util/Arrays.copyOf 87 + 311536 method java/lang/String.lastIndexOf 90 + 311536 method java/lang/String.substring 94 + 311536 syscall brk 102 + 311536 syscall ioctl 103 + 311536 method java/util/Arrays.copyOfRange 107 + 311536 syscall mmap 127 + 311536 syscall open 129 + 311536 syscall close 133 + 311536 method java/lang/String.getChars 156 + 311536 method java/lang/System.getSecurityManager 174 + 311536 method java/lang/String.<init> 175 + 311536 syscall xstat 188 + 311536 method java/lang/String.equals 202 + 311536 method java/lang/Math.min 208 + 311536 method java/lang/String.hashCode 213 + 311536 syscall lwp_exit 291 + 311536 method java/lang/String.indexOf 302 + 311536 method java/lang/System.arraycopy 360 + 311536 method java/lang/StringBuilder.append 545 + 311536 method java/lang/AbstractStringBuilder.append 561 + 311536 syscall llseek 664 + 311536 syscall read 668 + 311536 method java/lang/Object.<init> 823 + 311536 method java/lang/String.charAt 1987 + +While tracing there were numerous system calls made, including 668 reads()'s, +and 664 llseek()'s. Many Java methods were also called, with 1987 +java/lang/String.charAt being the most of a particular kind. + +This script can provide an insight to how an application is interacting +with the system, by providing both application method calls and +system calls in the same output. + + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_syscolors_example.txt new file mode 100644 index 000000000000..3b130ee8883b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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 +[2;32m0 311542/1 2 syscall -> munmap[0m +[2;32m0 311542/1 33 syscall <- munmap[0m +[2;32m0 311542/1 52 syscall -> mmap[0m +[2;32m0 311542/1 16 syscall <- mmap[0m +[2;32m0 311542/1 34 syscall -> setcontext[0m +[2;32m0 311542/1 7 syscall <- setcontext[0m +[2;32m0 311542/1 7 syscall -> getrlimit[0m +[2;32m0 311542/1 7 syscall <- getrlimit[0m +[2;32m0 311542/1 7 syscall -> getpid[0m +[2;32m0 311542/1 6 syscall <- getpid[0m +[2;32m0 311542/1 58 syscall -> setcontext[0m +[2;32m0 311542/1 6 syscall <- setcontext[0m +[2;32m0 311542/1 975 syscall -> sysi86[0m +[2;32m0 311542/1 9 syscall <- sysi86[0m +[2;32m0 311542/1 134 syscall -> brk[0m +[2;32m0 311542/1 8 syscall <- brk[0m +[2;32m0 311542/1 7 syscall -> brk[0m +[2;32m0 311542/1 10 syscall <- brk[0m +[2;32m0 311542/1 47 syscall -> sysconfig[0m +[2;32m0 311542/1 6 syscall <- sysconfig[0m +[2;32m0 311542/1 36 syscall -> resolvepath[0m +[2;32m0 311542/1 31 syscall <- resolvepath[0m +[2;32m0 311542/1 9 syscall -> resolvepath[0m +[2;32m0 311542/1 18 syscall <- resolvepath[0m +[2;32m0 311542/1 85 syscall -> access[0m +[2;32m0 311542/1 20 syscall <- access[0m +[2;32m0 311542/1 8 syscall -> access[0m +[2;32m0 311542/1 24 syscall <- access[0m +[2;32m0 311542/1 115 syscall -> open[0m +[2;32m0 311542/1 27 syscall <- open[0m +[2;32m0 311542/1 14 syscall -> fstat64[0m +[2;32m0 311542/1 7 syscall <- fstat64[0m +[2;32m0 311542/1 11 syscall -> fstat64[0m +[2;32m0 311542/1 6 syscall <- fstat64[0m +[2;32m0 311542/1 22 syscall -> ioctl[0m +[2;32m0 311542/1 7 syscall <- ioctl[0m +[2;32m0 311542/1 11 syscall -> read[0m +[2;32m0 311542/1 43 syscall <- read[0m +[2;32m0 311542/1 39 syscall -> read[0m +[2;32m0 311542/1 7 syscall <- read[0m +[2;32m0 311542/1 10 syscall -> llseek[0m +[2;32m0 311542/1 7 syscall <- llseek[0m +[2;32m0 311542/1 8 syscall -> close[0m +[2;32m0 311542/1 9 syscall <- close[0m +[2;32m0 311542/1 12 syscall -> sysconfig[0m +[2;32m0 311542/1 6 syscall <- sysconfig[0m +[2;32m0 311542/1 7 syscall -> sysconfig[0m +[2;32m0 311542/1 6 syscall <- sysconfig[0m +[2;32m0 311542/1 6 syscall -> sysconfig[0m +[2;32m0 311542/1 6 syscall <- sysconfig[0m +[2;32m0 311542/1 11 syscall -> xstat[0m +[2;32m0 311542/1 27 syscall <- xstat[0m +[2;32m0 311542/1 19 syscall -> exece[0m +[2;32m0 311542/1 684 syscall <- exece[0m +[2;32m0 311542/1 3320 syscall -> mmap[0m +[2;32m0 311542/1 22 syscall <- mmap[0m +[2;32m0 311542/1 26 syscall -> resolvepath[0m +[2;32m0 311542/1 52 syscall <- resolvepath[0m +[2;32m0 311542/1 8 syscall -> resolvepath[0m +[2;32m0 311542/1 25 syscall <- resolvepath[0m +[2;32m0 311542/1 7 syscall -> sysconfig[0m +[2;32m0 311542/1 6 syscall <- sysconfig[0m +[2;32m0 311542/1 9 syscall -> xstat[0m +[2;32m0 311542/1 18 syscall <- xstat[0m +[2;32m0 311542/1 7 syscall -> open[0m +[2;32m0 311542/1 18 syscall <- open[0m +[2;32m0 311542/1 7 syscall -> fxstat[0m +[2;32m0 311542/1 7 syscall <- fxstat[0m +[2;32m0 311542/1 6 syscall -> mmap[0m +[2;32m0 311542/1 11 syscall <- mmap[0m +[2;32m0 311542/1 7 syscall -> close[0m +[2;32m0 311542/1 10 syscall <- close[0m +[2;32m0 311542/1 42 syscall -> xstat[0m +[2;32m0 311542/1 27 syscall <- xstat[0m +[2;32m0 311542/1 8 syscall -> xstat[0m +[2;32m0 311542/1 19 syscall <- xstat[0m +[2;32m0 311542/1 7 syscall -> xstat[0m +[2;32m0 311542/1 25 syscall <- xstat[0m +[... 31000 lines truncated ...] +[2;35m0 311542/2 10 method <- java/util/HashSet.add[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess[0m +[2;35m0 311542/2 28 method -> java/lang/reflect/Method.getModifiers[0m +[2;35m0 311542/2 14 method <- java/lang/reflect/Method.getModifiers[0m +[2;35m0 311542/2 17 method -> Func_abc.main[0m +[2;35m0 311542/2 14 method -> Func_abc.func_a[0m +[2;35m0 311542/2 12 method -> java/lang/ClassLoader.checkPackageAccess[0m +[2;35m0 311542/2 10 method -> java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method <- java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 11 method -> java/util/HashSet.add[0m +[2;35m0 311542/2 10 method -> java/util/HashMap.put[0m +[2;35m0 311542/2 9 method -> java/lang/Object.hashCode[0m +[2;35m0 311542/2 10 method <- java/lang/Object.hashCode[0m +[2;35m0 311542/2 10 method -> java/util/HashMap.hash[0m +[2;35m0 311542/2 10 method <- java/util/HashMap.hash[0m +[2;35m0 311542/2 10 method -> java/util/HashMap.indexFor[0m +[2;35m0 311542/2 10 method <- java/util/HashMap.indexFor[0m +[2;35m0 311542/2 10 method <- java/util/HashMap.put[0m +[2;35m0 311542/2 10 method <- java/util/HashSet.add[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess[0m +[2;32m0 311542/2 20 syscall -> brk[0m +[2;32m0 311542/2 15 syscall <- brk[0m +[2;32m0 311542/2 13 syscall -> brk[0m +[2;32m0 311542/2 17 syscall <- brk[0m +[2;35m0 311542/2 47 method -> java/lang/ClassLoader.loadClassInternal[0m +[2;35m0 311542/2 12 method -> java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method -> sun/misc/Launcher$AppClassLoader.loadClass[0m +[2;35m0 311542/2 10 method -> java/lang/String.lastIndexOf[0m +[2;35m0 311542/2 10 method -> java/lang/String.lastIndexOf[0m +[2;35m0 311542/2 11 method <- java/lang/String.lastIndexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.lastIndexOf[0m +[2;35m0 311542/2 10 method -> java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method <- java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.check[0m +[2;35m0 311542/2 9 method <- java/lang/ClassLoader.check[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 11 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method <- sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method -> java/lang/String.charAt[0m +[2;35m0 311542/2 10 method <- java/lang/String.charAt[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0[0m +[2;35m0 311542/2 12 method <- java/lang/ClassLoader.findLoadedClass0[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass[0m +[2;35m0 311542/2 11 method -> java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.check[0m +[2;35m0 311542/2 9 method <- java/lang/ClassLoader.check[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method <- sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method -> java/lang/String.charAt[0m +[2;35m0 311542/2 9 method <- java/lang/String.charAt[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0[0m +[2;35m0 311542/2 11 method <- java/lang/ClassLoader.findLoadedClass0[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass0[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.check[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.check[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method <- sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method -> java/lang/String.charAt[0m +[2;35m0 311542/2 9 method <- java/lang/String.charAt[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass[0m +[2;35m0 311542/2 12 method <- java/lang/ClassLoader.findBootstrapClass[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.findBootstrapClass0[0m +[2;35m0 311542/2 11 method <- java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method <- sun/misc/Launcher$AppClassLoader.loadClass[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.loadClassInternal[0m +[2;35m0 311542/2 14 method -> java/lang/ClassLoader.checkPackageAccess[0m +[2;35m0 311542/2 10 method -> java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method <- java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method -> java/util/HashSet.add[0m +[2;35m0 311542/2 10 method -> java/util/HashMap.put[0m +[2;35m0 311542/2 10 method -> java/lang/Object.hashCode[0m +[2;35m0 311542/2 9 method <- java/lang/Object.hashCode[0m +[2;35m0 311542/2 10 method -> java/util/HashMap.hash[0m +[2;35m0 311542/2 10 method <- java/util/HashMap.hash[0m +[2;35m0 311542/2 10 method -> java/util/HashMap.indexFor[0m +[2;35m0 311542/2 10 method <- java/util/HashMap.indexFor[0m +[2;35m0 311542/2 11 method <- java/util/HashMap.put[0m +[2;35m0 311542/2 10 method <- java/util/HashSet.add[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess[0m +[2;35m0 311542/2 18 method -> java/io/PrintStream.println[0m +[2;35m0 311542/2 13 method -> java/io/PrintStream.print[0m +[2;35m0 311542/2 12 method -> java/io/PrintStream.write[0m +[2;35m0 311542/2 12 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 13 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 15 method -> java/io/Writer.write[0m +[2;35m0 311542/2 16 method -> java/io/BufferedWriter.write[0m +[2;35m0 311542/2 13 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 12 method -> java/io/BufferedWriter.min[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.min[0m +[2;35m0 311542/2 13 method -> java/lang/String.getChars[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 11 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/String.getChars[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/Writer.write[0m +[2;35m0 311542/2 13 method -> java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 13 method -> java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 13 method -> sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 13 method -> sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 13 method -> sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 14 method -> java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 11 method -> java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 11 method -> java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 13 method -> java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 14 method -> java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 13 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 13 method -> java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 14 method -> java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 13 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 56 method -> java/nio/CharBuffer.array[0m +[2;35m0 311542/2 11 method <- java/nio/CharBuffer.array[0m +[2;35m0 311542/2 12 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 13 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 16 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 12 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 12 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 17 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 12 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 12 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 12 method -> java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 12 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 13 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 14 method -> java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 13 method -> java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 12 method -> sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 13 method -> sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 13 method -> sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 12 method -> java/nio/Buffer.flip[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.flip[0m +[2;35m0 311542/2 14 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 12 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 14 method -> java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 13 method -> java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 15 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 12 method -> java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 12 method -> java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 15 method -> java/io/FileOutputStream.write[0m +[2;35m0 311542/2 12 method -> java/io/FileOutputStream.writeBytes[0m +[2;32m0 311542/2 55 syscall -> write[0m +[2;32m0 311542/2 160 syscall <- write[0m +[2;35m0 311542/2 12 method <- java/io/FileOutputStream.writeBytes[0m +[2;35m0 311542/2 12 method <- java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 13 method <- java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 11 method <- java/io/PrintStream.write[0m +[2;35m0 311542/2 13 method -> java/nio/Buffer.clear[0m +[2;35m0 311542/2 11 method <- java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 15 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.print[0m +[2;35m0 311542/2 12 method -> java/io/PrintStream.newLine[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 12 method -> java/io/BufferedWriter.newLine[0m +[2;35m0 311542/2 12 method -> java/io/Writer.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 11 method -> java/io/BufferedWriter.min[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.min[0m +[2;35m0 311542/2 10 method -> java/lang/String.getChars[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/String.getChars[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/Writer.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.newLine[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 9 method -> sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 10 method -> java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 9 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 9 method <- java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.array[0m +[2;35m0 311542/2 9 method <- java/nio/CharBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 11 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.flip[0m +[2;35m0 311542/2 9 method <- java/nio/Buffer.flip[0m +[2;35m0 311542/2 11 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 9 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.writeBytes[0m +[2;32m0 311542/2 12 syscall -> write[0m +[2;32m0 311542/2 63 syscall <- write[0m +[2;35m0 311542/2 8 method <- java/io/FileOutputStream.writeBytes[0m +[2;35m0 311542/2 11 method <- java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.newLine[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.println[0m +[2;35m0 311542/2 23 method -> java/lang/ClassLoader.loadClassInternal[0m +[2;35m0 311542/2 11 method -> java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method -> sun/misc/Launcher$AppClassLoader.loadClass[0m +[2;35m0 311542/2 10 method -> java/lang/String.lastIndexOf[0m +[2;35m0 311542/2 10 method -> java/lang/String.lastIndexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.lastIndexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.lastIndexOf[0m +[2;35m0 311542/2 10 method -> java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method <- java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.check[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.check[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 9 method <- sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method -> java/lang/String.charAt[0m +[2;35m0 311542/2 10 method <- java/lang/String.charAt[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0[0m +[2;35m0 311542/2 14 method <- java/lang/ClassLoader.findLoadedClass0[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass[0m +[2;35m0 311542/2 12 method -> java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.check[0m +[2;35m0 311542/2 9 method <- java/lang/ClassLoader.check[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 9 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method <- sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method -> java/lang/String.charAt[0m +[2;35m0 311542/2 9 method <- java/lang/String.charAt[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findLoadedClass0[0m +[2;35m0 311542/2 12 method <- java/lang/ClassLoader.findLoadedClass0[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.findLoadedClass[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass0[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.check[0m +[2;35m0 311542/2 9 method <- java/lang/ClassLoader.check[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 9 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method <- sun/misc/VM.allowArraySyntax[0m +[2;35m0 311542/2 10 method -> java/lang/String.charAt[0m +[2;35m0 311542/2 10 method <- java/lang/String.charAt[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkName[0m +[2;35m0 311542/2 10 method -> java/lang/ClassLoader.findBootstrapClass[0m +[2;35m0 311542/2 15 method <- java/lang/ClassLoader.findBootstrapClass[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.findBootstrapClass0[0m +[2;35m0 311542/2 11 method <- java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method <- sun/misc/Launcher$AppClassLoader.loadClass[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.loadClass[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.loadClassInternal[0m +[2;35m0 311542/2 17 method -> java/lang/ClassLoader.checkPackageAccess[0m +[2;35m0 311542/2 10 method -> java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method <- java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 11 method -> java/util/HashSet.add[0m +[2;35m0 311542/2 10 method -> java/util/HashMap.put[0m +[2;35m0 311542/2 10 method -> java/lang/Object.hashCode[0m +[2;35m0 311542/2 10 method <- java/lang/Object.hashCode[0m +[2;35m0 311542/2 10 method -> java/util/HashMap.hash[0m +[2;35m0 311542/2 10 method <- java/util/HashMap.hash[0m +[2;35m0 311542/2 10 method -> java/util/HashMap.indexFor[0m +[2;35m0 311542/2 10 method <- java/util/HashMap.indexFor[0m +[2;35m0 311542/2 11 method <- java/util/HashMap.put[0m +[2;35m0 311542/2 10 method <- java/util/HashSet.add[0m +[2;35m0 311542/2 10 method <- java/lang/ClassLoader.checkPackageAccess[0m +[2;35m0 311542/2 20 method -> java/lang/Thread.currentThread[0m +[2;35m0 311542/2 11 method <- java/lang/Thread.currentThread[0m +[2;35m0 311542/2 13 method -> java/lang/Thread.sleep[0m +[2;32m0 311542/2 21 syscall -> pollsys[0m +[2;32m0 311542/10 59827 syscall <- pollsys[0m +[2;32m0 311542/10 31 syscall -> pollsys[0m +[2;32m0 311542/10 59842 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 60087 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59871 syscall <- pollsys[0m +[2;32m0 311542/10 26 syscall -> pollsys[0m +[2;32m0 311542/3 1008044 syscall <- lwp_cond_wait[0m +[2;32m0 311542/3 37 syscall -> lwp_cond_wait[0m +[2;32m0 311542/10 59402 syscall <- pollsys[0m +[2;32m0 311542/10 18 syscall -> pollsys[0m +[2;32m0 311542/10 59999 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59965 syscall <- pollsys[0m +[2;32m0 311542/10 25 syscall -> pollsys[0m +[2;32m0 311542/10 59979 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 51241 syscall <- pollsys[0m +[2;32m0 311542/10 31 syscall -> pollsys[0m +[2;32m0 311542/10 58679 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 50215 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59734 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59977 syscall <- pollsys[0m +[2;32m0 311542/10 26 syscall -> pollsys[0m +[2;32m0 311542/10 59970 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59966 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 60013 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59924 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +Function B +[2;32m0 311542/2 1003741 syscall <- pollsys[0m +[2;35m0 311542/2 28 method <- java/lang/Thread.sleep[0m +[2;35m0 311542/2 45 method -> Func_abc.func_b[0m +[2;35m0 311542/2 36 method -> java/io/PrintStream.println[0m +[2;35m0 311542/2 11 method -> java/io/PrintStream.print[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 11 method -> java/io/Writer.write[0m +[2;35m0 311542/2 11 method -> java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 12 method -> java/io/BufferedWriter.min[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.min[0m +[2;35m0 311542/2 11 method -> java/lang/String.getChars[0m +[2;35m0 311542/2 11 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 11 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/String.getChars[0m +[2;35m0 311542/2 11 method <- java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/Writer.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 11 method -> java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 11 method -> sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 10 method -> java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 11 method -> java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 11 method -> java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 11 method -> java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 11 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 11 method -> java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.array[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 11 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 12 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 11 method -> java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.flip[0m +[2;35m0 311542/2 9 method <- java/nio/Buffer.flip[0m +[2;35m0 311542/2 11 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 9 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 11 method -> java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.writeBytes[0m +[2;32m0 311542/2 17 syscall -> write[0m +[2;32m0 311542/2 104 syscall <- write[0m +[2;35m0 311542/2 9 method <- java/io/FileOutputStream.writeBytes[0m +[2;35m0 311542/2 11 method <- java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 11 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 11 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.print[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.newLine[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.newLine[0m +[2;35m0 311542/2 10 method -> java/io/Writer.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 9 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.min[0m +[2;35m0 311542/2 9 method <- java/io/BufferedWriter.min[0m +[2;35m0 311542/2 10 method -> java/lang/String.getChars[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/String.getChars[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/Writer.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.newLine[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 9 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 10 method -> java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.<init>[0m +[2;35m0 311542/2 9 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 9 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.array[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 11 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 11 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 9 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.flip[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.flip[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 9 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.writeBytes[0m +[2;32m0 311542/2 11 syscall -> write[0m +[2;32m0 311542/2 64 syscall <- write[0m +[2;35m0 311542/2 8 method <- java/io/FileOutputStream.writeBytes[0m +[2;35m0 311542/2 11 method <- java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.newLine[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.println[0m +[2;35m0 311542/2 10 method -> java/lang/Thread.currentThread[0m +[2;35m0 311542/2 10 method <- java/lang/Thread.currentThread[0m +[2;35m0 311542/2 10 method -> java/lang/Thread.sleep[0m +[2;32m0 311542/2 14 syscall -> pollsys[0m +[2;32m0 311542/10 59985 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59968 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59981 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59960 syscall <- pollsys[0m +[2;32m0 311542/10 28 syscall -> pollsys[0m +[2;32m0 311542/10 59967 syscall <- pollsys[0m +[2;32m0 311542/10 22 syscall -> pollsys[0m +[2;32m0 311542/3 1050003 syscall <- lwp_cond_wait[0m +[2;32m0 311542/3 14 syscall -> lwp_cond_wait[0m +[2;32m0 311542/10 59985 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59969 syscall <- pollsys[0m +[2;32m0 311542/10 25 syscall -> pollsys[0m +[2;32m0 311542/10 59980 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 51269 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 58678 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 50207 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59714 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59967 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59965 syscall <- pollsys[0m +[2;32m0 311542/10 28 syscall -> pollsys[0m +[2;32m0 311542/10 59970 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59952 syscall <- pollsys[0m +[2;32m0 311542/10 31 syscall -> pollsys[0m +[2;32m0 311542/10 59969 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +Function C +[2;32m0 311542/2 1006879 syscall <- pollsys[0m +[2;35m0 311542/2 29 method <- java/lang/Thread.sleep[0m +[2;35m0 311542/2 45 method -> Func_abc.func_c[0m +[2;35m0 311542/2 36 method -> java/io/PrintStream.println[0m +[2;35m0 311542/2 11 method -> java/io/PrintStream.print[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 11 method -> java/io/Writer.write[0m +[2;35m0 311542/2 11 method -> java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 12 method -> java/io/BufferedWriter.min[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.min[0m +[2;35m0 311542/2 11 method -> java/lang/String.getChars[0m +[2;35m0 311542/2 11 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 11 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/String.getChars[0m +[2;35m0 311542/2 11 method <- java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/Writer.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 11 method -> java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 11 method -> sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 11 method -> java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 11 method -> java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 11 method -> java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 11 method -> java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 11 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 11 method -> java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.array[0m +[2;35m0 311542/2 9 method <- java/nio/CharBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 11 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 12 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 11 method -> java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.flip[0m +[2;35m0 311542/2 9 method <- java/nio/Buffer.flip[0m +[2;35m0 311542/2 11 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 11 method -> java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 9 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 11 method -> java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 11 method -> java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.writeBytes[0m +[2;32m0 311542/2 17 syscall -> write[0m +[2;32m0 311542/2 143 syscall <- write[0m +[2;35m0 311542/2 9 method <- java/io/FileOutputStream.writeBytes[0m +[2;35m0 311542/2 11 method <- java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 11 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method -> java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/lang/String.indexOf[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.print[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.newLine[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.newLine[0m +[2;35m0 311542/2 10 method -> java/io/Writer.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 9 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.min[0m +[2;35m0 311542/2 9 method <- java/io/BufferedWriter.min[0m +[2;35m0 311542/2 10 method -> java/lang/String.getChars[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/String.getChars[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/Writer.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.newLine[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.ensureOpen[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 10 method -> java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.<init>[0m +[2;35m0 311542/2 9 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 9 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.limit[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/HeapCharBuffer.<init>[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.wrap[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.hasRemaining[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.hasArray[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.hasArray[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.array[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 11 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 11 method -> java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/CharBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 9 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.position[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeArrayLoop[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/US_ASCII$Encoder.encodeLoop[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isOverflow[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CharsetEncoder.encode[0m +[2;35m0 311542/2 10 method -> java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method <- java/nio/charset/CoderResult.isUnderflow[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.remaining[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implWrite[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.write[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method -> sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.flip[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.flip[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.array[0m +[2;35m0 311542/2 10 method -> java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 9 method <- java/nio/ByteBuffer.arrayOffset[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 9 method <- java/io/PrintStream.ensureOpen[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method -> java/io/FileOutputStream.writeBytes[0m +[2;32m0 311542/2 11 syscall -> write[0m +[2;32m0 311542/2 63 syscall <- write[0m +[2;35m0 311542/2 8 method <- java/io/FileOutputStream.writeBytes[0m +[2;35m0 311542/2 11 method <- java/io/FileOutputStream.write[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.write[0m +[2;35m0 311542/2 10 method -> java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- java/nio/Buffer.clear[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.writeBytes[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.implFlushBuffer[0m +[2;35m0 311542/2 10 method <- sun/nio/cs/StreamEncoder.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/OutputStreamWriter.flushBuffer[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method -> java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flushBuffer[0m +[2;35m0 311542/2 10 method <- java/io/BufferedOutputStream.flush[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.newLine[0m +[2;35m0 311542/2 10 method <- java/io/PrintStream.println[0m +[2;35m0 311542/2 10 method -> java/lang/Thread.currentThread[0m +[2;35m0 311542/2 10 method <- java/lang/Thread.currentThread[0m +[2;35m0 311542/2 11 method -> java/lang/Thread.sleep[0m +[2;32m0 311542/2 14 syscall -> pollsys[0m +[2;32m0 311542/10 59975 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59963 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59976 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59961 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 59968 syscall <- pollsys[0m +[2;32m0 311542/10 22 syscall -> pollsys[0m +[2;32m0 311542/3 1009924 syscall <- lwp_cond_wait[0m +[2;32m0 311542/3 17 syscall -> lwp_cond_wait[0m +[2;32m0 311542/10 50021 syscall <- pollsys[0m +[2;32m0 311542/10 31 syscall -> pollsys[0m +[2;32m0 311542/10 59941 syscall <- pollsys[0m +[2;32m0 311542/10 27 syscall -> pollsys[0m +[2;32m0 311542/10 60034 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 61298 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 58590 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 50205 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59723 syscall <- pollsys[0m +[2;32m0 311542/10 29 syscall -> pollsys[0m +[2;32m0 311542/10 60208 syscall <- pollsys[0m +[2;32m0 311542/10 28 syscall -> pollsys[0m +[2;32m0 311542/10 59733 syscall <- pollsys[0m +[2;32m0 311542/10 28 syscall -> pollsys[0m +[2;32m0 311542/10 59986 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59938 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/10 59968 syscall <- pollsys[0m +[2;32m0 311542/10 30 syscall -> pollsys[0m +[2;32m0 311542/2 1007088 syscall <- pollsys[0m +[2;35m0 311542/2 30 method <- java/lang/Thread.sleep[0m +[2;35m0 311542/2 28 method <- Func_abc.func_c[0m +[2;35m0 311542/2 10 method <- Func_abc.func_b[0m +[2;35m0 311542/2 10 method <- Func_abc.func_a[0m +[2;35m0 311542/2 10 method <- Func_abc.main[0m +[2;35m0 311542/2 27 method -> java/lang/Thread.exit[0m +[2;35m0 311542/2 38 method -> java/lang/ThreadGroup.remove[0m +[2;35m0 311542/2 19 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 11 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 14 method -> java/lang/Object.notifyAll[0m +[2;35m0 311542/2 16 method <- java/lang/Object.notifyAll[0m +[2;35m0 311542/2 11 method <- java/lang/ThreadGroup.remove[0m +[2;35m0 311542/2 16 method <- java/lang/Thread.exit[0m +[2;32m0 311542/2 22 syscall -> mprotect[0m +[2;32m0 311542/2 19 syscall <- mprotect[0m +[2;32m0 311542/2 19 syscall -> lwp_sigmask[0m +[2;32m0 311542/2 7 syscall <- lwp_sigmask[0m +[2;32m0 311542/2 25 syscall -> lwp_self[0m +[2;32m0 311542/2 6 syscall <- lwp_self[0m +[2;32m0 311542/2 7 syscall -> lwp_sigmask[0m +[2;32m0 311542/2 5 syscall <- lwp_sigmask[0m +[2;32m0 311542/2 6 syscall -> lwp_sigmask[0m +[2;32m0 311542/2 6 syscall <- lwp_sigmask[0m +[2;35m0 311542/2 124 method -> java/lang/Thread.<init>[0m +[2;35m0 311542/2 12 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 11 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 11 method -> java/lang/Thread.init[0m +[2;35m0 311542/2 10 method -> java/lang/Thread.currentThread[0m +[2;35m0 311542/2 10 method <- java/lang/Thread.currentThread[0m +[2;35m0 311542/2 11 method -> java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method <- java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 11 method -> java/lang/ThreadGroup.checkAccess[0m +[2;35m0 311542/2 10 method -> java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method <- java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method <- java/lang/ThreadGroup.checkAccess[0m +[2;35m0 311542/2 10 method -> java/lang/ThreadGroup.addUnstarted[0m +[2;35m0 311542/2 10 method <- java/lang/ThreadGroup.addUnstarted[0m +[2;35m0 311542/2 11 method -> java/lang/String.toCharArray[0m +[2;35m0 311542/2 11 method -> java/lang/String.getChars[0m +[2;35m0 311542/2 10 method -> java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/System.arraycopy[0m +[2;35m0 311542/2 10 method <- java/lang/String.getChars[0m +[2;35m0 311542/2 10 method <- java/lang/String.toCharArray[0m +[2;35m0 311542/2 10 method -> java/lang/Thread.getContextClassLoader[0m +[2;35m0 311542/2 10 method <- java/lang/Thread.getContextClassLoader[0m +[2;35m0 311542/2 11 method -> java/security/AccessController.getContext[0m +[2;35m0 311542/2 10 method -> java/security/AccessController.getStackAccessControlContext[0m +[2;35m0 311542/2 17 method <- java/security/AccessController.getStackAccessControlContext[0m +[2;35m0 311542/2 11 method -> java/security/AccessControlContext.optimize[0m +[2;35m0 311542/2 10 method -> java/security/AccessController.getInheritedAccessControlContext[0m +[2;35m0 311542/2 11 method <- java/security/AccessController.getInheritedAccessControlContext[0m +[2;35m0 311542/2 11 method <- java/security/AccessControlContext.optimize[0m +[2;35m0 311542/2 10 method <- java/security/AccessController.getContext[0m +[2;35m0 311542/2 10 method -> java/lang/Thread.setPriority[0m +[2;35m0 311542/2 10 method -> java/lang/Thread.checkAccess[0m +[2;35m0 311542/2 9 method -> java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 9 method <- java/lang/System.getSecurityManager[0m +[2;35m0 311542/2 10 method <- java/lang/Thread.checkAccess[0m +[2;35m0 311542/2 11 method -> java/lang/Thread.setPriority0[0m +[2;32m0 311542/2 15 syscall -> priocntlsys[0m +[2;32m0 311542/2 9 syscall <- priocntlsys[0m +[2;32m0 311542/2 7 syscall -> priocntlsys[0m +[2;32m0 311542/2 8 syscall <- priocntlsys[0m +[2;35m0 311542/2 7 method <- java/lang/Thread.setPriority0[0m +[2;35m0 311542/2 10 method <- java/lang/Thread.setPriority[0m +[2;35m0 311542/2 11 method -> java/lang/Thread.nextThreadID[0m +[2;35m0 311542/2 11 method <- java/lang/Thread.nextThreadID[0m +[2;35m0 311542/2 10 method <- java/lang/Thread.init[0m +[2;35m0 311542/2 10 method <- java/lang/Thread.<init>[0m +[2;35m0 311542/2 12 method -> java/lang/ThreadGroup.add[0m +[2;35m0 311542/2 11 method <- java/lang/ThreadGroup.add[0m +[2;32m0 311542/2 10 syscall -> mprotect[0m +[2;32m0 311542/2 7 syscall <- mprotect[0m +[2;35m0 311542/2 12 method -> java/lang/Shutdown.shutdown[0m +[2;35m0 311542/2 15 method -> java/lang/Shutdown.sequence[0m +[2;35m0 311542/2 12 method -> java/lang/Shutdown.runHooks[0m +[2;35m0 311542/2 14 method -> java/util/AbstractList.iterator[0m +[2;32m0 311542/2 30 syscall -> llseek[0m +[2;32m0 311542/2 9 syscall <- llseek[0m +[2;32m0 311542/2 8 syscall -> read[0m +[2;32m0 311542/2 1709 syscall <- read[0m +[2;32m0 311542/2 27 syscall -> llseek[0m +[2;32m0 311542/2 14 syscall <- llseek[0m +[2;32m0 311542/2 7 syscall -> read[0m +[2;32m0 311542/2 23 syscall <- read[0m +[2;35m0 311542/2 280 method -> java/util/AbstractList$Itr.<init>[0m +[2;35m0 311542/2 28 method -> java/util/AbstractList$Itr.<init>[0m +[2;35m0 311542/2 17 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 12 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 25 method <- java/util/AbstractList$Itr.<init>[0m +[2;35m0 311542/2 11 method <- java/util/AbstractList$Itr.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList.iterator[0m +[2;35m0 311542/2 17 method -> java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 16 method <- java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 13 method -> java/util/AbstractList$Itr.next[0m +[2;35m0 311542/2 12 method -> java/util/AbstractList$Itr.checkForComodification[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.checkForComodification[0m +[2;35m0 311542/2 13 method -> java/util/ArrayList.get[0m +[2;35m0 311542/2 11 method -> java/util/ArrayList.RangeCheck[0m +[2;35m0 311542/2 10 method <- java/util/ArrayList.RangeCheck[0m +[2;35m0 311542/2 10 method <- java/util/ArrayList.get[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.next[0m +[2;35m0 311542/2 15 method -> java/io/Console$1$1.run[0m +[2;35m0 311542/2 14 method -> java/io/Console.access$600[0m +[2;35m0 311542/2 12 method <- java/io/Console.access$600[0m +[2;35m0 311542/2 10 method <- java/io/Console$1$1.run[0m +[2;35m0 311542/2 10 method -> java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 10 method -> java/util/AbstractList$Itr.next[0m +[2;35m0 311542/2 10 method -> java/util/AbstractList$Itr.checkForComodification[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.checkForComodification[0m +[2;35m0 311542/2 11 method -> java/util/ArrayList.get[0m +[2;35m0 311542/2 10 method -> java/util/ArrayList.RangeCheck[0m +[2;35m0 311542/2 10 method <- java/util/ArrayList.RangeCheck[0m +[2;35m0 311542/2 10 method <- java/util/ArrayList.get[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.next[0m +[2;35m0 311542/2 11 method -> java/lang/ApplicationShutdownHooks.run[0m +[2;35m0 311542/2 16 method -> java/util/IdentityHashMap.keySet[0m +[2;32m0 311542/2 27 syscall -> llseek[0m +[2;32m0 311542/2 7 syscall <- llseek[0m +[2;32m0 311542/2 8 syscall -> read[0m +[2;32m0 311542/2 18 syscall <- read[0m +[2;32m0 311542/2 7 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 6 syscall -> read[0m +[2;32m0 311542/2 17 syscall <- read[0m +[2;35m0 311542/2 139 method -> java/util/IdentityHashMap$KeySet.<init>[0m +[2;35m0 311542/2 14 method -> java/util/IdentityHashMap$KeySet.<init>[0m +[2;35m0 311542/2 14 method -> java/util/AbstractSet.<init>[0m +[2;35m0 311542/2 10 method -> java/util/AbstractCollection.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 11 method <- java/util/AbstractCollection.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractSet.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap.keySet[0m +[2;35m0 311542/2 14 method -> java/util/IdentityHashMap$KeySet.iterator[0m +[2;32m0 311542/2 17 syscall -> llseek[0m +[2;32m0 311542/2 7 syscall <- llseek[0m +[2;32m0 311542/2 7 syscall -> read[0m +[2;32m0 311542/2 15 syscall <- read[0m +[2;32m0 311542/2 7 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 6 syscall -> read[0m +[2;32m0 311542/2 12 syscall <- read[0m +[2;32m0 311542/2 30 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 7 syscall -> read[0m +[2;32m0 311542/2 14 syscall <- read[0m +[2;32m0 311542/2 7 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 6 syscall -> read[0m +[2;32m0 311542/2 17 syscall <- read[0m +[2;35m0 311542/2 125 method -> java/util/IdentityHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 14 method -> java/util/IdentityHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 14 method -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>[0m +[2;35m0 311542/2 13 method -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>[0m +[2;35m0 311542/2 57 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 11 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 15 method -> java/util/IdentityHashMap.access$000[0m +[2;35m0 311542/2 11 method <- java/util/IdentityHashMap.access$000[0m +[2;35m0 311542/2 15 method -> java/util/IdentityHashMap.access$200[0m +[2;35m0 311542/2 11 method <- java/util/IdentityHashMap.access$200[0m +[2;35m0 311542/2 13 method <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.iterator[0m +[2;35m0 311542/2 14 method -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext[0m +[2;35m0 311542/2 11 method <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext[0m +[2;35m0 311542/2 11 method -> java/util/IdentityHashMap$KeySet.iterator[0m +[2;35m0 311542/2 10 method -> java/util/IdentityHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 10 method -> java/util/IdentityHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>[0m +[2;35m0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$KeySet.iterator[0m +[2;35m0 311542/2 10 method -> java/util/IdentityHashMap$IdentityHashMapIterator.hasNext[0m +[2;35m0 311542/2 10 method <- java/util/IdentityHashMap$IdentityHashMapIterator.hasNext[0m +[2;35m0 311542/2 11 method <- java/lang/ApplicationShutdownHooks.run[0m +[2;35m0 311542/2 10 method -> java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 10 method -> java/util/AbstractList$Itr.next[0m +[2;35m0 311542/2 10 method -> java/util/AbstractList$Itr.checkForComodification[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.checkForComodification[0m +[2;35m0 311542/2 11 method -> java/util/ArrayList.get[0m +[2;35m0 311542/2 10 method -> java/util/ArrayList.RangeCheck[0m +[2;35m0 311542/2 10 method <- java/util/ArrayList.RangeCheck[0m +[2;35m0 311542/2 10 method <- java/util/ArrayList.get[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.next[0m +[2;35m0 311542/2 11 method -> java/io/File$1.run[0m +[2;32m0 311542/2 17 syscall -> llseek[0m +[2;32m0 311542/2 8 syscall <- llseek[0m +[2;32m0 311542/2 8 syscall -> read[0m +[2;32m0 311542/2 17 syscall <- read[0m +[2;32m0 311542/2 7 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 6 syscall -> read[0m +[2;32m0 311542/2 12 syscall <- read[0m +[2;35m0 311542/2 62 method -> java/io/DeleteOnExitHook.<clinit>[0m +[2;32m0 311542/2 19 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 7 syscall -> read[0m +[2;32m0 311542/2 14 syscall <- read[0m +[2;32m0 311542/2 7 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 6 syscall -> read[0m +[2;32m0 311542/2 12 syscall <- read[0m +[2;35m0 311542/2 130 method -> java/util/LinkedHashSet.<init>[0m +[2;35m0 311542/2 15 method -> java/util/HashSet.<init>[0m +[2;35m0 311542/2 10 method -> java/util/AbstractSet.<init>[0m +[2;35m0 311542/2 10 method -> java/util/AbstractCollection.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 11 method <- java/util/AbstractCollection.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractSet.<init>[0m +[2;35m0 311542/2 15 method -> java/util/LinkedHashMap.<init>[0m +[2;35m0 311542/2 13 method -> java/util/HashMap.<init>[0m +[2;35m0 311542/2 10 method -> java/util/AbstractMap.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractMap.<init>[0m +[2;35m0 311542/2 12 method -> java/lang/Float.isNaN[0m +[2;35m0 311542/2 10 method <- java/lang/Float.isNaN[0m +[2;35m0 311542/2 15 method -> java/util/LinkedHashMap.init[0m +[2;35m0 311542/2 10 method -> java/util/LinkedHashMap$Entry.<init>[0m +[2;35m0 311542/2 10 method -> java/util/HashMap$Entry.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 9 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/util/HashMap$Entry.<init>[0m +[2;35m0 311542/2 10 method <- java/util/LinkedHashMap$Entry.<init>[0m +[2;35m0 311542/2 10 method <- java/util/LinkedHashMap.init[0m +[2;35m0 311542/2 10 method <- java/util/HashMap.<init>[0m +[2;35m0 311542/2 10 method <- java/util/LinkedHashMap.<init>[0m +[2;35m0 311542/2 10 method <- java/util/HashSet.<init>[0m +[2;35m0 311542/2 10 method <- java/util/LinkedHashSet.<init>[0m +[2;35m0 311542/2 12 method <- java/io/DeleteOnExitHook.<clinit>[0m +[2;35m0 311542/2 13 method -> java/io/DeleteOnExitHook.hook[0m +[2;35m0 311542/2 13 method -> java/io/DeleteOnExitHook.<init>[0m +[2;35m0 311542/2 12 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/io/DeleteOnExitHook.<init>[0m +[2;35m0 311542/2 10 method <- java/io/DeleteOnExitHook.hook[0m +[2;35m0 311542/2 13 method -> java/io/DeleteOnExitHook.run[0m +[2;35m0 311542/2 15 method -> java/util/ArrayList.<init>[0m +[2;35m0 311542/2 10 method -> java/util/AbstractList.<init>[0m +[2;35m0 311542/2 10 method -> java/util/AbstractCollection.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 9 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractCollection.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList.<init>[0m +[2;35m0 311542/2 15 method -> java/util/AbstractCollection.toArray[0m +[2;35m0 311542/2 13 method -> java/util/HashSet.size[0m +[2;35m0 311542/2 12 method <- java/util/HashSet.size[0m +[2;35m0 311542/2 13 method -> java/util/HashSet.iterator[0m +[2;35m0 311542/2 12 method -> java/util/HashMap.keySet[0m +[2;32m0 311542/2 19 syscall -> llseek[0m +[2;32m0 311542/2 7 syscall <- llseek[0m +[2;32m0 311542/2 8 syscall -> read[0m +[2;32m0 311542/2 17 syscall <- read[0m +[2;32m0 311542/2 7 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 6 syscall -> read[0m +[2;32m0 311542/2 12 syscall <- read[0m +[2;35m0 311542/2 68 method -> java/util/HashMap$KeySet.<init>[0m +[2;35m0 311542/2 14 method -> java/util/HashMap$KeySet.<init>[0m +[2;35m0 311542/2 14 method -> java/util/AbstractSet.<init>[0m +[2;35m0 311542/2 10 method -> java/util/AbstractCollection.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 11 method <- java/util/AbstractCollection.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractSet.<init>[0m +[2;35m0 311542/2 10 method <- java/util/HashMap$KeySet.<init>[0m +[2;35m0 311542/2 10 method <- java/util/HashMap$KeySet.<init>[0m +[2;35m0 311542/2 10 method <- java/util/HashMap.keySet[0m +[2;35m0 311542/2 13 method -> java/util/HashMap$KeySet.iterator[0m +[2;35m0 311542/2 14 method -> java/util/LinkedHashMap.newKeyIterator[0m +[2;32m0 311542/2 16 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 7 syscall -> read[0m +[2;32m0 311542/2 14 syscall <- read[0m +[2;32m0 311542/2 7 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 6 syscall -> read[0m +[2;32m0 311542/2 16 syscall <- read[0m +[2;32m0 311542/2 81 syscall -> llseek[0m +[2;32m0 311542/2 7 syscall <- llseek[0m +[2;32m0 311542/2 7 syscall -> read[0m +[2;32m0 311542/2 14 syscall <- read[0m +[2;32m0 311542/2 7 syscall -> llseek[0m +[2;32m0 311542/2 6 syscall <- llseek[0m +[2;32m0 311542/2 6 syscall -> read[0m +[2;32m0 311542/2 12 syscall <- read[0m +[2;35m0 311542/2 77 method -> java/util/LinkedHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 14 method -> java/util/LinkedHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 14 method -> java/util/LinkedHashMap$LinkedHashIterator.<init>[0m +[2;35m0 311542/2 12 method -> java/util/LinkedHashMap$LinkedHashIterator.<init>[0m +[2;35m0 311542/2 13 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 19 method <- java/util/LinkedHashMap$LinkedHashIterator.<init>[0m +[2;35m0 311542/2 11 method <- java/util/LinkedHashMap$LinkedHashIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/LinkedHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/LinkedHashMap$KeyIterator.<init>[0m +[2;35m0 311542/2 10 method <- java/util/LinkedHashMap.newKeyIterator[0m +[2;35m0 311542/2 10 method <- java/util/HashMap$KeySet.iterator[0m +[2;35m0 311542/2 10 method <- java/util/HashSet.iterator[0m +[2;35m0 311542/2 14 method -> java/util/LinkedHashMap$LinkedHashIterator.hasNext[0m +[2;35m0 311542/2 11 method <- java/util/LinkedHashMap$LinkedHashIterator.hasNext[0m +[2;35m0 311542/2 11 method <- java/util/AbstractCollection.toArray[0m +[2;35m0 311542/2 11 method -> java/lang/Object.getClass[0m +[2;35m0 311542/2 12 method <- java/lang/Object.getClass[0m +[2;35m0 311542/2 11 method <- java/util/ArrayList.<init>[0m +[2;35m0 311542/2 14 method -> java/util/Collections.reverse[0m +[2;35m0 311542/2 15 method <- java/util/Collections.reverse[0m +[2;35m0 311542/2 13 method -> java/util/AbstractList.iterator[0m +[2;35m0 311542/2 11 method -> java/util/AbstractList$Itr.<init>[0m +[2;35m0 311542/2 10 method -> java/util/AbstractList$Itr.<init>[0m +[2;35m0 311542/2 10 method -> java/lang/Object.<init>[0m +[2;35m0 311542/2 9 method <- java/lang/Object.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.<init>[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList.iterator[0m +[2;35m0 311542/2 13 method -> java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 10 method <- java/io/DeleteOnExitHook.run[0m +[2;35m0 311542/2 10 method <- java/io/File$1.run[0m +[2;35m0 311542/2 10 method -> java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 10 method <- java/util/AbstractList$Itr.hasNext[0m +[2;35m0 311542/2 10 method <- java/lang/Shutdown.runHooks[0m +[2;35m0 311542/2 12 method <- java/lang/Shutdown.sequence[0m +[2;35m0 311542/2 10 method <- java/lang/Shutdown.shutdown[0m +[2;32m0 311542/2 16 syscall -> lwp_cond_wait[0m +[2;32m0 311542/10 59973 syscall <- pollsys[0m +[2;32m0 311542/10 31 syscall -> lwp_cond_signal[0m +[2;32m0 311542/10 15 syscall <- lwp_cond_signal[0m +[2;32m0 311542/10 12 syscall -> lwp_sigmask[0m +[2;32m0 311542/10 7 syscall <- lwp_sigmask[0m +[2;32m0 311542/10 29 syscall -> lwp_exit[0m +[2;32m0 311542/2 13322 syscall <- lwp_cond_wait[0m +[2;32m0 311542/2 22 syscall -> lwp_park[0m +[2;32m0 311542/2 8 syscall <- lwp_park[0m +[2;32m0 311542/2 17 syscall -> mprotect[0m +[2;32m0 311542/2 16 syscall <- mprotect[0m +[2;32m0 311542/2 12 syscall -> lwp_cond_signal[0m +[2;32m0 311542/2 7 syscall <- lwp_cond_signal[0m +[2;32m0 311542/2 8 syscall -> lwp_cond_wait[0m +[2;32m0 311542/3 750221 syscall <- lwp_cond_wait[0m +[2;32m0 311542/3 36 syscall -> mprotect[0m +[2;32m0 311542/3 9 syscall <- mprotect[0m +[2;32m0 311542/3 7 syscall -> mprotect[0m +[2;32m0 311542/3 8 syscall <- mprotect[0m +[2;32m0 311542/3 14 syscall -> mprotect[0m +[2;32m0 311542/3 6 syscall <- mprotect[0m +[2;32m0 311542/3 40 syscall -> lwp_cond_signal[0m +[2;32m0 311542/3 7 syscall <- lwp_cond_signal[0m +[2;32m0 311542/3 7 syscall -> lwp_sigmask[0m +[2;32m0 311542/3 6 syscall <- lwp_sigmask[0m +[2;32m0 311542/3 11 syscall -> lwp_exit[0m +[2;32m0 311542/2 184 syscall <- lwp_cond_wait[0m +[2;32m0 311542/2 16 syscall -> lwp_sigmask[0m +[2;32m0 311542/2 6 syscall <- lwp_sigmask[0m +[2;32m0 311542/2 108 syscall -> unlink[0m +[2;32m0 311542/2 36 syscall <- unlink[0m +[2;32m0 311542/2 9 syscall -> lwp_sigmask[0m +[2;32m0 311542/2 6 syscall <- lwp_sigmask[0m +[2;32m0 311542/2 50 syscall -> lwp_exit[0m +[2;32m0 311542/1 6423404 syscall <- lwp_wait[0m +[2;32m0 311542/1 40 syscall -> open64[0m +[2;32m0 311542/1 101 syscall <- open64[0m +[2;32m0 311542/1 8 syscall -> ioctl[0m +[2;32m0 311542/1 14 syscall <- ioctl[0m +[2;32m0 311542/1 10 syscall -> close[0m +[2;32m0 311542/1 14 syscall <- close[0m +[2;32m0 311542/1 8 syscall -> open64[0m +[2;32m0 311542/1 31 syscall <- open64[0m +[2;32m0 311542/1 7 syscall -> ioctl[0m +[2;32m0 311542/1 7 syscall <- ioctl[0m +[2;32m0 311542/1 7 syscall -> close[0m +[2;32m0 311542/1 9 syscall <- close[0m +[2;32m0 311542/1 27 syscall -> rexit[0m +[2;32m0 311542/9 3298915 syscall <- lwp_cond_wait[0m +[2;32m0 311542/8 3375816 syscall <- lwp_cond_wait[0m +[2;32m0 311542/7 3376775 syscall <- lwp_cond_wait[0m +[2;32m0 311542/5 3738267 syscall <- lwp_cond_wait[0m +[2;32m0 311542/4 3760581 syscall <- lwp_cond_wait[0m +[2;32m0 311542/6 3376767 syscall <- lwp_park[0m + diff --git a/cddl/contrib/dtracetoolkit/Examples/j_thread_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_thread_example.txt new file mode 100644 index 000000000000..3c5e83c6ee02 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/j_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/j_who_example.txt new file mode 100644 index 000000000000..f765d4852b8b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_calldist_example.txt new file mode 100644 index 000000000000..57058b7d9a77 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_calls_example.txt new file mode 100644 index 000000000000..848e4362c9d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_calls_example.txt @@ -0,0 +1,312 @@ +The following are examples of the results of running js_calls.d + +A JavaScript program that behaves like a clock is frequently used by these +examples, since it can be left running in the background without browser +input. Browser input, such as hitting the reload button or using menus, +triggers many other JavaScript events since much of the browser uses +JavaScript. + +With Code/JavaScript/func_clock.html loaded, we trace one second of activity: + +# js_calls.d +Tracing... Hit Ctrl-C to end. +^C + FILE TYPE NAME CALLS + func_clock.html exec . 1 + func_clock.html func func_a 1 + func_clock.html func func_b 1 + func_clock.html func func_c 1 + func_clock.html func setTimeout 1 + func_clock.html func start 1 + func_clock.html obj-new Date 1 + func_clock.html func getElementById 4 + +This shows the type of calls made, 1 exec, one obj-new, several func; a more +descriptive name of each call; and a count of how many times a particular call +was made. + + +The following demonstrates what happens when a different program - +Code/JavaScript/func_slow.html is reloaded by hitting the reload button on the +browser. Apart from the func_slow.html JavaScript events, all those events +from the browser caused by moving the mouse pointer over the screen etc. have +been traced as well. + +# js_calls.d +Tracing... Hit Ctrl-C to end. + + FILE TYPE NAME CALLS + <null> obj-free BarProp 1 + <null> obj-free CSSStyleDeclaration 1 + <null> obj-free Global Scope Polluter 1 + <null> obj-free HTMLCollection 1 + <null> obj-free HTMLDocument 1 + <null> obj-free HTMLHtmlElement 1 + <null> obj-free KeyboardEvent 1 + <null> obj-free Location 1 + <null> obj-free NodeList 1 + <null> obj-free StyleSheetList 1 + <null> obj-free TreeSelection 1 + <null> obj-free Window 1 + <null> obj-free XULCommandDispatcher 1 + <null> obj-free chrome://global/content/bindings/scrollbar.xml#scrollbar 8c35ec2 1 + <null> obj-free nsXPCComponents_Classes 1 + <null> obj-free xpcTempGlobalClass 1 + <null> obj-new BarProp 1 + <null> obj-new CSSStyleDeclaration 1 + <null> obj-new Global Scope Polluter 1 + <null> obj-new HTMLCollection 1 + <null> obj-new HTMLDocument 1 + <null> obj-new HTMLHtmlElement 1 + <null> obj-new KeyboardEvent 1 + <null> obj-new NodeList 1 + <null> obj-new StyleSheetList 1 + <null> obj-new TreeSelection 1 + <null> obj-new Window 1 + <null> obj-new XULCommandDispatcher 1 + <null> obj-new chrome://global/content/bindings/popup.xml#popup 8befc22 1 + <null> obj-new chrome://global/content/bindings/popup.xml#popup 8befcea 1 + <null> obj-new chrome://global/content/bindings/scrollbar.xml#scrollbar 8ce1c1a 1 + <null> obj-new nsXPCComponents_Classes 1 + <null> obj-new xpcTempGlobalClass 1 + autocomplete.xml func apply 1 + autocomplete.xml func attachController 1 + autocomplete.xml func detachController 1 + autocomplete.xml func fireEvent 1 + autocomplete.xml func getPreventDefault 1 + autocomplete.xml func handleEnter 1 + autocomplete.xml func onKeyPress 1 + autocomplete.xml obj-new Object 1 + browser.js func BrowserLoadURL 1 + browser.js func SetPageProxyState 1 + browser.js func URLBarFocusHandler 1 + browser.js func UpdateBackForwardButtons 1 + browser.js func addEventListener 1 + browser.js func addToUrlbarHistory 1 + browser.js func canonizeUrl 1 + browser.js func charsetLoadListener 1 + browser.js func checkForDirectoryListing 1 + browser.js func contentAreaClick 1 + browser.js func createExposableURI 1 + browser.js func createFixupURI 1 + browser.js func getShortcutOrURI 1 + browser.js func getWebNavigation 1 + browser.js func handleURLBarCommand 1 + browser.js func isSuccessCode 1 + browser.js func markPageAsTyped 1 + browser.js func resolveKeyword 1 + browser.js func search 1 + browser.js func test 1 + browser.js func updateLastVisitedDate 1 + browser.js obj-new Object 1 + browser.js obj-new XPC_WN_NoMods_Proto_JSClass 1 + browser.js obj-new nsJSCID 1 + browser.xml func attachFormFill 1 + browser.xml func getAttribute 1 + browser.xml func getBoolPref 1 + consoleAPI.js obj-new Call 1 + findBar.js func getElementById 1 + firebug.js func addEventListener 1 + firebug.js obj-new Constructor 1 + firebug.js obj-new Location 1 + firebug.js obj-new Object 1 + firebug.js obj-new XPC_WN_ModsAllowed_Proto_JSClass 1 + func_slow.html exec . 1 + func_slow.html func func_a 1 + func_slow.html func func_b 1 + func_slow.html func func_c 1 + func_slow.html obj-new Function 1 + preferences.js obj-new nsJSCID 1 + reporterOverlay.js func getElementById 1 + reporterOverlay.js func setAttribute 1 + tabbox.xml func getAttribute 1 + tabbrowser.xml func QueryInterface 1 + tabbrowser.xml func getAnonymousElementByAttribute 1 + tabbrowser.xml func getBrowserIndexForDocument 1 + tabbrowser.xml func indexOf 1 + tabbrowser.xml func push 1 + tabbrowser.xml func setIcon 1 + tabbrowser.xml func setTabTitle 1 + tabbrowser.xml func shouldLoadFavIcon 1 + tabbrowser.xml func updateTitlebar 1 + tabbrowser.xml func useDefaultIcon 1 + tabbrowser.xml obj-new Array 1 + tabbrowser.xml obj-new String 1 + textbox.xml func hasAttribute 1 + textbox.xml func setAttribute 1 + webdeveloper.js func getAttribute 1 + webdeveloper.js func hasAttribute 1 + webdeveloper.js func toLowerCase 1 + webdeveloper.js func webdeveloper_changeOptions 1 + webdeveloper.js func webdeveloper_configureElement 1 + webdeveloper.js func webdeveloper_openToolbarButton 1 + webdeveloper.js func webdeveloper_updateMetaRedirects 1 + webdeveloper.js func webdeveloper_updateRenderMode 1 + webdeveloper.js obj-new Array 1 + webdeveloper.js obj-new String 1 + <null> obj-free BoxObject 2 + <null> obj-free HTMLBodyElement 2 + <null> obj-free JSOptions 2 + <null> obj-free JavaArray 2 + <null> obj-free JavaClass 2 + <null> obj-free JavaMember 2 + <null> obj-free JavaObject 2 + <null> obj-free PageTransitionEvent 2 + <null> obj-free nsJSCID 2 + <null> obj-new BoxObject 2 + <null> obj-new HTMLBodyElement 2 + <null> obj-new JSOptions 2 + <null> obj-new JavaArray 2 + <null> obj-new JavaClass 2 + <null> obj-new JavaMember 2 + <null> obj-new JavaObject 2 + <null> obj-new PageTransitionEvent 2 + autocomplete.xml func ensureRowIsVisible 2 + autocomplete.xml func initSearchNames 2 + autocomplete.xml func select 2 + autocomplete.xml obj-new Function 2 + browser.js func PageProxyClearIcon 2 + browser.js func PageProxySetIcon 2 + browser.js func URLBarClickHandler 2 + browser.js func URLBarMouseDownHandler 2 + browser.js func XPCNativeWrapper function wrapper 2 + browser.js func getService 2 + browser.js func loadURI 2 + browser.js func notifyObservers 2 + css.js func <null> 2 + dom.js func <null> 2 + events.js func <null> 2 + firebug.js func appendChild 2 + firebug.js obj-new XPC_WN_NoMods_Proto_JSClass 2 + general.xml func getAttribute 2 + layout.js func <null> 2 + preferences.js func webdeveloper_getStringPreference 2 + progressmeter.xml func createEvent 2 + progressmeter.xml func dispatchEvent 2 + progressmeter.xml func initEvent 2 + progressmeter.xml func setAttribute 2 + reporterOverlay.js obj-new Function 2 + scrollbar.xml func indexOf 2 + source.js func <null> 2 + style.js func <null> 2 + tabbox.xml func setAttribute 2 + tabbrowser.xml func getBoolPref 2 + tabbrowser.xml func getBrowserAtIndex 2 + tabbrowser.xml func schemeIs 2 + tabbrowser.xml func setAttribute 2 + textbox.xml func setSelectionRange 2 + toolbar.xml func updateStatusText 2 + tree.xml obj-new Function 2 + webdeveloper.js func getElementsByTagName 2 + webdeveloper.js func removeAttribute 2 + <null> obj-free DOM Constructor.prototype 3 + <null> obj-free With 3 + <null> obj-free nsXPCComponents 3 + <null> obj-new Array 3 + <null> obj-new DOM Constructor.prototype 3 + <null> obj-new With 3 + <null> obj-new XPC_WN_NoMods_Proto_JSClass 3 + <null> obj-new nsXPCComponents 3 + autocomplete.xml func getAttribute 3 + browser.js func QueryInterface 3 + func_slow.html func write 3 + globalOverlay.js obj-new Function 3 + progressmeter.xml func getAttribute 3 + progressmeter.xml func round 3 + scrollbar.xml obj-new String 3 + tabbrowser.xml func <null> 3 + tabbrowser.xml func hasAttribute 3 + tabbrowser.xml func updateIcon 3 + text.xml func setAttribute 3 + textbox.xml func removeAttribute 3 + utils.js func join 3 + utils.js func splice 3 + utils.js func toLowerCase 3 + utils.js obj-new Array 3 + utils.js obj-new String 3 + autocomplete.xml func closePopup 4 + browser.js func indexOf 4 + browser.js obj-new Call 4 + browser.xml func getInterface 4 + preferences.js func webdeveloper_getBooleanPreference 4 + tabbrowser.xml func getAttribute 4 + tabbrowser.xml func removeAttribute 4 + utilityOverlay.js func goUpdateGlobalEditMenuItems 4 + utils.js func isElement 4 + <null> obj-free Call 5 + view.js func <null> 5 + <null> obj-free XPCNativeWrapper 6 + <null> obj-free XPC_WN_NoMods_Proto_JSClass 6 + <null> obj-new XPCNativeWrapper 6 + XStringBundle func GetStringFromName 6 + XStringBundle func getString 6 + autocomplete.xml func createEvent 6 + autocomplete.xml func dispatchEvent 6 + autocomplete.xml func initEvent 6 + browser.js func getBrowser 6 + browser.js func setTimeout 6 + browser.js obj-new String 6 + preferences.js func getBranch 6 + preferences.js func getService 6 + preferences.js func prefHasUserValue 6 + preferences.js func webdeveloper_isPreferenceSet 6 + tabbrowser.xml func getBrowserForTab 6 + utils.js func <null> 6 + webdeveloper.js obj-new Function 6 + <null> obj-new Object 7 + firebug.js func removeAttribute 7 + tabbrowser.xml obj-new Function 7 + tree.xml func QueryInterface 7 + <null> obj-free Array 8 + browser.js func hasAttribute 8 + globalOverlay.js func removeAttribute 8 + reporterOverlay.js func <null> 8 + browser.js func getElementById 9 + browser.js func setAttribute 9 + browser.xml obj-new Function 9 + webdeveloper.js func getElementById 9 + <null> obj-free Constructor 10 + <null> obj-free Object 10 + <null> obj-free XPC_WN_ModsAllowed_Proto_JSClass 10 + <null> obj-new Constructor 10 + <null> obj-new XPC_WN_ModsAllowed_Proto_JSClass 10 + browser.js func removeAttribute 10 + firebug.js obj-new Function 10 + text.xml obj-new String 12 + webdeveloper.js func item 14 + firebug.js func getElementById 15 + <null> obj-free XULElement 16 + button.xml func hasAttribute 16 + <null> obj-free Event 17 + browser.js func <null> 17 + <null> obj-new Event 18 + text.xml func getAttribute 19 + firebug.js func getAttribute 20 + globalOverlay.js func setAttribute 20 + <null> obj-free MouseEvent 22 + <null> obj-new MouseEvent 22 + globalOverlay.js func isCommandEnabled 22 + webdeveloper.js func setAttribute 22 + <null> obj-free String 26 + firebug.js func setAttribute 26 + <null> obj-free RegExp 28 + <null> obj-new RegExp 28 + globalOverlay.js func getControllerForCommand 28 + globalOverlay.js func getElementById 28 + globalOverlay.js func goSetCommandEnabled 28 + globalOverlay.js func goUpdateCommand 28 + text.xml func test 28 + browser.js obj-new Function 30 + <null> obj-free XPCWrappedNative_NoHelper 32 + <null> obj-new XPCWrappedNative_NoHelper 32 + consoleAPI.js obj-new Function 33 + browser.xml func QueryInterface 38 + <null> obj-free JavaPackage 41 + <null> obj-new JavaPackage 41 + scrollbar.xml obj-new Function 61 + firebug.js func <null> 62 + text.xml exec . 84 + <null> obj-new XULElement 85 + <null> obj-new Function 172 + <null> obj-free Function 310 + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_calltime_example.txt new file mode 100644 index 000000000000..0b69b76e0a7a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_cpudist_example.txt new file mode 100644 index 000000000000..c71a2ad82a2e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_cputime_example.txt new file mode 100644 index 000000000000..dff42fdca9fa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_execs_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_execs_example.txt new file mode 100644 index 000000000000..d555c1a1c27d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_flow_example.txt new file mode 100644 index 000000000000..7a9278d7ce6b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_flowinfo_example.txt new file mode 100644 index 000000000000..45970c1f9e64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_flowtime_example.txt new file mode 100644 index 000000000000..46b2f2f12b28 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_objcpu_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_objcpu_example.txt new file mode 100644 index 000000000000..9e9a957ff9b9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_objgc_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_objgc_example.txt new file mode 100644 index 000000000000..711b223d08e6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_objgc_example.txt @@ -0,0 +1,230 @@ +Following are examples of running js_objgc.d. + +This script reports on the garbage collection of Java objects. That is it +will keep track of when resources are allocated to an object, and when +resources are freed from an object. It is useful for providing information on +when garbage collection is not working correctly, as this can cause the +browser to have a memory leak. + +We trace object creation (+1) and destruction (-1), and provide a summary +each second of the running tally of the object class and originating filename. + +Here we can see it running on Code/JavaScript/func_clock.html + +# js_objgc.d +Tracing... Hit Ctrl-C to end. + + FILE TOTAL CLASS 2007 Sep 23 22:59:24 + func_clock.html 1 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:25 + func_clock.html 2 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:26 + func_clock.html 3 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:27 + func_clock.html 4 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:28 + func_clock.html 5 Date + + FILE TOTAL CLASS 2007 Sep 23 22:59:29 + browser.js 3 Function + <null> 5 Function + func_clock.html 6 Date + <null> 7 MouseEvent + + FILE TOTAL CLASS 2007 Sep 23 22:59:30 + browser.js 3 Function + <null> 5 Function + func_clock.html 7 Date + <null> 10 MouseEvent + + FILE TOTAL CLASS 2007 Sep 23 22:59:31 + <null> 1 Constructor + <null> 1 HTMLBodyElement + <null> 1 XPCNativeWrapper + <null> 1 XPC_WN_ModsAllowed_Proto_JSClass + browser.js 1 Array + browser.js 1 XPCNativeWrapper + popup.xml 1 Array + func_clock.html 7 Date + <null> 13 MouseEvent + <null> 18 Function + browser.js 20 Function + + FILE TOTAL CLASS 2007 Sep 23 22:59:32 + <null> 1 BoxObject + <null> 1 Constructor + <null> 1 HTMLBodyElement + <null> 1 NodeList + <null> 1 UIEvent + <null> 1 XPCNativeWrapper + <null> 1 XPC_WN_ModsAllowed_Proto_JSClass + <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a + <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba + bookmarksMenu.js 1 Function + browser.js 1 Array + browser.js 1 XPCNativeWrapper + popup.xml 1 Function + scrollbox.xml 1 Function + <null> 2 Event + popup.xml 2 Array + bookmarks.js 3 With + firebug-service.js 3 Object + bookmarks.js 6 Object + bookmarks.js 6 XPCWrappedNative_NoHelper + func_clock.html 8 Date + firebug-service.js 10 Function + <null> 15 MouseEvent + bookmarks.js 19 Error + browser.js 20 Function + bookmarks.js 22 Function + <null> 39 XPCWrappedNative_NoHelper + <null> 44 Function + <null> 60 RegExp + <null> 191 XULElement + +[... 39 seconds deleted ...] + + FILE TOTAL CLASS 2007 Sep 23 23:00:10 + <null> 1 HTMLBodyElement + <null> 1 HTMLCollection + <null> 1 TreeColumns + <null> 1 XPCNativeWrapper + <null> 1 XPC_WN_NoMods_Proto_JSClass + <null> 1 XULTreeBuilder + <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a + <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba + <null> 1 chrome://global/content/bindings/tree.xml#treebody 84caa3a + <null> 1 chrome://global/content/bindings/tree.xml#treebody 84e3a72 + <null> 1 nsXPCComponents_Interfaces + <null> 1 nsXPCComponents_Results + bookmarksMenu.js 1 Function + browser.js 1 Array + browser.js 1 XPCNativeWrapper + browser.js 1 XPC_WN_NoMods_Proto_JSClass + nsUpdateService.js 1 XPC_WN_NoMods_Proto_JSClass + nsUpdateService.js 1 nsJSCID + popup.xml 1 Function + scrollbar.xml 1 String + scrollbox.xml 1 Function + tree.xml 1 Array + <null> 2 Constructor + <null> 2 UIEvent + <null> 2 XPC_WN_ModsAllowed_Proto_JSClass + <null> 2 nsXPCComponents_Classes + browser.js 2 nsJSCID + browser.js 2 nsJSIID + utilityOverlay.js 2 nsJSCID + utilityOverlay.js 2 nsJSIID + <null> 3 Array + <null> 3 NodeList + nsUpdateService.js 3 Array + nsUpdateService.js 3 Object + nsUpdateService.js 3 With + utilityOverlay.js 3 Call + tree.xml 4 Function + utilityOverlay.js 4 Function + nsUpdateService.js 7 nsJSIID + nsUpdateService.js 15 Function + bookmarks.js 22 Function + text.xml 23 String + <null> 36 BoxObject + func_clock.html 42 Date + bookmarks.js 57 With + firebug-service.js 57 Object + bookmarks.js 73 Error + browser.js 78 Function + popup.xml 82 Array + bookmarks.js 114 Object + bookmarks.js 114 XPCWrappedNative_NoHelper + <null> 157 MouseEvent + firebug-service.js 172 Function + <null> 307 XPCWrappedNative_NoHelper + <null> 388 RegExp + <null> 488 Event + <null> 876 XULElement + <null> 1221 Function + + FILE TOTAL CLASS 2007 Sep 23 23:00:11 + <missed> -94 Date + <missed> -34 Function + <missed> -4 MouseEvent + <missed> -2 Array + <missed> -1 HTMLBodyElement + <missed> -1 HTMLCollection + <missed> -1 XPCNativeWrapper + <missed> -1 XPC_WN_ModsAllowed_Proto_JSClass + <null> 0 Array + <null> 0 HTMLBodyElement + <null> 0 HTMLCollection + <null> 0 RegExp + <null> 0 TreeColumns + <null> 0 UIEvent + <null> 0 XPC_WN_NoMods_Proto_JSClass + <null> 0 XULTreeBuilder + <null> 0 nsXPCComponents_Classes + <null> 0 nsXPCComponents_Interfaces + <null> 0 nsXPCComponents_Results + browser.js 0 Array + browser.js 0 XPCNativeWrapper + browser.js 0 XPC_WN_NoMods_Proto_JSClass + browser.js 0 nsJSCID + nsUpdateService.js 0 Array + nsUpdateService.js 0 Function + nsUpdateService.js 0 Object + nsUpdateService.js 0 With + nsUpdateService.js 0 XPC_WN_NoMods_Proto_JSClass + nsUpdateService.js 0 nsJSCID + nsUpdateService.js 0 nsJSIID + scrollbar.xml 0 String + text.xml 0 String + tree.xml 0 Array + utilityOverlay.js 0 Call + utilityOverlay.js 0 Function + utilityOverlay.js 0 nsJSCID + <null> 1 NodeList + <null> 1 XPCNativeWrapper + <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 84ff45a + <null> 1 chrome://global/content/bindings/menu.xml#menu-iconic 8befbba + <null> 1 chrome://global/content/bindings/tree.xml#treebody 84caa3a + <null> 1 chrome://global/content/bindings/tree.xml#treebody 84e3a72 + bookmarksMenu.js 1 Function + browser.xul 1 Function + func_clock.html 1 Date + popup.xml 1 Function + scrollbox.xml 1 XULElement + scrollbox.xml 1 nsJSIID + <null> 2 Constructor + <null> 2 XPC_WN_ModsAllowed_Proto_JSClass + browser.js 2 nsJSIID + scrollbox.xml 2 Function + tree.xml 2 Function + utilityOverlay.js 2 nsJSIID + popup.xml 3 Array + bookmarks.js 5 With + firebug-service.js 5 Object + <null> 6 Event + <null> 6 MouseEvent + bookmarks.js 9 XPCWrappedNative_NoHelper + <null> 10 XPCWrappedNative_NoHelper + bookmarks.js 10 Object + browser.js 10 Function + bookmarks.js 15 Function + firebug-service.js 16 Function + <null> 18 BoxObject + bookmarks.js 75 Error + <null> 79 Function + <null> 315 XULElement +^C + +Just after time 23:00:10, garbage collection fired cleaning up many objects. +The final output shows a much reduced object count including a negative +count for objects created before this script was tracing. + +If over the period of several minutes an object type is still steadily +increasing, then that would be of interest. Be patient, depending on the rate +of object creation it can take over ten minutes for garbage collect to kick in. + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_objnew_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_objnew_example.txt new file mode 100644 index 000000000000..c3a888120f78 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/js_objnew_example.txt @@ -0,0 +1,100 @@ +The following are examples of the results of running js_objnew.d. + +It reports on the class type of new objects created. + +Here we can see it running on the program Code/JavaScript/func_clock.html. + +# js_objnew.d +Tracing... Hit Ctrl-C to end. +^C + FILE CLASS COUNT + func_clock.html Date 2 + +The results are very simple, func_clock.html caused two new objects to be +created, both of type 'Date'. + + +Here is a more complicated example, running on the program +Code/JavaScript/func_slow.html, with the results of that plus JavaScript caused +by hitting reload on the browser. + + +# js_objnew.d +Tracing... Hit Ctrl-C to end. +^C + FILE CLASS COUNT + <null> BarProp 1 + <null> CSSStyleDeclaration 1 + <null> Global Scope Polluter 1 + <null> HTMLBodyElement 1 + <null> HTMLDocument 1 + <null> HTMLHtmlElement 1 + <null> NodeList 1 + <null> StyleSheetList 1 + <null> TreeSelection 1 + <null> Window 1 + <null> XULCommandDispatcher 1 + <null> chrome://global/content/bindings/popup.xml#popup 8c35c92 1 + <null> chrome://global/content/bindings/popup.xml#popup 8fb299a 1 + <null> chrome://global/content/bindings/scrollbar.xml#scrollbar 8fb2ea2 1 + <null> nsXPCComponents_Classes 1 + <null> xpcTempGlobalClass 1 + autocomplete.xml Object 1 + browser.js Array 1 + browser.js Object 1 + browser.js XPC_WN_NoMods_Proto_JSClass 1 + browser.js nsJSCID 1 + consoleAPI.js Call 1 + firebug.js Constructor 1 + firebug.js Location 1 + firebug.js Object 1 + firebug.js XPC_WN_ModsAllowed_Proto_JSClass 1 + func_slow.html Function 1 + popup.xml Array 1 + preferences.js nsJSCID 1 + tabbrowser.xml Array 1 + tabbrowser.xml String 1 + webdeveloper.js Array 1 + webdeveloper.js String 1 + <null> BoxObject 2 + <null> JSOptions 2 + <null> JavaArray 2 + <null> JavaClass 2 + <null> JavaMember 2 + <null> JavaObject 2 + <null> PageTransitionEvent 2 + autocomplete.xml Function 2 + firebug.js XPC_WN_NoMods_Proto_JSClass 2 + reporterOverlay.js Function 2 + tree.xml Function 2 + <null> Array 3 + <null> DOM Constructor.prototype 3 + <null> With 3 + <null> XPC_WN_NoMods_Proto_JSClass 3 + <null> nsXPCComponents 3 + globalOverlay.js Function 3 + scrollbar.xml String 3 + utils.js Array 3 + utils.js String 3 + browser.js Call 4 + func_clock.html Date 4 + webdeveloper.js Function 4 + <null> XPCNativeWrapper 5 + browser.js String 6 + <null> Object 7 + tabbrowser.xml Function 7 + <null> XPC_WN_ModsAllowed_Proto_JSClass 8 + <null> Constructor 9 + browser.xml Function 9 + firebug.js Function 10 + <null> MouseEvent 12 + <null> XPCWrappedNative_NoHelper 13 + <null> KeyboardEvent 14 + <null> XULElement 16 + <null> Event 29 + browser.js Function 33 + consoleAPI.js Function 33 + <null> JavaPackage 41 + scrollbar.xml Function 61 + <null> Function 211 + diff --git a/cddl/contrib/dtracetoolkit/Examples/js_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_stat_example.txt new file mode 100644 index 000000000000..b658b4f05422 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/js_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/js_who_example.txt new file mode 100644 index 000000000000..06e3e31c6020 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/kill_example.txt b/cddl/contrib/dtracetoolkit/Examples/kill_example.txt new file mode 100644 index 000000000000..f73621c6d252 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/kstat_types_example.txt b/cddl/contrib/dtracetoolkit/Examples/kstat_types_example.txt new file mode 100644 index 000000000000..8ffecbff70eb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/lastwords_example.txt b/cddl/contrib/dtracetoolkit/Examples/lastwords_example.txt new file mode 100644 index 000000000000..5452d2e36f25 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/loads_example.txt b/cddl/contrib/dtracetoolkit/Examples/loads_example.txt new file mode 100644 index 000000000000..f369f960ad8d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/lockbydist_example.txt b/cddl/contrib/dtracetoolkit/Examples/lockbydist_example.txt new file mode 100644 index 000000000000..7310e5adde26 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/lockbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/lockbyproc_example.txt new file mode 100644 index 000000000000..11092353fdf3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/minfbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/minfbypid_example.txt new file mode 100644 index 000000000000..c2fffb4c6f26 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/minfbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/minfbyproc_example.txt new file mode 100644 index 000000000000..0c1ce8401c82 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/mmapfiles_example.txt b/cddl/contrib/dtracetoolkit/Examples/mmapfiles_example.txt new file mode 100644 index 000000000000..eca437056040 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/modcalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/modcalls_example.txt new file mode 100644 index 000000000000..f920d20581bf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/newproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/newproc_example.txt new file mode 100644 index 000000000000..f392b050f88a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/nfswizard_example.txt b/cddl/contrib/dtracetoolkit/Examples/nfswizard_example.txt new file mode 100644 index 000000000000..68fb18542377 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/oneliners_examples.txt b/cddl/contrib/dtracetoolkit/Examples/oneliners_examples.txt new file mode 100644 index 000000000000..9ca0fa62f671 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/opensnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/opensnoop_example.txt new file mode 100644 index 000000000000..329d09b50340 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pathopens_example.txt b/cddl/contrib/dtracetoolkit/Examples/pathopens_example.txt new file mode 100644 index 000000000000..b5004dd3fc93 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pfilestat_example.txt b/cddl/contrib/dtracetoolkit/Examples/pfilestat_example.txt new file mode 100644 index 000000000000..b2c54a031f0c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/pfilestat_example.txt @@ -0,0 +1,200 @@ +The following are sample outputs of the pfilestat tool for various scenarios. + + + +Starting with something simple, + +Running: dd if=/dev/rdsk/c0d0s0 of=/dev/null bs=56k # x86, 32-bit + + # ./pfilestat `pgrep -x dd` + + STATE FDNUM Time Filename + read 3 2% /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0 + write 4 3% /devices/pseudo/mm@0:null + waitcpu 0 7% + running 0 16% + sleep-r 0 69% + + STATE FDNUM KB/s Filename + write 4 53479 /devices/pseudo/mm@0:null + read 3 53479 /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0 + + Total event time (ms): 4999 Total Mbytes/sec: 104 + +Most of the time we are sleeping on read, which is to be expected as dd on +the raw device is simple -> read:entry, strategy, biodone, read:return. +CPU time in read() itself is small. + + + +Now for the dsk device, + +Running: dd if=/dev/dsk/c0d0s0 of=/dev/null bs=56k # x86, 32-bit + + # ./pfilestat `pgrep -x dd` + + STATE FDNUM Time Filename + write 4 5% /devices/pseudo/mm@0:null + waitcpu 0 8% + running 0 15% + sleep-r 0 18% + read 3 53% /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0 + + STATE FDNUM KB/s Filename + read 3 53492 /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0 + write 4 53492 /devices/pseudo/mm@0:null + + Total event time (ms): 4914 Total Mbytes/sec: 102 + +Woah, we are now spending much more time in read()! I imagine segmap is +a busy bee. The "running" and "write" times are hardly different. + + + +Now for a SPARC demo of the same, + +Running: dd if=/dev/dsk/c0d0s0 of=/dev/null bs=56k # SPARC, 64-bit + + # ./pfilestat `pgrep -x dd` + + STATE FDNUM Time Filename + write 4 3% /devices/pseudo/mm@0:zero + waitcpu 0 7% + running 0 17% + read 3 24% /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a + sleep-r 0 54% + + STATE FDNUM KB/s Filename + read 3 13594 /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a + write 4 13606 /devices/pseudo/mm@0:zero + + Total event time (ms): 4741 Total Mbytes/sec: 25 + +I did prime the cache by running this a few times first. There is less +read() time than with the x86 32-bit demo, as I would guess that the +process is more often exhausting the (faster) segmap cache and getting +to the point where it must sleep. (However, do take this comparison with +a grain of salt - my development servers aren't ideal for comparing +statistics: one is a 867 MHz Pentium, and the other a 360 MHz Ultra 5). + +The file system cache is faster on 64-bit systems due to the segkpm +enhancement in Solaris 10. For details see, +http://blogs.sun.com/roller/page/rmc?entry=solaris_10_fast_filesystem_cache + + + +Now, back to x86. + +Running: tar cf /dev/null / + + # ./pfilestat `pgrep -x tar` + + STATE FDNUM Time Filename + read 11 0% /extra1/test/amd64/libCstd.so.1 + read 11 0% /extra1/test/amd64/libXm.so + read 11 0% /extra1/test/amd64/libXm.so.4 + read 11 1% /extra1/test/amd64/libgtk-x11-2.0.so + read 11 2% /extra1/test/amd64/libgtk-x11-2.0.so.0 + waitcpu 0 2% + read 9 4% /extra1/5000 + write 3 7% /devices/pseudo/mm@0:null + running 0 19% + sleep-r 0 46% + + STATE FDNUM KB/s Filename + read 11 293 /extra1/test/amd64/libgdk-x11-2.0.so + read 11 295 /extra1/test/amd64/libgdk-x11-2.0.so.0 + read 9 476 /extra1/1000 + read 11 526 /extra1/test/amd64/libCstd.so.1 + read 11 594 /extra1/test/amd64/libXm.so.4 + read 11 594 /extra1/test/amd64/libXm.so + read 11 1603 /extra1/test/amd64/libgtk-x11-2.0.so.0 + read 11 1606 /extra1/test/amd64/libgtk-x11-2.0.so + read 9 4078 /extra1/5000 + write 3 21254 /devices/pseudo/mm@0:null + + Total event time (ms): 4903 Total Mbytes/sec: 41 + +Fair enough. tar is crusing along at 21 Mbytes/sec (writes to fd 3!). + + + +More interesting is to do the following, + +Running: tar cf - / | gzip > /dev/null + + # ./pfilestat `pgrep -x tar` + + STATE FDNUM Time Filename + read 11 0% /extra1/test/amd64/libm.so + read 11 0% /extra1/test/amd64/libm.so.2 + read 11 0% /extra1/test/amd64/libnsl.so + read 11 0% /extra1/test/amd64/libnsl.so.1 + read 11 0% /extra1/test/amd64/libc.so.1 + write 3 2% <none> + waitcpu 0 4% + sleep-r 0 4% + running 0 6% + sleep-w 0 78% + + STATE FDNUM KB/s Filename + read 11 74 /extra1/test/amd64/libldap.so + read 11 75 /extra1/test/amd64/libldap.so.5 + read 11 75 /extra1/test/amd64/libresolv.so.2 + read 11 76 /extra1/test/amd64/libresolv.so + read 11 97 /extra1/test/amd64/libm.so.2 + read 11 98 /extra1/test/amd64/libm.so + read 11 174 /extra1/test/amd64/libnsl.so + read 11 176 /extra1/test/amd64/libnsl.so.1 + read 11 216 /extra1/test/amd64/libc.so.1 + write 3 3022 <none> + + Total event time (ms): 4911 Total Mbytes/sec: 6 + +Woah now, tar is writing 3 Mbytes/sec - AND spending 78% of it's time on +sleep-w, sleeping on writes! Of course, this is because we are piping the +output to gzip, which is spending a while compressing the data. 78% +matches the time gzip was on the CPU (using either "prstat -m" or dtrace +to measure; procfs's pr_pctcpu would take too long to catch up). + + + + +Also interesting is, + +Running: perl -e 'while (1) {;}' & +Running: perl -e 'while (1) {;}' & +Running: perl -e 'while (1) {;}' & +Running: perl -e 'while (1) {;}' & +Running: tar cf /dev/null / + + # ./pfilestat `pgrep -x tar` + + STATE FDNUM Time Filename + read 11 0% /extra1/test/amd64/libxml2.so.2 + read 11 0% /extra1/test/amd64/libgdk-x11-2.0.so.0 + read 11 0% /extra1/test/amd64/libgdk-x11-2.0.so + read 11 0% /extra1/test/amd64/libCstd.so.1 + read 11 0% /extra1/test/amd64/libgtk-x11-2.0.so.0 + read 11 2% /extra1/test/amd64/libgtk-x11-2.0.so + write 3 2% /devices/pseudo/mm@0:null + running 0 8% + sleep-r 0 22% + waitcpu 0 65% + + STATE FDNUM KB/s Filename + read 11 182 /extra1/test/amd64/libsun_fc.so + read 11 264 /extra1/test/amd64/libglib-2.0.so + read 11 266 /extra1/test/amd64/libglib-2.0.so.0 + read 11 280 /extra1/test/amd64/libxml2.so.2 + read 11 293 /extra1/test/amd64/libgdk-x11-2.0.so + read 11 295 /extra1/test/amd64/libgdk-x11-2.0.so.0 + read 11 526 /extra1/test/amd64/libCstd.so.1 + read 11 761 /extra1/test/amd64/libgtk-x11-2.0.so.0 + read 11 1606 /extra1/test/amd64/libgtk-x11-2.0.so + write 3 7881 /devices/pseudo/mm@0:null + + Total event time (ms): 4596 Total Mbytes/sec: 13 + +Now we have "waitcpu" as tar competes for CPU cycles along with the greedy +infinite perl processes. diff --git a/cddl/contrib/dtracetoolkit/Examples/pgpginbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/pgpginbypid_example.txt new file mode 100644 index 000000000000..8326b904d94c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pgpginbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/pgpginbyproc_example.txt new file mode 100644 index 000000000000..e8bb8217a138 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_calldist_example.txt new file mode 100644 index 000000000000..db3b0af9d542 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_calltime_example.txt new file mode 100644 index 000000000000..d76cb6e02581 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_cpudist_example.txt new file mode 100644 index 000000000000..6da7d29d8f4d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_cputime_example.txt new file mode 100644 index 000000000000..db218e1d1f53 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_flow_example.txt new file mode 100644 index 000000000000..6470daf087b3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_flowinfo_example.txt new file mode 100644 index 000000000000..3b2e3c1f314c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_flowtime_example.txt new file mode 100644 index 000000000000..57eb69c6dc64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_funccalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_funccalls_example.txt new file mode 100644 index 000000000000..7155a7139b92 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_malloc_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_malloc_example.txt new file mode 100644 index 000000000000..853d08299314 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_syscalls_example.txt new file mode 100644 index 000000000000..c783420fc0fb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/php_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_syscolors_example.txt new file mode 100644 index 000000000000..96b26a8877df --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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 +[2;35m0 18426/1 8 func_abc.php:22 func -> func_a[0m +[2;35m0 18426/1 41 func_abc.php:18 func -> sleep[0m +[2;32m0 18426/1 15 ":- syscall -> nanosleep[0m +[2;32m0 18426/1 1008700 ":- syscall <- nanosleep[0m +[2;35m0 18426/1 30 func_abc.php:18 func <- sleep[0m +[2;35m0 18426/1 42 func_abc.php:19 func -> func_b[0m +[2;35m0 18426/1 28 func_abc.php:11 func -> sleep[0m +[2;32m0 18426/1 14 ":- syscall -> nanosleep[0m +[2;32m0 18426/1 1010083 ":- syscall <- nanosleep[0m +[2;35m0 18426/1 29 func_abc.php:11 func <- sleep[0m +[2;35m0 18426/1 43 func_abc.php:12 func -> func_c[0m +[2;35m0 18426/1 28 func_abc.php:5 func -> sleep[0m +[2;32m0 18426/1 14 ":- syscall -> nanosleep[0m +[2;32m0 18426/1 1009794 ":- syscall <- nanosleep[0m +[2;35m0 18426/1 28 func_abc.php:5 func <- sleep[0m +[2;35m0 18426/1 34 func_abc.php:6 func <- func_c[0m +[2;35m0 18426/1 18 func_abc.php:13 func <- func_b[0m +[2;35m0 18426/1 17 func_abc.php:20 func <- func_a[0m +[2;32m0 18426/1 21 ":- syscall -> fchdir[0m +[2;32m0 18426/1 19 ":- syscall <- fchdir[0m +[2;32m0 18426/1 9 ":- syscall -> close[0m +[2;32m0 18426/1 13 ":- syscall <- close[0m +[2;32m0 18426/1 35 ":- syscall -> semsys[0m +[2;32m0 18426/1 12 ":- syscall <- semsys[0m +[2;32m0 18426/1 7 ":- syscall -> semsys[0m +[2;32m0 18426/1 7 ":- syscall <- semsys[0m +[2;32m0 18426/1 66 ":- syscall -> setitimer[0m +[2;32m0 18426/1 8 ":- syscall <- setitimer[0m +[2;32m0 18426/1 39 ":- syscall -> read[0m +[2;32m0 18426/1 14 ":- syscall <- read[0m +[2;32m0 18426/1 11 ":- syscall -> writev[0m +[2;32m0 18426/1 22 ":- syscall <- writev[0m +[2;32m0 18426/1 23 ":- syscall -> write[0m +[2;32m0 18426/1 110 ":- syscall <- write[0m +[2;32m0 18426/1 61 ":- syscall -> pollsys[0m + +In this excerpt: +[2;35m0 18426/1 43 func_abc.php:12 func -> func_c[0m +[2;35m0 18426/1 28 func_abc.php:5 func -> sleep[0m +[2;32m0 18426/1 14 ":- syscall -> nanosleep[0m +[2;32m0 18426/1 1009794 ":- syscall <- nanosleep[0m +[2;35m0 18426/1 28 func_abc.php:5 func <- sleep[0m +[2;35m0 18426/1 34 func_abc.php:6 func <- func_c[0m + +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/cddl/contrib/dtracetoolkit/Examples/php_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/php_who_example.txt new file mode 100644 index 000000000000..cee32b2f8494 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pidpersec_example.txt b/cddl/contrib/dtracetoolkit/Examples/pidpersec_example.txt new file mode 100644 index 000000000000..11f6bd7c1fc9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_calldist_example.txt new file mode 100644 index 000000000000..f53b7f54777d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_calltime_example.txt new file mode 100644 index 000000000000..3cc5480fdc2d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_cpudist_example.txt new file mode 100644 index 000000000000..a2ccff83f4ed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_cputime_example.txt new file mode 100644 index 000000000000..5dc56eead288 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_flow_example.txt new file mode 100644 index 000000000000..dcce6e04de03 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_flowinfo_example.txt new file mode 100644 index 000000000000..e4b406f14c49 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_flowtime_example.txt new file mode 100644 index 000000000000..24c53838a9e6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_malloc_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_malloc_example.txt new file mode 100644 index 000000000000..a22a0082309d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_subcalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_subcalls_example.txt new file mode 100644 index 000000000000..1ea0369f4ed2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_syscalls_example.txt new file mode 100644 index 000000000000..8cd509401708 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pl_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_syscolors_example.txt new file mode 100644 index 000000000000..3a5f249c9175 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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 +[2;32m0 305181 2 ":- syscall -> munmap[0m +[2;32m0 305181 33 ":- syscall <- munmap[0m +[2;32m0 305181 59 ":- syscall -> mmap[0m +[2;32m0 305181 18 ":- syscall <- mmap[0m +[2;32m0 305181 35 ":- syscall -> setcontext[0m +[2;32m0 305181 8 ":- syscall <- setcontext[0m +[2;32m0 305181 8 ":- syscall -> getrlimit[0m +[2;32m0 305181 9 ":- syscall <- getrlimit[0m +[2;32m0 305181 8 ":- syscall -> getpid[0m +[2;32m0 305181 7 ":- syscall <- getpid[0m +[2;32m0 305181 64 ":- syscall -> setcontext[0m +[2;32m0 305181 6 ":- syscall <- setcontext[0m +[2;32m0 305181 137 ":- syscall -> sigpending[0m +[2;32m0 305181 8 ":- syscall <- sigpending[0m +[2;32m0 305181 1148 ":- syscall -> sysi86[0m +[2;32m0 305181 11 ":- syscall <- sysi86[0m +[2;32m0 305181 105 ":- syscall -> open64[0m +[2;32m0 305181 96 ":- syscall <- open64[0m +[2;32m0 305181 13 ":- syscall -> ioctl[0m +[2;32m0 305181 18 ":- syscall <- ioctl[0m +[2;32m0 305181 14 ":- syscall -> close[0m +[2;32m0 305181 14 ":- syscall <- close[0m +[2;32m0 305181 123 ":- syscall -> sigaction[0m +[2;32m0 305181 9 ":- syscall <- sigaction[0m +[2;32m0 305181 49 ":- syscall -> brk[0m +[2;32m0 305181 9 ":- syscall <- brk[0m +[2;32m0 305181 8 ":- syscall -> brk[0m +[2;32m0 305181 16 ":- syscall <- brk[0m +[2;32m0 305181 63 ":- syscall -> brk[0m +[2;32m0 305181 7 ":- syscall <- brk[0m +[2;32m0 305181 7 ":- syscall -> brk[0m +[2;32m0 305181 8 ":- syscall <- brk[0m +[2;32m0 305181 43 ":- syscall -> brk[0m +[2;32m0 305181 7 ":- syscall <- brk[0m +[2;32m0 305181 7 ":- syscall -> brk[0m +[2;32m0 305181 8 ":- syscall <- brk[0m +[2;32m0 305181 141 ":- syscall -> brk[0m +[2;32m0 305181 7 ":- syscall <- brk[0m +[2;32m0 305181 8 ":- syscall -> brk[0m +[2;32m0 305181 9 ":- syscall <- brk[0m +[2;32m0 305181 24 ":- syscall -> brk[0m +[2;32m0 305181 7 ":- syscall <- brk[0m +[2;32m0 305181 7 ":- syscall -> brk[0m +[2;32m0 305181 8 ":- syscall <- brk[0m +[2;32m0 305181 30 ":- syscall -> getuid[0m +[2;32m0 305181 7 ":- syscall <- getuid[0m +[2;32m0 305181 10 ":- syscall -> getuid[0m +[2;32m0 305181 6 ":- syscall <- getuid[0m +[2;32m0 305181 10 ":- syscall -> getgid[0m +[2;32m0 305181 7 ":- syscall <- getgid[0m +[2;32m0 305181 9 ":- syscall -> getgid[0m +[2;32m0 305181 6 ":- syscall <- getgid[0m +[2;32m0 305181 117 ":- syscall -> sysconfig[0m +[2;32m0 305181 9 ":- syscall <- sysconfig[0m +[2;32m0 305181 19 ":- syscall -> open64[0m +[2;32m0 305181 59 ":- syscall <- open64[0m +[2;32m0 305181 15 ":- syscall -> read[0m +[2;32m0 305181 11 ":- syscall <- read[0m +[2;32m0 305181 8 ":- syscall -> close[0m +[2;32m0 305181 8 ":- syscall <- close[0m +[2;32m0 305181 34 ":- syscall -> gtime[0m +[2;32m0 305181 7 ":- syscall <- gtime[0m +[2;32m0 305181 34 ":- syscall -> brk[0m +[2;32m0 305181 7 ":- syscall <- brk[0m +[2;32m0 305181 7 ":- syscall -> brk[0m +[2;32m0 305181 9 ":- syscall <- brk[0m +[2;32m0 305181 44 ":- syscall -> sysconfig[0m +[2;32m0 305181 7 ":- syscall <- sysconfig[0m +[2;32m0 305181 9 ":- syscall -> brk[0m +[2;32m0 305181 6 ":- syscall <- brk[0m +[2;32m0 305181 7 ":- syscall -> brk[0m +[2;32m0 305181 8 ":- syscall <- brk[0m +[2;32m0 305181 145 ":- syscall -> open64[0m +[2;32m0 305181 16 ":- syscall <- open64[0m +[2;32m0 305181 16 ":- syscall -> fcntl[0m +[2;32m0 305181 7 ":- syscall <- fcntl[0m +[2;32m0 305181 10 ":- syscall -> sigaction[0m +[2;32m0 305181 7 ":- syscall <- sigaction[0m +[2;32m0 305181 8 ":- syscall -> brk[0m +[2;32m0 305181 7 ":- syscall <- brk[0m +[2;32m0 305181 7 ":- syscall -> brk[0m +[2;32m0 305181 9 ":- syscall <- brk[0m +[2;32m0 305181 104 ":- syscall -> brk[0m +[2;32m0 305181 7 ":- syscall <- brk[0m +[2;32m0 305181 7 ":- syscall -> brk[0m +[2;32m0 305181 8 ":- syscall <- brk[0m +[2;32m0 305181 88 ":- syscall -> getpid[0m +[2;32m0 305181 7 ":- syscall <- getpid[0m +[2;32m0 305181 8 ":- syscall -> brk[0m +[2;32m0 305181 6 ":- syscall <- brk[0m +[2;32m0 305181 7 ":- syscall -> brk[0m +[2;32m0 305181 8 ":- syscall <- brk[0m +[2;32m0 305181 105 ":- syscall -> fstat64[0m +[2;32m0 305181 10 ":- syscall <- fstat64[0m +[2;32m0 305181 16 ":- syscall -> fstat64[0m +[2;32m0 305181 7 ":- syscall <- fstat64[0m +[2;32m0 305181 25 ":- syscall -> ioctl[0m +[2;32m0 305181 8 ":- syscall <- ioctl[0m +[2;32m0 305181 7 ":- syscall -> read[0m +[2;32m0 305181 23 ":- syscall <- read[0m +[2;32m0 305181 18 ":- syscall -> llseek[0m +[2;32m0 305181 8 ":- syscall <- llseek[0m +[2;32m0 305181 126 ":- syscall -> llseek[0m +[2;32m0 305181 7 ":- syscall <- llseek[0m +[2;32m0 305181 34 ":- syscall -> llseek[0m +[2;32m0 305181 7 ":- syscall <- llseek[0m +[2;32m0 305181 30 ":- syscall -> llseek[0m +[2;32m0 305181 7 ":- syscall <- llseek[0m +[2;32m0 305181 12 ":- syscall -> read[0m +[2;32m0 305181 8 ":- syscall <- read[0m +[2;32m0 305181 11 ":- syscall -> llseek[0m +[2;32m0 305181 6 ":- syscall <- llseek[0m +[2;32m0 305181 7 ":- syscall -> close[0m +[2;32m0 305181 8 ":- syscall <- close[0m +[2;35m0 305181 27 func_a:15 sub -> ./func_abc.pl[0m +[2;32m0 305181 36 ":- syscall -> ioctl[0m +[2;32m0 305181 7 ":- syscall <- ioctl[0m +[2;32m0 305181 8 ":- syscall -> fstat64[0m +[2;32m0 305181 8 ":- syscall <- fstat64[0m +[2;32m0 305181 8 ":- syscall -> brk[0m +[2;32m0 305181 7 ":- syscall <- brk[0m +[2;32m0 305181 7 ":- syscall -> brk[0m +[2;32m0 305181 9 ":- syscall <- brk[0m +[2;32m0 305181 23 ":- syscall -> fstat64[0m +[2;32m0 305181 7 ":- syscall <- fstat64[0m +[2;32m0 305181 13 ":- syscall -> gtime[0m +[2;32m0 305181 7 ":- syscall <- gtime[0m +[2;32m0 305181 11 ":- syscall -> nanosleep[0m +[2;32m0 305181 1007250 ":- syscall <- nanosleep[0m +[2;32m0 305181 24 ":- syscall -> gtime[0m +[2;32m0 305181 15 ":- syscall <- gtime[0m +[2;35m0 305181 21 func_b:9 sub -> ./func_abc.pl[0m +[2;32m0 305181 27 ":- syscall -> gtime[0m +[2;32m0 305181 6 ":- syscall <- gtime[0m +[2;32m0 305181 8 ":- syscall -> nanosleep[0m +[2;32m0 305181 1009847 ":- syscall <- nanosleep[0m +[2;32m0 305181 24 ":- syscall -> gtime[0m +[2;32m0 305181 15 ":- syscall <- gtime[0m +[2;35m0 305181 21 func_c:4 sub -> ./func_abc.pl[0m +[2;32m0 305181 27 ":- syscall -> gtime[0m +[2;32m0 305181 6 ":- syscall <- gtime[0m +[2;32m0 305181 8 ":- syscall -> nanosleep[0m +Function A +Function B +Function C +[2;32m0 305181 1009916 ":- syscall <- nanosleep[0m +[2;32m0 305181 24 ":- syscall -> gtime[0m +[2;32m0 305181 15 ":- syscall <- gtime[0m +[2;35m0 305181 20 func_c:4 sub <- ./func_abc.pl[0m +[2;35m0 305181 29 func_b:9 sub <- ./func_abc.pl[0m +[2;35m0 305181 12 func_a:15 sub <- ./func_abc.pl[0m +[2;32m0 305181 51 ":- syscall -> schedctl[0m +[2;32m0 305181 53 ":- syscall <- schedctl[0m +[2;32m0 305181 16 ":- syscall -> setcontext[0m +[2;32m0 305181 8 ":- syscall <- setcontext[0m +[2;32m0 305181 21 ":- syscall -> write[0m +[2;32m0 305181 97 ":- syscall <- write[0m +[2;32m0 305181 28 ":- syscall -> open64[0m +[2;32m0 305181 101 ":- syscall <- open64[0m +[2;32m0 305181 9 ":- syscall -> ioctl[0m +[2;32m0 305181 10 ":- syscall <- ioctl[0m +[2;32m0 305181 10 ":- syscall -> close[0m +[2;32m0 305181 15 ":- syscall <- close[0m +[2;32m0 305181 35 ":- syscall -> rexit[0m + +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/cddl/contrib/dtracetoolkit/Examples/pl_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/pl_who_example.txt new file mode 100644 index 000000000000..4ef361d69d01 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/priclass_example.txt b/cddl/contrib/dtracetoolkit/Examples/priclass_example.txt new file mode 100644 index 000000000000..bf63e098e62e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/pridist_example.txt b/cddl/contrib/dtracetoolkit/Examples/pridist_example.txt new file mode 100644 index 000000000000..1f930ab03ce5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/procsystime_example.txt b/cddl/contrib/dtracetoolkit/Examples/procsystime_example.txt new file mode 100644 index 000000000000..89f98bbca7dc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/putnexts_example.txt b/cddl/contrib/dtracetoolkit/Examples/putnexts_example.txt new file mode 100644 index 000000000000..fd7fc3db40df --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/py_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_calldist_example.txt new file mode 100644 index 000000000000..da44430213a2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_calldist_example.txt @@ -0,0 +1,966 @@ +The following are examples of py_calldist.d. + +This script traces the elapsed time of Python functions and prints a report in +the form of a histogram. Here it traces the example program, +Code/Python/func_abc.py + +The results are displayed in two sections, the first, Exclusive function +elapsed times, shows us the time spent in each functions, not including time +spent in subroutines. + +The third section, Inclusive function elapsed times, shows us the time spent +in each function, this time including that time spent in subroutines called +by those functions. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. + +# py_calldist.d +Tracing... Hit Ctrl-C to end. +^C + +Exclusive function elapsed times (us), + UserDict.py, func, IterableUserDict + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + __init__.py, func, CodecRegistryError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamConverter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamReader + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamWriter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, getregentry + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Helper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, aliasmbcs + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setencoding + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, sethelper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + types.py, func, _C + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _OptionError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _processoptions + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + UserDict.py, func, __init__ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, Codec + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReaderWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamRecoder + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + os.py, func, _Environ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, _Printer + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, setquit + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + copy_reg.py, func, constructor + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + site.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + warnings.py, func, simplefilter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + __init__.py, func, normalize_encoding + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + linecache.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, dirname + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, split + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + stat.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + stat.py, func, S_IFMT + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 4 | 0 + + UserDict.py, func, UserDict + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + os.py, func, __init__ + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, basename + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, normcase + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@ 6 + 2 |@@@@@@@@@@@@@@@@@@@@@@@ 8 + 4 | 0 + + aliases.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + copy_reg.py, func, pickle + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 16 |@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + <string>, func, ? + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 4 | 0 + 8 | 0 + 16 |@@@@ 1 + 32 | 0 + + posixpath.py, func, isabs + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 4 |@@ 1 + 8 | 0 + + stat.py, func, S_ISDIR + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 16 |@@@@@@@ 1 + 32 | 0 + + UserDict.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + ascii.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, addsitepackages + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, removeduppaths + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, setcopyright + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + types.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + posixpath.py, func, join + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 4 |@@@@@@@@@@@@ 6 + 8 |@@ 1 + 16 | 0 + 32 |@@ 1 + 64 | 0 + + UserDict.py, func, DictMixin + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + __init__.py, func, search_function + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + codecs.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + copy_reg.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + os.py, func, _get_exports_list + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, _init_pathinfo + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, abs__file__ + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, main + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + warnings.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, normpath + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + 16 | 0 + + posixpath.py, func, isdir + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 32 |@@@@@ 1 + 64 |@@@@@ 1 + 128 | 0 + + site.py, func, addpackage + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@ 1 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 256 | 0 + + posixpath.py, func, abspath + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 32 |@@ 1 + 64 | 0 + + site.py, func, makepath + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 64 | 0 + + posixpath.py, func, ? + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, ? + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, execsitecustomize + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, addsitedir + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + os.py, func, _exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7 + 32 |@@@@@@@@ 2 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + __init__.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + os.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + func_abc.py, func, ? + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + func_abc.py, func, func_a + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.py, func, func_b + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.py, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + +Inclusive function elapsed times (us), + UserDict.py, func, IterableUserDict + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + __init__.py, func, CodecRegistryError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamConverter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamReader + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamWriter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, getregentry + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Helper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, aliasmbcs + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setencoding + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, sethelper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + types.py, func, _C + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _OptionError + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _processoptions + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + UserDict.py, func, __init__ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, Codec + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReaderWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamRecoder + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + os.py, func, _Environ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, _Printer + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, setquit + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + copy_reg.py, func, constructor + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + site.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + warnings.py, func, simplefilter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + __init__.py, func, normalize_encoding + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + linecache.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, split + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + stat.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + stat.py, func, S_IFMT + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 4 | 0 + + UserDict.py, func, UserDict + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + os.py, func, __init__ + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, basename + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, dirname + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + posixpath.py, func, normcase + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@ 6 + 2 |@@@@@@@@@@@@@@@@@@@@@@@ 8 + 4 | 0 + + aliases.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + posixpath.py, func, exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + copy_reg.py, func, pickle + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@ 1 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + posixpath.py, func, isabs + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 4 |@@ 1 + 8 | 0 + + ascii.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, setcopyright + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + stat.py, func, S_ISDIR + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 16 |@@@@@@@@@@@@@ 2 + 32 | 0 + + types.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + posixpath.py, func, join + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 4 |@@@@@@@@@@@@ 6 + 8 |@@ 1 + 16 | 0 + 32 |@@ 1 + 64 | 0 + + UserDict.py, func, DictMixin + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + codecs.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + os.py, func, _get_exports_list + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, normpath + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + 16 | 0 + + UserDict.py, func, ? + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + __init__.py, func, search_function + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + copy_reg.py, func, ? + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, func, abs__file__ + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, func, removeduppaths + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + warnings.py, func, ? + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + posixpath.py, func, isdir + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@ 1 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@ 5 + 64 |@@@@@@@@@@ 2 + 128 | 0 + + posixpath.py, func, ? + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, _init_pathinfo + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, execsitecustomize + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + posixpath.py, func, abspath + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + 64 | 0 + + os.py, func, _exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@ 4 + 32 |@@@@@@@@@@@@@@@@@@@@ 5 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + site.py, func, makepath + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 128 | 0 + + __init__.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + <string>, func, ? + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10 + 4 | 0 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 | 0 + 1024 |@@@@ 1 + 2048 | 0 + + site.py, func, addpackage + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@ 1 + 256 |@@@@@@@@@@@@@ 1 + 512 | 0 + 1024 |@@@@@@@@@@@@@ 1 + 2048 | 0 + + os.py, func, ? + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, addsitepackages + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, addsitedir + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@ 1 + 2048 |@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, main + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8192 | 0 + + site.py, func, ? + value ------------- Distribution ------------- count + 4096 | 0 + 8192 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16384 | 0 + + func_abc.py, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_abc.py, func, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_abc.py, func, ? + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + func_abc.py, func, func_a + value ------------- Distribution ------------- count + 1048576 | 0 + 2097152 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4194304 | 0 + + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_calltime_example.txt new file mode 100644 index 000000000000..bda8ea898826 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_calltime_example.txt @@ -0,0 +1,255 @@ +The following are examples of py_calltime.d. + +This script traces the elapsed time of Python functions and prints a report. +Here it traces the example program, Code/Python/func_abc.py + +# py_calltime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + UserDict.py func ? 1 + UserDict.py func DictMixin 1 + UserDict.py func IterableUserDict 1 + UserDict.py func UserDict 1 + UserDict.py func __init__ 1 + __init__.py func ? 1 + __init__.py func CodecRegistryError 1 + __init__.py func normalize_encoding 1 + __init__.py func search_function 1 + aliases.py func ? 1 + ascii.py func ? 1 + ascii.py func Codec 1 + ascii.py func StreamConverter 1 + ascii.py func StreamReader 1 + ascii.py func StreamWriter 1 + ascii.py func getregentry 1 + codecs.py func ? 1 + codecs.py func Codec 1 + codecs.py func StreamReader 1 + codecs.py func StreamReaderWriter 1 + codecs.py func StreamRecoder 1 + codecs.py func StreamWriter 1 + copy_reg.py func ? 1 + func_abc.py func ? 1 + func_abc.py func func_a 1 + func_abc.py func func_b 1 + func_abc.py func func_c 1 + linecache.py func ? 1 + os.py func ? 1 + os.py func _Environ 1 + os.py func __init__ 1 + os.py func _get_exports_list 1 + posixpath.py func ? 1 + posixpath.py func basename 1 + posixpath.py func dirname 1 + site.py func ? 1 + site.py func _Helper 1 + site.py func _Printer 1 + site.py func _init_pathinfo 1 + site.py func abs__file__ 1 + site.py func addsitepackages 1 + site.py func aliasmbcs 1 + site.py func execsitecustomize 1 + site.py func main 1 + site.py func removeduppaths 1 + site.py func setcopyright 1 + site.py func setencoding 1 + site.py func sethelper 1 + site.py func setquit 1 + stat.py func ? 1 + types.py func ? 1 + types.py func _C 1 + warnings.py func ? 1 + warnings.py func _OptionError 1 + warnings.py func _processoptions 1 + posixpath.py func exists 2 + posixpath.py func split 2 + site.py func addsitedir 2 + warnings.py func simplefilter 2 + copy_reg.py func constructor 3 + copy_reg.py func pickle 3 + site.py func __init__ 3 + site.py func addpackage 3 + stat.py func S_IFMT 6 + stat.py func S_ISDIR 6 + posixpath.py func isdir 8 + os.py func _exists 10 + <string> func ? 11 + posixpath.py func normcase 14 + site.py func makepath 14 + posixpath.py func join 20 + posixpath.py func abspath 22 + posixpath.py func isabs 22 + posixpath.py func normpath 22 + - total - 230 + +Exclusive function elapsed times (us), + FILE TYPE NAME TOTAL + ascii.py func StreamWriter 2 + ascii.py func StreamReader 2 + site.py func setencoding 2 + UserDict.py func IterableUserDict 2 + __init__.py func CodecRegistryError 2 + ascii.py func getregentry 2 + site.py func aliasmbcs 2 + warnings.py func _OptionError 3 + types.py func _C 3 + site.py func sethelper 3 + warnings.py func _processoptions 3 + ascii.py func StreamConverter 3 + ascii.py func Codec 3 + site.py func _Helper 3 + site.py func setquit 4 + codecs.py func StreamWriter 4 + UserDict.py func __init__ 4 + site.py func _Printer 4 + codecs.py func Codec 4 + os.py func _Environ 4 + codecs.py func StreamRecoder 5 + codecs.py func StreamReaderWriter 6 + codecs.py func StreamReader 6 + copy_reg.py func constructor 7 + __init__.py func normalize_encoding 9 + site.py func __init__ 10 + warnings.py func simplefilter 11 + linecache.py func ? 11 + posixpath.py func split 13 + stat.py func ? 14 + stat.py func S_IFMT 14 + posixpath.py func dirname 16 + posixpath.py func basename 24 + os.py func __init__ 26 + posixpath.py func normcase 29 + UserDict.py func UserDict 32 + posixpath.py func exists 37 + aliases.py func ? 46 + <string> func ? 56 + copy_reg.py func pickle 59 + UserDict.py func ? 84 + site.py func addsitepackages 85 + posixpath.py func isabs 87 + site.py func setcopyright 94 + stat.py func S_ISDIR 98 + posixpath.py func join 105 + types.py func ? 106 + site.py func removeduppaths 115 + ascii.py func ? 122 + os.py func _get_exports_list 136 + site.py func _init_pathinfo 155 + site.py func abs__file__ 158 + codecs.py func ? 182 + UserDict.py func DictMixin 184 + __init__.py func search_function 205 + site.py func main 218 + posixpath.py func normpath 231 + copy_reg.py func ? 239 + posixpath.py func isdir 285 + site.py func addpackage 419 + site.py func addsitedir 473 + warnings.py func ? 500 + posixpath.py func ? 546 + site.py func execsitecustomize 558 + site.py func makepath 608 + posixpath.py func abspath 646 + os.py func _exists 925 + __init__.py func ? 1289 + os.py func ? 1473 + site.py func ? 1510 + func_abc.py func ? 1517 + func_abc.py func func_c 1000071 + func_abc.py func func_a 1005706 + func_abc.py func func_b 1010158 + - total - 3029815 + +Inclusive function elapsed times (us), + FILE TYPE NAME TOTAL + ascii.py func StreamWriter 2 + ascii.py func StreamReader 2 + site.py func setencoding 2 + UserDict.py func IterableUserDict 2 + __init__.py func CodecRegistryError 2 + ascii.py func getregentry 2 + site.py func aliasmbcs 2 + warnings.py func _OptionError 3 + types.py func _C 3 + site.py func sethelper 3 + warnings.py func _processoptions 3 + ascii.py func StreamConverter 3 + ascii.py func Codec 3 + site.py func _Helper 3 + site.py func setquit 4 + codecs.py func StreamWriter 4 + UserDict.py func __init__ 4 + site.py func _Printer 4 + codecs.py func Codec 4 + os.py func _Environ 4 + codecs.py func StreamRecoder 5 + codecs.py func StreamReaderWriter 6 + codecs.py func StreamReader 6 + copy_reg.py func constructor 7 + __init__.py func normalize_encoding 9 + site.py func __init__ 10 + warnings.py func simplefilter 11 + linecache.py func ? 11 + posixpath.py func split 13 + stat.py func ? 14 + stat.py func S_IFMT 14 + posixpath.py func dirname 22 + posixpath.py func normcase 29 + os.py func __init__ 31 + posixpath.py func basename 31 + UserDict.py func UserDict 32 + posixpath.py func exists 37 + aliases.py func ? 46 + copy_reg.py func pickle 66 + posixpath.py func isabs 87 + posixpath.py func join 105 + types.py func ? 109 + stat.py func S_ISDIR 113 + site.py func setcopyright 132 + ascii.py func ? 133 + os.py func _get_exports_list 136 + UserDict.py func DictMixin 184 + codecs.py func ? 210 + posixpath.py func normpath 231 + UserDict.py func ? 303 + __init__.py func search_function 350 + copy_reg.py func ? 377 + posixpath.py func isdir 399 + warnings.py func ? 530 + site.py func abs__file__ 540 + site.py func execsitecustomize 558 + posixpath.py func ? 560 + site.py func removeduppaths 565 + site.py func _init_pathinfo 899 + os.py func _exists 953 + posixpath.py func abspath 966 + site.py func makepath 1296 + __init__.py func ? 1548 + <string> func ? 1808 + site.py func addsitepackages 2471 + site.py func addpackage 2475 + os.py func ? 3879 + site.py func addsitedir 4026 + site.py func main 4532 + site.py func ? 9930 + func_abc.py func func_c 1000071 + func_abc.py func func_b 2010230 + func_abc.py func func_a 3015936 + func_abc.py func ? 3017454 + +Counts shows us how many times each different function was called, and how +many functions were called in total. + +The exclusive function elapsed times show the time that each function spent +processing code - while not in other functions. + +The inclusive function elapsed times show the time that each function spent +processing code, including the time spent in other calls. + +These elapsed times are the absolute time from when the function began to +when it completed - which includes off-CPU time due to other system events +such as I/O, scheduling, interrupts, etc. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_cpudist_example.txt new file mode 100644 index 000000000000..3272e904387f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_cpudist_example.txt @@ -0,0 +1,966 @@ +The following are examples of py_cpudist.d. + +This script traces the on-CPU time of Python functions and prints a report +in the form of a histogram. Here it traces the example program, +Code/Python/func_slow.py + +# py_cpudist.d +Tracing... Hit Ctrl-C to end. +^C + +Exclusive function on-CPU times (us), + UserDict.py, func, IterableUserDict + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + __init__.py, func, CodecRegistryError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, StreamReader + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, StreamWriter + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, getregentry + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + site.py, func, aliasmbcs + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + site.py, func, sethelper + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + types.py, func, _C + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + warnings.py, func, _OptionError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + UserDict.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamConverter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + codecs.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + codecs.py, func, StreamWriter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + os.py, func, _Environ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + posixpath.py, func, basename + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + posixpath.py, func, dirname + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Helper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Printer + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setencoding + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setquit + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _processoptions + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + copy_reg.py, func, constructor + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 2 | 0 + + codecs.py, func, StreamReader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReaderWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamRecoder + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + func_slow.py, func, ? + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + os.py, func, __init__ + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + stat.py, func, S_IFMT + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 2 | 0 + + warnings.py, func, simplefilter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + __init__.py, func, normalize_encoding + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + copy_reg.py, func, pickle + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 4 |@@@@@@@@@@@@@ 1 + 8 | 0 + + linecache.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, split + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + stat.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + stat.py, func, S_ISDIR + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 4 | 0 + + posixpath.py, func, normcase + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 2 | 0 + + UserDict.py, func, ? + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + UserDict.py, func, UserDict + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + site.py, func, _init_pathinfo + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + site.py, func, addsitepackages + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + site.py, func, setcopyright + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + <string>, func, ? + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@ 5 + 2 |@@@@@@@@@@@@@@@@@@ 5 + 4 |@@@@ 1 + 8 | 0 + + posixpath.py, func, isabs + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20 + 2 |@@@@ 2 + 4 | 0 + + aliases.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + ascii.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + posixpath.py, func, exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + site.py, func, abs__file__ + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + site.py, func, removeduppaths + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + site.py, func, makepath + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 8 | 0 + + posixpath.py, func, join + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 2 |@@@@@@@@@@ 5 + 4 |@@@@ 2 + 8 | 0 + 16 | 0 + 32 |@@ 1 + 64 | 0 + + codecs.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + site.py, func, main + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + types.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + posixpath.py, func, abspath + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22 + 8 | 0 + + UserDict.py, func, DictMixin + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + __init__.py, func, search_function + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + copy_reg.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + os.py, func, _get_exports_list + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + warnings.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, isdir + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@ 1 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 32 | 0 + 64 |@@@@@ 1 + 128 | 0 + + posixpath.py, func, normpath + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@ 1 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 16 | 0 + + site.py, func, addpackage + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 128 |@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, addsitedir + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 256 | 0 + + site.py, func, ? + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + site.py, func, execsitecustomize + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + os.py, func, _exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + __init__.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + os.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + func_slow.py, func, func_a + value ------------- Distribution ------------- count + 65536 | 0 + 131072 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 262144 | 0 + + func_slow.py, func, func_b + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + func_slow.py, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + +Inclusive function on-CPU times (us), + UserDict.py, func, IterableUserDict + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + __init__.py, func, CodecRegistryError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, StreamReader + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, StreamWriter + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + ascii.py, func, getregentry + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + site.py, func, aliasmbcs + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + site.py, func, sethelper + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + types.py, func, _C + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + warnings.py, func, _OptionError + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + UserDict.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + ascii.py, func, StreamConverter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + codecs.py, func, Codec + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + codecs.py, func, StreamWriter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + os.py, func, _Environ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Helper + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, _Printer + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setencoding + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + site.py, func, setquit + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + warnings.py, func, _processoptions + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + copy_reg.py, func, constructor + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 2 | 0 + + codecs.py, func, StreamReader + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamReaderWriter + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + codecs.py, func, StreamRecoder + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + site.py, func, __init__ + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 4 | 0 + + stat.py, func, S_IFMT + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6 + 2 | 0 + + warnings.py, func, simplefilter + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@ 1 + 4 |@@@@@@@@@@@@@@@@@@@@ 1 + 8 | 0 + + __init__.py, func, normalize_encoding + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + linecache.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + os.py, func, __init__ + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, basename + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, dirname + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + posixpath.py, func, split + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 8 | 0 + + stat.py, func, ? + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 16 | 0 + + copy_reg.py, func, pickle + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 + 8 | 0 + + posixpath.py, func, normcase + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 14 + 2 | 0 + + UserDict.py, func, UserDict + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 32 | 0 + + stat.py, func, S_ISDIR + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4 + 4 |@@@@@@@@@@@@@ 2 + 8 | 0 + + posixpath.py, func, isabs + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 20 + 2 |@@@@ 2 + 4 | 0 + + aliases.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + ascii.py, func, ? + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + posixpath.py, func, exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 32 | 0 + + site.py, func, setcopyright + value ------------- Distribution ------------- count + 16 | 0 + 32 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 64 | 0 + + posixpath.py, func, join + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@ 12 + 2 |@@@@@@@@@@ 5 + 4 |@@@@ 2 + 8 | 0 + 16 | 0 + 32 |@@ 1 + 64 | 0 + + codecs.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + types.py, func, ? + value ------------- Distribution ------------- count + 32 | 0 + 64 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 128 | 0 + + UserDict.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + UserDict.py, func, DictMixin + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + __init__.py, func, search_function + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + os.py, func, _get_exports_list + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, abs__file__ + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + site.py, func, removeduppaths + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + warnings.py, func, ? + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 256 | 0 + + posixpath.py, func, normpath + value ------------- Distribution ------------- count + 2 | 0 + 4 |@@ 1 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 21 + 16 | 0 + + posixpath.py, func, isdir + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7 + 32 | 0 + 64 |@@@@@ 1 + 128 | 0 + + posixpath.py, func, abspath + value ------------- Distribution ------------- count + 4 | 0 + 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 17 + 16 |@@@@@@@@@ 5 + 32 | 0 + + copy_reg.py, func, ? + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, func, _init_pathinfo + value ------------- Distribution ------------- count + 128 | 0 + 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 512 | 0 + + site.py, func, makepath + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 13 + 32 | 0 + 64 |@@@ 1 + 128 | 0 + + site.py, func, execsitecustomize + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1024 | 0 + + <string>, func, ? + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@ 5 + 2 |@@@@@@@@@@@@@@@@@@ 5 + 4 | 0 + 8 | 0 + 16 | 0 + 32 | 0 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + os.py, func, _exists + value ------------- Distribution ------------- count + 8 | 0 + 16 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8 + 32 |@@@@ 1 + 64 | 0 + 128 | 0 + 256 | 0 + 512 |@@@@ 1 + 1024 | 0 + + site.py, func, addpackage + value ------------- Distribution ------------- count + 64 | 0 + 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2 + 256 | 0 + 512 |@@@@@@@@@@@@@ 1 + 1024 | 0 + + __init__.py, func, ? + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + site.py, func, addsitepackages + value ------------- Distribution ------------- count + 512 | 0 + 1024 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + site.py, func, addsitedir + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@ 1 + 1024 |@@@@@@@@@@@@@@@@@@@@ 1 + 2048 | 0 + + os.py, func, ? + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, main + value ------------- Distribution ------------- count + 1024 | 0 + 2048 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4096 | 0 + + site.py, func, ? + value ------------- Distribution ------------- count + 2048 | 0 + 4096 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 8192 | 0 + + func_slow.py, func, func_c + value ------------- Distribution ------------- count + 262144 | 0 + 524288 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 1048576 | 0 + + func_slow.py, func, ? + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_slow.py, func, func_a + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + + func_slow.py, func, func_b + value ------------- Distribution ------------- count + 524288 | 0 + 1048576 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2097152 | 0 + +The first section, Exclusive function on-CPU times, shows us the time spent +on-CPU by various functions, not including time spent in subroutines. You can +see here that func_a had one instance of being on-CPU between 0.13 seconds and +0.25 seconds. + +The second section, Inclusive function on-CPU times, shows us the time spent +on-CPU by various functions, including that time spent in subroutines called +by those functions. You can see that here func_a had an instance of being +on-CPU between 1.0 seconds and 2.1 seconds. + +It is important to pay close attention to the third column, "count" as this +will indicate if there were any instances in a particular timeframe, even if +the number is too small to show up on the histogram clearly. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_cputime_example.txt new file mode 100644 index 000000000000..2f25922adc2a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_cputime_example.txt @@ -0,0 +1,262 @@ +The following are examples of py_cputime.d. + +This script traces the on-CPU time of JavaScript functions and prints a +report. Here it traces the example program, Code/Python/func_slow.py + +# py_cputime.d +Tracing... Hit Ctrl-C to end. +^C + +Count, + FILE TYPE NAME COUNT + UserDict.py func ? 1 + UserDict.py func DictMixin 1 + UserDict.py func IterableUserDict 1 + UserDict.py func UserDict 1 + UserDict.py func __init__ 1 + __init__.py func ? 1 + __init__.py func CodecRegistryError 1 + __init__.py func normalize_encoding 1 + __init__.py func search_function 1 + aliases.py func ? 1 + ascii.py func ? 1 + ascii.py func Codec 1 + ascii.py func StreamConverter 1 + ascii.py func StreamReader 1 + ascii.py func StreamWriter 1 + ascii.py func getregentry 1 + codecs.py func ? 1 + codecs.py func Codec 1 + codecs.py func StreamReader 1 + codecs.py func StreamReaderWriter 1 + codecs.py func StreamRecoder 1 + codecs.py func StreamWriter 1 + copy_reg.py func ? 1 + func_slow.py func ? 1 + func_slow.py func func_a 1 + func_slow.py func func_b 1 + func_slow.py func func_c 1 + linecache.py func ? 1 + os.py func ? 1 + os.py func _Environ 1 + os.py func __init__ 1 + os.py func _get_exports_list 1 + posixpath.py func ? 1 + posixpath.py func basename 1 + posixpath.py func dirname 1 + site.py func ? 1 + site.py func _Helper 1 + site.py func _Printer 1 + site.py func _init_pathinfo 1 + site.py func abs__file__ 1 + site.py func addsitepackages 1 + site.py func aliasmbcs 1 + site.py func execsitecustomize 1 + site.py func main 1 + site.py func removeduppaths 1 + site.py func setcopyright 1 + site.py func setencoding 1 + site.py func sethelper 1 + site.py func setquit 1 + stat.py func ? 1 + types.py func ? 1 + types.py func _C 1 + warnings.py func ? 1 + warnings.py func _OptionError 1 + warnings.py func _processoptions 1 + posixpath.py func exists 2 + posixpath.py func split 2 + site.py func addsitedir 2 + warnings.py func simplefilter 2 + copy_reg.py func constructor 3 + copy_reg.py func pickle 3 + site.py func __init__ 3 + site.py func addpackage 3 + stat.py func S_IFMT 6 + stat.py func S_ISDIR 6 + posixpath.py func isdir 8 + os.py func _exists 10 + <string> func ? 11 + posixpath.py func normcase 14 + site.py func makepath 14 + posixpath.py func join 20 + posixpath.py func abspath 22 + posixpath.py func isabs 22 + posixpath.py func normpath 22 + - total - 230 + +Exclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + ascii.py func StreamWriter 1 + __init__.py func CodecRegistryError 1 + ascii.py func StreamReader 1 + site.py func setencoding 1 + warnings.py func _OptionError 1 + UserDict.py func IterableUserDict 1 + site.py func aliasmbcs 1 + warnings.py func _processoptions 1 + types.py func _C 1 + ascii.py func getregentry 1 + site.py func _Helper 2 + ascii.py func Codec 2 + ascii.py func StreamConverter 2 + site.py func sethelper 2 + codecs.py func Codec 2 + UserDict.py func __init__ 3 + posixpath.py func dirname 3 + posixpath.py func basename 3 + site.py func _Printer 3 + os.py func _Environ 3 + codecs.py func StreamWriter 3 + site.py func setquit 3 + copy_reg.py func constructor 3 + codecs.py func StreamRecoder 4 + codecs.py func StreamReaderWriter 5 + codecs.py func StreamReader 5 + os.py func __init__ 6 + func_slow.py func ? 6 + __init__.py func normalize_encoding 7 + site.py func __init__ 7 + linecache.py func ? 7 + warnings.py func simplefilter 7 + stat.py func S_IFMT 9 + stat.py func ? 10 + copy_reg.py func pickle 12 + posixpath.py func split 12 + posixpath.py func normcase 15 + stat.py func S_ISDIR 17 + site.py func addsitepackages 20 + UserDict.py func ? 20 + site.py func setcopyright 23 + site.py func main 24 + <string> func ? 28 + UserDict.py func UserDict 31 + site.py func _init_pathinfo 33 + posixpath.py func exists 35 + ascii.py func ? 38 + posixpath.py func isabs 42 + aliases.py func ? 43 + site.py func removeduppaths 51 + site.py func abs__file__ 56 + codecs.py func ? 75 + types.py func ? 83 + posixpath.py func join 85 + site.py func makepath 97 + posixpath.py func abspath 99 + os.py func _get_exports_list 132 + __init__.py func search_function 142 + warnings.py func ? 171 + UserDict.py func DictMixin 182 + posixpath.py func ? 192 + copy_reg.py func ? 196 + posixpath.py func normpath 209 + posixpath.py func isdir 255 + site.py func addpackage 375 + site.py func addsitedir 506 + site.py func execsitecustomize 540 + site.py func ? 725 + os.py func _exists 802 + os.py func ? 1138 + __init__.py func ? 1199 + func_slow.py func func_a 229669 + func_slow.py func func_b 456371 + func_slow.py func func_c 686056 + - total - 1379951 + +Inclusive function on-CPU times (us), + FILE TYPE NAME TOTAL + ascii.py func StreamWriter 1 + __init__.py func CodecRegistryError 1 + ascii.py func StreamReader 1 + site.py func setencoding 1 + warnings.py func _OptionError 1 + UserDict.py func IterableUserDict 1 + site.py func aliasmbcs 1 + warnings.py func _processoptions 1 + types.py func _C 1 + ascii.py func getregentry 1 + site.py func _Helper 2 + ascii.py func Codec 2 + ascii.py func StreamConverter 2 + site.py func sethelper 2 + codecs.py func Codec 2 + UserDict.py func __init__ 3 + site.py func _Printer 3 + os.py func _Environ 3 + codecs.py func StreamWriter 3 + site.py func setquit 3 + copy_reg.py func constructor 3 + codecs.py func StreamRecoder 4 + codecs.py func StreamReaderWriter 5 + codecs.py func StreamReader 5 + __init__.py func normalize_encoding 7 + site.py func __init__ 7 + linecache.py func ? 7 + warnings.py func simplefilter 7 + stat.py func S_IFMT 9 + os.py func __init__ 9 + posixpath.py func basename 9 + posixpath.py func dirname 10 + stat.py func ? 10 + posixpath.py func split 12 + posixpath.py func normcase 15 + copy_reg.py func pickle 15 + stat.py func S_ISDIR 26 + UserDict.py func UserDict 31 + posixpath.py func exists 35 + posixpath.py func isabs 42 + aliases.py func ? 43 + site.py func setcopyright 44 + ascii.py func ? 45 + types.py func ? 85 + posixpath.py func join 85 + codecs.py func ? 97 + os.py func _get_exports_list 132 + site.py func removeduppaths 171 + UserDict.py func DictMixin 182 + site.py func abs__file__ 184 + warnings.py func ? 190 + __init__.py func search_function 196 + posixpath.py func ? 202 + posixpath.py func normpath 209 + UserDict.py func ? 235 + posixpath.py func isdir 281 + copy_reg.py func ? 288 + posixpath.py func abspath 351 + site.py func _init_pathinfo 392 + site.py func makepath 395 + site.py func execsitecustomize 540 + os.py func _exists 819 + <string> func ? 973 + __init__.py func ? 1341 + site.py func addpackage 1470 + site.py func addsitepackages 1562 + site.py func addsitedir 2420 + site.py func main 2546 + os.py func ? 2839 + site.py func ? 6118 + func_slow.py func func_c 686056 + func_slow.py func func_b 1142427 + func_slow.py func func_a 1372097 + func_slow.py func ? 1372104 + +You can see the results are printed in three sections. + +The first section reports how many times each function was called. + +The exclusive function on-CPU times shows, amongst other results that func_a +spent around 0.22 seconds on-CPU. This times excludes time spent in +other functions. + +The inclusive function on-CPU times show that func_a spent around 1.4 +seconds on-CPU. This includes the time spent in other functions called. + +These on-CPU times are the time the thread spent running on a CPU, from when +the subroutine began to when it completed. This does not include time +spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy. +See Notes/ALLoncpu_notes.txt for more details. Also see +Notes/ALLexclusive_notes.txt and Notes/ALLinclusive_notes.txt for a +detailed explanation of exclusive vs inclusive subroutine time. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_flow_example.txt new file mode 100644 index 000000000000..d62269e3b03d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_flow_example.txt @@ -0,0 +1,485 @@ +The following are examples of py_flow.d. + +This is a simple script to trace the flow of Python functions. +Here it traces the example program, Code/Python/func_abc.py + +# py_flow.d + C TIME(us) FILE -- FUNC + 0 3064371810154 site.py -> ? + 0 3064371830069 os.py -> ? + 0 3064371840076 posixpath.py -> ? + 0 3064371840298 stat.py -> ? + 0 3064371840319 stat.py <- ? + 0 3064371840345 posixpath.py <- ? + 0 3064371840364 os.py -> _get_exports_list + 0 3064371840510 os.py <- _get_exports_list + 0 3064371849994 UserDict.py -> ? + 0 3064371850011 UserDict.py -> UserDict + 0 3064371850051 UserDict.py <- UserDict + 0 3064371850067 UserDict.py -> IterableUserDict + 0 3064371850075 UserDict.py <- IterableUserDict + 0 3064371850088 UserDict.py -> DictMixin + 0 3064371850291 UserDict.py <- DictMixin + 0 3064371850300 UserDict.py <- ? + 0 3064371850320 os.py -> _Environ + 0 3064371850330 os.py <- _Environ + 0 3064371850342 os.py -> __init__ + 0 3064371850353 UserDict.py -> __init__ + 0 3064371850363 UserDict.py <- __init__ + 0 3064371850372 os.py <- __init__ + 0 3064371850381 os.py -> _exists + 0 3064371851137 <string> -> ? + 0 3064371851146 <string> <- ? + 0 3064371851155 os.py <- _exists + 0 3064371851162 os.py -> _exists + 0 3064371851186 <string> -> ? + 0 3064371851195 <string> <- ? + 0 3064371851213 os.py <- _exists + 0 3064371851220 os.py -> _exists + 0 3064371851242 <string> -> ? + 0 3064371851249 <string> <- ? + 0 3064371851257 os.py <- _exists + 0 3064371851266 os.py -> _exists + 0 3064371851286 <string> -> ? + 0 3064371851293 <string> <- ? + 0 3064371851300 os.py <- _exists + 0 3064371851310 os.py -> _exists + 0 3064371851330 <string> -> ? + 0 3064371851337 <string> <- ? + 0 3064371851344 os.py <- _exists + 0 3064371851354 os.py -> _exists + 0 3064371851374 <string> -> ? + 0 3064371851381 <string> <- ? + 0 3064371851388 os.py <- _exists + 0 3064371851395 os.py -> _exists + 0 3064371851415 <string> -> ? + 0 3064371851423 <string> <- ? + 0 3064371851436 os.py <- _exists + 0 3064371851445 os.py -> _exists + 0 3064371851465 <string> -> ? + 0 3064371851473 <string> <- ? + 0 3064371851485 os.py <- _exists + 0 3064371851493 os.py -> _exists + 0 3064371851514 <string> -> ? + 0 3064371851522 <string> <- ? + 0 3064371851534 os.py <- _exists + 0 3064371851785 copy_reg.py -> ? + 0 3064371851996 types.py -> ? + 0 3064371852063 types.py -> _C + 0 3064371852073 types.py <- _C + 0 3064371852108 types.py <- ? + 0 3064371852129 copy_reg.py -> pickle + 0 3064371852139 copy_reg.py -> constructor + 0 3064371852147 copy_reg.py <- constructor + 0 3064371852155 copy_reg.py <- pickle + 0 3064371852166 copy_reg.py <- ? + 0 3064371852179 copy_reg.py -> pickle + 0 3064371852188 copy_reg.py -> constructor + 0 3064371852196 copy_reg.py <- constructor + 0 3064371852204 copy_reg.py <- pickle + 0 3064371852212 copy_reg.py -> pickle + 0 3064371852221 copy_reg.py -> constructor + 0 3064371852229 copy_reg.py <- constructor + 0 3064371852236 copy_reg.py <- pickle + 0 3064371852244 os.py -> _exists + 0 3064371852269 <string> -> ? + 0 3064371852277 <string> <- ? + 0 3064371852289 os.py <- _exists + 0 3064371852297 os.py <- ? + 0 3064371852330 site.py -> _Printer + 0 3064371852340 site.py <- _Printer + 0 3064371852376 site.py -> _Helper + 0 3064371852384 site.py <- _Helper + 0 3064371852416 site.py -> main + 0 3064371852423 site.py -> abs__file__ + 0 3064371852434 posixpath.py -> abspath + 0 3064371852442 posixpath.py -> isabs + 0 3064371852452 posixpath.py <- isabs + 0 3064371852460 posixpath.py -> normpath + 0 3064371852482 posixpath.py <- normpath + 0 3064371852490 posixpath.py <- abspath + 0 3064371852504 posixpath.py -> abspath + 0 3064371852511 posixpath.py -> isabs + 0 3064371852520 posixpath.py <- isabs + 0 3064371852527 posixpath.py -> normpath + 0 3064371852543 posixpath.py <- normpath + 0 3064371852552 posixpath.py <- abspath + 0 3064371852560 posixpath.py -> abspath + 0 3064371852567 posixpath.py -> isabs + 0 3064371852576 posixpath.py <- isabs + 0 3064371852583 posixpath.py -> normpath + 0 3064371852598 posixpath.py <- normpath + 0 3064371852607 posixpath.py <- abspath + 0 3064371852615 posixpath.py -> abspath + 0 3064371852622 posixpath.py -> isabs + 0 3064371852631 posixpath.py <- isabs + 0 3064371852638 posixpath.py -> normpath + 0 3064371852653 posixpath.py <- normpath + 0 3064371852661 posixpath.py <- abspath + 0 3064371852674 posixpath.py -> abspath + 0 3064371852682 posixpath.py -> isabs + 0 3064371852690 posixpath.py <- isabs + 0 3064371852697 posixpath.py -> normpath + 0 3064371852713 posixpath.py <- normpath + 0 3064371852721 posixpath.py <- abspath + 0 3064371852741 posixpath.py -> abspath + 0 3064371852748 posixpath.py -> isabs + 0 3064371852757 posixpath.py <- isabs + 0 3064371852764 posixpath.py -> normpath + 0 3064371852779 posixpath.py <- normpath + 0 3064371852787 posixpath.py <- abspath + 0 3064371852804 posixpath.py -> abspath + 0 3064371852811 posixpath.py -> isabs + 0 3064371852819 posixpath.py <- isabs + 0 3064371852826 posixpath.py -> normpath + 0 3064371852842 posixpath.py <- normpath + 0 3064371852850 posixpath.py <- abspath + 0 3064371852858 posixpath.py -> abspath + 0 3064371852865 posixpath.py -> isabs + 0 3064371852874 posixpath.py <- isabs + 0 3064371852881 posixpath.py -> normpath + 0 3064371852896 posixpath.py <- normpath + 0 3064371852904 posixpath.py <- abspath + 0 3064371852915 site.py <- abs__file__ + 0 3064371852922 site.py -> removeduppaths + 0 3064371852931 site.py -> makepath + 0 3064371852940 posixpath.py -> join + 0 3064371852948 posixpath.py <- join + 0 3064371852955 posixpath.py -> abspath + 0 3064371852963 posixpath.py -> isabs + 0 3064371852972 posixpath.py <- isabs + 0 3064371852980 posixpath.py -> normpath + 0 3064371852995 posixpath.py <- normpath + 0 3064371853002 posixpath.py <- abspath + 0 3064371853010 posixpath.py -> normcase + 0 3064371853018 posixpath.py <- normcase + 0 3064371853025 site.py <- makepath + 0 3064371853065 site.py -> makepath + 0 3064371853073 posixpath.py -> join + 0 3064371853081 posixpath.py <- join + 0 3064371853088 posixpath.py -> abspath + 0 3064371853096 posixpath.py -> isabs + 0 3064371853104 posixpath.py <- isabs + 0 3064371853111 posixpath.py -> normpath + 0 3064371853126 posixpath.py <- normpath + 0 3064371853134 posixpath.py <- abspath + 0 3064371853142 posixpath.py -> normcase + 0 3064371853150 posixpath.py <- normcase + 0 3064371853157 site.py <- makepath + 0 3064371853165 site.py -> makepath + 0 3064371853173 posixpath.py -> join + 0 3064371853181 posixpath.py <- join + 0 3064371853188 posixpath.py -> abspath + 0 3064371853195 posixpath.py -> isabs + 0 3064371853203 posixpath.py <- isabs + 0 3064371853210 posixpath.py -> normpath + 0 3064371853226 posixpath.py <- normpath + 0 3064371853234 posixpath.py <- abspath + 0 3064371853241 posixpath.py -> normcase + 0 3064371853249 posixpath.py <- normcase + 0 3064371853256 site.py <- makepath + 0 3064371853265 site.py -> makepath + 0 3064371853272 posixpath.py -> join + 0 3064371853280 posixpath.py <- join + 0 3064371853287 posixpath.py -> abspath + 0 3064371853294 posixpath.py -> isabs + 0 3064371853303 posixpath.py <- isabs + 0 3064371853310 posixpath.py -> normpath + 0 3064371853325 posixpath.py <- normpath + 0 3064371853333 posixpath.py <- abspath + 0 3064371853341 posixpath.py -> normcase + 0 3064371853348 posixpath.py <- normcase + 0 3064371853356 site.py <- makepath + 0 3064371853364 site.py -> makepath + 0 3064371853372 posixpath.py -> join + 0 3064371853380 posixpath.py <- join + 0 3064371853387 posixpath.py -> abspath + 0 3064371853394 posixpath.py -> isabs + 0 3064371853402 posixpath.py <- isabs + 0 3064371853409 posixpath.py -> normpath + 0 3064371853425 posixpath.py <- normpath + 0 3064371853433 posixpath.py <- abspath + 0 3064371853440 posixpath.py -> normcase + 0 3064371853448 posixpath.py <- normcase + 0 3064371853455 site.py <- makepath + 0 3064371853466 site.py <- removeduppaths + 0 3064371853476 posixpath.py -> basename + 0 3064371853484 posixpath.py -> split + 0 3064371853498 posixpath.py <- split + 0 3064371853505 posixpath.py <- basename + 0 3064371853513 site.py -> addsitepackages + 0 3064371853524 posixpath.py -> join + 0 3064371853538 posixpath.py <- join + 0 3064371853546 posixpath.py -> join + 0 3064371853557 posixpath.py <- join + 0 3064371853566 posixpath.py -> isdir + 0 3064371853597 stat.py -> S_ISDIR + 0 3064371853604 stat.py -> S_IFMT + 0 3064371853612 stat.py <- S_IFMT + 0 3064371853620 stat.py <- S_ISDIR + 0 3064371853627 posixpath.py <- isdir + 0 3064371853636 site.py -> addsitedir + 0 3064371853643 site.py -> makepath + 0 3064371853651 posixpath.py -> join + 0 3064371853659 posixpath.py <- join + 0 3064371853666 posixpath.py -> abspath + 0 3064371853674 posixpath.py -> isabs + 0 3064371853683 posixpath.py <- isabs + 0 3064371853691 posixpath.py -> normpath + 0 3064371853707 posixpath.py <- normpath + 0 3064371853715 posixpath.py <- abspath + 0 3064371853723 posixpath.py -> normcase + 0 3064371853730 posixpath.py <- normcase + 0 3064371853738 site.py <- makepath + 0 3064371853938 site.py -> addpackage + 0 3064371853948 posixpath.py -> join + 0 3064371853958 posixpath.py <- join + 0 3064371854087 <string> -> ? + 0 3064371854098 site.py -> addsitedir + 0 3064371854106 site.py -> _init_pathinfo + 0 3064371854115 posixpath.py -> isdir + 0 3064371854195 posixpath.py <- isdir + 0 3064371854204 posixpath.py -> isdir + 0 3064371854224 stat.py -> S_ISDIR + 0 3064371854232 stat.py -> S_IFMT + 0 3064371854240 stat.py <- S_IFMT + 0 3064371854247 stat.py <- S_ISDIR + 0 3064371854254 posixpath.py <- isdir + 0 3064371854262 site.py -> makepath + 0 3064371854271 posixpath.py -> join + 0 3064371854279 posixpath.py <- join + 0 3064371854286 posixpath.py -> abspath + 0 3064371854293 posixpath.py -> isabs + 0 3064371854302 posixpath.py <- isabs + 0 3064371854309 posixpath.py -> normpath + 0 3064371854325 posixpath.py <- normpath + 0 3064371854333 posixpath.py <- abspath + 0 3064371854341 posixpath.py -> normcase + 0 3064371854349 posixpath.py <- normcase + 0 3064371854356 site.py <- makepath + 0 3064371854364 posixpath.py -> isdir + 0 3064371854386 stat.py -> S_ISDIR + 0 3064371854393 stat.py -> S_IFMT + 0 3064371854400 stat.py <- S_IFMT + 0 3064371854408 stat.py <- S_ISDIR + 0 3064371854415 posixpath.py <- isdir + 0 3064371854423 site.py -> makepath + 0 3064371854431 posixpath.py -> join + 0 3064371854438 posixpath.py <- join + 0 3064371854446 posixpath.py -> abspath + 0 3064371854453 posixpath.py -> isabs + 0 3064371854461 posixpath.py <- isabs + 0 3064371854469 posixpath.py -> normpath + 0 3064371854485 posixpath.py <- normpath + 0 3064371854493 posixpath.py <- abspath + 0 3064371854500 posixpath.py -> normcase + 0 3064371854508 posixpath.py <- normcase + 0 3064371854516 site.py <- makepath + 0 3064371854524 posixpath.py -> isdir + 0 3064371854556 stat.py -> S_ISDIR + 0 3064371854563 stat.py -> S_IFMT + 0 3064371854571 stat.py <- S_IFMT + 0 3064371854578 stat.py <- S_ISDIR + 0 3064371854585 posixpath.py <- isdir + 0 3064371854593 site.py -> makepath + 0 3064371854601 posixpath.py -> join + 0 3064371854609 posixpath.py <- join + 0 3064371854616 posixpath.py -> abspath + 0 3064371854624 posixpath.py -> isabs + 0 3064371854632 posixpath.py <- isabs + 0 3064371854639 posixpath.py -> normpath + 0 3064371854655 posixpath.py <- normpath + 0 3064371854663 posixpath.py <- abspath + 0 3064371854671 posixpath.py -> normcase + 0 3064371854679 posixpath.py <- normcase + 0 3064371854686 site.py <- makepath + 0 3064371854694 posixpath.py -> isdir + 0 3064371854715 stat.py -> S_ISDIR + 0 3064371854722 stat.py -> S_IFMT + 0 3064371854730 stat.py <- S_IFMT + 0 3064371854737 stat.py <- S_ISDIR + 0 3064371854744 posixpath.py <- isdir + 0 3064371854752 site.py -> makepath + 0 3064371854759 posixpath.py -> join + 0 3064371854767 posixpath.py <- join + 0 3064371854774 posixpath.py -> abspath + 0 3064371854782 posixpath.py -> isabs + 0 3064371854790 posixpath.py <- isabs + 0 3064371854797 posixpath.py -> normpath + 0 3064371854813 posixpath.py <- normpath + 0 3064371854821 posixpath.py <- abspath + 0 3064371854829 posixpath.py -> normcase + 0 3064371854837 posixpath.py <- normcase + 0 3064371854844 site.py <- makepath + 0 3064371854852 posixpath.py -> isdir + 0 3064371854872 stat.py -> S_ISDIR + 0 3064371854879 stat.py -> S_IFMT + 0 3064371854887 stat.py <- S_IFMT + 0 3064371854894 stat.py <- S_ISDIR + 0 3064371854901 posixpath.py <- isdir + 0 3064371854909 site.py -> makepath + 0 3064371854917 posixpath.py -> join + 0 3064371854925 posixpath.py <- join + 0 3064371854932 posixpath.py -> abspath + 0 3064371854939 posixpath.py -> isabs + 0 3064371854947 posixpath.py <- isabs + 0 3064371854954 posixpath.py -> normpath + 0 3064371854970 posixpath.py <- normpath + 0 3064371854978 posixpath.py <- abspath + 0 3064371854986 posixpath.py -> normcase + 0 3064371854994 posixpath.py <- normcase + 0 3064371855001 site.py <- makepath + 0 3064371855009 site.py <- _init_pathinfo + 0 3064371855016 site.py -> makepath + 0 3064371855024 posixpath.py -> join + 0 3064371855032 posixpath.py <- join + 0 3064371855039 posixpath.py -> abspath + 0 3064371855047 posixpath.py -> isabs + 0 3064371855055 posixpath.py <- isabs + 0 3064371855063 posixpath.py -> normpath + 0 3064371855078 posixpath.py <- normpath + 0 3064371855086 posixpath.py <- abspath + 0 3064371855094 posixpath.py -> normcase + 0 3064371855101 posixpath.py <- normcase + 0 3064371855144 site.py <- makepath + 0 3064371855318 site.py -> addpackage + 0 3064371855327 posixpath.py -> join + 0 3064371855337 posixpath.py <- join + 0 3064371855411 site.py -> makepath + 0 3064371855420 posixpath.py -> join + 0 3064371855430 posixpath.py <- join + 0 3064371855437 posixpath.py -> abspath + 0 3064371855445 posixpath.py -> isabs + 0 3064371855453 posixpath.py <- isabs + 0 3064371855460 posixpath.py -> normpath + 0 3064371855477 posixpath.py <- normpath + 0 3064371855485 posixpath.py <- abspath + 0 3064371855493 posixpath.py -> normcase + 0 3064371855501 posixpath.py <- normcase + 0 3064371855509 site.py <- makepath + 0 3064371855517 posixpath.py -> exists + 0 3064371855542 posixpath.py <- exists + 0 3064371855591 site.py <- addpackage + 0 3064371855611 site.py -> addpackage + 0 3064371855618 posixpath.py -> join + 0 3064371855628 posixpath.py <- join + 0 3064371855683 site.py -> makepath + 0 3064371855692 posixpath.py -> join + 0 3064371855739 posixpath.py <- join + 0 3064371855747 posixpath.py -> abspath + 0 3064371855754 posixpath.py -> isabs + 0 3064371855763 posixpath.py <- isabs + 0 3064371855770 posixpath.py -> normpath + 0 3064371855788 posixpath.py <- normpath + 0 3064371855796 posixpath.py <- abspath + 0 3064371855803 posixpath.py -> normcase + 0 3064371855811 posixpath.py <- normcase + 0 3064371855818 site.py <- makepath + 0 3064371855826 posixpath.py -> exists + 0 3064371855851 posixpath.py <- exists + 0 3064371855880 site.py <- addpackage + 0 3064371855892 site.py <- addsitedir + 0 3064371855900 <string> <- ? + 0 3064371855915 site.py <- addpackage + 0 3064371855923 site.py <- addsitedir + 0 3064371855932 posixpath.py -> isdir + 0 3064371855965 posixpath.py <- isdir + 0 3064371855973 site.py <- addsitepackages + 0 3064371855982 site.py -> setquit + 0 3064371855993 site.py <- setquit + 0 3064371856000 site.py -> setcopyright + 0 3064371856009 site.py -> __init__ + 0 3064371856019 site.py <- __init__ + 0 3064371856028 site.py -> __init__ + 0 3064371856037 site.py <- __init__ + 0 3064371856045 posixpath.py -> dirname + 0 3064371856052 posixpath.py -> split + 0 3064371856065 posixpath.py <- split + 0 3064371856073 posixpath.py <- dirname + 0 3064371856085 posixpath.py -> join + 0 3064371856096 posixpath.py <- join + 0 3064371856104 site.py -> __init__ + 0 3064371856113 site.py <- __init__ + 0 3064371856121 site.py <- setcopyright + 0 3064371856128 site.py -> sethelper + 0 3064371856136 site.py <- sethelper + 0 3064371856143 site.py -> aliasmbcs + 0 3064371856151 site.py <- aliasmbcs + 0 3064371856158 site.py -> setencoding + 0 3064371856166 site.py <- setencoding + 0 3064371856173 site.py -> execsitecustomize + 0 3064371871773 site.py <- execsitecustomize + 0 3064371871794 site.py <- main + 0 3064371871805 site.py <- ? + 0 3064371872141 warnings.py -> ? + 0 306437187232e linecache.py -> ? + 0 3064371872336 linecache.py <- ? + 0 3064371872352 warnings.py -> _OptionError + 0 3064371872361 warnings.py <- _OptionError + 0 3064371872378 warnings.py -> _processoptions + 0 3064371872387 warnings.py <- _processoptions + 0 3064371872397 warnings.py -> simplefilter + 0 3064371872410 warnings.py <- simplefilter + 0 3064371872418 warnings.py -> simplefilter + 0 3064371872428 warnings.py <- simplefilter + 0 3064371872436 warnings.py <- ? + 0 3064371886557 __init__.py -> ? + 0 3064371891761 codecs.py -> ? + 0 3064371891836 codecs.py -> Codec + 0 3064371891848 codecs.py <- Codec + 0 3064371891864 codecs.py -> StreamWriter + 0 3064371891874 codecs.py <- StreamWriter + 0 3064371891885 codecs.py -> StreamReader + 0 3064371891897 codecs.py <- StreamReader + 0 3064371891907 codecs.py -> StreamReaderWriter + 0 3064371891918 codecs.py <- StreamReaderWriter + 0 3064371891926 codecs.py -> StreamRecoder + 0 3064371891938 codecs.py <- StreamRecoder + 0 3064371891953 codecs.py <- ? + 0 3064371902521 aliases.py -> ? + 0 3064371902580 aliases.py <- ? + 0 3064371902605 __init__.py -> CodecRegistryError + 0 3064371902614 __init__.py <- CodecRegistryError + 0 3064371902636 __init__.py <- ? + 0 3064371902655 __init__.py -> search_function + 0 3064371902666 __init__.py -> normalize_encoding + 0 3064371902682 __init__.py <- normalize_encoding + 0 3064371902888 ascii.py -> ? + 0 3064371902900 ascii.py -> Codec + 0 3064371902909 ascii.py <- Codec + 0 3064371902922 ascii.py -> StreamWriter + 0 3064371902930 ascii.py <- StreamWriter + 0 3064371902941 ascii.py -> StreamReader + 0 3064371902949 ascii.py <- StreamReader + 0 3064371902972 ascii.py -> StreamConverter + 0 3064371902981 ascii.py <- StreamConverter + 0 3064371902993 ascii.py <- ? + 0 3064371903009 ascii.py -> getregentry + 0 3064371903018 ascii.py <- getregentry + 0 3064371903044 __init__.py <- search_function + 0 3064371903414 func_abc.py -> ? + 0 3064371933251 func_abc.py -> func_a + 0 3064372940696 func_abc.py -> func_b + 0 3064373950608 func_abc.py -> func_c + 0 3064374960497 func_abc.py <- func_c + 0 3064374960512 func_abc.py <- func_b + 0 3064374960520 func_abc.py <- func_a + 0 3064374960528 func_abc.py <- ? +^C + +Here we can see that Python has done extensive pre-processing before it runs +the Code/Python/func_abc.py program itself. + +This shows which function is calling which - the output above ends by +showing that func_a called func_b which in turn called func_c etc. + +The TIME(us) column shows time from boot in microseconds. + +The FILE column shows the file that was being executed. + +If the output looks strange, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_flowinfo_example.txt new file mode 100644 index 000000000000..f93dc09b89d8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_flowinfo_example.txt @@ -0,0 +1,485 @@ +Following are examples of py_flowinfo.d. + +This is a simple script to trace the flow of Python functions. Here it traces +the flow into and out of libraries and the example program, +Code/Python/func_abc.py. + +# py_flowinfo.d +C PID DELTA(us) FILE:LINE TYPE -- FUNC +0 145424 3 site.py:58 func -> ? +0 145424 1375 os.py:22 func -> ? +0 145424 692 posixpath.py:11 func -> ? +0 145424 184 stat.py:4 func -> ? +0 145424 21 stat.py:86 func <- ? +0 145424 32 posixpath.py:454 func <- ? +0 145424 18 os.py:34 func -> _get_exports_list +0 145424 135 os.py:38 func <- _get_exports_list +0 145424 261 UserDict.py:1 func -> ? +0 145424 11 UserDict.py:3 func -> UserDict +0 145424 36 UserDict.py:71 func <- UserDict +0 145424 16 UserDict.py:73 func -> IterableUserDict +0 145424 9 UserDict.py:74 func <- IterableUserDict +0 145424 13 UserDict.py:77 func -> DictMixin +0 145424 174 UserDict.py:169 func <- DictMixin +0 145424 11 UserDict.py:77 func <- ? +0 145424 17 os.py:458 func -> _Environ +0 145424 11 os.py:489 func <- _Environ +0 145424 13 os.py:459 func -> __init__ +0 145424 11 UserDict.py:4 func -> __init__ +0 145424 11 UserDict.py:9 func <- __init__ +0 145424 10 os.py:461 func <- __init__ +0 145424 11 os.py:501 func -> _exists +0 145424 604 <string>:0 func -> ? +0 145424 10 <string>:0 func <- ? +0 145424 9 os.py:504 func <- _exists +0 145424 9 os.py:501 func -> _exists +0 145424 24 <string>:0 func -> ? +0 145424 9 <string>:0 func <- ? +0 145424 15 os.py:506 func <- _exists +0 145424 9 os.py:501 func -> _exists +0 145424 23 <string>:0 func -> ? +0 145424 8 <string>:0 func <- ? +0 145424 9 os.py:504 func <- _exists +0 145424 26 os.py:501 func -> _exists +0 145424 23 <string>:0 func -> ? +0 145424 8 <string>:0 func <- ? +0 145424 8 os.py:504 func <- _exists +0 145424 11 os.py:501 func -> _exists +0 145424 22 <string>:0 func -> ? +0 145424 8 <string>:0 func <- ? +0 145424 8 os.py:504 func <- _exists +0 145424 11 os.py:501 func -> _exists +0 145424 22 <string>:0 func -> ? +0 145424 8 <string>:0 func <- ? +0 145424 8 os.py:504 func <- _exists +0 145424 9 os.py:501 func -> _exists +0 145424 21 <string>:0 func -> ? +0 145424 9 <string>:0 func <- ? +0 145424 14 os.py:506 func <- _exists +0 145424 10 os.py:501 func -> _exists +0 145424 22 <string>:0 func -> ? +0 145424 9 <string>:0 func <- ? +0 145424 13 os.py:506 func <- _exists +0 145424 11 os.py:501 func -> _exists +0 145424 22 <string>:0 func -> ? +0 145424 8 <string>:0 func <- ? +0 145424 13 os.py:506 func <- _exists +0 145424 181 copy_reg.py:5 func -> ? +0 145424 181 types.py:4 func -> ? +0 145424 64 types.py:55 func -> _C +0 145424 10 types.py:56 func <- _C +0 145424 35 types.py:89 func <- ? +0 145424 22 copy_reg.py:14 func -> pickle +0 145424 11 copy_reg.py:27 func -> constructor +0 145424 9 copy_reg.py:29 func <- constructor +0 145424 9 copy_reg.py:25 func <- pickle +0 145424 12 copy_reg.py:175 func <- ? +0 145424 15 copy_reg.py:14 func -> pickle +0 145424 10 copy_reg.py:27 func -> constructor +0 145424 9 copy_reg.py:29 func <- constructor +0 145424 9 copy_reg.py:25 func <- pickle +0 145424 10 copy_reg.py:14 func -> pickle +0 145424 10 copy_reg.py:27 func -> constructor +0 145424 9 copy_reg.py:29 func <- constructor +0 145424 9 copy_reg.py:25 func <- pickle +0 145424 9 os.py:501 func -> _exists +0 145424 26 <string>:0 func -> ? +0 145424 9 <string>:0 func <- ? +0 145424 14 os.py:506 func <- _exists +0 145424 9 os.py:711 func <- ? +0 145424 33 site.py:238 func -> _Printer +0 145424 11 site.py:279 func <- _Printer +0 145424 38 site.py:317 func -> _Helper +0 145424 9 site.py:326 func <- _Helper +0 145424 34 site.py:376 func -> main +0 145424 8 site.py:69 func -> abs__file__ +0 145424 11 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 11 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 22 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 16 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 15 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 22 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 18 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 12 site.py:75 func <- abs__file__ +0 145424 9 site.py:77 func -> removeduppaths +0 145424 11 site.py:65 func -> makepath +0 145424 10 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 42 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 16 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 12 site.py:93 func <- removeduppaths +0 145424 11 posixpath.py:110 func -> basename +0 145424 10 posixpath.py:74 func -> split +0 145424 14 posixpath.py:81 func <- split +0 145424 9 posixpath.py:112 func <- basename +0 145424 9 site.py:171 func -> addsitepackages +0 145424 13 posixpath.py:56 func -> join +0 145424 15 posixpath.py:66 func <- join +0 145424 10 posixpath.py:56 func -> join +0 145424 12 posixpath.py:66 func <- join +0 145424 11 posixpath.py:192 func -> isdir +0 145424 34 stat.py:45 func -> S_ISDIR +0 145424 9 stat.py:29 func -> S_IFMT +0 145424 9 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 9 posixpath.py:198 func <- isdir +0 145424 11 site.py:148 func -> addsitedir +0 145424 9 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 222 site.py:117 func -> addpackage +0 145424 12 posixpath.py:56 func -> join +0 145424 12 posixpath.py:66 func <- join +0 145424 132 <string>:1 func -> ? +0 145424 13 site.py:148 func -> addsitedir +0 145424 9 site.py:105 func -> _init_pathinfo +0 145424 11 posixpath.py:192 func -> isdir +0 145424 84 posixpath.py:197 func <- isdir +0 145424 12 posixpath.py:192 func -> isdir +0 145424 23 stat.py:45 func -> S_ISDIR +0 145424 9 stat.py:29 func -> S_IFMT +0 145424 9 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 9 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 10 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:192 func -> isdir +0 145424 23 stat.py:45 func -> S_ISDIR +0 145424 8 stat.py:29 func -> S_IFMT +0 145424 8 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 9 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:192 func -> isdir +0 145424 24 stat.py:45 func -> S_ISDIR +0 145424 8 stat.py:29 func -> S_IFMT +0 145424 8 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 8 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:192 func -> isdir +0 145424 23 stat.py:45 func -> S_ISDIR +0 145424 8 stat.py:29 func -> S_IFMT +0 145424 8 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 9 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:192 func -> isdir +0 145424 22 stat.py:45 func -> S_ISDIR +0 145424 8 stat.py:29 func -> S_IFMT +0 145424 8 stat.py:30 func <- S_IFMT +0 145424 9 stat.py:46 func <- S_ISDIR +0 145424 8 posixpath.py:198 func <- isdir +0 145424 10 site.py:65 func -> makepath +0 145424 9 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 8 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 site.py:115 func <- _init_pathinfo +0 145424 9 site.py:65 func -> makepath +0 145424 10 posixpath.py:56 func -> join +0 145424 9 posixpath.py:66 func <- join +0 145424 9 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 10 posixpath.py:374 func -> normpath +0 145424 17 posixpath.py:398 func <- normpath +0 145424 9 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 170 site.py:117 func -> addpackage +0 145424 11 posixpath.py:56 func -> join +0 145424 12 posixpath.py:66 func <- join +0 145424 73 site.py:65 func -> makepath +0 145424 11 posixpath.py:56 func -> join +0 145424 11 posixpath.py:66 func <- join +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 19 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 9 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:168 func -> exists +0 145424 41 posixpath.py:174 func <- exists +0 145424 53 site.py:146 func <- addpackage +0 145424 21 site.py:117 func -> addpackage +0 145424 9 posixpath.py:56 func -> join +0 145424 11 posixpath.py:66 func <- join +0 145424 48 site.py:65 func -> makepath +0 145424 10 posixpath.py:56 func -> join +0 145424 47 posixpath.py:66 func <- join +0 145424 10 posixpath.py:401 func -> abspath +0 145424 9 posixpath.py:47 func -> isabs +0 145424 9 posixpath.py:49 func <- isabs +0 145424 9 posixpath.py:374 func -> normpath +0 145424 18 posixpath.py:398 func <- normpath +0 145424 10 posixpath.py:405 func <- abspath +0 145424 10 posixpath.py:39 func -> normcase +0 145424 9 posixpath.py:41 func <- normcase +0 145424 9 site.py:67 func <- makepath +0 145424 10 posixpath.py:168 func -> exists +0 145424 25 posixpath.py:174 func <- exists +0 145424 32 site.py:146 func <- addpackage +0 145424 14 site.py:169 func <- addsitedir +0 145424 10 <string>:1 func <- ? +0 145424 16 site.py:146 func <- addpackage +0 145424 10 site.py:169 func <- addsitedir +0 145424 10 posixpath.py:192 func -> isdir +0 145424 34 posixpath.py:197 func <- isdir +0 145424 10 site.py:204 func <- addsitepackages +0 145424 11 site.py:224 func -> setquit +0 145424 11 site.py:235 func <- setquit +0 145424 9 site.py:299 func -> setcopyright +0 145424 11 site.py:244 func -> __init__ +0 145424 10 site.py:249 func <- __init__ +0 145424 12 site.py:244 func -> __init__ +0 145424 9 site.py:249 func <- __init__ +0 145424 10 posixpath.py:117 func -> dirname +0 145424 9 posixpath.py:74 func -> split +0 145424 14 posixpath.py:81 func <- split +0 145424 9 posixpath.py:119 func <- dirname +0 145424 14 posixpath.py:56 func -> join +0 145424 11 posixpath.py:66 func <- join +0 145424 11 site.py:244 func -> __init__ +0 145424 9 site.py:249 func <- __init__ +0 145424 9 site.py:314 func <- setcopyright +0 145424 9 site.py:330 func -> sethelper +0 145424 9 site.py:331 func <- sethelper +0 145424 9 site.py:333 func -> aliasmbcs +0 145424 9 site.py:346 func <- aliasmbcs +0 145424 9 site.py:348 func -> setencoding +0 145424 9 site.py:365 func <- setencoding +0 145424 9 site.py:368 func -> execsitecustomize +0 145424 706 site.py:373 func <- execsitecustomize +0 145424 16 site.py:395 func <- main +0 145424 12 site.py:406 func <- ? +0 145424 289 warnings.py:1 func -> ? +0 145424 158 linecache.py:6 func -> ? +0 145424 17 linecache.py:66 func <- ? +0 145424 20 warnings.py:179 func -> _OptionError +0 145424 9 warnings.py:180 func <- _OptionError +0 145424 19 warnings.py:184 func -> _processoptions +0 145424 10 warnings.py:189 func <- _processoptions +0 145424 12 warnings.py:160 func -> simplefilter +0 145424 13 warnings.py:173 func <- simplefilter +0 145424 10 warnings.py:160 func -> simplefilter +0 145424 11 warnings.py:173 func <- simplefilter +0 145424 9 warnings.py:259 func <- ? +0 145424 492 __init__.py:28 func -> ? +0 145424 599 codecs.py:8 func -> ? +0 145424 61 codecs.py:76 func -> Codec +0 145424 12 codecs.py:117 func <- Codec +0 145424 18 codecs.py:147 func -> StreamWriter +0 145424 11 codecs.py:200 func <- StreamWriter +0 145424 13 codecs.py:209 func -> StreamReader +0 145424 13 codecs.py:436 func <- StreamReader +0 145424 12 codecs.py:445 func -> StreamReaderWriter +0 145424 13 codecs.py:509 func <- StreamReaderWriter +0 145424 11 codecs.py:518 func -> StreamRecoder +0 145424 12 codecs.py:619 func <- StreamRecoder +0 145424 17 codecs.py:817 func <- ? +0 145424 625 aliases.py:17 func -> ? +0 145424 54 aliases.py:18 func <- ? +0 145424 21 __init__.py:43 func -> CodecRegistryError +0 145424 10 __init__.py:45 func <- CodecRegistryError +0 145424 19 __init__.py:145 func <- ? +0 145424 18 __init__.py:69 func -> search_function +0 145424 12 __init__.py:47 func -> normalize_encoding +0 145424 16 __init__.py:67 func <- normalize_encoding +0 145424 120 ascii.py:8 func -> ? +0 145424 14 ascii.py:13 func -> Codec +0 145424 10 ascii.py:18 func <- Codec +0 145424 15 ascii.py:20 func -> StreamWriter +0 145424 9 ascii.py:21 func <- StreamWriter +0 145424 13 ascii.py:23 func -> StreamReader +0 145424 9 ascii.py:24 func <- StreamReader +0 145424 24 ascii.py:26 func -> StreamConverter +0 145424 10 ascii.py:29 func <- StreamConverter +0 145424 14 ascii.py:33 func <- ? +0 145424 17 ascii.py:33 func -> getregentry +0 145424 10 ascii.py:35 func <- getregentry +0 145424 26 __init__.py:142 func <- search_function +0 145424 367 func_abc.py:3 func -> ? +0 145424 1722 func_abc.py:14 func -> func_a +0 145424 1005677 func_abc.py:9 func -> func_b +0 145424 1000271 func_abc.py:5 func -> func_c +0 145424 1009739 func_abc.py:7 func <- func_c +0 145424 25 func_abc.py:12 func <- func_b +0 145424 9 func_abc.py:17 func <- func_a +0 145424 9 func_abc.py:19 func <- ? +^C + +As each function is entered, the last column is indented by 2 spaces. This +shows which function is calling which. + +The DELTA(us) column shows the change in time from the previous line to the +current line. + +The FILE::LINE column shows which line in which file was being executed. Refer +to the source program to see what this line refers to. + +If the output looks shuffled, check the CPU "C" column - if it changes, +then the output is probably shuffled. See Notes/ALLsnoop_notes.txt for +details and suggested workarounds. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_flowtime_example.txt new file mode 100644 index 000000000000..5ac494bba64d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_flowtime_example.txt @@ -0,0 +1,487 @@ +The following are examples of py_flowtime.d. + +This is a simple script to trace the flow of Python functions. Here it traces +the example program, Code/Python/func_abc.py + +# py_flowtime.d + C TIME(us) FILE DELTA(us) -- FUNC + 0 3064660319556 site.py 3 -> ? + 0 3064660320224 os.py 667 -> ? + 0 3064660321335 posixpath.py 1111 -> ? + 0 3064660321526 stat.py 190 -> ? + 0 3064660321546 stat.py 20 <- ? + 0 3064660321576 posixpath.py 29 <- ? + 0 3064660321593 os.py 17 -> _get_exports_list + 0 3064660321728 os.py 134 <- _get_exports_list + 0 3064660321989 UserDict.py 260 -> ? + 0 3064660322000 UserDict.py 10 -> UserDict + 0 3064660322035 UserDict.py 34 <- UserDict + 0 3064660322050 UserDict.py 15 -> IterableUserDict + 0 3064660322058 UserDict.py 8 <- IterableUserDict + 0 3064660322071 UserDict.py 12 -> DictMixin + 0 3064660322247 UserDict.py 176 <- DictMixin + 0 3064660322258 UserDict.py 10 <- ? + 0 3064660322275 os.py 16 -> _Environ + 0 3064660322285 os.py 10 <- _Environ + 0 3064660322298 os.py 13 -> __init__ + 0 3064660322308 UserDict.py 10 -> __init__ + 0 3064660322319 UserDict.py 10 <- __init__ + 0 3064660322328 os.py 9 <- __init__ + 0 3064660322338 os.py 10 -> _exists + 0 3064660322946 <string> 607 -> ? + 0 3064660322955 <string> 8 <- ? + 0 3064660322963 os.py 8 <- _exists + 0 3064660322972 os.py 8 -> _exists + 0 3064660322996 <string> 23 -> ? + 0 3064660323005 <string> 8 <- ? + 0 3064660323020 os.py 14 <- _exists + 0 3064660323029 os.py 8 -> _exists + 0 3064660323051 <string> 22 -> ? + 0 3064660323059 <string> 7 <- ? + 0 3064660323067 os.py 8 <- _exists + 0 3064660323077 os.py 10 -> _exists + 0 3064660323098 <string> 21 -> ? + 0 3064660323106 <string> 7 <- ? + 0 3064660323114 os.py 8 <- _exists + 0 3064660323125 os.py 10 -> _exists + 0 3064660323146 <string> 21 -> ? + 0 3064660323154 <string> 7 <- ? + 0 3064660323162 os.py 8 <- _exists + 0 3064660323173 os.py 10 -> _exists + 0 3064660323194 <string> 21 -> ? + 0 3064660323202 <string> 7 <- ? + 0 3064660323210 os.py 8 <- _exists + 0 3064660323218 os.py 8 -> _exists + 0 3064660323239 <string> 21 -> ? + 0 3064660323247 <string> 8 <- ? + 0 3064660323261 os.py 13 <- _exists + 0 3064660323271 os.py 10 -> _exists + 0 3064660323293 <string> 21 -> ? + 0 3064660323301 <string> 8 <- ? + 0 3064660323314 os.py 12 <- _exists + 0 3064660323324 os.py 10 -> _exists + 0 3064660323345 <string> 21 -> ? + 0 3064660323354 <string> 8 <- ? + 0 3064660323366 os.py 12 <- _exists + 0 3064660323545 copy_reg.py 178 -> ? + 0 3064660323726 types.py 180 -> ? + 0 3064660323790 types.py 64 -> _C + 0 3064660323800 types.py 9 <- _C + 0 3064660323834 types.py 33 <- ? + 0 3064660323855 copy_reg.py 21 -> pickle + 0 3064660323866 copy_reg.py 10 -> constructor + 0 3064660323874 copy_reg.py 8 <- constructor + 0 3064660323883 copy_reg.py 8 <- pickle + 0 3064660323895 copy_reg.py 11 <- ? + 0 3064660323909 copy_reg.py 14 -> pickle + 0 3064660323919 copy_reg.py 9 -> constructor + 0 3064660323927 copy_reg.py 8 <- constructor + 0 3064660323936 copy_reg.py 8 <- pickle + 0 3064660323946 copy_reg.py 9 -> pickle + 0 3064660323955 copy_reg.py 9 -> constructor + 0 3064660323963 copy_reg.py 8 <- constructor + 0 3064660323972 copy_reg.py 8 <- pickle + 0 3064660323981 os.py 9 -> _exists + 0 3064660324006 <string> 25 -> ? + 0 3064660324015 <string> 8 <- ? + 0 3064660324028 os.py 13 <- _exists + 0 3064660324037 os.py 8 <- ? + 0 3064660324069 site.py 31 -> _Printer + 0 3064660324080 site.py 10 <- _Printer + 0 3064660324118 site.py 38 -> _Helper + 0 3064660324127 site.py 9 <- _Helper + 0 3064660324160 site.py 33 -> main + 0 3064660324168 site.py 8 -> abs__file__ + 0 3064660324179 posixpath.py 10 -> abspath + 0 3064660324187 posixpath.py 8 -> isabs + 0 3064660324197 posixpath.py 9 <- isabs + 0 3064660324207 posixpath.py 9 -> normpath + 0 3064660324228 posixpath.py 21 <- normpath + 0 3064660324238 posixpath.py 9 <- abspath + 0 3064660324253 posixpath.py 15 -> abspath + 0 3064660324261 posixpath.py 8 -> isabs + 0 3064660324270 posixpath.py 8 <- isabs + 0 3064660324278 posixpath.py 8 -> normpath + 0 3064660324295 posixpath.py 16 <- normpath + 0 3064660324304 posixpath.py 9 <- abspath + 0 3064660324314 posixpath.py 9 -> abspath + 0 3064660324322 posixpath.py 8 -> isabs + 0 3064660324331 posixpath.py 8 <- isabs + 0 3064660324339 posixpath.py 8 -> normpath + 0 3064660324355 posixpath.py 15 <- normpath + 0 3064660324364 posixpath.py 8 <- abspath + 0 3064660324374 posixpath.py 9 -> abspath + 0 3064660324382 posixpath.py 8 -> isabs + 0 3064660324391 posixpath.py 8 <- isabs + 0 3064660324399 posixpath.py 8 -> normpath + 0 3064660324415 posixpath.py 15 <- normpath + 0 3064660324424 posixpath.py 8 <- abspath + 0 3064660324439 posixpath.py 14 -> abspath + 0 3064660324447 posixpath.py 8 -> isabs + 0 3064660324456 posixpath.py 8 <- isabs + 0 3064660324464 posixpath.py 8 -> normpath + 0 3064660324480 posixpath.py 15 <- normpath + 0 3064660324489 posixpath.py 8 <- abspath + 0 3064660324511 posixpath.py 21 -> abspath + 0 3064660324519 posixpath.py 8 -> isabs + 0 3064660324528 posixpath.py 8 <- isabs + 0 3064660324536 posixpath.py 8 -> normpath + 0 3064660324552 posixpath.py 15 <- normpath + 0 3064660324561 posixpath.py 9 <- abspath + 0 3064660324579 posixpath.py 17 -> abspath + 0 3064660324588 posixpath.py 8 -> isabs + 0 3064660324596 posixpath.py 8 <- isabs + 0 3064660324605 posixpath.py 8 -> normpath + 0 3064660324621 posixpath.py 15 <- normpath + 0 3064660324630 posixpath.py 8 <- abspath + 0 3064660324639 posixpath.py 9 -> abspath + 0 3064660324648 posixpath.py 8 -> isabs + 0 3064660324656 posixpath.py 8 <- isabs + 0 3064660324665 posixpath.py 8 -> normpath + 0 3064660324681 posixpath.py 15 <- normpath + 0 3064660324690 posixpath.py 9 <- abspath + 0 3064660324701 site.py 11 <- abs__file__ + 0 3064660324709 site.py 8 -> removeduppaths + 0 3064660324719 site.py 10 -> makepath + 0 3064660324729 posixpath.py 9 -> join + 0 3064660324738 posixpath.py 8 <- join + 0 3064660324746 posixpath.py 8 -> abspath + 0 3064660324755 posixpath.py 8 -> isabs + 0 3064660324764 posixpath.py 8 <- isabs + 0 3064660324773 posixpath.py 9 -> normpath + 0 3064660324789 posixpath.py 15 <- normpath + 0 3064660324797 posixpath.py 8 <- abspath + 0 3064660324806 posixpath.py 8 -> normcase + 0 3064660324814 posixpath.py 8 <- normcase + 0 3064660324823 site.py 8 <- makepath + 0 3064660324864 site.py 40 -> makepath + 0 3064660324873 posixpath.py 8 -> join + 0 3064660324881 posixpath.py 8 <- join + 0 3064660324889 posixpath.py 8 -> abspath + 0 3064660324898 posixpath.py 8 -> isabs + 0 3064660324906 posixpath.py 8 <- isabs + 0 3064660324915 posixpath.py 8 -> normpath + 0 3064660324931 posixpath.py 15 <- normpath + 0 3064660324939 posixpath.py 8 <- abspath + 0 3064660324948 posixpath.py 8 -> normcase + 0 3064660324957 posixpath.py 8 <- normcase + 0 3064660324965 site.py 8 <- makepath + 0 3064660324974 site.py 9 -> makepath + 0 3064660324983 posixpath.py 8 -> join + 0 3064660324991 posixpath.py 8 <- join + 0 3064660325000 posixpath.py 8 -> abspath + 0 3064660325008 posixpath.py 8 -> isabs + 0 3064660325017 posixpath.py 8 <- isabs + 0 3064660325025 posixpath.py 8 -> normpath + 0 3064660325041 posixpath.py 15 <- normpath + 0 3064660325050 posixpath.py 8 <- abspath + 0 3064660325059 posixpath.py 8 -> normcase + 0 3064660325067 posixpath.py 8 <- normcase + 0 3064660325075 site.py 8 <- makepath + 0 3064660325084 site.py 9 -> makepath + 0 3064660325093 posixpath.py 8 -> join + 0 3064660325102 posixpath.py 8 <- join + 0 3064660325110 posixpath.py 8 -> abspath + 0 3064660325118 posixpath.py 8 -> isabs + 0 3064660325127 posixpath.py 8 <- isabs + 0 3064660325135 posixpath.py 8 -> normpath + 0 3064660325151 posixpath.py 15 <- normpath + 0 3064660325160 posixpath.py 8 <- abspath + 0 3064660325169 posixpath.py 8 -> normcase + 0 3064660325177 posixpath.py 7 <- normcase + 0 3064660325185 site.py 8 <- makepath + 0 3064660325194 site.py 9 -> makepath + 0 3064660325203 posixpath.py 8 -> join + 0 3064660325212 posixpath.py 8 <- join + 0 3064660325220 posixpath.py 8 -> abspath + 0 3064660325228 posixpath.py 8 -> isabs + 0 3064660325237 posixpath.py 8 <- isabs + 0 3064660325245 posixpath.py 8 -> normpath + 0 3064660325261 posixpath.py 15 <- normpath + 0 3064660325270 posixpath.py 8 <- abspath + 0 3064660325279 posixpath.py 8 -> normcase + 0 3064660325287 posixpath.py 8 <- normcase + 0 3064660325295 site.py 8 <- makepath + 0 3064660325307 site.py 11 <- removeduppaths + 0 3064660325317 posixpath.py 10 -> basename + 0 3064660325327 posixpath.py 9 -> split + 0 3064660325340 posixpath.py 13 <- split + 0 3064660325349 posixpath.py 8 <- basename + 0 3064660325358 site.py 8 -> addsitepackages + 0 3064660325370 posixpath.py 12 -> join + 0 3064660325385 posixpath.py 14 <- join + 0 3064660325394 posixpath.py 9 -> join + 0 3064660325406 posixpath.py 11 <- join + 0 3064660325416 posixpath.py 10 -> isdir + 0 3064660325447 stat.py 31 -> S_ISDIR + 0 3064660325456 stat.py 8 -> S_IFMT + 0 3064660325464 stat.py 8 <- S_IFMT + 0 3064660325473 stat.py 8 <- S_ISDIR + 0 3064660325481 posixpath.py 7 <- isdir + 0 3064660325491 site.py 10 -> addsitedir + 0 3064660325500 site.py 8 -> makepath + 0 3064660325508 posixpath.py 8 -> join + 0 3064660325517 posixpath.py 8 <- join + 0 3064660325525 posixpath.py 8 -> abspath + 0 3064660325534 posixpath.py 8 -> isabs + 0 3064660325543 posixpath.py 8 <- isabs + 0 3064660325552 posixpath.py 9 -> normpath + 0 3064660325569 posixpath.py 16 <- normpath + 0 3064660325578 posixpath.py 8 <- abspath + 0 3064660325587 posixpath.py 8 -> normcase + 0 3064660325595 posixpath.py 8 <- normcase + 0 3064660325604 site.py 8 <- makepath + 0 3064660325823 site.py 219 -> addpackage + 0 3064660325834 posixpath.py 10 -> join + 0 3064660325844 posixpath.py 10 <- join + 0 3064660325972 <string> 127 -> ? + 0 3064660325985 site.py 13 -> addsitedir + 0 3064660325994 site.py 8 -> _init_pathinfo + 0 3064660326004 posixpath.py 10 -> isdir + 0 3064660326086 posixpath.py 81 <- isdir + 0 3064660326097 posixpath.py 10 -> isdir + 0 3064660326118 stat.py 21 -> S_ISDIR + 0 3064660326127 stat.py 9 -> S_IFMT + 0 3064660326136 stat.py 8 <- S_IFMT + 0 3064660326144 stat.py 8 <- S_ISDIR + 0 3064660326152 posixpath.py 7 <- isdir + 0 3064660326161 site.py 9 -> makepath + 0 3064660326171 posixpath.py 9 -> join + 0 3064660326179 posixpath.py 8 <- join + 0 3064660326188 posixpath.py 8 -> abspath + 0 3064660326196 posixpath.py 8 -> isabs + 0 3064660326205 posixpath.py 9 <- isabs + 0 3064660326215 posixpath.py 9 -> normpath + 0 3064660326231 posixpath.py 16 <- normpath + 0 3064660326240 posixpath.py 8 <- abspath + 0 3064660326249 posixpath.py 9 -> normcase + 0 3064660326258 posixpath.py 8 <- normcase + 0 3064660326266 site.py 8 <- makepath + 0 3064660326276 posixpath.py 9 -> isdir + 0 3064660326298 stat.py 22 -> S_ISDIR + 0 3064660326306 stat.py 8 -> S_IFMT + 0 3064660326314 stat.py 7 <- S_IFMT + 0 3064660326322 stat.py 8 <- S_ISDIR + 0 3064660326330 posixpath.py 8 <- isdir + 0 3064660326340 site.py 9 -> makepath + 0 3064660326349 posixpath.py 8 -> join + 0 3064660326357 posixpath.py 8 <- join + 0 3064660326382 posixpath.py 24 -> abspath + 0 3064660326390 posixpath.py 8 -> isabs + 0 3064660326399 posixpath.py 8 <- isabs + 0 3064660326408 posixpath.py 8 -> normpath + 0 3064660326425 posixpath.py 16 <- normpath + 0 3064660326434 posixpath.py 9 <- abspath + 0 3064660326443 posixpath.py 9 -> normcase + 0 3064660326451 posixpath.py 8 <- normcase + 0 3064660326460 site.py 8 <- makepath + 0 3064660326469 posixpath.py 9 -> isdir + 0 3064660326493 stat.py 23 -> S_ISDIR + 0 3064660326501 stat.py 8 -> S_IFMT + 0 3064660326509 stat.py 7 <- S_IFMT + 0 3064660326517 stat.py 8 <- S_ISDIR + 0 3064660326525 posixpath.py 7 <- isdir + 0 3064660326534 site.py 9 -> makepath + 0 3064660326542 posixpath.py 8 -> join + 0 3064660326551 posixpath.py 8 <- join + 0 3064660326559 posixpath.py 8 -> abspath + 0 3064660326568 posixpath.py 8 -> isabs + 0 3064660326576 posixpath.py 8 <- isabs + 0 3064660326585 posixpath.py 8 -> normpath + 0 3064660326602 posixpath.py 16 <- normpath + 0 3064660326610 posixpath.py 8 <- abspath + 0 3064660326619 posixpath.py 8 -> normcase + 0 3064660326628 posixpath.py 8 <- normcase + 0 3064660326636 site.py 8 <- makepath + 0 3064660326646 posixpath.py 9 -> isdir + 0 3064660326668 stat.py 22 -> S_ISDIR + 0 3064660326676 stat.py 8 -> S_IFMT + 0 3064660326684 stat.py 7 <- S_IFMT + 0 3064660326692 stat.py 8 <- S_ISDIR + 0 3064660326700 posixpath.py 8 <- isdir + 0 3064660326709 site.py 9 -> makepath + 0 3064660326718 posixpath.py 8 -> join + 0 3064660326726 posixpath.py 8 <- join + 0 3064660326735 posixpath.py 8 -> abspath + 0 3064660326743 posixpath.py 8 -> isabs + 0 3064660326752 posixpath.py 8 <- isabs + 0 3064660326760 posixpath.py 8 -> normpath + 0 3064660326777 posixpath.py 16 <- normpath + 0 3064660326786 posixpath.py 9 <- abspath + 0 3064660326795 posixpath.py 9 -> normcase + 0 3064660326803 posixpath.py 8 <- normcase + 0 3064660326811 site.py 8 <- makepath + 0 3064660326821 posixpath.py 9 -> isdir + 0 3064660326842 stat.py 21 -> S_ISDIR + 0 3064660326850 stat.py 8 -> S_IFMT + 0 3064660326858 stat.py 7 <- S_IFMT + 0 3064660326866 stat.py 8 <- S_ISDIR + 0 3064660326874 posixpath.py 7 <- isdir + 0 3064660326883 site.py 9 -> makepath + 0 3064660326892 posixpath.py 8 -> join + 0 3064660326901 posixpath.py 8 <- join + 0 3064660326909 posixpath.py 8 -> abspath + 0 3064660326917 posixpath.py 8 -> isabs + 0 3064660326926 posixpath.py 8 <- isabs + 0 3064660326935 posixpath.py 8 -> normpath + 0 3064660326951 posixpath.py 16 <- normpath + 0 3064660326960 posixpath.py 8 <- abspath + 0 3064660326970 posixpath.py 9 -> normcase + 0 3064660326978 posixpath.py 8 <- normcase + 0 3064660326986 site.py 8 <- makepath + 0 3064660326995 site.py 8 <- _init_pathinfo + 0 3064660327004 site.py 8 -> makepath + 0 3064660327013 posixpath.py 9 -> join + 0 3064660327021 posixpath.py 8 <- join + 0 3064660327030 posixpath.py 8 -> abspath + 0 3064660327038 posixpath.py 8 -> isabs + 0 3064660327047 posixpath.py 8 <- isabs + 0 3064660327056 posixpath.py 8 -> normpath + 0 3064660327072 posixpath.py 15 <- normpath + 0 3064660327081 posixpath.py 9 <- abspath + 0 3064660327090 posixpath.py 8 -> normcase + 0 3064660327098 posixpath.py 8 <- normcase + 0 3064660327106 site.py 8 <- makepath + 0 3064660327278 site.py 171 -> addpackage + 0 3064660327289 posixpath.py 10 -> join + 0 3064660327300 posixpath.py 10 <- join + 0 3064660327372 site.py 72 -> makepath + 0 3064660327382 posixpath.py 10 -> join + 0 3064660327393 posixpath.py 10 <- join + 0 3064660327402 posixpath.py 9 -> abspath + 0 3064660327410 posixpath.py 8 -> isabs + 0 3064660327419 posixpath.py 8 <- isabs + 0 3064660327427 posixpath.py 8 -> normpath + 0 3064660327445 posixpath.py 17 <- normpath + 0 3064660327454 posixpath.py 9 <- abspath + 0 3064660327463 posixpath.py 9 -> normcase + 0 3064660327472 posixpath.py 8 <- normcase + 0 3064660327480 site.py 8 <- makepath + 0 3064660327489 posixpath.py 9 -> exists + 0 3064660327515 posixpath.py 26 <- exists + 0 3064660327567 site.py 51 <- addpackage + 0 3064660327588 site.py 20 -> addpackage + 0 3064660327597 posixpath.py 8 -> join + 0 3064660327607 posixpath.py 10 <- join + 0 3064660327654 site.py 46 -> makepath + 0 3064660327663 posixpath.py 9 -> join + 0 3064660327710 posixpath.py 46 <- join + 0 3064660327720 posixpath.py 9 -> abspath + 0 3064660327728 posixpath.py 8 -> isabs + 0 3064660327737 posixpath.py 9 <- isabs + 0 3064660327746 posixpath.py 8 -> normpath + 0 3064660327764 posixpath.py 17 <- normpath + 0 3064660327773 posixpath.py 9 <- abspath + 0 3064660327782 posixpath.py 9 -> normcase + 0 3064660327791 posixpath.py 8 <- normcase + 0 3064660327799 site.py 8 <- makepath + 0 3064660327808 posixpath.py 9 -> exists + 0 3064660327833 posixpath.py 24 <- exists + 0 3064660327864 site.py 31 <- addpackage + 0 3064660327878 site.py 13 <- addsitedir + 0 3064660327887 <string> 9 <- ? + 0 3064660327903 site.py 15 <- addpackage + 0 3064660327913 site.py 9 <- addsitedir + 0 3064660327923 posixpath.py 10 -> isdir + 0 3064660327955 posixpath.py 32 <- isdir + 0 3064660327965 site.py 9 <- addsitepackages + 0 3064660327976 site.py 10 -> setquit + 0 3064660327986 site.py 10 <- setquit + 0 3064660327995 site.py 8 -> setcopyright + 0 3064660328005 site.py 10 -> __init__ + 0 3064660328015 site.py 9 <- __init__ + 0 3064660328026 site.py 11 -> __init__ + 0 3064660328035 site.py 8 <- __init__ + 0 3064660328045 posixpath.py 9 -> dirname + 0 3064660328053 posixpath.py 8 -> split + 0 3064660328066 posixpath.py 13 <- split + 0 3064660328075 posixpath.py 8 <- dirname + 0 3064660328089 posixpath.py 13 -> join + 0 3064660328099 posixpath.py 10 <- join + 0 3064660328109 site.py 10 -> __init__ + 0 3064660328118 site.py 9 <- __init__ + 0 3064660328127 site.py 8 <- setcopyright + 0 3064660328136 site.py 8 -> sethelper + 0 3064660328145 site.py 8 <- sethelper + 0 3064660328153 site.py 8 -> aliasmbcs + 0 3064660328161 site.py 8 <- aliasmbcs + 0 3064660328170 site.py 8 -> setencoding + 0 3064660328178 site.py 7 <- setencoding + 0 3064660328186 site.py 8 -> execsitecustomize + 0 3064660328736 site.py 549 <- execsitecustomize + 0 3064660328748 site.py 12 <- main + 0 3064660328758 site.py 9 <- ? + 0 3064660329029 warnings.py 270 -> ? + 0 3064660329184 linecache.py 155 -> ? + 0 3064660329201 linecache.py 16 <- ? + 0 3064660329220 warnings.py 18 -> _OptionError + 0 3064660329228 warnings.py 8 <- _OptionError + 0 3064660329246 warnings.py 17 -> _processoptions + 0 3064660329255 warnings.py 8 <- _processoptions + 0 3064660329266 warnings.py 10 -> simplefilter + 0 3064660329278 warnings.py 12 <- simplefilter + 0 3064660329288 warnings.py 9 -> simplefilter + 0 3064660329298 warnings.py 10 <- simplefilter + 0 3064660329307 warnings.py 8 <- ? + 0 3064660329533 __init__.py 226 -> ? + 0 3064660330090 codecs.py 557 -> ? + 0 3064660330148 codecs.py 57 -> Codec + 0 3064660330158 codecs.py 10 <- Codec + 0 3064660330171 codecs.py 13 -> StreamWriter + 0 3064660330182 codecs.py 10 <- StreamWriter + 0 3064660330194 codecs.py 11 -> StreamReader + 0 3064660330206 codecs.py 12 <- StreamReader + 0 3064660330217 codecs.py 11 -> StreamReaderWriter + 0 3064660330229 codecs.py 11 <- StreamReaderWriter + 0 3064660330239 codecs.py 10 -> StreamRecoder + 0 3064660330251 codecs.py 11 <- StreamRecoder + 0 3064660330267 codecs.py 16 <- ? + 0 3064660331439 aliases.py 1171 -> ? + 0 3064660331500 aliases.py 61 <- ? + 0 3064660331526 __init__.py 25 -> CodecRegistryError + 0 3064660331535 __init__.py 9 <- CodecRegistryError + 0 3064660331557 __init__.py 21 <- ? + 0 3064660331577 __init__.py 20 -> search_function + 0 3064660331590 __init__.py 12 -> normalize_encoding + 0 3064660331605 __init__.py 15 <- normalize_encoding + 0 3064660331728 ascii.py 122 -> ? + 0 3064660331742 ascii.py 13 -> Codec + 0 3064660331752 ascii.py 9 <- Codec + 0 3064660331766 ascii.py 13 -> StreamWriter + 0 3064660331774 ascii.py 8 <- StreamWriter + 0 3064660331787 ascii.py 13 -> StreamReader + 0 3064660331796 ascii.py 8 <- StreamReader + 0 3064660331819 ascii.py 23 -> StreamConverter + 0 3064660331829 ascii.py 9 <- StreamConverter + 0 3064660331842 ascii.py 13 <- ? + 0 3064660331860 ascii.py 17 -> getregentry + 0 3064660331869 ascii.py 9 <- getregentry + 0 3064660331897 __init__.py 27 <- search_function + 0 3064660332263 func_abc.py 366 -> ? + 0 3064660333735 func_abc.py 1471 -> func_a + 0 3064661340597 func_abc.py 1006862 -> func_b + 0 3064662350504 func_abc.py 1009906 -> func_c + 0 3064663350678 func_abc.py 1000174 <- func_c + 0 3064663350700 func_abc.py 22 <- func_b + 0 3064663350709 func_abc.py 8 <- func_a + 0 3064663350717 func_abc.py 8 <- ? +^C + +The fifth column is indented by 2 spaces to show when a new function begins. +This shows which function is calling which - first a whole lot of +pre-processing, then working through the func_abc.py program. + +The TIME(us) column shows time since boot. + +The DELTA(us) column shows time from that line to the previous line, and +so can be a bit tricky to read. For example, the third last line of data output +shows the time elapsing between func_c returning and func_b returning as 22 +microseconds. + +The FILE column shows file that was being executed. + +If the output looks shuffled, check the CPU "C" and "TIME" columns, and +post sort based on TIME if necessary. + +See Notes/ALLflow_notes.txt for important notes about reading flow outputs. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_funccalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_funccalls_example.txt new file mode 100644 index 000000000000..0ac87803fd8d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_funccalls_example.txt @@ -0,0 +1,89 @@ +The following are examples of py_funccalls.d. + +This is a simple script to count executed PHP functions. Here it traces +an example program, Code/Python/func_abc.py + +# py_funccalls.d +Tracing... Hit Ctrl-C to end. +^C + + FILE FUNC CALLS + UserDict.py ? 1 + UserDict.py DictMixin 1 + UserDict.py IterableUserDict 1 + UserDict.py UserDict 1 + UserDict.py __init__ 1 + __init__.py ? 1 + __init__.py CodecRegistryError 1 + __init__.py normalize_encoding 1 + __init__.py search_function 1 + aliases.py ? 1 + ascii.py ? 1 + ascii.py Codec 1 + ascii.py StreamConverter 1 + ascii.py StreamReader 1 + ascii.py StreamWriter 1 + ascii.py getregentry 1 + codecs.py ? 1 + codecs.py Codec 1 + codecs.py StreamReader 1 + codecs.py StreamReaderWriter 1 + codecs.py StreamRecoder 1 + codecs.py StreamWriter 1 + copy_reg.py ? 1 + func_abc.py ? 1 + func_abc.py func_a 1 + func_abc.py func_b 1 + func_abc.py func_c 1 + linecache.py ? 1 + os.py ? 1 + os.py _Environ 1 + os.py __init__ 1 + os.py _get_exports_list 1 + posixpath.py ? 1 + posixpath.py basename 1 + posixpath.py dirname 1 + site.py ? 1 + site.py _Helper 1 + site.py _Printer 1 + site.py _init_pathinfo 1 + site.py abs__file__ 1 + site.py addsitepackages 1 + site.py aliasmbcs 1 + site.py execsitecustomize 1 + site.py main 1 + site.py removeduppaths 1 + site.py setcopyright 1 + site.py setencoding 1 + site.py sethelper 1 + site.py setquit 1 + stat.py ? 1 + types.py ? 1 + types.py _C 1 + warnings.py ? 1 + warnings.py _OptionError 1 + warnings.py _processoptions 1 + posixpath.py exists 2 + posixpath.py split 2 + site.py addsitedir 2 + warnings.py simplefilter 2 + copy_reg.py constructor 3 + copy_reg.py pickle 3 + site.py __init__ 3 + site.py addpackage 3 + stat.py S_IFMT 6 + stat.py S_ISDIR 6 + posixpath.py isdir 8 + os.py _exists 10 + <string> ? 11 + posixpath.py normcase 14 + site.py makepath 14 + posixpath.py join 20 + posixpath.py abspath 22 + posixpath.py isabs 22 + posixpath.py normpath 22 + +It tells you how many times each function was called, and which file this +function was associated with. In this case you can see most of the function +calls come from functions within the posixpath.py library. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_malloc_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_malloc_example.txt new file mode 100644 index 000000000000..be8fc25a484f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/py_mallocstk_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_mallocstk_example.txt new file mode 100644 index 000000000000..a466737f34b2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_mallocstk_example.txt @@ -0,0 +1,314 @@ +Following are examples of running py_mallocstk.d. This traces malloc() from +Python, printing byte distributions by user stack trace. + +Here we see the script runnin on the program Code/Python/func_abc.py + +# py_mallocstk.d -c ./func_abc.py + +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C + +Python malloc byte distributions by stack trace, + + + + libc.so.1`malloc + libpython2.4.so.1.0`r_object+0x52f + libpython2.4.so.1.0`r_object+0x491 + libpython2.4.so.1.0`r_object+0xd3 + libpython2.4.so.1.0`r_object+0x491 + libpython2.4.so.1.0`r_object+0xd3 + libpython2.4.so.1.0`r_object+0x491 + libpython2.4.so.1.0`r_object+0xd3 + libpython2.4.so.1.0`PyMarshal_ReadObjectFromString+0x36 + libpython2.4.so.1.0`PyMarshal_ReadLastObjectFromFile+0x6a + libpython2.4.so.1.0`read_compiled_module+0xf + libpython2.4.so.1.0`load_source_module+0x63 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xee + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyEval_CallObjectWithKeywords+0xb8 + libpython2.4.so.1.0`PyEval_EvalFrame+0xd3c + [ /usr/lib/python2.4/encodings/__init__.py:28 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`load_package+0xef + libpython2.4.so.1.0`load_module+0x6a + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`_PyCodecRegistry_Init+0xce + libpython2.4.so.1.0`_PyCodec_Lookup+0x2a + libpython2.4.so.1.0`PyCodec_Encoder+0xf + libpython2.4.so.1.0`Py_InitializeEx+0x257 + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 0 | 0 + 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 2 | 0 + + + libc.so.1`malloc + libpython2.4.so.1.0`_PyUnicode_New+0xb2 + libpython2.4.so.1.0`_PyUnicodeUCS2_Init+0x19 + libpython2.4.so.1.0`Py_InitializeEx+0x11c + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + + + libc.so.1`malloc + libc.so.1`_real_gettext_u+0x81 + libc.so.1`dgettext+0x5e + libc.so.1`strerror+0x40 + libpython2.4.so.1.0`PyErr_SetFromErrnoWithFilenameObject+0x2d + libpython2.4.so.1.0`PyErr_SetFromErrnoWithFilename+0x27 + libpython2.4.so.1.0`posix_error_with_allocated_filename+0x17 + libpython2.4.so.1.0`posix_do_stat+0x21f + libpython2.4.so.1.0`posix_stat+0x1f + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`call_function+0x406 + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/posixpath.py:195 (isdir) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:202 (addsitepackages) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:382 (main) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:397 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyObject_CallFunction+0x90 + libpython2.4.so.1.0`PyImport_Import+0x163 + libpython2.4.so.1.0`PyImport_ImportModule+0x1f + libpython2.4.so.1.0`initsite+0x10 + libpython2.4.so.1.0`Py_InitializeEx+0x1ea + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 1 | 0 + 2 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 4 | 0 + +[... around 17000 lines truncated ...] + + + libc.so.1`malloc + libpython2.4.so.1.0`PyObject_Malloc+0x126 + libpython2.4.so.1.0`fixstate+0x26 + libpython2.4.so.1.0`fixdfa+0x2a + libpython2.4.so.1.0`PyGrammar_AddAccelerators+0x1b + libpython2.4.so.1.0`PyParser_New+0x18 + libpython2.4.so.1.0`parsetok+0x17 + libpython2.4.so.1.0`PyParser_ParseStringFlagsFilename+0x72 + libpython2.4.so.1.0`PyParser_ParseStringFlags+0x1c + libpython2.4.so.1.0`PyParser_SimpleParseStringFlags+0x23 + libpython2.4.so.1.0`PyRun_StringFlags+0x2c + libpython2.4.so.1.0`builtin_eval+0x273 + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`call_function+0x406 + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/os.py:503 (_exists) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/os.py:509 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyEval_CallObjectWithKeywords+0xb8 + libpython2.4.so.1.0`PyEval_EvalFrame+0xd3c + [ /usr/lib/python2.4/site.py:58 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyObject_CallFunction+0x90 + libpython2.4.so.1.0`PyImport_Import+0x163 + libpython2.4.so.1.0`PyImport_ImportModule+0x1f + libpython2.4.so.1.0`initsite+0x10 + libpython2.4.so.1.0`Py_InitializeEx+0x1ea + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 256 | 0 + 512 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 331 + 1024 | 0 + + + libc.so.1`malloc + libpython2.4.so.1.0`new_arena+0x13 + libpython2.4.so.1.0`PyObject_Malloc+0x91 + libpython2.4.so.1.0`string_concat+0x109 + libpython2.4.so.1.0`PyString_Concat+0x3b + libpython2.4.so.1.0`string_concatenate+0x150 + libpython2.4.so.1.0`PyEval_EvalFrame+0x27cc + [ /usr/lib/python2.4/posixpath.py:62 (join) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`function_call+0x15e + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`ext_do_call+0xfb + libpython2.4.so.1.0`PyEval_EvalFrame+0xb4f + [ /usr/lib/python2.4/site.py:66 (makepath) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:138 (addpackage) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:166 (addsitedir) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ <string>:1 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`run_node+0x35 + libpython2.4.so.1.0`run_err_node+0x1f + libpython2.4.so.1.0`PyRun_String+0x27 + libpython2.4.so.1.0`exec_statement+0x2b0 + libpython2.4.so.1.0`PyEval_EvalFrame+0x15d6 + [ /usr/lib/python2.4/site.py:134 (addpackage) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:166 (addsitedir) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`fast_function+0x112 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:203 (addsitepackages) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:382 (main) ] + libpython2.4.so.1.0`fast_function+0xa8 + libpython2.4.so.1.0`call_function+0xda + libpython2.4.so.1.0`PyEval_EvalFrame+0xbdf + [ /usr/lib/python2.4/site.py:397 (?) ] + libpython2.4.so.1.0`PyEval_EvalCodeEx+0x732 + libpython2.4.so.1.0`PyEval_EvalCode+0x22 + libpython2.4.so.1.0`PyImport_ExecCodeModuleEx+0xc0 + libpython2.4.so.1.0`load_source_module+0xe6 + libpython2.4.so.1.0`load_module+0xac + libpython2.4.so.1.0`import_submodule+0xfb + libpython2.4.so.1.0`load_next+0xa2 + libpython2.4.so.1.0`import_module_ex+0x48 + libpython2.4.so.1.0`PyImport_ImportModuleEx+0x1d + libpython2.4.so.1.0`builtin___import__+0x4e + libpython2.4.so.1.0`PyCFunction_Call+0x15f + libpython2.4.so.1.0`PyObject_Call+0x1d + libpython2.4.so.1.0`PyObject_CallFunction+0x90 + libpython2.4.so.1.0`PyImport_Import+0x163 + libpython2.4.so.1.0`PyImport_ImportModule+0x1f + libpython2.4.so.1.0`initsite+0x10 + libpython2.4.so.1.0`Py_InitializeEx+0x1ea + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + + libc.so.1`malloc + libpython2.4.so.1.0`new_arena+0x13 + libpython2.4.so.1.0`PyObject_Malloc+0x91 + libpython2.4.so.1.0`_PyObject_GC_Malloc+0x13 + libpython2.4.so.1.0`_PyObject_GC_NewVar+0x24 + libpython2.4.so.1.0`PyTuple_New+0x78 + libpython2.4.so.1.0`PyType_Ready+0x98 + libpython2.4.so.1.0`PyType_Ready+0x60 + libpython2.4.so.1.0`_Py_ReadyTypes+0x10 + libpython2.4.so.1.0`Py_InitializeEx+0xed + libpython2.4.so.1.0`Py_Initialize+0xd + libpython2.4.so.1.0`Py_Main+0x4db + python`main+0x11 + python`_start+0x7a + + value ------------- Distribution ------------- count + 131072 | 0 + 262144 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1 + 524288 | 0 + + +This output looks a little unusual at first glance, and can be confusing for +people unfamiliar with stack tracing and Python engine internals. + +Start by looking at the distribution plots below each stack trace - each plot +shows how many bytes were requested as a histogram by byte size. This should +indicated to you if python is malloc()ing much memory or not, and whether it +is doing so in a few large malloc()s or many small ones. + +With this information in mind you can inspect the stack traces - these explain +why Python called malloc() in that instance, along with translations of Python +functions buried in the stack trace. The stack traces can be hard to read at +first (or even at second or at third) - since you are examining Python engine +internals. Try looking for lines in square brackets - those are Python language +frames, and will show where (or if) the malloc() was caused by Python code. diff --git a/cddl/contrib/dtracetoolkit/Examples/py_profile_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_profile_example.txt new file mode 100644 index 000000000000..04c06886e4c2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/py_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_syscalls_example.txt new file mode 100644 index 000000000000..3aac3d28e882 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_syscalls_example.txt @@ -0,0 +1,129 @@ +The following are examples of py_syscalls.d. + +This is a simple script to count executed Python functions and system calls. +Here it traces an example program, Code/Pythong/func_abc.py. + +# py_syscalls.d -c ./func_abc.py +Tracing... Hit Ctrl-C to end. +Function A +Function B +Function C + +Calls for PID 145538, + + FILE TYPE NAME COUNT + UserDict.py func ? 1 + UserDict.py func DictMixin 1 + UserDict.py func IterableUserDict 1 + UserDict.py func UserDict 1 + UserDict.py func __init__ 1 + __init__.py func ? 1 + __init__.py func CodecRegistryError 1 + __init__.py func normalize_encoding 1 + __init__.py func search_function 1 + aliases.py func ? 1 + ascii.py func ? 1 + ascii.py func Codec 1 + ascii.py func StreamConverter 1 + ascii.py func StreamReader 1 + ascii.py func StreamWriter 1 + ascii.py func getregentry 1 + codecs.py func ? 1 + codecs.py func Codec 1 + codecs.py func StreamReader 1 + codecs.py func StreamReaderWriter 1 + codecs.py func StreamRecoder 1 + codecs.py func StreamWriter 1 + copy_reg.py func ? 1 + func_abc.py func ? 1 + func_abc.py func func_a 1 + func_abc.py func func_b 1 + func_abc.py func func_c 1 + func_abc.py syscall getrlimit 1 + func_abc.py syscall gtime 1 + func_abc.py syscall memcntl 1 + func_abc.py syscall rexit 1 + func_abc.py syscall sigpending 1 + func_abc.py syscall sysi86 1 + func_abc.py syscall write 1 + func_abc.py syscall xstat 1 + linecache.py func ? 1 + os.py func ? 1 + os.py func _Environ 1 + os.py func __init__ 1 + os.py func _get_exports_list 1 + posixpath.py func ? 1 + posixpath.py func basename 1 + posixpath.py func dirname 1 + site.py func ? 1 + site.py func _Helper 1 + site.py func _Printer 1 + site.py func _init_pathinfo 1 + site.py func abs__file__ 1 + site.py func addsitepackages 1 + site.py func aliasmbcs 1 + site.py func execsitecustomize 1 + site.py func main 1 + site.py func removeduppaths 1 + site.py func setcopyright 1 + site.py func setencoding 1 + site.py func sethelper 1 + site.py func setquit 1 + stat.py func ? 1 + types.py func ? 1 + types.py func _C 1 + warnings.py func ? 1 + warnings.py func _OptionError 1 + warnings.py func _processoptions 1 + func_abc.py syscall fcntl 2 + func_abc.py syscall fsat 2 + func_abc.py syscall getcwd 2 + func_abc.py syscall getpid 2 + func_abc.py syscall mprotect 2 + func_abc.py syscall readlink 2 + func_abc.py syscall resolvepath 2 + func_abc.py syscall setcontext 2 + posixpath.py func exists 2 + posixpath.py func split 2 + site.py func addsitedir 2 + warnings.py func simplefilter 2 + copy_reg.py func constructor 3 + copy_reg.py func pickle 3 + func_abc.py syscall munmap 3 + func_abc.py syscall pollsys 3 + site.py func __init__ 3 + site.py func addpackage 3 + func_abc.py syscall getdents64 4 + func_abc.py syscall open 4 + func_abc.py syscall sysconfig 4 + func_abc.py syscall mmap 5 + func_abc.py syscall lwp_exit 6 + stat.py func S_IFMT 6 + stat.py func S_ISDIR 6 + posixpath.py func isdir 8 + os.py func _exists 10 + <string> func ? 11 + posixpath.py func normcase 14 + site.py func makepath 14 + posixpath.py func join 20 + posixpath.py func abspath 22 + posixpath.py func isabs 22 + posixpath.py func normpath 22 + func_abc.py syscall ioctl 28 + func_abc.py syscall llseek 34 + func_abc.py syscall read 36 + func_abc.py syscall close 41 + func_abc.py syscall sigaction 52 + func_abc.py syscall brk 58 + func_abc.py syscall fstat64 74 + func_abc.py syscall stat64 77 + func_abc.py syscall open64 173 + +While tracing there were numerous system calls made, including 173 open64()'s, +and 77 stat64()'s. There were also many functions called, including 22 each +of abspath, isabs, and normpath by the posixpath.py library. + +This script can provide an insight to how an application is interacting +with the system, by providing both application function calls and +system calls in the same output. + diff --git a/cddl/contrib/dtracetoolkit/Examples/py_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_syscolors_example.txt new file mode 100644 index 000000000000..0a6367f9fe6d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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 +[2;32m0 145544 2 ":- syscall -> munmap[0m +[2;32m0 145544 34 ":- syscall <- munmap[0m +[2;32m0 145544 56 ":- syscall -> mmap[0m +[2;32m0 145544 19 ":- syscall <- mmap[0m +[2;32m0 145544 42 ":- syscall -> setcontext[0m +[2;32m0 145544 10 ":- syscall <- setcontext[0m +[2;32m0 145544 9 ":- syscall -> getrlimit[0m +[2;32m0 145544 10 ":- syscall <- getrlimit[0m +[2;32m0 145544 9 ":- syscall -> getpid[0m +[2;32m0 145544 8 ":- syscall <- getpid[0m +[2;32m0 145544 68 ":- syscall -> setcontext[0m +[2;32m0 145544 8 ":- syscall <- setcontext[0m +[2;32m0 145544 121 ":- syscall -> sigpending[0m +[2;32m0 145544 9 ":- syscall <- sigpending[0m +[2;32m0 145544 172 ":- syscall -> open64[0m +[2;32m0 145544 114 ":- syscall <- open64[0m +[2;32m0 145544 14 ":- syscall -> ioctl[0m +[2;32m0 145544 28209 ":- syscall <- ioctl[0m +[2;32m0 145544 285 ":- syscall -> close[0m +[2;32m0 145544 31 ":- syscall <- close[0m +[2;32m0 145544 41 ":- syscall -> open64[0m +[2;32m0 145544 88 ":- syscall <- open64[0m +[2;32m0 145544 9 ":- syscall -> ioctl[0m +[2;32m0 145544 293 ":- syscall <- ioctl[0m +[2;32m0 145544 11 ":- syscall -> close[0m +[2;32m0 145544 13 ":- syscall <- close[0m +[2;32m0 145544 1182 ":- syscall -> sysi86[0m +[2;32m0 145544 12 ":- syscall <- sysi86[0m +[2;32m0 145544 143 ":- syscall -> sysconfig[0m +[2;32m0 145544 53 ":- syscall <- sysconfig[0m +[2;32m0 145544 95 ":- syscall -> open64[0m +[2;32m0 145544 22 ":- syscall <- open64[0m +[2;32m0 145544 11 ":- syscall -> fstat64[0m +[2;32m0 145544 10 ":- syscall <- fstat64[0m +[2;32m0 145544 31 ":- syscall -> ioctl[0m +[2;32m0 145544 42 ":- syscall <- ioctl[0m +[2;32m0 145544 24 ":- syscall -> brk[0m +[2;32m0 145544 10 ":- syscall <- brk[0m +[2;32m0 145544 8 ":- syscall -> brk[0m +[2;32m0 145544 17 ":- syscall <- brk[0m +[2;32m0 145544 30 ":- syscall -> sysconfig[0m +[2;32m0 145544 8 ":- syscall <- sysconfig[0m +[2;32m0 145544 32 ":- syscall -> brk[0m +[2;32m0 145544 7 ":- syscall <- brk[0m +[2;32m0 145544 8 ":- syscall -> brk[0m + +[... 1400 lines truncated ...] + +[2;32m0 145544 8 ":- syscall -> fstat64[0m +[2;32m0 145544 7 ":- syscall <- fstat64[0m +[2;32m0 145544 11 ":- syscall -> read[0m +[2;32m0 145544 8 ":- syscall <- read[0m +[2;32m0 145544 29 ":- syscall -> brk[0m +[2;32m0 145544 8 ":- syscall <- brk[0m +[2;32m0 145544 8 ":- syscall -> brk[0m +[2;32m0 145544 10 ":- syscall <- brk[0m +[2;32m0 145544 393 ":- syscall -> llseek[0m +[2;32m0 145544 8 ":- syscall <- llseek[0m +[2;32m0 145544 9 ":- syscall -> close[0m +[2;32m0 145544 9 ":- syscall <- close[0m +[2;35m0 145544 14 aliases.py:17 func -> ?[0m +[2;35m0 145544 57 aliases.py:18 func <- ?[0m +[2;32m0 145544 20 ":- syscall -> llseek[0m +[2;32m0 145544 8 ":- syscall <- llseek[0m +[2;32m0 145544 8 ":- syscall -> close[0m +[2;32m0 145544 8 ":- syscall <- close[0m +[2;35m0 145544 15 __init__.py:43 func -> CodecRegistryError[0m +[2;35m0 145544 12 __init__.py:45 func <- CodecRegistryError[0m +[2;35m0 145544 26 __init__.py:145 func <- ?[0m +[2;32m0 145544 18 ":- syscall -> llseek[0m +[2;32m0 145544 8 ":- syscall <- llseek[0m +[2;32m0 145544 8 ":- syscall -> close[0m +[2;32m0 145544 9 ":- syscall <- close[0m +[2;35m0 145544 13 __init__.py:69 func -> search_function[0m +[2;35m0 145544 14 __init__.py:47 func -> normalize_encoding[0m +[2;35m0 145544 18 __init__.py:67 func <- normalize_encoding[0m +[2;32m0 145544 29 ":- syscall -> stat64[0m +[2;32m0 145544 20 ":- syscall <- stat64[0m +[2;32m0 145544 10 ":- syscall -> open64[0m +[2;32m0 145544 18 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 17 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 18 ":- syscall <- open64[0m +[2;32m0 145544 9 ":- syscall -> fstat64[0m +[2;32m0 145544 8 ":- syscall <- fstat64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 18 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> fstat64[0m +[2;32m0 145544 8 ":- syscall <- fstat64[0m +[2;32m0 145544 9 ":- syscall -> fstat64[0m +[2;32m0 145544 7 ":- syscall <- fstat64[0m +[2;32m0 145544 8 ":- syscall -> ioctl[0m +[2;32m0 145544 7 ":- syscall <- ioctl[0m +[2;32m0 145544 8 ":- syscall -> read[0m +[2;32m0 145544 19 ":- syscall <- read[0m +[2;32m0 145544 8 ":- syscall -> fstat64[0m +[2;32m0 145544 8 ":- syscall <- fstat64[0m +[2;32m0 145544 8 ":- syscall -> read[0m +[2;32m0 145544 8 ":- syscall <- read[0m +[2;32m0 145544 22 ":- syscall -> llseek[0m +[2;32m0 145544 8 ":- syscall <- llseek[0m +[2;32m0 145544 8 ":- syscall -> close[0m +[2;32m0 145544 9 ":- syscall <- close[0m +[2;35m0 145544 12 ascii.py:8 func -> ?[0m +[2;35m0 145544 16 ascii.py:13 func -> Codec[0m +[2;35m0 145544 12 ascii.py:18 func <- Codec[0m +[2;35m0 145544 22 ascii.py:20 func -> StreamWriter[0m +[2;35m0 145544 11 ascii.py:21 func <- StreamWriter[0m +[2;35m0 145544 20 ascii.py:23 func -> StreamReader[0m +[2;35m0 145544 11 ascii.py:24 func <- StreamReader[0m +[2;35m0 145544 32 ascii.py:26 func -> StreamConverter[0m +[2;35m0 145544 12 ascii.py:29 func <- StreamConverter[0m +[2;35m0 145544 21 ascii.py:33 func <- ?[0m +[2;32m0 145544 17 ":- syscall -> llseek[0m +[2;32m0 145544 8 ":- syscall <- llseek[0m +[2;32m0 145544 8 ":- syscall -> close[0m +[2;32m0 145544 8 ":- syscall <- close[0m +[2;35m0 145544 13 ascii.py:33 func -> getregentry[0m +[2;35m0 145544 12 ascii.py:35 func <- getregentry[0m +[2;35m0 145544 34 __init__.py:142 func <- search_function[0m +[2;32m0 145544 23 ":- syscall -> ioctl[0m +[2;32m0 145544 42 ":- syscall <- ioctl[0m +[2;32m0 145544 11 ":- syscall -> ioctl[0m +[2;32m0 145544 9 ":- syscall <- ioctl[0m +[2;32m0 145544 12 ":- syscall -> readlink[0m +[2;32m0 145544 16 ":- syscall <- readlink[0m +[2;32m0 145544 20 ":- syscall -> resolvepath[0m +[2;32m0 145544 18 ":- syscall <- resolvepath[0m +[2;32m0 145544 12 ":- syscall -> getcwd[0m +[2;32m0 145544 20 ":- syscall <- getcwd[0m +[2;32m0 145544 27 ":- syscall -> ioctl[0m +[2;32m0 145544 8 ":- syscall <- ioctl[0m +[2;32m0 145544 14 ":- syscall -> llseek[0m +[2;32m0 145544 7 ":- syscall <- llseek[0m +[2;32m0 145544 8 ":- syscall -> fstat64[0m +[2;32m0 145544 8 ":- syscall <- fstat64[0m +[2;32m0 145544 8 ":- syscall -> fstat64[0m +[2;32m0 145544 7 ":- syscall <- fstat64[0m +[2;32m0 145544 8 ":- syscall -> ioctl[0m +[2;32m0 145544 7 ":- syscall <- ioctl[0m +[2;32m0 145544 8 ":- syscall -> read[0m +[2;32m0 145544 19 ":- syscall <- read[0m +[2;32m0 145544 9 ":- syscall -> llseek[0m +[2;32m0 145544 7 ":- syscall <- llseek[0m +[2;32m0 145544 8 ":- syscall -> llseek[0m +[2;32m0 145544 7 ":- syscall <- llseek[0m +[2;32m0 145544 12 ":- syscall -> read[0m +[2;32m0 145544 13 ":- syscall <- read[0m +[2;32m0 145544 105 ":- syscall -> read[0m +[2;32m0 145544 9 ":- syscall <- read[0m +[2;32m0 145544 10 ":- syscall -> llseek[0m +[2;32m0 145544 7 ":- syscall <- llseek[0m +[2;32m0 145544 8 ":- syscall -> close[0m +[2;32m0 145544 9 ":- syscall <- close[0m +[2;35m0 145544 117 func_abc.py:3 func -> ?[0m +[2;32m0 145544 20 ":- syscall -> stat64[0m +[2;32m0 145544 15 ":- syscall <- stat64[0m +[2;32m0 145544 10 ":- syscall -> stat64[0m +[2;32m0 145544 13 ":- syscall <- stat64[0m +[2;32m0 145544 10 ":- syscall -> open64[0m +[2;32m0 145544 15 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 13 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 13 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 13 ":- syscall <- open64[0m +[2;32m0 145544 9 ":- syscall -> stat64[0m +[2;32m0 145544 13 ":- syscall <- stat64[0m +[2;32m0 145544 9 ":- syscall -> open64[0m +[2;32m0 145544 13 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 13 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 13 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 13 ":- syscall <- open64[0m +[2;32m0 145544 9 ":- syscall -> stat64[0m +[2;32m0 145544 15 ":- syscall <- stat64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 15 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 15 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 15 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 15 ":- syscall <- open64[0m +[2;32m0 145544 9 ":- syscall -> stat64[0m +[2;32m0 145544 17 ":- syscall <- stat64[0m +[2;32m0 145544 9 ":- syscall -> open64[0m +[2;32m0 145544 17 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 16 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 16 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 16 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> stat64[0m +[2;32m0 145544 17 ":- syscall <- stat64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 17 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 16 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 16 ":- syscall <- open64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 16 ":- syscall <- open64[0m +[2;32m0 145544 9 ":- syscall -> stat64[0m +[2;32m0 145544 17 ":- syscall <- stat64[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 19 ":- syscall <- open64[0m +[2;32m0 145544 14 ":- syscall -> fstat64[0m +[2;32m0 145544 9 ":- syscall <- fstat64[0m +[2;32m0 145544 20 ":- syscall -> xstat[0m +[2;32m0 145544 18 ":- syscall <- xstat[0m +[2;32m0 145544 8 ":- syscall -> resolvepath[0m +[2;32m0 145544 19 ":- syscall <- resolvepath[0m +[2;32m0 145544 10 ":- syscall -> open[0m +[2;32m0 145544 19 ":- syscall <- open[0m +[2;32m0 145544 10 ":- syscall -> mmap[0m +[2;32m0 145544 21 ":- syscall <- mmap[0m +[2;32m0 145544 33 ":- syscall -> mmap[0m +[2;32m0 145544 13 ":- syscall <- mmap[0m +[2;32m0 145544 9 ":- syscall -> mmap[0m +[2;32m0 145544 16 ":- syscall <- mmap[0m +[2;32m0 145544 8 ":- syscall -> mmap[0m +[2;32m0 145544 11 ":- syscall <- mmap[0m +[2;32m0 145544 34 ":- syscall -> munmap[0m +[2;32m0 145544 11 ":- syscall <- munmap[0m +[2;32m0 145544 43 ":- syscall -> memcntl[0m +[2;32m0 145544 13 ":- syscall <- memcntl[0m +[2;32m0 145544 8 ":- syscall -> close[0m +[2;32m0 145544 9 ":- syscall <- close[0m +[2;32m0 145544 30 ":- syscall -> mprotect[0m +[2;32m0 145544 13 ":- syscall <- mprotect[0m +[2;32m0 145544 169 ":- syscall -> mprotect[0m +[2;32m0 145544 13 ":- syscall <- mprotect[0m +[2;32m0 145544 2 ":- syscall <- nosys[0m +[2;32m0 145544 280 ":- syscall -> open[0m +[2;32m0 145544 90 ":- syscall <- open[0m +[2;32m0 145544 154 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 214 ":- syscall -> ioctl[0m +[2;32m0 145544 301 ":- syscall <- ioctl[0m +[2;32m0 145544 186 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 210 ":- syscall -> close[0m +[2;32m0 145544 18 ":- syscall <- close[0m +[2;32m0 145544 146 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 208 ":- syscall -> open[0m +[2;32m0 145544 73 ":- syscall <- open[0m +[2;32m0 145544 151 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 209 ":- syscall -> ioctl[0m +[2;32m0 145544 45 ":- syscall <- ioctl[0m +[2;32m0 145544 171 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 194 ":- syscall -> close[0m +[2;32m0 145544 17 ":- syscall <- close[0m +[2;32m0 145544 145 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 203 ":- syscall -> open[0m +[2;32m0 145544 63 ":- syscall <- open[0m +[2;32m0 145544 150 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 209 ":- syscall -> ioctl[0m +[2;32m0 145544 280 ":- syscall <- ioctl[0m +[2;32m0 145544 185 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 193 ":- syscall -> close[0m +[2;32m0 145544 17 ":- syscall <- close[0m +[2;32m0 145544 145 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 230 ":- syscall -> open[0m +[2;32m0 145544 82 ":- syscall <- open[0m +[2;32m0 145544 151 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 210 ":- syscall -> ioctl[0m +[2;32m0 145544 45 ":- syscall <- ioctl[0m +[2;32m0 145544 171 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 195 ":- syscall -> close[0m +[2;32m0 145544 18 ":- syscall <- close[0m +[2;32m0 145544 145 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 204 ":- syscall -> open[0m +[2;32m0 145544 64 ":- syscall <- open[0m +[2;32m0 145544 149 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 208 ":- syscall -> ioctl[0m +[2;32m0 145544 283 ":- syscall <- ioctl[0m +[2;32m0 145544 184 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 192 ":- syscall -> close[0m +[2;32m0 145544 17 ":- syscall <- close[0m +[2;32m0 145544 146 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 209 ":- syscall -> open[0m +[2;32m0 145544 72 ":- syscall <- open[0m +[2;32m0 145544 150 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 209 ":- syscall -> ioctl[0m +[2;32m0 145544 45 ":- syscall <- ioctl[0m +[2;32m0 145544 171 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 198 ":- syscall -> close[0m +[2;32m0 145544 17 ":- syscall <- close[0m +[2;32m0 145544 860 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 223 ":- syscall -> open[0m +[2;32m0 145544 83 ":- syscall <- open[0m +[2;32m0 145544 151 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 213 ":- syscall -> ioctl[0m +[2;32m0 145544 281 ":- syscall <- ioctl[0m +[2;32m0 145544 187 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 196 ":- syscall -> close[0m +[2;32m0 145544 19 ":- syscall <- close[0m +[2;32m0 145544 145 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 209 ":- syscall -> open[0m +[2;32m0 145544 69 ":- syscall <- open[0m +[2;32m0 145544 151 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 213 ":- syscall -> ioctl[0m +[2;32m0 145544 47 ":- syscall <- ioctl[0m +[2;32m0 145544 173 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 199 ":- syscall -> close[0m +[2;32m0 145544 18 ":- syscall <- close[0m +[2;32m0 145544 144 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 212 ":- syscall -> open[0m +[2;32m0 145544 67 ":- syscall <- open[0m +[2;32m0 145544 149 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 213 ":- syscall -> ioctl[0m +[2;32m0 145544 282 ":- syscall <- ioctl[0m +[2;32m0 145544 187 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 197 ":- syscall -> close[0m +[2;32m0 145544 59 ":- syscall <- close[0m +[2;32m0 145544 637 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 222 ":- syscall -> open[0m +[2;32m0 145544 80 ":- syscall <- open[0m +[2;32m0 145544 151 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 214 ":- syscall -> ioctl[0m +[2;32m0 145544 47 ":- syscall <- ioctl[0m +[2;32m0 145544 172 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 199 ":- syscall -> close[0m +[2;32m0 145544 19 ":- syscall <- close[0m +[2;32m0 145544 144 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 205 ":- syscall -> open[0m +[2;32m0 145544 62 ":- syscall <- open[0m +[2;32m0 145544 150 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 211 ":- syscall -> ioctl[0m +[2;32m0 145544 304 ":- syscall <- ioctl[0m +[2;32m0 145544 190 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 197 ":- syscall -> close[0m +[2;32m0 145544 17 ":- syscall <- close[0m +[2;32m0 145544 145 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 211 ":- syscall -> open[0m +[2;32m0 145544 70 ":- syscall <- open[0m +[2;32m0 145544 149 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 211 ":- syscall -> ioctl[0m +[2;32m0 145544 46 ":- syscall <- ioctl[0m +[2;32m0 145544 172 ":- syscall -> lwp_exit[0m +[2;32m0 145544 2 ":- syscall <- nosys[0m +[2;32m0 145544 260 ":- syscall -> close[0m +[2;32m0 145544 26 ":- syscall <- close[0m +[2;32m0 145544 160 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 207 ":- syscall -> open[0m +[2;32m0 145544 79 ":- syscall <- open[0m +[2;32m0 145544 151 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 216 ":- syscall -> ioctl[0m +[2;32m0 145544 274 ":- syscall <- ioctl[0m +[2;32m0 145544 187 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 195 ":- syscall -> close[0m +[2;32m0 145544 17 ":- syscall <- close[0m +[2;32m0 145544 145 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 211 ":- syscall -> open[0m +[2;32m0 145544 70 ":- syscall <- open[0m +[2;32m0 145544 149 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 214 ":- syscall -> ioctl[0m +[2;32m0 145544 48 ":- syscall <- ioctl[0m +[2;32m0 145544 173 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 201 ":- syscall -> close[0m +[2;32m0 145544 17 ":- syscall <- close[0m +[2;32m0 145544 145 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 211 ":- syscall -> open[0m +[2;32m0 145544 65 ":- syscall <- open[0m +[2;32m0 145544 150 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 213 ":- syscall -> ioctl[0m +[2;32m0 145544 324 ":- syscall <- ioctl[0m +[2;32m0 145544 342 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 203 ":- syscall -> close[0m +[2;32m0 145544 19 ":- syscall <- close[0m +[2;32m0 145544 145 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 213 ":- syscall -> open[0m +[2;32m0 145544 76 ":- syscall <- open[0m +[2;32m0 145544 150 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 214 ":- syscall -> ioctl[0m +[2;32m0 145544 48 ":- syscall <- ioctl[0m +[2;32m0 145544 174 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 198 ":- syscall -> close[0m +[2;32m0 145544 18 ":- syscall <- close[0m +[2;32m0 145544 146 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 206 ":- syscall -> open[0m +[2;32m0 145544 63 ":- syscall <- open[0m +[2;32m0 145544 150 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 213 ":- syscall -> ioctl[0m +[2;32m0 145544 272 ":- syscall <- ioctl[0m +[2;32m0 145544 185 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 194 ":- syscall -> close[0m +[2;32m0 145544 17 ":- syscall <- close[0m +[2;32m0 145544 146 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 213 ":- syscall -> open[0m +[2;32m0 145544 70 ":- syscall <- open[0m +[2;32m0 145544 151 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 214 ":- syscall -> ioctl[0m +[2;32m0 145544 47 ":- syscall <- ioctl[0m +[2;32m0 145544 173 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 236 ":- syscall -> close[0m +[2;32m0 145544 23 ":- syscall <- close[0m +[2;32m0 145544 156 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 210 ":- syscall -> open[0m +[2;32m0 145544 76 ":- syscall <- open[0m +[2;32m0 145544 150 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 214 ":- syscall -> ioctl[0m +[2;32m0 145544 276 ":- syscall <- ioctl[0m +[2;32m0 145544 187 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 197 ":- syscall -> close[0m +[2;32m0 145544 17 ":- syscall <- close[0m +[2;32m0 145544 145 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 211 ":- syscall -> open[0m +[2;32m0 145544 71 ":- syscall <- open[0m +[2;32m0 145544 149 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 214 ":- syscall -> ioctl[0m +[2;32m0 145544 47 ":- syscall <- ioctl[0m +[2;32m0 145544 172 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 199 ":- syscall -> close[0m +[2;32m0 145544 19 ":- syscall <- close[0m +[2;32m0 145544 144 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 210 ":- syscall -> open[0m +[2;32m0 145544 64 ":- syscall <- open[0m +[2;32m0 145544 150 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 212 ":- syscall -> ioctl[0m +[2;32m0 145544 297 ":- syscall <- ioctl[0m +[2;32m0 145544 522 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 210 ":- syscall -> close[0m +[2;32m0 145544 21 ":- syscall <- close[0m +[2;32m0 145544 146 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 213 ":- syscall -> open[0m +[2;32m0 145544 79 ":- syscall <- open[0m +[2;32m0 145544 151 ":- syscall -> lwp_exit[0m +[2;32m0 145544 0 ":- syscall <- nosys[0m +[2;32m0 145544 213 ":- syscall -> ioctl[0m +[2;32m0 145544 47 ":- syscall <- ioctl[0m +[2;32m0 145544 173 ":- syscall -> lwp_exit[0m +[2;32m0 145544 1 ":- syscall <- nosys[0m +[2;32m0 145544 201 ":- syscall -> close[0m +[2;32m0 145544 19 ":- syscall <- close[0m +[2;32m0 145544 144 ":- syscall -> lwp_exit[0m +[2;32m0 145544 91667 ":- syscall -> munmap[0m +[2;32m0 145544 34 ":- syscall <- munmap[0m +[2;32m0 145544 65 ":- syscall -> gtime[0m +[2;32m0 145544 9 ":- syscall <- gtime[0m +[2;32m0 145544 13 ":- syscall -> open[0m +[2;32m0 145544 42 ":- syscall <- open[0m +[2;32m0 145544 10 ":- syscall -> fstat64[0m +[2;32m0 145544 9 ":- syscall <- fstat64[0m +[2;32m0 145544 8 ":- syscall -> read[0m +[2;32m0 145544 31 ":- syscall <- read[0m +[2;32m0 145544 9 ":- syscall -> close[0m +[2;32m0 145544 11 ":- syscall <- close[0m +[2;32m0 145544 65 ":- syscall -> llseek[0m +[2;32m0 145544 9 ":- syscall <- llseek[0m +[2;32m0 145544 8 ":- syscall -> close[0m +[2;32m0 145544 9 ":- syscall <- close[0m +[2;35m0 145544 25 func_abc.py:14 func -> func_a[0m +[2;32m0 145544 24 ":- syscall -> ioctl[0m +[2;32m0 145544 9 ":- syscall <- ioctl[0m +[2;32m0 145544 8 ":- syscall -> fstat64[0m +[2;32m0 145544 8 ":- syscall <- fstat64[0m +[2;32m0 145544 9 ":- syscall -> fstat64[0m +[2;32m0 145544 7 ":- syscall <- fstat64[0m +[2;32m0 145544 40 ":- syscall -> pollsys[0m +[2;32m0 145544 1009424 ":- syscall <- pollsys[0m +[2;35m0 145544 35 func_abc.py:9 func -> func_b[0m +[2;32m0 145544 40 ":- syscall -> pollsys[0m +[2;32m0 145544 1009681 ":- syscall <- pollsys[0m +[2;35m0 145544 36 func_abc.py:5 func -> func_c[0m +[2;32m0 145544 41 ":- syscall -> pollsys[0m +Function A +Function B +Function C +[2;32m0 145544 1000116 ":- syscall <- pollsys[0m +[2;35m0 145544 34 func_abc.py:7 func <- func_c[0m +[2;35m0 145544 28 func_abc.py:12 func <- func_b[0m +[2;35m0 145544 14 func_abc.py:17 func <- func_a[0m +[2;35m0 145544 14 func_abc.py:19 func <- ?[0m +[2;32m0 145544 26 ":- syscall -> sigaction[0m +[2;32m0 145544 15 ":- syscall <- sigaction[0m +[2;32m0 145544 1150 ":- syscall -> write[0m +[2;32m0 145544 21 ":- syscall <- write[0m +[2;32m0 145544 212 ":- syscall -> open64[0m +[2;32m0 145544 116 ":- syscall <- open64[0m +[2;32m0 145544 11 ":- syscall -> ioctl[0m +[2;32m0 145544 24 ":- syscall <- ioctl[0m +[2;32m0 145544 10 ":- syscall -> close[0m +[2;32m0 145544 16 ":- syscall <- close[0m +[2;32m0 145544 8 ":- syscall -> open64[0m +[2;32m0 145544 32 ":- syscall <- open64[0m +[2;32m0 145544 9 ":- syscall -> ioctl[0m +[2;32m0 145544 169 ":- syscall <- ioctl[0m +[2;32m0 145544 10 ":- syscall -> close[0m +[2;32m0 145544 12 ":- syscall <- close[0m +[2;32m0 145544 62 ":- syscall -> rexit[0m + +Here you can see the output showing the path the script follows as it is +executed. + +[2;35m0 145544 35 func_abc.py:9 func -> func_b[0m +[2;32m0 145544 40 ":- syscall -> pollsys[0m +[2;32m0 145544 1009681 ":- syscall <- pollsys[0m +[2;35m0 145544 36 func_abc.py:5 func -> func_c[0m + +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/cddl/contrib/dtracetoolkit/Examples/py_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/py_who_example.txt new file mode 100644 index 000000000000..7d1c3f1c27b0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/py_who_example.txt @@ -0,0 +1,34 @@ +These are examples of the results after running the py_who.d script. + +This script shows which UIDs and PIDs are running Python programs with Python +provider support, and how active they are. It lists the name of the program, +along with the number of lines executed per program as recorded by the line +provider. + +Here it runs as the Code/Python/func_abc.py program is executed. + +# py_who.d +Tracing... Hit Ctrl-C to end. +^C + + PID UID FUNCS FILE + 145442 0 1 /usr/lib/python2.4/encodings/aliases.py + 145442 0 1 /usr/lib/python2.4/linecache.py + 145442 0 2 /usr/lib/python2.4/types.py + 145442 0 4 /usr/lib/python2.4/encodings/__init__.py + 145442 0 4 func_abc.py + 145442 0 5 /usr/lib/python2.4/UserDict.py + 145442 0 5 /usr/lib/python2.4/warnings.py + 145442 0 6 /usr/lib/python2.4/codecs.py + 145442 0 6 /usr/lib/python2.4/encodings/ascii.py + 145442 0 7 /usr/lib/python2.4/copy_reg.py + 145442 0 11 <string> + 145442 0 13 /usr/lib/python2.4/stat.py + 145442 0 14 /usr/lib/python2.4/os.py + 145442 0 36 /usr/lib/python2.4/site.py + 145442 0 115 /usr/lib/python2.4/posixpath.py + +You can see that the program itself had four lines executed attributed to it, +and the other lines in the program were associated with their particular +Python library calls. + diff --git a/cddl/contrib/dtracetoolkit/Examples/rb_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_calldist_example.txt new file mode 100644 index 000000000000..088497c56286 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_calls_example.txt new file mode 100644 index 000000000000..acc0d4d4ef7b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_calltime_example.txt new file mode 100644 index 000000000000..7245fec0e7f8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_cpudist_example.txt new file mode 100644 index 000000000000..718495e394f0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_cputime_example.txt new file mode 100644 index 000000000000..edfa5aa75da2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_flow_example.txt new file mode 100644 index 000000000000..6cfa54ff0084 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_flowinfo_example.txt new file mode 100644 index 000000000000..14fd851fab4a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_flowtime_example.txt new file mode 100644 index 000000000000..27102da8ec35 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_funccalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_funccalls_example.txt new file mode 100644 index 000000000000..27c9c0c071e4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_lines_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_lines_example.txt new file mode 100644 index 000000000000..544b508f6282 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_malloc_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_malloc_example.txt new file mode 100644 index 000000000000..e0917c9af7cc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_objcpu_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_objcpu_example.txt new file mode 100644 index 000000000000..48e8a78abbcb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_objnew_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_objnew_example.txt new file mode 100644 index 000000000000..340ac9a8cf11 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_stat_example.txt new file mode 100644 index 000000000000..706bf95b15cc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_syscalls_example.txt new file mode 100644 index 000000000000..869884b313c3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rb_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_syscolors_example.txt new file mode 100644 index 000000000000..854016e07e9a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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 +[2;32m0 146499 2 ":- syscall -> munmap[0m +[2;32m0 146499 35 ":- syscall <- munmap[0m +[2;32m0 146499 56 ":- syscall -> mmap[0m +[2;32m0 146499 18 ":- syscall <- mmap[0m +[2;32m0 146499 41 ":- syscall -> setcontext[0m +[2;32m0 146499 10 ":- syscall <- setcontext[0m +[2;32m0 146499 10 ":- syscall -> getrlimit[0m +[2;32m0 146499 11 ":- syscall <- getrlimit[0m +[2;32m0 146499 9 ":- syscall -> getpid[0m +[2;32m0 146499 8 ":- syscall <- getpid[0m +[2;32m0 146499 66 ":- syscall -> setcontext[0m +[2;32m0 146499 8 ":- syscall <- setcontext[0m +[2;32m0 146499 1125 ":- syscall -> sysi86[0m +[2;32m0 146499 12 ":- syscall <- sysi86[0m +[2;32m0 146499 86 ":- syscall -> open64[0m +[2;32m0 146499 89 ":- syscall <- open64[0m +[2;32m0 146499 13 ":- syscall -> ioctl[0m +[2;32m0 146499 35 ":- syscall <- ioctl[0m +[2;32m0 146499 15 ":- syscall -> close[0m +[2;32m0 146499 16 ":- syscall <- close[0m +[2;32m0 146499 141 ":- syscall -> getrlimit64[0m +[2;32m0 146499 10 ":- syscall <- getrlimit64[0m +[2;32m0 146499 37 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 17 ":- syscall <- brk[0m +[2;32m0 146499 19 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 11 ":- syscall <- brk[0m +[2;32m0 146499 495 ":- syscall -> brk[0m +[2;32m0 146499 11 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 55 ":- syscall -> sysconfig[0m +[2;32m0 146499 9 ":- syscall <- sysconfig[0m +[2;32m0 146499 109 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 189 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 161 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 144 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 184 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 129 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 174 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 145 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 129 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 134 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 135 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 136 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 98 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 132 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 125 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 189 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 413 ":- syscall -> brk[0m +[2;32m0 146499 11 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 171 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 137 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 188 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 135 ":- syscall -> sigaction[0m +[2;32m0 146499 10 ":- syscall <- sigaction[0m +[2;32m0 146499 10 ":- syscall -> sigaction[0m +[2;32m0 146499 7 ":- syscall <- sigaction[0m +[2;32m0 146499 8 ":- syscall -> sigaction[0m +[2;32m0 146499 7 ":- syscall <- sigaction[0m +[2;32m0 146499 8 ":- syscall -> sigaction[0m +[2;32m0 146499 7 ":- syscall <- sigaction[0m +[2;32m0 146499 8 ":- syscall -> sigaction[0m +[2;32m0 146499 7 ":- syscall <- sigaction[0m +[2;32m0 146499 8 ":- syscall -> sigaction[0m +[2;32m0 146499 8 ":- syscall <- sigaction[0m +[2;32m0 146499 8 ":- syscall -> sigaction[0m +[2;32m0 146499 7 ":- syscall <- sigaction[0m +[2;32m0 146499 9 ":- syscall -> sigaction[0m +[2;32m0 146499 7 ":- syscall <- sigaction[0m +[2;32m0 146499 8 ":- syscall -> sigaction[0m +[2;32m0 146499 7 ":- syscall <- sigaction[0m +[2;32m0 146499 12 ":- syscall -> sigpending[0m +[2;32m0 146499 8 ":- syscall <- sigpending[0m +[2;32m0 146499 15 ":- syscall -> schedctl[0m +[2;32m0 146499 44 ":- syscall <- schedctl[0m +[2;32m0 146499 17 ":- syscall -> lwp_sigmask[0m +[2;32m0 146499 8 ":- syscall <- lwp_sigmask[0m +[2;32m0 146499 9 ":- syscall -> sigaction[0m +[2;32m0 146499 8 ":- syscall <- sigaction[0m +[2;32m0 146499 11 ":- syscall -> lwp_sigmask[0m +[2;32m0 146499 8 ":- syscall <- lwp_sigmask[0m +[2;32m0 146499 9 ":- syscall -> lwp_sigmask[0m +[2;32m0 146499 7 ":- syscall <- lwp_sigmask[0m +[2;32m0 146499 8 ":- syscall -> sigaction[0m +[2;32m0 146499 7 ":- syscall <- sigaction[0m +[2;32m0 146499 8 ":- syscall -> lwp_sigmask[0m +[2;32m0 146499 7 ":- syscall <- lwp_sigmask[0m +[2;32m0 146499 65 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 11 ":- syscall <- brk[0m +[2;32m0 146499 149 ":- syscall -> getuid[0m +[2;32m0 146499 9 ":- syscall <- getuid[0m +[2;32m0 146499 12 ":- syscall -> getgid[0m +[2;32m0 146499 8 ":- syscall <- getgid[0m +[2;32m0 146499 29 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 184 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 171 ":- syscall -> brk[0m +[2;32m0 146499 9 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 10 ":- syscall <- brk[0m +[2;32m0 146499 48 ":- syscall -> getuid[0m +[2;32m0 146499 8 ":- syscall <- getuid[0m +[2;32m0 146499 9 ":- syscall -> getuid[0m +[2;32m0 146499 7 ":- syscall <- getuid[0m +[2;32m0 146499 10 ":- syscall -> getgid[0m +[2;32m0 146499 7 ":- syscall <- getgid[0m +[2;32m0 146499 8 ":- syscall -> getgid[0m +[2;32m0 146499 7 ":- syscall <- getgid[0m +[2;32m0 146499 79 ":- syscall -> open64[0m +[2;32m0 146499 31 ":- syscall <- open64[0m +[2;32m0 146499 14 ":- syscall -> llseek[0m +[2;32m0 146499 9 ":- syscall <- llseek[0m +[2;32m0 146499 9 ":- syscall -> close[0m +[2;32m0 146499 12 ":- syscall <- close[0m +[2;32m0 146499 15 ":- syscall -> open64[0m +[2;32m0 146499 13 ":- syscall <- open64[0m +[2;32m0 146499 21 ":- syscall -> fstat64[0m +[2;32m0 146499 11 ":- syscall <- fstat64[0m +[2;32m0 146499 22 ":- syscall -> read[0m +[2;32m0 146499 36 ":- syscall <- read[0m +[2;32m0 146499 153 ":- syscall -> read[0m +[2;32m0 146499 10 ":- syscall <- read[0m +[2;32m0 146499 11 ":- syscall -> llseek[0m +[2;32m0 146499 8 ":- syscall <- llseek[0m +[2;32m0 146499 8 ":- syscall -> close[0m +[2;32m0 146499 9 ":- syscall <- close[0m +[1;35m0 146499 23 func_abc.rb:3 line -- [0m +[2;35m0 146499 64 func_abc.rb:3 method -> Module::method_added[0m +[2;35m0 146499 24 func_abc.rb:3 method <- Module::method_added[0m +[1;35m0 146499 20 func_abc.rb:8 line -- [0m +[2;35m0 146499 15 func_abc.rb:8 method -> Module::method_added[0m +[2;35m0 146499 13 func_abc.rb:8 method <- Module::method_added[0m +[1;35m0 146499 13 func_abc.rb:14 line -- [0m +[2;35m0 146499 14 func_abc.rb:14 method -> Module::method_added[0m +[2;35m0 146499 13 func_abc.rb:14 method <- Module::method_added[0m +[1;35m0 146499 12 func_abc.rb:20 line -- [0m +[2;35m0 146499 13 func_abc.rb:20 method -> Object::func_a[0m +[1;35m0 146499 12 func_abc.rb:15 line -- [0m +[2;35m0 146499 10 func_abc.rb:15 method -> Object::print[0m +[2;35m0 146499 22 func_abc.rb:15 method -> IO::write[0m +[2;32m0 146499 38 ":- syscall -> ioctl[0m +[2;32m0 146499 11 ":- syscall <- ioctl[0m +[2;32m0 146499 20 ":- syscall -> fstat64[0m +[2;32m0 146499 9 ":- syscall <- fstat64[0m +[2;32m0 146499 9 ":- syscall -> brk[0m +[2;32m0 146499 8 ":- syscall <- brk[0m +[2;32m0 146499 8 ":- syscall -> brk[0m +[2;32m0 146499 11 ":- syscall <- brk[0m +[2;32m0 146499 25 ":- syscall -> fstat64[0m +[2;32m0 146499 8 ":- syscall <- fstat64[0m +[2;35m0 146499 10 func_abc.rb:15 method <- IO::write[0m +[2;35m0 146499 13 func_abc.rb:15 method <- Object::print[0m +[1;35m0 146499 12 func_abc.rb:16 line -- [0m +[2;35m0 146499 10 func_abc.rb:16 method -> Object::sleep[0m +[2;32m0 146499 20 ":- syscall -> gtime[0m +[2;32m0 146499 9 ":- syscall <- gtime[0m +[2;32m0 146499 24 ":- syscall -> pollsys[0m +[2;32m0 146499 1006964 ":- syscall <- pollsys[0m +[2;32m0 146499 26 ":- syscall -> gtime[0m +[2;32m0 146499 14 ":- syscall <- gtime[0m +[2;35m0 146499 18 func_abc.rb:16 method <- Object::sleep[0m +[1;35m0 146499 27 func_abc.rb:17 line -- [0m +[2;35m0 146499 21 func_abc.rb:17 method -> Object::func_b[0m +[1;35m0 146499 19 func_abc.rb:9 line -- [0m +[2;35m0 146499 12 func_abc.rb:9 method -> Object::print[0m +[2;35m0 146499 14 func_abc.rb:9 method -> IO::write[0m +[2;35m0 146499 15 func_abc.rb:9 method <- IO::write[0m +[2;35m0 146499 12 func_abc.rb:9 method <- Object::print[0m +[1;35m0 146499 12 func_abc.rb:10 line -- [0m +[2;35m0 146499 9 func_abc.rb:10 method -> Object::sleep[0m +[2;32m0 146499 12 ":- syscall -> gtime[0m +[2;32m0 146499 8 ":- syscall <- gtime[0m +[2;32m0 146499 11 ":- syscall -> pollsys[0m +[2;32m0 146499 1009739 ":- syscall <- pollsys[0m +[2;32m0 146499 26 ":- syscall -> gtime[0m +[2;32m0 146499 14 ":- syscall <- gtime[0m +[2;35m0 146499 18 func_abc.rb:10 method <- Object::sleep[0m +[1;35m0 146499 27 func_abc.rb:11 line -- [0m +[2;35m0 146499 21 func_abc.rb:11 method -> Object::func_c[0m +[1;35m0 146499 20 func_abc.rb:4 line -- [0m +[2;35m0 146499 12 func_abc.rb:4 method -> Object::print[0m +[2;35m0 146499 14 func_abc.rb:4 method -> IO::write[0m +[2;35m0 146499 15 func_abc.rb:4 method <- IO::write[0m +[2;35m0 146499 12 func_abc.rb:4 method <- Object::print[0m +[1;35m0 146499 12 func_abc.rb:5 line -- [0m +[2;35m0 146499 9 func_abc.rb:5 method -> Object::sleep[0m +[2;32m0 146499 12 ":- syscall -> gtime[0m +[2;32m0 146499 8 ":- syscall <- gtime[0m +[2;32m0 146499 11 ":- syscall -> pollsys[0m +Function A +Function B +Function C +[2;32m0 146499 1009762 ":- syscall <- pollsys[0m +[2;32m0 146499 25 ":- syscall -> gtime[0m +[2;32m0 146499 14 ":- syscall <- gtime[0m +[2;35m0 146499 19 func_abc.rb:5 method <- Object::sleep[0m +[2;35m0 146499 26 func_abc.rb:5 method <- Object::func_c[0m +[2;35m0 146499 13 func_abc.rb:11 method <- Object::func_b[0m +[2;35m0 146499 13 func_abc.rb:17 method <- Object::func_a[0m +[2;32m0 146499 33 ":- syscall -> sigaction[0m +[2;32m0 146499 10 ":- syscall <- sigaction[0m +[2;32m0 146499 100 ":- syscall -> open64[0m +[2;32m0 146499 107 ":- syscall <- open64[0m +[2;32m0 146499 10 ":- syscall -> ioctl[0m +[2;32m0 146499 10 ":- syscall <- ioctl[0m +[2;32m0 146499 11 ":- syscall -> close[0m +[2;32m0 146499 17 ":- syscall <- close[0m +[2;32m0 146499 28 ":- syscall -> write[0m +[2;32m0 146499 20 ":- syscall <- write[0m +[2;32m0 146499 11 ":- syscall -> rexit[0m + +Here you can see the output showing the path the program follows in its +execution. + +ie: +[2;35m0 146499 10 func_abc.rb:16 method -> Object::sleep[0m +[2;32m0 146499 20 ":- syscall -> gtime[0m +[2;32m0 146499 9 ":- syscall <- gtime[0m +[2;32m0 146499 24 ":- syscall -> pollsys[0m +[2;32m0 146499 1006964 ":- syscall <- pollsys[0m +[2;32m0 146499 26 ":- syscall -> gtime[0m +[2;32m0 146499 14 ":- syscall <- gtime[0m +[2;35m0 146499 18 func_abc.rb:16 method <- Object::sleep[0m +[1;35m0 146499 27 func_abc.rb:17 line -- [0m +[2;35m0 146499 21 func_abc.rb:17 method -> Object::func_b[0m +[1;35m0 146499 19 func_abc.rb:9 line -- [0m +[2;35m0 146499 12 func_abc.rb:9 method -> Object::print[0m +[2;35m0 146499 14 func_abc.rb:9 method -> IO::write[0m +[2;35m0 146499 15 func_abc.rb:9 method <- IO::write[0m +[2;35m0 146499 12 func_abc.rb:9 method <- Object::print[0m +[1;35m0 146499 12 func_abc.rb:10 line -- [0m + +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/cddl/contrib/dtracetoolkit/Examples/rb_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/rb_who_example.txt new file mode 100644 index 000000000000..35c0bb70edef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/readbytes_example.txt b/cddl/contrib/dtracetoolkit/Examples/readbytes_example.txt new file mode 100644 index 000000000000..fa2923b1b649 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/readdist_example.txt b/cddl/contrib/dtracetoolkit/Examples/readdist_example.txt new file mode 100644 index 000000000000..42811d8d36ae --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rfileio_example.txt b/cddl/contrib/dtracetoolkit/Examples/rfileio_example.txt new file mode 100644 index 000000000000..dcce81ee4da7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rfsio_example.txt b/cddl/contrib/dtracetoolkit/Examples/rfsio_example.txt new file mode 100644 index 000000000000..858ddf840088 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/runocc_example.txt b/cddl/contrib/dtracetoolkit/Examples/runocc_example.txt new file mode 100644 index 000000000000..53dcb5f96671 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rwbbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwbbypid_example.txt new file mode 100644 index 000000000000..9091adfef859 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rwbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwbypid_example.txt new file mode 100644 index 000000000000..0c8559b45da9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rwbytype_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwbytype_example.txt new file mode 100644 index 000000000000..118cf1657c64 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/rwsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwsnoop_example.txt new file mode 100644 index 000000000000..2ef26ababd94 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/rwsnoop_example.txt @@ -0,0 +1,98 @@ +The following is a demonstration of the rwsnoop program, + + +Here we run it for about a second, + + # rwsnoop + UID PID CMD D BYTES FILE + 100 20334 sshd R 52 <unknown> + 100 20334 sshd W 1 /devices/pseudo/clone@0:ptm + 0 20320 bash W 1 /devices/pseudo/pts@0:12 + 100 20334 sshd R 2 /devices/pseudo/clone@0:ptm + 100 20334 sshd W 52 <unknown> + 0 2848 ls W 58 /devices/pseudo/pts@0:12 + 0 2848 ls W 68 /devices/pseudo/pts@0:12 + 0 2848 ls W 57 /devices/pseudo/pts@0:12 + 0 2848 ls W 67 /devices/pseudo/pts@0:12 + 0 2848 ls W 48 /devices/pseudo/pts@0:12 + 0 2848 ls W 49 /devices/pseudo/pts@0:12 + 0 2848 ls W 33 /devices/pseudo/pts@0:12 + 0 2848 ls W 41 /devices/pseudo/pts@0:12 + 100 20334 sshd R 429 /devices/pseudo/clone@0:ptm + 100 20334 sshd W 468 <unknown> + ^C + +The output scrolls rather fast. Above, we can see an ls command was run, +and we can see as ls writes each line. The "<unknown>" read/writes are +socket activity, which have no corresponding filename. + + +For a summary style output, use the rwtop program. + + + +If a particular program is of interest, the "-n" option can be used +to match on process name. Here we match on "bash" during a login where +the user uses the bash shell as their default, + + # rwsnoop -n bash + UID PID CMD D BYTES FILE + 100 2854 bash R 757 /etc/nsswitch.conf + 100 2854 bash R 0 /etc/nsswitch.conf + 100 2854 bash R 668 /etc/passwd + 100 2854 bash R 980 /etc/profile + 100 2854 bash W 15 /devices/pseudo/pts@0:14 + 100 2854 bash R 10 /export/home/brendan/.bash_profile + 100 2854 bash R 867 /export/home/brendan/.bashrc + 100 2854 bash R 980 /etc/profile + 100 2854 bash W 15 /devices/pseudo/pts@0:14 + 100 2854 bash R 8951 /export/home/brendan/.bash_history + 100 2854 bash R 8951 /export/home/brendan/.bash_history + 100 2854 bash R 1652 /usr/share/lib/terminfo/d/dtterm + 100 2854 bash W 41 /devices/pseudo/pts@0:14 + 100 2854 bash R 1 /devices/pseudo/pts@0:14 + 100 2854 bash W 1 /devices/pseudo/pts@0:14 + 100 2854 bash W 41 /devices/pseudo/pts@0:14 + 100 2854 bash R 1 /devices/pseudo/pts@0:14 + 100 2854 bash W 7 /devices/pseudo/pts@0:14 + +In the above, various bash related files such as ".bash_profile" and +".bash_history" can be seen. The ".bashrc" is also read, as it was sourced +from the .bash_profile. + + + +Extra options with rwsnoop allow us to print zone ID, project ID, timestamps, +etc. Here we use "-v" to see the time printed, and match on "ps" processes, + + # rwsnoop -vn ps + TIMESTR UID PID CMD D BYTES FILE + 2005 Jul 24 04:23:45 0 2804 ps R 168 /proc/2804/auxv + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/2804/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 1495 /etc/ttysrch + 2005 Jul 24 04:23:45 0 2804 ps W 28 /devices/pseudo/pts. + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/0/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/1/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/2/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/3/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/218/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/7/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/9/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/360/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/91/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/112/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/307/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/226/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/242/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/228/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/243/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/234/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/119/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/143/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/361/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/20314/psinfo + 2005 Jul 24 04:23:45 0 2804 ps R 336 /proc/116/psinfo + [...] + + + diff --git a/cddl/contrib/dtracetoolkit/Examples/rwtop_example.txt b/cddl/contrib/dtracetoolkit/Examples/rwtop_example.txt new file mode 100644 index 000000000000..728431243f87 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sampleproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/sampleproc_example.txt new file mode 100644 index 000000000000..d60d44644b7e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sar-c_example.txt b/cddl/contrib/dtracetoolkit/Examples/sar-c_example.txt new file mode 100644 index 000000000000..7669eba5b61f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/seeksize_example.txt b/cddl/contrib/dtracetoolkit/Examples/seeksize_example.txt new file mode 100644 index 000000000000..ba41a87e847e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/setuids_example.txt b/cddl/contrib/dtracetoolkit/Examples/setuids_example.txt new file mode 100644 index 000000000000..be197bf4b566 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_calldist_example.txt new file mode 100644 index 000000000000..6c6a01faedb5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_calls_example.txt new file mode 100644 index 000000000000..064cf977936f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_calltime_example.txt new file mode 100644 index 000000000000..5c39ae404f0d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_cpudist_example.txt new file mode 100644 index 000000000000..272e9093d55f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_cputime_example.txt new file mode 100644 index 000000000000..d3ae5bc50b11 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_flow_example.txt new file mode 100644 index 000000000000..de7f22b88196 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_flowinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_flowinfo_example.txt new file mode 100644 index 000000000000..1fb27cf4ea2d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_flowtime_example.txt new file mode 100644 index 000000000000..03848de62d8e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_lines_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_lines_example.txt new file mode 100644 index 000000000000..f19487cc624b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_pidcolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_pidcolors_example.txt new file mode 100644 index 000000000000..a6025e49078f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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 +[2;32m0 12312 2 func_abc.sh:- syscall -> munmap[0m +[2;32m0 12312 34 func_abc.sh:- syscall <- munmap[0m +[2;32m0 12312 53 func_abc.sh:- syscall -> mmap[0m +[2;32m0 12312 19 func_abc.sh:- syscall <- mmap[0m +[2;32m0 12312 43 func_abc.sh:- syscall -> setcontext[0m +[2;32m0 12312 11 func_abc.sh:- syscall <- setcontext[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> getrlimit[0m +[2;32m0 12312 11 func_abc.sh:- syscall <- getrlimit[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> getpid[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- getpid[0m +[2;32m0 12312 63 func_abc.sh:- syscall -> setcontext[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- setcontext[0m +[2;32m0 12312 813 func_abc.sh:- syscall -> sysi86[0m +[2;32m0 12312 13 func_abc.sh:- syscall <- sysi86[0m +[2;32m0 12312 85 func_abc.sh:- syscall -> open64[0m +[2;32m0 12312 88 func_abc.sh:- syscall <- open64[0m +[2;32m0 12312 13 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 35 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 15 func_abc.sh:- syscall -> close[0m +[2;32m0 12312 17 func_abc.sh:- syscall <- close[0m +[2;32m0 12312 123 func_abc.sh:- syscall -> getpid[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- getpid[0m +[2;32m0 12312 17 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> access[0m +[2;32m0 12312 19 func_abc.sh:- syscall <- access[0m +[2;32m0 12312 14 func_abc.sh:- syscall -> brk[0m +[2;32m0 12312 11 func_abc.sh:- syscall <- brk[0m +[2;32m0 12312 15 func_abc.sh:- syscall -> sysconfig[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sysconfig[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sysconfig[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sysconfig[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> sigaltstack[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaltstack[0m +[2;32m0 12312 16 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 12 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- sigaction[0m +[2;34m0 12312 18 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 18 func_abc.sh:- sh <- endstak[0m +[2;32m0 12312 60 func_abc.sh:- syscall -> brk[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- brk[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;32m0 12312 13 func_abc.sh:- syscall -> getuid[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- getuid[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> getuid[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- getuid[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> getgid[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- getgid[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> getgid[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- getgid[0m +[2;32m0 12312 16 func_abc.sh:- syscall -> open64[0m +[2;32m0 12312 20 func_abc.sh:- syscall <- open64[0m +[2;34m0 12312 11 func_abc.sh:- sh -> exfile[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> close[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- close[0m +[2;32m0 12312 24 func_abc.sh:- syscall -> fcntl[0m +[2;32m0 12312 23 func_abc.sh:- syscall <- fcntl[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> close[0m +[2;32m0 12312 10 func_abc.sh:- syscall <- close[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> fcntl[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- fcntl[0m +[2;32m0 12312 28 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 42 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 14 func_abc.sh:- syscall -> read[0m +[2;32m0 12312 33 func_abc.sh:- syscall <- read[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> brk[0m +[2;32m0 12312 20 func_abc.sh:- syscall <- brk[0m +[2;34m0 12312 13 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 11 func_abc.sh:- sh <- execute[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> brk[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- brk[0m +[2;34m0 12312 10 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 29 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 10 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> brk[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- brk[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 10 func_abc.sh:- sh <- execute[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> brk[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- brk[0m +[2;34m0 12312 10 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> read[0m +[2;32m0 12312 16 func_abc.sh:- syscall <- read[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 25 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 10 func_abc.sh:- sh <- execute[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> brk[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- brk[0m +[2;34m0 12312 10 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh <- execute[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> brk[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- brk[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[1;35m0 12312 9 func_abc.sh:23 line -- [0m +[2;34m0 12312 14 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 18 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 12 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 10 func_abc.sh:- sh <- expand[0m +[2;35m0 12312 14 func_abc.sh:23 func -> func_a[0m +[2;34m0 12312 14 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[1;35m0 12312 8 func_abc.sh:18 line -- [0m +[2;34m0 12312 8 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 8 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;34m0 12312 9 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 8 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;35m0 12312 13 func_abc.sh:18 builtin -> echo[0m +[2;34m0 12312 15 func_abc.sh:- sh -> echo[0m +[2;32m0 12312 14 func_abc.sh:- syscall -> write[0m +[2;32m0 12312 35 func_abc.sh:- syscall <- write[0m +[2;34m0 12312 321 func_abc.sh:- sh <- echo[0m +[2;35m0 12312 13 func_abc.sh:0 builtin <- echo[0m +[2;34m0 12312 17 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[1;35m0 12312 8 func_abc.sh:19 line -- [0m +[2;34m0 12312 8 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;34m0 12312 9 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;34m0 12312 11 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> getuid[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- getuid[0m +[2;32m0 12312 15 func_abc.sh:- syscall -> stat64[0m +[2;32m0 12312 27 func_abc.sh:- syscall <- stat64[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> access[0m +[2;32m0 12312 15 func_abc.sh:- syscall <- access[0m +[2;32m0 12312 18 func_abc.sh:- syscall -> schedctl[0m +[2;32m0 12312 47 func_abc.sh:- syscall <- schedctl[0m +[2;32m0 12312 219 func_abc.sh:- syscall -> fork1[0m +[2;32m0 12312 234375 func_abc.sh:- syscall <- fork1[0m +[2;32m0 12312 277 func_abc.sh:- syscall -> lwp_sigmask[0m +[2;32m0 12312 13 func_abc.sh:- syscall <- lwp_sigmask[0m +[2;35m0 12312 33 func_abc.sh:19 cmd -> sleep[0m +[2;32m0 12312 59 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12312 870257 func_abc.sh:- syscall <- waitsys[0m +[2;32m0 12312 36 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 16 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 13 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 33 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 12 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12312 25 func_abc.sh:- syscall <- waitsys[0m +[2;35m0 12312 15 func_abc.sh:0 cmd <- sleep[0m +[2;34m0 12312 20 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 15 func_abc.sh:- sh -> execute[0m +[1;35m0 12312 14 func_abc.sh:20 line -- [0m +[2;34m0 12312 13 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 11 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 12 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 11 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 10 func_abc.sh:- sh <- expand[0m +[2;35m0 12312 17 func_abc.sh:20 func -> func_b[0m +[2;34m0 12312 14 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[1;35m0 12312 8 func_abc.sh:11 line -- [0m +[2;34m0 12312 8 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;34m0 12312 9 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;35m0 12312 13 func_abc.sh:11 builtin -> echo[0m +[2;34m0 12312 15 func_abc.sh:- sh -> echo[0m +[2;32m0 12312 12 func_abc.sh:- syscall -> write[0m +[2;32m0 12312 32 func_abc.sh:- syscall <- write[0m +[2;34m0 12312 320 func_abc.sh:- sh <- echo[0m +[2;35m0 12312 12 func_abc.sh:0 builtin <- echo[0m +[2;34m0 12312 16 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[1;35m0 12312 8 func_abc.sh:12 line -- [0m +[2;34m0 12312 8 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;34m0 12312 9 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;32m0 12312 225 func_abc.sh:- syscall -> fork1[0m +[2;32m0 12312 60940 func_abc.sh:- syscall <- fork1[0m +[2;32m0 12312 243 func_abc.sh:- syscall -> lwp_sigmask[0m +[2;32m0 12312 15 func_abc.sh:- syscall <- lwp_sigmask[0m +[2;35m0 12312 31 func_abc.sh:12 cmd -> sleep[0m +[2;32m0 12312 31 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12312 1007422 func_abc.sh:- syscall <- waitsys[0m +[2;32m0 12312 28 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 17 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 38 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 12 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12312 26 func_abc.sh:- syscall <- waitsys[0m +[2;35m0 12312 15 func_abc.sh:0 cmd <- sleep[0m +[2;34m0 12312 32 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 15 func_abc.sh:- sh -> execute[0m +[1;35m0 12312 14 func_abc.sh:13 line -- [0m +[2;34m0 12312 13 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 12 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 12 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 10 func_abc.sh:- sh <- expand[0m +[2;35m0 12312 17 func_abc.sh:13 func -> func_c[0m +[2;34m0 12312 13 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[1;35m0 12312 8 func_abc.sh:5 line -- [0m +[2;34m0 12312 8 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;34m0 12312 9 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 10 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;35m0 12312 13 func_abc.sh:5 builtin -> echo[0m +[2;34m0 12312 15 func_abc.sh:- sh -> echo[0m +[2;32m0 12312 12 func_abc.sh:- syscall -> write[0m +[2;32m0 12312 32 func_abc.sh:- syscall <- write[0m +[2;34m0 12312 309 func_abc.sh:- sh <- echo[0m +[2;35m0 12312 12 func_abc.sh:0 builtin <- echo[0m +[2;34m0 12312 16 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m +[1;35m0 12312 9 func_abc.sh:6 line -- [0m +[2;34m0 12312 8 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 22 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 11 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;34m0 12312 9 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 9 func_abc.sh:- sh <- expand[0m +[2;32m0 12312 220 func_abc.sh:- syscall -> fork1[0m +[2;32m0 12312 60982 func_abc.sh:- syscall <- fork1[0m +[2;32m0 12312 239 func_abc.sh:- syscall -> lwp_sigmask[0m +[2;32m0 12312 15 func_abc.sh:- syscall <- lwp_sigmask[0m +[2;35m0 12312 30 func_abc.sh:6 cmd -> sleep[0m +[2;32m0 12312 30 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12312 1007259 func_abc.sh:- syscall <- waitsys[0m +[2;32m0 12312 29 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 17 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 35 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 12 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12312 25 func_abc.sh:- syscall <- waitsys[0m +[2;35m0 12312 15 func_abc.sh:0 cmd <- sleep[0m +[2;34m0 12312 31 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 13 func_abc.sh:- sh <- execute[0m +[2;35m0 12312 11 func_abc.sh:- func <- func_c[0m +[2;34m0 12312 14 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 9 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 9 func_abc.sh:- sh <- execute[0m +[2;35m0 12312 9 func_abc.sh:- func <- func_b[0m +[2;34m0 12312 10 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 18 func_abc.sh:- sh <- execute[0m +[2;34m0 12312 9 func_abc.sh:- sh <- execute[0m +[2;35m0 12312 9 func_abc.sh:- func <- func_a[0m +[2;34m0 12312 9 func_abc.sh:- sh <- execute[0m +[2;32m0 12312 12 func_abc.sh:- syscall -> brk[0m +[2;32m0 12312 11 func_abc.sh:- syscall <- brk[0m +[2;32m0 12312 12 func_abc.sh:- syscall -> read[0m +[2;32m0 12312 16 func_abc.sh:- syscall <- read[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 10 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 8 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> close[0m +[2;32m0 12312 13 func_abc.sh:- syscall <- close[0m +[2;34m0 12312 12 func_abc.sh:- sh -> endjobs[0m +[2;34m0 12312 14 func_abc.sh:- sh <- endjobs[0m +[2;34m0 12312 10 func_abc.sh:- sh <- exfile[0m +[2;34m0 12312 11 func_abc.sh:- sh -> endjobs[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endjobs[0m +[2;32m0 12312 37 func_abc.sh:- syscall -> open64[0m +[2;32m0 12312 103 func_abc.sh:- syscall <- open64[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12312 11 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12312 11 func_abc.sh:- syscall -> close[0m +[2;32m0 12312 15 func_abc.sh:- syscall <- close[0m +[2;32m0 12312 32 func_abc.sh:- syscall -> rexit[0m + +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: + +[1;35m0 12979 14 func_abc.sh:23 line -- [0m +[2;35m0 12979 32 func_abc.sh:23 func -> func_a[0m + +Here we trace many more events that happen in between these two lines, as seen +below: + +[1;35m0 12312 9 func_abc.sh:23 line -- [0m +[2;34m0 12312 14 func_abc.sh:- sh -> estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh <- estabf[0m +[2;34m0 12312 10 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 18 func_abc.sh:- sh -> endstak[0m +[2;34m0 12312 9 func_abc.sh:- sh <- endstak[0m +[2;34m0 12312 12 func_abc.sh:- sh -> expand[0m +[2;34m0 12312 10 func_abc.sh:- sh <- expand[0m +[2;35m0 12312 14 func_abc.sh:23 func -> func_a[0m +[2;34m0 12312 14 func_abc.sh:- sh -> execute[0m +[2;34m0 12312 9 func_abc.sh:- sh -> execute[0m + diff --git a/cddl/contrib/dtracetoolkit/Examples/sh_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_stat_example.txt new file mode 100644 index 000000000000..a44a5638f66a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_syscalls_example.txt new file mode 100644 index 000000000000..fbda09525d30 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_syscolors_example.txt new file mode 100644 index 000000000000..ccc722a825ba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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 +[2;32m0 12979 2 func_abc.sh:- syscall -> munmap[0m +[2;32m0 12979 35 func_abc.sh:- syscall <- munmap[0m +[2;32m0 12979 56 func_abc.sh:- syscall -> mmap[0m +[2;32m0 12979 18 func_abc.sh:- syscall <- mmap[0m +[2;32m0 12979 40 func_abc.sh:- syscall -> setcontext[0m +[2;32m0 12979 11 func_abc.sh:- syscall <- setcontext[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> getrlimit[0m +[2;32m0 12979 11 func_abc.sh:- syscall <- getrlimit[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> getpid[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- getpid[0m +[2;32m0 12979 61 func_abc.sh:- syscall -> setcontext[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- setcontext[0m +[2;32m0 12979 865 func_abc.sh:- syscall -> sysi86[0m +[2;32m0 12979 14 func_abc.sh:- syscall <- sysi86[0m +[2;32m0 12979 84 func_abc.sh:- syscall -> open64[0m +[2;32m0 12979 89 func_abc.sh:- syscall <- open64[0m +[2;32m0 12979 14 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 35 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 15 func_abc.sh:- syscall -> close[0m +[2;32m0 12979 16 func_abc.sh:- syscall <- close[0m +[2;32m0 12979 119 func_abc.sh:- syscall -> getpid[0m +[2;32m0 12979 10 func_abc.sh:- syscall <- getpid[0m +[2;32m0 12979 17 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12979 10 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12979 12 func_abc.sh:- syscall -> access[0m +[2;32m0 12979 20 func_abc.sh:- syscall <- access[0m +[2;32m0 12979 15 func_abc.sh:- syscall -> brk[0m +[2;32m0 12979 11 func_abc.sh:- syscall <- brk[0m +[2;32m0 12979 15 func_abc.sh:- syscall -> sysconfig[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sysconfig[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sysconfig[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sysconfig[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> sigaltstack[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaltstack[0m +[2;32m0 12979 16 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 10 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 12 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> sigaction[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- sigaction[0m +[2;32m0 12979 61 func_abc.sh:- syscall -> brk[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- brk[0m +[2;32m0 12979 13 func_abc.sh:- syscall -> getuid[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- getuid[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> getuid[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- getuid[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> getgid[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- getgid[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> getgid[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- getgid[0m +[2;32m0 12979 15 func_abc.sh:- syscall -> open64[0m +[2;32m0 12979 19 func_abc.sh:- syscall <- open64[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> close[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- close[0m +[2;32m0 12979 24 func_abc.sh:- syscall -> fcntl[0m +[2;32m0 12979 23 func_abc.sh:- syscall <- fcntl[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> close[0m +[2;32m0 12979 10 func_abc.sh:- syscall <- close[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> fcntl[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- fcntl[0m +[2;32m0 12979 28 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 42 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 14 func_abc.sh:- syscall -> read[0m +[2;32m0 12979 33 func_abc.sh:- syscall <- read[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> brk[0m +[2;32m0 12979 21 func_abc.sh:- syscall <- brk[0m +[2;32m0 12979 12 func_abc.sh:- syscall -> brk[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- brk[0m +[2;32m0 12979 19 func_abc.sh:- syscall -> brk[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- brk[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> brk[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- brk[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> read[0m +[2;32m0 12979 15 func_abc.sh:- syscall <- read[0m +[2;32m0 12979 28 func_abc.sh:- syscall -> brk[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- brk[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> brk[0m +[2;32m0 12979 8 func_abc.sh:- syscall <- brk[0m +[1;35m0 12979 14 func_abc.sh:23 line -- [0m +[2;35m0 12979 32 func_abc.sh:23 func -> func_a[0m +[1;35m0 12979 16 func_abc.sh:18 line -- [0m +[2;35m0 12979 18 func_abc.sh:18 builtin -> echo[0m +[2;32m0 12979 21 func_abc.sh:- syscall -> write[0m +[2;32m0 12979 33 func_abc.sh:- syscall <- write[0m +[2;35m0 12979 311 func_abc.sh:0 builtin <- echo[0m +[1;35m0 12979 65 func_abc.sh:19 line -- [0m +[2;32m0 12979 17 func_abc.sh:- syscall -> getuid[0m +[2;32m0 12979 10 func_abc.sh:- syscall <- getuid[0m +[2;32m0 12979 15 func_abc.sh:- syscall -> stat64[0m +[2;32m0 12979 25 func_abc.sh:- syscall <- stat64[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> access[0m +[2;32m0 12979 15 func_abc.sh:- syscall <- access[0m +[2;32m0 12979 18 func_abc.sh:- syscall -> schedctl[0m +[2;32m0 12979 46 func_abc.sh:- syscall <- schedctl[0m +[2;32m0 12979 220 func_abc.sh:- syscall -> fork1[0m +[2;32m0 12979 258957 func_abc.sh:- syscall <- fork1[0m +[2;32m0 12979 244 func_abc.sh:- syscall -> lwp_sigmask[0m +[2;32m0 12979 16 func_abc.sh:- syscall <- lwp_sigmask[0m +[2;35m0 12979 31 func_abc.sh:19 cmd -> sleep[0m +[2;32m0 12979 53 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12979 1008036 func_abc.sh:- syscall <- waitsys[0m +[2;32m0 12979 38 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 18 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 12 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12979 10 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 37 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 12 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12979 26 func_abc.sh:- syscall <- waitsys[0m +[2;35m0 12979 14 func_abc.sh:0 cmd <- sleep[0m +[1;35m0 12979 21 func_abc.sh:20 line -- [0m +[2;35m0 12979 28 func_abc.sh:20 func -> func_b[0m +[1;35m0 12979 15 func_abc.sh:11 line -- [0m +[2;35m0 12979 17 func_abc.sh:11 builtin -> echo[0m +[2;32m0 12979 19 func_abc.sh:- syscall -> write[0m +[2;32m0 12979 33 func_abc.sh:- syscall <- write[0m +[2;35m0 12979 310 func_abc.sh:0 builtin <- echo[0m +[1;35m0 12979 16 func_abc.sh:12 line -- [0m +[2;32m0 12979 226 func_abc.sh:- syscall -> fork1[0m +[2;32m0 12979 64931 func_abc.sh:- syscall <- fork1[0m +[2;32m0 12979 262 func_abc.sh:- syscall -> lwp_sigmask[0m +[2;32m0 12979 16 func_abc.sh:- syscall <- lwp_sigmask[0m +[2;35m0 12979 31 func_abc.sh:12 cmd -> sleep[0m +[2;32m0 12979 31 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12979 1003941 func_abc.sh:- syscall <- waitsys[0m +[2;32m0 12979 30 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 19 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 38 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12979 26 func_abc.sh:- syscall <- waitsys[0m +[2;35m0 12979 14 func_abc.sh:0 cmd <- sleep[0m +[1;35m0 12979 33 func_abc.sh:13 line -- [0m +[2;35m0 12979 27 func_abc.sh:13 func -> func_c[0m +[1;35m0 12979 15 func_abc.sh:5 line -- [0m +[2;35m0 12979 17 func_abc.sh:5 builtin -> echo[0m +[2;32m0 12979 20 func_abc.sh:- syscall -> write[0m +[2;32m0 12979 33 func_abc.sh:- syscall <- write[0m +[2;35m0 12979 309 func_abc.sh:0 builtin <- echo[0m +[1;35m0 12979 17 func_abc.sh:6 line -- [0m +[2;32m0 12979 267 func_abc.sh:- syscall -> fork1[0m +[2;32m0 12979 64649 func_abc.sh:- syscall <- fork1[0m +[2;32m0 12979 257 func_abc.sh:- syscall -> lwp_sigmask[0m +[2;32m0 12979 16 func_abc.sh:- syscall <- lwp_sigmask[0m +[2;35m0 12979 31 func_abc.sh:6 cmd -> sleep[0m +[2;32m0 12979 31 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12979 1004183 func_abc.sh:- syscall <- waitsys[0m +[2;32m0 12979 31 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 18 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> setpgrp[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- setpgrp[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 9 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 38 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 12 func_abc.sh:- syscall -> waitsys[0m +[2;32m0 12979 27 func_abc.sh:- syscall <- waitsys[0m +[2;35m0 12979 14 func_abc.sh:0 cmd <- sleep[0m +[2;35m0 12979 32 func_abc.sh:- func <- func_c[0m +[2;35m0 12979 16 func_abc.sh:- func <- func_b[0m +[2;35m0 12979 10 func_abc.sh:- func <- func_a[0m +[2;32m0 12979 13 func_abc.sh:- syscall -> brk[0m +[2;32m0 12979 12 func_abc.sh:- syscall <- brk[0m +[2;32m0 12979 12 func_abc.sh:- syscall -> read[0m +[2;32m0 12979 16 func_abc.sh:- syscall <- read[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 10 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 9 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> close[0m +[2;32m0 12979 13 func_abc.sh:- syscall <- close[0m +[2;32m0 12979 37 func_abc.sh:- syscall -> open64[0m +[2;32m0 12979 105 func_abc.sh:- syscall <- open64[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> ioctl[0m +[2;32m0 12979 11 func_abc.sh:- syscall <- ioctl[0m +[2;32m0 12979 11 func_abc.sh:- syscall -> close[0m +[2;32m0 12979 15 func_abc.sh:- syscall <- close[0m +[2;32m0 12979 31 func_abc.sh:- syscall -> rexit[0m + +Here you can see the output showing the path the script follows as it is +executed. + +ie: +[1;35m0 12979 14 func_abc.sh:23 line -- [0m +[2;35m0 12979 32 func_abc.sh:23 func -> func_a[0m +[1;35m0 12979 16 func_abc.sh:18 line -- [0m +[2;35m0 12979 18 func_abc.sh:18 builtin -> echo[0m +[2;32m0 12979 21 func_abc.sh:- syscall -> write[0m +[2;32m0 12979 33 func_abc.sh:- syscall <- write[0m +[2;35m0 12979 311 func_abc.sh:0 builtin <- echo[0m +[1;35m0 12979 65 func_abc.sh:19 line -- [0m + +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/cddl/contrib/dtracetoolkit/Examples/sh_wasted_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_wasted_example.txt new file mode 100644 index 000000000000..b11f9523db39 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sh_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/sh_who_example.txt new file mode 100644 index 000000000000..b35e8e4531d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/shellsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/shellsnoop_example.txt new file mode 100644 index 000000000000..be307f80f63e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/shortlived_example.txt b/cddl/contrib/dtracetoolkit/Examples/shortlived_example.txt new file mode 100644 index 000000000000..ebe46925095a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sigdist_example.txt b/cddl/contrib/dtracetoolkit/Examples/sigdist_example.txt new file mode 100644 index 000000000000..88b9df461f32 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/stacksize_example.txt b/cddl/contrib/dtracetoolkit/Examples/stacksize_example.txt new file mode 100644 index 000000000000..156f351d8684 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/statsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/statsnoop_example.txt new file mode 100644 index 000000000000..842017ea4331 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/swapinfo_example.txt b/cddl/contrib/dtracetoolkit/Examples/swapinfo_example.txt new file mode 100644 index 000000000000..e8697660f9c7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/sysbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/sysbypid_example.txt new file mode 100644 index 000000000000..2858c5147c66 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/syscallbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/syscallbypid_example.txt new file mode 100644 index 000000000000..e51bb14cf0fa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/syscallbyproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/syscallbyproc_example.txt new file mode 100644 index 000000000000..7469b79cc88b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/syscallbysysc_example.txt b/cddl/contrib/dtracetoolkit/Examples/syscallbysysc_example.txt new file mode 100644 index 000000000000..d131a176c10a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_calldist_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_calldist_example.txt new file mode 100644 index 000000000000..3388963411e5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_calls_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_calls_example.txt new file mode 100644 index 000000000000..5ffada4957a0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_calltime_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_calltime_example.txt new file mode 100644 index 000000000000..56d100af93ef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_cpudist_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_cpudist_example.txt new file mode 100644 index 000000000000..09126f603abc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_cputime_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_cputime_example.txt new file mode 100644 index 000000000000..c736201e262d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_flow_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_flow_example.txt new file mode 100644 index 000000000000..dd2dcd60c772 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_flowtime_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_flowtime_example.txt new file mode 100644 index 000000000000..8e07238e1303 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_ins_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_ins_example.txt new file mode 100644 index 000000000000..6f1ba9a3d137 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_insflow_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_insflow_example.txt new file mode 100644 index 000000000000..2919f8eb72fd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_proccalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_proccalls_example.txt new file mode 100644 index 000000000000..ed6820dddfb7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_procflow_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_procflow_example.txt new file mode 100644 index 000000000000..93b822ec3eb6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_stat_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_stat_example.txt new file mode 100644 index 000000000000..178fef10b197 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_syscalls_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_syscalls_example.txt new file mode 100644 index 000000000000..5553b1c6a8c4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcl_syscolors_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_syscolors_example.txt new file mode 100644 index 000000000000..b5929867eab9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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 +[2;32m 0 16624 2 syscall -> munmap[0m +[2;32m 0 16624 31 syscall <- munmap[0m +[2;32m 0 16624 52 syscall -> mmap[0m +[2;32m 0 16624 21 syscall <- mmap[0m +[2;32m 0 16624 38 syscall -> setcontext[0m +[2;32m 0 16624 8 syscall <- setcontext[0m +[2;32m 0 16624 8 syscall -> getrlimit[0m +[2;32m 0 16624 9 syscall <- getrlimit[0m +[2;32m 0 16624 8 syscall -> getpid[0m +[2;32m 0 16624 7 syscall <- getpid[0m +[2;32m 0 16624 68 syscall -> setcontext[0m +[2;32m 0 16624 7 syscall <- setcontext[0m +[2;32m 0 16624 177 syscall -> sigpending[0m +[2;32m 0 16624 8 syscall <- sigpending[0m +[2;32m 0 16624 88 syscall -> sysconfig[0m +[2;32m 0 16624 7 syscall <- sysconfig[0m +[2;32m 0 16624 107 syscall -> open64[0m +[2;32m 0 16624 115 syscall <- open64[0m +[2;32m 0 16624 13 syscall -> ioctl[0m +[2;32m 0 16624 64 syscall <- ioctl[0m +[2;32m 0 16624 16 syscall -> close[0m +[2;32m 0 16624 17 syscall <- close[0m +[2;32m 0 16624 1208 syscall -> sysi86[0m +[2;32m 0 16624 9 syscall <- sysi86[0m +[2;32m 0 16624 146 syscall -> llseek[0m +[2;32m 0 16624 10 syscall <- llseek[0m +[2;32m 0 16624 7 syscall -> llseek[0m +[2;32m 0 16624 7 syscall <- llseek[0m +[2;32m 0 16624 7 syscall -> llseek[0m +[2;32m 0 16624 6 syscall <- llseek[0m +[2;32m 0 16624 24 syscall -> sigaction[0m +[2;32m 0 16624 8 syscall <- sigaction[0m +[2;32m 0 16624 63 syscall -> brk[0m +[2;32m 0 16624 9 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 14 syscall <- brk[0m +[2;32m 0 16624 76 syscall -> brk[0m +[2;32m 0 16624 7 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 12 syscall <- brk[0m +[2;32m 0 16624 328 syscall -> resolvepath[0m +[2;32m 0 16624 35 syscall <- resolvepath[0m +[2;32m 0 16624 24 syscall -> access[0m +[2;32m 0 16624 10 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 10 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 11 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 13 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 14 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 16 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 17 syscall <- resolvepath[0m +[2;32m 0 16624 32 syscall -> open64[0m +[2;32m 0 16624 22 syscall <- open64[0m +[2;32m 0 16624 32 syscall -> resolvepath[0m +[2;32m 0 16624 18 syscall <- resolvepath[0m +[2;32m 0 16624 8 syscall -> access[0m +[2;32m 0 16624 8 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 9 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 11 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 12 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 14 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 15 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> open64[0m +[2;32m 0 16624 16 syscall <- open64[0m +[2;32m 0 16624 30 syscall -> resolvepath[0m +[2;32m 0 16624 23 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> open64[0m +[2;32m 0 16624 21 syscall <- open64[0m +[2;32m 0 16624 29 syscall -> resolvepath[0m +[2;32m 0 16624 17 syscall <- resolvepath[0m +[2;32m 0 16624 8 syscall -> access[0m +[2;32m 0 16624 8 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 9 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 11 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 12 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 14 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 15 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> open64[0m +[2;32m 0 16624 15 syscall <- open64[0m +[2;32m 0 16624 30 syscall -> resolvepath[0m +[2;32m 0 16624 20 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> open64[0m +[2;32m 0 16624 20 syscall <- open64[0m +[2;32m 0 16624 29 syscall -> resolvepath[0m +[2;32m 0 16624 16 syscall <- resolvepath[0m +[2;32m 0 16624 8 syscall -> access[0m +[2;32m 0 16624 8 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 10 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 11 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 12 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 14 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> open64[0m +[2;32m 0 16624 14 syscall <- open64[0m +[2;32m 0 16624 28 syscall -> resolvepath[0m +[2;32m 0 16624 20 syscall <- resolvepath[0m +[2;32m 0 16624 8 syscall -> access[0m +[2;32m 0 16624 8 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 9 syscall <- access[0m +[2;32m 0 16624 43 syscall -> access[0m +[2;32m 0 16624 12 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 13 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 13 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> open64[0m +[2;32m 0 16624 14 syscall <- open64[0m +[2;32m 0 16624 10 syscall -> sysconfig[0m +[2;32m 0 16624 7 syscall <- sysconfig[0m +[2;32m 0 16624 33 syscall -> resolvepath[0m +[2;32m 0 16624 19 syscall <- resolvepath[0m +[2;32m 0 16624 8 syscall -> access[0m +[2;32m 0 16624 8 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 9 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 11 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 13 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 14 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 15 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 17 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> open64[0m +[2;32m 0 16624 18 syscall <- open64[0m +[2;32m 0 16624 30 syscall -> resolvepath[0m +[2;32m 0 16624 17 syscall <- resolvepath[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 8 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 9 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 11 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 12 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 14 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 15 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> open64[0m +[2;32m 0 16624 16 syscall <- open64[0m +[2;32m 0 16624 30 syscall -> resolvepath[0m +[2;32m 0 16624 21 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> open64[0m +[2;32m 0 16624 25 syscall <- open64[0m +[2;32m 0 16624 15 syscall -> fcntl[0m +[2;32m 0 16624 7 syscall <- fcntl[0m +[2;32m 0 16624 31 syscall -> ioctl[0m +[2;32m 0 16624 8 syscall <- ioctl[0m +[2;32m 0 16624 49 syscall -> brk[0m +[2;32m 0 16624 8 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 11 syscall <- brk[0m +[2;32m 0 16624 30 syscall -> read[0m +[2;32m 0 16624 35 syscall <- read[0m +[2;32m 0 16624 54 syscall -> read[0m +[2;32m 0 16624 8 syscall <- read[0m +[2;32m 0 16624 21 syscall -> close[0m +[2;32m 0 16624 10 syscall <- close[0m +[2;32m 0 16624 51 syscall -> brk[0m +[2;32m 0 16624 7 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 9 syscall <- brk[0m +[2;32m 0 16624 111 syscall -> brk[0m +[2;32m 0 16624 7 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 8 syscall <- brk[0m +[2;32m 0 16624 94 syscall -> uname[0m +[2;32m 0 16624 8 syscall <- uname[0m +[2;32m 0 16624 47 syscall -> ioctl[0m +[2;32m 0 16624 35 syscall <- ioctl[0m +[2;35m 0 16624 73 cmd -> if[0m +[2;35m 0 16624 89 cmd -> info[0m +[2;35m 0 16624 25 cmd <- info[0m +[2;35m 0 16624 46 cmd -> proc[0m +[2;32m 0 16624 11 syscall -> brk[0m +[2;32m 0 16624 7 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 9 syscall <- brk[0m +[2;35m 0 16624 23 cmd <- proc[0m +[2;35m 0 16624 9 cmd <- if[0m +[2;35m 0 16624 18 cmd -> tclInit[0m +[2;35m 0 16624 223 proc -> tclInit[0m +[2;35m 0 16624 12 cmd -> global[0m +[2;35m 0 16624 12 cmd <- global[0m +[2;35m 0 16624 9 cmd -> global[0m +[2;35m 0 16624 9 cmd <- global[0m +[2;35m 0 16624 8 cmd -> rename[0m +[2;35m 0 16624 24 cmd <- rename[0m +[2;35m 0 16624 13 cmd -> info[0m +[2;35m 0 16624 12 cmd <- info[0m +[2;35m 0 16624 13 cmd -> info[0m +[2;35m 0 16624 19 cmd <- info[0m +[2;35m 0 16624 11 cmd -> unset[0m +[2;35m 0 16624 13 cmd <- unset[0m +[2;35m 0 16624 9 cmd -> concat[0m +[2;35m 0 16624 15 cmd <- concat[0m +[2;35m 0 16624 18 cmd -> file[0m +[2;35m 0 16624 20 cmd <- file[0m +[2;35m 0 16624 8 cmd -> file[0m +[2;32m 0 16624 25 syscall -> resolvepath[0m +[2;32m 0 16624 24 syscall <- resolvepath[0m +[2;32m 0 16624 9 syscall -> access[0m +[2;32m 0 16624 8 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 9 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 11 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 12 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 14 syscall <- resolvepath[0m +[2;32m 0 16624 12 syscall -> access[0m +[2;32m 0 16624 13 syscall <- access[0m +[2;35m 0 16624 9 cmd <- file[0m +[2;35m 0 16624 10 cmd -> file[0m +[2;35m 0 16624 12 cmd <- file[0m +[2;35m 0 16624 9 cmd -> file[0m +[2;32m 0 16624 24 syscall -> resolvepath[0m +[2;32m 0 16624 23 syscall <- resolvepath[0m +[2;32m 0 16624 8 syscall -> access[0m +[2;32m 0 16624 8 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 9 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 11 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 13 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 14 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 16 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 17 syscall <- resolvepath[0m +[2;32m 0 16624 12 syscall -> access[0m +[2;32m 0 16624 16 syscall <- access[0m +[2;35m 0 16624 29 cmd <- file[0m +[2;35m 0 16624 10 cmd -> file[0m +[2;35m 0 16624 12 cmd <- file[0m +[2;35m 0 16624 9 cmd -> file[0m +[2;32m 0 16624 23 syscall -> resolvepath[0m +[2;32m 0 16624 20 syscall <- resolvepath[0m +[2;32m 0 16624 8 syscall -> access[0m +[2;32m 0 16624 9 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 10 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 11 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 13 syscall <- access[0m +[2;32m 0 16624 7 syscall -> access[0m +[2;32m 0 16624 14 syscall <- access[0m +[2;32m 0 16624 7 syscall -> resolvepath[0m +[2;32m 0 16624 15 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> access[0m +[2;32m 0 16624 14 syscall <- access[0m +[2;35m 0 16624 7 cmd <- file[0m +[2;35m 0 16624 9 cmd -> file[0m +[2;35m 0 16624 12 cmd <- file[0m +[2;35m 0 16624 9 cmd -> file[0m +[2;32m 0 16624 23 syscall -> resolvepath[0m +[2;32m 0 16624 20 syscall <- resolvepath[0m +[2;32m 0 16624 11 syscall -> access[0m +[2;32m 0 16624 19 syscall <- access[0m +[2;35m 0 16624 7 cmd <- file[0m +[2;35m 0 16624 10 cmd -> uplevel[0m +[2;35m 0 16624 13 cmd -> source[0m +[2;32m 0 16624 14 syscall -> stat64[0m +[2;32m 0 16624 23 syscall <- stat64[0m +[2;32m 0 16624 10 syscall -> open64[0m +[2;32m 0 16624 23 syscall <- open64[0m +[2;32m 0 16624 8 syscall -> fcntl[0m +[2;32m 0 16624 7 syscall <- fcntl[0m +[2;32m 0 16624 8 syscall -> ioctl[0m +[2;32m 0 16624 7 syscall <- ioctl[0m +[2;32m 0 16624 26 syscall -> read[0m +[2;32m 0 16624 29 syscall <- read[0m +[2;32m 0 16624 8 syscall -> brk[0m +[2;32m 0 16624 7 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 9 syscall <- brk[0m +[2;32m 0 16624 57 syscall -> read[0m +[2;32m 0 16624 15 syscall <- read[0m +[2;32m 0 16624 55 syscall -> read[0m +[2;32m 0 16624 14 syscall <- read[0m +[2;32m 0 16624 8 syscall -> brk[0m +[2;32m 0 16624 6 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 6 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 8 syscall <- brk[0m +[2;32m 0 16624 63 syscall -> read[0m +[2;32m 0 16624 14 syscall <- read[0m +[2;32m 0 16624 45 syscall -> read[0m +[2;32m 0 16624 13 syscall <- read[0m +[2;32m 0 16624 8 syscall -> brk[0m +[2;32m 0 16624 6 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 6 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 8 syscall <- brk[0m +[2;32m 0 16624 63 syscall -> read[0m +[2;32m 0 16624 14 syscall <- read[0m +[2;32m 0 16624 29 syscall -> read[0m +[2;32m 0 16624 7 syscall <- read[0m +[2;32m 0 16624 10 syscall -> close[0m +[2;32m 0 16624 10 syscall <- close[0m +[2;35m 0 16624 18 cmd -> if[0m +[2;35m 0 16624 19 cmd -> info[0m +[2;35m 0 16624 10 cmd <- info[0m +[2;35m 0 16624 12 cmd <- if[0m +[2;35m 0 16624 14 cmd -> package[0m +[2;35m 0 16624 12 cmd <- package[0m +[2;35m 0 16624 15 cmd -> if[0m +[2;35m 0 16624 12 cmd -> info[0m +[2;35m 0 16624 9 cmd <- info[0m +[2;35m 0 16624 26 cmd -> info[0m +[2;35m 0 16624 16 cmd <- info[0m +[2;35m 0 16624 10 cmd <- if[0m +[2;35m 0 16624 21 cmd -> namespace[0m +[2;35m 0 16624 87 cmd -> variable[0m +[2;35m 0 16624 10 cmd <- variable[0m +[2;35m 0 16624 9 cmd -> info[0m +[2;35m 0 16624 13 cmd <- info[0m +[2;35m 0 16624 9 cmd -> info[0m +[2;35m 0 16624 8 cmd <- info[0m +[2;35m 0 16624 8 cmd -> info[0m +[2;35m 0 16624 8 cmd <- info[0m +[2;35m 0 16624 9 cmd -> file[0m +[2;35m 0 16624 21 cmd <- file[0m +[2;35m 0 16624 9 cmd -> list[0m +[2;35m 0 16624 17 cmd <- list[0m +[2;35m 0 16624 8 cmd -> foreach[0m +[2;35m 0 16624 27 cmd -> lsearch[0m +[2;35m 0 16624 10 cmd <- lsearch[0m +[2;35m 0 16624 10 cmd -> lappend[0m +[2;35m 0 16624 9 cmd <- lappend[0m +[2;35m 0 16624 11 cmd -> lsearch[0m +[2;35m 0 16624 8 cmd <- lsearch[0m +[2;35m 0 16624 8 cmd -> lappend[0m +[2;35m 0 16624 8 cmd <- lappend[0m +[2;35m 0 16624 8 cmd <- foreach[0m +[2;35m 0 16624 8 cmd -> info[0m +[2;35m 0 16624 10 cmd <- info[0m +[2;35m 0 16624 8 cmd -> file[0m +[2;32m 0 16624 15 syscall -> brk[0m +[2;32m 0 16624 7 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 9 syscall <- brk[0m +[2;35m 0 16624 24 cmd <- file[0m +[2;35m 0 16624 9 cmd -> file[0m +[2;35m 0 16624 19 cmd <- file[0m +[2;35m 0 16624 9 cmd -> file[0m +[2;35m 0 16624 11 cmd <- file[0m +[2;35m 0 16624 10 cmd -> lsearch[0m +[2;35m 0 16624 8 cmd <- lsearch[0m +[2;35m 0 16624 9 cmd -> lappend[0m +[2;35m 0 16624 8 cmd <- lappend[0m +[2;35m 0 16624 8 cmd -> info[0m +[2;35m 0 16624 8 cmd <- info[0m +[2;35m 0 16624 9 cmd -> foreach[0m +[2;35m 0 16624 12 cmd -> lsearch[0m +[2;35m 0 16624 8 cmd <- lsearch[0m +[2;35m 0 16624 8 cmd -> lappend[0m +[2;35m 0 16624 8 cmd <- lappend[0m +[2;35m 0 16624 8 cmd <- foreach[0m +[2;35m 0 16624 8 cmd <- namespace[0m +[2;35m 0 16624 30 cmd -> if[0m +[2;35m 0 16624 22 cmd -> interp[0m +[2;35m 0 16624 17 cmd <- interp[0m +[2;35m 0 16624 11 cmd <- if[0m +[2;35m 0 16624 15 cmd -> package[0m +[2;35m 0 16624 8 cmd <- package[0m +[2;35m 0 16624 13 cmd -> if[0m +[2;35m 0 16624 12 cmd -> interp[0m +[2;35m 0 16624 8 cmd <- interp[0m +[2;35m 0 16624 44 cmd <- if[0m +[2;35m 0 16624 21 cmd -> if[0m +[2;35m 0 16624 15 cmd -> namespace[0m +[2;35m 0 16624 10 cmd <- namespace[0m +[2;35m 0 16624 9 cmd <- if[0m +[2;35m 0 16624 13 cmd -> set[0m +[2;35m 0 16624 9 cmd <- set[0m +[2;35m 0 16624 10 cmd -> set[0m +[2;35m 0 16624 8 cmd <- set[0m +[2;35m 0 16624 12 cmd -> if[0m +[2;35m 0 16624 14 cmd -> namespace[0m +[2;35m 0 16624 8 cmd <- namespace[0m +[2;35m 0 16624 13 cmd -> proc[0m +[2;35m 0 16624 12 cmd <- proc[0m +[2;35m 0 16624 8 cmd <- if[0m +[2;35m 0 16624 69 cmd -> proc[0m +[2;35m 0 16624 11 cmd <- proc[0m +[2;35m 0 16624 20 cmd -> proc[0m +[2;35m 0 16624 12 cmd <- proc[0m +[2;32m 0 16624 22 syscall -> brk[0m +[2;32m 0 16624 7 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 6 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 9 syscall <- brk[0m +[2;35m 0 16624 18 cmd -> proc[0m +[2;35m 0 16624 10 cmd <- proc[0m +[2;35m 0 16624 21 cmd -> proc[0m +[2;35m 0 16624 11 cmd <- proc[0m +[2;35m 0 16624 16 cmd -> proc[0m +[2;35m 0 16624 10 cmd <- proc[0m +[2;35m 0 16624 42 cmd -> if[0m +[2;35m 0 16624 25 cmd -> proc[0m +[2;32m 0 16624 9 syscall -> brk[0m +[2;32m 0 16624 6 syscall <- brk[0m +[2;32m 0 16624 7 syscall -> brk[0m +[2;32m 0 16624 9 syscall <- brk[0m +[2;35m 0 16624 21 cmd <- proc[0m +[2;35m 0 16624 9 cmd <- if[0m +[2;35m 0 16624 41 cmd -> proc[0m +[2;35m 0 16624 13 cmd <- proc[0m +[2;35m 0 16624 9 cmd <- source[0m +[2;35m 0 16624 8 cmd <- uplevel[0m +[2;35m 0 16624 10 proc <- tclInit[0m +[2;35m 0 16624 17 cmd <- tclInit[0m +[2;32m 0 16624 35 syscall -> resolvepath[0m +[2;32m 0 16624 31 syscall <- resolvepath[0m +[2;32m 0 16624 13 syscall -> stat64[0m +[2;32m 0 16624 24 syscall <- stat64[0m +[2;32m 0 16624 9 syscall -> open64[0m +[2;32m 0 16624 23 syscall <- open64[0m +[2;32m 0 16624 8 syscall -> fcntl[0m +[2;32m 0 16624 7 syscall <- fcntl[0m +[2;32m 0 16624 9 syscall -> ioctl[0m +[2;32m 0 16624 7 syscall <- ioctl[0m +[2;32m 0 16624 12 syscall -> read[0m +[2;32m 0 16624 21 syscall <- read[0m +[2;32m 0 16624 10 syscall -> read[0m +[2;32m 0 16624 7 syscall <- read[0m +[2;32m 0 16624 9 syscall -> close[0m +[2;32m 0 16624 8 syscall <- close[0m +[2;35m 0 16624 12 cmd -> proc[0m +[2;35m 0 16624 11 cmd <- proc[0m +[2;35m 0 16624 11 cmd -> proc[0m +[2;35m 0 16624 9 cmd <- proc[0m +[2;35m 0 16624 11 cmd -> proc[0m +[2;35m 0 16624 9 cmd <- proc[0m +[2;35m 0 16624 9 cmd -> func_a[0m +[2;35m 0 16624 17 proc -> func_a[0m +[2;35m 0 16624 10 cmd -> puts[0m +[2;32m 0 16624 25 syscall -> llseek[0m +[2;32m 0 16624 9 syscall <- llseek[0m +[2;32m 0 16624 9 syscall -> ioctl[0m +[2;32m 0 16624 6 syscall <- ioctl[0m +[2;32m 0 16624 13 syscall -> getsockname[0m +[2;32m 0 16624 8 syscall <- getsockname[0m +[2;32m 0 16624 18 syscall -> llseek[0m +[2;32m 0 16624 8 syscall <- llseek[0m +[2;32m 0 16624 7 syscall -> ioctl[0m +[2;32m 0 16624 86 syscall <- ioctl[0m +[2;32m 0 16624 184 syscall -> ioctl[0m +[2;32m 0 16624 17 syscall <- ioctl[0m +[2;32m 0 16624 14 syscall -> llseek[0m +[2;32m 0 16624 7 syscall <- llseek[0m +[2;32m 0 16624 7 syscall -> ioctl[0m +[2;32m 0 16624 13 syscall <- ioctl[0m +[2;32m 0 16624 8 syscall -> ioctl[0m +[2;32m 0 16624 12 syscall <- ioctl[0m +[2;32m 0 16624 24 syscall -> write[0m +[2;32m 0 16624 108 syscall <- write[0m +[2;35m 0 16624 10 cmd <- puts[0m +[2;35m 0 16624 11 cmd -> after[0m +[2;32m 0 16624 23 syscall -> pollsys[0m +Function B +[2;32m 0 16624 1009593 syscall <- pollsys[0m +[2;35m 0 16624 24 cmd <- after[0m +[2;35m 0 16624 23 cmd -> func_b[0m +[2;35m 0 16624 37 proc -> func_b[0m +[2;35m 0 16624 12 cmd -> puts[0m +[2;32m 0 16624 17 syscall -> write[0m +[2;32m 0 16624 74 syscall <- write[0m +[2;35m 0 16624 8 cmd <- puts[0m +[2;35m 0 16624 9 cmd -> after[0m +[2;32m 0 16624 10 syscall -> pollsys[0m +Function C +[2;32m 0 16624 1009748 syscall <- pollsys[0m +[2;35m 0 16624 24 cmd <- after[0m +[2;35m 0 16624 23 cmd -> func_c[0m +[2;35m 0 16624 35 proc -> func_c[0m +[2;35m 0 16624 12 cmd -> puts[0m +[2;32m 0 16624 17 syscall -> write[0m +[2;32m 0 16624 75 syscall <- write[0m +[2;35m 0 16624 8 cmd <- puts[0m +[2;35m 0 16624 9 cmd -> after[0m +[2;32m 0 16624 10 syscall -> pollsys[0m +[2;32m 0 16624 1009831 syscall <- pollsys[0m +[2;35m 0 16624 24 cmd <- after[0m +[2;35m 0 16624 23 proc <- func_c[0m +[2;35m 0 16624 13 cmd <- func_c[0m +[2;35m 0 16624 9 proc <- func_b[0m +[2;35m 0 16624 8 cmd <- func_b[0m +[2;35m 0 16624 8 proc <- func_a[0m +[2;35m 0 16624 8 cmd <- func_a[0m +[2;35m 0 16624 30 cmd -> exit[0m +[2;32m 0 16624 41 syscall -> fcntl[0m +[2;32m 0 16624 11 syscall <- fcntl[0m +[2;32m 0 16624 7 syscall -> fcntl[0m +[2;32m 0 16624 7 syscall <- fcntl[0m +[2;32m 0 16624 7 syscall -> fcntl[0m +[2;32m 0 16624 6 syscall <- fcntl[0m +[2;32m 0 16624 11 syscall -> fcntl[0m +[2;32m 0 16624 6 syscall <- fcntl[0m +[2;32m 0 16624 7 syscall -> fcntl[0m +[2;32m 0 16624 6 syscall <- fcntl[0m +[2;32m 0 16624 7 syscall -> fcntl[0m +[2;32m 0 16624 6 syscall <- fcntl[0m +[2;32m 0 16624 9 syscall -> fcntl[0m +[2;32m 0 16624 7 syscall <- fcntl[0m +[2;32m 0 16624 7 syscall -> fcntl[0m +[2;32m 0 16624 6 syscall <- fcntl[0m +[2;32m 0 16624 7 syscall -> fcntl[0m +[2;32m 0 16624 6 syscall <- fcntl[0m +[2;32m 0 16624 81 syscall -> open64[0m +[2;32m 0 16624 119 syscall <- open64[0m +[2;32m 0 16624 8 syscall -> ioctl[0m +[2;32m 0 16624 8 syscall <- ioctl[0m +[2;32m 0 16624 10 syscall -> close[0m +[2;32m 0 16624 16 syscall <- close[0m +[2;32m 0 16624 68 syscall -> rexit[0m + diff --git a/cddl/contrib/dtracetoolkit/Examples/tcl_who_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcl_who_example.txt new file mode 100644 index 000000000000..d1eefa3a9c85 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_d_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_d_example.txt new file mode 100644 index 000000000000..a0a8cc85d379 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_example.txt new file mode 100644 index 000000000000..1124175d2d16 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_d_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_d_example.txt new file mode 120000 index 000000000000..d53301a9cc66 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_d_example.txt @@ -0,0 +1 @@ +tcpsnoop_d_example.txt
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_example.txt new file mode 120000 index 000000000000..794263cb8c1e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcpsnoop_snv_example.txt @@ -0,0 +1 @@ +tcpsnoop_example.txt
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Examples/tcpstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpstat_example.txt new file mode 100644 index 000000000000..d7d8cb379d98 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcptop_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcptop_example.txt new file mode 100644 index 000000000000..c90fc753d883 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/tcptop_snv_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcptop_snv_example.txt new file mode 120000 index 000000000000..f2a169ee6b50 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Examples/tcptop_snv_example.txt @@ -0,0 +1 @@ +tcptop_example.txt
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Examples/tcpwdist_example.txt b/cddl/contrib/dtracetoolkit/Examples/tcpwdist_example.txt new file mode 100644 index 000000000000..02a392ce55a1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/threaded_example.txt b/cddl/contrib/dtracetoolkit/Examples/threaded_example.txt new file mode 100644 index 000000000000..1e41a0ef2ed9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/topsyscall_example.txt b/cddl/contrib/dtracetoolkit/Examples/topsyscall_example.txt new file mode 100644 index 000000000000..dda1aa03e515 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/topsysproc_example.txt b/cddl/contrib/dtracetoolkit/Examples/topsysproc_example.txt new file mode 100644 index 000000000000..368ea314c079 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/udpstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/udpstat_example.txt new file mode 100644 index 000000000000..4ffa3bafeacb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/uname-a_example.txt b/cddl/contrib/dtracetoolkit/Examples/uname-a_example.txt new file mode 100644 index 000000000000..281033dc8721 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/vmbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/vmbypid_example.txt new file mode 100644 index 000000000000..9e09b836a4c5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/vmstat-p_example.txt b/cddl/contrib/dtracetoolkit/Examples/vmstat-p_example.txt new file mode 100644 index 000000000000..1a0fe14b7750 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/vmstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/vmstat_example.txt new file mode 100644 index 000000000000..7d953fd9b672 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/vopstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/vopstat_example.txt new file mode 100644 index 000000000000..646419efada9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/weblatency_example.txt b/cddl/contrib/dtracetoolkit/Examples/weblatency_example.txt new file mode 100644 index 000000000000..995b545a366a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/whatexec_example.txt b/cddl/contrib/dtracetoolkit/Examples/whatexec_example.txt new file mode 100644 index 000000000000..519909ec789d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/woof_example.txt b/cddl/contrib/dtracetoolkit/Examples/woof_example.txt new file mode 100644 index 000000000000..dc8152728114 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/wpm_example.txt b/cddl/contrib/dtracetoolkit/Examples/wpm_example.txt new file mode 100644 index 000000000000..bfc74a90ff34 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/writebytes_example.txt b/cddl/contrib/dtracetoolkit/Examples/writebytes_example.txt new file mode 100644 index 000000000000..baa83fc971f5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/writedist_example.txt b/cddl/contrib/dtracetoolkit/Examples/writedist_example.txt new file mode 100644 index 000000000000..f334843e2c10 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/xcallsbypid_example.txt b/cddl/contrib/dtracetoolkit/Examples/xcallsbypid_example.txt new file mode 100644 index 000000000000..1593b62de627 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/xvmstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/xvmstat_example.txt new file mode 100644 index 000000000000..544bd985e8bd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Examples/zvmstat_example.txt b/cddl/contrib/dtracetoolkit/Examples/zvmstat_example.txt new file mode 100644 index 000000000000..cb070c5d3e58 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/FS/Readme b/cddl/contrib/dtracetoolkit/FS/Readme new file mode 100644 index 000000000000..30927a5e2db6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/FS/Readme @@ -0,0 +1,3 @@ +FS - File System based analysis + + This would include VFS and UFS activity. diff --git a/cddl/contrib/dtracetoolkit/FS/fspaging.d b/cddl/contrib/dtracetoolkit/FS/fspaging.d new file mode 100755 index 000000000000..4eaa718a5174 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/FS/fspaging.d @@ -0,0 +1,154 @@ +#!/usr/sbin/dtrace -s +/* + * fspaging.d - file system read/write and paging tracing. + * Written using DTrace (Solaris 10 3/05) + * + * This traces file related activity: system call reads and writes, + * vnode logical read and writes (fop), vnode putpage and getpage activity, + * and disk I/O. It can be used to examine the behaviour of each I/O + * layer, from the syscall interface to what the disk is doing. Behaviour + * such as read-ahead, and max I/O size breakup can be observed. + * + * This is a verbose version of fsrw.d, as this also traces paging activity. + * + * $Id: fspaging.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: fspaging.d + * + * FIELDS: + * Event Traced event (see EVENTS below) + * Device Device, for disk I/O + * RW Either Read or Write + * Size Size of I/O in bytes, if known + * Offset Offset of I/O in kilobytes, if known + * Path Path to file on disk + * + * EVENTS: + * sc-read System call read + * sc-write System call write + * fop_read Logical read + * fop_write Logical write + * fop_getpage Logical get page + * fop_putpage Logical put page + * disk_io Physical disk I/O + * disk_ra Physical disk I/O, read ahead + * + * The events are drawn with a level of indentation, which can sometimes + * help identify related events. + * + * SEE ALSO: fsrw.d + * + * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * ToDo: readv() + * + * 20-Mar-2006 Brendan Gregg Created this. + * 23-Apr-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option switchrate=10hz + +dtrace:::BEGIN +{ + printf("%-13s %10s %2s %8s %6s %s\n", + "Event", "Device", "RW", "Size", "Offset", "Path"); +} + +syscall::*read:entry, +syscall::*write*:entry +{ + /* + * starting with a file descriptior, dig out useful info + * from the corresponding file_t and vnode_t. + */ + this->filistp = curthread->t_procp->p_user.u_finfo.fi_list; + this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp + + (uint64_t)arg0 * (uint64_t)sizeof (uf_entry_t)); + this->filep = this->ufentryp->uf_file; + self->offset = this->filep->f_offset; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>"; + self->sc_trace = this->vnodep ? this->vnodep->v_type == 1 || + this->vnodep->v_type == 2 ? 1 : 0 : 0; +} + +syscall::*read:entry +/self->sc_trace/ +{ + printf("sc-%-10s %10s %2s %8d %6d %s\n", probefunc, ".", "R", + (int)arg2, self->offset / 1024, self->vpath); +} + +syscall::*write*:entry +/self->sc_trace/ +{ + printf("sc-%-10s %10s %2s %8d %6d %s\n", probefunc, ".", "W", + (int)arg2, self->offset / 1024, self->vpath); +} + +syscall::*read:return, +syscall::*write*:return +{ + self->vpath = 0; + self->offset = 0; + self->sc_trace = 0; +} + +fbt::fop_putpage:entry, +fbt::fop_getpage:entry +/self->sc_trace && args[0]->v_path/ +{ + printf(" %-11s %10s %2s %8d %6d %s\n", probefunc, ".", + probefunc == "fop_getpage" ? "R" : "W", (uint64_t)arg2, + args[1] / 1024, cleanpath(args[0]->v_path)); +} + + +fbt::fop_read:entry, +fbt::fop_write:entry +/self->sc_trace && args[0]->v_path/ +{ + printf(" %-11s %10s %2s %8d %6d %s\n", probefunc, ".", + probefunc == "fop_read" ? "R" : "W", args[1]->uio_resid, + args[1]->_uio_offset._f / 1024, cleanpath(args[0]->v_path)); +} + +fbt:ufs:ufs_getpage_ra:entry +{ + /* fetch the real offset (file_t is unaware of this) */ + self->offset = ((inode_t *)args[0]->v_data)->i_nextrio; + self->read_ahead = 1; +} + +fbt:ufs:ufs_getpage_ra:return +{ + self->read_ahead = 0; + self->offset = 0; +} + +io::bdev_strategy:start +{ + this->offset = self->read_ahead ? self->offset : args[2]->fi_offset; + printf(" %-9s %10s %2s %8d %6d %s\n", + self->read_ahead ? "disk_ra" : "disk_io", args[1]->dev_statname, + args[0]->b_flags & B_READ ? "R" : "W", args[0]->b_bcount, + this->offset / 1024, args[2]->fi_pathname); +} diff --git a/cddl/contrib/dtracetoolkit/FS/fsrw.d b/cddl/contrib/dtracetoolkit/FS/fsrw.d new file mode 100755 index 000000000000..291f09aaae01 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/FS/fsrw.d @@ -0,0 +1,149 @@ +#!/usr/sbin/dtrace -s +/* + * fsrw.d - file system read/write event tracing. + * Written using DTrace (Solaris 10 3/05) + * + * This traces file related activity: system call reads and writes, + * vnode logical read and writes (fop), and disk I/O. It can be used + * to examine the behaviour of each I/O layer, from the syscall + * interface to what the disk is doing. Behaviour such as read-ahead, and + * max I/O size breakup can be observed. + * + * $Id: fsrw.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: fsrw.d + * + * FIELDS: + * Event Traced event (see EVENTS below) + * Device Device, for disk I/O + * RW Either Read or Write + * Size Size of I/O in bytes + * Offset Offset of I/O in kilobytes + * Path Path to file on disk + * + * EVENTS: + * sc-read System call read + * sc-write System call write + * fop_read Logical read + * fop_write Logical write + * disk_io Physical disk I/O + * disk_ra Physical disk I/O, read ahead + * + * The events are drawn with a level of indentation, which can sometimes + * help identify related events. + * + * SEE ALSO: fspaging.d + * + * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter. + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * ToDo: readv() + * + * 20-Mar-2006 Brendan Gregg Created this. + * 23-Apr-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option switchrate=10hz + +dtrace:::BEGIN +{ + printf("%-12s %10s %2s %8s %6s %s\n", + "Event", "Device", "RW", "Size", "Offset", "Path"); +} + +syscall::*read:entry, +syscall::*write*:entry +{ + /* + * starting with a file descriptior, dig out useful info + * from the corresponding file_t and vnode_t. + */ + this->filistp = curthread->t_procp->p_user.u_finfo.fi_list; + this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp + + (uint64_t)arg0 * (uint64_t)sizeof (uf_entry_t)); + this->filep = this->ufentryp->uf_file; + self->offset = this->filep->f_offset; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>"; + + /* only trace activity to regular files and directories, as */ + self->sc_trace = this->vnodep ? this->vnodep->v_type == VREG || + this->vnodep->v_type == VDIR ? 1 : 0 : 0; +} + +syscall::*read:entry +/self->sc_trace/ +{ + printf("sc-%-9s %10s %2s %8d %6d %s\n", probefunc, ".", "R", + (int)arg2, self->offset / 1024, self->vpath); +} + +syscall::*write*:entry +/self->sc_trace/ +{ + printf("sc-%-9s %10s %2s %8d %6d %s\n", probefunc, ".", "W", + (int)arg2, self->offset / 1024, self->vpath); +} + +syscall::*read:return, +syscall::*write*:return +{ + self->vpath = 0; + self->offset = 0; + self->sc_trace = 0; +} + +fbt::fop_read:entry, +fbt::fop_write:entry +/self->sc_trace && args[0]->v_path/ +{ + printf(" %-10s %10s %2s %8d %6d %s\n", probefunc, ".", + probefunc == "fop_read" ? "R" : "W", args[1]->uio_resid, + args[1]->_uio_offset._f / 1024, cleanpath(args[0]->v_path)); +} + +fbt:ufs:ufs_getpage_ra:entry +{ + /* fetch the real offset (file_t is unaware of this) */ + self->ra_offset = ((inode_t *)args[0]->v_data)->i_nextrio; + self->read_ahead = 1; +} + +fbt:ufs:ufs_getpage_ra:return +{ + self->read_ahead = 0; + self->ra_offset = 0; +} + +io::bdev_strategy:start +{ + this->offset = self->read_ahead ? self->ra_offset : args[2]->fi_offset; + printf(" %-8s %10s %2s %8d %6d %s\n", + self->read_ahead ? "disk_ra" : "disk_io", args[1]->dev_statname, + args[0]->b_flags & B_READ ? "R" : "W", args[0]->b_bcount, + this->offset / 1024, args[2]->fi_pathname); + /* + * it would seem to make sense to only trace disk events during + * an fop event, easily coded with a self->fop_trace flag. However + * writes are asynchronous to the fop_write calls (they are flushed + * at some later time), and so this approach will miss tracing + * most of the disk writes. + */ +} diff --git a/cddl/contrib/dtracetoolkit/FS/rfileio.d b/cddl/contrib/dtracetoolkit/FS/rfileio.d new file mode 100755 index 000000000000..95a6caad5c6f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/FS/rfsio.d b/cddl/contrib/dtracetoolkit/FS/rfsio.d new file mode 100755 index 000000000000..847756314ba3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/FS/vopstat b/cddl/contrib/dtracetoolkit/FS/vopstat new file mode 100755 index 000000000000..a4c5af46d7de --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Guide b/cddl/contrib/dtracetoolkit/Guide new file mode 100644 index 000000000000..739d3670b83b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Include/Readme b/cddl/contrib/dtracetoolkit/Include/Readme new file mode 100644 index 000000000000..4aa46881e8f4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Include/Readme @@ -0,0 +1,18 @@ +Include - include scripts for D scripting + + This directory contains files that can be included for use with D scripts. + + There are two types of include files, + + *.h + These can be included using, + + #!/usr/sbin/dtrace -Cs + #include <filename.h> + + *.d + These must be copyied to a translator directory (/usr/lib/dtrace), + and should be automatically pulled in. + + This directory does not contain runnable DTrace scripts. + diff --git a/cddl/contrib/dtracetoolkit/Include/test.ksh b/cddl/contrib/dtracetoolkit/Include/test.ksh new file mode 100755 index 000000000000..a3e1036a2061 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Include/time.h b/cddl/contrib/dtracetoolkit/Include/time.h new file mode 100644 index 000000000000..76caa2e97825 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Include/tostr.h b/cddl/contrib/dtracetoolkit/Include/tostr.h new file mode 100644 index 000000000000..6032f6afb323 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/Readme b/cddl/contrib/dtracetoolkit/Java/Readme new file mode 100644 index 000000000000..ae455a524d1c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_calldist.d b/cddl/contrib/dtracetoolkit/Java/j_calldist.d new file mode 100755 index 000000000000..f0cb087fc6a8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_calls.d b/cddl/contrib/dtracetoolkit/Java/j_calls.d new file mode 100755 index 000000000000..087545d3ff39 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_calltime.d b/cddl/contrib/dtracetoolkit/Java/j_calltime.d new file mode 100755 index 000000000000..be4da519180d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_classflow.d b/cddl/contrib/dtracetoolkit/Java/j_classflow.d new file mode 100755 index 000000000000..162338ad2186 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_cpudist.d b/cddl/contrib/dtracetoolkit/Java/j_cpudist.d new file mode 100755 index 000000000000..9a4626e4c62a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_cputime.d b/cddl/contrib/dtracetoolkit/Java/j_cputime.d new file mode 100755 index 000000000000..a720cdb439a4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_events.d b/cddl/contrib/dtracetoolkit/Java/j_events.d new file mode 100755 index 000000000000..d8c938b2c134 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_flow.d b/cddl/contrib/dtracetoolkit/Java/j_flow.d new file mode 100755 index 000000000000..e98c06784a4a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_flowtime.d b/cddl/contrib/dtracetoolkit/Java/j_flowtime.d new file mode 100755 index 000000000000..53e75cdf9cc9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_methodcalls.d b/cddl/contrib/dtracetoolkit/Java/j_methodcalls.d new file mode 100755 index 000000000000..606b8200c3c8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_objnew.d b/cddl/contrib/dtracetoolkit/Java/j_objnew.d new file mode 100755 index 000000000000..88470054c6a5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_package.d b/cddl/contrib/dtracetoolkit/Java/j_package.d new file mode 100755 index 000000000000..cfeaf050bd4b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_profile.d b/cddl/contrib/dtracetoolkit/Java/j_profile.d new file mode 100755 index 000000000000..4ff009e91068 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_stat.d b/cddl/contrib/dtracetoolkit/Java/j_stat.d new file mode 100755 index 000000000000..862fe31f46d8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_syscalls.d b/cddl/contrib/dtracetoolkit/Java/j_syscalls.d new file mode 100755 index 000000000000..4a24dea75ae3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_syscolors.d b/cddl/contrib/dtracetoolkit/Java/j_syscolors.d new file mode 100755 index 000000000000..691ae7eda5eb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_thread.d b/cddl/contrib/dtracetoolkit/Java/j_thread.d new file mode 100755 index 000000000000..08d2de8b14c1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Java/j_who.d b/cddl/contrib/dtracetoolkit/Java/j_who.d new file mode 100755 index 000000000000..8785cca73bcf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/Readme b/cddl/contrib/dtracetoolkit/JavaScript/Readme new file mode 100644 index 000000000000..a9bebf86b892 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_calldist.d b/cddl/contrib/dtracetoolkit/JavaScript/js_calldist.d new file mode 100755 index 000000000000..2c4923a53088 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_calls.d b/cddl/contrib/dtracetoolkit/JavaScript/js_calls.d new file mode 100755 index 000000000000..98f1a83ae54b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_calls.d @@ -0,0 +1,76 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_calls.d - count JavaScript calls using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_calls.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces activity from all browsers on the system that are + * running with JavaScript provider support. + * + * USAGE: js_calls.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename of the JavaScript program + * TYPE Type of call (func/obj-new/...) + * NAME Descriptive name of call + * COUNT Number of calls during sample + * + * Filename and function names are printed if available. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::function-entry +{ + this->name = copyinstr(arg2); + @calls[basename(copyinstr(arg0)), "func", this->name] = count(); +} + +javascript*:::execute-start +{ + this->filename = basename(copyinstr(arg0)); + @calls[this->filename, "exec", "."] = count(); +} + +javascript*:::object-create-start +{ + this->name = copyinstr(arg1); + this->filename = basename(copyinstr(arg0)); + @calls[this->filename, "obj-new", this->name] = count(); +} + +javascript*:::object-finalize +{ + this->name = copyinstr(arg1); + @calls["<null>", "obj-free", this->name] = count(); +} + +dtrace:::END +{ + printf(" %-24s %-10s %-30s %8s\n", "FILE", "TYPE", "NAME", "CALLS"); + printa(" %-24s %-10s %-30s %@8d\n", @calls); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_calltime.d b/cddl/contrib/dtracetoolkit/JavaScript/js_calltime.d new file mode 100755 index 000000000000..dce150e3e5ac --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_cpudist.d b/cddl/contrib/dtracetoolkit/JavaScript/js_cpudist.d new file mode 100755 index 000000000000..cbe168d742d4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_cputime.d b/cddl/contrib/dtracetoolkit/JavaScript/js_cputime.d new file mode 100755 index 000000000000..bee77abc9953 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_execs.d b/cddl/contrib/dtracetoolkit/JavaScript/js_execs.d new file mode 100755 index 000000000000..fb0ca91fb565 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_flow.d b/cddl/contrib/dtracetoolkit/JavaScript/js_flow.d new file mode 100755 index 000000000000..450cc69e8070 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_flowinfo.d b/cddl/contrib/dtracetoolkit/JavaScript/js_flowinfo.d new file mode 100755 index 000000000000..b4b7d5c47e11 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_flowtime.d b/cddl/contrib/dtracetoolkit/JavaScript/js_flowtime.d new file mode 100755 index 000000000000..9545274934a5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_objcpu.d b/cddl/contrib/dtracetoolkit/JavaScript/js_objcpu.d new file mode 100755 index 000000000000..6611f59b4ef3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_objgc.d b/cddl/contrib/dtracetoolkit/JavaScript/js_objgc.d new file mode 100755 index 000000000000..575b2952f834 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/JavaScript/js_objgc.d @@ -0,0 +1,89 @@ +#!/usr/sbin/dtrace -Zs +/* + * js_objgc.d - trace JavaScript Object GC using DTrace. + * Written for the JavaScript DTrace provider. + * + * $Id: js_objgc.d 63 2007-10-04 04:34:38Z brendan $ + * + * This traces JavaScript activity from all running browers on the system + * which support the JavaScript DTrace provider. + * + * USAGE: js_objgc.d # hit Ctrl-C to end + * + * FIELDS: + * FILE Filename that contained the function + * CLASS Class to which this new object belongs + * TOTAL Object entropy (positive == uncollected) + * + * This script provides information on which objects are not being garbage + * collected, an issue which causes the browser to steadily leak memory. + * We trace object creation (+1) and destruction (-1), and provide a + * summary each second of the running tally of the object class and + * originating filename. If over the period of several minutes an object + * type is still steadily increasing, then that would be of interest. + * Be patient, depending on the rate of object creation it can take over + * ten minutes for garbage collect to kick in. + * + * NOTES: + * - it is possible that you will see negative entropy. That happens + * when you begin tracing after some objects have already been created, + * and then trace their destruction. + * - there are other Things that GC handles, other than Objects; extra + * probes can be added to trace them, should the need arise. + * + * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 09-Sep-2007 Brendan Gregg Created this. + */ + +/* if you get dynvardrops, increase this, */ +#pragma D option dynvarsize=32m +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +javascript*:::object-create +/arg2/ +{ + this->file = basename(copyinstr(arg0)); + @objs[this->file, copyinstr(arg1)] = sum(1); + filename[arg2] = this->file; +} + +javascript*:::object-finalize +/filename[arg2] == NULL/ +{ + @objs["<missed>", copyinstr(arg1)] = sum(-1); +} + +javascript*:::object-finalize +/filename[arg2] != NULL/ +{ + @objs[filename[arg2], copyinstr(arg1)] = sum(-1); + filename[arg2] = 0; +} + +profile:::tick-1sec, +dtrace:::END +{ + printf("\n %-24s %8s %-20s %23Y\n", "FILE", "TOTAL", "CLASS", + walltimestamp); + printa(" %-24.24s %@8d %s\n", @objs); +} diff --git a/cddl/contrib/dtracetoolkit/JavaScript/js_objnew.d b/cddl/contrib/dtracetoolkit/JavaScript/js_objnew.d new file mode 100755 index 000000000000..f57c7b52ec6f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_stat.d b/cddl/contrib/dtracetoolkit/JavaScript/js_stat.d new file mode 100755 index 000000000000..323776298a04 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/JavaScript/js_who.d b/cddl/contrib/dtracetoolkit/JavaScript/js_who.d new file mode 100755 index 000000000000..f320b481fd32 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/Readme b/cddl/contrib/dtracetoolkit/Kernel/Readme new file mode 100644 index 000000000000..3c5d6b3589da --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/Readme @@ -0,0 +1,3 @@ +Kernel - Kernel based analysis + + These are scripts to monitor kernel activity. diff --git a/cddl/contrib/dtracetoolkit/Kernel/cpudists b/cddl/contrib/dtracetoolkit/Kernel/cpudists new file mode 100755 index 000000000000..b708216e191b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/cputimes b/cddl/contrib/dtracetoolkit/Kernel/cputimes new file mode 100755 index 000000000000..881bf90efec6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/cswstat.d b/cddl/contrib/dtracetoolkit/Kernel/cswstat.d new file mode 100755 index 000000000000..98ca83cc361c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/dnlcps.d b/cddl/contrib/dtracetoolkit/Kernel/dnlcps.d new file mode 100755 index 000000000000..d3c3e58ff18e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/dnlcsnoop.d b/cddl/contrib/dtracetoolkit/Kernel/dnlcsnoop.d new file mode 100755 index 000000000000..1150f4502303 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/dnlcstat b/cddl/contrib/dtracetoolkit/Kernel/dnlcstat new file mode 100755 index 000000000000..b29e8c219bf7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/kstat_types.d b/cddl/contrib/dtracetoolkit/Kernel/kstat_types.d new file mode 100755 index 000000000000..119bc77d1d20 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/kstat_types.d @@ -0,0 +1,66 @@ +#!/usr/sbin/dtrace -Cs +/* + * kstat_types.d - Trace kstat reads with type info. + * Written using DTrace (Solaris 10 3/05) + * + * kstat is the Kernel Statistics framework, which is used by tools + * such as vmstat, iostat, mpstat and sar. Try running vmstat while + * kstat_types.d is tracing - you should see details of the kstat + * reads performed. + * + * $Id: kstat_types.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: kstat_types.d (early release, check for updates) + * + * FIELDS: + * CMD command name + * CLASS kstat class (ks_class) + * TYPE kstat type as a string (ks_type) + * MOD:INS:NAME kstat module:instance:name + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 11-Feb-2006 Brendan Gregg Created this. + * 11-Feb-2006 " " Last update. + */ + +#include <sys/isa_defs.h> + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("%-16s %-16s %-6s %s\n", + "CMD", "CLASS", "TYPE", "MOD:INS:NAME"); +} + +fbt::read_kstat_data:entry +{ +#ifdef _MULTI_DATAMODEL + self->uk = (kstat32_t *)copyin((uintptr_t)arg1, sizeof (kstat32_t)); +#else + self->uk = (kstat_t *)copyin((uintptr_t)arg1, sizeof (kstat_t)); +#endif + printf("%-16s %-16s %-6s %s:%d:%s\n", execname, + self->uk->ks_class == "" ? "." : self->uk->ks_class, + self->uk->ks_type == 0 ? "raw" + : self->uk->ks_type == 1 ? "named" + : self->uk->ks_type == 2 ? "intr" + : self->uk->ks_type == 3 ? "io" + : self->uk->ks_type == 4 ? "timer" : "?", + self->uk->ks_module, self->uk->ks_instance, self->uk->ks_name); +} diff --git a/cddl/contrib/dtracetoolkit/Kernel/modcalls.d b/cddl/contrib/dtracetoolkit/Kernel/modcalls.d new file mode 100755 index 000000000000..0386a7a721a9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/priclass.d b/cddl/contrib/dtracetoolkit/Kernel/priclass.d new file mode 100755 index 000000000000..92275dcb4ed4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/pridist.d b/cddl/contrib/dtracetoolkit/Kernel/pridist.d new file mode 100755 index 000000000000..1b6d3ebb7b06 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/putnexts.d b/cddl/contrib/dtracetoolkit/Kernel/putnexts.d new file mode 100755 index 000000000000..cb99a7213636 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Kernel/whatexec.d b/cddl/contrib/dtracetoolkit/Kernel/whatexec.d new file mode 100755 index 000000000000..e70173b8b733 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/License b/cddl/contrib/dtracetoolkit/License new file mode 120000 index 000000000000..2095b9644d77 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/License @@ -0,0 +1 @@ +Docs/cddl1.txt
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Locks/lockbydist.d b/cddl/contrib/dtracetoolkit/Locks/lockbydist.d new file mode 100755 index 000000000000..9bfc224f6d3b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Locks/lockbyproc.d b/cddl/contrib/dtracetoolkit/Locks/lockbyproc.d new file mode 100755 index 000000000000..d7b921913419 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/Readme b/cddl/contrib/dtracetoolkit/Man/Readme new file mode 100644 index 000000000000..31641230863b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/anonpgpid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/anonpgpid.d.1m new file mode 100644 index 000000000000..9cafd4806269 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/bitesize.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/bitesize.d.1m new file mode 100644 index 000000000000..4ef13bec7d8c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/connections.1m b/cddl/contrib/dtracetoolkit/Man/man1m/connections.1m new file mode 100644 index 000000000000..ea0285cc55ea --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/cpudists.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cpudists.1m new file mode 100644 index 000000000000..aeb29ca6a8f5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/cputimes.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cputimes.1m new file mode 100644 index 000000000000..bcafbb106589 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/cputypes.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cputypes.d.1m new file mode 100644 index 000000000000..82b6fecdccaa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/cpuwalk.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cpuwalk.d.1m new file mode 100644 index 000000000000..16874d988e39 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/crash.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/crash.d.1m new file mode 100644 index 000000000000..368229b133ec --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/creatbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/creatbyproc.d.1m new file mode 100644 index 000000000000..fe4f12363705 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/cswstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/cswstat.d.1m new file mode 100644 index 000000000000..7256d5f315d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/dappprof.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dappprof.1m new file mode 100644 index 000000000000..de1b52a7fa2f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/dapptrace.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dapptrace.1m new file mode 100644 index 000000000000..c439f05380c8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/dexplorer.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dexplorer.1m new file mode 100644 index 000000000000..10683a936542 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/diskhits.1m b/cddl/contrib/dtracetoolkit/Man/man1m/diskhits.1m new file mode 100644 index 000000000000..e8b9c57e1bcd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/dispqlen.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dispqlen.d.1m new file mode 100644 index 000000000000..dcc08200d8f9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/dnlcps.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dnlcps.d.1m new file mode 100644 index 000000000000..482fd0747cc0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/dnlcsnoop.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dnlcsnoop.d.1m new file mode 100644 index 000000000000..cd9ac7be9461 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/dnlcstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dnlcstat.1m new file mode 100644 index 000000000000..146c39dc1d96 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/dtruss.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dtruss.1m new file mode 100644 index 000000000000..7837f0e7b5ed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/dvmstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/dvmstat.1m new file mode 100644 index 000000000000..20fa955e0d71 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/errinfo.1m b/cddl/contrib/dtracetoolkit/Man/man1m/errinfo.1m new file mode 100644 index 000000000000..6b63e5211192 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/execsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/execsnoop.1m new file mode 100644 index 000000000000..a7114cec58d0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/fddist.1m b/cddl/contrib/dtracetoolkit/Man/man1m/fddist.1m new file mode 100644 index 000000000000..990d76174386 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/filebyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/filebyproc.d.1m new file mode 100644 index 000000000000..23b56481662b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/fspaging.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/fspaging.d.1m new file mode 100644 index 000000000000..6911ac5582dd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/fsrw.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/fsrw.d.1m new file mode 100644 index 000000000000..4389c211f063 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/guess.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/guess.d.1m new file mode 100644 index 000000000000..4c6d2e2ea472 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/hotkernel.1m b/cddl/contrib/dtracetoolkit/Man/man1m/hotkernel.1m new file mode 100644 index 000000000000..49772b6ae1ee --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/hotspot.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/hotspot.d.1m new file mode 100644 index 000000000000..a99a589cc92d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/hotuser.1m b/cddl/contrib/dtracetoolkit/Man/man1m/hotuser.1m new file mode 100644 index 000000000000..ab26523755cc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/httpdstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/httpdstat.d.1m new file mode 100644 index 000000000000..5dd0a3fa96a9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/icmpstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/icmpstat.d.1m new file mode 100644 index 000000000000..be4b87ae9f97 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/intbycpu.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/intbycpu.d.1m new file mode 100644 index 000000000000..79314dc4c268 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/intoncpu.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/intoncpu.d.1m new file mode 100644 index 000000000000..ec52b815236d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/inttimes.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/inttimes.d.1m new file mode 100644 index 000000000000..bc6d989aafdc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/iofile.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iofile.d.1m new file mode 100644 index 000000000000..fd3016dd5674 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/iofileb.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iofileb.d.1m new file mode 100644 index 000000000000..56ca3acc83a2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/iopattern.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iopattern.1m new file mode 100644 index 000000000000..6898f82672a9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/iopending.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iopending.1m new file mode 100644 index 000000000000..c31d967e6eef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/iosnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iosnoop.1m new file mode 100644 index 000000000000..6e9058dabf3a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/iotop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/iotop.1m new file mode 100644 index 000000000000..80522436ec84 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_calldist.d.1m new file mode 100644 index 000000000000..d78ce8591b75 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_calls.d.1m new file mode 100644 index 000000000000..e89fb8e53961 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_calltime.d.1m new file mode 100644 index 000000000000..479dc5bfb48e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_classflow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_classflow.d.1m new file mode 100644 index 000000000000..af9d06c1a38b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_cpudist.d.1m new file mode 100644 index 000000000000..37fe5f04fc3b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_cputime.d.1m new file mode 100644 index 000000000000..a0e767aedccb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_events.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_events.d.1m new file mode 100644 index 000000000000..6df009b2a7a4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_flow.d.1m new file mode 100644 index 000000000000..579e68186c0a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_flowtime.d.1m new file mode 100644 index 000000000000..e4334b23e5b3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_methodcalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_methodcalls.d.1m new file mode 100644 index 000000000000..a44aea76dbd3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_objnew.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_objnew.d.1m new file mode 100644 index 000000000000..14a6b21a0535 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_package.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_package.d.1m new file mode 100644 index 000000000000..43f5b9b1623f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_profile.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_profile.d.1m new file mode 100644 index 000000000000..7c1ca28f6b2b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_stat.d.1m new file mode 100644 index 000000000000..ab1495e7b690 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_syscalls.d.1m new file mode 100644 index 000000000000..854c9017e59a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_syscolors.d.1m new file mode 100644 index 000000000000..e6bdebee7d3f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_thread.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_thread.d.1m new file mode 100644 index 000000000000..97caf9ffc771 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/j_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/j_who.d.1m new file mode 100644 index 000000000000..97d68e8baf5e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_calldist.d.1m new file mode 100644 index 000000000000..fbd20fcfbb3b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_calls.d.1m new file mode 100644 index 000000000000..c997293cdd01 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_calltime.d.1m new file mode 100644 index 000000000000..785587b16c10 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_cpudist.d.1m new file mode 100644 index 000000000000..64a9aec98ec8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_cputime.d.1m new file mode 100644 index 000000000000..2aaefc13c8e1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_execs.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_execs.d.1m new file mode 100644 index 000000000000..61613c040053 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_flow.d.1m new file mode 100644 index 000000000000..5d4ba0d23e7b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_flowinfo.d.1m new file mode 100644 index 000000000000..1531ce5b428f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_flowtime.d.1m new file mode 100644 index 000000000000..f90c9998fb70 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_objcpu.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_objcpu.d.1m new file mode 100644 index 000000000000..088fa06e70b6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_objgc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_objgc.d.1m new file mode 100644 index 000000000000..691883e6dc6e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_objnew.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_objnew.d.1m new file mode 100644 index 000000000000..83897b5dfbab --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_stat.d.1m new file mode 100644 index 000000000000..3234630a3022 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/js_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/js_who.d.1m new file mode 100644 index 000000000000..119ea2626bd3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/kill.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/kill.d.1m new file mode 100644 index 000000000000..e9e966a9c92b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/kstat_types.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/kstat_types.d.1m new file mode 100644 index 000000000000..8a2d11952c45 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/lastwords.1m b/cddl/contrib/dtracetoolkit/Man/man1m/lastwords.1m new file mode 100644 index 000000000000..024234bf49f7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/loads.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/loads.d.1m new file mode 100644 index 000000000000..f18d3b119507 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/lockbydist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/lockbydist.d.1m new file mode 100644 index 000000000000..188c5a4e5f40 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/lockbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/lockbyproc.d.1m new file mode 100644 index 000000000000..af6c9114b71a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/minfbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/minfbypid.d.1m new file mode 100644 index 000000000000..45574f487ae0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/minfbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/minfbyproc.d.1m new file mode 100644 index 000000000000..9045e48da762 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/mmapfiles.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/mmapfiles.d.1m new file mode 100644 index 000000000000..e4bb2c89eaef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/modcalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/modcalls.d.1m new file mode 100644 index 000000000000..af7722b71c4c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/newproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/newproc.d.1m new file mode 100644 index 000000000000..b3b979b4e779 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/nfswizard.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/nfswizard.d.1m new file mode 100644 index 000000000000..64d8e416e83f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/opensnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/opensnoop.1m new file mode 100644 index 000000000000..bc449c05b1b9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pathopens.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pathopens.d.1m new file mode 100644 index 000000000000..cf043bd1c3f6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pfilestat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pfilestat.1m new file mode 100644 index 000000000000..8780c2e58e1c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbypid.d.1m new file mode 100644 index 000000000000..fdaa297b51d0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pgpginbyproc.d.1m new file mode 100644 index 000000000000..413043af10e5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_calldist.d.1m new file mode 100644 index 000000000000..065d6db2d7d1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_calltime.d.1m new file mode 100644 index 000000000000..f090b6e70160 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_cpudist.d.1m new file mode 100644 index 000000000000..54ea0d195b84 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_cputime.d.1m new file mode 100644 index 000000000000..2020969224f6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_flow.d.1m new file mode 100644 index 000000000000..bda09e3b24d6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_flowinfo.d.1m new file mode 100644 index 000000000000..2e9282e73035 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_flowtime.d.1m new file mode 100644 index 000000000000..f30c283e5476 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_funccalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_funccalls.d.1m new file mode 100644 index 000000000000..eb01963bb2fa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_malloc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_malloc.d.1m new file mode 100644 index 000000000000..a11944d9537c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_syscalls.d.1m new file mode 100644 index 000000000000..e2b10b0f84fa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_syscolors.d.1m new file mode 100644 index 000000000000..0a29ffb43913 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/php_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/php_who.d.1m new file mode 100644 index 000000000000..9aacba6221ef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pidpersec.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pidpersec.d.1m new file mode 100644 index 000000000000..4040ae549f26 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_calldist.d.1m new file mode 100644 index 000000000000..ad2d1b83d184 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_calltime.d.1m new file mode 100644 index 000000000000..7de6eaf7a7c1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_cpudist.d.1m new file mode 100644 index 000000000000..6df61f1bb4de --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_cputime.d.1m new file mode 100644 index 000000000000..f8cf75aed423 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_flow.d.1m new file mode 100644 index 000000000000..d66e49363069 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowinfo.d.1m new file mode 100644 index 000000000000..0bf1384bfdbf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_flowtime.d.1m new file mode 100644 index 000000000000..59acddf363ed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_malloc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_malloc.d.1m new file mode 100644 index 000000000000..babee557d35d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_subcalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_subcalls.d.1m new file mode 100644 index 000000000000..710b39dde66d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscalls.d.1m new file mode 100644 index 000000000000..bd35e5c685bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_syscolors.d.1m new file mode 100644 index 000000000000..5c4c4bac1dbe --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pl_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pl_who.d.1m new file mode 100644 index 000000000000..9239a7023849 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/priclass.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/priclass.d.1m new file mode 100644 index 000000000000..d726ac2588f1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/pridist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/pridist.d.1m new file mode 100644 index 000000000000..1e7aba625442 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/procsystime.1m b/cddl/contrib/dtracetoolkit/Man/man1m/procsystime.1m new file mode 100644 index 000000000000..0df87cf78832 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/putnexts.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/putnexts.d.1m new file mode 100644 index 000000000000..59335673299d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_calldist.d.1m new file mode 100644 index 000000000000..1592af5e8223 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_calltime.d.1m new file mode 100644 index 000000000000..e055eb33366f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_cpudist.d.1m new file mode 100644 index 000000000000..825fc6401288 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_cputime.d.1m new file mode 100644 index 000000000000..f926204bb2bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_flow.d.1m new file mode 100644 index 000000000000..3659e0f63706 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_flowinfo.d.1m new file mode 100644 index 000000000000..4a25d0db2bdb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_flowtime.d.1m new file mode 100644 index 000000000000..67882957e5ce --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_funccalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_funccalls.d.1m new file mode 100644 index 000000000000..8a54976199eb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_malloc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_malloc.d.1m new file mode 100644 index 000000000000..4468da8ae2b9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_mallocstk.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_mallocstk.d.1m new file mode 100644 index 000000000000..fac0a1789b54 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_profile.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_profile.d.1m new file mode 100644 index 000000000000..282bf48104fc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_syscalls.d.1m new file mode 100644 index 000000000000..cd4712349714 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_syscolors.d.1m new file mode 100644 index 000000000000..210fa1b61f73 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/py_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/py_who.d.1m new file mode 100644 index 000000000000..e88190e6462f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_calldist.d.1m new file mode 100644 index 000000000000..57a975620198 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_calls.d.1m new file mode 100644 index 000000000000..3e328f3ce7cf --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_calltime.d.1m new file mode 100644 index 000000000000..0787a93aa50d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_cpudist.d.1m new file mode 100644 index 000000000000..ff4f283bbf3b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_cputime.d.1m new file mode 100644 index 000000000000..7e8302b895a4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_flow.d.1m new file mode 100644 index 000000000000..fa1f51834cfd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowinfo.d.1m new file mode 100644 index 000000000000..08e124fbfa25 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_flowtime.d.1m new file mode 100644 index 000000000000..64425b37f7be --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_funccalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_funccalls.d.1m new file mode 100644 index 000000000000..c4fe9fad2516 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_lines.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_lines.d.1m new file mode 100644 index 000000000000..4bdbabcafb57 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_malloc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_malloc.d.1m new file mode 100644 index 000000000000..d86bc46d14b7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_objcpu.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_objcpu.d.1m new file mode 100644 index 000000000000..6d1d8b1e2928 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_objnew.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_objnew.d.1m new file mode 100644 index 000000000000..e40f493a4998 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_stat.d.1m new file mode 100644 index 000000000000..070faf42781d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscalls.d.1m new file mode 100644 index 000000000000..9fbe81d3f10b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_syscolors.d.1m new file mode 100644 index 000000000000..bd18be9ea7d3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rb_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rb_who.d.1m new file mode 100644 index 000000000000..5dd13d5e7275 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/readbytes.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/readbytes.d.1m new file mode 100644 index 000000000000..697339d493e1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/readdist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/readdist.d.1m new file mode 100644 index 000000000000..e11b21c7b0b7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rfileio.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rfileio.d.1m new file mode 100644 index 000000000000..08c25e9d4de2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rfsio.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rfsio.d.1m new file mode 100644 index 000000000000..ecbb786a84e6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/runocc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/runocc.d.1m new file mode 100644 index 000000000000..0ba529ffcd8e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rwbbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwbbypid.d.1m new file mode 100644 index 000000000000..36ab3f24ed0a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rwbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwbypid.d.1m new file mode 100644 index 000000000000..869eb80e8557 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rwbytype.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwbytype.d.1m new file mode 100644 index 000000000000..85c8194baa9b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/rwsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwsnoop.1m new file mode 100644 index 000000000000..d6e544169ce5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Man/man1m/rwsnoop.1m @@ -0,0 +1,104 @@ +.TH rwsnoop 1m "$Date:: 2007-08-05 #$" "USER COMMANDS" +.SH NAME +rwsnoop \- snoop read/write events. Uses DTrace. +.SH SYNOPSIS +.B rwsnoop +[\-jPtvZ] [\-n name] [\-p PID] +.SH DESCRIPTION +This is measuring reads and writes at the application level. This +matches the syscalls read, write, pread and pwrite. + +Since this uses DTrace, only the root user or users with the +dtrace_kernel privilege can run this command. +.SH OS +Solaris +.SH STABILITY +stable - needs the syscall provider. +.SH OPTIONS +.TP +\-j +print project ID +.TP +\-P +print parent process ID +.TP +\-t +print timestamp, us +.TP +\-v +print time, string +.TP +\-Z +print zone ID +.TP +\-n name +process name to track +.TP +\-p PID +PID to track +.PP +.SH EXAMPLES +.TP +Default output, +# +.B rwsnoop +.TP +Print zone ID, +# +.B rwsnoop +-\Z +.TP +Monitor processes named "bash", +# +.B rwsnoop +\-n bash +.PP +.SH FIELDS +.TP +TIME +timestamp, us +.TP +TIMESTR +time, string +.TP +ZONE +zone ID +.TP +PROJ +project ID +.TP +UID +user ID +.TP +PID +process ID +.TP +PPID +parent process ID +.TP +CMD +command name for the process +.TP +D +direction, Read or Write +.TP +BYTES +total bytes during sample +.TP +FILE +filename, if file based. +Reads and writes that are not file based, for example with sockets, will +print "<unknown>" as the filename. +.PP +.SH DOCUMENTATION +See the DTraceToolkit for further documentation under the +Docs directory. The DTraceToolkit docs may include full worked +examples with verbose descriptions explaining the output. +.SH EXIT +rwsnoop will run forever until Ctrl\-C is hit. +.SH AUTHOR +Brendan Gregg +[Sydney, Australia] +.SH SEE ALSO +rwtop(1M), dtrace(1M) + diff --git a/cddl/contrib/dtracetoolkit/Man/man1m/rwtop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/rwtop.1m new file mode 100644 index 000000000000..82af043462b0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sampleproc.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sampleproc.1m new file mode 100644 index 000000000000..0ae3a2de9009 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sar-c.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sar-c.d.1m new file mode 100644 index 000000000000..10192fb48753 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/seeksize.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/seeksize.d.1m new file mode 100644 index 000000000000..f15743d1e197 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/setuids.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/setuids.d.1m new file mode 100644 index 000000000000..50d131cf551d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_calldist.d.1m new file mode 100644 index 000000000000..760e699c0e49 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_calls.d.1m new file mode 100644 index 000000000000..0afeaab6883f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_calltime.d.1m new file mode 100644 index 000000000000..6863d870a332 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_cpudist.d.1m new file mode 100644 index 000000000000..998e6ee8a422 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_cputime.d.1m new file mode 100644 index 000000000000..3c98f94e213a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_flow.d.1m new file mode 100644 index 000000000000..42dc5cc4206b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowinfo.d.1m new file mode 100644 index 000000000000..6fa150078214 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_flowtime.d.1m new file mode 100644 index 000000000000..87906b6afebc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_lines.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_lines.d.1m new file mode 100644 index 000000000000..e3d85081ddf2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_pidcolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_pidcolors.d.1m new file mode 100644 index 000000000000..3f6380ac041f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_stat.d.1m new file mode 100644 index 000000000000..40624f949555 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscalls.d.1m new file mode 100644 index 000000000000..67d74a3ff424 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_syscolors.d.1m new file mode 100644 index 000000000000..bfd1de5e8630 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_wasted.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_wasted.d.1m new file mode 100644 index 000000000000..1b983891b049 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sh_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sh_who.d.1m new file mode 100644 index 000000000000..f98bef83b221 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/shellsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/shellsnoop.1m new file mode 100644 index 000000000000..a533ab0e1c1f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/shortlived.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/shortlived.d.1m new file mode 100644 index 000000000000..cb4950726f86 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sigdist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sigdist.d.1m new file mode 100644 index 000000000000..f9f02fee9a43 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/stacksize.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/stacksize.d.1m new file mode 100644 index 000000000000..5b5a916ed397 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/statsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/statsnoop.1m new file mode 100644 index 000000000000..9a1011dac67a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/swapinfo.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/swapinfo.d.1m new file mode 100644 index 000000000000..322d29d1608d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/sysbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/sysbypid.d.1m new file mode 100644 index 000000000000..b956f1243db3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/syscallbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/syscallbypid.d.1m new file mode 100644 index 000000000000..e799dba9ebfe --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/syscallbyproc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/syscallbyproc.d.1m new file mode 100644 index 000000000000..bb3234824826 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/syscallbysysc.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/syscallbysysc.d.1m new file mode 100644 index 000000000000..c8f34f2d047c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calldist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calldist.d.1m new file mode 100644 index 000000000000..351a3f431eee --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calls.d.1m new file mode 100644 index 000000000000..df65cde58745 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calltime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_calltime.d.1m new file mode 100644 index 000000000000..14074af76cbd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cpudist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cpudist.d.1m new file mode 100644 index 000000000000..7ae55d865885 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cputime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_cputime.d.1m new file mode 100644 index 000000000000..efbac89f7822 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flow.d.1m new file mode 100644 index 000000000000..bba2e3a17780 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flowtime.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_flowtime.d.1m new file mode 100644 index 000000000000..56194d2d9ce6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_ins.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_ins.d.1m new file mode 100644 index 000000000000..f3ab7feb99bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_insflow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_insflow.d.1m new file mode 100644 index 000000000000..877757d2291c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_proccalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_proccalls.d.1m new file mode 100644 index 000000000000..9fda802351fd --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_procflow.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_procflow.d.1m new file mode 100644 index 000000000000..aa79e913b0ca --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_stat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_stat.d.1m new file mode 100644 index 000000000000..280b8c0d2acc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscalls.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscalls.d.1m new file mode 100644 index 000000000000..ef4e5fe1f506 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscolors.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_syscolors.d.1m new file mode 100644 index 000000000000..4b920d55e327 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcl_who.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcl_who.d.1m new file mode 100644 index 000000000000..f6a69944ea29 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.1m new file mode 100644 index 000000000000..7fff62c535c6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop.d.1m new file mode 100644 index 000000000000..e1cfd3c13f4d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.1m new file mode 100644 index 000000000000..36e880d78317 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpsnoop_snv.d.1m new file mode 100644 index 000000000000..79bfda36285c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcpstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpstat.d.1m new file mode 100644 index 000000000000..4db577c446a5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcptop.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcptop.1m new file mode 100644 index 000000000000..156aaf50fc69 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcptop_snv.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcptop_snv.1m new file mode 100644 index 000000000000..9ac14ac3a427 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/tcpwdist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/tcpwdist.d.1m new file mode 100644 index 000000000000..626d66e74f25 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/threaded.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/threaded.d.1m new file mode 100644 index 000000000000..c17ad9acc9de --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/topsyscall.1m b/cddl/contrib/dtracetoolkit/Man/man1m/topsyscall.1m new file mode 100644 index 000000000000..34734546ac34 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/topsysproc.1m b/cddl/contrib/dtracetoolkit/Man/man1m/topsysproc.1m new file mode 100644 index 000000000000..2f5e1c39d2ce --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/udpstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/udpstat.d.1m new file mode 100644 index 000000000000..340f659d06bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/uname-a.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/uname-a.d.1m new file mode 100644 index 000000000000..60d10f700fe7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/vmbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/vmbypid.d.1m new file mode 100644 index 000000000000..3c8b8759071a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/vmstat-p.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/vmstat-p.d.1m new file mode 100644 index 000000000000..8198f3d55fee --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/vmstat.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/vmstat.d.1m new file mode 100644 index 000000000000..dfbc3605c520 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/vopstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/vopstat.1m new file mode 100644 index 000000000000..fa81cc1e9820 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/weblatency.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/weblatency.d.1m new file mode 100644 index 000000000000..c7ff3d38870a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/whatexec.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/whatexec.d.1m new file mode 100644 index 000000000000..9c29b8ed5f20 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/woof.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/woof.d.1m new file mode 100644 index 000000000000..212346d6973d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/wpm.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/wpm.d.1m new file mode 100644 index 000000000000..8022ae463f50 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/writebytes.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/writebytes.d.1m new file mode 100644 index 000000000000..6fb3d85fd08a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/writedist.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/writedist.d.1m new file mode 100644 index 000000000000..bdced08f1bca --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/xcallsbypid.d.1m b/cddl/contrib/dtracetoolkit/Man/man1m/xcallsbypid.d.1m new file mode 100644 index 000000000000..173a14f7f71b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/xvmstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/xvmstat.1m new file mode 100644 index 000000000000..9f27d959a232 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Man/man1m/zvmstat.1m b/cddl/contrib/dtracetoolkit/Man/man1m/zvmstat.1m new file mode 100644 index 000000000000..cd830e06dba7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Mem/Readme b/cddl/contrib/dtracetoolkit/Mem/Readme new file mode 100644 index 000000000000..c4f7e3d90ccc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/Readme @@ -0,0 +1,3 @@ +Mem - Memory based analysis + + These scripts analyse memory and virtual memory related activity. diff --git a/cddl/contrib/dtracetoolkit/Mem/anonpgpid.d b/cddl/contrib/dtracetoolkit/Mem/anonpgpid.d new file mode 100755 index 000000000000..73971d923d1a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Mem/anonpgpid.d @@ -0,0 +1,75 @@ +#!/usr/sbin/dtrace -Cs +/* + * anonpgpid.d - anonymous memory paging info by process on CPU. + * Written using DTrace (Solaris 10 3/05). + * + * This scripts may help identify which processes are affected by a system + * with low memory, which is paging to the physical swap device. A report + * of the process on the CPU when paging occured is printed. + * + * $Id: anonpgpid.d 8 2007-08-06 05:55:26Z brendan $ + * + * USAGE: anonpgpid.d # hit Ctrl-C to end + * + * FIELDS: + * PID Process ID + * CMD Process name + * D Direction, Read or Write + * BYTES Total bytes during sample + * + * NOTES: + * + * This program is currently an approximation - often the process when writing + * pages to swap will be "pageout" the pageout scanner, or "rcapd" the + * resource capping daemon. + * + * THANKS: James Dickens + * + * COPYRIGHT: Copyright (c) 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * TODO: + * + * Track processes accurately. This is a little difficult - anonpgout + * occurs asynchronously to the process, and events related to this don't + * point back to the process. + * + * Author: Brendan Gregg [Sydney, Australia] + * + * 25-Jul-2005 Brendan Gregg Created this. + * 18-Feb-2006 " " Last update. + */ + +#include <sys/vnode.h> + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +fbt::pageio_setup:entry +/((args[2]->v_flag & (VISSWAP | VSWAPLIKE)) != 0)/ +{ + @total[pid, execname, args[3] & B_READ ? "R" : "W"] = sum(arg1); +} + +dtrace:::END +{ + printf("%6s %-16s %1s %s\n", "PID", "CMD", "D", "BYTES"); + printa("%6d %-16s %1s %@d\n", @total); +} diff --git a/cddl/contrib/dtracetoolkit/Mem/minfbypid.d b/cddl/contrib/dtracetoolkit/Mem/minfbypid.d new file mode 100755 index 000000000000..43f6f83e99c0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Mem/minfbyproc.d b/cddl/contrib/dtracetoolkit/Mem/minfbyproc.d new file mode 100755 index 000000000000..4d7316c5f09b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Mem/pgpginbypid.d b/cddl/contrib/dtracetoolkit/Mem/pgpginbypid.d new file mode 100755 index 000000000000..bd0ee5334755 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Mem/pgpginbyproc.d b/cddl/contrib/dtracetoolkit/Mem/pgpginbyproc.d new file mode 100755 index 000000000000..572271b5d7d6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Mem/swapinfo.d b/cddl/contrib/dtracetoolkit/Mem/swapinfo.d new file mode 100755 index 000000000000..045cd7271b54 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Mem/vmbypid.d b/cddl/contrib/dtracetoolkit/Mem/vmbypid.d new file mode 100755 index 000000000000..5160c14d05b4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Mem/vmstat-p.d b/cddl/contrib/dtracetoolkit/Mem/vmstat-p.d new file mode 100755 index 000000000000..835a0a6931ba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Mem/vmstat.d b/cddl/contrib/dtracetoolkit/Mem/vmstat.d new file mode 100755 index 000000000000..f8e0ead0a50d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Mem/xvmstat b/cddl/contrib/dtracetoolkit/Mem/xvmstat new file mode 100755 index 000000000000..ce13ce7e261c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Misc/Readme b/cddl/contrib/dtracetoolkit/Misc/Readme new file mode 100644 index 000000000000..2b77f6092109 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Misc/guess.d b/cddl/contrib/dtracetoolkit/Misc/guess.d new file mode 100755 index 000000000000..3ebcd39c2ec3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Misc/woof.d b/cddl/contrib/dtracetoolkit/Misc/woof.d new file mode 100755 index 000000000000..d856a09bc543 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Misc/wpm.d b/cddl/contrib/dtracetoolkit/Misc/wpm.d new file mode 100755 index 000000000000..7f3bff2d6fb6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Net/Readme b/cddl/contrib/dtracetoolkit/Net/Readme new file mode 100644 index 000000000000..3a53744ebe27 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Net/connections b/cddl/contrib/dtracetoolkit/Net/connections new file mode 100755 index 000000000000..523b880b14ce --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/connections @@ -0,0 +1,178 @@ +#!/usr/bin/ksh +# +# connections - print inbound TCP connections by process. +# Written in DTrace (Solaris 10 3/05). +# +# This displays the PID and command name of the processes accepting +# connections, along with the source IP address and destination port number. +# +# $Id: connections 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: connections [-htvZ] +# +# -t # print timestamps, us +# -v # print timestamps, string +# -Z # print zonename +# eg, +# connections -v # snoop connections with times +# +# FIELDS: +# UID user ID of the server +# PID process ID for the server +# CMD server command name +# TIME timestamp, us +# TIMESTR timestamp, string +# PORT server port +# IP_SOURCE source IP of the client, written in IPv4 style +# ZONE zonename +# +# SEE ALSO: snoop 'tcp[13:1] = 0x02' # snoop new connections +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# TODO: IPv6 +# +# 10-Apr-2004 Brendan Gregg Created this. +# 23-May-2004 " " Fixed issues on SPARC. +# 08-May-2005 " " Updated for newer Solaris 10. +# 17-Jun-2005 " " Rewrote, changed probes, wrapped in sh. +# 04-Dec-2005 " " Changed tcp_accept_finish -> sotpi_accept +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_time=0; opt_timestr=0; opt_zone=0 + +### Process options +while getopts htvZ name +do + case $name in + t) opt_time=1 ;; + v) opt_timestr=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: connections [-htvZ] + -t # print timestamps, us + -v # print timestamps, string + -Z # print zonename + eg, + connections -v # snoop connections with times + END + exit 1 + esac +done + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -C -s <( print -r ' +#include <sys/file.h> +#include <sys/types.h> +#include <sys/byteorder.h> +#include <sys/socket.h> +#include <sys/socketvar.h> + + #pragma D option quiet + #pragma D option switchrate=10hz + + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_zone = '$opt_zone'; + + /* + * Print header + */ + dtrace:::BEGIN + { + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "TIMESTR") : 1; + OPT_zone ? printf("%-10s ", "ZONE") : 1; + + /* print header */ + printf("%5s %5s %-12s %4s %5s %s\n", + "UID", "PID", "CMD", "TYPE", "PORT", "IP_SOURCE"); + } + + /* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ + fbt:sockfs:sotpi_accept:entry + /(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ + { + self->sop = args[0]; + } + + fbt:sockfs:sotpi_create:return + /self->sop/ + { + self->nsop = (struct sonode *)arg1; + } + + + /* + * Probe TCP connections + */ + fbt:sockfs:sotpi_accept:return + /self->nsop/ + { + /* fetch connection details */ + this->tcpp = (tcp_t *)self->nsop->so_priv; + this->connp = (conn_t *)this->tcpp->tcp_connp; + +#if defined(_BIG_ENDIAN) + this->port0 = this->connp->u_port.tcpu_ports.tcpu_lport; +#else + this->port0 = BSWAP_16(this->connp->u_port.tcpu_ports.tcpu_lport); +#endif + this->rem12 = + (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->rem13 = + (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->rem14 = + (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->rem15 = + (uint8_t)this->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%-10s ", zonename) : 1; + + /* print output line */ + printf("%5d %5d %-12s %4s %5d %d.%d.%d.%d\n", + uid, pid, execname, "tcp", this->port0, + this->rem12, this->rem13, this->rem14, this->rem15); + } + + fbt:sockfs:sotpi_accept:return + { + self->nsop = 0; + self->sop = 0; + } +') + diff --git a/cddl/contrib/dtracetoolkit/Net/icmpstat.d b/cddl/contrib/dtracetoolkit/Net/icmpstat.d new file mode 100755 index 000000000000..3df519999e33 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Net/tcpsnoop b/cddl/contrib/dtracetoolkit/Net/tcpsnoop new file mode 100755 index 000000000000..e06912de015c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpsnoop @@ -0,0 +1,581 @@ +#!/usr/bin/ksh +# +# tcpsnoop - snoop TCP network packets by process. +# Written using DTrace (Solaris 10 3/05) +# +# This analyses TCP network packets and prints the responsible PID and UID, +# plus standard details such as IP address and port. This captures traffic +# of newly created TCP connections that were established while this program +# was running. It can help identify which processes is causing TCP traffic. +# +# WARNING: This script may only work on Solaris 10 3/05, since it uses the +# fbt provider to trace the raw operation of a specific version of the kernel. +# In the future, a 'stable' network provider should exist which will allow +# this to be written for that and subsequent versions of the kernel. In the +# meantime, check for other versions of this script in the /Net directory, +# and read the Notes/ALLfbt_notes.txt for more background on fbt. +# +# $Id: tcpsnoop 69 2007-10-04 13:40:00Z brendan $ +# +# USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid] +# +# -a # print all data +# -j # print project ID +# -s # print time, us +# -v # print time, string +# -Z # print zone ID +# -n name # command name to snoop +# -p pid # PID to snoop +# eg, +# tcpsnoop -v # human readable timestamps +# tcpsnoop -Z # print zonename +# tcpsnoop -n sshd # snoop sshd traffic only +# +# FIELDS: +# UID user ID +# PID process ID +# CMD command +# LADDR local IP address +# RADDR remote IP address +# LPORT local port number +# RPORT remote port number +# DR direction +# SIZE packet size, bytes +# TIME timestamp, us +# STRTIME human readable timestamp, string +# ZONE zone ID +# PROJ project ID +# +# SEE ALSO: snoop -rS +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# TODO: IPv6 +# +# CODE: +# The FILTER syntax matches on packets rather than initial +# connections, so that it can follow inetd connections properly. +# +# 09-Jul-2004 Brendan Gregg Created this. +# 12-Mar-2005 " " Changed probes, size info now printed. +# 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d". +# 04-Jul-2005 " " Now wrapped in shell, called "tcpsnoop". +# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct +# execname. Thanks Kias Belgaied for expertise. +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# + +############################## +# --- Process Arguments --- +# + +### default variables +opt_name=0; opt_time=0; opt_timestr=0; filter=0; pname=. +opt_zone=0; opt_proj=0; opt_pid=0; pid=0 + +### process options +while getopts ahjsvZn:p: name +do + case $name in + a) opt_time=1; opt_timestr=1; opt_zone=1; opt_proj=1 ;; + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + j) opt_proj=1 ;; + s) opt_time=1 ;; + v) opt_timestr=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid] + tcpsnoop # default output + -a # print all data + -j # print project ID + -s # print start time, us + -v # print start time, string + -Z # print zonename + -n name # command name to snoop + -p pid # PID to snoop + eg, + tcpsnoop -v # human readable timestamps + tcpsnoop -Z # print zonename + tcpsnoop -n sshd # snoop sshd traffic only + END + exit 1 + esac +done + +### option logic +if (( opt_name || opt_pid )); then + filter=1 +fi + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -Cs <( print -r ' + /* + * Command line arguments + */ + inline int OPT_name = '$opt_name'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_proj = '$opt_proj'; + inline int PID = '$pid'; + inline int FILTER = '$filter'; + inline string NAME = "'$pname'"; + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include <sys/file.h> +#include <inet/common.h> +#include <sys/byteorder.h> +#include <sys/socket.h> +#include <sys/socketvar.h> + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "STRTIME") : 1; + OPT_zone ? printf("%4s ", "ZONE") : 1; + OPT_proj ? printf("%4s ", "PROJ") : 1; + + /* print main headers */ + printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n", + "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT", + "SIZE", "CMD"); +} + + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; + OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; + tproj[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +/FILTER == 0/ +{ + this->queuep = (queue_t *)`tcp_g_q; /* ` */ + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + self->zoneid = this->connp->conn_zoneid; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +/FILTER == 0/ +{ + self->name = "<closed>"; + self->pid = 0; + self->uid = 0; + self->proj = 0; + self->size = 54; /* should check trailers */ + self->dir = "<-"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->reset = 0; + self->size = 0; + self->name = 0; + self->zoneid = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "->"; + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "<-"; + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + self->dir = "->"; +} + +fbt:ip:tcp_connect:return +/(self->connp) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* this packet occured before connp was fully established */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + self->dir = "<-"; +} + +fbt:sockfs:sotpi_accept:return +/(self->connp) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* these packets occured before connp was fully established */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "<-"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * Print output + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/(self->ok == 2) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + + /* print output line */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->dir = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; + self->zoneid = 0; + self->proj = 0; +} +') diff --git a/cddl/contrib/dtracetoolkit/Net/tcpsnoop.d b/cddl/contrib/dtracetoolkit/Net/tcpsnoop.d new file mode 100755 index 000000000000..ca01864522aa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpsnoop.d @@ -0,0 +1,424 @@ +#!/usr/sbin/dtrace -Cs +/* + * tcpsnoop.d - snoop TCP network packets by process. + * Written using DTrace (Solaris 10 3/05) + * + * This analyses TCP network packets and prints the responsible PID and UID, + * plus standard details such as IP address and port. This captures traffic + * of newly created TCP connections that were established while this program + * was running. It can help identify which processes is causing TCP traffic. + * + * WARNING: This script may only work on Solaris 10 3/05, since it uses the + * fbt provider to trace the raw operation of a specific version of the kernel. + * In the future, a 'stable' network provider should exist which will allow + * this to be written for that and subsequent versions of the kernel. In the + * meantime, check for other versions of this script in the /Net directory, + * and read the Notes/ALLfbt_notes.txt for more background on fbt. + * + * $Id: tcpsnoop.d 69 2007-10-04 13:40:00Z brendan $ + * + * USAGE: tcpsnoop.d + * + * FIELDS: + * UID user ID + * PID process ID + * CMD command + * LADDR local IP address + * RADDR remote IP address + * LPORT local port number + * RPORT remote port number + * DR direction + * SIZE packet size, bytes + * + * SEE ALSO: snoop -rS + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * Author: Brendan Gregg [Sydney, Australia] + * + * TODO: IPv6 + * + * 09-Jul-2004 Brendan Gregg Created this. + * 12-Mar-2005 " " Changed probes, size info now printed. + * 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d". + * 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct + * execname. Thanks Kias Belgaied for expertise. + * 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include <sys/file.h> +#include <inet/common.h> +#include <sys/byteorder.h> + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* print main headers */ + printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n", + "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT", + "SIZE", "CMD"); +} + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +{ + this->queuep = (queue_t *)`tcp_g_q; /* ` */ + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +{ + self->name = "<closed>"; + self->pid = 0; + self->uid = 0; + self->size = 54; /* should check trailers */ + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->reset = 0; + self->size = 0; + self->name = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "->"; + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "<-"; + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->size = 54; /* should check trailers */ + self->dir = "->"; + /* this packet occured before connp was fully established */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->size = 54; /* should check trailers */ + /* these packets occured before connp was fully established */ + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * Print output + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/self->ok == 2/ +{ + /* print output line */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->dir = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv b/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv new file mode 100755 index 000000000000..85ebb6c898e2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv @@ -0,0 +1,583 @@ +#!/usr/bin/ksh +# +# tcpsnoop_snv - snoop TCP network packets by process. +# Written using DTrace (Solaris Nevada) +# +# This analyses TCP network packets and prints the responsible PID and UID, +# plus standard details such as IP address and port. This captures traffic +# of newly created TCP connections that were established while this program +# was running. It can help identify which processes is causing TCP traffic. +# +# WARNING: This script may only work on Solaris Nevada and OpenSolaris +# of the late 2007 vintage, since it uses the fbt provider to trace the raw +# operation of a specific version of the kernel. In the future, a 'stable' +# network provider should exist which will allow this to be written for that +# and subsequent versions of the kernel. In the meantime, check for other +# versions of this script in the /Net directory, and read the +# Notes/ALLfbt_notes.txt for more background on fbt. +# +# $Id: tcpsnoop_snv 69 2007-10-04 13:40:00Z brendan $ +# +# USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid] +# +# -a # print all data +# -j # print project ID +# -s # print time, us +# -v # print time, string +# -Z # print zone ID +# -n name # command name to snoop +# -p pid # PID to snoop +# eg, +# tcpsnoop -v # human readable timestamps +# tcpsnoop -Z # print zonename +# tcpsnoop -n sshd # snoop sshd traffic only +# +# FIELDS: +# UID user ID +# PID process ID +# CMD command +# LADDR local IP address +# RADDR remote IP address +# LPORT local port number +# RPORT remote port number +# DR direction +# SIZE packet size, bytes +# TIME timestamp, us +# STRTIME human readable timestamp, string +# ZONE zone ID +# PROJ project ID +# +# SEE ALSO: snoop -rS +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# TODO: IPv6 +# +# CODE: +# The FILTER syntax matches on packets rather than initial +# connections, so that it can follow inetd connections properly. +# +# 09-Jul-2004 Brendan Gregg Created this. +# 12-Mar-2005 " " Changed probes, size info now printed. +# 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d". +# 04-Jul-2005 " " Now wrapped in shell, called "tcpsnoop". +# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct +# execname. Thanks Kias Belgaied for expertise. +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada. +# + +############################## +# --- Process Arguments --- +# + +### default variables +opt_name=0; opt_time=0; opt_timestr=0; filter=0; pname=. +opt_zone=0; opt_proj=0; opt_pid=0; pid=0 + +### process options +while getopts ahjsvZn:p: name +do + case $name in + a) opt_time=1; opt_timestr=1; opt_zone=1; opt_proj=1 ;; + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + j) opt_proj=1 ;; + s) opt_time=1 ;; + v) opt_timestr=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: tcpsnoop [-a|hjsvZ] [-n name] [-p pid] + tcpsnoop # default output + -a # print all data + -j # print project ID + -s # print start time, us + -v # print start time, string + -Z # print zonename + -n name # command name to snoop + -p pid # PID to snoop + eg, + tcpsnoop -v # human readable timestamps + tcpsnoop -Z # print zonename + tcpsnoop -n sshd # snoop sshd traffic only + END + exit 1 + esac +done + +### option logic +if (( opt_name || opt_pid )); then + filter=1 +fi + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -Cs <( print -r ' + /* + * Command line arguments + */ + inline int OPT_name = '$opt_name'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_proj = '$opt_proj'; + inline int PID = '$pid'; + inline int FILTER = '$filter'; + inline string NAME = "'$pname'"; + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include <sys/file.h> +#include <inet/common.h> +#include <sys/byteorder.h> +#include <sys/socket.h> +#include <sys/socketvar.h> + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "STRTIME") : 1; + OPT_zone ? printf("%4s ", "ZONE") : 1; + OPT_proj ? printf("%4s ", "PROJ") : 1; + + /* print main headers */ + printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n", + "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT", + "SIZE", "CMD"); +} + + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; + OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; + tproj[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +/FILTER == 0/ +{ + this->queuep = args[7]->tcps_g_q; + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + self->zoneid = this->connp->conn_zoneid; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +/FILTER == 0/ +{ + self->name = "<closed>"; + self->pid = 0; + self->uid = 0; + self->proj = 0; + self->size = 54; /* should check trailers */ + self->dir = "<-"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->reset = 0; + self->size = 0; + self->name = 0; + self->zoneid = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "->"; + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "<-"; + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + self->dir = "->"; +} + +fbt:ip:tcp_connect:return +/(self->connp) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* this packet occured before connp was fully established */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + self->dir = "<-"; +} + +fbt:sockfs:sotpi_accept:return +/(self->connp) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* these packets occured before connp was fully established */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "<-"; + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * Print output + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/(self->ok == 2) && + ((FILTER == 0) || + (OPT_pid && self->pid == PID) || + (OPT_name && self->name == NAME))/ +{ + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%4d ", self->zoneid) : 1; + OPT_proj ? printf("%4d ", self->proj) : 1; + + /* print output line */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->dir = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; + self->zoneid = 0; + self->proj = 0; +} +') diff --git a/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv.d b/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv.d new file mode 100755 index 000000000000..b696f0e46619 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcpsnoop_snv.d @@ -0,0 +1,426 @@ +#!/usr/sbin/dtrace -Cs +/* + * tcpsnoop_snv.d - snoop TCP network packets by process. + * Written using DTrace (Solaris Nevada) + * + * This analyses TCP network packets and prints the responsible PID and UID, + * plus standard details such as IP address and port. This captures traffic + * of newly created TCP connections that were established while this program + * was running. It can help identify which processes is causing TCP traffic. + * + * WARNING: This script may only work on Solaris Nevada and OpenSolaris + * of the late 2007 vintage, since it uses the fbt provider to trace the raw + * operation of a specific version of the kernel. In the future, a 'stable' + * network provider should exist which will allow this to be written for that + * and subsequent versions of the kernel. In the meantime, check for other + * versions of this script in the /Net directory, and read the + * Notes/ALLfbt_notes.txt for more background on fbt. + * + * $Id: tcpsnoop_snv.d 69 2007-10-04 13:40:00Z brendan $ + * + * USAGE: tcpsnoop.d + * + * FIELDS: + * UID user ID + * PID process ID + * CMD command + * LADDR local IP address + * RADDR remote IP address + * LPORT local port number + * RPORT remote port number + * DR direction + * SIZE packet size, bytes + * + * SEE ALSO: snoop -rS + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * Author: Brendan Gregg [Sydney, Australia] + * + * TODO: IPv6 + * + * 09-Jul-2004 Brendan Gregg Created this. + * 12-Mar-2005 " " Changed probes, size info now printed. + * 02-Jul-2005 " " Many more probes. Renamed "tcpsnoop.d". + * 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct + * execname. Thanks Kias Belgaied for expertise. + * 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. + * 20-Apr-2006 " " Last update. + * 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada. + */ + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include <sys/file.h> +#include <inet/common.h> +#include <sys/byteorder.h> + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* print main headers */ + printf("%5s %6s %-15s %5s %2s %-15s %5s %5s %s\n", + "UID", "PID", "LADDR", "LPORT", "DR", "RADDR", "RPORT", + "SIZE", "CMD"); +} + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +{ + this->queuep = args[7]->tcps_g_q; + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +{ + self->name = "<closed>"; + self->pid = 0; + self->uid = 0; + self->size = 54; /* should check trailers */ + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->reset = 0; + self->size = 0; + self->name = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "->"; + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->dir = "<-"; + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->size = 54; /* should check trailers */ + self->dir = "->"; + /* this packet occured before connp was fully established */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->size = 54; /* should check trailers */ + /* these packets occured before connp was fully established */ + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "->"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); + self->dir = "<-"; + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * Print output + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/self->ok == 2/ +{ + /* print output line */ + printf("%5d %6d %-15s %5d %2s %-15s %5d %5d %s\n", + self->uid, self->pid, self->laddr, self->lport, self->dir, + self->faddr, self->fport, self->size, self->name); +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->dir = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; +} diff --git a/cddl/contrib/dtracetoolkit/Net/tcpstat.d b/cddl/contrib/dtracetoolkit/Net/tcpstat.d new file mode 100755 index 000000000000..1fe40040c6d1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Net/tcptop b/cddl/contrib/dtracetoolkit/Net/tcptop new file mode 100755 index 000000000000..70b6e6f3176e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcptop @@ -0,0 +1,579 @@ +#!/usr/bin/ksh +# +# tcptop - display top TCP network packets by process. +# Written using DTrace (Solaris 10 3/05) +# +# This analyses TCP network packets and prints the responsible PID and UID, +# plus standard details such as IP address and port. This captures traffic +# of newly created TCP connections that were established while this program +# was running. It can help identify which processes is causing TCP traffic. +# +# WARNING: This script may only work on Solaris 10 3/05, since it uses the +# fbt provider to trace the raw operation of a specific version of the kernel. +# In the future, a 'stable' network provider should exist which will allow +# this to be written for that and subsequent versions of the kernel. In the +# meantime, check for other versions of this script in the /Net directory, +# and read the Notes/ALLfbt_notes.txt for more background on fbt. +# +# $Id: tcptop 69 2007-10-04 13:40:00Z brendan $ +# +# USAGE: tcptop [-Ch] [-j|-Z] [interval [count]] +# +# -C # don't clear the screen +# -j # print project IDs +# -Z # print zone IDs +# +# FIELDS: +# UID user ID +# PID process ID +# CMD command +# LADDR local IP address +# RADDR remote IP address +# LPORT local port number +# RPORT remote port number +# SIZE packet size, bytes +# load 1 min load average +# TCPin TCP inbound payload data +# TCPout TCP outbound payload data +# ZONE zone ID +# PROJ project ID +# +# SEE ALSO: tcpsnoop +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# ToDo: IPv6 +# +# 05-Jul-2005 Brendan Gregg Created this. +# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct +# execname. Thanks Kias Belgaied for expertise. +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# + +############################## +# --- Process Arguments --- +# + +### default variables +opt_def=1; opt_clear=1; opt_zone=0; opt_proj=0; interval=5; count=-1 + +### process options +while getopts ChjZ name +do + case $name in + C) opt_clear=0 ;; + j) opt_proj=1; opt_def=0 ;; + Z) opt_zone=1; opt_def=0 ;; + h|?) cat <<-END >&2 + USAGE: tcptop [-h] [-j|-Z] [interval [count]] + tcptop # default output + -C # don't clear the screen + -j # print project ID + -Z # print zonename + eg, + tcptop # default is 5 sec interval + tcptop 2 # 2 second interval + tcptop -C 1 10 # 10 x 1 sec samples, no clear + END + exit 1 + esac +done +shift $(( $OPTIND - 1 )) + +### option logic +if [[ "$1" > 0 ]]; then + interval=$1; shift +fi +if [[ "$1" > 0 ]]; then + count=$1; shift +fi +if (( opt_proj && opt_zone )); then + opt_proj=0 +fi +if (( opt_clear )); then + clearstr=`clear` +else + clearstr=. +fi + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -Cs <( print -r ' + /* + * Command line arguments + */ + inline int OPT_def = '$opt_def'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_proj = '$opt_proj'; + inline int OPT_clear = '$opt_clear'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline string CLEAR = "'$clearstr'"; + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include <sys/file.h> +#include <inet/common.h> +#include <sys/byteorder.h> +#include <sys/socket.h> +#include <sys/socketvar.h> + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* starting values */ + counts = COUNTER; + secs = INTERVAL; + TCP_out = 0; + TCP_in = 0; + + printf("Tracing... Please wait.\n"); +} + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; + OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; + tproj[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +{ + this->queuep = (queue_t *)`tcp_g_q; /* ` */ + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + self->zoneid = this->connp->conn_zoneid; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +{ + self->name = "<closed>"; + self->pid = 0; + self->uid = 0; + self->proj = 0; + self->size = 54 * 2; /* should check trailers */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + self->reset = 0; + self->size = 0; + self->name = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + + /* this packet occured before connp was fully established */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54 * 3; /* should check trailers */ + + /* these packets occured before connp was fully established */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Save data + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/self->ok == 2/ +{ + /* save r+w data*/ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; + self->zoneid = 0; + self->proj = 0; +} + +/* + * TCP Systemwide Stats + */ +mib:::tcpOutDataBytes { TCP_out += args[0]; } +mib:::tcpRetransBytes { TCP_out += args[0]; } +mib:::tcpInDataInorderBytes { TCP_in += args[0]; } +mib:::tcpInDataDupBytes { TCP_in += args[0]; } +mib:::tcpInDataUnorderBytes { TCP_in += args[0]; } + +/* + * Timer + */ +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Report + */ +profile:::tick-1sec +/secs == 0/ +{ + /* fetch 1 min load average */ + this->load1a = `hp_avenrun[0] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + + /* convert TCP counters to Kbytes */ + TCP_out /= 1024; + TCP_in /= 1024; + + /* print status */ + OPT_clear ? printf("%s", CLEAR) : 1; + printf("%Y, load: %d.%02d, TCPin: %6d KB, TCPout: %6d KB\n\n", + walltimestamp, this->load1a, this->load1b, TCP_in, TCP_out); + + /* print headers */ + OPT_def ? printf(" UID ") : 1; + OPT_proj ? printf("PROJ ") : 1; + OPT_zone ? printf("ZONE ") : 1; + printf("%6s %-15s %5s %-15s %5s %9s %s\n", + "PID", "LADDR", "LPORT", "RADDR", "RPORT", "SIZE", "NAME"); + + /* print data */ + printa("%4d %6d %-15s %5d %-15s %5d %@9d %s\n", @out); + printf("\n"); + + /* clear data */ + trunc(@out); + TCP_in = 0; + TCP_out = 0; + secs = INTERVAL; + counts--; +} + +/* + * End of program + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} + +/* + * Cleanup for Ctrl-C + */ +dtrace:::END +{ + trunc(@out); +} +') diff --git a/cddl/contrib/dtracetoolkit/Net/tcptop_snv b/cddl/contrib/dtracetoolkit/Net/tcptop_snv new file mode 100755 index 000000000000..56714e3c01f4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Net/tcptop_snv @@ -0,0 +1,581 @@ +#!/usr/bin/ksh +# +# tcptop_snv - display top TCP network packets by process. +# Written using DTrace (Solaris Nevada) +# +# This analyses TCP network packets and prints the responsible PID and UID, +# plus standard details such as IP address and port. This captures traffic +# of newly created TCP connections that were established while this program +# was running. It can help identify which processes is causing TCP traffic. +# +# WARNING: This script may only work on Solaris Nevada and OpenSolaris +# of the late 2007 vintage, since it uses the fbt provider to trace the raw +# operation of a specific version of the kernel. In the future, a 'stable' +# network provider should exist which will allow this to be written for that +# and subsequent versions of the kernel. In the meantime, check for other +# versions of this script in the /Net directory, and read the +# Notes/ALLfbt_notes.txt for more background on fbt. +# +# $Id: tcptop_snv 69 2007-10-04 13:40:00Z brendan $ +# +# USAGE: tcptop [-Ch] [-j|-Z] [interval [count]] +# +# -C # don't clear the screen +# -j # print project IDs +# -Z # print zone IDs +# +# FIELDS: +# UID user ID +# PID process ID +# CMD command +# LADDR local IP address +# RADDR remote IP address +# LPORT local port number +# RPORT remote port number +# SIZE packet size, bytes +# load 1 min load average +# TCPin TCP inbound payload data +# TCPout TCP outbound payload data +# ZONE zone ID +# PROJ project ID +# +# SEE ALSO: tcpsnoop +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# ToDo: IPv6 +# +# 05-Jul-2005 Brendan Gregg Created this. +# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct +# execname. Thanks Kias Belgaied for expertise. +# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. +# 20-Apr-2006 " " Last update. +# 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada. +# + +############################## +# --- Process Arguments --- +# + +### default variables +opt_def=1; opt_clear=1; opt_zone=0; opt_proj=0; interval=5; count=-1 + +### process options +while getopts ChjZ name +do + case $name in + C) opt_clear=0 ;; + j) opt_proj=1; opt_def=0 ;; + Z) opt_zone=1; opt_def=0 ;; + h|?) cat <<-END >&2 + USAGE: tcptop [-h] [-j|-Z] [interval [count]] + tcptop # default output + -C # don't clear the screen + -j # print project ID + -Z # print zonename + eg, + tcptop # default is 5 sec interval + tcptop 2 # 2 second interval + tcptop -C 1 10 # 10 x 1 sec samples, no clear + END + exit 1 + esac +done +shift $(( $OPTIND - 1 )) + +### option logic +if [[ "$1" > 0 ]]; then + interval=$1; shift +fi +if [[ "$1" > 0 ]]; then + count=$1; shift +fi +if (( opt_proj && opt_zone )); then + opt_proj=0 +fi +if (( opt_clear )); then + clearstr=`clear` +else + clearstr=. +fi + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -Cs <( print -r ' + /* + * Command line arguments + */ + inline int OPT_def = '$opt_def'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_proj = '$opt_proj'; + inline int OPT_clear = '$opt_clear'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + inline string CLEAR = "'$clearstr'"; + +#pragma D option quiet +#pragma D option switchrate=10hz + +#include <sys/file.h> +#include <inet/common.h> +#include <sys/byteorder.h> +#include <sys/socket.h> +#include <sys/socketvar.h> + +/* + * Print header + */ +dtrace:::BEGIN +{ + /* starting values */ + counts = COUNTER; + secs = INTERVAL; + TCP_out = 0; + TCP_in = 0; + + printf("Tracing... Please wait.\n"); +} + +/* + * TCP Process inbound connections + * + * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was + * renamed to SS_DIRECT around build 31. + */ +fbt:sockfs:sotpi_accept:entry +/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ +{ + self->sop = args[0]; +} + +fbt:sockfs:sotpi_create:return +/self->sop/ +{ + self->nsop = (struct sonode *)arg1; +} + +fbt:sockfs:sotpi_accept:return +/self->nsop/ +{ + this->tcpp = (tcp_t *)self->nsop->so_priv; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; +} + +fbt:sockfs:sotpi_accept:return +{ + self->nsop = 0; + self->sop = 0; +} + +/* + * TCP Process outbound connections + */ +fbt:ip:tcp_connect:entry +{ + this->tcpp = (tcp_t *)arg0; + self->connp = (conn_t *)this->tcpp->tcp_connp; + tname[(int)self->connp] = execname; + tpid[(int)self->connp] = pid; + tuid[(int)self->connp] = uid; + OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1; +} + +/* + * TCP Data translations + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + /* fetch ports */ +#if defined(_BIG_ENDIAN) + self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; + self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; +#else + self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); + self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); +#endif + + /* fetch IPv4 addresses */ + this->fad12 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; + this->fad13 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; + this->fad14 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; + this->fad15 = + (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; + this->lad12 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; + this->lad13 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; + this->lad14 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; + this->lad15 = + (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; + + /* convert type for use with lltostr() */ + this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; + this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; + this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; + this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; + this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; + this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; + this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; + this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + /* fix direction and save values */ + tladdr[(int)self->connp] = self->laddr; + tfaddr[(int)self->connp] = self->faddr; + tlport[(int)self->connp] = self->lport; + tfport[(int)self->connp] = self->fport; + + /* all systems go */ + tok[(int)self->connp] = 1; +} + +/* + * TCP Clear connp + */ +fbt:ip:tcp_get_conn:return +{ + /* Q_TO_CONN */ + this->connp = (conn_t *)arg1; + tok[(int)this->connp] = 0; + tpid[(int)this->connp] = 0; + tuid[(int)this->connp] = 0; + tname[(int)this->connp] = 0; + tproj[(int)this->connp] = 0; +} + +/* + * TCP Process "port closed" + */ +fbt:ip:tcp_xmit_early_reset:entry +{ + this->queuep = args[7]->tcps_g_q; + this->connp = (conn_t *)this->queuep->q_ptr; + this->tcpp = (tcp_t *)this->connp->conn_tcp; + self->zoneid = this->connp->conn_zoneid; + + /* split addresses */ + this->ipha = (ipha_t *)args[1]->b_rptr; + this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; + this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; + this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; + this->fad12 = (this->ipha->ipha_src & 0x000000ff); + this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; + this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; + this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; + this->lad12 = (this->ipha->ipha_dst & 0x000000ff); + + /* stringify addresses */ + self->faddr = strjoin(lltostr(this->fad12), "."); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); + self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); + self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); + self->laddr = strjoin(lltostr(this->lad12), "."); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); + self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); + self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); + + self->reset = 1; +} + +/* + * TCP Fetch "port closed" ports + */ +fbt:ip:tcp_xchg:entry +/self->reset/ +{ +#if defined(_BIG_ENDIAN) + self->lport = (uint16_t)arg0; + self->fport = (uint16_t)arg1; +#else + self->lport = BSWAP_16((uint16_t)arg0); + self->fport = BSWAP_16((uint16_t)arg1); +#endif + self->lport = BE16_TO_U16(arg0); + self->fport = BE16_TO_U16(arg1); +} + +/* + * TCP Print "port closed" + */ +fbt:ip:tcp_xmit_early_reset:return +{ + self->name = "<closed>"; + self->pid = 0; + self->uid = 0; + self->proj = 0; + self->size = 54 * 2; /* should check trailers */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + self->reset = 0; + self->size = 0; + self->name = 0; +} + +/* + * TCP Process Write + */ +fbt:ip:tcp_send_data:entry +{ + self->conn_p = (conn_t *)args[0]->tcp_connp; +} + +fbt:ip:tcp_send_data:entry +/tok[(int)self->conn_p]/ +{ + self->size = msgdsize(args[2]) + 14; /* should check trailers */ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Process Read + */ +fbt:ip:tcp_rput_data:entry +{ + self->conn_p = (conn_t *)arg0; + self->size = msgdsize(args[1]) + 14; /* should check trailers */ +} + +fbt:ip:tcp_rput_data:entry +/tok[(int)self->conn_p]/ +{ + self->uid = tuid[(int)self->conn_p]; + self->laddr = tladdr[(int)self->conn_p]; + self->faddr = tfaddr[(int)self->conn_p]; + self->lport = tlport[(int)self->conn_p]; + self->fport = tfport[(int)self->conn_p]; + OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; + self->zoneid = self->conn_p->conn_zoneid; + self->ok = 2; + + /* follow inetd -> in.* transitions */ + self->name = pid && (tname[(int)self->conn_p] == "inetd") ? + execname : tname[(int)self->conn_p]; + self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? + pid : tpid[(int)self->conn_p]; + tname[(int)self->conn_p] = self->name; + tpid[(int)self->conn_p] = self->pid; +} + +/* + * TCP Complete printing outbound handshake + */ +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54; /* should check trailers */ + + /* this packet occured before connp was fully established */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Complete printing inbound handshake + */ +fbt:sockfs:sotpi_accept:return +/self->connp/ +{ + self->name = tname[(int)self->connp]; + self->pid = tpid[(int)self->connp]; + self->uid = tuid[(int)self->connp]; + self->zoneid = self->connp->conn_zoneid; + OPT_proj ? self->proj = tproj[(int)self->connp] : 1; + self->size = 54 * 3; /* should check trailers */ + + /* these packets occured before connp was fully established */ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Save data + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +/self->ok == 2/ +{ + /* save r+w data*/ + OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; + OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, + self->faddr, self->fport, self->name] = sum(self->size) : 1; +} + +/* + * TCP Clear connect variables + */ +fbt:sockfs:sotpi_accept:return, +fbt:ip:tcp_connect:return +/self->connp/ +{ + self->faddr = 0; + self->laddr = 0; + self->fport = 0; + self->lport = 0; + self->connp = 0; + self->name = 0; + self->pid = 0; + self->uid = 0; +} + +/* + * TCP Clear r/w variables + */ +fbt:ip:tcp_send_data:entry, +fbt:ip:tcp_rput_data:entry +{ + self->ok = 0; + self->uid = 0; + self->pid = 0; + self->size = 0; + self->name = 0; + self->lport = 0; + self->fport = 0; + self->laddr = 0; + self->faddr = 0; + self->conn_p = 0; + self->zoneid = 0; + self->proj = 0; +} + +/* + * TCP Systemwide Stats + */ +mib:::tcpOutDataBytes { TCP_out += args[0]; } +mib:::tcpRetransBytes { TCP_out += args[0]; } +mib:::tcpInDataInorderBytes { TCP_in += args[0]; } +mib:::tcpInDataDupBytes { TCP_in += args[0]; } +mib:::tcpInDataUnorderBytes { TCP_in += args[0]; } + +/* + * Timer + */ +profile:::tick-1sec +{ + secs--; +} + +/* + * Print Report + */ +profile:::tick-1sec +/secs == 0/ +{ + /* fetch 1 min load average */ + this->load1a = `hp_avenrun[0] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + + /* convert TCP counters to Kbytes */ + TCP_out /= 1024; + TCP_in /= 1024; + + /* print status */ + OPT_clear ? printf("%s", CLEAR) : 1; + printf("%Y, load: %d.%02d, TCPin: %6d KB, TCPout: %6d KB\n\n", + walltimestamp, this->load1a, this->load1b, TCP_in, TCP_out); + + /* print headers */ + OPT_def ? printf(" UID ") : 1; + OPT_proj ? printf("PROJ ") : 1; + OPT_zone ? printf("ZONE ") : 1; + printf("%6s %-15s %5s %-15s %5s %9s %s\n", + "PID", "LADDR", "LPORT", "RADDR", "RPORT", "SIZE", "NAME"); + + /* print data */ + printa("%4d %6d %-15s %5d %-15s %5d %@9d %s\n", @out); + printf("\n"); + + /* clear data */ + trunc(@out); + TCP_in = 0; + TCP_out = 0; + secs = INTERVAL; + counts--; +} + +/* + * End of program + */ +profile:::tick-1sec +/counts == 0/ +{ + exit(0); +} + +/* + * Cleanup for Ctrl-C + */ +dtrace:::END +{ + trunc(@out); +} +') diff --git a/cddl/contrib/dtracetoolkit/Net/tcpwdist.d b/cddl/contrib/dtracetoolkit/Net/tcpwdist.d new file mode 100755 index 000000000000..20753c182f60 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Net/udpstat.d b/cddl/contrib/dtracetoolkit/Net/udpstat.d new file mode 100755 index 000000000000..7b27e4ec0b89 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/ALLcolors_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLcolors_notes.txt new file mode 100644 index 000000000000..bed6f9509b67 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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 [30mcolor test[0m [30;40mcolor test[0m + red [31mcolor test[0m [31;40mcolor test[0m + green [32mcolor test[0m [32;40mcolor test[0m + yellow [33mcolor test[0m [33;40mcolor test[0m + blue [34mcolor test[0m [34;40mcolor test[0m + magenta [35mcolor test[0m [35;40mcolor test[0m + cyan [36mcolor test[0m [36;40mcolor test[0m + white [37mcolor test[0m [37;40mcolor test[0m + +and now for a test of attributes: + + Color Bold Faint + --------------------------------------------------------- + black [1;30mcolor test[0m [2;30mcolor test[0m + red [1;31mcolor test[0m [2;31mcolor test[0m + green [1;32mcolor test[0m [2;32mcolor test[0m + yellow [1;33mcolor test[0m [2;33mcolor test[0m + blue [1;34mcolor test[0m [2;34mcolor test[0m + magenta [1;35mcolor test[0m [2;35mcolor test[0m + cyan [1;36mcolor test[0m [2;36mcolor test[0m + white [1;37mcolor test[0m [2;37mcolor test[0m + + +* Why so much green and violet in the toolkit scripts? + +As DTrace can examine the entire software stack, it is conceivable that +your script could print events from many different layers each with their +own color. Color scripts in the DTraceToolkit generally start by tracing +two layers, with extra layers added by the end user as needed (you). The +general plan is: + + Software Layer Example Provider Color + ------------------------------------------------------- + Dynamic Language perl violet + User Library pid:libperl blue + OS Library pid:libc cyan + System Calls syscall green + Kernel and Drivers fbt red + +How these colors will look will depend on your terminal software. Useful +variations can be made, for example using red/bold for kernel abstraction +providers (io, vminfo, ...); and red/faint for raw kernel tracing (fbt). + +The color examples in this toolkit usually trace the syscall and dynamic +language layers, hense the green and violet. + + +* I don't like the choosen terminal colors / your colors suck + +It should be easy to customize them by tweaking the script. I've tried +to use the following convention for declaring colors in D scripts: + + dtrace:::BEGIN + { + color_shell = "\033[2;35m"; /* violet, faint */ + color_line = "\033[1;35m"; /* violet, bold */ + color_syscall = "\033[2;32m"; /* green, faint */ + color_off = "\033[0m"; /* default */ + } + +That way, printf() statements can print these string variables to turn +on and off colors, as needed. These strings contain an escape sequence to +inform your terminal software to change the output color. Customizations +can be made by tweaking the variables; refer to documentation for your +terminal software to see what numbers will print what colors. + +For my terminal (dtterm), the numbers are (from dtterm(5)): + + Attributes + + 1 bold + 2 faint + + Forground colors + + 30 black + 31 red + 32 green + 33 yellow + 34 blue + 35 magenta + 36 cyan + 37 white + + Background colors + + 40 black + 41 red + ... etc, as above + + +* I'd like to use this colored output on a website. + +The easiest way would be to change the script to output HTML rather than +escape sequences. eg: + + dtrace:::BEGIN + { + color_shell = "<font color=\"#FFAAFF\">"; /* violet, faint */ + color_line = "<font color=\"#FF44FF\">"; /* violet, bold */ + color_syscall = "<font color=\"#44CC44\">"; /* green, faint */ + color_off = "</font>"; /* default */ + } + +Other tweaks can be made to either print the output in a <pre> tagged block; +or as seperate lines ending in <br> along with changing the font to be +fixed width. + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLelapsed_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLelapsed_notes.txt new file mode 100644 index 000000000000..9e8f314feae2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLelapsed_notes.txt @@ -0,0 +1,46 @@ +************************************************************************** +* The following are notes for all scripts that measure elapsed time. +* +* $Id: ALLelapsed_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* What is "elapsed" time? + +Elapsed time is the absolute time from one point to another. This time +includes everything that happened between these points, including +off-CPU time due to other system events such as I/O, scheduling, +interrupts, etc. It also includes the small overheads of DTrace itself. + +Elapsed times are useful for identifying where latencies are, since +regardless of their nature (CPU, I/O, ...), they will be visible in +elapsed time. + +Since elapsed times don't filter out anything, they are suseptible to +"noise" - random system events that are unrelated to the analysis target. +For that reason, it may be best to take several measurements of elapsed +time and take the average (or run your workload several times and let +DTrace take the average). + +See Notes/ALLoncpu_notes.txt for a description of a different time +measurement, "on-CPU" time. + + +* How is "elapsed" time measured? + +In DTrace, the following template provides elapsed time as "this->elapsed", + + <start-probe> + { + self->start = timestamp; + } + + <end-probe> + { + this->elapsed = timestamp - self->start; + self->start = 0; + ... + } + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLexclusive_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLexclusive_notes.txt new file mode 100644 index 000000000000..7aeb9ffde84c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/ALLfbt_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLfbt_notes.txt new file mode 100644 index 000000000000..ef5f2b8eff3e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/ALLflow_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLflow_notes.txt new file mode 100644 index 000000000000..4571491d467e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/ALLinclusive_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLinclusive_notes.txt new file mode 100644 index 000000000000..eea4b5d88d9e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/ALLjava_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLjava_notes.txt new file mode 100644 index 000000000000..2d033c18a822 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/ALLoncpu_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLoncpu_notes.txt new file mode 100644 index 000000000000..41aead027bc9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLoncpu_notes.txt @@ -0,0 +1,42 @@ +************************************************************************** +* The following are notes for all scripts that measure on-CPU times. +* +* $Id: ALLoncpu_notes.txt 58 2007-10-01 13:36:29Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* What is "on-CPU" time? + +This is the time that a thread spent running on a CPU. It does not include +time spent off-CPU time such as sleeping for I/O or waiting for scheduling. + +On-CPU times are useful for showing who is causing the CPUs to be busy, +since they measure how much CPU time has been consumed by that thread. + +On-CPU times are also less susceptible to system "noise" than elapsed times, +since much of the noise will be filtered out. DTrace itself also tries +to subtract the small overheads of DTrace from the on-CPU time, to improve +the accuracy of this time. + +See Notes/ALLelapsed_notes.txt for a description of a different time +measurement, "elapsed" time. + + +* How is "on-CPU" time measured? + +In DTrace, the following template provides on-CPU time as "this->oncpu", + + <start-probe> + { + self->vstart = vtimestamp; + } + + <end-probe> + { + this->oncpu = vtimestamp - self->vstart; + self->vstart = 0; + ... + } + diff --git a/cddl/contrib/dtracetoolkit/Notes/ALLoverhead.txt b/cddl/contrib/dtracetoolkit/Notes/ALLoverhead.txt new file mode 100644 index 000000000000..844b3c08c1d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/ALLperl_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLperl_notes.txt new file mode 100644 index 000000000000..24039504f698 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/ALLsnoop_notes.txt b/cddl/contrib/dtracetoolkit/Notes/ALLsnoop_notes.txt new file mode 100644 index 000000000000..b43c70a1aefe --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Notes/ALLsnoop_notes.txt @@ -0,0 +1,94 @@ +************************************************************************** +* The following are additional notes on ALL of the *snoop programs (such as +* execsnoop, iosnoop, ..., and dapptrace, dtruss). +* +* $Id: ALLsnoop_notes.txt 44 2007-09-17 07:47:20Z brendan $ +* +* COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +************************************************************************** + + +* The output seems shuffled? + +Beware - due to the (current) way DTrace works, on multi-CPU systems there +is no guarentee that if you print traced events the output is in the same +order that the events occured. + +This is because events details are placed in kernel per-CPU buffers, and then +dumped in sequence by the DTrace consumer (/usr/sbin/dtrace) whenever it +wakes up ("switchrate" tunable). The DTrace consumer reads and prints the +buffers one by one, it doesn't combine them and sort them. + +To demonstrate this, + + # dtrace -n 'profile:::profile-3hz { trace(timestamp); }' + dtrace: description 'profile-3hz ' matched 1 probe + CPU ID FUNCTION:NAME + 0 41241 :profile-3hz 1898015274778547 + 0 41241 :profile-3hz 1898015608118262 + 0 41241 :profile-3hz 1898015941430060 + 1 41241 :profile-3hz 1898015275499014 + 1 41241 :profile-3hz 1898015609173485 + 1 41241 :profile-3hz 1898015942505828 + 2 41241 :profile-3hz 1898015275351257 + 2 41241 :profile-3hz 1898015609180861 + 2 41241 :profile-3hz 1898015942512708 + 3 41241 :profile-3hz 1898015274803528 + 3 41241 :profile-3hz 1898015608120522 + 3 41241 :profile-3hz 1898015941449884 + ^C + +If you read the timestamps carefully, you'll see that they aren't quite +in chronological order. If you look at the CPU column while reading the +timestamps, the way DTrace works should become clear. + +Most of the snoop tools have a switchrate of 10hz, so events may be shuffled +within a tenth of a second - not hugely noticable. + +This isn't really a problem anyway. If you must have the output in the correct +order, find the switch that prints timestamps and then sort the output. +As an example, + + # iosnoop -t > out.iosnoop + ^C + # sort -n out.iosnoop + + TIME UID PID D BLOCK SIZE COMM PATHNAME + 183710958520 0 3058 W 10507848 4096 sync /var/log/pool/poold + 183710990358 0 3058 W 6584858 1024 sync /etc/motd + 183711013469 0 3058 W 60655 9216 sync <none> + 183711020149 0 3058 W 60673 1024 sync <none> + +All shell-wrapped scripts should have some way to print timestamps, and +many DTrace-only scripts print timestamps by default. If you find a script +that doesn't print timestamps, it should be trivial for you to add an +extra column. + +To add a microsecond-since-boot time column to a script, try adding this +before every printf() you find, + + printf("%-16d ", timestamp / 1000); + +except for the header line, where you can add this, + + printf("%-16s ", "TIME(us)"); + +Now you will be able to post sort the script output on the TIME(us) column. + +In practise, I find post sorting the output a little annoying at times, +and use a couple of other ways to prevent shuffling from happening in the +first place: + +- offline all CPUs but one when running flow scripts. Naturally, you + probably don't want to do this on production servers, this is a trick + that may be handy for when developing on workstations or laptops. Bear + in mind that if you are trying to DTrace certain issues, such as + multi-thread locking contention, then offlining most CPUs may eliminate + the issue you are trying to observe. +- pbind the target process of interest to a single CPU. Most OSes provide + a way to glue a process to a single CPU; Solaris has both pbind and psrset. + +Another way to solve this problem would be to enhance DTrace to always print +in-order output. Maybe this will be done one day; maybe by the time you +are reading this it has already been done? + diff --git a/cddl/contrib/dtracetoolkit/Notes/Readme b/cddl/contrib/dtracetoolkit/Notes/Readme new file mode 100644 index 000000000000..99a1807e087e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/cputimes_notes.txt b/cddl/contrib/dtracetoolkit/Notes/cputimes_notes.txt new file mode 100644 index 000000000000..cdf7ecdac5a6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/dappprof_notes.txt b/cddl/contrib/dtracetoolkit/Notes/dappprof_notes.txt new file mode 100644 index 000000000000..d617f2aeabaa --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/dapptrace_notes.txt b/cddl/contrib/dtracetoolkit/Notes/dapptrace_notes.txt new file mode 100644 index 000000000000..579c2dfd8c01 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/dtruss_notes.txt b/cddl/contrib/dtracetoolkit/Notes/dtruss_notes.txt new file mode 100644 index 000000000000..8ecbecf864bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/iosnoop_notes.txt b/cddl/contrib/dtracetoolkit/Notes/iosnoop_notes.txt new file mode 100644 index 000000000000..af3ab9bbbe20 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/iotop_notes.txt b/cddl/contrib/dtracetoolkit/Notes/iotop_notes.txt new file mode 100644 index 000000000000..9663ec7b5498 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Notes/procsystime_notes.txt b/cddl/contrib/dtracetoolkit/Notes/procsystime_notes.txt new file mode 100644 index 000000000000..5e1c52f4e52c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/Readme b/cddl/contrib/dtracetoolkit/Perl/Readme new file mode 100644 index 000000000000..36fcab5e5232 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_calldist.d b/cddl/contrib/dtracetoolkit/Perl/pl_calldist.d new file mode 100755 index 000000000000..a4bd2da68bbc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_calltime.d b/cddl/contrib/dtracetoolkit/Perl/pl_calltime.d new file mode 100755 index 000000000000..0bf180420dd6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_cpudist.d b/cddl/contrib/dtracetoolkit/Perl/pl_cpudist.d new file mode 100755 index 000000000000..94c421f436ce --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_cputime.d b/cddl/contrib/dtracetoolkit/Perl/pl_cputime.d new file mode 100755 index 000000000000..150f204210a7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_flow.d b/cddl/contrib/dtracetoolkit/Perl/pl_flow.d new file mode 100755 index 000000000000..7948db2bfd35 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_flowinfo.d b/cddl/contrib/dtracetoolkit/Perl/pl_flowinfo.d new file mode 100755 index 000000000000..06769fdb9cd7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_flowtime.d b/cddl/contrib/dtracetoolkit/Perl/pl_flowtime.d new file mode 100755 index 000000000000..1fa727cec769 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_malloc.d b/cddl/contrib/dtracetoolkit/Perl/pl_malloc.d new file mode 100755 index 000000000000..b71e7652d3d2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_subcalls.d b/cddl/contrib/dtracetoolkit/Perl/pl_subcalls.d new file mode 100755 index 000000000000..30d922fc1ad6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_syscalls.d b/cddl/contrib/dtracetoolkit/Perl/pl_syscalls.d new file mode 100755 index 000000000000..9c5a7651e86a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_syscolors.d b/cddl/contrib/dtracetoolkit/Perl/pl_syscolors.d new file mode 100755 index 000000000000..ec689f23337f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Perl/pl_who.d b/cddl/contrib/dtracetoolkit/Perl/pl_who.d new file mode 100755 index 000000000000..a461311816d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/Readme b/cddl/contrib/dtracetoolkit/Php/Readme new file mode 100644 index 000000000000..5c9101f227df --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_calldist.d b/cddl/contrib/dtracetoolkit/Php/php_calldist.d new file mode 100755 index 000000000000..7a1b19e3e3f4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_calltime.d b/cddl/contrib/dtracetoolkit/Php/php_calltime.d new file mode 100755 index 000000000000..dcb708c7ab91 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_cpudist.d b/cddl/contrib/dtracetoolkit/Php/php_cpudist.d new file mode 100755 index 000000000000..e10566c73cf8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_cputime.d b/cddl/contrib/dtracetoolkit/Php/php_cputime.d new file mode 100755 index 000000000000..856d5516f2f6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_flow.d b/cddl/contrib/dtracetoolkit/Php/php_flow.d new file mode 100755 index 000000000000..49472eacf820 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_flowinfo.d b/cddl/contrib/dtracetoolkit/Php/php_flowinfo.d new file mode 100755 index 000000000000..e537574920ff --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_flowtime.d b/cddl/contrib/dtracetoolkit/Php/php_flowtime.d new file mode 100755 index 000000000000..cadb66ad120a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_funccalls.d b/cddl/contrib/dtracetoolkit/Php/php_funccalls.d new file mode 100755 index 000000000000..8a0ddcef43b6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_malloc.d b/cddl/contrib/dtracetoolkit/Php/php_malloc.d new file mode 100755 index 000000000000..1ebab26ac201 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_syscalls.d b/cddl/contrib/dtracetoolkit/Php/php_syscalls.d new file mode 100755 index 000000000000..7917c24d94ec --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_syscolors.d b/cddl/contrib/dtracetoolkit/Php/php_syscolors.d new file mode 100755 index 000000000000..ff5e9c957903 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Php/php_who.d b/cddl/contrib/dtracetoolkit/Php/php_who.d new file mode 100755 index 000000000000..2ebb4b425f2a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/Readme b/cddl/contrib/dtracetoolkit/Proc/Readme new file mode 100644 index 000000000000..acc36344627d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/Readme @@ -0,0 +1,3 @@ +Proc - Process based analysis + + This would include activity by PID, and syscall analysis. diff --git a/cddl/contrib/dtracetoolkit/Proc/crash.d b/cddl/contrib/dtracetoolkit/Proc/crash.d new file mode 100755 index 000000000000..c1ed397a2a11 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/creatbyproc.d b/cddl/contrib/dtracetoolkit/Proc/creatbyproc.d new file mode 100755 index 000000000000..23e1f5459484 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/dappprof b/cddl/contrib/dtracetoolkit/Proc/dappprof new file mode 100755 index 000000000000..5aed3cb03120 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/dapptrace b/cddl/contrib/dtracetoolkit/Proc/dapptrace new file mode 100755 index 000000000000..7dece4ea0991 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/fddist b/cddl/contrib/dtracetoolkit/Proc/fddist new file mode 100755 index 000000000000..b1fe17ad4d9e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/filebyproc.d b/cddl/contrib/dtracetoolkit/Proc/filebyproc.d new file mode 100755 index 000000000000..d1f75897bf17 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/kill.d b/cddl/contrib/dtracetoolkit/Proc/kill.d new file mode 100755 index 000000000000..215625f84f4b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/lastwords b/cddl/contrib/dtracetoolkit/Proc/lastwords new file mode 100755 index 000000000000..1258cc94edb9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/mmapfiles.d b/cddl/contrib/dtracetoolkit/Proc/mmapfiles.d new file mode 100755 index 000000000000..7690f509576b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/mmapfiles.d @@ -0,0 +1,62 @@ +#!/usr/sbin/dtrace -s +/* + * mmapfiles.d - mmap'd files by process. + * Written using DTrace (Solaris 10 3/05). + * + * $Id: mmapfiles.d 14 2007-09-11 08:03:35Z brendan $ + * + * USAGE: mmapfiles.d # hit Ctrl-C to end sample + * + * FIELDS: + * MMAPS number of mmaps + * CMD process name + * PATHNAME pathname of mmap'd file + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 18-Oct-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +syscall::mmap:entry +/(int)arg4 > 0/ +{ + /* + * Fetch filename + */ + this->filep = curthread->t_procp->p_user.u_finfo.fi_list[arg4].uf_file; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>"; + + /* Store Details */ + @hits[execname, self->vpath] = count(); +} + +dtrace:::END +{ + /* Print Details */ + printf("%5s %-16s %s\n", "MMAPS", "CMD", "PATHNAME"); + printa("%@5d %-16s %s\n", @hits); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/newproc.d b/cddl/contrib/dtracetoolkit/Proc/newproc.d new file mode 100755 index 000000000000..6b6fad2af927 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/pathopens.d b/cddl/contrib/dtracetoolkit/Proc/pathopens.d new file mode 100755 index 000000000000..10cd0c820568 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/pfilestat b/cddl/contrib/dtracetoolkit/Proc/pfilestat new file mode 100755 index 000000000000..c6aaba3a0c21 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/pfilestat @@ -0,0 +1,282 @@ +#!/usr/bin/sh +# +# pfilestat +# +# This prints I/O statistics for each file descriptor within a process. +# In particular, the time break down during read() and write() events is +# measured. +# +# $Id: pfilestat 4 2007-08-01 11:01:38Z brendan $ +# +# USAGE: pfilestat [-r|-w] pid +# +# FIELDS: +# STATE microstate: running, sleeping, waitcpu, read, write +# FDUM File Descriptor ID +# Time Percentage of wallclock time in each STATE +# File Name of file, if known +# +# COPYRIGHT: Copyright (c) 2006 Richard McDougall. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# ToDo: +# Trace readv() and writev(). +# +# 20-Feb-2006 Richard McDougall created this. +# 24-Feb-2006 Brendan Gregg tweaked code. +# 20-Mar-2006 " " tweaked code. +# 20-Mar-2006 " " last update. + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_read=0; opt_write=0 + +### Process options +while getopts hrw name +do + case $name in + r) opt_read=1 ;; + w) opt_write=1 ;; + h|?) cat <<-END >&2 + USAGE: pfilestat [-r|-w] pid + -r # reads only + -w # writes only + eg, + pfilestat pid # default, r+w counts + pfilestat -r pid # read count only + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + +PID=$1 +clearstr=`clear` + +if [ -z "$PID" ] +then + echo "Must supply pid" + exit 1 +fi + +### Option logic +if [ $opt_read -eq 0 -a $opt_write -eq 0 ]; then + opt_read=1; opt_write=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + inline string CLEAR = "'$clearstr'"; + inline int OPT_read = '$opt_read'; + inline int OPT_write = '$opt_write'; + inline int PID = '$PID'; + + unsigned long long totaltime; + unsigned long long totalbytes; + + enum runstate { + READ, + WRITE, + OTHER + }; + + /* print header */ + dtrace:::BEGIN + { + printf("Tracing "); + OPT_read && OPT_write ? printf("reads and writes") : 1; + OPT_read && ! OPT_write ? printf("reads") : 1; + ! OPT_read && OPT_write ? printf("writes") : 1; + printf("..."); + totaltime = 0; + totalbytes = 0; + last = timestamp; + stamp = timestamp; + } + + /* sample reads */ + syscall::read:entry, + syscall::pread*:entry + /pid == PID && OPT_read/ + { + runstate = READ; + @logical["running", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + + self->fd = arg0 + 1; + } + + fbt::fop_read:entry, + fbt::fop_write:entry + /self->fd/ + { + self->path = args[0]->v_path == 0 ? "<none>" : + cleanpath(args[0]->v_path); + } + + syscall::read:return, + syscall::pread*:return + /pid == PID && OPT_read/ + { + runstate = OTHER; + this->bytes = (int)arg0 > 0 ? (int)arg0 : 0; + @logical["read", self->fd - 1, self->path] = sum(timestamp - last); + @bytes["read", self->fd - 1, self->path] = sum(this->bytes); + totalbytes += this->bytes; + totaltime += timestamp - last; + last = timestamp; + self->path = 0; + self->fd = 0; + } + + + /* sample writes */ + syscall::write:entry, + syscall::pwrite*:entry + /pid == PID && OPT_write/ + { + runstate = WRITE; + @logical["running", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + + self->fd = (int)arg0 + 1; + } + + syscall::write:return, + syscall::pwrite*:return + /pid == PID && OPT_write/ + { + runstate = OTHER; + this->bytes = (int)arg0 > 0 ? (int)arg0 : 0; + @logical["write", self->fd - 1, self->path] = sum(timestamp - last); + @bytes["write", self->fd - 1, self->path] = sum(this->bytes); + totalbytes += this->bytes; + totaltime += timestamp - last; + last = timestamp; + self->path = 0; + self->fd = 0; + } + + sched:::on-cpu + /pid == PID/ + { + @logical["waitcpu", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + + sched:::off-cpu + /pid == PID/ + { + @logical["running", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::sleep + /pid == PID/ + { + @logical["running", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::wakeup + /args[1]->pr_pid == PID && runstate == OTHER/ + { + @logical["sleep", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::wakeup + /args[1]->pr_pid == PID && runstate == READ/ + { + @logical["sleep-r", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::wakeup + /args[1]->pr_pid == PID && runstate == WRITE/ + { + @logical["sleep-w", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::enqueue + /args[1]->pr_pid == PID/ + { + @logical["waitcpu", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + sched:::dequeue + /args[1]->pr_pid == PID/ + { + @logical["waitcpu", (uint64_t)0, ""] = sum(timestamp - last); + totaltime += timestamp - last; + last = timestamp; + } + + /* print report */ + profile:::tick-5s + { + printf("%s", CLEAR); + normalize(@logical, totaltime / 100); + trunc(@logical, 10); + printf("%10s %7s %9s %-44s\n", "STATE", "FDNUM", "Time", "Filename"); + printa("%10s %7d %@8d%% %-44.44s\n", @logical); + trunc(@logical); + + delta = timestamp - stamp; + stamp = timestamp; + normalize(@bytes, (1024 * delta) / 1000000000); + trunc(@bytes, 10); + printf("\n%10s %7s %9s %-44s\n", "STATE", "FDNUM", "KB/s", + "Filename"); + printa("%10s %7d %@9d %-44.44s\n", @bytes); + trunc(@bytes); + + printf("\nTotal event time (ms): %d Total Mbytes/sec: %d\n", + totaltime / 1000000, + (totalbytes * 1000000000) / (delta * 1048576)); + + totaltime = 0; + totalbytes = 0; + last = timestamp; + } + + dtrace:::END + { + trunc(@logical); + trunc(@bytes); + } +' diff --git a/cddl/contrib/dtracetoolkit/Proc/pidpersec.d b/cddl/contrib/dtracetoolkit/Proc/pidpersec.d new file mode 100755 index 000000000000..71080b9e7527 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/readbytes.d b/cddl/contrib/dtracetoolkit/Proc/readbytes.d new file mode 100755 index 000000000000..67612a2d5e0f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/readdist.d b/cddl/contrib/dtracetoolkit/Proc/readdist.d new file mode 100755 index 000000000000..0d0346dd8b91 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/rwbbypid.d b/cddl/contrib/dtracetoolkit/Proc/rwbbypid.d new file mode 100755 index 000000000000..72cb00df59ed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/rwbypid.d b/cddl/contrib/dtracetoolkit/Proc/rwbypid.d new file mode 100755 index 000000000000..e4f0432f1ae1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/rwbytype.d b/cddl/contrib/dtracetoolkit/Proc/rwbytype.d new file mode 100755 index 000000000000..6705d99f3cdb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/rwbytype.d @@ -0,0 +1,101 @@ +#!/usr/sbin/dtrace -s +/* + * rwbytype.d - read/write bytes by vnode type. + * Written using DTrace (Solaris 10 3/05). + * + * This program identifies the vnode type of read/write activity - whether + * that is for regular files, sockets, character special devices, etc. + * + * $Id: rwbytype.d 3 2007-08-01 10:50:08Z brendan $ + * + * USAGE: rwbytype.d # hit Ctrl-C to end sample + * + * FIELDS: + * PID number of rwbytype + * CMD process name + * VTYPE vnode type (describes I/O type) + * DIR direction (Read/Write) + * BYTES bytes transferred + * + * COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. + * + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at Docs/cddl1.txt + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * CDDL HEADER END + * + * 18-Oct-2005 Brendan Gregg Created this. + * 20-Apr-2006 " " Last update. + */ + +#pragma D option quiet + +typedef struct vtype2str { + string code; +}; + +translator struct vtype2str < int T > { + /* the order has been picked for performance reasons */ + code = + T == 1 ? "reg" : + T == 9 ? "sock" : + T == 4 ? "chr" : + T == 6 ? "fifo" : + T == 8 ? "proc" : + T == 2 ? "dir" : + T == 3 ? "blk" : + T == 5 ? "lnk" : + T == 7 ? "door" : + T == 10 ? "port" : + T == 11 ? "bad" : "non"; +}; + +dtrace:::BEGIN +{ + printf("Tracing... Hit Ctrl-C to end.\n"); +} + +fbt::fop_read:entry, +fbt::fop_write:entry +{ + self->type = xlate <struct vtype2str *>(args[0]->v_type)->code; + self->size = args[1]->uio_resid; + self->uiop = args[1]; +} + +fbt::fop_read:return +/self->uiop/ +{ + this->resid = self->uiop->uio_resid; + @bytes[pid, execname, self->type, "R"] = sum(self->size - this->resid); + self->type = 0; + self->size = 0; + self->uiop = 0; +} + +/* this is delibrately redundant code for performance reasons */ +fbt::fop_write:return +/self->uiop/ +{ + this->resid = self->uiop->uio_resid; + @bytes[pid, execname, self->type, "W"] = sum(self->size - this->resid); + self->type = 0; + self->size = 0; + self->uiop = 0; +} + +dtrace:::END +{ + printf("%-6s %-16s %6s %4s %9s\n", + "PID", "CMD", "VTYPE", "DIR", "BYTES"); + printa("%-6d %-16s %6s %4s %@9d\n", @bytes); +} diff --git a/cddl/contrib/dtracetoolkit/Proc/sampleproc b/cddl/contrib/dtracetoolkit/Proc/sampleproc new file mode 100755 index 000000000000..891be1465094 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/shortlived.d b/cddl/contrib/dtracetoolkit/Proc/shortlived.d new file mode 100755 index 000000000000..268c370d11e8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/sigdist.d b/cddl/contrib/dtracetoolkit/Proc/sigdist.d new file mode 100755 index 000000000000..c3b2bc075c61 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/stacksize.d b/cddl/contrib/dtracetoolkit/Proc/stacksize.d new file mode 100755 index 000000000000..fedcfbc6e788 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/sysbypid.d b/cddl/contrib/dtracetoolkit/Proc/sysbypid.d new file mode 100755 index 000000000000..bb806538c9d2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/syscallbypid.d b/cddl/contrib/dtracetoolkit/Proc/syscallbypid.d new file mode 100755 index 000000000000..f33ac027ea9a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/syscallbyproc.d b/cddl/contrib/dtracetoolkit/Proc/syscallbyproc.d new file mode 100755 index 000000000000..d0faa75556e4 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/threaded.d b/cddl/contrib/dtracetoolkit/Proc/threaded.d new file mode 100755 index 000000000000..7f5770b54825 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/topsysproc b/cddl/contrib/dtracetoolkit/Proc/topsysproc new file mode 100755 index 000000000000..5836f6848bc3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/writebytes.d b/cddl/contrib/dtracetoolkit/Proc/writebytes.d new file mode 100755 index 000000000000..1fec0e9c22b2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Proc/writedist.d b/cddl/contrib/dtracetoolkit/Proc/writedist.d new file mode 100755 index 000000000000..099c2525b6c6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/Readme b/cddl/contrib/dtracetoolkit/Python/Readme new file mode 100644 index 000000000000..f183c74fe64d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_calldist.d b/cddl/contrib/dtracetoolkit/Python/py_calldist.d new file mode 100755 index 000000000000..1c64c10797ff --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_calltime.d b/cddl/contrib/dtracetoolkit/Python/py_calltime.d new file mode 100755 index 000000000000..d152b358d326 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_cpudist.d b/cddl/contrib/dtracetoolkit/Python/py_cpudist.d new file mode 100755 index 000000000000..cf0e7b2a2411 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_cputime.d b/cddl/contrib/dtracetoolkit/Python/py_cputime.d new file mode 100755 index 000000000000..ca40a93abed7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_flow.d b/cddl/contrib/dtracetoolkit/Python/py_flow.d new file mode 100755 index 000000000000..893ea7802c94 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_flowinfo.d b/cddl/contrib/dtracetoolkit/Python/py_flowinfo.d new file mode 100755 index 000000000000..ccba1df7d364 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_flowtime.d b/cddl/contrib/dtracetoolkit/Python/py_flowtime.d new file mode 100755 index 000000000000..a339eace3aed --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_funccalls.d b/cddl/contrib/dtracetoolkit/Python/py_funccalls.d new file mode 100755 index 000000000000..b430f293e2bb --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_malloc.d b/cddl/contrib/dtracetoolkit/Python/py_malloc.d new file mode 100755 index 000000000000..7f0860ea6360 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_mallocstk.d b/cddl/contrib/dtracetoolkit/Python/py_mallocstk.d new file mode 100755 index 000000000000..ca428016b479 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_profile.d b/cddl/contrib/dtracetoolkit/Python/py_profile.d new file mode 100755 index 000000000000..ff02df6e9327 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_syscalls.d b/cddl/contrib/dtracetoolkit/Python/py_syscalls.d new file mode 100755 index 000000000000..2b3e44dc80b7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_syscolors.d b/cddl/contrib/dtracetoolkit/Python/py_syscolors.d new file mode 100755 index 000000000000..9f958ef23530 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Python/py_who.d b/cddl/contrib/dtracetoolkit/Python/py_who.d new file mode 100755 index 000000000000..3a772e34d85f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/README b/cddl/contrib/dtracetoolkit/README new file mode 120000 index 000000000000..216661b1bdd6 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/README @@ -0,0 +1 @@ +Guide
\ No newline at end of file diff --git a/cddl/contrib/dtracetoolkit/Ruby/Readme b/cddl/contrib/dtracetoolkit/Ruby/Readme new file mode 100644 index 000000000000..9dc3cc303981 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_calldist.d b/cddl/contrib/dtracetoolkit/Ruby/rb_calldist.d new file mode 100755 index 000000000000..e3018eaf9761 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_calls.d b/cddl/contrib/dtracetoolkit/Ruby/rb_calls.d new file mode 100755 index 000000000000..10e3b5a75bc7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_calltime.d b/cddl/contrib/dtracetoolkit/Ruby/rb_calltime.d new file mode 100755 index 000000000000..fac1261f917f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_cpudist.d b/cddl/contrib/dtracetoolkit/Ruby/rb_cpudist.d new file mode 100755 index 000000000000..daa4d1a8296a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_cputime.d b/cddl/contrib/dtracetoolkit/Ruby/rb_cputime.d new file mode 100755 index 000000000000..d5885c8188ad --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_flow.d b/cddl/contrib/dtracetoolkit/Ruby/rb_flow.d new file mode 100755 index 000000000000..e4ff76001534 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_flowinfo.d b/cddl/contrib/dtracetoolkit/Ruby/rb_flowinfo.d new file mode 100755 index 000000000000..4657263a0b32 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_flowtime.d b/cddl/contrib/dtracetoolkit/Ruby/rb_flowtime.d new file mode 100755 index 000000000000..9b1c66803b2f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_funccalls.d b/cddl/contrib/dtracetoolkit/Ruby/rb_funccalls.d new file mode 100755 index 000000000000..76215006cfb9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_lines.d b/cddl/contrib/dtracetoolkit/Ruby/rb_lines.d new file mode 100755 index 000000000000..438f1f11a679 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_malloc.d b/cddl/contrib/dtracetoolkit/Ruby/rb_malloc.d new file mode 100755 index 000000000000..891b84050293 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_objcpu.d b/cddl/contrib/dtracetoolkit/Ruby/rb_objcpu.d new file mode 100755 index 000000000000..23c55e88592c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_objnew.d b/cddl/contrib/dtracetoolkit/Ruby/rb_objnew.d new file mode 100755 index 000000000000..f6f00f1d7af9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_stat.d b/cddl/contrib/dtracetoolkit/Ruby/rb_stat.d new file mode 100755 index 000000000000..6de19f6e5b41 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_syscalls.d b/cddl/contrib/dtracetoolkit/Ruby/rb_syscalls.d new file mode 100755 index 000000000000..495060b9da80 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_syscolors.d b/cddl/contrib/dtracetoolkit/Ruby/rb_syscolors.d new file mode 100755 index 000000000000..e14ac0802e8a --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Ruby/rb_who.d b/cddl/contrib/dtracetoolkit/Ruby/rb_who.d new file mode 100755 index 000000000000..01193689363e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/Readme b/cddl/contrib/dtracetoolkit/Shell/Readme new file mode 100644 index 000000000000..9bf96ffdf8b5 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_calldist.d b/cddl/contrib/dtracetoolkit/Shell/sh_calldist.d new file mode 100755 index 000000000000..e758bab9db16 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_calls.d b/cddl/contrib/dtracetoolkit/Shell/sh_calls.d new file mode 100755 index 000000000000..2ad72f108f68 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_calltime.d b/cddl/contrib/dtracetoolkit/Shell/sh_calltime.d new file mode 100755 index 000000000000..e3c72b4ae4f8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_cpudist.d b/cddl/contrib/dtracetoolkit/Shell/sh_cpudist.d new file mode 100755 index 000000000000..0809fd5cd396 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_cputime.d b/cddl/contrib/dtracetoolkit/Shell/sh_cputime.d new file mode 100755 index 000000000000..433ce8e2088b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_flow.d b/cddl/contrib/dtracetoolkit/Shell/sh_flow.d new file mode 100755 index 000000000000..ff24f595cb8c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_flowinfo.d b/cddl/contrib/dtracetoolkit/Shell/sh_flowinfo.d new file mode 100755 index 000000000000..6da083681b17 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_flowtime.d b/cddl/contrib/dtracetoolkit/Shell/sh_flowtime.d new file mode 100755 index 000000000000..5df118be1715 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_lines.d b/cddl/contrib/dtracetoolkit/Shell/sh_lines.d new file mode 100755 index 000000000000..5cfeb4912102 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_pidcolors.d b/cddl/contrib/dtracetoolkit/Shell/sh_pidcolors.d new file mode 100755 index 000000000000..0196218580d0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_stat.d b/cddl/contrib/dtracetoolkit/Shell/sh_stat.d new file mode 100755 index 000000000000..70e29b480ee3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_syscalls.d b/cddl/contrib/dtracetoolkit/Shell/sh_syscalls.d new file mode 100755 index 000000000000..127bede5d8e1 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_syscolors.d b/cddl/contrib/dtracetoolkit/Shell/sh_syscolors.d new file mode 100755 index 000000000000..3622cb39f487 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_wasted.d b/cddl/contrib/dtracetoolkit/Shell/sh_wasted.d new file mode 100755 index 000000000000..e20db8ea6efe --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Shell/sh_who.d b/cddl/contrib/dtracetoolkit/Shell/sh_who.d new file mode 100755 index 000000000000..3e106ff80f50 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Snippits/Readme b/cddl/contrib/dtracetoolkit/Snippits/Readme new file mode 100644 index 000000000000..b54dc77583b0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Snippits/fd2pathname.txt b/cddl/contrib/dtracetoolkit/Snippits/fd2pathname.txt new file mode 100644 index 000000000000..b056e1318135 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Snippits/fd2pathname.txt @@ -0,0 +1,32 @@ +You have a file descriptor (probably from a syscall), and you want the +corresponding pathname. + +If you are on newer versions of DTrace, there is the fds[] array, + +# dtrace -n 'syscall::read:entry { @[fds[arg0].fi_pathname] = count(); }' +dtrace: description 'syscall::read:entry ' matched 1 probe +^C + + /etc/minor_perm 2 + /etc/mnttab 2 + /etc/motd 2 + /etc/magic 4 + /usr/sbin/clri 5 + /devices/pseudo/clone@0:ptm 6 + /sbin/mount 6 + /dev/pts/28 7 + /devices/pseudo/consms@0:mouse 31 + /devices/pseudo/conskbd@0:kbd 47 + <unknown> 351 + +easy. + +but if you are on an older version of DTrace, try this to convert from +this->fd to self->vpath, + + this->filep = + curthread->t_procp->p_user.u_finfo.fi_list[this->fd].uf_file; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>"; + diff --git a/cddl/contrib/dtracetoolkit/System/Readme b/cddl/contrib/dtracetoolkit/System/Readme new file mode 100644 index 000000000000..3d739da38ee0 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/System/Readme @@ -0,0 +1,3 @@ +System - System based analysis + + This would include measuring system wide activity. diff --git a/cddl/contrib/dtracetoolkit/System/sar-c.d b/cddl/contrib/dtracetoolkit/System/sar-c.d new file mode 100755 index 000000000000..ef6319868583 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/System/syscallbysysc.d b/cddl/contrib/dtracetoolkit/System/syscallbysysc.d new file mode 100755 index 000000000000..86b8ac3e58a8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/System/topsyscall b/cddl/contrib/dtracetoolkit/System/topsyscall new file mode 100755 index 000000000000..63ef8c620345 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/System/uname-a.d b/cddl/contrib/dtracetoolkit/System/uname-a.d new file mode 100755 index 000000000000..777502109692 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/Readme b/cddl/contrib/dtracetoolkit/Tcl/Readme new file mode 100644 index 000000000000..68c73528085c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_calldist.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_calldist.d new file mode 100755 index 000000000000..47cbd4c9692d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_calls.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_calls.d new file mode 100755 index 000000000000..755efe72bcb2 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_calltime.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_calltime.d new file mode 100755 index 000000000000..bab2ade2d50c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_cpudist.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_cpudist.d new file mode 100755 index 000000000000..69f4ba2bc2ef --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_cputime.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_cputime.d new file mode 100755 index 000000000000..a29a541ed74f --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_flow.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_flow.d new file mode 100755 index 000000000000..914682826998 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_flowtime.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_flowtime.d new file mode 100755 index 000000000000..85f1b998a2e7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_ins.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_ins.d new file mode 100755 index 000000000000..39518f9b54bc --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_insflow.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_insflow.d new file mode 100755 index 000000000000..ba5e01cbf671 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_proccalls.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_proccalls.d new file mode 100755 index 000000000000..c874362f096e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_procflow.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_procflow.d new file mode 100755 index 000000000000..258c198266b8 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_stat.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_stat.d new file mode 100755 index 000000000000..a321d700cea7 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_syscalls.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_syscalls.d new file mode 100755 index 000000000000..239d7d0a447d --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_syscolors.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_syscolors.d new file mode 100755 index 000000000000..f2529b5344d9 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Tcl/tcl_who.d b/cddl/contrib/dtracetoolkit/Tcl/tcl_who.d new file mode 100755 index 000000000000..424ad31bf573 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/User/Readme b/cddl/contrib/dtracetoolkit/User/Readme new file mode 100644 index 000000000000..d737125ca646 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/User/Readme @@ -0,0 +1,3 @@ +User - User based analysis + + This would include activity by UID. diff --git a/cddl/contrib/dtracetoolkit/User/setuids.d b/cddl/contrib/dtracetoolkit/User/setuids.d new file mode 100755 index 000000000000..f66d4415dc73 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/Version b/cddl/contrib/dtracetoolkit/Version new file mode 100644 index 000000000000..261c82361905 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Version @@ -0,0 +1 @@ +DTraceToolkit version 0.99, 30-Sep-2007 diff --git a/cddl/contrib/dtracetoolkit/Zones/Readme b/cddl/contrib/dtracetoolkit/Zones/Readme new file mode 100644 index 000000000000..578e720c217c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Zones/Readme @@ -0,0 +1,3 @@ +Zones - Zones based analysis + + This would include activity by Zone. diff --git a/cddl/contrib/dtracetoolkit/Zones/zvmstat b/cddl/contrib/dtracetoolkit/Zones/zvmstat new file mode 100755 index 000000000000..e49f89c8ed54 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/dexplorer b/cddl/contrib/dtracetoolkit/dexplorer new file mode 100755 index 000000000000..002c80376359 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/dtruss b/cddl/contrib/dtracetoolkit/dtruss index 93b12d3b80c9..f4b5e45a30df 100755 --- a/cddl/contrib/dtracetoolkit/dtruss +++ b/cddl/contrib/dtracetoolkit/dtruss @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/sh # # dtruss - print process system call time details. # Written using DTrace (Solaris 10 3/05). @@ -240,7 +240,7 @@ syscall:::entry */ /* print 3 args, return as hex */ -syscall::sigprocmask:return +syscall::lwp_sigmask:return /self->start/ { /* calculate elapsed time */ @@ -268,11 +268,10 @@ syscall::sigprocmask:return } /* print 3 args, arg0 as a string */ -syscall::access*:return, syscall::stat*:return, syscall::lstat*:return, -syscall::readlink*:return, -syscall::open*:return +syscall::open*:return, +syscall::resolvepath:return /self->start/ { /* calculate elapsed time */ @@ -330,6 +329,7 @@ syscall::*read*:return } /* print 0 arg output */ +syscall::gtime:return, syscall::*fork*:return /self->start/ { @@ -357,6 +357,9 @@ syscall::*fork*:return } /* print 1 arg output */ +syscall::brk:return, +syscall::times:return, +syscall::stime:return, syscall::close:return /self->start/ { @@ -384,7 +387,7 @@ syscall::close:return } /* print 2 arg output */ -syscall::utimes:return, +syscall::utime:return, syscall::munmap:return /self->start/ { diff --git a/cddl/contrib/dtracetoolkit/dvmstat b/cddl/contrib/dtracetoolkit/dvmstat new file mode 100755 index 000000000000..41f40e39e785 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/errinfo b/cddl/contrib/dtracetoolkit/errinfo new file mode 100755 index 000000000000..79160b18e57b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/errinfo @@ -0,0 +1,180 @@ +#!/usr/bin/perl +# +# errinfo - report on syscall failures and print errno error messages. +# Written using Perl and DTrace (Solaris 10 03/05) +# +# When system calls fail, an errno variable is set to convay a meaningful +# message to the end user - so long as the program does something with it +# (eg, "ls" printing "No such file or directory"). This program fetches +# and prints details for all syscall failures along with their message, +# whether the failing program is already printing this info or not. +# +# $Id: errinfo 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: errinfo [-ch] [-p PID] [-n name] +# +# -c # counts - aggregate style +# -p PID # examine this PID only +# -n name # examine processes with this name only +# eg, +# errinfo # default output - snoop event style +# errinfo -n ssh # examine "ssh" processes only +# errinfo -cn ssh # examine "ssh" using counts +# +# FIELDS: +# EXEC Program name (truncated) +# SYSCALL System call name +# ERR Value of errno +# DESC Description of errno message +# +# SEE ALSO: /usr/include/sys/errno.h +# +# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 18-Apr-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + +use Getopt::Std; + +# +# Defaults +# +$FILTER = ""; +$COUNT = 0; + +# +# Command line arguments +# +&Usage() if $ARGV[0] eq "--help"; +getopts('ch:n:p:') || &Usage(); +&Usage() if $opt_h; +$COUNT = 1 if $opt_c; +$FILTER = "&& execname == \"$opt_n\"" if defined $opt_n; +$FILTER = "&& pid == $opt_p" if defined $opt_p; + +# +# Load errno descriptions +# +open(ERRNO,"/usr/include/sys/errno.h") || die "ERROR1: reading errno.h: $!\n"; +while (chomp($line = <ERRNO>)) { + next unless $line =~ /^#define/; + ($errno,$desc) = $line =~ /^#define\s+\S+\s+(\d+)\s+\/\*(.*)\*\//; + $Errno{$errno} = $desc; +} +close ERRNO; + +# +# Declare DTrace script +# + if ($COUNT) { # aggregate style +$dtrace = <<END; +/usr/sbin/dtrace -n ' + #pragma D option quiet + syscall:::return + /errno != 0 && pid != \$pid $FILTER/ + { + \@Errs[execname, probefunc, errno] = count(); + } + dtrace:::END { + printa("%s %s %d %\@d\\n", \@Errs); + }' +END + } else { # snoop style +$dtrace = <<END; +/usr/sbin/dtrace -n ' + #pragma D option quiet + #pragma D option switchrate=5hz + syscall:::return + /errno != 0 && pid != \$pid $FILTER/ + { + printf("%s %s %d\\n", execname, probefunc, errno); + }' +END + } + +# +# Cleanup on signals +# +$SIG{INT} = \&Cleanup_Signal; # Ctrl-C +$SIG{QUIT} = \&Cleanup_Signal; # Ctrl-\ +$SIG{TERM} = \&Cleanup_Signal; # TERM + +# +# Run DTrace, process output +# + +if ($COUNT) { + print STDERR "Tracing... Hit Ctrl-C to end.\n"; + $header = 1; +} else { + printf("%16s %16s %4s %s\n","EXEC","SYSCALL","ERR","DESC"); +} + +### Open DTrace +open(DTRACE,"$dtrace |") || die "ERROR2: Can't start dtrace (perms?): $!\n"; + +### Process DTrace output +while (chomp($line = <DTRACE>)) { + + ### Print count header + if ($COUNT && $header) { + printf("\n%16s %16s %4s %6s %s\n", + "EXEC","SYSCALL","ERR","COUNT","DESC"); + $header = 0; + } + + ### Split data + ($execname,$syscall,$errno,$counts) = split(' ',$line); + next if $errno eq ""; + + ### Fetch errno description + $desc = $Errno{$errno}; + + ### Print output line + if ($COUNT) { + printf("%16s %16s %4d %6d %s\n", + $execname,$syscall,$errno,$counts,$desc); + } else { + printf("%16s %16s %4d %s\n",$execname,$syscall,$errno,$desc); + } +} +close(DTRACE); + +# +# Triggered by signals +# +sub Cleanup_Signal { +} + +# +# Usage message +# +sub Usage { + print STDERR "USAGE: errinfo [-ch] [-p PID] [-n name]\n"; + print STDERR <<ENDUSAGE; + eg, + errinfo # default output - snoop event style + -c # counts - aggregate style + -p 871 # examine PID 871 only + -n ssh # examine processes with the name "ssh" only + -cn ssh # examine "ssh" using counts +ENDUSAGE + exit(1); +} diff --git a/cddl/contrib/dtracetoolkit/execsnoop b/cddl/contrib/dtracetoolkit/execsnoop new file mode 100755 index 000000000000..96e647c2482c --- /dev/null +++ b/cddl/contrib/dtracetoolkit/execsnoop @@ -0,0 +1,174 @@ +#!/usr/bin/sh +# +# execsnoop - snoop process execution as it occurs. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: execsnoop 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: execsnoop [-a|-A|-ehjsvZ] [-c command] +# +# execsnoop # default output +# +# -a # print all data +# -A # dump all data, space delimited +# -e # safe output - parseable +# -j # print project ID +# -s # print start time, us +# -v # print start time, string +# -Z # print zonename +# -c command # command name to snoop +# eg, +# execsnoop -v # human readable timestamps +# execsnoop -Z # print zonename +# execsnoop -c ls # snoop ls commands only +# +# The parseable output ensures that the ARGS field doesn't contain +# any "\n"s, which normally sometimes can - and would wreck postprocessing. +# +# FIELDS: +# UID User ID +# PID Process ID +# PPID Parent Process ID +# COMM command name for the process +# ARGS argument listing for the process +# ZONE zonename +# PROJ project ID +# TIME timestamp for the command, us +# STRTIME timestamp for the command, string +# +# SEE ALSO: BSM auditing. +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 27-Mar-2004 Brendan Gregg Created this. +# 21-Jan-2005 " " Wrapped in sh to provide options. +# 08-May-2005 " " Rewritten for performance. +# 14-May-2005 " " Added zonename. +# 02-Jul-2005 " " Added projid, safe printing. +# 11-Sep-2005 " " Increased switchrate. +# 11-Sep-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_dump=0; opt_cmd=0; opt_time=0; opt_timestr=0; filter=0; command=. +opt_zone=0; opt_safe=0; opt_proj=0 + +### process options +while getopts aAc:ehjsvZ name +do + case $name in + a) opt_time=1; opt_timestr=1; opt_zone=1; opt_proj=1 ;; + A) opt_dump=1 ;; + c) opt_cmd=1; command=$OPTARG ;; + e) opt_safe=1 ;; + j) opt_proj=1 ;; + s) opt_time=1 ;; + v) opt_timestr=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: execsnoop [-a|-A|-ehjsvZ] [-c command] + execsnoop # default output + -a # print all data + -A # dump all data, space delimited + -e # safe output, parseable + -j # print project ID + -s # print start time, us + -v # print start time, string + -Z # print zonename + -c command # command name to snoop + eg, + execsnoop -v # human readable timestamps + execsnoop -Z # print zonename + execsnoop -c ls # snoop ls commands only + END + exit 1 + esac +done + +### option logic +if [ $opt_dump -eq 1 ]; then + opt_time=0; opt_timestr=0; opt_zone=0; opt_proj=0 +fi +if [ $opt_cmd -eq 1 ]; then + filter=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_dump = '$opt_dump'; + inline int OPT_cmd = '$opt_cmd'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_safe = '$opt_safe'; + inline int OPT_proj = '$opt_proj'; + inline int FILTER = '$filter'; + inline string COMMAND = "'$command'"; + + #pragma D option quiet + #pragma D option switchrate=10hz + + /* + * Print header + */ + dtrace:::BEGIN + { + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "STRTIME") : 1; + OPT_zone ? printf("%-10s ", "ZONE") : 1; + OPT_proj ? printf("%5s ", "PROJ") : 1; + + /* print main headers */ + OPT_dump ? printf("%s %s %s %s %s %s %s %s\n", + "TIME", "ZONE", "PROJ", "UID", "PID", "PPID", "COMM", "ARGS") : + printf("%5s %6s %6s %s\n", "UID", "PID", "PPID", "ARGS"); + } + + /* + * Print exec event + */ + syscall::exec:return, syscall::exece:return + /(FILTER == 0) || (OPT_cmd == 1 && COMMAND == execname)/ + { + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%-10s ", zonename) : 1; + OPT_proj ? printf("%5d ", curpsinfo->pr_projid) : 1; + + /* print main data */ + OPT_dump ? printf("%d %s %d %d %d %d %s ", timestamp/1000, + zonename, curpsinfo->pr_projid, uid, pid, ppid, execname) : + printf("%5d %6d %6d ", uid, pid, ppid); + OPT_safe ? printf("%S\n", curpsinfo->pr_psargs) : + printf("%s\n", curpsinfo->pr_psargs); + } +' diff --git a/cddl/contrib/dtracetoolkit/hotkernel b/cddl/contrib/dtracetoolkit/hotkernel new file mode 100755 index 000000000000..84d3362ff077 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/hotkernel @@ -0,0 +1,125 @@ +#!/usr/bin/perl -w +# +# hotkernel - sample on-CPU kernel-level functions and modules. +# Written using Perl and DTrace (Solaris 10 03/05) +# +# This samples the on-CPU function at 1001 Hertz, for a simple yet +# effective kernel-level profiling tool for sampling exclusive function time. +# The output will identify which function is on the CPU the most - which is +# the hottest. See Notes/ALLexclusive_notes.txt for an explanation of +# exclusive time. +# +# $Id: hotkernel 65 2007-10-04 11:09:40Z brendan $ +# +# USAGE: hotkernel [-hm] +# +# -h # help +# -m # match modules, not functions +# eg, +# hotkernel # sample kernel functions +# hotkernel -m # sample kernel modules +# +# FIELDS: +# FUNCTION Function name +# MODULE Module name +# COUNT Number of samples +# PCNT Percentage of total samples +# +# COPYRIGHT: Copyright (c) 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 29-Jun-2006 Brendan Gregg Created this. +# 29-Jun-2006 " " Last update. +# + +use strict; +use Getopt::Std; + +# +# Command Line Arguments +# +my $args; +usage() if defined $ARGV[0] and $ARGV[0] eq "--help"; +getopts('hm') or usage(); +usage() if defined $main::opt_h and $main::opt_h; +my $mods = defined $main::opt_m and $main::opt_m ? 1 : 0; + +# +# Cleanup on signals +# +$SIG{INT} = \&cleanupsig; # Ctrl-C +$SIG{QUIT} = \&cleanupsig; # Ctrl-\ +$SIG{TERM} = \&cleanupsig; # TERM + +# +# Declare DTrace script +# +my $dtrace = <<END; +/usr/sbin/dtrace -n ' + #pragma D option quiet + profile:::profile-1001hz + /arg0/ + { + \@pc[arg0] = count(); + } + dtrace:::END + { + printa("%a %\@d\\n", \@pc); + } +' +END + +# +# Run DTrace, process output +# +my %Count; +my $total; +open DTRACE, "$dtrace |" or die "ERROR1: Can't run dtrace (perms?): $!\n"; +print "Sampling... Hit Ctrl-C to end.\n"; +while (my $line = <DTRACE>) { + next if $line =~ /^\s*$/; + my ($addr, $count) = split ' ', $line; + my ($name, $offset) = split /\+/, $addr; + next if $name eq "0x0"; + $name =~ s/\`.*// if $mods; + $Count{$name} += $count; + $total += $count; +} +close DTRACE; + +# +# Print final report +# +printf "\n%-52s %8s %6s\n", $mods ? "MODULE" : "FUNCTION", "COUNT", "PCNT"; +foreach my $name (sort { $Count{$a} <=> $Count{$b} } keys %Count) { + printf "%-52s %8d %5.1f%%\n", $name, $Count{$name}, + 100 * $Count{$name} / ($total ? $total : 1); +} + +# +# Subroutines +# +sub cleanupsig { +} +sub usage { + print STDERR "USAGE: hotkernel [-hm]\n"; + print STDERR " eg,\n"; + print STDERR " hotkernel # sample kernel functions\n"; + print STDERR " hotkernel -m # sample kernel modules\n"; + exit 1; +} diff --git a/cddl/contrib/dtracetoolkit/hotuser b/cddl/contrib/dtracetoolkit/hotuser new file mode 100755 index 000000000000..2377487c7f7b --- /dev/null +++ b/cddl/contrib/dtracetoolkit/hotuser @@ -0,0 +1,139 @@ +#!/usr/bin/perl -w +# +# hotuser - sample on-CPU user-level functions and libraries. +# Written using Perl and DTrace (Solaris 10 03/05) +# +# This samples the on-CPU function at 1001 Hertz, for a simple yet +# effective user-level profiling tool for sampling exclusive function time. +# The output will identify which function is on the CPU the most - which +# is the hottest. See Notes/ALLexclusive_notes.txt for an explanation of +# exclusive time. +# +# $Id: hotuser 65 2007-10-04 11:09:40Z brendan $ +# +# USAGE: hotuser [-hl] { -c command | -p PID } +# +# -h # help +# -l # match libraries, not functions +# -p PID # examine this PID +# -c command # run and examine this command +# eg, +# hotuser -p 81 # sample user functions from PID 81 +# hotuser -lp 81 # sample user libraries from PID 81 +# hotuser -p `pgrep -n Xorg` # sample Xorg +# +# FIELDS: +# FUNCTION Function name +# LIBRARY Library name +# COUNT Number of samples +# PCNT Percentage of total samples +# +# COPYRIGHT: Copyright (c) 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 29-Jun-2006 Brendan Gregg Created this. +# 29-Jun-2006 " " Last update. +# + +use strict; +use Getopt::Std; + +# +# Command Line Arguments +# +my $args; +usage() if defined $ARGV[0] and $ARGV[0] eq "--help"; +getopts('c:hlp:') or usage(); +usage() if defined $main::opt_h and $main::opt_h; +my $libs = defined $main::opt_l and $main::opt_l ? 1 : 0; +if (defined $main::opt_c) { + $args = "-c $main::opt_c"; +} +elsif (defined $main::opt_p) { + $args = "-p $main::opt_p"; +} +else { + usage(); +} + +# +# Cleanup on signals +# +$SIG{INT} = \&cleanupsig; # Ctrl-C +$SIG{QUIT} = \&cleanupsig; # Ctrl-\ +$SIG{TERM} = \&cleanupsig; # TERM + +# +# Declare DTrace script +# +my $dtrace = <<END; +/usr/sbin/dtrace -n ' + #pragma D option quiet + profile:::profile-1001hz + /pid == \$target/ + { + \@pc[arg1] = count(); + } + dtrace:::END + { + printa("OUT: %A %\@d\\n", \@pc); + } +' '$args' +END + +# +# Run DTrace, process output +# +my %Count; +my $total; +open DTRACE, "$dtrace |" or die "ERROR1: Can't run dtrace (perms?): $!\n"; +print "Sampling... Hit Ctrl-C to end.\n"; +while (my $line = <DTRACE>) { + next if $line =~ /^\s*$/; + next if $line !~ /^OUT: /; + my ($tag, $addr, $count) = split ' ', $line; + my ($name, $offset) = split /\+/, $addr; + next if $name eq "0x0"; + $name =~ s/\`.*// if $libs; + $Count{$name} += $count; + $total += $count; +} +close DTRACE; + +# +# Print final report +# +printf "\n%-52s %8s %6s\n", $libs ? "LIBRARY" : "FUNCTION", "COUNT", "PCNT"; +foreach my $name (sort { $Count{$a} <=> $Count{$b} } keys %Count) { + printf "%-52s %8d %5.1f%%\n", $name, $Count{$name}, + 100 * $Count{$name} / ($total ? $total : 1); +} + +# +# Subroutines +# +sub cleanupsig { +} +sub usage { + print STDERR "USAGE: hotuser [-hl] { -c command | -p PID }\n"; + print STDERR " eg,\n"; + print STDERR " hotuser -p 81 # sample user funcs for PID 81\n"; + print STDERR " hotuser -lp 81 # sample user libs for PID 81\n"; + print STDERR " hotuser -p `pgrep -n Xorg` # sample Xorg\n"; + exit 1; +} diff --git a/cddl/contrib/dtracetoolkit/install b/cddl/contrib/dtracetoolkit/install new file mode 100755 index 000000000000..1962c46290e3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/iopattern b/cddl/contrib/dtracetoolkit/iopattern new file mode 100755 index 000000000000..e825f9f77fba --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/iosnoop b/cddl/contrib/dtracetoolkit/iosnoop new file mode 100755 index 000000000000..00931d275e09 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/iotop b/cddl/contrib/dtracetoolkit/iotop new file mode 100755 index 000000000000..788c49285129 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/opensnoop b/cddl/contrib/dtracetoolkit/opensnoop new file mode 100755 index 000000000000..5b1a89bc543e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/procsystime b/cddl/contrib/dtracetoolkit/procsystime new file mode 100755 index 000000000000..32da4b76381e --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/rwsnoop b/cddl/contrib/dtracetoolkit/rwsnoop new file mode 100755 index 000000000000..9d4932487cce --- /dev/null +++ b/cddl/contrib/dtracetoolkit/rwsnoop @@ -0,0 +1,234 @@ +#!/usr/bin/ksh +# +# rwsnoop - snoop read/write events. +# Written using DTrace (Solaris 10 3/05). +# +# This is measuring reads and writes at the application level. This matches +# the syscalls read, write, pread and pwrite. +# +# $Id: rwsnoop 3 2007-08-01 10:50:08Z brendan $ +# +# USAGE: rwsnoop [-jPtvZ] [-n name] [-p pid] +# +# rwsnoop # default output +# +# -j # print project ID +# -P # print parent process ID +# -t # print timestamp, us +# -v # print time, string +# -Z # print zone ID +# -n name # this process name only +# -p PID # this PID only +# eg, +# rwsnoop -Z # print zone ID +# rwsnoop -n bash # monitor processes named "bash" +# rwsnoop > out.txt # recommended +# +# NOTE: +# rwsnoop usually prints plenty of output, which itself will cause +# more output. It can be better to redirect the output of rwsnoop +# to a file to prevent this. +# +# FIELDS: +# TIME Timestamp, us +# TIMESTR Time, string +# ZONE Zone ID +# PROJ Project ID +# UID User ID +# PID Process ID +# PPID Parent Process ID +# CMD Process name +# D Direction, Read or Write +# BYTES Total bytes during sample, -1 for error +# FILE Filename, if file based +# +# Reads and writes that are not file based, for example with sockets, will +# print "<unknown>" as the filename. +# +# SEE ALSO: rwtop +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# TODO: +# Track readv and writev. +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 24-Jul-2005 Brendan Gregg Created this. +# 17-Sep-2005 " " Increased switchrate. +# 17-Sep-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# + +### default variables +opt_name=0; opt_pid=0; opt_proj=0; opt_zone=0; opt_time=0; opt_timestr=0 +opt_bytes=1; filter=0; pname=.; pid=0; opt_ppid=0 + +### process options +while getopts n:Pp:jtvZ name +do + case $name in + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + P) opt_ppid=1 ;; + j) opt_proj=1 ;; + t) opt_time=1 ;; + v) opt_timestr=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: rwsnoop [-jPtvZ] [-n name] [-p pid] + + -j # print project ID + -P # print parent process ID + -t # print timestamp, us + -v # print time, string + -Z # print zone ID + -n name # this process name only + -p PID # this PID only + eg, + rwsnoop # default output + rwsnoop -Z # print zone ID + rwsnoop -n bash # monitor processes named "bash" + END + exit 1 + esac +done + +shift $(( $OPTIND - 1 )) + +### option logic +if (( opt_name || opt_pid )); then + filter=1 +fi + + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_proj = '$opt_proj'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_bytes = '$opt_bytes'; + inline int OPT_name = '$opt_name'; + inline int OPT_ppid = '$opt_ppid'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int FILTER = '$filter'; + inline int PID = '$pid'; + inline string NAME = "'$pname'"; + + #pragma D option quiet + #pragma D option switchrate=10hz + + /* + * Print header + */ + dtrace:::BEGIN + { + /* print header */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "TIMESTR") : 1; + OPT_proj ? printf("%5s ", "PROJ") : 1; + OPT_zone ? printf("%5s ", "ZONE") : 1; + OPT_ppid ? printf("%6s ", "PPID") : 1; + printf("%5s %6s %-12s %1s %7s %s\n", + "UID", "PID", "CMD", "D", "BYTES", "FILE"); + } + + /* + * Check event is being traced + */ + syscall::*read:entry, + syscall::*write:entry + /pid != $pid/ + { + /* default is to trace unless filtering, */ + self->ok = FILTER ? 0 : 1; + + /* check each filter, */ + (OPT_name == 1 && NAME == execname)? self->ok = 1 : 1; + (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1; + + /* save file descriptor */ + self->fd = self->ok ? arg0 : 0; + } + + /* + * Save read details + */ + syscall::*read:return + /self->ok/ + { + self->rw = "R"; + self->size = arg0; + } + + /* + * Save write details + */ + syscall::*write:entry + /self->ok/ + { + self->rw = "W"; + self->size = arg2; + } + + /* + * Process event + */ + syscall::*read:return, + syscall::*write:entry + /self->ok/ + { + /* + * Fetch filename + */ + this->filistp = curthread->t_procp->p_user.u_finfo.fi_list; + this->ufentryp = (uf_entry_t *)((uint64_t)this->filistp + + (uint64_t)self->fd * (uint64_t)sizeof(uf_entry_t)); + this->filep = this->ufentryp->uf_file; + this->vnodep = this->filep != 0 ? this->filep->f_vnode : 0; + self->vpath = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>"; + + /* + * Print details + */ + OPT_time ? printf("%-14d ", timestamp / 1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_proj ? printf("%5d ", curpsinfo->pr_projid) : 1; + OPT_zone ? printf("%5d ", curpsinfo->pr_zoneid) : 1; + OPT_ppid ? printf("%6d ", ppid) : 1; + printf("%5d %6d %-12.12s %1s %7d %s\n", + uid, pid, execname, self->rw, (int)self->size, self->vpath); + + self->ok = 0; + self->fd = 0; + self->rw = 0; + self->size = 0; + self->vpath = 0; + } +' diff --git a/cddl/contrib/dtracetoolkit/rwtop b/cddl/contrib/dtracetoolkit/rwtop new file mode 100755 index 000000000000..ed0a6faaa475 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/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/cddl/contrib/dtracetoolkit/statsnoop b/cddl/contrib/dtracetoolkit/statsnoop new file mode 100755 index 000000000000..6284fb5060f3 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/statsnoop @@ -0,0 +1,286 @@ +#!/usr/bin/sh +# +# statsnoop - snoop file stats as they occur. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: statsnoop 65 2007-10-04 11:09:40Z brendan $ +# +# USAGE: statsnoop [-a|-A|-ceghlsvxZ] [-f pathname] [-t syscall] +# [-n name] [-p PID] +# +# statsnoop # default output +# +# -a # print most data +# -A # dump all data, space delimited +# -c # print cwd of process +# -e # print errno value +# -g # print command arguments +# -l # print syscall type +# -s # print start time, us +# -v # print start time, string +# -x # only print failed stats +# -Z # print zonename +# -f pathname # file pathname to snoop +# -n name # command name to snoop +# -p PID # process ID to snoop +# -t syscall # stat syscall to trace +# eg, +# statsnoop -v # human readable timestamps +# statsnoop -S # syscall type +# statsnoop -e # see error codes +# statsnoop -f /etc/passwd # snoop this file only +# +# FIELDS: +# ZONE Zone name +# UID User ID +# PID Process ID +# PPID Parent Process ID +# FD file descriptor (-1 for error) +# ERR errno value (see /usr/include/sys/errno.h) +# TYPE syscall type +# CWD current working directory of process +# PATH pathname for file stat +# COMM command name for the process +# ARGS argument listing for the process +# TIME timestamp for the stat event, us +# STRTIME timestamp for the stat event, string +# +# SEE ALSO: truss, BSM auditing. +# +# COPYRIGHT: Copyright (c) 2007 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 09-Sep-2007 Brendan Gregg Created this. +# + + +############################## +# --- Process Arguments --- +# + +### Default variables +opt_dump=0; opt_file=0; opt_time=0; opt_timestr=0; opt_args=0 +opt_zone=0; opt_cwd=0; opt_failonly=0; opt_err=0; filter=0; pathname=. +opt_name=0; opt_pid=0; opt_type=0; opt_trace=0; pname=.; pid=0; trace=. + +### Process options +while getopts aAcef:ghln:p:st:vxZ name +do + case $name in + a) opt_time=1; opt_timestr=1; opt_args=1; opt_err=1 ;; + A) opt_dump=1 ;; + c) opt_cwd=1 ;; + e) opt_err=1 ;; + g) opt_args=1 ;; + f) opt_file=1; pathname=$OPTARG ;; + l) opt_type=1 ;; + n) opt_name=1; pname=$OPTARG ;; + p) opt_pid=1; pid=$OPTARG ;; + s) opt_time=1 ;; + t) opt_trace=1; trace=$OPTARG ;; + v) opt_timestr=1 ;; + x) opt_failonly=1 ;; + Z) opt_zone=1 ;; + h|?) cat <<-END >&2 + USAGE: statsnoop [-a|-A|-ceghlsvxZ] [-f pathname] [-t syscall] + [-n execname] [-p PID] + statsnoop # default output + -a # print most data + -A # dump all data, space delimited + -c # print cwd of process + -e # print errno value + -g # print command arguments + -l # print syscall type + -s # print start time, us + -v # print start time, string + -x # only print failed stats + -Z # print zonename + -f pathname # pathname name to snoop + -n name # process name to snoop + -p PID # process ID to snoop + -t syscall # stat syscall to trace + eg, + statsnoop -v # human readable timestamps + statsnoop -e # see error codes + statsnoop -f /etc/motd # snoop this file only + END + exit 1 + esac +done + +### Option logic +if [ $opt_dump -eq 1 ]; then + opt_zone=0; opt_cwd=0; opt_time=0; opt_timestr=0; opt_type=0 + opt_args=2 +fi +if [ $opt_name -eq 1 -o $opt_pid -eq 1 -o $opt_trace -eq 1 ]; then + filter=1 +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + /* + * Command line arguments + */ + inline int OPT_dump = '$opt_dump'; + inline int OPT_file = '$opt_file'; + inline int OPT_args = '$opt_args'; + inline int OPT_cwd = '$opt_cwd'; + inline int OPT_err = '$opt_err'; + inline int OPT_zone = '$opt_zone'; + inline int OPT_time = '$opt_time'; + inline int OPT_timestr = '$opt_timestr'; + inline int OPT_type = '$opt_type'; + inline int OPT_failonly = '$opt_failonly'; + inline int OPT_pid = '$opt_pid'; + inline int OPT_name = '$opt_name'; + inline int OPT_trace = '$opt_trace'; + inline int FILTER = '$filter'; + inline int PID = '$pid'; + inline string PATHNAME = "'$pathname'"; + inline string NAME = "'$pname'"; + inline string TRACE = "'$trace'"; + + #pragma D option quiet + #pragma D option switchrate=10hz + + /* + * Print header + */ + dtrace:::BEGIN + { + /* print optional headers */ + OPT_time ? printf("%-14s ", "TIME") : 1; + OPT_timestr ? printf("%-20s ", "STRTIME") : 1; + OPT_zone ? printf("%-10s ", "ZONE") : 1; + + /* print dump headers */ + OPT_dump ? printf("%s %s %s %s %s %s %s %s %s %s %s", "ZONE", + "TIME", "UID", "PID", "PPID", "COMM", "FD", "ERR", "CWD", + "PATH", "ARGS") : printf("%5s %6s ","UID","PID"); + + /* print main headers */ + OPT_args == 0 ? printf("%-12s ", "COMM") : 1; + OPT_dump == 0 ? printf("%3s ", "FD") : 1; + OPT_err ? printf("%3s ", "ERR") : 1; + OPT_cwd ? printf("%-20s ", "CWD") : 1; + OPT_type ? printf("%-8s ", "TYPE") : 1; + OPT_dump == 0 ? printf("%-20s ", "PATH") : 1; + OPT_args == 1 ? printf("%s", "ARGS") : 1; + printf("\n"); + } + + /* + * Print stat event + */ + syscall::stat:entry, syscall::stat64:entry, syscall::xstat:entry, + syscall::lstat:entry, syscall::lstat64:entry, syscall::lxstat:entry, + syscall::fstat:entry, syscall::fstat64:entry, syscall::fxstat:entry + { + /* default is to trace unless filtering */ + self->ok = FILTER ? 0 : 1; + + /* check each filter */ + (OPT_name == 1 && NAME == execname) ? self->ok = 1 : 1; + (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1; + (OPT_trace == 1 && TRACE == probefunc) ? self->ok = 1 : 1; + } + + syscall::stat:entry, syscall::stat64:entry, + syscall::lstat:entry, syscall::lstat64:entry, syscall::lxstat:entry + /self->ok/ + { + self->pathp = arg0; + } + + syscall::xstat:entry + /self->ok/ + { + self->pathp = arg1; + } + + syscall::stat:return, syscall::stat64:return, syscall::xstat:return, + syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return + /self->ok/ + { + self->path = copyinstr(self->pathp); + self->pathp = 0; + } + + syscall::fstat:return, syscall::fstat64:entry, syscall::fxstat:entry + /self->ok/ + { + self->filep = curthread->t_procp->p_user.u_finfo.fi_list[arg0].uf_file; + } + + syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return + /self->ok/ + { + this->vnodep = self->filep != 0 ? self->filep->f_vnode : 0; + self->path = this->vnodep ? (this->vnodep->v_path != 0 ? + cleanpath(this->vnodep->v_path) : "<unknown>") : "<unknown>"; + self->filep = 0; + } + + syscall::stat:return, syscall::stat64:return, syscall::xstat:return, + syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return, + syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return + /self->ok && (! OPT_failonly || (int)arg0 < 0) && + ((OPT_file == 0) || (OPT_file == 1 && PATHNAME == copyinstr(self->pathp)))/ + { + /* print optional fields */ + OPT_time ? printf("%-14d ", timestamp/1000) : 1; + OPT_timestr ? printf("%-20Y ", walltimestamp) : 1; + OPT_zone ? printf("%-10s ", zonename) : 1; + + /* print dump fields */ + OPT_dump ? printf("%s %d %d %d %d %s %d %d %s %s %S", zonename, + timestamp/1000, uid, pid, ppid, execname, (int)arg0, errno, + cwd, self->path, curpsinfo->pr_psargs) : + printf("%5d %6d ", uid, pid); + + /* print main fields */ + OPT_args == 0 ? printf("%-12.12s ", execname) : 1; + OPT_dump == 0 ? printf("%3d ", (int)arg0) : 1; + OPT_err ? printf("%3d ", errno) : 1; + OPT_cwd ? printf("%-20s ", cwd) : 1; + OPT_type ? printf("%-8s ", probefunc) : 1; + OPT_dump == 0 ? printf("%-20s ", self->path) : 1; + OPT_args == 1 ? printf("%S", curpsinfo->pr_psargs) : 1; + printf("\n"); + + /* cleanup */ + self->path = 0; + self->ok = 0; + } + + /* + * Cleanup + */ + syscall::stat:return, syscall::stat64:return, syscall::xstat:return, + syscall::lstat:return, syscall::lstat64:return, syscall::lxstat:return, + syscall::fstat:return, syscall::fstat64:return, syscall::fxstat:return + /self->ok/ + { + self->path = 0; + self->ok = 0; + } +' |