- Decode the idtype argument passed to wait6() in kdump and truss.

- Don't treat an options argument of 0 to wait4() as an error in
  kdump.
- Decode the wait options passed to wait4() and wait6() in truss
  and decode the returned rusage and exit status.

Approved by:	re (kib)
MFC after:	1 week
This commit is contained in:
John Baldwin 2013-09-12 18:08:25 +00:00
parent eb2e5544d3
commit 34763d1c9d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=255493
4 changed files with 154 additions and 14 deletions

View File

@ -59,6 +59,7 @@ extern int errno;
#include <sys/sysent.h>
#include <sys/un.h>
#include <sys/queue.h>
#include <sys/wait.h>
#ifdef IPX
#include <sys/types.h>
#include <netipx/ipx.h>
@ -664,10 +665,32 @@ ktrsyscall(struct ktr_syscall *ktr, u_int flags)
narg -= 2;
break;
case SYS_wait4:
print_number(ip, narg, c);
print_number(ip, narg, c);
/*
* A flags value of zero is valid for
* wait4() but not for wait6(), so
* handle zero special here.
*/
if (*ip == 0) {
print_number(ip, narg, c);
} else {
putchar(',');
wait6optname(*ip);
ip++;
narg--;
}
break;
case SYS_wait6:
putchar('(');
idtypename(*ip, decimal);
c = ',';
ip++;
narg--;
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
wait4optname(*ip);
wait6optname(*ip);
ip++;
narg--;
break;

View File

