svn commit: r249686 - head/usr.bin/procstat

Mikolaj Golub trociny at FreeBSD.org
Sat Apr 20 08:22:10 UTC 2013


Author: trociny
Date: Sat Apr 20 08:22:09 2013
New Revision: 249686
URL: http://svnweb.freebsd.org/changeset/base/249686

Log:
  Make use of newly added libprocstat(3) ability to extract procstat
  info from a process core file.
  
  So now one can run procstat(1) on a process core e.g. to get a list of
  files opened by a process when it crashed:
  
  root at lisa:/ # procstat -f /root/vi.core
    PID COMM               FD T V FLAGS     REF  OFFSET PRO NAME
    658 vi               text v r r--------   -       - -   /usr/bin/vi
    658 vi               ctty v c rw-------   -       - -   /dev/pts/0
    658 vi                cwd v d r--------   -       - -   /root
    658 vi               root v d r--------   -       - -   /
    658 vi                  0 v c rw-------  11    3208 -   /dev/pts/0
    658 vi                  1 v c rw-------  11    3208 -   /dev/pts/0
    658 vi                  2 v c rw-------  11    3208 -   /dev/pts/0
    658 vi                  3 v r r----n-l-   1       0 -   /tmp/vi.0AYKz3Lps7
    658 vi                  4 v r rw-------   1       0 -   /var/tmp/vi.recover/vi.GaGYsz
    658 vi                  5 v r rw-------   1       0 -   -
  
  PR:		kern/173723
  Suggested by:	jhb
  MFC after:	1 month

Modified:
  head/usr.bin/procstat/procstat.1
  head/usr.bin/procstat/procstat.c

Modified: head/usr.bin/procstat/procstat.1
==============================================================================
--- head/usr.bin/procstat/procstat.1	Sat Apr 20 08:19:06 2013	(r249685)
+++ head/usr.bin/procstat/procstat.1	Sat Apr 20 08:22:09 2013	(r249686)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 11, 2012
+.Dd April 20, 2013
 .Dt PROCSTAT 1
 .Os
 .Sh NAME
@@ -38,7 +38,7 @@
 .Op Fl C
 .Op Fl w Ar interval
 .Op Fl b | c | e | f | i | j | k | l | s | t | v | x
-.Op Fl a | Ar pid ...
+.Op Fl a | Ar pid | Ar core ...
 .Sh DESCRIPTION
 The
 .Nm
@@ -47,6 +47,8 @@ utility displays detailed information ab
 arguments, or if the
 .Fl a
 flag is used, all processes.
+It can also display information extracted from a process core file, if
+the core file is specified as the argument.
 .Pp
 By default, basic process statistics are printed; one of the following
 options may be specified in order to select more detailed process information

Modified: head/usr.bin/procstat/procstat.c
==============================================================================
--- head/usr.bin/procstat/procstat.c	Sat Apr 20 08:19:06 2013	(r249685)
+++ head/usr.bin/procstat/procstat.c	Sat Apr 20 08:22:09 2013	(r249686)
@@ -50,7 +50,7 @@ usage(void)
 	fprintf(stderr, "usage: procstat [-h] [-C] [-M core] [-N system] "
 	    "[-w interval] \n");
 	fprintf(stderr, "                [-b | -c | -e | -f | -i | -j | -k | "
-	    "-l | -s | -t | -v | -x] [-a | pid ...]\n");
+	    "-l | -s | -t | -v | -x] [-a | pid | core ...]\n");
 	exit(EX_USAGE);
 }
 
@@ -116,7 +116,7 @@ main(int argc, char *argv[])
 	int ch, interval, tmp;
 	int i;
 	struct kinfo_proc *p;
-	struct procstat *prstat;
+	struct procstat *prstat, *cprstat;
 	long l;
 	pid_t pid;
 	char *dummy;
@@ -255,19 +255,32 @@ main(int argc, char *argv[])
 		}
 		for (i = 0; i < argc; i++) {
 			l = strtol(argv[i], &dummy, 10);
-			if (*dummy != '\0')
-				usage();
-			if (l < 0)
-				usage();
-			pid = l;
-
-			p = procstat_getprocs(prstat, KERN_PROC_PID, pid, &cnt);
-			if (p == NULL)
-				errx(1, "procstat_getprocs()");
-			if (cnt != 0)
-				procstat(prstat, p);
-			procstat_freeprocs(prstat, p);
-
+			if (*dummy == '\0') {
+				if (l < 0)
+					usage();
+				pid = l;
+
+				p = procstat_getprocs(prstat, KERN_PROC_PID, pid, &cnt);
+				if (p == NULL)
+					errx(1, "procstat_getprocs()");
+				if (cnt != 0)
+					procstat(prstat, p);
+				procstat_freeprocs(prstat, p);
+			} else {
+				cprstat = procstat_open_core(argv[i]);
+				if (cprstat == NULL) {
+					warnx("procstat_open()");
+					continue;
+				}
+				p = procstat_getprocs(cprstat, KERN_PROC_PID,
+				    -1, &cnt);
+				if (p == NULL)
+					errx(1, "procstat_getprocs()");
+				if (cnt != 0)
+					procstat(cprstat, p);
+				procstat_freeprocs(cprstat, p);
+				procstat_close(cprstat);
+			}
 			/* Suppress header after first process. */
 			hflag = 1;
 		}


More information about the svn-src-all mailing list