From 7095dba2ce93fb774e059cb4e3445ec2a3f62796 Mon Sep 17 00:00:00 2001 From: Joerg Sonnenberger Date: Thu, 1 Jun 2006 18:18:00 +0000 Subject: [PATCH] Teach kdump a handy new trick: -p $pid selects the records of a specific PID, making it much faster than e.g. grep of the output. Keep track of how long the header was, useful for later additions. Obtained-from: NetBSD --- usr.bin/kdump/kdump.1 | 6 +++++- usr.bin/kdump/kdump.c | 32 +++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/usr.bin/kdump/kdump.1 b/usr.bin/kdump/kdump.1 index fe196e5e64..aa213ce3e4 100644 --- a/usr.bin/kdump/kdump.1 +++ b/usr.bin/kdump/kdump.1 @@ -31,7 +31,7 @@ .\" .\" @(#)kdump.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD: src/usr.bin/kdump/kdump.1,v 1.5.2.2 2001/08/16 13:16:51 ru Exp $ -.\" $DragonFly: src/usr.bin/kdump/kdump.1,v 1.2 2003/06/17 04:29:27 dillon Exp $ +.\" $DragonFly: src/usr.bin/kdump/kdump.1,v 1.3 2006/06/01 18:18:00 joerg Exp $ .\" .Dd June 6, 1993 .Dt KDUMP 1 @@ -45,6 +45,7 @@ .Op Fl f Ar file .Op Fl m Ar maxdata .Op Fl t Op cnisuw +.Op Fl p Ar pid .Sh DESCRIPTION The .Nm @@ -70,6 +71,9 @@ Display at most .Ar maxdata bytes when decoding .Tn I/O . +.It Fl p Ar pid +Display only records for process +.Ar pid . .It Fl n Suppress ad hoc translations. Normally diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c index 2d2486e8aa..01f1ee0d15 100644 --- a/usr.bin/kdump/kdump.c +++ b/usr.bin/kdump/kdump.c @@ -33,7 +33,7 @@ * @(#) Copyright (c) 1988, 1993 The Regents of the University of California. All rights reserved. * @(#)kdump.c 8.1 (Berkeley) 6/6/93 * $FreeBSD: src/usr.bin/kdump/kdump.c,v 1.17 1999/12/29 05:05:33 peter Exp $ - * $DragonFly: src/usr.bin/kdump/kdump.c,v 1.5 2005/06/01 03:05:40 swildner Exp $ + * $DragonFly: src/usr.bin/kdump/kdump.c,v 1.6 2006/06/01 18:18:00 joerg Exp $ */ #define _KERNEL_STRUCTURES @@ -63,13 +63,15 @@ struct ktr_header ktr_header; main(int argc, char **argv) { - int ch, ktrlen, size; + int ch, col, ktrlen, size; + pid_t do_pid = -1; register void *m; int trpoints = ALL_POINTS; + char *cp; (void) setlocale(LC_CTYPE, ""); - while ((ch = getopt(argc,argv,"f:dlm:nRTt:")) != -1) + while ((ch = getopt(argc,argv,"f:dlm:np:RTt:")) != -1) switch((char)ch) { case 'f': tracefile = optarg; @@ -86,6 +88,11 @@ main(int argc, char **argv) case 'n': fancy = 0; break; + case 'p': + do_pid = strtoul(optarg, &cp, 0); + if (*cp != 0) + errx(1,"invalid number %s", optarg); + break; case 'R': timestamp = 2; /* relative timestamp */ break; @@ -110,8 +117,11 @@ main(int argc, char **argv) if (!freopen(tracefile, "r", stdin)) err(1, "%s", tracefile); while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { - if (trpoints & (1< size) { @@ -124,6 +134,8 @@ main(int argc, char **argv) errx(1, "data too short"); if ((trpoints & (1<ktr_type) { case KTR_SYSCALL: @@ -196,17 +209,18 @@ dumpheader(struct ktr_header *kth) type = unknown; } - (void)printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN, kth->ktr_comm); + col = printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN, kth->ktr_comm); if (timestamp) { if (timestamp == 2) { temp = kth->ktr_time; timevalsub(&kth->ktr_time, &prevtime); prevtime = temp; } - (void)printf("%ld.%06ld ", + col += printf("%ld.%06ld ", kth->ktr_time.tv_sec, kth->ktr_time.tv_usec); } - (void)printf("%s ", type); + col += printf("%s ", type); + return col; } #include @@ -441,7 +455,7 @@ ktruser(int len, unsigned char *p) usage(void) { (void)fprintf(stderr, - "usage: kdump [-dnlRT] [-f trfile] [-m maxdata] [-t [cnisuw]]\n"); + "usage: kdump [-dnlRT] [-f trfile] [-m maxdata] [-t [cnisuw]] [-p pid]\n"); exit(1); } -- 2.11.4.GIT