@ -327,6 +327,68 @@ flagsandmodename(int flags, int mode, int decimal)
}
}
/* MANUAL */
void
idtypename(idtype_t idtype, int decimal)
{
switch(idtype) {
case P_PID:
printf("P_PID");
break;
case P_PPID:
printf("P_PPID");
break;
case P_PGID:
printf("P_PGID");
break;
case P_SID:
printf("P_SID");
break;
case P_CID:
printf("P_CID");
break;
case P_UID:
printf("P_UID");
break;
case P_GID:
printf("P_GID");
break;
case P_ALL:
printf("P_ALL");
break;
case P_LWPID:
printf("P_LWPID");
break;
case P_TASKID:
printf("P_TASKID");
break;
case P_PROJID:
printf("P_PROJID");
break;
case P_POOLID:
printf("P_POOLID");
break;
case P_JAILID:
printf("P_JAILID");
break;
case P_CTID:
printf("P_CTID");
break;
case P_CPUID:
printf("P_CPUID");
break;
case P_PSETID:
printf("P_PSETID");
break;
default:
if (decimal) {
printf("%d", idtype);
} else {
printf("%#x", idtype);
}
}
}
/*
* MANUAL
*
@ -426,7 +488,7 @@ auto_switch_type "sockoptname" "SO_[A-Z]+[[:space:]]+0x[0-9]+"
auto_switch_type "socktypename" "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*" "sys/socket.h"
auto_or_type "thrcreateflagsname" "THR_[A-Z]+[[:space:]]+0x[0-9]+" "sys/thr.h"
auto_switch_type "vmresultname" "KERN_[A-Z]+[[:space:]]+[0-9]+" "vm/vm_param.h"
auto_or_type "wait4optname" "W[A-Z]+[[:space:]]+[0-9]+" "sys/wait.h"
auto_or_type "wait6optname" "W[A-Z]+[[:space:]]+[0-9]+" "sys/wait.h"
auto_switch_type "whencename" "SEEK_[A-Z]+[[:space:]]+[0-9]+" "sys/unistd.h"
cat <<_EOF_

View File

@ -40,7 +40,7 @@ enum Argtype { None = 1, Hex, Octal, Int, Name, Ptr, Stat, Ioctl, Quad,
Fd_set, Sigaction, Fcntl, Mprot, Mmapflags, Whence, Readlinkres,
Umtx, Sigset, Sigprocmask, Kevent, Sockdomain, Socktype, Open,
Fcntlflag, Rusage, BinString, Shutdown, Resource, Rlimit, Timeval2,
Pathconf, Rforkflags };
Pathconf, Rforkflags, ExitStatus, Waitoptions, Idtype };
#define ARG_MASK 0xff
#define OUT 0x100

View File

@ -39,12 +39,13 @@ static const char rcsid[] =
* arguments.
*/
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/ptrace.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioccom.h>
@ -263,6 +264,12 @@ static struct syscall syscalls[] = {
.args = { { Name , 0 } , { Name, 1 } } },
{ .name = "posix_openpt", .ret_type = 1, .nargs = 1,
.args = { { Open, 0 } } },
{ .name = "wait4", .ret_type = 1, .nargs = 4,
.args = { { Int, 0 }, { ExitStatus | OUT, 1 }, { Waitoptions, 2 },
{ Rusage | OUT, 3 } } },
{ .name = "wait6", .ret_type = 1, .nargs = 6,
.args = { { Idtype, 0 }, { Int, 1 }, { ExitStatus | OUT, 2 },
{ Waitoptions, 3 }, { Rusage | OUT, 4 }, { Ptr, 5 } } },
{ .name = 0 },
};
@ -381,6 +388,17 @@ static struct xlat rfork_flags[] = {
X(RFSIGSHARE) X(RFTSIGZMB) X(RFLINUXTHPN) XEND
};
static struct xlat wait_options[] = {
X(WNOHANG) X(WUNTRACED) X(WCONTINUED) X(WNOWAIT) X(WEXITED)
X(WTRAPPED) XEND
};
static struct xlat idtype_arg[] = {
X(P_PID) X(P_PPID) X(P_PGID) X(P_SID) X(P_CID) X(P_UID) X(P_GID)
X(P_ALL) X(P_LWPID) X(P_TASKID) X(P_PROJID) X(P_POOLID) X(P_JAILID)
X(P_CTID) X(P_CPUID) X(P_PSETID) XEND
};
#undef X
#undef XEND
@ -537,6 +555,16 @@ get_string(pid_t pid, void *offset, int max)
}
}
static char *
strsig2(int sig)
{
char *tmp;
tmp = strsig(sig);
if (tmp == NULL)
asprintf(&tmp, "%d", sig);
return (tmp);
}
/*
* print_arg
@ -822,19 +850,14 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
free(fds);
break;
}
case Signal: {
long sig;
sig = args[sc->offset];
tmp = strsig(sig);
if (tmp == NULL)
asprintf(&tmp, "%ld", sig);
case Signal:
tmp = strsig2(args[sc->offset]);
break;
}
case Sigset: {
long sig;
sigset_t ss;
int i, used;
char *signame;
sig = args[sc->offset];
if (get_struct(pid, (void *)args[sc->offset], (void *)&ss,
@ -845,8 +868,11 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
tmp = malloc(sys_nsig * 8); /* 7 bytes avg per signal name */
used = 0;
for (i = 1; i < sys_nsig; i++) {
if (sigismember(&ss, i))
used += sprintf(tmp + used, "%s|", strsig(i));
if (sigismember(&ss, i)) {
signame = strsig(i);
used += sprintf(tmp + used, "%s|", signame);
free(signame);
}
}
if (used)
tmp[used-1] = 0;
@ -1143,6 +1169,35 @@ print_arg(struct syscall_args *sc, unsigned long *args, long retval,
asprintf(&tmp, "0x%lx", args[sc->offset]);
break;
}
case ExitStatus: {
char *signame;
int status;
signame = NULL;
if (get_struct(pid, (void *)args[sc->offset], &status,
sizeof(status)) != -1) {
if (WIFCONTINUED(status))
tmp = strdup("{ CONTINUED }");
else if (WIFEXITED(status))
asprintf(&tmp, "{ EXITED,val=%d }",
WEXITSTATUS(status));
else if (WIFSIGNALED(status))
asprintf(&tmp, "{ SIGNALED,sig=%s%s }",
signame = strsig2(WTERMSIG(status)),
WCOREDUMP(status) ? ",cored" : "");
else
asprintf(&tmp, "{ STOPPED,sig=%s }",
signame = strsig2(WTERMSIG(status)));
} else
asprintf(&tmp, "0x%lx", args[sc->offset]);
free(signame);
break;
}
case Waitoptions:
tmp = strdup(xlookup_bits(wait_options, args[sc->offset]));
break;
case Idtype:
tmp = strdup(xlookup(idtype_arg, args[sc->offset]));
break;
default:
errx(1, "Invalid argument type %d\n", sc->type & ARG_MASK);
}