# $FreeBSD$
# General kernel macros
# Print the command name of the current process
define pname
p (char *)curproc->p_comm
end
document pname
Print the command name of the current process.
end
# Show contents of bp supplied as first parameter:
#
# (gdb) bpp bp
define bpp
set $bp = (struct buf *) $arg0
if $bp->b_io.bio_dev
printf " Buffer at 0x%x: dev 0x%x data 0x%x bcount 0x%x blkno 0x%x resid 0x%x\n", \
$bp, \
$bp->b_io.bio_dev->si_udev, \
$bp->b_io.bio_data, \
$bp->b_io.bio_bcount, \
$bp->b_io.bio_blkno, \
$bp->b_io.bio_resid
else
printf " Buffer at 0x%x: dev (none) data 0x%x bcount 0x%x blkno 0x%x resid 0x%x\n", \
$bp, \
$bp->b_io.bio_data, \
$bp->b_io.bio_bcount, \
$bp->b_io.bio_blkno, \
$bp->b_io.bio_resid
end
printf " flags 0x%x: ", $bp->b_flags
if $bp->b_flags & 0x10
printf "busy "
end
if $bp->b_flags & 0x40
printf "call "
end
if $bp->b_flags & 0x200
printf "done "
end
if $bp->b_flags & 0x800
printf "error "
end
if $bp->b_flags & 0x40000
printf "phys "
end
if $bp->b_flags & 0x100000
printf "read "
end
printf "\n"
end
document bpp
Show summary information about the buffer header (struct bp) pointed at by the parameter.
end
# Show more detailed contents of bp supplied as first parameter:
#
# (gdb) bpl bp
define bpl
set $bp = (struct buf *) $arg0
printf "b_proc: "
output $bp->b_proc
printf "\nb_flags: "
output $bp->b_flags
printf "\nb_qindex: "
output $bp->b_qindex
printf "\nb_usecount: "
output $bp->b_usecount
printf "\nb_error: "
output $bp->b_error
printf "\nb_bufsize: "
output $bp->b_bufsize
printf "\nb_io.bio_bcount: "
output $bp->b_io.bio_bcount
printf "\nb_io.bio_resid: "
output $bp->b_io.bio_resid
printf "\nb_io.bio_dev: "
output $bp->b_io.bio_dev
printf "\nb_io.bio_data: "
output $bp->b_io.bio_data
printf "\nb_kvasize: "
output $bp->b_kvasize
printf "\nb_lblkno: "
output $bp->b_lblkno
printf "\nb_io.bio_blkno: "
output $bp->b_io.bio_blkno
printf "\nb_iodone: "
output $bp->b_iodone
printf "\nb_vp: "
output $bp->b_vp
printf "\nb_dirtyoff: "
output $bp->b_dirtyoff
printf "\nb_dirtyend: "
output $bp->b_dirtyend
printf "\nb_generation: "
output $bp->b_generation
printf "\nb_rcred: "
output $bp->b_rcred
printf "\nb_wcred: "
output $bp->b_wcred
printf "\nb_validoff: "
output $bp->b_validoff
printf "\nb_validend: "
output $bp->b_validend
printf "\nb_pblkno: "
output $bp->b_pblkno
printf "\nb_saveaddr: "
output $bp->b_saveaddr
printf "\nb_savekva: "
output $bp->b_savekva
printf "\nb_driver1: "
output $bp->b_driver1
printf "\nb_driver2: "
output $bp->b_driver2
printf "\nb_spc: "
output $bp->b_spc
printf "\nb_npages: "
output $bp->b_npages
printf "\n"
end
document bpl
Show detailed information about the buffer header (struct bp) pointed at by the parameter.
end
# Show contents of buffer header in local variable bp.
define bp
bpp bp
end
document bp
Show information about the buffer header pointed to by the variable bp in the current frame.
end
# Show data of buffer header in local variable bp as string.
define bpd
printf "Buffer data:\n%s", (char *) bp->b_io.bio_data
end
document bpd
Show the contents (char*) of bp->data in the current frame.
end
document bpl
Show detailed information about the buffer header (struct bp) pointed at by the local variable bp.
end
define bx
printf "\n b_vnbufs "
output/x bp->b_vnbufs
printf "\n b_freelist "
output/x bp->b_freelist
printf "\n b_act "
output/x bp->b_act
printf "\n b_flags "
output/x bp->b_flags
printf "\n b_qindex "
output/x bp->b_qindex
printf "\n b_usecount "
output/x bp->b_usecount
printf "\n b_error "
output/x bp->b_error
printf "\n b_bufsize "
output/x bp->b_bufsize
printf "\n b_io.bio_bcount "
output/x bp->b_io.bio_bcount
printf "\n b_io.bio_resid "
output/x bp->b_io.bio_resid
printf "\n b_io.bio_dev "
output/x bp->b_io.bio_dev
printf "\n b_io.bio_data "
output/x bp->b_io.bio_data
printf "\n b_kvasize "
output/x bp->b_kvasize
printf "\n b_io.bio_blkno "
output/x bp->b_io.bio_blkno
printf "\n b_iodone_chain "
output/x bp->b_iodone_chain
printf "\n b_vp "
output/x bp->b_vp
printf "\n b_dirtyoff "
output/x bp->b_dirtyoff
printf "\n b_validoff "
output/x bp->b_validoff
echo \n
end
document bx
Print a number of fields from the buffer header pointed at in by the pointer bp in the current environment.
end
# Switch back to ddb
define ddb
set boothowto=0x80000000
s
end
document ddb
Switch back to ddb.
end
# ps: equivalent of the userland command
define ps
set $nproc = nprocs
set $aproc = allproc.lh_first
set $proc = allproc.lh_first
set $tid = 1
printf "pid/ID ppid/tid uid pgrp flag st comm/name proc/thread\n"
while (--$nproc >= 0)
set $pptr = $proc.p_pptr
if ($pptr == 0)
set $pptr = $proc
end
if ($proc.p_state)
printf " %5d %6d %4d %5d %8x %2d %-10s %p\n", \
$proc.p_pid, $pptr->p_pid, \
$proc.p_ucred->cr_ruid, \
$proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_state, \
&$proc.p_comm[0], $aproc
set $thread = $proc->p_threads.tqh_first
while ($thread)
printf "(%5d) %6d %-10s %p", \
$tid, $thread->td_tid, $thread->td_name, $thread
if ($thread.td_wmesg)
printf " %s", $thread.td_wmesg
end
printf "\n"
set $thread = $thread->td_plist.tqe_next
set $tid = $tid + 1
end
end
set $aproc = $proc.p_list.le_next
if ($aproc == 0 && $nproc > 0)
set $aproc = zombproc
end
set $proc = $aproc
end
end
document ps
Show process status without options.
end
# Specify a process for other commands to refer to.
# Most are machine-dependent.
define defproc
set $nproc = nprocs
set $aproc = allproc.lh_first
set $proc = allproc.lh_first
while (--$nproc >= 0)
if ($proc->p_pid == $arg0)
set $pptr = $proc.p_pptr
if ($pptr == 0)
set $pptr = $proc
end
set $myvectorproc = $proc
if ($proc.p_state)
set $thread = $proc->p_threads.tqh_first
while ($thread)
printf "%5d %08x %08x %4d %5d %5d %06x %d %-10s ", \
$proc.p_pid, $aproc, \
$proc.p_uarea, $proc.p_ucred->cr_ruid, $pptr->p_pid, \
$proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_state, \
&$proc.p_comm[0]
if ($thread.td_wchan)
if ($thread.td_wmesg)
printf "%s ", $thread.td_wmesg
end
printf "%x", $thread.td_wchan
end
printf "\n"
set $thread = $thread->td_plist.tqe_next
end
end
btpp
set $nproc = 0
else
set $proc = $proc.p_list.le_next
end
end
end
document defproc
Specify a process for btpp and fr commands.
end
define vdev
if (vp->v_type == VBLK)
p *vp->v_un.vu_spec.vu_specinfo
printf "numoutput: %d\n", vp->v_numoutput
else
echo "Not a block device"
end
end
document vdev
Show some information of the vnode pointed to by the local variable vp.
end
# Kludge. When changing macros, it's convenient to copy and paste
# definitions from the editor into the debugger window.
# Unfortunately, gdb insists on asking for confirmation after the
# "define" line. y enables you to insert the confirmation in the
# definition without affecting the way the macro runs (much).
define y
echo Check your .gdbinit: it contains a y command\n
end
document y
Kludge for writing macros This is a no-op except for printing a message See gdb(4) for more details.
end
# dmesg: print msgbuf. Can take forever.
define dmesg
printf "%s", msgbufp->msg_ptr
end
document dmesg
Print 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
end
# checkmem: check unallocated memory for modifications
# this assumes that DIAGNOSTIC is set, which causes
# free memory to be set to 0xdeadc0de
#
# Use: checkmem offset length
define checkmem
set $offset = $arg0
# XXX sizeof int. Needs changing for 64 bit machines.
# subtract 1 because the last word is always different.
set $length = $arg1 / 4 - 1
set $word = 0
while ($word < $length)
if ((int *) $offset) [$word] != 0xdeadc0de
printf "invalid word 0x%x at 0x%x\n", ((int *) $offset) [$word], &((int *) $offset) [$word]
end
set $word = $word + 1
end
end
document checkmem
Check unallocated memory for modifications This assumes that DIAGNOSTIC is set which causes free memory to be set to 0xdeadc0de.
end
define kernel
exec-file kernel.$arg0
symbol-file symbols.$arg0
core-file vmcore.$arg0
end
define kldstat
set $kld = linker_files.tqh_first
printf "Id Refs Address Size Name\n"
while ($kld != 0)
printf "%2d %4d 0x%08x %-8x %s\n", \
$kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename
set $kld = $kld->link.tqe_next
end
end
document kldstat
Lists the modules that were loaded when the kernel crashed.
end
define kldstat-v
set $kld = linker_files.tqh_first
printf "Id Refs Address Size Name\n"
while ($kld != 0)
printf "%2d %4d 0x%08x %-8x %s\n", \
$kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename
printf " Contains modules:\n"
printf " Id Name\n"
set $module = $kld->modules.tqh_first
while ($module != 0)
printf " %2d %s\n", $module->id, $module->name
set $module = $module->link.tqe_next
end
set $kld = $kld->link.tqe_next
end
end