]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - tools/debugscripts/gdbinit.kernel
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / tools / debugscripts / gdbinit.kernel
1 # $FreeBSD$
2 # General kernel macros
3
4 # Print the command name of the current process
5 define pname
6 p (char *)curproc->p_comm
7 end 
8 document pname
9 Print the command name of the current process.
10 end
11
12 # Show contents of bp supplied as first parameter:
13 #
14 # (gdb) bpp bp
15 define bpp
16 set $bp = (struct buf *) $arg0
17     if $bp->b_io.bio_dev
18       printf "  Buffer at 0x%x: dev 0x%x  data 0x%x  bcount 0x%x  blkno 0x%x resid 0x%x\n", \
19         $bp, \
20         $bp->b_io.bio_dev->si_udev, \
21         $bp->b_io.bio_data, \
22         $bp->b_io.bio_bcount, \
23         $bp->b_io.bio_blkno, \
24         $bp->b_io.bio_resid
25     else
26       printf "  Buffer at 0x%x: dev (none) data 0x%x  bcount 0x%x  blkno 0x%x resid 0x%x\n", \
27         $bp, \
28         $bp->b_io.bio_data, \
29         $bp->b_io.bio_bcount, \
30         $bp->b_io.bio_blkno, \
31         $bp->b_io.bio_resid
32     end
33     printf "   flags 0x%x: ", $bp->b_flags
34       if $bp->b_flags & 0x10
35         printf "busy "
36       end
37       if $bp->b_flags & 0x40
38         printf "call "
39       end
40       if $bp->b_flags & 0x200
41         printf "done "
42       end
43       if $bp->b_flags & 0x800
44         printf "error "
45       end
46       if $bp->b_flags & 0x40000
47         printf "phys "
48       end
49       if $bp->b_flags & 0x100000
50         printf "read "
51       end
52     printf "\n"
53 end
54 document bpp
55 Show summary information about the buffer header (struct bp) pointed at by the parameter.
56 end
57
58 # Show more detailed contents of bp supplied as first parameter:
59 #
60 # (gdb) bpl bp
61 define bpl
62 set $bp = (struct buf *) $arg0
63 printf "b_proc: "
64 output $bp->b_proc
65 printf "\nb_flags:      "
66 output $bp->b_flags
67 printf "\nb_qindex:     "
68 output $bp->b_qindex
69 printf "\nb_usecount:   "
70 output $bp->b_usecount
71 printf "\nb_error:      "
72 output $bp->b_error
73 printf "\nb_bufsize:    "
74 output $bp->b_bufsize
75 printf "\nb_io.bio_bcount:     "
76 output $bp->b_io.bio_bcount
77 printf "\nb_io.bio_resid:      "
78 output $bp->b_io.bio_resid
79 printf "\nb_io.bio_dev:        "
80 output $bp->b_io.bio_dev
81 printf "\nb_io.bio_data:       "
82 output $bp->b_io.bio_data
83 printf "\nb_kvasize:    "
84 output $bp->b_kvasize
85 printf "\nb_lblkno:     "
86 output $bp->b_lblkno
87 printf "\nb_io.bio_blkno:      "
88 output $bp->b_io.bio_blkno
89 printf "\nb_iodone:     "
90 output $bp->b_iodone
91 printf "\nb_vp: "
92 output $bp->b_vp
93 printf "\nb_dirtyoff:   "
94 output $bp->b_dirtyoff
95 printf "\nb_dirtyend:   "
96 output $bp->b_dirtyend
97 printf "\nb_generation: "
98 output $bp->b_generation
99 printf "\nb_rcred:      "
100 output $bp->b_rcred
101 printf "\nb_wcred:      "
102 output $bp->b_wcred
103 printf "\nb_validoff:   "
104 output $bp->b_validoff
105 printf "\nb_validend:   "
106 output $bp->b_validend
107 printf "\nb_pblkno:     "
108 output $bp->b_pblkno
109 printf "\nb_saveaddr:   "
110 output $bp->b_saveaddr
111 printf "\nb_savekva:    "
112 output $bp->b_savekva
113 printf "\nb_driver1:    "
114 output $bp->b_driver1
115 printf "\nb_driver2:    "
116 output $bp->b_driver2
117 printf "\nb_spc:        "
118 output $bp->b_spc
119 printf "\nb_npages:     "
120 output $bp->b_npages
121 printf "\n"
122 end
123 document bpl
124 Show detailed information about the buffer header (struct bp) pointed at by the parameter.
125 end
126
127 # Show contents of buffer header in local variable bp. 
128 define bp
129 bpp bp
130 end
131 document bp
132 Show information about the buffer header pointed to by the variable bp in the current frame.
133 end
134
135 # Show data of buffer header in local variable bp as string.
136 define bpd
137     printf "Buffer data:\n%s", (char *) bp->b_io.bio_data
138 end
139 document bpd
140 Show the contents (char*) of bp->data in the current frame.
141 end
142 document bpl
143 Show detailed information about the buffer header (struct bp) pointed at by the local variable bp.
144 end
145 define bx
146 printf "\n b_vnbufs " 
147 output/x bp->b_vnbufs
148 printf "\n b_freelist " 
149 output/x bp->b_freelist
150 printf "\n b_act " 
151 output/x bp->b_act
152 printf "\n b_flags " 
153 output/x bp->b_flags
154 printf "\n b_qindex " 
155 output/x bp->b_qindex
156 printf "\n b_usecount " 
157 output/x bp->b_usecount
158 printf "\n b_error " 
159 output/x bp->b_error
160 printf "\n b_bufsize " 
161 output/x bp->b_bufsize
162 printf "\n b_io.bio_bcount " 
163 output/x bp->b_io.bio_bcount
164 printf "\n b_io.bio_resid " 
165 output/x bp->b_io.bio_resid
166 printf "\n b_io.bio_dev " 
167 output/x bp->b_io.bio_dev
168 printf "\n b_io.bio_data " 
169 output/x bp->b_io.bio_data
170 printf "\n b_kvasize " 
171 output/x bp->b_kvasize
172 printf "\n b_io.bio_blkno " 
173 output/x bp->b_io.bio_blkno
174 printf "\n b_iodone_chain " 
175 output/x bp->b_iodone_chain
176 printf "\n b_vp " 
177 output/x bp->b_vp
178 printf "\n b_dirtyoff " 
179 output/x bp->b_dirtyoff
180 printf "\n b_validoff " 
181 output/x bp->b_validoff
182 echo \n
183 end
184 document bx
185 Print a number of fields from the buffer header pointed at in by the pointer bp in the current environment.
186 end
187
188 # Switch back to ddb
189 define ddb
190 set boothowto=0x80000000
191 s
192 end
193 document ddb
194 Switch back to ddb.
195 end
196
197 # ps: equivalent of the userland command
198 define ps
199     set $nproc = nprocs
200     set $aproc = allproc.lh_first
201     set $proc = allproc.lh_first
202     printf "  pid    proc   uid  ppid  pgrp   flag stat comm         wchan\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             set $thread = $proc->p_threads.tqh_first
210             while ($thread)
211                 printf "%5d %08x %4d %5d %5d  %06x  %d  %-10s   ", \
212                        $proc.p_pid, $aproc, \
213                        $proc.p_ucred->cr_ruid, $pptr->p_pid, \
214                        $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_state, \
215                        &$proc.p_comm[0]
216                 if ($thread.td_wchan)
217                     if ($thread.td_wmesg)
218                         printf "%s ", $thread.td_wmesg
219                     end
220                     printf "%x", $thread.td_wchan
221                 end
222                 printf "\n"     
223                 set $thread = $thread->td_plist.tqe_next
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
232 end
233 document ps
234 Show process status without options. 
235 end
236
237 # Specify a process for other commands to refer to.
238 # Most are machine-dependent.
239 define 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
274 end
275 document defproc
276 Specify a process for btpp and fr commands.
277 end
278
279 define vdev
280 if (vp->v_type == VBLK)
281   p *vp->v_un.vu_spec.vu_specinfo
282   printf "numoutput: %d\n", vp->v_numoutput
283 else
284   echo "Not a block device"
285 end
286 end
287 document vdev
288 Show some information of the vnode pointed to by the local variable vp.
289 end
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).
296 define y
297 echo Check your .gdbinit: it contains a y command\n
298 end
299
300 document y
301 Kludge for writing macros   This is a no-op except for printing a message   See gdb(4) for more details.
302 end
303
304 # dmesg: print msgbuf.  Can take forever.
305 define dmesg
306 printf "%s", msgbufp->msg_ptr
307 end
308 document dmesg
309 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
310 end
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
317 define checkmem
318 set $offset = $arg0
319 # XXX sizeof int.   Needs changing for 64 bit machines.
320 # subtract 1 because the last word is always different.
321 set $length = $arg1 / 4 - 1
322 set $word = 0
323 while ($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
328 end
329 end
330
331 document checkmem
332 Check unallocated memory for modifications  This assumes that DIAGNOSTIC is set which causes free memory to be set to 0xdeadc0de.
333 end
334
335 define kernel
336   exec-file kernel.$arg0   
337   symbol-file symbols.$arg0
338   core-file vmcore.$arg0
339 end
340
341 define 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
349 end
350  
351 document kldstat
352   Lists the modules that were loaded when the kernel crashed.
353 end
354  
355 define 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
370 end