- 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:
parent
eb2e5544d3
commit
34763d1c9d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=255493
@ -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;
|
||||
|
@ -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_
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user