svn commit: r210567 - stable/8/usr.bin/gcore
Attilio Rao
attilio at FreeBSD.org
Wed Jul 28 16:10:21 UTC 2010
Author: attilio
Date: Wed Jul 28 16:10:21 2010
New Revision: 210567
URL: http://svn.freebsd.org/changeset/base/210567
Log:
MFC r210063, r210065:
Fix the way the segments are included in the gcore outputs (with the
default invokation):
- Right now if segments are not writable are not included. Remove this.
- Right now if a segment is mapped with NOCORE the check is not honoured.
Change this by checking the newly added flag, from libutil,
KVME_FLAG_NOCOREDUMP.
Besides that, add a new flag (-f) that forces a 'full' dump of all the
segments excluding just the malformed ones.
Sponsored by: Sandvine Incorporated
Modified:
stable/8/usr.bin/gcore/elfcore.c
stable/8/usr.bin/gcore/extern.h
stable/8/usr.bin/gcore/gcore.1
stable/8/usr.bin/gcore/gcore.c
Directory Properties:
stable/8/usr.bin/gcore/ (props changed)
Modified: stable/8/usr.bin/gcore/elfcore.c
==============================================================================
--- stable/8/usr.bin/gcore/elfcore.c Wed Jul 28 15:55:14 2010 (r210566)
+++ stable/8/usr.bin/gcore/elfcore.c Wed Jul 28 16:10:21 2010 (r210567)
@@ -488,12 +488,17 @@ readmap(pid_t pid)
kve = &vmentl[i];
/*
- * Ignore segments of the wrong kind and ones which are not
- * readable and writable.
+ * Ignore 'malformed' segments or ones representing memory
+ * mapping with MAP_NOCORE on.
+ * If the 'full' support is disabled, just dump the most
+ * meaningful data segments.
*/
- if ((kve->kve_protection & KVME_PROT_WRITE) == 0 ||
- (kve->kve_protection & KVME_PROT_READ) == 0 ||
- (kve->kve_type != KVME_TYPE_DEFAULT &&
+ if ((kve->kve_protection & KVME_PROT_READ) == 0 ||
+ (kve->kve_flags & KVME_FLAG_NOCOREDUMP) != 0 ||
+ kve->kve_type == KVME_TYPE_DEAD ||
+ kve->kve_type == KVME_TYPE_UNKNOWN ||
+ ((pflags & PFLAGS_FULL) == 0 &&
+ kve->kve_type != KVME_TYPE_DEFAULT &&
kve->kve_type != KVME_TYPE_VNODE &&
kve->kve_type != KVME_TYPE_SWAP))
continue;
Modified: stable/8/usr.bin/gcore/extern.h
==============================================================================
--- stable/8/usr.bin/gcore/extern.h Wed Jul 28 15:55:14 2010 (r210566)
+++ stable/8/usr.bin/gcore/extern.h Wed Jul 28 16:10:21 2010 (r210567)
@@ -34,7 +34,11 @@
* $FreeBSD$
*/
+#define PFLAGS_FULL 0x01
+#define PFLAGS_RESUME 0x02
+
struct dumpers {
int (*ident)(int efd, pid_t pid, char *binfile);
void (*dump)(int efd, int fd, pid_t pid);
};
+extern int pflags;
Modified: stable/8/usr.bin/gcore/gcore.1
==============================================================================
--- stable/8/usr.bin/gcore/gcore.1 Wed Jul 28 15:55:14 2010 (r210566)
+++ stable/8/usr.bin/gcore/gcore.1 Wed Jul 28 16:10:21 2010 (r210567)
@@ -32,7 +32,7 @@
.\" @(#)gcore.1 8.2 (Berkeley) 4/18/94
.\" $FreeBSD$
.\"
-.Dd November 18, 2009
+.Dd July 14, 2010
.Dt GCORE 1
.Os
.Sh NAME
@@ -40,6 +40,7 @@
.Nd get core images of running process
.Sh SYNOPSIS
.Nm
+.Op Fl f
.Op Fl s
.Op Fl c Ar core
.Op Ar executable
@@ -61,6 +62,13 @@ The following options are available:
.It Fl c
Write the core file to the specified file instead of
.Dq Pa core.<pid> .
+.It Fl f
+Dumps all the available segments, excluding only the malformed ones and
+un-dumpable ones. Unlike the default invocation, it also dumps
+device- and sglist-mapped areas that may invalidate the state of
+some transactions. This flag must be used very carefully, when the
+behavior of the application is fully understood and the fallouts can
+be easily controlled.
.It Fl s
Stop the process while gathering the core image, and resume it
when done.
Modified: stable/8/usr.bin/gcore/gcore.c
==============================================================================
--- stable/8/usr.bin/gcore/gcore.c Wed Jul 28 15:55:14 2010 (r210566)
+++ stable/8/usr.bin/gcore/gcore.c Wed Jul 28 16:10:21 2010 (r210567)
@@ -72,6 +72,7 @@ __FBSDID("$FreeBSD$");
#include <unistd.h>
#include "extern.h"
+int pflags;
static void killed(int);
static void restart_target(void);
@@ -84,21 +85,24 @@ SET_DECLARE(dumpset, struct dumpers);
int
main(int argc, char *argv[])
{
- int ch, efd, fd, name[4], sflag;
+ int ch, efd, fd, name[4];
char *binfile, *corefile;
char passpath[MAXPATHLEN], fname[MAXPATHLEN];
struct dumpers **d, *dumper;
size_t len;
- sflag = 0;
+ pflags = 0;
corefile = NULL;
- while ((ch = getopt(argc, argv, "c:s")) != -1) {
+ while ((ch = getopt(argc, argv, "c:fs")) != -1) {
switch (ch) {
case 'c':
corefile = optarg;
break;
+ case 'f':
+ pflags |= PFLAGS_FULL;
+ break;
case 's':
- sflag = 1;
+ pflags |= PFLAGS_RESUME;
break;
default:
usage();
@@ -148,7 +152,7 @@ main(int argc, char *argv[])
fd = open(corefile, O_RDWR|O_CREAT|O_TRUNC, DEFFILEMODE);
if (fd < 0)
err(1, "%s", corefile);
- if (sflag) {
+ if ((pflags & PFLAGS_RESUME) != 0) {
signal(SIGHUP, killed);
signal(SIGINT, killed);
signal(SIGTERM, killed);
More information about the svn-src-all
mailing list