1# 2# Command file for the GNU Debugger, for kernel debugging. 3# 4# This file can either be put in your home directory as ~/.gdbinit, 5# or selected at run time as: 6# 7# 'gdb -k -q -x /usr/share/misc/gdbinit ...' 8# 9set print union 10set history expansion on 11 12define pcomm 13 printf "%10s\n",$arg0->td_comm 14end 15 16define lsvfs 17 set $vfc = (struct vfsconf *)vfsconf_list.stqh_first 18 printf "\nFilesystem Refs Flags\n" 19 while ($vfc != 0) 20 printf "%-10s %6d 0x%08x\n", $vfc->vfc_name, \ 21 $vfc->vfc_refcount, $vfc->vfc_flags 22 set $vfc = $vfc->vfc_next.stqe_next 23 end 24end 25 26define lsmount 27 set $mnt = (mountlist->tqh_first) 28 while ($mnt != 0) 29 print *$mnt 30 set $mnt = $mnt->mnt_list->tqe_next 31 end 32end 33 34define lsvfsops 35 set $vfc = (struct vfsconf *)vfsconf_list.stqh_first 36 while ($vfc != 0) 37 printf "Filesystem: %s, Refs: %d, Flags: 0x%08x\n", \ 38 $vfc->vfc_name, $vfc->vfc_refcount, $vfc->vfc_flags 39 printf "VFS ops: \n" 40 set print pretty 41 print *$vfc->vfc_vfsops 42 set print pretty off 43 set $vfc = $vfc->vfc_next.stqe_next 44 end 45end 46 47 48define kldstat 49 set $kld = linker_files.tqh_first 50 printf "\nId Refs Address Size Name\n" 51 while ($kld != 0) 52 printf "%2d %4d 0x%08x %-8x %s\n", \ 53 $kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename 54 set $kld = $kld->link.tqe_next 55 end 56end 57 58define psx 59 set $cpu = 0 60 printf "\ncpu pid thread flags comm wchan wmesg\n" 61 while ($cpu < ncpus) 62 set $gd = &((struct privatespace *)&CPU_prvspace)[$cpu].mdglobaldata 63 set $td = $gd->mi.gd_tdallq.tqh_first 64 while ( $td != 0 ) 65 if ( $td->td_proc != 0 ) 66 set $pid = $td->td_proc->p_pid 67 else 68 set $pid = -1 69 end 70 if ( $td->td_wmesg != 0 ) 71 printf "%3d %5d %08x %08x %-18s %08x %s\n", \ 72 $cpu, $pid, $td, $td->td_flags, $td->td_comm, $td->td_wchan, \ 73 $td->td_wmesg 74 else 75 printf "%3d %5d %08x %08x %-18s %08x\n", \ 76 $cpu, $pid, $td, $td->td_flags, $td->td_comm, $td->td_wchan 77 end 78 set $td = $td->td_allq.tqe_next 79 end 80 set $cpu = $cpu + 1 81 end 82end 83 84 85define running_threads 86 set $icpu = 0 87 printf "\ncpu curthread wchan\n" 88 while ($icpu < ncpus) 89 set $ipvspace = (struct privatespace *)&CPU_prvspace 90 set $gd = $ipvspace[$icpu].mdglobaldata.mi 91 set $td = $gd.gd_curthread 92 printf "%d %10s %08x\n", \ 93 $gd.gd_cpuid, $td->td_comm, $td->td_wchan 94 set $icpu = $icpu + 1 95 end 96end 97 98define psax 99 set $proc = allproc->lh_first 100 while $proc != 0 101 printf "%p%6d%10s\n",$proc,$proc->p_pid,$proc->p_comm 102 set $proc = $proc->p_list.le_next 103 end 104end 105 106define _infotok 107 set $token = ($arg0) 108 set $tokref = $token->t_ref 109 if ($tokref != 0) 110 printf "%-15s %10d 0x%08x\n", $token->t_desc, \ 111 $token->t_collisions, $tokref->tr_owner 112 else 113 printf "%-15s %10d not held\n", $token->t_desc, \ 114 $token->t_collisions 115 end 116end 117 118define infotok 119 printf "\nToken collisions owner\n" 120 _infotok ($arg0) 121end 122 123define lstok 124 printf "\nToken collisions owner\n" 125 _infotok &pmap_token 126 _infotok &dev_token 127 _infotok &vm_token 128 _infotok &vmspace_token 129 _infotok &kvm_token 130 _infotok &proc_token 131 _infotok &tty_token 132 _infotok &vnode_token 133 _infotok &vmobj_token 134end 135 136define lstdtok 137 set $mytd=($arg0) 138 printf "\nTokens for td %p (%s)\n", $mytd, $mytd->td_comm 139 printf "\nToken collisions owner\n" 140 set $pos = 0 141 while (td->td_toks_array[$pos]->tr_tok) != 0 142 _infotok &td->td_toks_array[$pos++]->tr_tok 143 end 144end 145 146define dmesg 147 set $bufp = msgbufp->msg_ptr 148 set $size = msgbufp->msg_size 149 set $rseq = msgbufp->msg_bufr % $size 150 set $wseq = msgbufp->msg_bufx % $size 151 if ( $bufp != 0 && $size != 0 && $rseq != $wseq ) 152 while ( $rseq < $wseq ) 153 set $c = $bufp + $rseq 154 printf "%c", *$c 155 set $rseq = $rseq + 1 156 if ( $rseq == msgbufp->msg_size ) 157 set $rseq = 0 158 end 159 end 160 if ( *$c == '\n' ) 161 printf "\n" 162 end 163 printf "\n" 164 end 165end 166 167# Documentation, usable within GDB using the 'help' command. 168document lsvfs 169Output list of loaded file systems, refcount, similar to the 170lsvfs(1) utility. 171end 172 173document lsmount 174Iterate the current list of mount structures loaded from the 175memory core, there should be one per loaded VFS. 176end 177 178document lsvfsops 179Display the VFS operations vector for each file system found in 180the memory core, preceded by a summarised header. 181end 182 183document kldstat 184Output list of loaded kernel modules in kldstat(1) style. 185end 186 187document pcomm 188Print command name of the given thread pointer (first argument). 189end 190 191document psx 192Output a list of processes with wait-channel (wchan) information. 193end 194 195document running_threads 196List the threads which are currently running and their CPU number. 197end 198 199document psax 200Output a list of processes. 201end 202 203document lstok 204Display all known global tokens and some information about them. 205end 206 207document lstdtok 208Display all tokens related to the specified thread. 209end 210 211document infotok 212Takes one argument, a struct lwkt_token * (pointer) and prints some 213information about that token. 214end 215 216document dmesg 217Shows the unread portion of the kernel message buffer. 218end 219