#!/usr/sbin/dtrace -Cs /* Usage: openfont.d */ /* target client must be specified as '"program-name"' */ #include #pragma D option quiet string process_name[pid_t]; string target_name; BEGIN { target_name = $2; } proc:::exec { process_name[pid] = args[0]; /* printf("%d -> %s\n", pid, args[0]); */ } proc:::create { process_name[pid] = process_name[ppid]; } /* arg0 -> client id * arg1 -> client host address (string) * arg2 -> client pid (-1 for remote) * arg3 -> client zoneid (-1 for remote) */ Xserver$1:::client-auth / arg2 != -1 && process_name[arg2] == target_name / { trace_client[arg0] = 1; printf(" client id -> id: %4d is from local process %d (%s)\n", arg0, arg2, process_name[arg2]); } /* arg0 -> request name or extension name * arg1 -> request opcode * arg2 -> request length * arg3 -> client id * arg4 -> request data pointer */ xOpenFontReq *openFontReq; Xserver$1:::request-start / trace_client[arg3] && arg1 == X_OpenFont / { openFontReq = (xOpenFontReq *) copyin(arg4, sizeof(xOpenFontReq)); printf("Opening font: id %d -> %.*s\n", openFontReq->fid, openFontReq->nbytes, (string) copyin(arg4 + sizeof(xOpenFontReq),openFontReq->nbytes)); } syscall::open*:entry /pid == $1/ { printf("Xserver opened %s\n", copyinstr(arg0)); } /* arg0 -> client id */ Xserver$1:::client-disconnect / trace_client[arg3] / { printf("disconnect -> id: %4d\n", arg0); trace_client[arg0] = 0; }