Implement a show panic command to DDB which will helpfully print the

panic string again if set, in case it scrolled out of the active
window.  This avoids having to remember the symbol name.

Also add a show callout <addr> command to DDB in order to inspect
some struct callout fields in case of panics in the callout code.
This may help to see if there was memory corruption or to further
ease debugging problems.

Obtained from:	projects/vnet
MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
Reviewed by:	jhb (comment only on the show panic initally)
Differential Revision:	https://reviews.freebsd.org/D4527
This commit is contained in:
bz 2016-06-06 20:57:24 +00:00
parent a107889f3e
commit 2919ef7927
3 changed files with 60 additions and 1 deletions

View File

@ -60,7 +60,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd May 18, 2016
.Dd June 6, 2016
.Dt DDB 4
.Os
.Sh NAME
@ -599,6 +599,13 @@ See the
header file for more details on the exact meaning of the structure fields.
.\"
.Pp
.It Ic show Cm callout Ar addr
Show information about the callout structure
.Vt struct callout
present at
.Ar addr .
.\"
.Pp
.It Ic show Cm cbstat
Show brief information about the TTY subsystem.
.\"
@ -834,6 +841,10 @@ option is specified the
complete object is printed.
.\"
.Pp
.It Ic show Cm panic
Print the panic message if set.
.\"
.Pp
.It Ic show Cm page
Show statistics on VM pages.
.\"

View File

@ -929,3 +929,14 @@ mkdumpheader(struct kerneldumpheader *kdh, char *magic, uint32_t archver,
strlcpy(kdh->panicstring, panicstr, sizeof(kdh->panicstring));
kdh->parity = kerneldump_parity(kdh);
}
#ifdef DDB
DB_SHOW_COMMAND(panic, db_show_panic)
{
if (panicstr == NULL)
db_printf("panicstr not set\n");
else
db_printf("panic: %s\n", panicstr);
}
#endif

View File

@ -38,6 +38,7 @@
__FBSDID("$FreeBSD$");
#include "opt_callout_profiling.h"
#include "opt_ddb.h"
#if defined(__arm__)
#include "opt_timer.h"
#endif
@ -60,6 +61,11 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/smp.h>
#ifdef DDB
#include <ddb/ddb.h>
#include <machine/_inttypes.h>
#endif
#ifdef SMP
#include <machine/cpu.h>
#endif
@ -1615,3 +1621,34 @@ SYSCTL_PROC(_kern, OID_AUTO, callout_stat,
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
0, 0, sysctl_kern_callout_stat, "I",
"Dump immediate statistic snapshot of the scheduled callouts");
#ifdef DDB
static void
_show_callout(struct callout *c)
{
db_printf("callout %p\n", c);
#define C_DB_PRINTF(f, e) db_printf(" %s = " f "\n", #e, c->e);
db_printf(" &c_links = %p\n", &(c->c_links));
C_DB_PRINTF("%" PRId64, c_time);
C_DB_PRINTF("%" PRId64, c_precision);
C_DB_PRINTF("%p", c_arg);
C_DB_PRINTF("%p", c_func);
C_DB_PRINTF("%p", c_lock);
C_DB_PRINTF("%#x", c_flags);
C_DB_PRINTF("%#x", c_iflags);
C_DB_PRINTF("%d", c_cpu);
#undef C_DB_PRINTF
}
DB_SHOW_COMMAND(callout, db_show_callout)
{
if (!have_addr) {
db_printf("usage: show callout <struct callout *>\n");
return;
}
_show_callout((struct callout *)addr);
}
#endif /* DDB */