]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - cddl/usr.sbin/dwatch/libexec/proc
Merge ^/vendor/compiler-rt/dist up to its last change, and resolve conflicts.
[FreeBSD/FreeBSD.git] / cddl / usr.sbin / dwatch / libexec / proc
1 # -*- tab-width: 4 -*- ;; Emacs
2 # vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
3 ############################################################ IDENT(1)
4 #
5 # $Title: dwatch(8) module for dtrace_proc(4) activity $
6 # $Copyright: 2014-2018 Devin Teske. All rights reserved. $
7 # $FreeBSD$
8 #
9 ############################################################ DESCRIPTION
10 #
11 # Display process activity
12 #
13 ############################################################ PROBE
14
15 case "$PROFILE" in
16 proc)
17         : ${PROBE:=$( echo \
18                 proc:::create, \
19                 proc:::exec, \
20                 proc:::exec-failure, \
21                 proc:::exec-success, \
22                 proc:::exit, \
23                 proc:::signal-clear, \
24                 proc:::signal-discard, \
25                 proc:::signal-send )}
26         ;;
27 proc-signal)
28         : ${PROBE:=$( echo \
29                 proc:::signal-clear, \
30                 proc:::signal-discard, \
31                 proc:::signal-send )}
32         ;;
33 proc-status)
34         : ${PROBE:=$( echo \
35                 proc:::create, \
36                 proc:::exec, \
37                 proc:::exec-failure, \
38                 proc:::exec-success, \
39                 proc:::exit )}
40         ;;
41 *)
42         : ${PROBE:=proc:::${PROFILE#proc-}}
43 esac
44
45 ############################################################ ACTIONS
46
47 exec 9<<EOF
48 this int        sig;
49 this pid_t      pid;
50 this string     details;
51 this string     exec_arg0;
52
53 inline string probealias[string name] =
54         name == "create" ?              "FORK" :
55         name == "exec" ?                "EXEC" :
56         name == "exec-failure" ?        "FAIL" :
57         name == "exec-success" ?        "INIT" :
58         name == "exit" ?                "EXIT" :
59         name == "signal-clear" ?        "CLEAR" :
60         name == "signal-discard" ?      "DISCARD" :
61         name == "signal-send" ?         "SEND" :
62         name;
63
64 $PROBE /* probe ID $ID */
65 {${TRACE:+
66         printf("<$ID>");}
67         this->details = "";
68 }
69
70 proc:::create /* probe ID $(( $ID + 1 )) */
71 {${TRACE:+
72         printf("<$(( $ID + 1 ))>");
73 }
74         $( pproc -P _create "(struct proc *)args[0]" )
75
76         /* details = "pid <pid of args[0]> -- <proc args of args[0]>" */
77         this->details = strjoin(
78                 strjoin("pid ", lltostr(this->pid_create)),
79                 strjoin(" -- ", this->args_create));
80 }
81
82 proc:::exec /* probe ID $(( $ID + 2 )) */
83 {${TRACE:+
84         printf("<$(( $ID + 2 ))");}
85         this->details = this->exec_arg0 = stringof(arg0);
86 }
87
88 proc:::exec-failure /* probe ID $(( $ID + 3 )) */
89 {${TRACE:+
90         printf("<$(( $ID + 3 ))>");
91 }
92         /* details = "<arg0 from proc:::exec>: <strerror of arg0> (<arg0>)" */
93         this->details = strjoin(
94                 strjoin(this->exec_arg0, ": "),
95                 strjoin(strerror[(int)arg0],
96                         strjoin(" (", strjoin(lltostr((int)arg0), ")"))));
97 }
98
99 proc:::exec-success /* probe ID $(( $ID + 4 )) */
100 {${TRACE:+
101         printf("<$(( $ID + 4 ))>");}
102         this->details = this->args0;
103 }
104
105 proc:::exit /* probe ID $(( $ID + 5 )) */
106 {${TRACE:+
107         printf("<$(( $ID + 5 ))>");}
108         this->details = child_signal_string[(int)arg0];
109 }
110
111 proc:::signal-clear /* probe ID $(( $ID + 6 )) */
112 {${TRACE:+
113         printf("<$(( $ID + 6 ))>");}
114         this->pid = (pid_t)((ksiginfo_t *)args[1])->ksi_info.si_pid;
115         this->sig = (int)arg0;
116 }
117
118 proc:::signal-discard, proc:::signal-send /* probe ID $(( $ID + 7 )) */
119 {${TRACE:+
120         printf("<$(( $ID + 7 ))>");}
121         this->pid = (pid_t)((struct proc *)args[1])->p_pid;
122         this->sig = (int)arg2;
123 }
124
125 proc:::signal-clear,
126 proc:::signal-discard,
127 proc:::signal-send /* probe ID $(( $ID + 8 )) */
128 {${TRACE:+
129         printf("<$(( $ID + 8 ))>");
130 }
131         /* details = "<signal>[<num>] pid <pid>" */
132         this->details = strjoin(strjoin(signal_string[this->sig], "["),
133                 strjoin(strjoin(lltostr(this->sig), "] pid "),
134                 lltostr(this->pid)));
135 }
136
137 proc:::signal-send, proc:::signal-discard /* probe ID $(( $ID + 9 )) */
138 {${TRACE:+
139         printf("<$(( $ID + 9 ))>");
140 }
141         $( pproc -P _signal "(struct proc *)args[1]" )
142
143         this->details = strjoin(this->details,
144                 strjoin(" -- ", this->args_signal));
145 }
146 EOF
147 ACTIONS=$( cat <&9 )
148 ID=$(( $ID + 10 ))
149
150 ############################################################ EVENT DETAILS
151
152 if [ ! "$CUSTOM_DETAILS" ]; then
153 exec 9<<EOF
154         /*
155          * Print details
156          */
157         printf("%s %s", probealias[probename], this->details);
158 EOF
159 EVENT_DETAILS=$( cat <&9 )
160 fi
161
162 ################################################################################
163 # END
164 ################################################################################