1030b9a7cSGreg Lehey# $FreeBSD$ 2030b9a7cSGreg Lehey# General kernel macros 3030b9a7cSGreg Lehey 4030b9a7cSGreg Lehey# Print the command name of the current process 5030b9a7cSGreg Leheydefine pname 6030b9a7cSGreg Leheyp (char *)curproc->p_comm 7030b9a7cSGreg Leheyend 8030b9a7cSGreg Leheydocument pname 9410b51e7SGreg LeheyPrint the command name of the current process. 10030b9a7cSGreg Leheyend 11030b9a7cSGreg Lehey 12030b9a7cSGreg Lehey# Show contents of bp supplied as first parameter: 13030b9a7cSGreg Lehey# 14030b9a7cSGreg Lehey# (gdb) bpp bp 15030b9a7cSGreg Leheydefine bpp 16030b9a7cSGreg Leheyset $bp = (struct buf *) $arg0 17030b9a7cSGreg Lehey if $bp->b_io.bio_dev 18030b9a7cSGreg Lehey printf " Buffer at 0x%x: dev 0x%x data 0x%x bcount 0x%x blkno 0x%x resid 0x%x\n", \ 19030b9a7cSGreg Lehey $bp, \ 20030b9a7cSGreg Lehey $bp->b_io.bio_dev->si_udev, \ 21030b9a7cSGreg Lehey $bp->b_io.bio_data, \ 22030b9a7cSGreg Lehey $bp->b_io.bio_bcount, \ 23030b9a7cSGreg Lehey $bp->b_io.bio_blkno, \ 24030b9a7cSGreg Lehey $bp->b_io.bio_resid 25030b9a7cSGreg Lehey else 26030b9a7cSGreg Lehey printf " Buffer at 0x%x: dev (none) data 0x%x bcount 0x%x blkno 0x%x resid 0x%x\n", \ 27030b9a7cSGreg Lehey $bp, \ 28030b9a7cSGreg Lehey $bp->b_io.bio_data, \ 29030b9a7cSGreg Lehey $bp->b_io.bio_bcount, \ 30030b9a7cSGreg Lehey $bp->b_io.bio_blkno, \ 31030b9a7cSGreg Lehey $bp->b_io.bio_resid 32030b9a7cSGreg Lehey end 33030b9a7cSGreg Lehey printf " flags 0x%x: ", $bp->b_flags 34030b9a7cSGreg Lehey if $bp->b_flags & 0x10 35030b9a7cSGreg Lehey printf "busy " 36030b9a7cSGreg Lehey end 37030b9a7cSGreg Lehey if $bp->b_flags & 0x40 38030b9a7cSGreg Lehey printf "call " 39030b9a7cSGreg Lehey end 40030b9a7cSGreg Lehey if $bp->b_flags & 0x200 41030b9a7cSGreg Lehey printf "done " 42030b9a7cSGreg Lehey end 43030b9a7cSGreg Lehey if $bp->b_flags & 0x800 44030b9a7cSGreg Lehey printf "error " 45030b9a7cSGreg Lehey end 46030b9a7cSGreg Lehey if $bp->b_flags & 0x40000 47030b9a7cSGreg Lehey printf "phys " 48030b9a7cSGreg Lehey end 49030b9a7cSGreg Lehey if $bp->b_flags & 0x100000 50030b9a7cSGreg Lehey printf "read " 51030b9a7cSGreg Lehey end 52030b9a7cSGreg Lehey printf "\n" 53030b9a7cSGreg Leheyend 54030b9a7cSGreg Leheydocument bpp 55410b51e7SGreg LeheyShow summary information about the buffer header (struct bp) pointed at by the parameter. 56030b9a7cSGreg Leheyend 57030b9a7cSGreg Lehey 58030b9a7cSGreg Lehey# Show more detailed contents of bp supplied as first parameter: 59030b9a7cSGreg Lehey# 60030b9a7cSGreg Lehey# (gdb) bpl bp 61030b9a7cSGreg Leheydefine bpl 62030b9a7cSGreg Leheyset $bp = (struct buf *) $arg0 63030b9a7cSGreg Leheyprintf "b_proc: " 64030b9a7cSGreg Leheyoutput $bp->b_proc 65030b9a7cSGreg Leheyprintf "\nb_flags: " 66030b9a7cSGreg Leheyoutput $bp->b_flags 67030b9a7cSGreg Leheyprintf "\nb_qindex: " 68030b9a7cSGreg Leheyoutput $bp->b_qindex 69030b9a7cSGreg Leheyprintf "\nb_usecount: " 70030b9a7cSGreg Leheyoutput $bp->b_usecount 71030b9a7cSGreg Leheyprintf "\nb_error: " 72030b9a7cSGreg Leheyoutput $bp->b_error 73030b9a7cSGreg Leheyprintf "\nb_bufsize: " 74030b9a7cSGreg Leheyoutput $bp->b_bufsize 75030b9a7cSGreg Leheyprintf "\nb_io.bio_bcount: " 76030b9a7cSGreg Leheyoutput $bp->b_io.bio_bcount 77030b9a7cSGreg Leheyprintf "\nb_io.bio_resid: " 78030b9a7cSGreg Leheyoutput $bp->b_io.bio_resid 79030b9a7cSGreg Leheyprintf "\nb_io.bio_dev: " 80030b9a7cSGreg Leheyoutput $bp->b_io.bio_dev 81030b9a7cSGreg Leheyprintf "\nb_io.bio_data: " 82030b9a7cSGreg Leheyoutput $bp->b_io.bio_data 83030b9a7cSGreg Leheyprintf "\nb_kvasize: " 84030b9a7cSGreg Leheyoutput $bp->b_kvasize 85030b9a7cSGreg Leheyprintf "\nb_lblkno: " 86030b9a7cSGreg Leheyoutput $bp->b_lblkno 87030b9a7cSGreg Leheyprintf "\nb_io.bio_blkno: " 88030b9a7cSGreg Leheyoutput $bp->b_io.bio_blkno 89030b9a7cSGreg Leheyprintf "\nb_iodone: " 90030b9a7cSGreg Leheyoutput $bp->b_iodone 91030b9a7cSGreg Leheyprintf "\nb_vp: " 92030b9a7cSGreg Leheyoutput $bp->b_vp 93030b9a7cSGreg Leheyprintf "\nb_dirtyoff: " 94030b9a7cSGreg Leheyoutput $bp->b_dirtyoff 95030b9a7cSGreg Leheyprintf "\nb_dirtyend: " 96030b9a7cSGreg Leheyoutput $bp->b_dirtyend 97030b9a7cSGreg Leheyprintf "\nb_generation: " 98030b9a7cSGreg Leheyoutput $bp->b_generation 99030b9a7cSGreg Leheyprintf "\nb_rcred: " 100030b9a7cSGreg Leheyoutput $bp->b_rcred 101030b9a7cSGreg Leheyprintf "\nb_wcred: " 102030b9a7cSGreg Leheyoutput $bp->b_wcred 103030b9a7cSGreg Leheyprintf "\nb_validoff: " 104030b9a7cSGreg Leheyoutput $bp->b_validoff 105030b9a7cSGreg Leheyprintf "\nb_validend: " 106030b9a7cSGreg Leheyoutput $bp->b_validend 107030b9a7cSGreg Leheyprintf "\nb_pblkno: " 108030b9a7cSGreg Leheyoutput $bp->b_pblkno 109030b9a7cSGreg Leheyprintf "\nb_saveaddr: " 110030b9a7cSGreg Leheyoutput $bp->b_saveaddr 111030b9a7cSGreg Leheyprintf "\nb_savekva: " 112030b9a7cSGreg Leheyoutput $bp->b_savekva 113030b9a7cSGreg Leheyprintf "\nb_driver1: " 114030b9a7cSGreg Leheyoutput $bp->b_driver1 115030b9a7cSGreg Leheyprintf "\nb_driver2: " 116030b9a7cSGreg Leheyoutput $bp->b_driver2 117030b9a7cSGreg Leheyprintf "\nb_spc: " 118030b9a7cSGreg Leheyoutput $bp->b_spc 119030b9a7cSGreg Leheyprintf "\nb_npages: " 120030b9a7cSGreg Leheyoutput $bp->b_npages 121030b9a7cSGreg Leheyprintf "\n" 122030b9a7cSGreg Leheyend 123030b9a7cSGreg Leheydocument bpl 124410b51e7SGreg LeheyShow detailed information about the buffer header (struct bp) pointed at by the parameter. 125030b9a7cSGreg Leheyend 126030b9a7cSGreg Lehey 127030b9a7cSGreg Lehey# Show contents of buffer header in local variable bp. 128030b9a7cSGreg Leheydefine bp 129030b9a7cSGreg Leheybpp bp 130030b9a7cSGreg Leheyend 131030b9a7cSGreg Leheydocument bp 132410b51e7SGreg LeheyShow information about the buffer header pointed to by the variable bp in the current frame. 133030b9a7cSGreg Leheyend 134030b9a7cSGreg Lehey 135030b9a7cSGreg Lehey# Show data of buffer header in local variable bp as string. 136030b9a7cSGreg Leheydefine bpd 137030b9a7cSGreg Lehey printf "Buffer data:\n%s", (char *) bp->b_io.bio_data 138030b9a7cSGreg Leheyend 139030b9a7cSGreg Leheydocument bpd 140030b9a7cSGreg LeheyShow the contents (char*) of bp->data in the current frame. 141030b9a7cSGreg Leheyend 142030b9a7cSGreg Leheydocument bpl 143410b51e7SGreg LeheyShow detailed information about the buffer header (struct bp) pointed at by the local variable bp. 144030b9a7cSGreg Leheyend 145030b9a7cSGreg Leheydefine bx 146030b9a7cSGreg Leheyprintf "\n b_vnbufs " 147030b9a7cSGreg Leheyoutput/x bp->b_vnbufs 148030b9a7cSGreg Leheyprintf "\n b_freelist " 149030b9a7cSGreg Leheyoutput/x bp->b_freelist 150030b9a7cSGreg Leheyprintf "\n b_act " 151030b9a7cSGreg Leheyoutput/x bp->b_act 152030b9a7cSGreg Leheyprintf "\n b_flags " 153030b9a7cSGreg Leheyoutput/x bp->b_flags 154030b9a7cSGreg Leheyprintf "\n b_qindex " 155030b9a7cSGreg Leheyoutput/x bp->b_qindex 156030b9a7cSGreg Leheyprintf "\n b_usecount " 157030b9a7cSGreg Leheyoutput/x bp->b_usecount 158030b9a7cSGreg Leheyprintf "\n b_error " 159030b9a7cSGreg Leheyoutput/x bp->b_error 160030b9a7cSGreg Leheyprintf "\n b_bufsize " 161030b9a7cSGreg Leheyoutput/x bp->b_bufsize 162030b9a7cSGreg Leheyprintf "\n b_io.bio_bcount " 163030b9a7cSGreg Leheyoutput/x bp->b_io.bio_bcount 164030b9a7cSGreg Leheyprintf "\n b_io.bio_resid " 165030b9a7cSGreg Leheyoutput/x bp->b_io.bio_resid 166030b9a7cSGreg Leheyprintf "\n b_io.bio_dev " 167030b9a7cSGreg Leheyoutput/x bp->b_io.bio_dev 168030b9a7cSGreg Leheyprintf "\n b_io.bio_data " 169030b9a7cSGreg Leheyoutput/x bp->b_io.bio_data 170030b9a7cSGreg Leheyprintf "\n b_kvasize " 171030b9a7cSGreg Leheyoutput/x bp->b_kvasize 172030b9a7cSGreg Leheyprintf "\n b_io.bio_blkno " 173030b9a7cSGreg Leheyoutput/x bp->b_io.bio_blkno 174030b9a7cSGreg Leheyprintf "\n b_iodone_chain " 175030b9a7cSGreg Leheyoutput/x bp->b_iodone_chain 176030b9a7cSGreg Leheyprintf "\n b_vp " 177030b9a7cSGreg Leheyoutput/x bp->b_vp 178030b9a7cSGreg Leheyprintf "\n b_dirtyoff " 179030b9a7cSGreg Leheyoutput/x bp->b_dirtyoff 180030b9a7cSGreg Leheyprintf "\n b_validoff " 181030b9a7cSGreg Leheyoutput/x bp->b_validoff 182030b9a7cSGreg Leheyecho \n 183030b9a7cSGreg Leheyend 184410b51e7SGreg Leheydocument bx 185410b51e7SGreg LeheyPrint a number of fields from the buffer header pointed at in by the pointer bp in the current environment. 186410b51e7SGreg Leheyend 187030b9a7cSGreg Lehey 188030b9a7cSGreg Lehey# Switch back to ddb 189030b9a7cSGreg Leheydefine ddb 190030b9a7cSGreg Leheyset boothowto=0x80000000 191030b9a7cSGreg Leheys 192030b9a7cSGreg Leheyend 193030b9a7cSGreg Leheydocument ddb 194030b9a7cSGreg LeheySwitch back to ddb. 195030b9a7cSGreg Leheyend 196030b9a7cSGreg Lehey 197030b9a7cSGreg Lehey# ps: equivalent of the userland command 198030b9a7cSGreg Leheydefine ps 199030b9a7cSGreg Lehey set $nproc = nprocs 200030b9a7cSGreg Lehey set $aproc = allproc.lh_first 201030b9a7cSGreg Lehey set $proc = allproc.lh_first 202*e7dd6e94SGleb Smirnoff set $tid = 1 203*e7dd6e94SGleb Smirnoff printf "pid/ID ppid/tid uid pgrp flag st comm/name proc/thread\n" 204030b9a7cSGreg Lehey while (--$nproc >= 0) 205030b9a7cSGreg Lehey set $pptr = $proc.p_pptr 206030b9a7cSGreg Lehey if ($pptr == 0) 207030b9a7cSGreg Lehey set $pptr = $proc 208030b9a7cSGreg Lehey end 209030b9a7cSGreg Lehey if ($proc.p_state) 210*e7dd6e94SGleb Smirnoff printf " %5d %6d %4d %5d %8x %2d %-10s %p\n", \ 211*e7dd6e94SGleb Smirnoff $proc.p_pid, $pptr->p_pid, \ 212*e7dd6e94SGleb Smirnoff $proc.p_ucred->cr_ruid, \ 213*e7dd6e94SGleb Smirnoff $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_state, \ 214*e7dd6e94SGleb Smirnoff &$proc.p_comm[0], $aproc 215030b9a7cSGreg Lehey set $thread = $proc->p_threads.tqh_first 216030b9a7cSGreg Lehey while ($thread) 217*e7dd6e94SGleb Smirnoff printf "(%5d) %6d %-10s %p", \ 218*e7dd6e94SGleb Smirnoff $tid, $thread->td_tid, $thread->td_name, $thread 219030b9a7cSGreg Lehey if ($thread.td_wmesg) 220030b9a7cSGreg Lehey printf " %s", $thread.td_wmesg 221030b9a7cSGreg Lehey end 222030b9a7cSGreg Lehey printf "\n" 223030b9a7cSGreg Lehey set $thread = $thread->td_plist.tqe_next 224*e7dd6e94SGleb Smirnoff set $tid = $tid + 1 225030b9a7cSGreg Lehey end 226030b9a7cSGreg Lehey end 227030b9a7cSGreg Lehey set $aproc = $proc.p_list.le_next 228030b9a7cSGreg Lehey if ($aproc == 0 && $nproc > 0) 229030b9a7cSGreg Lehey set $aproc = zombproc 230030b9a7cSGreg Lehey end 231030b9a7cSGreg Lehey set $proc = $aproc 232030b9a7cSGreg Lehey end 233030b9a7cSGreg Leheyend 234030b9a7cSGreg Leheydocument ps 235410b51e7SGreg LeheyShow process status without options. 236030b9a7cSGreg Leheyend 237030b9a7cSGreg Lehey 238030b9a7cSGreg Lehey# Specify a process for other commands to refer to. 239030b9a7cSGreg Lehey# Most are machine-dependent. 240030b9a7cSGreg Leheydefine defproc 241030b9a7cSGreg Lehey set $nproc = nprocs 242030b9a7cSGreg Lehey set $aproc = allproc.lh_first 243030b9a7cSGreg Lehey set $proc = allproc.lh_first 244030b9a7cSGreg Lehey while (--$nproc >= 0) 245030b9a7cSGreg Lehey if ($proc->p_pid == $arg0) 246030b9a7cSGreg Lehey set $pptr = $proc.p_pptr 247030b9a7cSGreg Lehey if ($pptr == 0) 248030b9a7cSGreg Lehey set $pptr = $proc 249030b9a7cSGreg Lehey end 250030b9a7cSGreg Lehey set $myvectorproc = $proc 25136572f48SGreg Lehey if ($proc.p_state) 25236572f48SGreg Lehey set $thread = $proc->p_threads.tqh_first 25336572f48SGreg Lehey while ($thread) 254030b9a7cSGreg Lehey printf "%5d %08x %08x %4d %5d %5d %06x %d %-10s ", \ 255030b9a7cSGreg Lehey $proc.p_pid, $aproc, \ 25636572f48SGreg Lehey $proc.p_uarea, $proc.p_ucred->cr_ruid, $pptr->p_pid, \ 25736572f48SGreg Lehey $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_state, \ 258030b9a7cSGreg Lehey &$proc.p_comm[0] 25936572f48SGreg Lehey if ($thread.td_wchan) 26036572f48SGreg Lehey if ($thread.td_wmesg) 26136572f48SGreg Lehey printf "%s ", $thread.td_wmesg 262030b9a7cSGreg Lehey end 26336572f48SGreg Lehey printf "%x", $thread.td_wchan 264030b9a7cSGreg Lehey end 265030b9a7cSGreg Lehey printf "\n" 26636572f48SGreg Lehey set $thread = $thread->td_plist.tqe_next 26736572f48SGreg Lehey end 268030b9a7cSGreg Lehey end 269030b9a7cSGreg Lehey btpp 270030b9a7cSGreg Lehey set $nproc = 0 271030b9a7cSGreg Lehey else 272030b9a7cSGreg Lehey set $proc = $proc.p_list.le_next 273030b9a7cSGreg Lehey end 274030b9a7cSGreg Lehey end 275030b9a7cSGreg Leheyend 276030b9a7cSGreg Leheydocument defproc 277030b9a7cSGreg LeheySpecify a process for btpp and fr commands. 278030b9a7cSGreg Leheyend 279030b9a7cSGreg Lehey 280030b9a7cSGreg Leheydefine vdev 281030b9a7cSGreg Leheyif (vp->v_type == VBLK) 282030b9a7cSGreg Lehey p *vp->v_un.vu_spec.vu_specinfo 283030b9a7cSGreg Lehey printf "numoutput: %d\n", vp->v_numoutput 284030b9a7cSGreg Leheyelse 285030b9a7cSGreg Lehey echo "Not a block device" 286030b9a7cSGreg Leheyend 287030b9a7cSGreg Leheyend 288030b9a7cSGreg Leheydocument vdev 289030b9a7cSGreg LeheyShow some information of the vnode pointed to by the local variable vp. 290030b9a7cSGreg Leheyend 291030b9a7cSGreg Lehey 292030b9a7cSGreg Lehey# Kludge. When changing macros, it's convenient to copy and paste 293030b9a7cSGreg Lehey# definitions from the editor into the debugger window. 294030b9a7cSGreg Lehey# Unfortunately, gdb insists on asking for confirmation after the 295030b9a7cSGreg Lehey# "define" line. y enables you to insert the confirmation in the 296030b9a7cSGreg Lehey# definition without affecting the way the macro runs (much). 297030b9a7cSGreg Leheydefine y 298410b51e7SGreg Leheyecho Check your .gdbinit: it contains a y command\n 299410b51e7SGreg Leheyend 300410b51e7SGreg Lehey 301410b51e7SGreg Leheydocument y 302410b51e7SGreg LeheyKludge for writing macros This is a no-op except for printing a message See gdb(4) for more details. 303030b9a7cSGreg Leheyend 304030b9a7cSGreg Lehey 305a783ff94SGreg Lehey# dmesg: print msgbuf. Can take forever. 306a783ff94SGreg Leheydefine dmesg 307030b9a7cSGreg Leheyprintf "%s", msgbufp->msg_ptr 308030b9a7cSGreg Leheyend 309a783ff94SGreg Leheydocument dmesg 310a783ff94SGreg LeheyPrint the system message buffer (dmesg) This can take a long time due to the time it takes to transmit the data across a serial line and even on a firewire connection the processing time slows it down 311030b9a7cSGreg Leheyend 312030b9a7cSGreg Lehey 313030b9a7cSGreg Lehey# checkmem: check unallocated memory for modifications 314030b9a7cSGreg Lehey# this assumes that DIAGNOSTIC is set, which causes 315030b9a7cSGreg Lehey# free memory to be set to 0xdeadc0de 316030b9a7cSGreg Lehey# 317030b9a7cSGreg Lehey# Use: checkmem offset length 318030b9a7cSGreg Leheydefine checkmem 319030b9a7cSGreg Leheyset $offset = $arg0 320030b9a7cSGreg Lehey# XXX sizeof int. Needs changing for 64 bit machines. 321030b9a7cSGreg Lehey# subtract 1 because the last word is always different. 322030b9a7cSGreg Leheyset $length = $arg1 / 4 - 1 323030b9a7cSGreg Leheyset $word = 0 324030b9a7cSGreg Leheywhile ($word < $length) 325030b9a7cSGreg Lehey if ((int *) $offset) [$word] != 0xdeadc0de 326030b9a7cSGreg Lehey printf "invalid word 0x%x at 0x%x\n", ((int *) $offset) [$word], &((int *) $offset) [$word] 327030b9a7cSGreg Lehey end 328030b9a7cSGreg Lehey set $word = $word + 1 329030b9a7cSGreg Leheyend 330030b9a7cSGreg Leheyend 331410b51e7SGreg Lehey 332410b51e7SGreg Leheydocument checkmem 333410b51e7SGreg LeheyCheck unallocated memory for modifications This assumes that DIAGNOSTIC is set which causes free memory to be set to 0xdeadc0de. 334410b51e7SGreg Leheyend 3351cff4d0cSGreg Lehey 3361cff4d0cSGreg Leheydefine kernel 3371cff4d0cSGreg Lehey exec-file kernel.$arg0 3381cff4d0cSGreg Lehey symbol-file symbols.$arg0 3391cff4d0cSGreg Lehey core-file vmcore.$arg0 3401cff4d0cSGreg Leheyend 3411cff4d0cSGreg Lehey 3421cff4d0cSGreg Leheydefine kldstat 3431cff4d0cSGreg Lehey set $kld = linker_files.tqh_first 3441cff4d0cSGreg Lehey printf "Id Refs Address Size Name\n" 3451cff4d0cSGreg Lehey while ($kld != 0) 3461cff4d0cSGreg Lehey printf "%2d %4d 0x%08x %-8x %s\n", \ 3471cff4d0cSGreg Lehey $kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename 3481cff4d0cSGreg Lehey set $kld = $kld->link.tqe_next 3491cff4d0cSGreg Lehey end 3501cff4d0cSGreg Leheyend 3511cff4d0cSGreg Lehey 3521cff4d0cSGreg Leheydocument kldstat 3531cff4d0cSGreg Lehey Lists the modules that were loaded when the kernel crashed. 3541cff4d0cSGreg Leheyend 3551cff4d0cSGreg Lehey 3561cff4d0cSGreg Leheydefine kldstat-v 3571cff4d0cSGreg Lehey set $kld = linker_files.tqh_first 3581cff4d0cSGreg Lehey printf "Id Refs Address Size Name\n" 3591cff4d0cSGreg Lehey while ($kld != 0) 3601cff4d0cSGreg Lehey printf "%2d %4d 0x%08x %-8x %s\n", \ 3611cff4d0cSGreg Lehey $kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename 3621cff4d0cSGreg Lehey printf " Contains modules:\n" 3631cff4d0cSGreg Lehey printf " Id Name\n" 3641cff4d0cSGreg Lehey set $module = $kld->modules.tqh_first 3651cff4d0cSGreg Lehey while ($module != 0) 3661cff4d0cSGreg Lehey printf " %2d %s\n", $module->id, $module->name 3671cff4d0cSGreg Lehey set $module = $module->link.tqe_next 3681cff4d0cSGreg Lehey end 3691cff4d0cSGreg Lehey set $kld = $kld->link.tqe_next 3701cff4d0cSGreg Lehey end 3711cff4d0cSGreg Leheyend 372