aboutsummaryrefslogtreecommitdiff
path: root/cddl/usr.sbin/dwatch/libexec/proc
blob: 0f67394a84d565e08804e353d76c628b18ead097 (plain) (blame)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# -*- tab-width: 4 -*- ;; Emacs
# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
############################################################ IDENT(1)
#
# $Title: dwatch(8) module for dtrace_proc(4) activity $
# $Copyright: 2014-2018 Devin Teske. All rights reserved. $
# $FreeBSD$
#
############################################################ DESCRIPTION
#
# Display process activity
#
############################################################ PROBE

case "$PROFILE" in
proc)
	: ${PROBE:=$( echo \
		proc:::create, \
		proc:::exec, \
		proc:::exec-failure, \
		proc:::exec-success, \
		proc:::exit, \
		proc:::signal-clear, \
		proc:::signal-discard, \
		proc:::signal-send )}
	;;
proc-signal)
	: ${PROBE:=$( echo \
		proc:::signal-clear, \
		proc:::signal-discard, \
		proc:::signal-send )}
	;;
proc-status)
	: ${PROBE:=$( echo \
		proc:::create, \
		proc:::exec, \
		proc:::exec-failure, \
		proc:::exec-success, \
		proc:::exit )}
	;;
*)
	: ${PROBE:=proc:::${PROFILE#proc-}}
esac

############################################################ ACTIONS

exec 9<<EOF
this int	sig;
this pid_t	pid;
this string	details;
this string	exec_arg0;

inline string probealias[string name] =
	name == "create" ?		"FORK" :
	name == "exec" ?		"EXEC" :
	name == "exec-failure" ?	"FAIL" :
	name == "exec-success" ?	"INIT" :
	name == "exit" ?		"EXIT" :
	name == "signal-clear" ?	"CLEAR" :
	name == "signal-discard" ?	"DISCARD" :
	name == "signal-send" ?		"SEND" :
	name;

$PROBE /* probe ID $ID */
{${TRACE:+
	printf("<$ID>");}
	this->details = "";
}

proc:::create /* probe ID $(( $ID + 1 )) */
{${TRACE:+
	printf("<$(( $ID + 1 ))>");
}
	$( pproc -P _create "(struct proc *)args[0]" )

	/* details = "pid <pid of args[0]> -- <proc args of args[0]>" */
	this->details = strjoin(
		strjoin("pid ", lltostr(this->pid_create)),
		strjoin(" -- ", this->args_create));
}

proc:::exec /* probe ID $(( $ID + 2 )) */
{${TRACE:+
	printf("<$(( $ID + 2 ))");}
	this->details = this->exec_arg0 = stringof(arg0);
}

proc:::exec-failure /* probe ID $(( $ID + 3 )) */
{${TRACE:+
	printf("<$(( $ID + 3 ))>");
}
	/* details = "<arg0 from proc:::exec>: <strerror of arg0> (<arg0>)" */
	this->details = strjoin(
		strjoin(this->exec_arg0, ": "),
		strjoin(strerror[(int)arg0],
			strjoin(" (", strjoin(lltostr((int)arg0), ")"))));
}

proc:::exec-success /* probe ID $(( $ID + 4 )) */
{${TRACE:+
	printf("<$(( $ID + 4 ))>");}
	this->details = this->args0;
}

proc:::exit /* probe ID $(( $ID + 5 )) */
{${TRACE:+
	printf("<$(( $ID + 5 ))>");}
	this->details = child_signal_string[(int)arg0];
}

proc:::signal-clear /* probe ID $(( $ID + 6 )) */
{${TRACE:+
	printf("<$(( $ID + 6 ))>");}
	this->pid = (pid_t)((ksiginfo_t *)args[1])->ksi_info.si_pid;
	this->sig = (int)arg0;
}

proc:::signal-discard, proc:::signal-send /* probe ID $(( $ID + 7 )) */
{${TRACE:+
	printf("<$(( $ID + 7 ))>");}
	this->pid = (pid_t)((struct proc *)args[1])->p_pid;
	this->sig = (int)arg2;
}

proc:::signal-clear,
proc:::signal-discard,
proc:::signal-send /* probe ID $(( $ID + 8 )) */
{${TRACE:+
	printf("<$(( $ID + 8 ))>");
}
	/* details = "<signal>[<num>] pid <pid>" */
	this->details = strjoin(strjoin(signal_string[this->sig], "["),
		strjoin(strjoin(lltostr(this->sig), "] pid "),
		lltostr(this->pid)));
}

proc:::signal-send, proc:::signal-discard /* probe ID $(( $ID + 9 )) */
{${TRACE:+
	printf("<$(( $ID + 9 ))>");
}
	$( pproc -P _signal "(struct proc *)args[1]" )

	this->details = strjoin(this->details,
		strjoin(" -- ", this->args_signal));
}
EOF
ACTIONS=$( cat <&9 )
ID=$(( $ID + 10 ))

############################################################ EVENT DETAILS

if [ ! "$CUSTOM_DETAILS" ]; then
exec 9<<EOF
	/*
	 * Print details
	 */
	printf("%s %s", probealias[probename], this->details);
EOF
EVENT_DETAILS=$( cat <&9 )
fi

################################################################################
# END
################################################################################