|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)print.c 1.2 (Berkeley) 7/25/86"; ! 3: #endif ! 4: /* ! 5: * ! 6: * UNIX debugger ! 7: * ! 8: */ ! 9: #include "defs.h" ! 10: ! 11: MSG LONGFIL; ! 12: MSG NOTOPEN; ! 13: MSG BADMOD; ! 14: ! 15: MAP txtmap; ! 16: MAP datmap; ! 17: ! 18: ADDR lastframe; ! 19: ADDR callpc; ! 20: ! 21: INT infile; ! 22: INT outfile; ! 23: CHAR *lp; ! 24: ADDR maxoff; ! 25: L_INT maxpos; ! 26: INT radix; ! 27: ! 28: /* symbol management */ ! 29: ADDR localval; ! 30: ! 31: /* breakpoints */ ! 32: BKPTR bkpthead; ! 33: ! 34: REGLIST reglist[] = { ! 35: "p2lr", P2LR, &pcb.pcb_p2lr, ! 36: "p2br", P2BR, (int *)&pcb.pcb_p2br, ! 37: "p0lr", P0LR, &pcb.pcb_p0lr, ! 38: "p0br", P0BR, (int *)&pcb.pcb_p0br, ! 39: "ksp", KSP, &pcb.pcb_ksp, ! 40: "hfs", HFS, &pcb.pcb_hfs, ! 41: "psl", PSL, &pcb.pcb_psl, ! 42: "pc", PC, &pcb.pcb_pc, ! 43: "ach", ACHI, &pcb.pcb_ach, ! 44: "acl", ACLO, &pcb.pcb_acl, ! 45: "usp", USP, &pcb.pcb_usp, ! 46: "fp", FP, &pcb.pcb_fp, ! 47: "r12", R12, &pcb.pcb_r12, ! 48: "r11", R11, &pcb.pcb_r11, ! 49: "r10", R10, &pcb.pcb_r10, ! 50: "r9", R9, &pcb.pcb_r9, ! 51: "r8", R8, &pcb.pcb_r8, ! 52: "r7", R7, &pcb.pcb_r7, ! 53: "r6", R6, &pcb.pcb_r6, ! 54: "r5", R5, &pcb.pcb_r5, ! 55: "r4", R4, &pcb.pcb_r4, ! 56: "r3", R3, &pcb.pcb_r3, ! 57: "r2", R2, &pcb.pcb_r2, ! 58: "r1", R1, &pcb.pcb_r1, ! 59: "r0", R0, &pcb.pcb_r0, ! 60: 0 ! 61: }; ! 62: ! 63: char lastc; ! 64: ! 65: INT fcor; ! 66: STRING errflg; ! 67: INT signo; ! 68: INT sigcode; ! 69: ! 70: ! 71: L_INT dot; ! 72: L_INT var[]; ! 73: STRING symfil; ! 74: STRING corfil; ! 75: L_INT pid; ! 76: L_INT adrval; ! 77: INT adrflg; ! 78: L_INT cntval; ! 79: INT cntflg; ! 80: ! 81: STRING signals[] = { ! 82: "", ! 83: "hangup", ! 84: "interrupt", ! 85: "quit", ! 86: "illegal instruction", ! 87: "trace/BPT", ! 88: "IOT", ! 89: "EMT", ! 90: "floating exception", ! 91: "killed", ! 92: "bus error", ! 93: "memory fault", ! 94: "bad system call", ! 95: "broken pipe", ! 96: "alarm call", ! 97: "terminated", ! 98: "signal 16", ! 99: "stop (signal)", ! 100: "stop (tty)", ! 101: "continue (signal)", ! 102: "child termination", ! 103: "stop (tty input)", ! 104: "stop (tty output)", ! 105: "input available (signal)", ! 106: "cpu timelimit", ! 107: "file sizelimit", ! 108: "signal 26", ! 109: "signal 27", ! 110: "signal 28", ! 111: "signal 29", ! 112: "signal 30", ! 113: "signal 31", ! 114: }; ! 115: ! 116: /* general printing routines ($) */ ! 117: ! 118: printtrace(modif) ! 119: { ! 120: REG narg, i; ! 121: REG BKPTR bkptr; ! 122: REG ADDR word; ! 123: REG STRING comptr; ! 124: REG ADDR argp, frame; ! 125: register struct nlist *sp; ! 126: INT stack, ntramp; ! 127: ! 128: IF cntflg==0 THEN cntval = -1; FI ! 129: ! 130: switch (modif) { ! 131: ! 132: case '<': ! 133: IF cntval == 0 ! 134: THEN WHILE readchar() != EOR ! 135: DO OD ! 136: lp--; ! 137: break; ! 138: FI ! 139: IF rdc() == '<' ! 140: THEN stack = 1; ! 141: ELSE stack = 0; lp--; ! 142: FI ! 143: /* fall through */ ! 144: case '>': ! 145: {CHAR file[64]; ! 146: CHAR Ifile[128]; ! 147: extern CHAR *Ipath; ! 148: INT index; ! 149: ! 150: index=0; ! 151: IF modif=='<' ! 152: THEN iclose(stack, 0); ! 153: ELSE oclose(); ! 154: FI ! 155: IF rdc()!=EOR ! 156: THEN REP file[index++]=lastc; ! 157: IF index>=63 THEN error(LONGFIL); FI ! 158: PER readchar()!=EOR DONE ! 159: file[index]=0; ! 160: IF modif=='<' ! 161: THEN IF Ipath THEN ! 162: strcpy(Ifile, Ipath); ! 163: strcat(Ifile, "/"); ! 164: strcat(Ifile, file); ! 165: FI ! 166: infile=open(file,0); ! 167: IF infile<0 && (infile=open(Ifile,0))<0 ! 168: THEN infile=0; error(NOTOPEN); ! 169: ELSE IF cntflg ! 170: THEN var[9] = cntval; ! 171: ELSE var[9] = 1; ! 172: FI ! 173: FI ! 174: ELSE outfile=open(file,1); ! 175: IF outfile<0 ! 176: THEN outfile=creat(file,0644); ! 177: #ifndef EDDT ! 178: ELSE lseek(outfile,0L,2); ! 179: #endif ! 180: FI ! 181: FI ! 182: ! 183: ELSE IF modif == '<' ! 184: THEN iclose(-1, 0); ! 185: FI ! 186: FI ! 187: lp--; ! 188: } ! 189: break; ! 190: ! 191: case 'p': ! 192: IF kernel == 0 THEN ! 193: printf("not debugging kernel\n"); ! 194: ELSE ! 195: IF adrflg THEN ! 196: int pte = access(RD, dot, DSP, 0); ! 197: masterpcbb = (pte&PG_PFNUM)*NBPG; ! 198: FI ! 199: getpcb(); ! 200: FI ! 201: break; ! 202: ! 203: case 'd': ! 204: if (adrflg) { ! 205: if (!(adrval>=2 && adrval<=16 || adrval<=-2 && adrval>=-16)) { ! 206: printf("illegal radix %d base ten",radix); ! 207: break; ! 208: } ! 209: radix=adrval; ! 210: } ! 211: printf("radix=%d base ten",radix); ! 212: break; ! 213: ! 214: case 'q': case 'Q': case '%': ! 215: done(); ! 216: ! 217: case 'w': case 'W': ! 218: maxpos=(adrflg?adrval:MAXPOS); ! 219: break; ! 220: ! 221: case 's': case 'S': ! 222: maxoff=(adrflg?adrval:MAXOFF); ! 223: break; ! 224: ! 225: case 'v': case 'V': ! 226: printf("variables\n"); ! 227: FOR i=0;i<=35;i++ ! 228: DO IF var[i] ! 229: THEN printc((i<=9 ? '0' : 'a'-10) + i); ! 230: printf(" = %R\n",var[i]); ! 231: FI ! 232: OD ! 233: break; ! 234: ! 235: case 'm': case 'M': ! 236: printmap("? map",&txtmap); ! 237: printmap("/ map",&datmap); ! 238: break; ! 239: ! 240: case 0: case '?': ! 241: IF pid ! 242: THEN printf("pcs id = %d\n",pid); ! 243: ELSE printf("no process\n"); ! 244: FI ! 245: sigprint(); flushbuf(); ! 246: ! 247: case 'r': case 'R': ! 248: printregs(modif); ! 249: return; ! 250: ! 251: case 'c': case 'C': ! 252: IF adrflg ! 253: THEN frame=adrval; ! 254: callpc=get(frame-8,DSP); ! 255: ELIF kcore THEN ! 256: frame = pcb.pcb_fp; ! 257: callpc = pcb.pcb_pc; ! 258: ELSE ! 259: frame = *(ADDR *)(((ADDR)(&u))+FP); ! 260: callpc = *(ADDR *)(((ADDR)(&u))+PC); ! 261: FI ! 262: lastframe=0; ! 263: ntramp = 0; ! 264: WHILE cntval-- ANDF frame!=0 ! 265: DO char *name; ! 266: chkerr(); ! 267: /* check for pc in pcb (signal trampoline code) */ ! 268: if (MAXSTOR < callpc && callpc < MAXSTOR+ctob(UPAGES)) { ! 269: name = "sigtramp"; ! 270: ntramp++; ! 271: } else { ! 272: ntramp = 0; ! 273: findsym(callpc,ISYM); ! 274: if (cursym && ! 275: !strcmp(cursym->n_un.n_name, "start")) ! 276: break; ! 277: if (cursym) ! 278: name = cursym->n_un.n_name; ! 279: else ! 280: name = "?"; ! 281: } ! 282: printf("%s(", name); ! 283: narg = ((get(frame-4, DSP)&0xffff)-4)/4; ! 284: argp = frame; ! 285: IF ntramp != 1 THEN ! 286: LOOP IF narg==0 THEN break; FI ! 287: printf("%R", get(argp += 4, DSP)); ! 288: IF --narg!=0 THEN printc(','); FI ! 289: POOL ! 290: FI ! 291: printf(") at "); ! 292: psymoff(callpc, ISYM, "\n"); ! 293: ! 294: IF modif=='C' ! 295: THEN WHILE localsym(frame,argp) ! 296: DO word=get(localval,DSP); ! 297: printf("%8t%s:%10t", cursym->n_un.n_name); ! 298: IF errflg THEN printf("?\n"); errflg=0; ! 299: ELSE printf("%R\n",word); FI ! 300: OD ! 301: FI ! 302: ! 303: if (ntramp != 1) { ! 304: callpc = get(frame-8, DSP); ! 305: lastframe = frame; ! 306: frame = get(frame, DSP)&ALIGN; ! 307: } else ! 308: callpc = get(lastframe+44, DSP); ! 309: IF !adrflg ANDF !INSTACK(frame) ! 310: THEN break; FI ! 311: OD ! 312: break; ! 313: ! 314: /*print externals*/ ! 315: case 'e': case 'E': ! 316: for (sp = symtab; sp < esymtab; sp++) { ! 317: if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT)) ! 318: printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP)); ! 319: } ! 320: break; ! 321: ! 322: /*print breakpoints*/ ! 323: case 'b': case 'B': ! 324: printf("breakpoints\ncount%8tbkpt%24tcommand\n"); ! 325: for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) ! 326: if (bkptr->flag) { ! 327: printf("%-8.8d",bkptr->count); ! 328: psymoff(bkptr->loc,ISYM,"%24t"); ! 329: comptr=bkptr->comm; ! 330: WHILE *comptr DO printc(*comptr++); OD ! 331: } ! 332: break; ! 333: ! 334: default: error(BADMOD); ! 335: } ! 336: ! 337: } ! 338: ! 339: printmap(s,amap) ! 340: STRING s; REG MAP *amap; ! 341: { ! 342: int file; ! 343: file=amap->ufd; ! 344: printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil))); ! 345: printf("b1 = %-16R",amap->b1); ! 346: printf("e1 = %-16R",amap->e1); ! 347: printf("f1 = %-16R",amap->f1); ! 348: printf("\nb2 = %-16R",amap->b2); ! 349: printf("e2 = %-16R",amap->e2); ! 350: printf("f2 = %-16R",amap->f2); ! 351: printc(EOR); ! 352: } ! 353: ! 354: printregs(c) ! 355: { ! 356: REG REGPTR p; ! 357: ADDR v; ! 358: ! 359: FOR p=reglist; p->rname; p++ ! 360: DO ! 361: if(c!='R' && p->roffs!=PSL) ! 362: continue; ! 363: c = 'R'; ! 364: v = kcore ? *p->rkern : *(ADDR *)(((ADDR)&u)+p->roffs); ! 365: printf("%s%6t%R %16t", p->rname, v); ! 366: valpr(v,(p->roffs==PC?ISYM:DSYM)); ! 367: printc(EOR); ! 368: OD ! 369: printpc(); ! 370: } ! 371: ! 372: getreg(regnam) ! 373: { ! 374: REG REGPTR p; ! 375: REG STRING regptr; ! 376: CHAR *olp; ! 377: ! 378: olp=lp; ! 379: FOR p=reglist; p->rname; p++ ! 380: DO regptr=p->rname; ! 381: IF (regnam == *regptr++) ! 382: THEN ! 383: WHILE *regptr ! 384: DO IF readchar() != *regptr++ ! 385: THEN --regptr; break; ! 386: FI ! 387: OD ! 388: IF *regptr ! 389: THEN lp=olp; ! 390: ELSE return(kcore ? (int)p->rkern : p->roffs); ! 391: FI ! 392: FI ! 393: OD ! 394: lp=olp; ! 395: return(-1); ! 396: } ! 397: ! 398: printpc() ! 399: { ! 400: dot= *(ADDR *)(((ADDR)(&u))+PC); ! 401: psymoff(dot,ISYM,":%16t"); printins(ISP,chkget(dot,ISP)); ! 402: printc(EOR); ! 403: } ! 404: ! 405: char *illinames[] = { ! 406: "reserved addressing fault", ! 407: "priviliged instruction fault", ! 408: "reserved operand fault" ! 409: }; ! 410: char *fpenames[] = { ! 411: 0, ! 412: "integer overflow trap", ! 413: "integer divide by zero trap", ! 414: /* not valid ! 415: "floating overflow trap", ! 416: "floating/decimal divide by zero trap", ! 417: "floating underflow trap", ! 418: "decimal overflow trap", ! 419: "subscript out of range trap", ! 420: "floating overflow fault", ! 421: "floating divide by zero fault", ! 422: "floating undeflow fault" ! 423: */ ! 424: }; ! 425: ! 426: sigprint() ! 427: { ! 428: IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) ! 429: THEN printf(signals[signo]); FI ! 430: switch (signo) { ! 431: ! 432: case SIGFPE: ! 433: IF (sigcode > 0 && ! 434: sigcode < sizeof fpenames / sizeof fpenames[0]) THEN ! 435: printf(" ("); printf(fpenames[sigcode]); printc(')'); ! 436: FI ! 437: break; ! 438: ! 439: case SIGILL: ! 440: IF (sigcode >= 0 && ! 441: sigcode < sizeof illinames / sizeof illinames[0]) THEN ! 442: printf(" ("); printf(illinames[sigcode]); printc(')'); ! 443: FI ! 444: break; ! 445: } ! 446: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.