xref: /netbsd-src/external/cddl/dtracetoolkit/dist/Shell/sh_pidcolors.d (revision c29d51755812ace2e87aeefdb06cb2b4dac7087a)
1 #!/usr/sbin/dtrace -Zs
2 /*
3  * sh_pidcolors.d - Demonstration of deeper DTrace Bourne shell analysis.
4  *                  Written for the sh DTrace provider.
5  *
6  * $Id: sh_pidcolors.d,v 1.1.1.1 2015/09/30 22:01:09 christos Exp $
7  *
8  * USAGE: sh_pidcolors.d { -p PID | -c cmd }	# hit Ctrl-C to end
9  *
10  * This extends sh_syscolors.d by including some "pid" provider tracing
11  * as a starting point for deeper analysis. Currently it adds the probes,
12  *
13  *	pid$target:a.out:e*:entry,
14  *	pid$target:a.out:e*:return
15  *
16  * which means, all functions from the /usr/bin/sh binary that begin with
17  * the letter "e". This adds about 34 probes. Customise it to whichever
18  * parts of /usr/bin/sh or the system libraries you are interested in.
19  *
20  * FIELDS:
21  *		C		CPU-id
22  *		PID		Process ID
23  *		DELTA(us)	Elapsed time from previous line to this line
24  *		FILE		Filename of the shell script
25  *		LINE		Line number of filename
26  *		TYPE		Type of call (func/builtin/cmd/line/shell)
27  *		NAME		Shell function, builtin or command name
28  *
29  * The filename for syscalls may be printed as the shell name, if the
30  * script was invoked using the form "shell filename" rather than running
31  * the script with an interpreter line.
32  *
33  * WARNING: Watch the first column carefully, it prints the CPU-id. If it
34  * changes, then it is very likely that the output has been shuffled.
35  *
36  * COPYRIGHT: Copyright (c) 2007 Brendan Gregg.
37  *
38  * CDDL HEADER START
39  *
40  *  The contents of this file are subject to the terms of the
41  *  Common Development and Distribution License, Version 1.0 only
42  *  (the "License").  You may not use this file except in compliance
43  *  with the License.
44  *
45  *  You can obtain a copy of the license at Docs/cddl1.txt
46  *  or http://www.opensolaris.org/os/licensing.
47  *  See the License for the specific language governing permissions
48  *  and limitations under the License.
49  *
50  * CDDL HEADER END
51  *
52  * 09-Sep-2007	Brendan Gregg	Created this.
53  */
54 
55 #pragma D option quiet
56 #pragma D option switchrate=10
57 
58 self int depth;
59 
60 dtrace:::BEGIN
61 {
62         color_shell = "\033[2;35m";		/* violet, faint */
63         color_line = "\033[1;35m";		/* violet, bold */
64         color_lib = "\033[2;34m";		/* blue, faint */
65         color_syscall = "\033[2;32m";		/* green, faint */
66         color_off = "\033[0m";			/* default */
67 
68 	printf("%s %6s %10s  %16s:%-4s %-8s -- %s\n", "C", "PID", "DELTA(us)",
69 	    "FILE", "LINE", "TYPE", "NAME");
70 }
71 
72 sh$target:::function-entry,
73 sh$target:::function-return,
74 sh$target:::builtin-entry,
75 sh$target:::command-entry,
76 syscall:::entry,
77 syscall:::return,
78 /* Customize Here, */
79 pid$target:a.out:e*:entry,
80 pid$target:a.out:e*:return
81 /self->last == 0 && pid == $target/
82 {
83 	self->last = timestamp;
84 }
85 
86 sh$target:::function-entry
87 {
88 	this->delta = (timestamp - self->last) / 1000;
89 	printf("%s%d %6d %10d  %16s:%-4d %-8s %*s-> %s%s\n", color_shell,
90 	    cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "func",
91 	    self->depth * 2, "", copyinstr(arg1), color_off);
92 	self->depth++;
93 	self->last = timestamp;
94 }
95 
96 sh$target:::function-return
97 {
98 	this->delta = (timestamp - self->last) / 1000;
99 	self->depth -= self->depth > 0 ? 1 : 0;
100 	printf("%s%d %6d %10d  %16s:-    %-8s %*s<- %s%s\n", color_shell,
101 	    cpu, pid, this->delta, basename(copyinstr(arg0)), "func",
102 	    self->depth * 2, "", copyinstr(arg1), color_off);
103 	self->last = timestamp;
104 }
105 
106 sh$target:::builtin-entry
107 {
108 	this->delta = (timestamp - self->last) / 1000;
109 	printf("%s%d %6d %10d  %16s:%-4d %-8s %*s-> %s%s\n", color_shell,
110 	    cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin",
111 	    self->depth * 2, "", copyinstr(arg1), color_off);
112 	self->depth++;
113 	self->last = timestamp;
114 }
115 
116 sh$target:::builtin-return
117 {
118 	this->delta = (timestamp - self->last) / 1000;
119 	self->depth -= self->depth > 0 ? 1 : 0;
120 	printf("%s%d %6d %10d  %16s:%-4d %-8s %*s<- %s%s\n", color_shell,
121 	    cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "builtin",
122 	    self->depth * 2, "", copyinstr(arg1), color_off);
123 	self->last = timestamp;
124 }
125 
126 sh$target:::command-entry
127 {
128 	this->delta = (timestamp - self->last) / 1000;
129 	printf("%s%d %6d %10d  %16s:%-4d %-8s %*s-> %s%s\n", color_shell,
130 	    cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd",
131 	    self->depth * 2, "", copyinstr(arg1), color_off);
132 	self->depth++;
133 	self->last = timestamp;
134 }
135 
136 sh$target:::command-return
137 {
138 	this->delta = (timestamp - self->last) / 1000;
139 	self->depth -= self->depth > 0 ? 1 : 0;
140 	printf("%s%d %6d %10d  %16s:%-4d %-8s %*s<- %s%s\n", color_shell,
141 	    cpu, pid, this->delta, basename(copyinstr(arg0)), arg2, "cmd",
142 	    self->depth * 2, "", copyinstr(arg1), color_off);
143 	self->last = timestamp;
144 }
145 
146 sh$target:::line
147 {
148 	this->delta = (timestamp - self->last) / 1000;
149 	printf("%s%d %6d %10d  %16s:%-4d %-8s %*s-- %s\n", color_line,
150 	    cpu, pid, this->delta, basename(copyinstr(arg0)), arg1, "line",
151 	    self->depth * 2, "", color_off);
152 	self->last = timestamp;
153 }
154 
155 /* Customise Here, */
156 pid$target:a.out:e*:entry
157 {
158 	this->delta = (timestamp - self->last) / 1000;
159 	printf("%s%d %6d %10d  %16s:-    %-8s %*s-> %s%s\n", color_lib,
160 	    cpu, pid, this->delta, basename(execname), "sh",
161 	    self->depth * 2, "", probefunc, color_off);
162 	self->depth++;
163 	self->last = timestamp;
164 }
165 
166 /* Customise Here, */
167 pid$target:a.out:e*:return
168 {
169 	this->delta = (timestamp - self->last) / 1000;
170 	self->depth -= self->depth > 0 ? 1 : 0;
171 	printf("%s%d %6d %10d  %16s:-    %-8s %*s<- %s%s\n", color_lib,
172 	    cpu, pid, this->delta, basename(execname), "sh",
173 	    self->depth * 2, "", probefunc, color_off);
174 	self->last = timestamp;
175 }
176 
177 syscall:::entry
178 /pid == $target/
179 {
180 	this->delta = (timestamp - self->last) / 1000;
181 	printf("%s%d %6d %10d  %16s:-    %-8s %*s-> %s%s\n", color_syscall,
182 	    cpu, pid, this->delta, basename(execname), "syscall",
183 	    self->depth * 2, "", probefunc, color_off);
184 	self->depth++;
185 	self->last = timestamp;
186 }
187 
188 syscall:::return
189 /pid == $target/
190 {
191 	this->delta = (timestamp - self->last) / 1000;
192 	self->depth -= self->depth > 0 ? 1 : 0;
193 	printf("%s%d %6d %10d  %16s:-    %-8s %*s<- %s%s\n", color_syscall,
194 	    cpu, pid, this->delta, basename(execname), "syscall",
195 	    self->depth * 2, "", probefunc, color_off);
196 	self->last = timestamp;
197 }
198 
199 proc:::exit
200 /pid == $target/
201 {
202 	exit(0);
203 }
204