From 21d748a9573ee91dc2434ffd2688e4ea25fb5f06 Mon Sep 17 00:00:00 2001 From: Alfred Perlstein Date: Thu, 1 Nov 2012 04:07:08 +0000 Subject: 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 --- share/man/man4/ddb.4 | 4 ++++ share/man/man4/textdump.4 | 29 ++++++++++++++++++++++++++++- sys/conf/NOTES | 10 ++++++++++ sys/conf/options | 2 ++ sys/ddb/db_command.c | 5 +++++ sys/ddb/db_textdump.c | 29 +++++++++++++++++++++++------ 6 files changed, 72 insertions(+), 7 deletions(-) diff --git a/share/man/man4/ddb.4 b/share/man/man4/ddb.4 index cefa7dd4f6ac..c1751552b007 100644 --- a/share/man/man4/ddb.4 +++ b/share/man/man4/ddb.4 @@ -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 diff --git a/share/man/man4/textdump.4 b/share/man/man4/textdump.4 index c104630e069c..6db4130f0423 100644 --- a/share/man/man4/textdump.4 +++ b/share/man/man4/textdump.4 @@ -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 diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 19fa20bc5b51..2fba6649149f 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -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. diff --git a/sys/conf/options b/sys/conf/options index 69a6eface5c3..574d2e2bdec1 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -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 diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c index e0f14b9c1a85..cc4bde913d6a 100644 --- a/sys/ddb/db_command.c +++ b/sys/ddb/db_command.c @@ -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: "); diff --git a/sys/ddb/db_textdump.c b/sys/ddb/db_textdump.c index 8e78fbf2101e..e66487024040 100644 --- a/sys/ddb/db_textdump.c +++ b/sys/ddb/db_textdump.c @@ -61,6 +61,8 @@ __FBSDID("$FreeBSD$"); #include "opt_config.h" +#include "opt_ddb.h" + #include #include #include @@ -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(); + } } -- cgit v1.2.3