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:
parent
72a4047ca7
commit
21d748a957
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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: ");
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user