#!/usr/sbin/dtrace -s /* "destructive" because we call system() */ #pragma D option destructive #pragma D option quiet proc:::exec { process_name[pid] = args[0]; } proc:::create { process_name[pid] = process_name[ppid]; } /* arg0 -> client id */ Xserver*:::client-connect { client_start[arg0] = timestamp; client_req_count[arg0] = 0; client_req_time[arg0] = 0; printf(" connect -> id: %4d\n", arg0); } /* arg0 -> client id * arg1 -> client host address (string) * arg2 -> client pid (-1 for remote) * arg3 -> client zoneid (-1 for remote) */ Xserver*:::client-auth / arg2 == -1 / { printf(" client id -> id: %4d is from remote host %s\n", arg0, copyinstr(arg1)); } Xserver*:::client-auth / arg2 != -1 / { printf(" client id -> id: %4d is from local process %d (%s)\n", arg0, arg2, process_name[arg2]); system("/usr/bin/pargs %d | head -1", arg2); } /* arg0 -> request name or extension name * arg1 -> request opcode * arg2 -> request length * arg3 -> client id * arg4 -> request data pointer */ Xserver*:::request-start { reqstart = vtimestamp; } /* arg0 -> request name or extension name * arg1 -> request opcode * arg2 -> request length * arg3 -> client id * arg4 -> request result code */ Xserver*:::request-done { client_req_time[arg3] += vtimestamp - reqstart; client_req_count[arg3] ++; } /* arg0 -> client id */ Xserver*:::client-disconnect { printf("disconnect -> id: %4d, lifetime: %d ms, requests: %d (%d ms of CPU time)\n", arg0, (timestamp - client_start[arg0]) / 1000000, client_req_count[arg0], client_req_time[arg0] / 1000000); client_start[arg0] = 0; client_reqs[arg0] = 0; }