|
|
1.1 ! root 1: static char sccsid[] = "%Z%%M% %I% %G%"; ! 2: /* ! 3: * ! 4: * UNIX debugger ! 5: * ! 6: */ ! 7: #include "defs.h" ! 8: ! 9: MSG LONGFIL; ! 10: MSG NOTOPEN; ! 11: MSG A68BAD; ! 12: MSG A68LNK; ! 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: L_INT maxoff; ! 25: L_INT maxpos; ! 26: INT radix; ! 27: ! 28: /* symbol management */ ! 29: L_INT localval; ! 30: ! 31: /* breakpoints */ ! 32: BKPTR bkpthead; ! 33: ! 34: REGLIST reglist [] = { ! 35: "p1lr", P1LR, ! 36: "p1br",P1BR, ! 37: "p0lr", P0LR, ! 38: "p0br",P0BR, ! 39: "ksp",KSP, ! 40: "esp",ESP, ! 41: "ssp",SSP, ! 42: "psl", PSL, ! 43: "pc", PC, ! 44: "usp",USP, ! 45: "fp", FP, ! 46: "ap", AP, ! 47: "r11", R11, ! 48: "r10", R10, ! 49: "r9", R9, ! 50: "r8", R8, ! 51: "r7", R7, ! 52: "r6", R6, ! 53: "r5", R5, ! 54: "r4", R4, ! 55: "r3", R3, ! 56: "r2", R2, ! 57: "r1", R1, ! 58: "r0", R0, ! 59: }; ! 60: ! 61: char lastc; ! 62: ! 63: INT fcor; ! 64: STRING errflg; ! 65: INT signo; ! 66: ! 67: ! 68: L_INT dot; ! 69: L_INT var[]; ! 70: STRING symfil; ! 71: STRING corfil; ! 72: INT pid; ! 73: L_INT adrval; ! 74: INT adrflg; ! 75: L_INT cntval; ! 76: INT cntflg; ! 77: ! 78: STRING signals[] = { ! 79: "", ! 80: "hangup", ! 81: "interrupt", ! 82: "quit", ! 83: "illegal instruction", ! 84: "trace/BPT", ! 85: "IOT", ! 86: "EMT", ! 87: "floating exception", ! 88: "killed", ! 89: "bus error", ! 90: "memory fault", ! 91: "bad system call", ! 92: "broken pipe", ! 93: "alarm call", ! 94: "terminated", ! 95: "signal 16", ! 96: "stop (signal)", ! 97: "stop (tty)", ! 98: "continue (signal)", ! 99: "child termination", ! 100: "stop (tty input)", ! 101: "stop (tty output)", ! 102: "input available (signal)", ! 103: "cpu timelimit", ! 104: "file sizelimit", ! 105: "signal 26", ! 106: "signal 27", ! 107: "signal 28", ! 108: "signal 29", ! 109: "signal 30", ! 110: "signal 31", ! 111: }; ! 112: ! 113: /* general printing routines ($) */ ! 114: ! 115: printtrace(modif) ! 116: { ! 117: INT narg, i, stat, name, limit; ! 118: POS dynam; ! 119: REG BKPTR bkptr; ! 120: CHAR hi, lo; ! 121: ADDR word; ! 122: STRING comptr; ! 123: ADDR argp, frame, link; ! 124: register struct nlist *sp; ! 125: ! 126: IF cntflg==0 THEN cntval = -1; FI ! 127: ! 128: switch (modif) { ! 129: ! 130: case '<': ! 131: case '>': ! 132: {CHAR file[64]; ! 133: INT index; ! 134: ! 135: index=0; ! 136: IF modif=='<' ! 137: THEN iclose(); ! 138: ELSE oclose(); ! 139: FI ! 140: IF rdc()!=EOR ! 141: THEN REP file[index++]=lastc; ! 142: IF index>=63 THEN error(LONGFIL); FI ! 143: PER readchar()!=EOR DONE ! 144: file[index]=0; ! 145: IF modif=='<' ! 146: THEN infile=open(file,0); ! 147: IF infile<0 ! 148: THEN infile=0; error(NOTOPEN); ! 149: FI ! 150: ELSE outfile=open(file,1); ! 151: IF outfile<0 ! 152: THEN outfile=creat(file,0644); ! 153: #ifndef EDDT ! 154: ELSE lseek(outfile,0L,2); ! 155: #endif ! 156: FI ! 157: FI ! 158: ! 159: FI ! 160: lp--; ! 161: } ! 162: break; ! 163: ! 164: case 'd': ! 165: if (adrflg) { ! 166: if (adrval<2 || adrval>16) {printf("must have 2 <= radix <= 16"); break;} ! 167: printf("radix=%d base ten",radix=adrval); ! 168: } ! 169: break; ! 170: ! 171: case 'q': case 'Q': case '%': ! 172: done(); ! 173: ! 174: case 'w': case 'W': ! 175: maxpos=(adrflg?adrval:MAXPOS); ! 176: break; ! 177: ! 178: case 's': case 'S': ! 179: maxoff=(adrflg?adrval:MAXOFF); ! 180: break; ! 181: ! 182: case 'v': case 'V': ! 183: prints("variables\n"); ! 184: FOR i=0;i<=35;i++ ! 185: DO IF var[i] ! 186: THEN printc((i<=9 ? '0' : 'a'-10) + i); ! 187: printf(" = %Q\n",var[i]); ! 188: FI ! 189: OD ! 190: break; ! 191: ! 192: case 'm': case 'M': ! 193: printmap("? map",&txtmap); ! 194: printmap("/ map",&datmap); ! 195: break; ! 196: ! 197: case 0: case '?': ! 198: IF pid ! 199: THEN printf("pcs id = %d\n",pid); ! 200: ELSE prints("no process\n"); ! 201: FI ! 202: sigprint(); flushbuf(); ! 203: ! 204: case 'r': case 'R': ! 205: printregs(); ! 206: return; ! 207: ! 208: case 'c': case 'C': ! 209: IF adrflg ! 210: THEN frame=adrval; ! 211: word=get(adrval+6,DSP)&0xFFFF; ! 212: IF word&0x2000 ! 213: THEN /* 'calls', can figure out argp */ ! 214: argp=adrval+20+((word>>14)&3); word &= 0xFFF; ! 215: WHILE word DO IF word&1 THEN argp+=4; FI word>>=1; OD ! 216: ELSE /* 'callg', can't tell where argp is */ argp=frame; ! 217: FI ! 218: callpc=get(frame+16,DSP); ! 219: ELSE argp= *(ADDR *)(((ADDR)&u)+AP); ! 220: frame= *(ADDR *)(((ADDR)&u)+FP); ! 221: callpc= *(ADDR *)(((ADDR)&u)+PC); ! 222: FI ! 223: lastframe=0; ! 224: WHILE cntval-- ! 225: DO chkerr(); ! 226: findsym(callpc,ISYM); ! 227: if (cursym && !strcmp(cursym->n_un.n_name, "start")) ! 228: break; ! 229: printf("%s(", cursym ? cursym->n_un.n_name : "?"); ! 230: narg = get(argp,DSP); IF narg&~0xFF THEN narg=0; FI ! 231: LOOP IF narg==0 THEN break; FI ! 232: printf("%R", get(argp += 4, DSP)); ! 233: IF --narg!=0 THEN printc(','); FI ! 234: POOL ! 235: printf(") from %X\n",callpc); /* jkf mod */ ! 236: ! 237: IF modif=='C' ! 238: THEN WHILE localsym(frame,argp) ! 239: DO word=get(localval,DSP); ! 240: printf("%8t%s:%10t", cursym->n_un.n_name); ! 241: IF errflg THEN prints("?\n"); errflg=0; ELSE printf("%R\n",word); FI ! 242: OD ! 243: FI ! 244: ! 245: callpc=get(frame+16, DSP); ! 246: argp=get(frame+8, DSP); ! 247: lastframe=frame; ! 248: frame=get(frame+12, DSP)&EVEN; ! 249: IF frame==0 ORF (!adrflg ANDF !INSTACK(frame)) ! 250: THEN break; ! 251: FI ! 252: OD ! 253: break; ! 254: ! 255: /*print externals*/ ! 256: case 'e': case 'E': ! 257: for (sp = symtab; sp < esymtab; sp++) { ! 258: if (sp->n_type==(N_DATA|N_EXT) ORF sp->n_type==(N_BSS|N_EXT)) ! 259: printf("%s:%12t%R\n", sp->n_un.n_name, get(sp->n_value,DSP)); ! 260: } ! 261: break; ! 262: ! 263: case 'a': case 'A': ! 264: error("No algol 68 on VAX"); ! 265: /*NOTREACHED*/ ! 266: ! 267: /*print breakpoints*/ ! 268: case 'b': case 'B': ! 269: printf("breakpoints\ncount%8tbkpt%24tcommand\n"); ! 270: for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt) ! 271: if (bkptr->flag) { ! 272: printf("%-8.8d",bkptr->count); ! 273: psymoff(leng(bkptr->loc),ISYM,"%24t"); ! 274: comptr=bkptr->comm; ! 275: WHILE *comptr DO printc(*comptr++); OD ! 276: } ! 277: break; ! 278: ! 279: default: error(BADMOD); ! 280: } ! 281: ! 282: } ! 283: ! 284: printmap(s,amap) ! 285: STRING s; MAP *amap; ! 286: { ! 287: int file; ! 288: file=amap->ufd; ! 289: printf("%s%12t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil))); ! 290: printf("b1 = %-16R",amap->b1); ! 291: printf("e1 = %-16R",amap->e1); ! 292: printf("f1 = %-16R",amap->f1); ! 293: printf("\nb2 = %-16R",amap->b2); ! 294: printf("e2 = %-16R",amap->e2); ! 295: printf("f2 = %-16R",amap->f2); ! 296: printc(EOR); ! 297: } ! 298: ! 299: printregs() ! 300: { ! 301: REG REGPTR p; ! 302: L_INT v; ! 303: ! 304: FOR p=reglist; p < ®list[24]; p++ ! 305: DO printf("%s%6t%R %16t", p->rname, v= *(ADDR *)(((ADDR)&u)+p->roffs)); ! 306: valpr(v,(p->roffs==PC?ISYM:DSYM)); ! 307: printc(EOR); ! 308: OD ! 309: printpc(); ! 310: } ! 311: ! 312: getreg(regnam) ! 313: { ! 314: REG REGPTR p; ! 315: REG STRING regptr; ! 316: CHAR *olp; ! 317: CHAR regnxt; ! 318: ! 319: olp=lp; ! 320: FOR p=reglist; p < ®list[24]; p++ ! 321: DO regptr=p->rname; ! 322: IF (regnam == *regptr++) ! 323: THEN ! 324: WHILE *regptr ! 325: DO IF (regnxt=readchar()) != *regptr++ ! 326: THEN --regptr; break; ! 327: FI ! 328: OD ! 329: IF *regptr ! 330: THEN lp=olp; ! 331: ELSE return(p->roffs); ! 332: FI ! 333: FI ! 334: OD ! 335: lp=olp; ! 336: return(0); ! 337: } ! 338: ! 339: printpc() ! 340: { ! 341: dot= *(ADDR *)(((ADDR)&u)+PC); ! 342: psymoff(dot,ISYM,":%16t"); printins(0,ISP,chkget(dot,ISP)); ! 343: printc(EOR); ! 344: } ! 345: ! 346: sigprint() ! 347: { ! 348: IF (signo>=0) ANDF (signo<sizeof signals/sizeof signals[0]) ! 349: THEN prints(signals[signo]); FI ! 350: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.