1set remotebaud 38400 2set remotetimeout 1 3set complaints 1 4set print pretty 5define xi 6x/10i $eip 7end 8define xs 9x/12x $esp 10end 11define xb 12x/12x $ebp 13end 14define z 15ni 16x/1i $eip 17end 18define zs 19si 20x/1i $eip 21end 22define xp 23printf " esp: " 24output/x $esp 25echo ( 26output (((int)$ebp)-(int)$esp)/4-4 27printf " words on stack)\n ebp: " 28output/x $ebp 29printf "\n eip: " 30x/1i $eip 31printf "Saved ebp: " 32output/x *(int*)$ebp 33printf " (maximum of " 34output ((*(int*)$ebp)-(int)$ebp)/4-4 35printf " parameters possible)\nSaved eip: " 36x/1i *(int*)($ebp+4) 37printf "\nParm 1 at " 38output/x (int) ($ebp+8) 39printf ": " 40output (char*) *(int*)($ebp+8) 41printf "\nParm 2 at " 42output/x (int) ($ebp+12) 43printf ": " 44output (char*) *(int*)($ebp+12) 45printf "\nParm 3 at " 46output/x (int) ($ebp+16) 47printf ": " 48output (char*) *(int*)($ebp+16) 49printf "\nParm 4 at " 50output/x (int) ($ebp+20) 51printf ": " 52output (char*) *(int*)($ebp+20) 53echo \n 54end 55document xp 56Show the register contents and the first four parameter 57words of the current frame. 58end 59define xxp 60printf " esp: " 61output/x $esp 62printf "\n ebp: " 63output/x $ebp 64printf "\n eip: " 65x/1i $eip 66printf "Saved ebp: " 67output/x *(int*)$ebp 68printf " (maximum of " 69output ((*(int*)$ebp)-(int)$ebp)/4-4 70printf " parameters possible)\nSaved eip: " 71x/1i *(int*)($ebp+4) 72printf "\nParm 1 at " 73output/x (int) ($ebp+8) 74printf ": " 75output (char*) *(int*)($ebp+8) 76printf "\nParm 2 at " 77output/x (int) ($ebp+12) 78printf ": " 79output (char*) *(int*)($ebp+12) 80printf "\nParm 3 at " 81output/x (int) ($ebp+16) 82printf ": " 83output (char*) *(int*)($ebp+16) 84printf "\nParm 4 at " 85output/x (int) ($ebp+20) 86printf ": " 87output (char*) *(int*)($ebp+20) 88printf "\nParm 5 at " 89output/x (int) ($ebp+24) 90printf ": " 91output (char*) *(int*)($ebp+24) 92printf "\nParm 6 at " 93output/x (int) ($ebp+28) 94printf ": " 95output (char*) *(int*)($ebp+28) 96printf "\nParm 7 at " 97output/x (int) ($ebp+32) 98printf ": " 99output (char*) *(int*)($ebp+32) 100printf "\nParm 8 at " 101output/x (int) ($ebp+36) 102printf ": " 103output (char*) *(int*)($ebp+36) 104printf "\nParm 9 at " 105output/x (int) ($ebp+40) 106printf ": " 107output (char*) *(int*)($ebp+40) 108printf "\nParm 10 at " 109output/x (int) ($ebp+44) 110printf ": " 111output (char*) *(int*)($ebp+44) 112echo \n 113end 114document xxp 115Show the register contents and the first ten parameter 116words of the current frame. 117end 118define xp0 119x/12x *(int*)$esp 120p *(int*)$esp 121p (char*)*$esp 122end 123define xp1 124x/12x *(int*)($ebp+4) 125p *(int*)($ebp+4) 126p (char**)($ebp+4) 127end 128define xp2 129x/12x *(int*)($ebp+8) 130p *(int*)($ebp+8) 131p *(char**)($ebp+8) 132end 133define xp3 134x/12x *(int*)($ebp+12) 135p *(int*)($ebp+12) 136p (char**)($ebp+12) 137end 138define xp4 139x/12x *(int*)($ebp+16) 140p *(int*)($ebp+16) 141p (char**)($ebp+16) 142end 143document xp0 144Show the first parameter of current stack frame in various formats 145end 146document xp1 147Show the second parameter of current stack frame in various formats 148end 149document xp2 150Show the third parameter of current stack frame in various formats 151end 152document xp3 153Show the fourth parameter of current stack frame in various formats 154end 155document xp4 156Show the fifth parameter of current stack frame in various formats 157end 158define f0 159f 0 160xp 161end 162define f1 163f 1 164xp 165end 166define f2 167f 2 168xp 169end 170define f3 171f 3 172xp 173end 174define f4 175f 4 176xp 177end 178define f5 179f 5 180xp 181end 182document f0 183Select stack frame 0 and show assembler-level details 184end 185document f1 186Select stack frame 1 and show assembler-level details 187end 188document f2 189Select stack frame 2 and show assembler-level details 190end 191document f3 192Select stack frame 3 and show assembler-level details 193end 194document f4 195Select stack frame 4 and show assembler-level details 196end 197document f5 198Select stack frame 5 and show assembler-level details 199end 200document z 201Single step 1 instruction (over calls) and show next instruction. 202end 203document zs 204Single step 1 instruction (through calls) and show next instruction. 205end 206document xi 207List the next 10 instructions from the current IP value 208end 209document xs 210Show the last 12 words on stack in hex 211end 212document xb 213Show 12 words starting at current BP value in hex 214end 215define tr 216target remote /dev/cuaa1 217end 218document tr 219Attach to a remote kernel via /dev/cuaa0 220end 221set output-radix 16 222define pname 223p (char *)curproc->p_comm 224end 225document pname 226Print the command name of the current process 227end 228define bpp 229set $bp = (struct buf *) $arg0 230 if $bp->b_dev 231 printf " Buffer at 0x%x: dev 0x%x data 0x%x bcount 0x%x blkno 0x%x resid 0x%x\n", \ 232 $bp, \ 233 $bp->b_dev->si_udev, \ 234 $bp->b_data, \ 235 $bp->b_bcount, \ 236 $bp->b_blkno, \ 237 $bp->b_resid 238 else 239 printf " Buffer at 0x%x: dev (none) data 0x%x bcount 0x%x blkno 0x%x resid 0x%x\n", \ 240 $bp, \ 241 $bp->b_data, \ 242 $bp->b_bcount, \ 243 $bp->b_blkno, \ 244 $bp->b_resid 245 end 246 printf " flags 0x%x: ", $bp->b_flags 247 if $bp->b_flags & 0x10 248 printf "busy " 249 end 250 if $bp->b_flags & 0x40 251 printf "call " 252 end 253 if $bp->b_flags & 0x200 254 printf "done " 255 end 256 if $bp->b_flags & 0x800 257 printf "error " 258 end 259 if $bp->b_flags & 0x40000 260 printf "phys " 261 end 262 if $bp->b_flags & 0x100000 263 printf "read " 264 end 265 printf "\n" 266end 267define bpl 268set $bp = (struct buf *) $arg0 269printf "b_proc: " 270output $bp->b_proc 271printf "\nb_flags: " 272output $bp->b_flags 273printf "\nb_qindex: " 274output $bp->b_qindex 275printf "\nb_usecount: " 276output $bp->b_usecount 277printf "\nb_error: " 278output $bp->b_error 279printf "\nb_bufsize: " 280output $bp->b_bufsize 281printf "\nb_bcount: " 282output $bp->b_bcount 283printf "\nb_resid: " 284output $bp->b_resid 285printf "\nb_dev: " 286output $bp->b_dev 287printf "\nb_data: " 288output $bp->b_data 289printf "\nb_kvasize: " 290output $bp->b_kvasize 291printf "\nb_lblkno: " 292output $bp->b_lblkno 293printf "\nb_blkno: " 294output $bp->b_blkno 295printf "\nb_iodone: " 296output $bp->b_iodone 297printf "\nb_vp: " 298output $bp->b_vp 299printf "\nb_dirtyoff: " 300output $bp->b_dirtyoff 301printf "\nb_dirtyend: " 302output $bp->b_dirtyend 303printf "\nb_generation: " 304output $bp->b_generation 305printf "\nb_validoff: " 306output $bp->b_validoff 307printf "\nb_validend: " 308output $bp->b_validend 309printf "\nb_pblkno: " 310output $bp->b_pblkno 311printf "\nb_saveaddr: " 312output $bp->b_saveaddr 313printf "\nb_savekva: " 314output $bp->b_savekva 315printf "\nb_driver1: " 316output $bp->b_driver1 317printf "\nb_driver2: " 318output $bp->b_driver2 319printf "\nb_spc: " 320output $bp->b_spc 321printf "\nb_npages: " 322output $bp->b_npages 323printf "\n" 324end 325define bp 326bpp bp 327end 328define bpd 329 printf "Buffer data:\n%s", (char *) bp->b_data 330end 331document bpd 332Show the contents (char*) of bp->data in the current frame. 333end 334document bp 335Show information about the buffer header pointed to by the 336variable bp in the current frame. 337end 338document bpp 339Show summary information about the buffer header (struct bp) pointed 340at by the parameter. 341end 342document bpl 343Show detailled information about the buffer header (struct bp) pointed 344at by the parameter. 345end 346document bpl 347Show detailled information about the buffer header (struct bp) pointed 348at by the local variable bp. 349end 350define bx 351printf "\n b_vnbufs " 352output/x bp->b_vnbufs 353printf "\n b_freelist " 354output/x bp->b_freelist 355printf "\n b_act " 356output/x bp->b_act 357printf "\n b_flags " 358output/x bp->b_flags 359printf "\n b_qindex " 360output/x bp->b_qindex 361printf "\n b_usecount " 362output/x bp->b_usecount 363printf "\n b_error " 364output/x bp->b_error 365printf "\n b_bufsize " 366output/x bp->b_bufsize 367printf "\n b_bcount " 368output/x bp->b_bcount 369printf "\n b_resid " 370output/x bp->b_resid 371printf "\n b_dev " 372output/x bp->b_dev 373printf "\n b_data " 374output/x bp->b_data 375printf "\n b_kvasize " 376output/x bp->b_kvasize 377printf "\n b_blkno " 378output/x bp->b_blkno 379printf "\n b_iodone_chain " 380output/x bp->b_iodone_chain 381printf "\n b_vp " 382output/x bp->b_vp 383printf "\n b_dirtyoff " 384output/x bp->b_dirtyoff 385printf "\n b_validoff " 386output/x bp->b_validoff 387echo \n 388end 389define ddb 390set boothowto=0x80000000 391s 392end 393document ddb 394Switch back to ddb. 395end 396define ps 397 set $nproc = nprocs 398 set $aproc = allproc.lh_first 399 set $proc = allproc.lh_first 400 printf " pid proc addr uid ppid pgrp flag stat comm wchan\n" 401 while (--$nproc >= 0) 402 set $pptr = $proc.p_pptr 403 if ($pptr == 0) 404 set $pptr = $proc 405 end 406 if ($proc.p_stat) 407 printf "%5d %08x %08x %4d %5d %5d %06x %d %-10s ", \ 408 $proc.p_pid, $aproc, \ 409 $proc.p_addr, $proc.p_cred->p_ruid, $pptr->p_pid, \ 410 $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_stat, \ 411 &$proc.p_comm[0] 412 if ($proc.p_wchan) 413 if ($proc.p_wmesg) 414 printf "%s ", $proc.p_wmesg 415 end 416 printf "%x", $proc.p_wchan 417 end 418 printf "\n" 419 end 420 set $aproc = $proc.p_list.le_next 421 if ($aproc == 0 && $nproc > 0) 422 set $aproc = zombproc 423 end 424 set $proc = $aproc 425 end 426end 427document ps 428"ps" -- when kernel debugging, type out a ps-like listing of active processes. 429end 430define pcb 431 set $nproc = nprocs 432 set $aproc = allproc.lh_first 433 set $proc = allproc.lh_first 434 while (--$nproc >= 0) 435 set $pptr = $proc.p_pptr 436 if ($proc->p_pid == $arg0) 437 set $pcba = $pptr->p_addr->u_pcb 438 printf "ip: %08x sp: %08x bp: %08x bx: %08x\n", $pcba->pcb_eip, $pcba->pcb_esp, $pcba->pcb_ebp, $pcba->pcb_ebx 439 x/1i $pcba->pcb_eip 440 set $nproc = 0 441 end 442 set $aproc = $proc.p_list.le_next 443 if ($aproc == 0 && $nproc > 0) 444 set $aproc = zombproc 445 end 446 set $proc = $aproc 447 end 448end 449document pcb 450Show some pcb contents of process whose pid is specified. 451end 452define btr 453set $frame = $arg0 454set $fno = 0 455while (*(int *) $frame > 0xc0000000) 456 set $myebp = *(int *) $frame 457 set $myeip = *(int *) ($frame + 4) 458 printf " frame %d at %p: ebp %8x, eip ", $fno, $frame, $myebp 459 x/1i $myeip 460 set $frame = $myebp 461 set $fno = $fno + 1 462end 463end 464document btr 465Show a backtrace from the ebp address specified. This can be used to 466get a backtrace from any stack resident in memory. 467end 468define btp 469 set $nproc = nprocs 470 set $aproc = allproc.lh_first 471 set $proc = allproc.lh_first 472 while (--$nproc >= 0) 473 if ($proc->p_pid == $arg0) 474 btr $proc->p_addr->u_pcb->pcb_ebp 475 set $nproc = 0 476 else 477 set $aproc = $proc.p_list.le_next 478 if ($aproc == 0 && $nproc > 0) 479 set $aproc = zombproc 480 end 481 set $proc = $aproc 482 end 483 end 484end 485document btp 486Show a backtrace for the process whose pid is specified as a parameter. 487end 488define btpa 489 set $nproc = nprocs 490 set $aproc = allproc.lh_first 491 set $proc = allproc.lh_first 492 printf " pid proc addr uid ppid pgrp flag stat comm wchan\n" 493 while (--$nproc >= 0) 494 set $pptr = $proc.p_pptr 495 if ($pptr == 0) 496 set $pptr = $proc 497 end 498 if ($proc.p_stat) 499 printf "%5d %08x %08x %4d %5d %5d %06x %d %-10s ", \ 500 $proc.p_pid, $aproc, \ 501 $proc.p_addr, $proc.p_cred->p_ruid, $pptr->p_pid, \ 502 $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_stat, \ 503 &$proc.p_comm[0] 504 if ($proc.p_wchan) 505 if ($proc.p_wmesg) 506 printf "%s ", $proc.p_wmesg 507 end 508 printf "%x", $proc.p_wchan 509 end 510 printf "\n" 511 if ($proc->p_flag & 4) 512 btr $proc->p_addr->u_pcb->pcb_ebp 513 else 514 echo (not loaded)\n 515 end 516 end 517 set $aproc = $proc.p_list.le_next 518 if ($aproc == 0 && $nproc > 0) 519 set $aproc = zombproc 520 end 521 set $proc = $aproc 522 end 523end 524document btpa 525Show backtraces for all processes in the system. 526end 527define btpp 528 if ($myvectorproc->p_flag & 4) 529 btr $myvectorproc->p_addr->u_pcb->pcb_ebp 530 else 531 echo (not loaded)\n 532 end 533end 534document btpp 535Show a backtrace for the process previously selected with 'defproc'. 536end 537define defproc 538 set $nproc = nprocs 539 set $aproc = allproc.lh_first 540 set $proc = allproc.lh_first 541 while (--$nproc >= 0) 542 if ($proc->p_pid == $arg0) 543 set $pptr = $proc.p_pptr 544 if ($pptr == 0) 545 set $pptr = $proc 546 end 547 set $myvectorproc = $proc 548 if ($proc.p_stat) 549 printf "%5d %08x %08x %4d %5d %5d %06x %d %-10s ", \ 550 $proc.p_pid, $aproc, \ 551 $proc.p_addr, $proc.p_cred->p_ruid, $pptr->p_pid, \ 552 $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_stat, \ 553 &$proc.p_comm[0] 554 if ($proc.p_wchan) 555 if ($proc.p_wmesg) 556 printf "%s ", $proc.p_wmesg 557 end 558 printf "%x", $proc.p_wchan 559 end 560 printf "\n" 561 end 562 btpp 563 set $nproc = 0 564 else 565 set $proc = $proc.p_list.le_next 566 end 567 end 568end 569document defproc 570Specify a process for btpp and fr commands. 571end 572define fr 573set $fno = 0 574set $searching = 1 575if ($myvectorproc->p_flag & 4) 576 set $frame = $myvectorproc->p_addr->u_pcb->pcb_ebp 577 while (($searching == 1) && (*(int *) $frame > 0xc0000000)) 578 set $myebp = *(int *) $frame 579 set $myeip = *(int *) ($frame + 4) 580 if ($fno == $arg0) 581 printf " frame %d at %p: ebp %8x, eip ", $fno, $frame, $myebp 582 x/1i $myeip 583 printf "Called from %8x, stack frame at %8x\n", *(int *) ($myebp+4), *(int *) $myebp 584 printf "last 20 local variables:\n" 585 x/20x ($myebp-80) 586 printf "call parameters:\n" 587 x/8x ($myebp+8) 588 set $searching = 0 589 else 590 set $frame = $myebp 591 set $fno = $fno + 1 592 end 593 end 594 if ($searching == 1) 595 echo frame not found\n 596 end 597else 598 printf "process %d is not loaded in memory\n", $myvectorproc->p_pid 599end 600end 601document fr 602Show the frame of the stack of the process previously selected with 'defproc'. 603end 604set height 70 605set width 120 606define vdev 607if (vp->v_type == VBLK) 608 p *vp->v_un.vu_spec.vu_specinfo 609 printf "numoutput: %d\n", vp->v_numoutput 610else 611 echo "Not a block device" 612end 613end 614document vdev 615Show some information of the vnode pointed to by the local variable vp. 616end 617define y 618echo Check your .gdbinit, it contains a y command\n 619end 620define kldstat 621 set $file = files.tqh_first 622 printf "Id Refs Address Size Name\n" 623 while ($file != 0) 624 printf "%2d %4d 0x%8x %8x %s\n", \ 625 $file->id, \ 626 $file->refs, \ 627 $file->address, \ 628 $file->size, \ 629 $file->filename 630 set $file = $file->link.tqe_next 631 end 632end 633document kldstat 634Equivalent of the kldstat(9) command, without options. 635end 636define msgbuf 637printf "%s", msgbufp->msg_ptr 638end 639document msgbuf 640Print 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. 641end 642