On 08/03/2015 03:21 PM, Marcel Moolenaar wrote:
On Aug 3, 2015, at 12:59 PM, Eric Badger <eric_bad...@dell.com> wrote:
Hi there,
Since r226435, output from kernel printf/log functions is not appended to the message
buffer when in ddb. The commit message doesn't call this out specifically; instead it
appears to have been to address double printing to the console while in ddb. I noticed
this because a ddb script which previously resulted in some things ending up in a
textdump's msgbuf.txt no longer does so. It may be that the answer is "use db_printf
in ddb", which is ok, but I thought I'd check anyway to see if the aforementioned
change was indeed intentional, since I wasn't able to dig up any discussion about it.
It’s a direct consequence.
But is it a necessary consequence? For example, would the below patch
also be acceptable (it's perhaps not the cleanest way to do it, but
gives the idea)? This way we'll print to the console (once) and, if
TOLOG is also specified, append to the message buffer. If this is not
acceptable, then I think all ddb commands not using db_printf (such as
'show rtc') should be converted to doing so (this might be a good idea
either way), since their output cannot currently be captured in textdumps.
Thanks,
Eric
diff --git sys/kern/subr_prf.c sys/kern/subr_prf.c
index 4f35838..4739331 100644
--- sys/kern/subr_prf.c
+++ sys/kern/subr_prf.c
@@ -463,19 +463,28 @@ putchar(int c, void *arg)
struct putchar_arg *ap = (struct putchar_arg*) arg;
struct tty *tp = ap->tty;
int flags = ap->flags;
+ int putbuf_done = 0;
/* Don't use the tty code after a panic or while in ddb. */
if (kdb_active) {
if (c != '\0')
cnputc(c);
- return;
- }
-
- if ((flags & TOTTY) && tp != NULL && panicstr == NULL)
- tty_putchar(tp, c);
+ /* Prevent double printing. */
+ ap->flags &= ~(TOCONS);
+ flags = ap->flags;
+ } else {
+ if ((panicstr == NULL) && (flags & TOTTY) && (tp != NULL))
+ tty_putchar(tp, c);
- if ((flags & (TOCONS | TOLOG)) && c != '\0')
- putbuf(c, ap);
+ if (flags & TOCONS) {
+ putbuf(c, ap);
+ putbuf_done = 1;
+ }
+ }
+ if ((flags & TOLOG) && (putbuf_done == 0)) {
+ if (c != '\0')
+ putbuf(c, ap);
+ }
}
/*
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"