1115926Sgrog# $FreeBSD$
2115926Sgrog# Assembler-level macros for i386
3115926Sgrog# Disassemble the next 10 instructions.
4115926Sgrogdefine xi
5115926Sgrogx/10i $eip
6115926Sgrogend
7115926Sgrog
8115926Sgrog# Top 12 words on stack
9115926Sgrogdefine xs
10115926Sgrogx/12x $esp
11115926Sgrogend
12115926Sgrog
13115926Sgrog# Top 12 words from frame pointer
14115926Sgrogdefine xb
15115926Sgrogx/12x $ebp
16115926Sgrogend
17115926Sgrog
18115926Sgrog# single step through calls and disassemble the next instruction
19115926Sgrogdefine z
20115926Sgrogni
21115926Sgrogx/1i $eip
22115926Sgrogend
23115926Sgrog
24115926Sgrog# single step over calls and disassemble the next instruction
25115926Sgrogdefine zs
26115926Sgrogsi
27115926Sgrogx/1i $eip
28115926Sgrogend
29115926Sgrog
30115926Sgrog# show current stack frame and first 4 parameters
31115926Sgrogdefine xp
32115926Sgrogprintf "      esp: " 
33115926Sgrogoutput/x $esp
34115926Sgrogecho  (
35115926Sgrogoutput (((int)$ebp)-(int)$esp)/4-4
36115926Sgrogprintf " words on stack)\n      ebp: " 
37115926Sgrogoutput/x $ebp
38115926Sgrogprintf "\n      eip: " 
39115926Sgrogx/1i $eip
40115926Sgrogprintf "Saved ebp: " 
41115926Sgrogoutput/x *(int*)$ebp
42115926Sgrogprintf " (maximum of "  
43115926Sgrogoutput ((*(int*)$ebp)-(int)$ebp)/4-4
44115926Sgrogprintf " parameters possible)\nSaved eip: " 
45115926Sgrogx/1i *(int*)($ebp+4)
46115926Sgrogprintf "\nParm 1 at " 
47115926Sgrogoutput/x (int) ($ebp+8)
48115926Sgrogprintf ":    " 
49115926Sgrogoutput (char*) *(int*)($ebp+8)
50115926Sgrogprintf "\nParm 2 at " 
51115926Sgrogoutput/x (int) ($ebp+12)
52115926Sgrogprintf ":    " 
53115926Sgrogoutput (char*) *(int*)($ebp+12)
54115926Sgrogprintf "\nParm 3 at " 
55115926Sgrogoutput/x (int) ($ebp+16)
56115926Sgrogprintf ":    " 
57115926Sgrogoutput (char*) *(int*)($ebp+16)
58115926Sgrogprintf "\nParm 4 at " 
59115926Sgrogoutput/x (int) ($ebp+20)
60115926Sgrogprintf ":    " 
61115926Sgrogoutput (char*) *(int*)($ebp+20)
62115926Sgrogecho \n
63115926Sgrogend
64115926Sgrogdocument xp
65115926SgrogShow the register contents and the first four parameter
66115926Sgrogwords of the current frame.
67115926Sgrogend
68115926Sgrog
69115926Sgrog# show current stack frame and first 10 parameters
70115926Sgrogdefine xxp
71115926Sgrogprintf "      esp: " 
72115926Sgrogoutput/x $esp
73115926Sgrogprintf "\n      ebp: " 
74115926Sgrogoutput/x $ebp
75115926Sgrogprintf "\n      eip: " 
76115926Sgrogx/1i $eip
77115926Sgrogprintf "Saved ebp: " 
78115926Sgrogoutput/x *(int*)$ebp
79115926Sgrogprintf " (maximum of "  
80115926Sgrogoutput ((*(int*)$ebp)-(int)$ebp)/4-4
81115926Sgrogprintf " parameters possible)\nSaved eip: " 
82115926Sgrogx/1i *(int*)($ebp+4)
83115926Sgrogprintf "\nParm  1 at " 
84115926Sgrogoutput/x (int) ($ebp+8)
85115926Sgrogprintf ":    " 
86115926Sgrogoutput (char*) *(int*)($ebp+8)
87115926Sgrogprintf "\nParm  2 at " 
88115926Sgrogoutput/x (int) ($ebp+12)
89115926Sgrogprintf ":    " 
90115926Sgrogoutput (char*) *(int*)($ebp+12)
91115926Sgrogprintf "\nParm  3 at " 
92115926Sgrogoutput/x (int) ($ebp+16)
93115926Sgrogprintf ":    " 
94115926Sgrogoutput (char*) *(int*)($ebp+16)
95115926Sgrogprintf "\nParm  4 at " 
96115926Sgrogoutput/x (int) ($ebp+20)
97115926Sgrogprintf ":    " 
98115926Sgrogoutput (char*) *(int*)($ebp+20)
99115926Sgrogprintf "\nParm  5 at " 
100115926Sgrogoutput/x (int) ($ebp+24)
101115926Sgrogprintf ":    " 
102115926Sgrogoutput (char*) *(int*)($ebp+24)
103115926Sgrogprintf "\nParm  6 at " 
104115926Sgrogoutput/x (int) ($ebp+28)
105115926Sgrogprintf ":    " 
106115926Sgrogoutput (char*) *(int*)($ebp+28)
107115926Sgrogprintf "\nParm  7 at " 
108115926Sgrogoutput/x (int) ($ebp+32)
109115926Sgrogprintf ":    " 
110115926Sgrogoutput (char*) *(int*)($ebp+32)
111115926Sgrogprintf "\nParm  8 at " 
112115926Sgrogoutput/x (int) ($ebp+36)
113115926Sgrogprintf ":    " 
114115926Sgrogoutput (char*) *(int*)($ebp+36)
115115926Sgrogprintf "\nParm  9 at " 
116115926Sgrogoutput/x (int) ($ebp+40)
117115926Sgrogprintf ":    " 
118115926Sgrogoutput (char*) *(int*)($ebp+40)
119115926Sgrogprintf "\nParm 10 at " 
120115926Sgrogoutput/x (int) ($ebp+44)
121115926Sgrogprintf ":    " 
122115926Sgrogoutput (char*) *(int*)($ebp+44)
123115926Sgrogecho \n
124115926Sgrogend
125115926Sgrogdocument xxp
126115926SgrogShow the register contents and the first ten parameter
127115926Sgrogwords of the current frame.
128115926Sgrogend
129115926Sgrog
130115926Sgrog# Show first to fifth parameters of current frame as int, int * and char *.
131115926Sgrogdefine xp0
132115926Sgrogx/12x *(int*)$esp
133115926Sgrogp *(int*)$esp
134115926Sgrogp (char*)*$esp
135115926Sgrogend
136115926Sgrogdefine xp1
137115926Sgrogx/12x *(int*)($ebp+4)
138115926Sgrogp *(int*)($ebp+4)
139115926Sgrogp (char**)($ebp+4)
140115926Sgrogend
141115926Sgrogdefine xp2
142115926Sgrogx/12x *(int*)($ebp+8)
143115926Sgrogp *(int*)($ebp+8)
144115926Sgrogp *(char**)($ebp+8)
145115926Sgrogend
146115926Sgrogdefine xp3
147115926Sgrogx/12x *(int*)($ebp+12)
148115926Sgrogp *(int*)($ebp+12)
149115926Sgrogp (char**)($ebp+12)
150115926Sgrogend
151115926Sgrogdefine xp4
152115926Sgrogx/12x *(int*)($ebp+16)
153115926Sgrogp *(int*)($ebp+16)
154115926Sgrogp (char**)($ebp+16)
155115926Sgrogend
156115926Sgrogdocument xp0
157115926SgrogShow the first parameter of current stack frame in various formats
158115926Sgrogend
159115926Sgrogdocument xp1
160115926SgrogShow the second parameter of current stack frame in various formats
161115926Sgrogend
162115926Sgrogdocument xp2
163115926SgrogShow the third parameter of current stack frame in various formats
164115926Sgrogend
165115926Sgrogdocument xp3
166115926SgrogShow the fourth parameter of current stack frame in various formats
167115926Sgrogend
168115926Sgrogdocument xp4
169115926SgrogShow the fifth parameter of current stack frame in various formats
170115926Sgrogend
171115926Sgrog
172115926Sgrog# Select frame 0 to 5 and show stack information.
173115926Sgrogdefine f0
174115926Sgrogf 0
175115926Sgrogxp
176115926Sgrogend
177115926Sgrogdefine f1
178115926Sgrogf 1
179115926Sgrogxp
180115926Sgrogend
181115926Sgrogdefine f2
182115926Sgrogf 2
183115926Sgrogxp
184115926Sgrogend
185115926Sgrogdefine f3
186115926Sgrogf 3
187115926Sgrogxp
188115926Sgrogend
189115926Sgrogdefine f4
190115926Sgrogf 4
191115926Sgrogxp
192115926Sgrogend
193115926Sgrogdefine f5
194115926Sgrogf 5
195115926Sgrogxp
196115926Sgrogend
197115926Sgrogdocument f0
198115926SgrogSelect stack frame 0 and show assembler-level details
199115926Sgrogend
200115926Sgrogdocument f1
201115926SgrogSelect stack frame 1 and show assembler-level details
202115926Sgrogend
203115926Sgrogdocument f2
204115926SgrogSelect stack frame 2 and show assembler-level details
205115926Sgrogend
206115926Sgrogdocument f3
207115926SgrogSelect stack frame 3 and show assembler-level details
208115926Sgrogend
209115926Sgrogdocument f4
210115926SgrogSelect stack frame 4 and show assembler-level details
211115926Sgrogend
212115926Sgrogdocument f5
213115926SgrogSelect stack frame 5 and show assembler-level details
214115926Sgrogend
215115926Sgrogdocument z
216115926SgrogSingle step 1 instruction (over calls) and show next instruction.
217115926Sgrogend
218115926Sgrogdocument zs
219115926SgrogSingle step 1 instruction (through calls) and show next instruction.
220115926Sgrogend
221115926Sgrogdocument xi
222115926SgrogList the next 10 instructions from the current IP value
223115926Sgrogend
224115926Sgrogdocument xs
225115926SgrogShow the last 12 words on stack in hex
226115926Sgrogend
227115926Sgrogdocument xb
228115926SgrogShow 12 words starting at current BP value in hex
229115926Sgrogend
230115926Sgrog
231115926Sgrog# pcb <pid>
232115926Sgrog# show contents of pcb, currently only i386.
233115926Sgrogdefine pcb
234115926Sgrog    set $nproc = nprocs
235115926Sgrog    set $aproc = allproc.lh_first
236115926Sgrog    set $proc = allproc.lh_first
237115926Sgrog    while (--$nproc >= 0)
238115926Sgrog        set $pptr = $proc.p_pptr
239115926Sgrog        if ($proc->p_pid == $arg0)
240115926Sgrog           set $pcba = $proc->p_threads.tqh_first->td_pcb
241115926Sgrog	   printf "ip: %08x sp: %08x bp: %08x bx: %08x\n", $pcba->pcb_eip, $pcba->pcb_esp, $pcba->pcb_ebp, $pcba->pcb_ebx
242115926Sgrog	   x/1i $pcba->pcb_eip
243115926Sgrog	   set $nproc = 0
244115926Sgrog        end
245115926Sgrog        set $aproc = $proc.p_list.le_next
246115926Sgrog        if ($aproc == 0 && $nproc > 0)
247115926Sgrog            set $aproc = zombproc
248115926Sgrog        end
249115926Sgrog        set $proc = $aproc
250115926Sgrog    end
251115926Sgrogend
252115926Sgrogdocument pcb
253115926SgrogShow some pcb contents of process whose pid is specified.
254115926Sgrogend
255115926Sgrog
256115926Sgrog# btr <frame>
257115926Sgrog# primitive backtrace.  frame is a memory address.
258115926Sgrogdefine btr
259115926Sgrogset $frame = $arg0
260115926Sgrogset $fno = 0
261115926Sgrogwhile (*(int *) $frame > 0xc0000000)
262115926Sgrog  set $myebp = *(int *) $frame
263115926Sgrog  set $myeip = *(int *) ($frame + 4)
264115926Sgrog  printf " frame %d at %p: ebp %8x, eip ", $fno, $frame, $myebp
265115926Sgrog  x/1i $myeip
266115926Sgrog  set $frame = $myebp
267115926Sgrog  set $fno = $fno + 1
268115926Sgrogend
269115926Sgrogend
270115926Sgrogdocument btr
271228975SuqsShow a backtrace from the ebp address specified.  This can be used to get a backtrace from any stack resident in memory.  It's the user's responsibility to ensure that the address is meaningful.
272115926Sgrogend
273115926Sgrog
274115926Sgrog# btp <pid>
275115926Sgrog# backtrace for process <pid>.  Uses btr (machine dependent) to perform the backtrace.
276115926Sgrog# may produce nonsense.
277115926Sgrogdefine btp
278115926Sgrog    set $nproc = nprocs
279115926Sgrog    set $aproc = allproc.lh_first
280115926Sgrog    set $proc = allproc.lh_first
281115926Sgrog    while (--$nproc >= 0)
282115926Sgrog        if ($proc->p_pid == $arg0)
283115926Sgrog	   btr $proc->p_threads.tqh_first->td_pcb->pcb_ebp
284115926Sgrog	   set $nproc = 0
285115926Sgrog	else
286115926Sgrog           set $aproc = $proc.p_list.le_next
287115926Sgrog           if ($aproc == 0 && $nproc > 0)
288115926Sgrog              set $aproc = zombproc
289115926Sgrog           end
290115926Sgrog           set $proc = $aproc
291115926Sgrog        end
292115926Sgrog   end
293115926Sgrogend
294115926Sgrogdocument btp
295115926SgrogShow a backtrace for the process whose pid is specified as a parameter.
296115926Sgrogend
297115926Sgrog
298115926Sgrog# Do backtraces for all processes in the system.
299115926Sgrog# Uses btr (machine dependent) to perform the backtrace.
300115926Sgrogdefine btpa
301115926Sgrog    set $nproc = nprocs
302115926Sgrog    set $aproc = allproc.lh_first
303115926Sgrog    set $proc = allproc.lh_first
304137923Sdas    printf "  pid    proc   uid  ppid  pgrp   flag stat comm         wchan\n"
305115926Sgrog    while (--$nproc >= 0)
306115926Sgrog        set $pptr = $proc.p_pptr
307115926Sgrog        if ($pptr == 0)
308115926Sgrog           set $pptr = $proc
309115926Sgrog        end
310115926Sgrog        if ($proc.p_stat)
311137923Sdas            printf "%5d %08x %4d %5d %5d  %06x %d  %-10s   ", \
312115926Sgrog                   $proc.p_pid, $aproc, \
313137923Sdas                   $proc.p_cred->p_ruid, $pptr->p_pid, \
314115926Sgrog                   $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_stat, \
315115926Sgrog                   &$proc.p_comm[0]
316115926Sgrog            if ($proc.p_wchan)
317115926Sgrog                if ($proc.p_wmesg)
318115926Sgrog                    printf "%s ", $proc.p_wmesg
319115926Sgrog                end
320115926Sgrog                printf "%x", $proc.p_wchan
321115926Sgrog            end
322115926Sgrog            printf "\n"
323115926Sgrog	   if ($proc->p_flag & 4)
324115926Sgrog	      btr $proc->p_threads.tqh_first->td_pcb->pcb_ebp
325115926Sgrog	   else
326115926Sgrog              echo (not loaded)\n
327115926Sgrog	   end
328115926Sgrog        end
329115926Sgrog        set $aproc = $proc.p_list.le_next
330115926Sgrog        if ($aproc == 0 && $nproc > 0)
331115926Sgrog            set $aproc = zombproc
332115926Sgrog        end
333115926Sgrog        set $proc = $aproc
334115926Sgrog    end
335115926Sgrogend
336115926Sgrogdocument btpa
337115926SgrogShow backtraces for all processes in the system.
338115926Sgrogend
339115926Sgrog
340115926Sgrog# Show backtrace for process selected with "defproc"
341115926Sgrogdefine btpp
342116007Sgrogbtr $myvectorproc->p_threads.tqh_first->td_pcb->pcb_ebp
343115926Sgrogend
344115926Sgrogdocument btpp
345115926SgrogShow a backtrace for the process previously selected with 'defproc'.
346115926Sgrogend
347115926Sgrog
348115926Sgrog# Specific stack fram of process selected with "defproc".
349115926Sgrogdefine fr
350115926Sgrogset $fno = 0
351115926Sgrogset $searching = 1
352116007Sgrogset $frame = $myvectorproc->p_threads.tqh_first->td_pcb->pcb_ebp
353116007Sgrogwhile (($searching == 1) && (*(int *) $frame > 0xc0000000))
354116007Sgrog  set $myebp = *(int *) $frame
355116007Sgrog  set $myeip = *(int *) ($frame + 4)
356116007Sgrog  if ($fno == $arg0)
357116007Sgrog    printf " frame %d at %p: ebp %8x, eip ", $fno, $frame, $myebp
358116007Sgrog    x/1i $myeip
359116007Sgrog    printf "Called from %8x, stack frame at %8x\n", *(int *) ($myebp+4), *(int *) $myebp
360116007Sgrog    printf "last 20 local variables:\n"
361116007Sgrog    x/20x ($myebp-80)
362116007Sgrog    printf "call parameters:\n"
363116007Sgrog    x/8x ($myebp+8)
364116007Sgrog    set $searching = 0
365116007Sgrog  else
366116007Sgrog    set $frame = $myebp
367116007Sgrog    set $fno = $fno + 1
368115926Sgrog  end
369115926Sgrogend
370116007Sgrogif ($searching == 1)
371116007Sgrog  echo frame not found\n
372115926Sgrogend
373116007Sgrogend
374115926Sgrogdocument fr
375115926SgrogShow the frame of the stack of the process previously selected with 'defproc'.
376115926Sgrogend
377