Update ncptrace.c to handle DragonFly_Stable and HEAD.
authorMatthew Dillon <dillon@dragonflybsd.org>
Wed, 6 Oct 2004 05:13:20 +0000 (05:13 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Wed, 6 Oct 2004 05:13:20 +0000 (05:13 +0000)
Add ttyinfo.c (does a sanity check on the kernel's clist data)

test/debug/README
test/debug/ncptrace.c
test/debug/ttyinfo.c [new file with mode: 0644]

index 5135fc9..94d0905 100644 (file)
@@ -1,6 +1,10 @@
 Scripts and Tools to help with Debugging DragonFly.
-$DragonFly: src/test/debug/README,v 1.1 2004/06/26 13:09:52 hmp Exp $
+$DragonFly: src/test/debug/README,v 1.2 2004/10/06 05:13:20 dillon Exp $
 
 Files in this directory:
 
        gdb.kernel -    kernel debugging macro set for GDB
+       ncptrace.c -    trace the kernel's namecache hierarchy
+       ttyinfo.c  -    extract clist information and check the
+                       block counts.
+                       
index 06e4712..caf569b 100644 (file)
@@ -9,7 +9,7 @@
  * Trace and dump the kernel namecache hierarchy.  If a path is specified
  * the trace begins there, otherwise the trace begins at the root.
  *
- * $DragonFly: src/test/debug/ncptrace.c,v 1.1 2004/10/03 06:12:34 dillon Exp $
+ * $DragonFly: src/test/debug/ncptrace.c,v 1.2 2004/10/06 05:13:20 dillon Exp $
  */
 
 #define _KERNEL_STRUCTURES_
 #include <nlist.h>
 
 struct nlist Nl[] = {
+#ifdef CINV_PARENT
     { "_rootncp" },
+#else
+    { "_rootnamecache" },
+#endif
     { NULL }
 };
 
@@ -55,7 +59,11 @@ main(int ac, char **av)
        perror("kvm_nlist");
        exit(1);
     }
+#ifdef CINV_PARENT
     kkread(kd, Nl[0].n_value, &ncptr, sizeof(ncptr));
+#else
+    ncptr = (void *)Nl[0].n_value;
+#endif
     if (ac == 1) {
        dumpncp(kd, 0, ncptr, NULL);
     } else {
@@ -113,14 +121,24 @@ dumpncp(kvm_t *kd, int tab, struct namecache *ncptr, const char *path)
     else
        haschildren = 0;
 
+    if (path)
+       printf("ELM ");
+    else
+       printf("%*.*s%s ", tab, tab, "", name);
+    printf("[ncp=%p par=%p %04x vp=%p", 
+           ncptr, ncp.nc_parent, ncp.nc_flag, ncp.nc_vp);
+    if (ncp.nc_timeout)
+       printf(" timo=%d", ncp.nc_timeout);
+    if (ncp.nc_refs)
+       printf(" refs=%d", ncp.nc_refs);
+    if (ncp.nc_exlocks)
+       printf(" LOCKED(%d,td=%p)", ncp.nc_exlocks, ncp.nc_locktd);
+    printf("]");
+
     if (path) {
-       printf("ELM [ncp=%p par=%p %04x vp=%p] %s\n", 
-               ncptr, ncp.nc_parent, ncp.nc_flag, 
-               ncp.nc_vp, name);
+       printf(" %s\n", name);
     } else {
-       printf("%*.*s%s [ncp=%p par=%p %04x vp=%p]%s\n", tab, tab, "", name, 
-               ncptr, ncp.nc_parent, ncp.nc_flag, ncp.nc_vp,
-               haschildren ? " {" : "");
+       printf("%s\n", haschildren ? " {" : "");
     }
     for (ncscan = ncp.nc_list.tqh_first; ncscan; ncscan = ncp.nc_entry.tqe_next) {
        kkread(kd, (u_long)ncscan, &ncp, sizeof(ncp));
diff --git a/test/debug/ttyinfo.c b/test/debug/ttyinfo.c
new file mode 100644 (file)
index 0000000..e7e74a6
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * TTYINFO.C
+ *
+ * cc -I/usr/src/sys ttyinfo.c -o /usr/local/bin/ttyinfo -lkvm
+ *
+ * ttyinfo
+ *
+ * $DragonFly: src/test/debug/ttyinfo.c,v 1.1 2004/10/06 05:13:20 dillon Exp $
+ */
+
+#define _KERNEL_STRUCTURES_
+#include <sys/param.h>
+#include <sys/user.h>
+#include <sys/malloc.h>
+#include <sys/signalvar.h>
+#include <sys/vnode.h>
+#include <sys/namecache.h>
+#include <sys/tty.h>
+#include <sys/clist.h>
+
+#include <vm/vm.h>
+#include <vm/vm_page.h>
+#include <vm/vm_kern.h>
+#include <vm/swap_pager.h>
+#include <vm/vnode_pager.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <kvm.h>
+#include <nlist.h>
+#include <getopt.h>
+
+struct nlist Nl[] = {
+    { "_cfreelist" },
+    { "_cfreecount" },
+    { "_cslushcount" },
+    { "_ctotcount" },
+    { NULL }
+};
+
+static void kkread(kvm_t *kd, u_long addr, void *buf, size_t nbytes);
+static int scanfree(kvm_t *kd, struct cblock *cfree);
+
+main(int ac, char **av)
+{
+    struct cblock *cfree;
+    int cbytes;
+    int count;
+    int slush;
+    int totalcnt;
+    int ch;
+    kvm_t *kd;
+    const char *corefile = NULL;
+    const char *sysfile = NULL;
+
+    while ((ch = getopt(ac, av, "M:N:")) != -1) {
+       switch(ch) {
+       case 'M':
+           corefile = optarg;
+           break;
+       case 'N':
+           sysfile = optarg;
+           break;
+       default:
+           fprintf(stderr, "%s [-M core] [-N system]\n", av[0]);
+           exit(1);
+       }
+    }
+
+    if ((kd = kvm_open(sysfile, corefile, NULL, O_RDONLY, "kvm:")) == NULL) {
+       perror("kvm_open");
+       exit(1);
+    }
+    if (kvm_nlist(kd, Nl) != 0) {
+       perror("kvm_nlist");
+       exit(1);
+    }
+    kkread(kd, Nl[0].n_value, &cfree, sizeof(cfree));
+    kkread(kd, Nl[1].n_value, &cbytes, sizeof(cbytes));
+    kkread(kd, Nl[2].n_value, &slush, sizeof(slush));
+    kkread(kd, Nl[3].n_value, &totalcnt, sizeof(totalcnt));
+    count = scanfree(kd, cfree);
+    printf("blksize %d, freespc %d bytes, %d blks (%d total), %d slush",
+       CBSIZE, cbytes, cbytes / CBSIZE, totalcnt, slush);
+    if (cbytes % CBSIZE)
+       printf(" [unaligned]\n");
+    else
+       printf(" [aligned]\n");
+    printf("freelist found to have %d blocks\n", count);
+    return(0);
+}
+
+static int
+scanfree(kvm_t *kd, struct cblock *cfree)
+{
+    int count = 0;
+    struct cblock cb;
+
+    while (cfree) {
+       kkread(kd, (u_long)cfree, &cb, sizeof(cb));
+       cfree = cb.c_head.ch_next;
+       ++count;
+    }
+    return(count);
+}
+
+static void
+kkread(kvm_t *kd, u_long addr, void *buf, size_t nbytes)
+{
+    if (kvm_read(kd, addr, buf, nbytes) != nbytes) {
+        perror("kvm_read");
+        exit(1);
+    }
+}
+