|
|
1.1 ! root 1: /* ! 2: * ! 3: * UNIX debugger ! 4: * ! 5: */ ! 6: #include "defs.h" ! 7: #include "regs.h" ! 8: #include "sym.h" ! 9: #include "bkpt.h" ! 10: #include "map.h" ! 11: #include "space.h" ! 12: ! 13: extern int infile; ! 14: extern int outfile; ! 15: extern int maxpos; ! 16: extern int radix; ! 17: extern char lastc; ! 18: extern int maxargs; ! 19: ! 20: /* general printing routines ($) */ ! 21: ! 22: char *Ipath = "/usr/lib/adb"; ! 23: ! 24: printtrace(modif) ! 25: { ! 26: int i; ! 27: register BKPT *bk; ! 28: register struct sym *sp; ! 29: int stack; ! 30: char *fname; ! 31: char *getfname(); ! 32: ! 33: if (cntflg==0) ! 34: cntval = -1; ! 35: switch (modif) { ! 36: ! 37: case '<': ! 38: if (cntval == 0) { ! 39: while (readchar() != EOR) ! 40: ; ! 41: reread(); ! 42: break; ! 43: } ! 44: if (rdc() == '<') ! 45: stack = 1; ! 46: else { ! 47: stack = 0; ! 48: reread(); ! 49: } ! 50: fname = getfname(); ! 51: redirin(stack, fname); ! 52: break; ! 53: ! 54: case '>': ! 55: fname = getfname(); ! 56: redirout(fname); ! 57: break; ! 58: ! 59: case 'p': ! 60: kmproc(); ! 61: break; ! 62: ! 63: case 'k': ! 64: kmsys(); ! 65: break; ! 66: ! 67: case 'd': ! 68: if (adrflg) { ! 69: if (adrval != 0 ! 70: && (adrval<2 || adrval>16)) ! 71: error("radix should be between 2 and 16, or 0"); ! 72: radix = adrval; ! 73: if (radix) ! 74: printf("radix=%d base ten",radix); ! 75: else ! 76: printf("radix=magic"); ! 77: } ! 78: break; ! 79: ! 80: case 'q': ! 81: case 'Q': ! 82: done(); ! 83: ! 84: case 'w': ! 85: maxpos=(adrflg?adrval:MAXPOS); ! 86: break; ! 87: ! 88: case 'S': ! 89: printsym(); ! 90: break; ! 91: ! 92: case 's': ! 93: maxoff=(adrflg?adrval:MAXOFF); ! 94: break; ! 95: ! 96: case 'v': ! 97: for (i=0;i<NVARS;i++) { ! 98: if (var[i]) ! 99: printf("%-8R >%c\n", var[i], ! 100: (i<=9 ? '0' : 'a'-10) + i); ! 101: } ! 102: break; ! 103: ! 104: case 'm': ! 105: printmap("? map", symmap); ! 106: printmap("/ map", cormap); ! 107: break; ! 108: ! 109: case 0: ! 110: case '?': ! 111: if (pid) ! 112: printf("pcs id = %d\n",pid); ! 113: else ! 114: prints("no process\n"); ! 115: sigprint(); ! 116: flushbuf(); ! 117: ! 118: case 'r': ! 119: case 'R': ! 120: printregs(modif); ! 121: return; ! 122: ! 123: case 'c': ! 124: case 'C': ! 125: ctrace(modif); ! 126: break; ! 127: ! 128: case 'a': ! 129: if (adrflg) ! 130: maxargs = adrval; ! 131: else ! 132: printf("%R$a\n", maxargs); ! 133: return; ! 134: ! 135: /*print externals*/ ! 136: case 'e': ! 137: for (sp = symtab; sp; sp = sp->y_next) { ! 138: if (sp->y_type==S_DATA) ! 139: printf("%s/%12t%R\n", sp->y_name, ! 140: ltow(lget(sp->y_value,CORF|DATASP))); ! 141: } ! 142: break; ! 143: ! 144: /*print breakpoints*/ ! 145: case 'b': ! 146: case 'B': ! 147: for (bk=bkpthead; bk; bk=bk->nxtbkpt) ! 148: if (bk->flag) { ! 149: psymoff((WORD)bk->loc,INSTSP,""); ! 150: if (bk->count != 1) ! 151: printf(",%d", bk->count); ! 152: printf(":%c %s", bk->flag == BKPTTMP ? 'B' : 'b', bk->comm); ! 153: } ! 154: break; ! 155: ! 156: default: ! 157: error("bad `$' command"); ! 158: } ! 159: ! 160: } ! 161: ! 162: static ! 163: char * ! 164: getfname() ! 165: { ! 166: static char fname[ARB]; ! 167: register char *p; ! 168: ! 169: if (rdc() == EOR) { ! 170: reread(); ! 171: return (NULL); ! 172: } ! 173: p = fname; ! 174: do { ! 175: *p++ = lastc; ! 176: if (p >= &fname[ARB-1]) ! 177: error("filename too long"); ! 178: } while (rdc() != EOR); ! 179: *p = 0; ! 180: reread(); ! 181: return (fname); ! 182: } ! 183: ! 184: static ! 185: redirin(stack, file) ! 186: int stack; ! 187: char *file; ! 188: { ! 189: char pfile[ARB]; ! 190: ! 191: if (file == NULL) { ! 192: iclose(-1, 0); ! 193: return; ! 194: } ! 195: iclose(stack, 0); ! 196: if ((infile = open(file, 0)) < 0) { ! 197: strcpy(pfile, Ipath); ! 198: strcat(pfile, "/"); ! 199: strcat(pfile, file); ! 200: if ((infile = open(pfile, 0)) < 0) { ! 201: infile = STDIN; ! 202: error("cannot open"); ! 203: } ! 204: } ! 205: if (cntflg) ! 206: var[9] = cntval; ! 207: else ! 208: var[9] = 1; ! 209: } ! 210: ! 211: static ! 212: redirout(file) ! 213: char *file; ! 214: { ! 215: ! 216: oclose(); ! 217: if (file == NULL) ! 218: return; ! 219: if ((outfile = open(file, 1)) >= 0) ! 220: lseek(outfile, 0L, 2); ! 221: else if ((outfile = creat(file, 0666)) < 0) { ! 222: outfile = STDOUT; ! 223: error("cannot create"); ! 224: } ! 225: } ! 226: ! 227: printmap(s,mp) ! 228: char *s; ! 229: register MAP *mp; ! 230: { ! 231: char *maptype(); ! 232: ! 233: if (mp == symmap) ! 234: printf("%s%12t`%s'\n", s, fsym < 0 ? "-" : symfil); ! 235: else if (mp == cormap) ! 236: printf("%s%12t`%s'\n", s, fcor < 0 ? "-" : corfil); ! 237: else ! 238: printf("%s\n", s); ! 239: for (; mp->flag & MPINUSE; mp++) ! 240: printf("%-8s b = %-16Re = %-16Rf = %-16R\n", ! 241: maptype(mp->sp), (WORD)mp->b, (WORD)mp->e, (WORD)mp->f); ! 242: } ! 243: ! 244: char * ! 245: maptype(sp) ! 246: int sp; ! 247: { ! 248: ! 249: switch (sp & SPTYPE) { ! 250: case INSTSP: ! 251: return ("text"); ! 252: case DATASP: ! 253: return ("data"); ! 254: case UBLKSP: ! 255: return ("user"); ! 256: default: ! 257: return ("nonsense"); ! 258: } ! 259: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.