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