version 1.16, 2002/06/12 06:07:15 |
version 1.17, 2002/06/23 20:01:25 |
|
|
int timestamp, decimal, fancy = 1, tail, maxdata; |
int timestamp, decimal, fancy = 1, tail, maxdata; |
char *tracefile = DEF_TRACEFILE; |
char *tracefile = DEF_TRACEFILE; |
struct ktr_header ktr_header; |
struct ktr_header ktr_header; |
|
pid_t pid = -1; |
|
|
#define eqs(s1, s2) (strcmp((s1), (s2)) == 0) |
#define eqs(s1, s2) (strcmp((s1), (s2)) == 0) |
|
|
|
|
static void usage(void); |
static void usage(void); |
|
|
int |
int |
main(argc, argv) |
main(int argc, char *argv[]) |
int argc; |
|
char *argv[]; |
|
{ |
{ |
int ch, ktrlen, size; |
int ch, ktrlen, size, silent; |
void *m; |
|
int trpoints = ALL_POINTS; |
int trpoints = ALL_POINTS; |
|
void *m; |
|
|
current = &emulations[0]; /* native */ |
current = &emulations[0]; /* native */ |
|
|
while ((ch = getopt(argc, argv, "e:f:dlm:nRTt:")) != -1) |
while ((ch = getopt(argc, argv, "e:f:dlm:nRp:Tt:")) != -1) |
switch (ch) { |
switch (ch) { |
case 'e': |
case 'e': |
setemul(optarg); |
setemul(optarg); |
|
|
case 'n': |
case 'n': |
fancy = 0; |
fancy = 0; |
break; |
break; |
|
case 'p': |
|
pid = atoi(optarg); |
|
break; |
case 'R': |
case 'R': |
timestamp = 2; /* relative timestamp */ |
timestamp = 2; /* relative timestamp */ |
break; |
break; |
|
|
if (!freopen(tracefile, "r", stdin)) |
if (!freopen(tracefile, "r", stdin)) |
err(1, "%s", tracefile); |
err(1, "%s", tracefile); |
while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { |
while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { |
if (trpoints & (1<<ktr_header.ktr_type)) |
silent = 0; |
|
if (pid != -1 && pid != ktr_header.ktr_pid) |
|
silent = 1; |
|
if (silent == 0 && trpoints & (1<<ktr_header.ktr_type)) |
dumpheader(&ktr_header); |
dumpheader(&ktr_header); |
if ((ktrlen = ktr_header.ktr_len) < 0) |
if ((ktrlen = ktr_header.ktr_len) < 0) |
errx(1, "bogus length 0x%x", ktrlen); |
errx(1, "bogus length 0x%x", ktrlen); |
|
|
} |
} |
if (ktrlen && fread_tail(m, ktrlen, 1) == 0) |
if (ktrlen && fread_tail(m, ktrlen, 1) == 0) |
errx(1, "data too short"); |
errx(1, "data too short"); |
|
if (silent) |
|
continue; |
if ((trpoints & (1<<ktr_header.ktr_type)) == 0) |
if ((trpoints & (1<<ktr_header.ktr_type)) == 0) |
continue; |
continue; |
switch (ktr_header.ktr_type) { |
switch (ktr_header.ktr_type) { |
|
|
} |
} |
|
|
static int |
static int |
fread_tail(buf, size, num) |
fread_tail(void *buf, int size, int num) |
void *buf; |
|
int num, size; |
|
{ |
{ |
int i; |
int i; |
|
|
|
|
} |
} |
|
|
static void |
static void |
dumpheader(kth) |
dumpheader(struct ktr_header *kth) |
struct ktr_header *kth; |
|
{ |
{ |
char unknown[64], *type; |
|
static struct timeval prevtime; |
static struct timeval prevtime; |
|
char unknown[64], *type; |
struct timeval temp; |
struct timeval temp; |
|
|
switch (kth->ktr_type) { |
switch (kth->ktr_type) { |
|
|
type = "EMUL"; |
type = "EMUL"; |
break; |
break; |
default: |
default: |
(void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type); |
(void)snprintf(unknown, sizeof unknown, "UNKNOWN(%d)", |
|
kth->ktr_type); |
type = unknown; |
type = unknown; |
} |
} |
|
|
|
|
} |
} |
|
|
static void |
static void |
ioctldecode(cmd) |
ioctldecode(u_long cmd) |
u_long cmd; |
|
{ |
{ |
char dirbuf[4], *dir = dirbuf; |
char dirbuf[4], *dir = dirbuf; |
|
|
|
|
} |
} |
|
|
static void |
static void |
ktrsyscall(ktr) |
ktrsyscall(struct ktr_syscall *ktr) |
struct ktr_syscall *ktr; |
|
{ |
{ |
int argsize = ktr->ktr_argsize; |
int argsize = ktr->ktr_argsize; |
register_t *ap; |
register_t *ap; |
|
|
if (fancy) { |
if (fancy) { |
if (ktr->ktr_code == SYS_ioctl) { |
if (ktr->ktr_code == SYS_ioctl) { |
const char *cp; |
const char *cp; |
|
|
if (decimal) |
if (decimal) |
(void)printf("(%ld", (long)*ap); |
(void)printf("(%ld", (long)*ap); |
else |
else |
|
|
} |
} |
|
|
static void |
static void |
ktrsysret(ktr) |
ktrsysret(struct ktr_sysret *ktr) |
struct ktr_sysret *ktr; |
|
{ |
{ |
int ret = ktr->ktr_retval; |
int ret = ktr->ktr_retval; |
int error = ktr->ktr_error; |
int error = ktr->ktr_error; |
|
|
} |
} |
|
|
static void |
static void |
ktrnamei(cp, len) |
ktrnamei(const char *cp, int len) |
const char *cp; |
|
int len; |
|
{ |
{ |
(void)printf("\"%.*s\"\n", len, cp); |
(void)printf("\"%.*s\"\n", len, cp); |
} |
} |
|
|
static void |
static void |
ktremul(cp, len) |
ktremul(char *cp, int len) |
char *cp; |
|
int len; |
|
{ |
{ |
char name[1024]; |
char name[1024]; |
|
|
|
|
} |
} |
|
|
static void |
static void |
ktrgenio(ktr, len) |
ktrgenio(struct ktr_genio *ktr, int len) |
struct ktr_genio *ktr; |
|
int len; |
|
{ |
{ |
int datalen = len - sizeof (struct ktr_genio); |
|
char *dp = (char *)ktr + sizeof (struct ktr_genio); |
char *dp = (char *)ktr + sizeof (struct ktr_genio); |
char *cp; |
int datalen = len - sizeof (struct ktr_genio); |
int col = 0; |
|
int width; |
|
char visbuf[5]; |
|
static int screenwidth = 0; |
static int screenwidth = 0; |
|
int col = 0, width; |
|
char visbuf[5], *cp; |
|
|
if (screenwidth == 0) { |
if (screenwidth == 0) { |
struct winsize ws; |
struct winsize ws; |
|
|
for (; datalen > 0; datalen--, dp++) { |
for (; datalen > 0; datalen--, dp++) { |
(void) vis(visbuf, *dp, VIS_CSTYLE, *(dp+1)); |
(void) vis(visbuf, *dp, VIS_CSTYLE, *(dp+1)); |
cp = visbuf; |
cp = visbuf; |
|
|
/* |
/* |
* Keep track of printables and |
* Keep track of printables and |
* space chars (like fold(1)). |
* space chars (like fold(1)). |
|
|
(void)putchar('\t'); |
(void)putchar('\t'); |
col = 8; |
col = 8; |
} |
} |
switch(*cp) { |
switch (*cp) { |
case '\n': |
case '\n': |
col = 0; |
col = 0; |
(void)putchar('\n'); |
(void)putchar('\n'); |
|
|
} |
} |
|
|
static void |
static void |
ktrpsig(psig) |
ktrpsig(struct ktr_psig *psig) |
struct ktr_psig *psig; |
|
{ |
{ |
(void)printf("SIG%s ", sys_signame[psig->signo]); |
(void)printf("SIG%s ", sys_signame[psig->signo]); |
if (psig->action == SIG_DFL) |
if (psig->action == SIG_DFL) |
|
|
} |
} |
|
|
static void |
static void |
ktrcsw(cs) |
ktrcsw(struct ktr_csw *cs) |
struct ktr_csw *cs; |
|
{ |
{ |
(void)printf("%s %s\n", cs->out ? "stop" : "resume", |
(void)printf("%s %s\n", cs->out ? "stop" : "resume", |
cs->user ? "user" : "kernel"); |
cs->user ? "user" : "kernel"); |
} |
} |
|
|
static void |
static void |
usage() |
usage(void) |
{ |
{ |
|
|
(void)fprintf(stderr, |
(void)fprintf(stderr, |
"usage: kdump [-dnlRT] [-e emulation] [-f trfile] [-m maxdata] [-t [cnis]]\n"); |
"usage: kdump [-dnlRT] [-e emulation] [-p pid] [-f trfile] [-m maxdata] [-t [cnis]]\n"); |
exit(1); |
exit(1); |
} |
} |
|
|
static void |
static void |
setemul(name) |
setemul(const char *name) |
const char *name; |
|
{ |
{ |
int i; |
int i; |
|
|
for (i = 0; emulations[i].name != NULL; i++) |
for (i = 0; emulations[i].name != NULL; i++) |
if (strcmp(emulations[i].name, name) == 0) { |
if (strcmp(emulations[i].name, name) == 0) { |
current = &emulations[i]; |
current = &emulations[i]; |