Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sbin/savecore If the position of the formatted panic string ...
details: https://anonhg.NetBSD.org/src/rev/a9fd6a3982a4
branches: trunk
changeset: 509499:a9fd6a3982a4
user: simonb <simonb%NetBSD.org@localhost>
date: Sun May 06 13:36:51 2001 +0000
description:
If the position of the formatted panic string can be found in the
message buffer, use that instead of the raw panic string.
Suggested by Jason Thorpe eons ago.
diffstat:
sbin/savecore/savecore.c | 97 +++++++++++++++++++++++++++++++++++++++++------
1 files changed, 83 insertions(+), 14 deletions(-)
diffs (162 lines):
diff -r bbe045bb9ac0 -r a9fd6a3982a4 sbin/savecore/savecore.c
--- a/sbin/savecore/savecore.c Sun May 06 13:23:42 2001 +0000
+++ b/sbin/savecore/savecore.c Sun May 06 13:36:51 2001 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: savecore.c,v 1.50 2001/01/11 20:27:12 martin Exp $ */
+/* $NetBSD: savecore.c,v 1.51 2001/05/06 13:36:51 simonb Exp $ */
/*-
* Copyright (c) 1986, 1992, 1993
@@ -43,13 +43,13 @@
#if 0
static char sccsid[] = "@(#)savecore.c 8.5 (Berkeley) 4/28/95";
#else
-__RCSID("$NetBSD: savecore.c,v 1.50 2001/01/11 20:27:12 martin Exp $");
+__RCSID("$NetBSD: savecore.c,v 1.51 2001/05/06 13:36:51 simonb Exp $");
#endif
#endif /* not lint */
#include <sys/param.h>
-#include <sys/stat.h>
#include <sys/mount.h>
+#include <sys/msgbuf.h>
#include <sys/syslog.h>
#include <sys/time.h>
@@ -58,6 +58,7 @@
#include <fcntl.h>
#include <nlist.h>
#include <paths.h>
+#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -69,24 +70,30 @@
extern FILE *zopen(const char *fname, const char *mode);
-#define KREAD(kd, addr, p)\
+#define KREAD(kd, addr, p)\
(kvm_read(kd, addr, (char *)(p), sizeof(*(p))) != sizeof(*(p)))
struct nlist current_nl[] = { /* Namelist for currently running system. */
-#define X_DUMPDEV 0
+#define X_DUMPDEV 0
{ "_dumpdev" },
-#define X_DUMPLO 1
+#define X_DUMPLO 1
{ "_dumplo" },
-#define X_TIME 2
+#define X_TIME 2
{ "_time" },
#define X_DUMPSIZE 3
{ "_dumpsize" },
-#define X_VERSION 4
+#define X_VERSION 4
{ "_version" },
-#define X_PANICSTR 5
+#define X_DUMPMAG 5
+ { "_dumpmag" },
+#define X_PANICSTR 6
{ "_panicstr" },
-#define X_DUMPMAG 6
- { "_dumpmag" },
+#define X_PANICSTART 7
+ { "_panicstart" },
+#define X_PANICEND 8
+ { "_panicend" },
+#define X_MSGBUF 9
+ { "_msgbufp" },
{ NULL },
};
int cursyms[] = { X_DUMPDEV, X_DUMPLO, X_VERSION, X_DUMPMAG, -1 };
@@ -98,8 +105,11 @@
{ "_time" },
{ "_dumpsize" },
{ "_version" },
+ { "_dumpmag" },
{ "_panicstr" },
- { "_dumpmag" },
+ { "_panicstart" },
+ { "_panicend" },
+ { "_msgbufp" },
{ NULL },
};
@@ -314,8 +324,9 @@
void
check_kmem(void)
{
- char *cp;
- long panicloc;
+ char *cp, *bufdata;
+ struct kern_msgbuf msgbuf, *bufp;
+ long panicloc, panicstart, panicend;
char core_vers[1024];
(void)kvm_read(kd_dump, dump_nl[X_VERSION].n_value, core_vers,
@@ -327,6 +338,64 @@
"warning: %s version mismatch:\n\t%s\nand\t%s\n",
kernel, vers, core_vers);
+ panicstart = panicend = 0;
+ if (KREAD(kd_dump, dump_nl[X_PANICSTART].n_value, &panicstart) != 0) {
+ if (verbose)
+ syslog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kd_dump));
+ goto nomsguf;
+ }
+ if (KREAD(kd_dump, dump_nl[X_PANICEND].n_value, &panicend) != 0) {
+ if (verbose)
+ syslog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kd_dump));
+ goto nomsguf;
+ }
+ if (panicstart != 0 && panicend != 0) {
+ if (KREAD(kd_dump, dump_nl[X_MSGBUF].n_value, &bufp)) {
+ if (verbose)
+ syslog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kd_dump));
+ goto nomsguf;
+ }
+ if (kvm_read(kd_dump, (long)bufp, &msgbuf,
+ offsetof(struct kern_msgbuf, msg_bufc)) !=
+ offsetof(struct kern_msgbuf, msg_bufc)) {
+ if (verbose)
+ syslog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kd_dump));
+ goto nomsguf;
+ }
+ if (msgbuf.msg_magic != MSG_MAGIC) {
+ if (verbose)
+ syslog(LOG_WARNING, "msgbuf magic incorrect");
+ goto nomsguf;
+ }
+ bufdata = malloc(msgbuf.msg_bufs);
+ if (bufdata == NULL) {
+ if (verbose)
+ syslog(LOG_WARNING, "couldn't allocate space for msgbuf data");
+ goto nomsguf;
+ }
+ if (kvm_read(kd_dump, (long)&bufp->msg_bufc, bufdata,
+ msgbuf.msg_bufs) != msgbuf.msg_bufs) {
+ if (verbose)
+ syslog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kd_dump));
+ goto nomsguf;
+ }
+ cp = panic_mesg;
+ while (panicstart != panicend && cp < &panic_mesg[sizeof(panic_mesg)-1]) {
+ *cp++ = bufdata[panicstart];
+ panicstart++;
+ if (panicstart >= msgbuf.msg_bufs)
+ panicstart = 0;
+ }
+ /* Don't end in a new-line */
+ cp = &panic_mesg[strlen(panic_mesg)] - 1;
+ if (*cp == '\n')
+ *cp = '\0';
+ panic_mesg[sizeof(panic_mesg) - 1] = '\0';
+
+ panicstr = 1; /* anything not zero */
+ return;
+ }
+nomsguf:
if (KREAD(kd_dump, dump_nl[X_PANICSTR].n_value, &panicstr) != 0) {
if (verbose)
syslog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kd_dump));
Home |
Main Index |
Thread Index |
Old Index