kern/119993: ddb capture buffer too small for textdumps
Scot Hetzel
swhetzel at gmail.com
Sat Jan 26 03:30:01 UTC 2008
>Number: 119993
>Category: kern
>Synopsis: ddb capture buffer too small for textdumps
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sat Jan 26 03:30:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Scot Hetzel
>Release: 8.0-CURRENT
>Organization:
>Environment:
FreeBSD hp010.hetzel.org 8.0-CURRENT FreeBSD 8.0-CURRENT #0: Sat Jan 19 00:03:54 CST 2008 root at hp010.hetzel.org:/usr/src/sys/amd64/compile/DV8135NR amd64
>Description:
While trying to debug a kernel panic, I decided to try the new textdump feature and scripted ddb. I increased debug.ddb.capture.bufsize to it's maximum size (512K). When the kerne paniced, the kdb.enter.panic script ran but had its output truncated to 512K.
debug.ddb.capture.bufsize: 49152
debug.ddb.capture.maxbufsize: 524288
The problem is that sys/ddb/db_capture.c has fixed DB_CAPTURE_MAXBUFSIZE to 512K. I was able to get the full output by increasing DB_CAPTURE_MAXBUFSIZE to 5M (3M would have been enough, as ddb.txt was only 2.7M).
>How-To-Repeat:
Add the following to the kernel config file:
options DEBUG_VFS_LOCKS
options KTR
options KTR_COMPILE=(KTR_SPARE2)
options KTR_MASK=(KTR_SPARE2)
options KTR_ENTRIES=32768
and then build/install the kernel. After the reboot, use ddb to add the following scripts:
/sbin/ddb script lockinfo="show locks; show alllocks; show lockedvnods"
/sbin/ddb script kdb.enter.panic="textdump set; capture on; show ktr ; run lockinfo ; show pcpu; bt; ps; alltrace; capture off; call doadump; reset"
sysctl debug.ddb.capture.bufsize=524288
Then do something that causes the kernel to panic.
>Fix:
Apply the attached patch which adds two kernel options to allow the capture buffer size to be changed in the kernel config file:
options DB_CAPTURE_DEFAULTBUFSIZE=2*1024*1024
options DB_CAPTURE_MAXBUFSIZE=5*1024*1024
Should DB_CAPTURE* be changed to DDB_CAPTURE*? Will require a change in ddb/db_capture.c also.
Note: DB_CAPTURE_DEFAULTBUFSIZE can also be set by sysctl.
Patch attached with submission follows:
Index: conf/options
===================================================================
RCS file: /home/ncvs/src/sys/conf/options,v
retrieving revision 1.615
diff -u -r1.615 options
--- conf/options 7 Jan 2008 21:40:09 -0000 1.615
+++ conf/options 25 Jan 2008 23:52:31 -0000
@@ -49,6 +49,8 @@
# Debugging options.
DDB
DDB_NUMSYM opt_ddb.h
+DB_CAPTURE_DEFAULTBUFSIZE opt_ddb.h
+DB_CAPTURE_MAXBUFSIZE opt_ddb.h
GDB
KDB opt_global.h
KDB_TRACE opt_kdb.h
Index: ddb/db_capture.c
===================================================================
RCS file: /home/ncvs/src/sys/ddb/db_capture.c,v
retrieving revision 1.2
diff -u -r1.2 db_capture.c
--- ddb/db_capture.c 26 Dec 2007 11:32:32 -0000 1.2
+++ ddb/db_capture.c 25 Jan 2008 23:50:46 -0000
@@ -46,6 +46,8 @@
#include <ddb/ddb.h>
#include <ddb/db_lex.h>
+#include <opt_ddb.h>
+
/*
* While it would be desirable to use a small block-sized buffer and dump
* incrementally to disk in fixed-size blocks, it's not possible to enter
@@ -55,8 +57,12 @@
*/
static MALLOC_DEFINE(M_DB_CAPTURE, "db_capture", "DDB capture buffer");
+#ifndef DB_CAPTURE_DEFAULTBUFSIZE
#define DB_CAPTURE_DEFAULTBUFSIZE 48*1024
+#endif
+#ifndef DB_CAPTURE_MAXBUFSIZE
#define DB_CAPTURE_MAXBUFSIZE 512*1024
+#endif
#define DB_CAPTURE_FILENAME "ddb.txt" /* Captured DDB output. */
static char *db_capture_buf;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list