PERFORCE change 54661 for review
Marcel Moolenaar
marcel at FreeBSD.org
Fri Jun 11 22:56:59 GMT 2004
http://perforce.freebsd.org/chv.cgi?CH=54661
Change 54661 by marcel at marcel_nfs on 2004/06/11 22:30:01
o Add option -v so that we can add a bit of chatter to help
diagnosing behavior.
o Add option -d so that the user can specify an alternative
crash directory. This can be given to savecore, so we should
allow it too.
o Add environment variable KGDB_CRASH_DIR so that kgdb(1) can
be used in environments where the crash directory is non-
standard and without having to specify the -d option all the
time.
o Also look for kernel.<n> in the crashdir. This helps to keep
keep core and kernel in sync. Note that kernel.<n> can also
be a directory. We expect the kernel image to be in that
directory and named kernel.
o Fix and update the usage()
Affected files ...
.. //depot/projects/gdb/usr.bin/kgdb/main.c#7 edit
Differences ...
==== //depot/projects/gdb/usr.bin/kgdb/main.c#7 (text+ko) ====
@@ -57,6 +57,8 @@
pid_t gdb_pid;
int dumpnr;
+int verbose;
+
char crashdir[PATH_MAX];
char *kernel;
char *vmcore;
@@ -70,7 +72,8 @@
static void
usage(void)
{
- fprintf(stderr, "usage: %s [-d dumpno] [kernel] [core]\n",
+ fprintf(stderr,
+ "usage: %s [-v] [-d crashdir] [-n dumpnr] [kernel [core]]\n",
getprogname());
exit(1);
}
@@ -107,7 +110,7 @@
}
static void
-parse_dump(void)
+use_dump(int nr)
{
char path[PATH_MAX];
FILE *info;
@@ -115,11 +118,41 @@
struct stat st;
int l;
- snprintf(path, sizeof(path), "%s/vmcore.%d", crashdir, dumpnr);
+ snprintf(path, sizeof(path), "%s/vmcore.%d", crashdir, nr);
if (stat(path, &st) == -1)
err(1, path);
+ if (!S_ISREG(st.st_mode))
+ errx(1, "%s: not a regular file", path);
+
vmcore = strdup(path);
- snprintf(path, sizeof(path), "%s/info.%d", crashdir, dumpnr);
+
+ /*
+ * See if there's a kernel image right here, use it. The kernel
+ * image is either called kernel.<nr> or is in a subdirectory
+ * kernel.<nr> and called kernel.
+ */
+ snprintf(path, sizeof(path), "%s/kernel.%d", crashdir, nr);
+ if (stat(path, &st) == 0) {
+ if (S_ISREG(st.st_mode)) {
+ kernel = strdup(path);
+ return;
+ }
+ if (S_ISDIR(st.st_mode)) {
+ snprintf(path, sizeof(path), "%s/kernel.%d/kernel",
+ crashdir, nr);
+ if (stat(path, &st) == 0 && S_ISREG(st.st_mode)) {
+ kernel = strdup(path);
+ return;
+ }
+ }
+ }
+
+ /*
+ * No kernel image here. Parse the dump header. The kernel object
+ * directory can be found there and we probably have the kernel
+ * image in it still.
+ */
+ snprintf(path, sizeof(path), "%s/info.%d", crashdir, nr);
info = fopen(path, "r");
if (info == NULL) {
warn(path);
@@ -133,9 +166,10 @@
s = strchr(path, ':');
s = (s == NULL) ? path + 4 : s + 1;
l = snprintf(path, sizeof(path), "%s/kernel.debug", s);
- if (stat(path, &st) == -1) {
+ if (stat(path, &st) == -1 || !S_ISREG(st.st_mode)) {
path[l - 6] = '\0';
- if (stat(path, &st) == -1)
+ if (stat(path, &st) == -1 ||
+ !S_ISREG(st.st_mode))
break;
}
kernel = strdup(path);
@@ -143,6 +177,9 @@
}
}
fclose(info);
+
+ if (verbose && kernel == NULL)
+ warnx("dump %d: no kernel found", nr);
}
int
@@ -156,16 +193,17 @@
int f, nfds, status;
int ch;
- strcpy(crashdir, "/var/crash");
- while ((ch = getopt(argc, argv, "n:")) != -1) {
+ strlcpy(crashdir, "/var/crash", sizeof(crashdir));
+ s = getenv("KGDB_CRASH_DIR");
+ if (s != NULL)
+ strlcpy(crashdir, s, sizeof(crashdir));
+
+ while ((ch = getopt(argc, argv, "d:n:v")) != -1) {
switch (ch) {
+ case 'd':
+ strlcpy(crashdir, optarg, sizeof(crashdir));
+ break;
case 'n':
- if (dumpnr) {
- warnx("option %c specified multiple times",
- optopt);
- usage();
- /* NOTREACHED */
- }
dumpnr = strtol(optarg, &s, 0);
if (dumpnr == 0 || *s != '\0') {
warnx("option %c: invalid kernel dump number",
@@ -173,7 +211,9 @@
usage();
/* NOTREACHED */
}
- parse_dump();
+ break;
+ case 'v':
+ verbose++;
break;
case '?':
default:
@@ -183,6 +223,12 @@
argc -= optind;
argv += optind;
+ if (verbose > 1)
+ warnx("using %s as the crash directory", crashdir);
+
+ if (dumpnr)
+ use_dump(dumpnr);
+
if (argc > 0) {
if (kernel != NULL)
free(kernel);
@@ -201,6 +247,11 @@
if (vmcore == NULL)
errx(1, "core file not specified");
+ if (verbose) {
+ warnx("kernel image: %s", kernel);
+ warnx("core file: %s", vmcore);
+ }
+
cmdfile_name = strdup("/tmp/kgdb.XXXXXXXX");
if (cmdfile_name == NULL)
err(1, "strdup(3)");
More information about the p4-projects
mailing list