|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1986 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)kdb_print.c 7.5 (Berkeley) 12/15/86 ! 7: */ ! 8: ! 9: #include "../kdb/defs.h" ! 10: ! 11: char *BADRAD; ! 12: ! 13: ADDR lastframe; ! 14: ADDR callpc; ! 15: ! 16: char *BADMOD; ! 17: char *lp; ! 18: long maxpos; ! 19: int radix; ! 20: char lastc; ! 21: ! 22: /* breakpoints */ ! 23: BKPTR bkpthead; ! 24: ! 25: extern REGLIST reglist[]; ! 26: ! 27: /* general printing routines ($) */ ! 28: ! 29: printtrace(modif) ! 30: { ! 31: register narg, i; ! 32: register BKPTR bkptr; ! 33: register ADDR word; ! 34: register char *comptr; ! 35: register ADDR argp, frame; ! 36: register struct nlist *sp; ! 37: int ntramp; ! 38: register struct proc *p; ! 39: extern struct proc *allproc; ! 40: ! 41: if (cntflg==0) ! 42: cntval = -1; ! 43: switch (modif) { ! 44: ! 45: case 'd': ! 46: if (adrflg) { ! 47: if (adrval < 2 || adrval > 16) ! 48: error(BADRAD); ! 49: radix = adrval; ! 50: } ! 51: printf("radix=%d base ten", radix); ! 52: break; ! 53: ! 54: case 'w': case 'W': ! 55: printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS)); ! 56: break; ! 57: ! 58: case 's': case 'S': ! 59: printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF)); ! 60: break; ! 61: ! 62: case 'v': case 'V': ! 63: printf("variables\n"); ! 64: for (i=0;i<=35;i++) ! 65: if (var[i]) { ! 66: printc((i<=9 ? '0' : 'a'-10) + i); ! 67: printf(" = %R\n",var[i]); ! 68: } ! 69: break; ! 70: ! 71: case 0: case '?': ! 72: if (p = (struct proc *)var[varchk('p')]) ! 73: printf("pid = %d\n", p->p_pid); ! 74: else ! 75: printf("in idle loop\n"); ! 76: printtrap(var[varchk('t')], var[varchk('c')]); ! 77: /* fall thru... */ ! 78: case 'r': case 'R': ! 79: printregs(modif); ! 80: return; ! 81: ! 82: case 'c': case 'C': ! 83: if (adrflg) { ! 84: frame = adrval; ! 85: callpc = getprevpc(frame); ! 86: } else { ! 87: frame = pcb.pcb_fp; ! 88: callpc = pcb.pcb_pc; ! 89: } ! 90: lastframe = NOFRAME; ! 91: ntramp = 0; ! 92: while (cntval-- && frame != NOFRAME) { ! 93: char *name; ! 94: ! 95: chkerr(); ! 96: /* check for pc in pcb (signal trampoline code) */ ! 97: if (issignalpc(callpc)) { ! 98: name = "sigtramp"; ! 99: ntramp++; ! 100: } else { ! 101: ntramp = 0; ! 102: (void) findsym((long)callpc, ISYM); ! 103: if (cursym) ! 104: name = cursym->n_un.n_name; ! 105: else ! 106: name = "?"; ! 107: } ! 108: printf("%s(", name); ! 109: narg = getnargs(frame); ! 110: argp = frame; ! 111: if (ntramp != 1) ! 112: while (narg) { ! 113: printf("%R", ! 114: get((off_t)(argp = nextarg(argp)), ! 115: DSP)); ! 116: if (--narg != 0) ! 117: printc(','); ! 118: } ! 119: printf(") at "); ! 120: psymoff((long)callpc, ISYM, "\n"); ! 121: ! 122: if (modif=='C') { ! 123: while (localsym((long)frame)) { ! 124: word = get((off_t)localval, DSP); ! 125: printf("%8t%s:%10t", ! 126: cursym->n_un.n_name); ! 127: if (errflg) { ! 128: printf("?\n"); ! 129: errflg = 0; ! 130: } else ! 131: printf("%R\n", word); ! 132: } ! 133: } ! 134: if (ntramp != 1) { ! 135: callpc = getprevpc(frame); ! 136: lastframe = frame; ! 137: frame = getprevframe(frame); ! 138: } else ! 139: callpc = getsignalpc(lastframe); ! 140: if (!adrflg && !INSTACK(frame)) ! 141: break; ! 142: } ! 143: break; ! 144: ! 145: /*print externals*/ ! 146: case 'e': case 'E': ! 147: for (sp = symtab; sp < esymtab; sp++) ! 148: if (sp->n_type==(N_DATA|N_EXT) || ! 149: sp->n_type==(N_BSS|N_EXT)) ! 150: printf("%s:%12t%R\n", sp->n_un.n_name, ! 151: get((off_t)sp->n_value, DSP)); ! 152: break; ! 153: ! 154: /*print breakpoints*/ ! 155: case 'b': case 'B': ! 156: printf("breakpoints\ncount%8tbkpt%24tcommand\n"); ! 157: for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) ! 158: if (bkptr->flag) { ! 159: printf("%-8.8d",bkptr->count); ! 160: psymoff((long)bkptr->loc,ISYM,"%24t"); ! 161: comptr=bkptr->comm; ! 162: while (*comptr) ! 163: printc(*comptr++); ! 164: } ! 165: break; ! 166: ! 167: case 'l': ! 168: for (p = allproc; p; p = p->p_nxt) { ! 169: printf("%X pid %5d %c", p, p->p_pid, ! 170: p->p_stat == SSLEEP ? 'S' : ! 171: p->p_stat == SRUN ? 'R': ! 172: p->p_stat == SIDL ? 'I': ! 173: p->p_stat == SSTOP ? 'T' : '?'); ! 174: if (p->p_wchan) { ! 175: printf(" wait "); ! 176: psymoff((long)p->p_wchan, ISYM, ""); ! 177: } ! 178: printc(EOR); ! 179: } ! 180: break; ! 181: ! 182: default: ! 183: error(BADMOD); ! 184: } ! 185: } ! 186: ! 187: static ! 188: printregs(c) ! 189: { ! 190: register REGPTR p; ! 191: ADDR v; ! 192: ! 193: for (p = reglist; p->rname; p++) { ! 194: if (c != 'R' && ishiddenreg(p)) ! 195: continue; ! 196: v = *p->rkern; ! 197: printf("%s%6t%R %16t", p->rname, v); ! 198: valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM); ! 199: printc(EOR); ! 200: } ! 201: printpc(); ! 202: } ! 203: ! 204: getreg(regnam) ! 205: { ! 206: register REGPTR p; ! 207: register char *regptr; ! 208: char *olp; ! 209: ! 210: olp = lp; ! 211: for (p = reglist; p->rname; p++) { ! 212: regptr = p->rname; ! 213: if (regnam == *regptr++) { ! 214: while (*regptr) ! 215: if (readchar() != *regptr++) { ! 216: --regptr; ! 217: break; ! 218: } ! 219: if (*regptr) ! 220: lp = olp; ! 221: else ! 222: return ((int)p->rkern); ! 223: } ! 224: } ! 225: lp = olp; ! 226: return (-1); ! 227: } ! 228: ! 229: printpc() ! 230: { ! 231: ! 232: psymoff((long)pcb.pcb_pc, ISYM, ":%16t"); ! 233: printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP)); ! 234: printc(EOR); ! 235: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.