|
|
1.1 ! root 1: /* ! 2: * ! 3: * UNIX debugger ! 4: * ! 5: */ ! 6: #include "defs.h" ! 7: #include "regs.h" ! 8: #include <a.out.h> ! 9: ! 10: MSG LONGFIL; ! 11: MSG NOTOPEN; ! 12: MSG BADMOD; ! 13: ! 14: int infile; ! 15: int outfile; ! 16: int maxpos; ! 17: int radix; ! 18: ! 19: BKPT *bkpthead; ! 20: ! 21: char lastc; ! 22: ! 23: char *signals[] = { ! 24: "", ! 25: "hangup", ! 26: "interrupt", ! 27: "quit", ! 28: "illegal instruction", ! 29: "trace/BPT", ! 30: "IOT", ! 31: "EMT", ! 32: "floating exception", ! 33: "killed", ! 34: "bus error", ! 35: "memory fault", ! 36: "bad system call", ! 37: "broken pipe", ! 38: "alarm call", ! 39: "terminated", ! 40: "signal 16", ! 41: "stopped", ! 42: "stop (tty)", ! 43: "continue (signal)", ! 44: "child termination", ! 45: "stop (tty input)", ! 46: "stop (tty output)", ! 47: "input available (signal)", ! 48: "cpu timelimit", ! 49: "file sizelimit", ! 50: "signal 26", ! 51: "signal 27", ! 52: "signal 28", ! 53: "signal 29", ! 54: "signal 30", ! 55: "signal 31", ! 56: }; ! 57: ! 58: /* general printing routines ($) */ ! 59: ! 60: printtrace(modif) ! 61: { ! 62: int i; ! 63: register BKPT *bk; ! 64: char *comptr; ! 65: register struct nlist *sp; ! 66: int stack; ! 67: ! 68: if (cntflg==0) ! 69: cntval = -1; ! 70: switch (modif) { ! 71: ! 72: case '<': ! 73: if (cntval == 0) { ! 74: while (readchar() != EOR) ! 75: ; ! 76: reread(); ! 77: break; ! 78: } ! 79: if (rdc() == '<') ! 80: stack = 1; ! 81: else { ! 82: stack = 0; ! 83: reread(); ! 84: } ! 85: /* fall through */ ! 86: case '>': ! 87: { ! 88: char file[64]; ! 89: char Ifile[128]; ! 90: extern char *Ipath; ! 91: int index; ! 92: ! 93: index=0; ! 94: if (modif=='<') ! 95: iclose(stack, 0); ! 96: else ! 97: oclose(); ! 98: if (rdc()!=EOR) { ! 99: do { ! 100: file[index++]=lastc; ! 101: if (index>=63) ! 102: error(LONGFIL); ! 103: } while (readchar()!=EOR); ! 104: file[index]=0; ! 105: if (modif=='<') { ! 106: if (Ipath) { ! 107: strcpy(Ifile, Ipath); ! 108: strcat(Ifile, "/"); ! 109: strcat(Ifile, file); ! 110: } ! 111: infile=open(file,0); ! 112: if (infile<0 && (infile=open(Ifile,0))<0) { ! 113: infile=STDIN; ! 114: error(NOTOPEN); ! 115: } else { ! 116: if (cntflg) ! 117: var[9] = cntval; ! 118: else ! 119: var[9] = 1; ! 120: } ! 121: } else { ! 122: outfile=open(file,1); ! 123: if (outfile<0) ! 124: outfile=creat(file,0644); ! 125: else ! 126: lseek(outfile,0L,2); ! 127: } ! 128: ! 129: } else { ! 130: if (modif == '<') ! 131: iclose(-1, 0); ! 132: } ! 133: reread(); ! 134: } ! 135: break; ! 136: ! 137: case 'p': ! 138: kmproc(); ! 139: break; ! 140: ! 141: case 'k': ! 142: kmsys(); ! 143: break; ! 144: ! 145: case 'd': ! 146: if (adrflg) { ! 147: if (adrval != 0 ! 148: && (adrval<2 || adrval>16)) ! 149: error("radix should be between 2 and 16, or 0"); ! 150: radix = adrval; ! 151: if (radix) ! 152: printf("radix=%d base ten",radix); ! 153: else ! 154: printf("radix=magic"); ! 155: } ! 156: break; ! 157: ! 158: case 'q': ! 159: case 'Q': ! 160: done(); ! 161: ! 162: case 'w': ! 163: case 'W': ! 164: maxpos=(adrflg?adrval:MAXPOS); ! 165: break; ! 166: ! 167: case 's': ! 168: case 'S': ! 169: maxoff=(adrflg?adrval:MAXOFF); ! 170: break; ! 171: ! 172: case 'v': ! 173: case 'V': ! 174: prints("variables\n"); ! 175: for (i=0;i<NVARS;i++) { ! 176: if (var[i]) { ! 177: printc((i<=9 ? '0' : 'a'-10) + i); ! 178: printf(" = %R\n", var[i]); ! 179: } ! 180: } ! 181: break; ! 182: ! 183: case 'm': ! 184: case 'M': ! 185: printmap("? map", symmap); ! 186: printmap("/ map", cormap); ! 187: break; ! 188: ! 189: case 0: ! 190: case '?': ! 191: if (pid) ! 192: printf("pcs id = %d\n",pid); ! 193: else ! 194: prints("no process\n"); ! 195: sigprint(); ! 196: flushbuf(); ! 197: ! 198: case 'r': ! 199: case 'R': ! 200: printregs(modif); ! 201: return; ! 202: ! 203: case 'c': ! 204: case 'C': ! 205: ctrace(modif); ! 206: break; ! 207: ! 208: /*print externals*/ ! 209: case 'e': ! 210: case 'E': ! 211: for (sp = symtab; sp < esymtab; sp++) { ! 212: if (sp->n_type==(N_DATA|N_EXT) || sp->n_type==(N_BSS|N_EXT)) ! 213: printf("%s:%12t%R\n", sp->n_un.n_name, ! 214: ltow(lget(sp->n_value,CORF|DATASP))); ! 215: } ! 216: break; ! 217: ! 218: /*print breakpoints*/ ! 219: case 'b': ! 220: case 'B': ! 221: printf("breakpoints\ncount%8tbkpt%24tcommand\n"); ! 222: for (bk=bkpthead; bk; bk=bk->nxtbkpt) ! 223: if (bk->flag) { ! 224: printf("%-8.8d",bk->count); ! 225: psymoff((WORD)bk->loc,INSTSP,"%24t"); ! 226: comptr=bk->comm; ! 227: while (*comptr) ! 228: printc(*comptr++); ! 229: } ! 230: break; ! 231: ! 232: default: ! 233: error(BADMOD); ! 234: } ! 235: ! 236: } ! 237: ! 238: printmap(s,mp) ! 239: char *s; ! 240: register MAP *mp; ! 241: { ! 242: char *maptype(); ! 243: ! 244: if (mp == symmap) ! 245: printf("%s%12t`%s'\n", s, fsym < 0 ? "-" : symfil); ! 246: else if (mp == cormap) ! 247: printf("%s%12t`%s'\n", s, fcor < 0 ? "-" : corfil); ! 248: else ! 249: printf("%s\n", s); ! 250: for (; mp->flag & MPINUSE; mp++) ! 251: printf("%-8s b = %-16Re = %-16Rf = %-16R\n", ! 252: maptype(mp->sp), (WORD)mp->b, (WORD)mp->e, (WORD)mp->f); ! 253: } ! 254: ! 255: char * ! 256: maptype(sp) ! 257: int sp; ! 258: { ! 259: ! 260: switch (sp & SPTYPE) { ! 261: case INSTSP: ! 262: return ("text"); ! 263: case DATASP: ! 264: return ("data"); ! 265: case UBLKSP: ! 266: return ("user"); ! 267: default: ! 268: return ("nonsense"); ! 269: } ! 270: } ! 271: ! 272: printpc() ! 273: { ! 274: TLONG w; ! 275: ! 276: dot = (ADDR)rtow(rget(PC)); ! 277: psymoff((WORD)dot, INSTSP, "?%16t"); ! 278: w = lget(dot, SYMF|INSTSP); ! 279: chkerr(); ! 280: printins(SYMF|INSTSP, w); ! 281: printc(EOR); ! 282: } ! 283: ! 284: char *illinames[] = { ! 285: "reserved addressing fault", ! 286: "privileged instruction fault", ! 287: "reserved operand fault" ! 288: }; ! 289: char *fpenames[] = { ! 290: 0, ! 291: "integer overflow trap", ! 292: "integer divide by zero trap", ! 293: "floating overflow trap", ! 294: "floating/decimal divide by zero trap", ! 295: "floating underflow trap", ! 296: "decimal overflow trap", ! 297: "subscript out of range trap", ! 298: "floating overflow fault", ! 299: "floating divide by zero fault", ! 300: "floating undeflow fault" ! 301: }; ! 302: ! 303: sigprint() ! 304: { ! 305: if ((signo>=0) && (signo<sizeof signals/sizeof signals[0])) ! 306: prints(signals[signo]); ! 307: switch (signo) { ! 308: ! 309: case SIGFPE: ! 310: if ((sigcode > 0 ! 311: && sigcode < sizeof fpenames / sizeof fpenames[0])) ! 312: printf(" (%s)", fpenames[sigcode]); ! 313: break; ! 314: ! 315: case SIGILL: ! 316: if ((sigcode >= 0 ! 317: && sigcode < sizeof illinames / sizeof illinames[0])) ! 318: printf(" (%s)", illinames[sigcode]); ! 319: break; ! 320: } ! 321: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.