xref: /freebsd/tools/debugscripts/gdbinit.kernel (revision edf8578117e8844e02c0121147f45e4609b30680)
1# General kernel macros
2
3# Print the command name of the current process
4define pname
5p (char *)curproc->p_comm
6end
7document pname
8Print the command name of the current process.
9end
10
11# Show contents of bp supplied as first parameter:
12#
13# (gdb) bpp bp
14define bpp
15set $bp = (struct buf *) $arg0
16    if $bp->b_io.bio_dev
17      printf "  Buffer at 0x%x: dev 0x%x  data 0x%x  bcount 0x%x  blkno 0x%x resid 0x%x\n", \
18        $bp, \
19        $bp->b_io.bio_dev->si_udev, \
20        $bp->b_io.bio_data, \
21        $bp->b_io.bio_bcount, \
22        $bp->b_io.bio_blkno, \
23        $bp->b_io.bio_resid
24    else
25      printf "  Buffer at 0x%x: dev (none) data 0x%x  bcount 0x%x  blkno 0x%x resid 0x%x\n", \
26        $bp, \
27        $bp->b_io.bio_data, \
28        $bp->b_io.bio_bcount, \
29        $bp->b_io.bio_blkno, \
30        $bp->b_io.bio_resid
31    end
32    printf "   flags 0x%x: ", $bp->b_flags
33      if $bp->b_flags & 0x10
34        printf "busy "
35      end
36      if $bp->b_flags & 0x40
37        printf "call "
38      end
39      if $bp->b_flags & 0x200
40        printf "done "
41      end
42      if $bp->b_flags & 0x800
43        printf "error "
44      end
45      if $bp->b_flags & 0x40000
46        printf "phys "
47      end
48      if $bp->b_flags & 0x100000
49        printf "read "
50      end
51    printf "\n"
52end
53document bpp
54Show summary information about the buffer header (struct bp) pointed at by the parameter.
55end
56
57# Show more detailed contents of bp supplied as first parameter:
58#
59# (gdb) bpl bp
60define bpl
61set $bp = (struct buf *) $arg0
62printf "b_proc: "
63output $bp->b_proc
64printf "\nb_flags:      "
65output $bp->b_flags
66printf "\nb_qindex:     "
67output $bp->b_qindex
68printf "\nb_usecount:   "
69output $bp->b_usecount
70printf "\nb_error:      "
71output $bp->b_error
72printf "\nb_bufsize:    "
73output $bp->b_bufsize
74printf "\nb_io.bio_bcount:     "
75output $bp->b_io.bio_bcount
76printf "\nb_io.bio_resid:      "
77output $bp->b_io.bio_resid
78printf "\nb_io.bio_dev:        "
79output $bp->b_io.bio_dev
80printf "\nb_io.bio_data:       "
81output $bp->b_io.bio_data
82printf "\nb_kvasize:    "
83output $bp->b_kvasize
84printf "\nb_lblkno:     "
85output $bp->b_lblkno
86printf "\nb_io.bio_blkno:      "
87output $bp->b_io.bio_blkno
88printf "\nb_iodone:     "
89output $bp->b_iodone
90printf "\nb_vp: "
91output $bp->b_vp
92printf "\nb_dirtyoff:   "
93output $bp->b_dirtyoff
94printf "\nb_dirtyend:   "
95output $bp->b_dirtyend
96printf "\nb_generation: "
97output $bp->b_generation
98printf "\nb_rcred:      "
99output $bp->b_rcred
100printf "\nb_wcred:      "
101output $bp->b_wcred
102printf "\nb_validoff:   "
103output $bp->b_validoff
104printf "\nb_validend:   "
105output $bp->b_validend
106printf "\nb_pblkno:     "
107output $bp->b_pblkno
108printf "\nb_saveaddr:   "
109output $bp->b_saveaddr
110printf "\nb_savekva:    "
111output $bp->b_savekva
112printf "\nb_driver1:    "
113output $bp->b_driver1
114printf "\nb_driver2:    "
115output $bp->b_driver2
116printf "\nb_spc:        "
117output $bp->b_spc
118printf "\nb_npages:     "
119output $bp->b_npages
120printf "\n"
121end
122document bpl
123Show detailed information about the buffer header (struct bp) pointed at by the parameter.
124end
125
126# Show contents of buffer header in local variable bp.
127define bp
128bpp bp
129end
130document bp
131Show information about the buffer header pointed to by the variable bp in the current frame.
132end
133
134# Show data of buffer header in local variable bp as string.
135define bpd
136    printf "Buffer data:\n%s", (char *) bp->b_io.bio_data
137end
138document bpd
139Show the contents (char*) of bp->data in the current frame.
140end
141document bpl
142Show detailed information about the buffer header (struct bp) pointed at by the local variable bp.
143end
144define bx
145printf "\n b_vnbufs "
146output/x bp->b_vnbufs
147printf "\n b_freelist "
148output/x bp->b_freelist
149printf "\n b_act "
150output/x bp->b_act
151printf "\n b_flags "
152output/x bp->b_flags
153printf "\n b_qindex "
154output/x bp->b_qindex
155printf "\n b_usecount "
156output/x bp->b_usecount
157printf "\n b_error "
158output/x bp->b_error
159printf "\n b_bufsize "
160output/x bp->b_bufsize
161printf "\n b_io.bio_bcount "
162output/x bp->b_io.bio_bcount
163printf "\n b_io.bio_resid "
164output/x bp->b_io.bio_resid
165printf "\n b_io.bio_dev "
166output/x bp->b_io.bio_dev
167printf "\n b_io.bio_data "
168output/x bp->b_io.bio_data
169printf "\n b_kvasize "
170output/x bp->b_kvasize
171printf "\n b_io.bio_blkno "
172output/x bp->b_io.bio_blkno
173printf "\n b_iodone_chain "
174output/x bp->b_iodone_chain
175printf "\n b_vp "
176output/x bp->b_vp
177printf "\n b_dirtyoff "
178output/x bp->b_dirtyoff
179printf "\n b_validoff "
180output/x bp->b_validoff
181echo \n
182end
183document bx
184Print a number of fields from the buffer header pointed at in by the pointer bp in the current environment.
185end
186
187# Switch back to ddb
188define ddb
189set boothowto=0x80000000
190s
191end
192document ddb
193Switch back to ddb.
194end
195
196# ps: equivalent of the userland command
197define ps
198    set $nproc = nprocs
199    set $aproc = allproc.lh_first
200    set $proc = allproc.lh_first
201    set $tid = 1
202    printf "pid/ID ppid/tid uid  pgrp     flag st comm/name  proc/thread\n"
203    while (--$nproc >= 0)
204        set $pptr = $proc.p_pptr
205        if ($pptr == 0)
206           set $pptr = $proc
207        end
208        if ($proc.p_state)
209            printf " %5d  %6d %4d %5d %8x %2d %-10s %p\n", \
210                   $proc.p_pid, $pptr->p_pid, \
211                   $proc.p_ucred->cr_ruid, \
212                   $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_state, \
213                   &$proc.p_comm[0], $aproc
214            set $thread = $proc->p_threads.tqh_first
215            while ($thread)
216                printf "(%5d) %6d                        %-10s %p", \
217                   $tid, $thread->td_tid, $thread->td_name, $thread
218                if ($thread.td_wmesg)
219                    printf " %s", $thread.td_wmesg
220                end
221                printf "\n"
222                set $thread = $thread->td_plist.tqe_next
223                set $tid = $tid + 1
224            end
225        end
226        set $aproc = $proc.p_list.le_next
227        if ($aproc == 0 && $nproc > 0)
228            set $aproc = zombproc
229        end
230        set $proc = $aproc
231    end
232end
233document ps
234Show process status without options.
235end
236
237# Specify a process for other commands to refer to.
238# Most are machine-dependent.
239define defproc
240    set $nproc = nprocs
241    set $aproc = allproc.lh_first
242    set $proc = allproc.lh_first
243    while (--$nproc >= 0)
244        if ($proc->p_pid == $arg0)
245	   set $pptr = $proc.p_pptr
246           if ($pptr == 0)
247              set $pptr = $proc
248           end
249	   set $myvectorproc = $proc
250           if ($proc.p_state)
251               set $thread = $proc->p_threads.tqh_first
252               while ($thread)
253                   printf "%5d %08x %08x %4d %5d %5d  %06x  %d  %-10s   ", \
254                          $proc.p_pid, $aproc, \
255                          $proc.p_uarea, $proc.p_ucred->cr_ruid, $pptr->p_pid, \
256                          $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_state, \
257                          &$proc.p_comm[0]
258                   if ($thread.td_wchan)
259                       if ($thread.td_wmesg)
260                           printf "%s ", $thread.td_wmesg
261                       end
262                       printf "%x", $thread.td_wchan
263                   end
264                   printf "\n"
265                   set $thread = $thread->td_plist.tqe_next
266               end
267           end
268           btpp
269	   set $nproc = 0
270	else
271           set $proc = $proc.p_list.le_next
272        end
273   end
274end
275document defproc
276Specify a process for btpp and fr commands.
277end
278
279define vdev
280if (vp->v_type == VBLK)
281  p *vp->v_un.vu_spec.vu_specinfo
282  printf "numoutput: %d\n", vp->v_numoutput
283else
284  echo "Not a block device"
285end
286end
287document vdev
288Show some information of the vnode pointed to by the local variable vp.
289end
290
291# Kludge.  When changing macros, it's convenient to copy and paste
292# definitions from the editor into the debugger window.
293# Unfortunately, gdb insists on asking for confirmation after the
294# "define" line.  y enables you to insert the confirmation in the
295# definition without affecting the way the macro runs (much).
296define y
297echo Check your .gdbinit: it contains a y command\n
298end
299
300document y
301Kludge for writing macros   This is a no-op except for printing a message   See gdb(4) for more details.
302end
303
304# dmesg: print msgbuf.  Can take forever.
305define dmesg
306printf "%s", msgbufp->msg_ptr
307end
308document dmesg
309Print 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
310end
311
312# checkmem: check unallocated memory for modifications
313# this assumes that DIAGNOSTIC is set, which causes
314# free memory to be set to 0xdeadc0de
315#
316# Use: checkmem offset length
317define checkmem
318set $offset = $arg0
319# XXX sizeof int.   Needs changing for 64 bit machines.
320# subtract 1 because the last word is always different.
321set $length = $arg1 / 4 - 1
322set $word = 0
323while ($word < $length)
324   if ((int *) $offset) [$word] != 0xdeadc0de
325      printf "invalid word 0x%x at 0x%x\n", ((int *) $offset) [$word], &((int *) $offset) [$word]
326   end
327   set $word = $word + 1
328end
329end
330
331document checkmem
332Check unallocated memory for modifications  This assumes that DIAGNOSTIC is set which causes free memory to be set to 0xdeadc0de.
333end
334
335define kernel
336  exec-file kernel.$arg0
337  symbol-file symbols.$arg0
338  core-file vmcore.$arg0
339end
340
341define kldstat
342  set $kld = linker_files.tqh_first
343  printf "Id Refs Address    Size     Name\n"
344  while ($kld != 0)
345    printf "%2d %4d 0x%08x %-8x %s\n", \
346      $kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename
347    set $kld = $kld->link.tqe_next
348  end
349end
350
351document kldstat
352  Lists the modules that were loaded when the kernel crashed.
353end
354
355define kldstat-v
356  set $kld = linker_files.tqh_first
357  printf "Id Refs Address    Size     Name\n"
358  while ($kld != 0)
359    printf "%2d %4d 0x%08x %-8x %s\n", \
360      $kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename
361    printf "        Contains modules:\n"
362    printf "                Id Name\n"
363    set $module = $kld->modules.tqh_first
364    while ($module != 0)
365      printf "                %2d %s\n", $module->id, $module->name
366      set $module = $module->link.tqe_next
367    end
368    set $kld = $kld->link.tqe_next
369  end
370end
371