Small textdump enhancements.

Allow textdumps to be called explicitly from DDB.

If "dump" is called in DDB and textdumps are enabled then abort the
dump and tell the user to turn off textdumps.

Add options TEXTDUMP_PREFERRED to turn textdumps on by default.
Add options TEXTDUMP_VERBOSE to be a bit more verbose while textdumping.

Reviewed by: rwatson

MFC after:	2 weeks
This commit is contained in:
Alfred Perlstein 2012-11-01 04:07:08 +00:00
parent 72a4047ca7
commit 21d748a957
6 changed files with 72 additions and 7 deletions

View File

@ -1176,6 +1176,7 @@ section for more information on the scripting facility.
.It Ic textdump set
.It Ic textdump status
.It Ic textdump unset
.It Ic textdump dump
The
.Ic textdump set
command may be used to force the next kernel core dump to be a textdump
@ -1184,6 +1185,9 @@ rather than a traditional memory dump or minidump.
reports whether a textdump has been scheduled.
.Ic textdump unset
cancels a request to perform a textdump as the next kernel core dump.
Use the
.Ic textdump dump
command to immediately perform a textdump.
More information may be found in
.Xr textdump 4 .
.El

View File

@ -36,6 +36,9 @@
.Sh SYNOPSIS
.Cd options KDB
.Cd options DDB
.Cd options TEXTDUMP_VERBOSE
.Cd options TEXTDUMP_PREFERRED
.Sh DESCRIPTION
The
.Nm
@ -115,7 +118,11 @@ or by setting the
.Dv debug.ddb.textdump.pending
sysctl to 1 using
.Xr sysctl 8 ,
it is possible to request that the next dump be a textdump.
it is possible to request that the next dump be a textdump. One can
also directly trigger a textdump in
.Xr ddb 4
by running the command
.Ic textdump dump .
.Pp
If at the
.Xr ddb 4
@ -125,10 +132,30 @@ command line, the commands
and
.Ic textdump unset
may be used to set, query, and clear the textdump pending flag.
The command
.Ic textdump dump
can be used to immediately trigger a textdump.
.Pp
As with regular kernel dumps, a dump partition must be automatically or
manually configured using
.Xr dumpon 8 .
.Pp
Additional kernel
.Xr config 8
options:
.Bl -tag -width TEXTDUMP_PREFERRED
.It Cd TEXTDUMP_PREFERRED
sets textdumps to be the default manner of doing dumps. This means there
will be no need to
.Xr sysctl 8
or use the
.Cr textdump set
.Xr ddb 8
commands.
.It Cd TEXTDUMP_VERBOSE
will have the textdump facility be more verbose about each file it is emitting
as well as other diagnostics useful to debug the textdump facility itself.
.El
.Sh EXAMPLES
In the following example, the script
.Dv kdb.enter.panic

View File

@ -388,6 +388,16 @@ options GDB
#
options SYSCTL_DEBUG
#
# Enable textdump by default, this disables kernel core dumps.
#
options TEXTDUMP_PREFERRED
#
# Enable extra debug messages while performing textdumps.
#
options TEXTDUMP_VERBOSE
#
# NO_SYSCTL_DESCR omits the sysctl node descriptions to save space in the
# resulting kernel.

View File

@ -61,6 +61,8 @@ KDB_TRACE opt_kdb.h
KDB_UNATTENDED opt_kdb.h
KLD_DEBUG opt_kld.h
SYSCTL_DEBUG opt_sysctl.h
TEXTDUMP_PREFERRED opt_ddb.h
TEXTDUMP_VERBOSE opt_ddb.h
# Miscellaneous options.
ADAPTIVE_LOCKMGRS

View File

@ -535,6 +535,11 @@ db_dump(db_expr_t dummy, boolean_t dummy2, db_expr_t dummy3, char *dummy4)
{
int error;
if (textdump_pending) {
db_printf("textdump_pending set.\n"
"run \"textdump unset\" first or \"textdump dump\" for a textdump.\n");
return;
}
error = doadump(FALSE);
if (error) {
db_printf("Cannot dump: ");

View File

@ -61,6 +61,8 @@ __FBSDID("$FreeBSD$");
#include "opt_config.h"
#include "opt_ddb.h"
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/kernel.h>
@ -118,7 +120,11 @@ CTASSERT(sizeof(struct ustar_header) == TEXTDUMP_BLOCKSIZE);
* Is a textdump scheduled? If so, the shutdown code will invoke our dumpsys
* routine instead of the machine-dependent kernel dump routine.
*/
int textdump_pending;
#ifdef TEXTDUMP_PREFERRED
int textdump_pending = 1;
#else
int textdump_pending = 0;
#endif
SYSCTL_INT(_debug_ddb_textdump, OID_AUTO, pending, CTLFLAG_RW,
&textdump_pending, 0,
"Perform textdump instead of regular kernel dump.");
@ -201,6 +207,10 @@ textdump_mkustar(char *block_buffer, const char *filename, u_int size)
{
struct ustar_header *uhp;
#ifdef TEXTDUMP_VERBOSE
if (textdump_error == 0)
printf("textdump: creating '%s'.\n", filename);
#endif
uhp = (struct ustar_header *)block_buffer;
bzero(uhp, sizeof(*uhp));
strlcpy(uhp->uh_filename, filename, sizeof(uhp->uh_filename));
@ -237,6 +247,9 @@ textdump_writeblock(struct dumperinfo *di, off_t offset, char *buffer)
return (ENOSPC);
textdump_error = dump_write(di, buffer, 0, offset + di->mediaoffset,
TEXTDUMP_BLOCKSIZE);
if (textdump_error)
printf("textdump_writeblock: offset %jd, error %d\n", (intmax_t)offset,
textdump_error);
return (textdump_error);
}
@ -430,7 +443,7 @@ textdump_dumpsys(struct dumperinfo *di)
* of data.
*/
if (di->mediasize < SIZEOF_METADATA + 2 * sizeof(kdh)) {
printf("Insufficient space on dump partition.\n");
printf("Insufficient space on dump partition for minimal textdump.\n");
return;
}
textdump_error = 0;
@ -480,9 +493,9 @@ textdump_dumpsys(struct dumperinfo *di)
if (textdump_error == 0)
(void)dump_write(di, NULL, 0, 0, 0);
if (textdump_error == ENOSPC)
printf("Insufficient space on dump partition\n");
printf("Textdump: Insufficient space on dump partition\n");
else if (textdump_error != 0)
printf("Error %d writing dump\n", textdump_error);
printf("Textdump: Error %d writing dump\n", textdump_error);
else
printf("Textdump complete.\n");
textdump_pending = 0;
@ -499,7 +512,7 @@ static void
db_textdump_usage(void)
{
db_printf("textdump [unset|set|status]\n");
db_printf("textdump [unset|set|status|dump]\n");
}
void
@ -528,6 +541,10 @@ db_textdump_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
} else if (strcmp(db_tok_string, "unset") == 0) {
textdump_pending = 0;
db_printf("textdump unset\n");
} else
} else if (strcmp(db_tok_string, "dump") == 0) {
textdump_pending = 1;
doadump(TRUE);
} else {
db_textdump_usage();
}
}