#!/usr/sbin/dtrace -Cs #include #pragma D option quiet string process_name[pid_t]; string target_name; BEGIN { target_name = $2; } proc:::exec { process_name[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 */ xCreatePixmapReq *createReq; xResourceReq *freeReq; Xserver$1:::request-start / trace_client[arg3] && arg1 == X_CreatePixmap / { createReq = (xCreatePixmapReq *) copyin(arg4, sizeof(xCreatePixmapReq)); printf("Creating pixmap: id: 0x%x size: %d,%d\n", createReq->pid, createReq->width, createReq->height); } Xserver$1:::request-start / trace_client[arg3] && arg1 == X_FreePixmap / { freeReq = (xResourceReq *) copyin(arg4, sizeof(xResourceReq)); printf("Freeing pixmap: id: 0x%x\n", freeReq->id); } /* arg0 -> client id */ Xserver$1:::client-disconnect / trace_client[arg3] / { printf("disconnect -> id: %4d\n", arg0); trace_client[arg0] = 0; }