trussinfo
extern int print_line_prefix(struct trussinfo *);
extern void setup_and_wait(struct trussinfo *, char **);
extern void start_tracing(struct trussinfo *, pid_t);
extern void eventloop(struct trussinfo *);
trussinfo->flags |= EXECVEARGS;
trussinfo->flags |= (COUNTONLY | NOSIGS);
trussinfo->flags |= EXECVEENVS;
trussinfo->flags |= ABSOLUTETIMESTAMPS;
trussinfo->flags |= RELATIVETIMESTAMPS;
trussinfo->strsize = (int)strtonum(optarg, 0, INT_MAX,
trussinfo->flags |= NOSIGS;
trussinfo->flags |= DISPLAYTIDS;
if ((trussinfo->outfile = fopen(fname, "we")) == NULL)
setup_and_wait(trussinfo, command);
start_tracing(trussinfo, pid);
if (LIST_FIRST(&trussinfo->proclist)->abi == NULL) {
kill(LIST_FIRST(&trussinfo->proclist)->pid, SIGKILL);
ptrace(PT_DETACH, LIST_FIRST(&trussinfo->proclist)->pid, NULL,
ptrace(PT_SYSCALL, LIST_FIRST(&trussinfo->proclist)->pid, (caddr_t)1,
clock_gettime(CLOCK_REALTIME, &trussinfo->start_time);
eventloop(trussinfo);
if (trussinfo->flags & COUNTONLY)
print_summary(trussinfo);
fflush(trussinfo->outfile);
struct trussinfo *trussinfo;
trussinfo = (struct trussinfo *)calloc(1, sizeof(struct trussinfo));
if (trussinfo == NULL)
trussinfo->outfile = stderr;
trussinfo->strsize = 32;
trussinfo->curthread = NULL;
LIST_INIT(&trussinfo->proclist);
trussinfo->flags |= FOLLOWFORKS;
setup_and_wait(struct trussinfo *info, char *command[])
start_tracing(struct trussinfo *info, pid_t pid)
add_threads(struct trussinfo *info, struct procinfo *p)
new_proc(struct trussinfo *info, pid_t pid, lwpid_t lwpid)
detach_all_procs(struct trussinfo *info)
find_proc(struct trussinfo *info, pid_t pid)
find_thread(struct trussinfo *info, pid_t pid, lwpid_t lwpid)
find_exit_thread(struct trussinfo *info, pid_t pid)
enter_syscall(struct trussinfo *info, struct threadinfo *t,
thread_exit_syscall(struct trussinfo *info)
exit_syscall(struct trussinfo *info, struct ptrace_lwpinfo *pl)
print_line_prefix(struct trussinfo *info)
report_thread_death(struct trussinfo *info)
report_thread_birth(struct trussinfo *info)
report_exit(struct trussinfo *info, siginfo_t *si)
report_new_child(struct trussinfo *info)
static void enter_syscall(struct trussinfo *, struct threadinfo *,
static void new_proc(struct trussinfo *, pid_t, lwpid_t);
report_signal(struct trussinfo *info, siginfo_t *si, struct ptrace_lwpinfo *pl)
eventloop(struct trussinfo *info)
struct trussinfo *);
void print_syscall(struct trussinfo *);
void print_syscall_ret(struct trussinfo *, int, syscallarg_t *);
void print_summary(struct trussinfo *trussinfo);
print_sockaddr(FILE *fp, struct trussinfo *trussinfo, uintptr_t arg,
pid_t pid = trussinfo->curthread->proc->pid;
print_iovec(FILE *fp, struct trussinfo *trussinfo, uintptr_t arg, int iovcnt)
size_t max_string = trussinfo->strsize;
pid_t pid = trussinfo->curthread->proc->pid;
print_netlink(FILE *fp, struct trussinfo *trussinfo, struct msghdr *msg)
pid_t pid = trussinfo->curthread->proc->pid;
struct trussinfo *trussinfo)
pid = trussinfo->curthread->proc->pid;
int max_string = trussinfo->strsize;
trussinfo->curthread->proc->abi->pointer_size;
(trussinfo->flags & EXECVEARGS) == 0) ||
(trussinfo->flags & EXECVEENVS) == 0)) {
trussinfo->curthread->proc->abi->pointer_size;
print_sockaddr(fp, trussinfo, args[sc->offset], len);
print_iovec(fp, trussinfo, (uintptr_t)hdtr.headers,
print_iovec(fp, trussinfo, (uintptr_t)hdtr.trailers,
print_iovec(fp, trussinfo, args[sc->offset],
print_sockaddr(fp, trussinfo, (uintptr_t)msghdr.msg_name, msghdr.msg_namelen);
if (!print_netlink(fp, trussinfo, &msghdr)) {
print_iovec(fp, trussinfo, (uintptr_t)msghdr.msg_iov,
print_syscall(struct trussinfo *trussinfo)
t = trussinfo->curthread;
len = print_line_prefix(trussinfo);
len += fprintf(trussinfo->outfile, "%s(", name);
len += fprintf(trussinfo->outfile, "%s", s_args[i]);
len += fprintf(trussinfo->outfile,
len += fprintf(trussinfo->outfile, "%s", i < (nargs - 1) ?
len += fprintf(trussinfo->outfile, ")");
fprintf(trussinfo->outfile, "\t");
print_syscall_ret(struct trussinfo *trussinfo, int error, syscallarg_t *retval)
t = trussinfo->curthread;
if (trussinfo->flags & COUNTONLY) {
print_syscall(trussinfo);
fflush(trussinfo->outfile);
fprintf(trussinfo->outfile, "\n");
fprintf(trussinfo->outfile, " ERESTART\n");
fprintf(trussinfo->outfile, " EJUSTRETURN\n");
fprintf(trussinfo->outfile, " ERR#%d '%s'\n",
fprintf(trussinfo->outfile, " = %jd (0x%jx)\n", (intmax_t)off,
fprintf(trussinfo->outfile, " = %jd (0x%jx)\n",
print_summary(struct trussinfo *trussinfo)
fprintf(trussinfo->outfile, "%-20s%15s%8s%8s\n",
fprintf(trussinfo->outfile, "%-20s%5jd.%09ld%8d%8d\n",
fprintf(trussinfo->outfile, "%20s%15s%8s%8s\n",
fprintf(trussinfo->outfile, "%-20s%5jd.%09ld%8d%8d\n",
struct trussinfo;