mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-06 17:18:32 +00:00
371 lines
10 KiB
Plaintext
371 lines
10 KiB
Plaintext
# 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
|