print.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. /*
  2. *
  3. * debugger
  4. *
  5. */
  6. #include "defs.h"
  7. #include "fns.h"
  8. extern int infile;
  9. extern int outfile;
  10. extern int maxpos;
  11. /* general printing routines ($) */
  12. char *Ipath = INCDIR;
  13. static int tracetype;
  14. static void printfp(Map*, int);
  15. /*
  16. * callback on stack trace
  17. */
  18. static void
  19. ptrace(Map *map, ulong pc, ulong sp, Symbol *sym)
  20. {
  21. char buf[512];
  22. USED(map);
  23. dprint("%s(", sym->name);
  24. printparams(sym, sp);
  25. dprint(") ");
  26. printsource(sym->value);
  27. dprint(" called from ");
  28. symoff(buf, 512, pc, CTEXT);
  29. dprint("%s ", buf);
  30. printsource(pc);
  31. dprint("\n");
  32. if(tracetype == 'C')
  33. printlocals(sym, sp);
  34. }
  35. void
  36. printtrace(int modif)
  37. {
  38. int i;
  39. ulong pc, sp, link;
  40. long v;
  41. BKPT *bk;
  42. Symbol s;
  43. int stack;
  44. char *fname;
  45. char buf[512];
  46. if (cntflg==0)
  47. cntval = -1;
  48. switch (modif) {
  49. case '<':
  50. if (cntval == 0) {
  51. while (readchar() != EOR)
  52. ;
  53. reread();
  54. break;
  55. }
  56. if (rdc() == '<')
  57. stack = 1;
  58. else {
  59. stack = 0;
  60. reread();
  61. }
  62. fname = getfname();
  63. redirin(stack, fname);
  64. break;
  65. case '>':
  66. fname = getfname();
  67. redirout(fname);
  68. break;
  69. case 'a':
  70. attachprocess();
  71. break;
  72. case 'k':
  73. kmsys();
  74. break;
  75. case 'q':
  76. case 'Q':
  77. done();
  78. case 'w':
  79. maxpos=(adrflg?adrval:MAXPOS);
  80. break;
  81. case 'S':
  82. printsym();
  83. break;
  84. case 's':
  85. maxoff=(adrflg?adrval:MAXOFF);
  86. break;
  87. case 'm':
  88. printmap("? map", symmap);
  89. printmap("/ map", cormap);
  90. break;
  91. case 0:
  92. case '?':
  93. if (pid)
  94. dprint("pid = %d\n",pid);
  95. else
  96. prints("no process\n");
  97. flushbuf();
  98. case 'r':
  99. case 'R':
  100. printregs(modif);
  101. return;
  102. case 'f':
  103. case 'F':
  104. printfp(cormap, modif);
  105. return;
  106. case 'c':
  107. case 'C':
  108. tracetype = modif;
  109. if (machdata->ctrace) {
  110. if (adrflg) { /* trace from jmpbuf for multi-threaded code */
  111. if (get4(cormap, adrval, (long*)&sp) < 0 ||
  112. get4(cormap, adrval+4, (long*)&pc) < 0)
  113. error("%r");
  114. } else {
  115. sp = rget(cormap, mach->sp);
  116. pc = rget(cormap, mach->pc);
  117. }
  118. if(mach->link)
  119. link = rget(cormap, mach->link);
  120. else
  121. link = 0;
  122. if (machdata->ctrace(cormap, pc, sp, link, ptrace) <= 0)
  123. error("no stack frame");
  124. }
  125. break;
  126. /*print externals*/
  127. case 'e':
  128. for (i = 0; globalsym(&s, i); i++) {
  129. if (get4(cormap, s.value, &v) > 0)
  130. dprint("%s/%12t%#lux\n", s.name, v);
  131. }
  132. break;
  133. /*print breakpoints*/
  134. case 'b':
  135. case 'B':
  136. for (bk=bkpthead; bk; bk=bk->nxtbkpt)
  137. if (bk->flag) {
  138. symoff(buf, 512, (WORD)bk->loc, CTEXT);
  139. dprint(buf);
  140. if (bk->count != 1)
  141. dprint(",%d", bk->count);
  142. dprint(":%c %s", bk->flag == BKPTTMP ? 'B' : 'b', bk->comm);
  143. }
  144. break;
  145. case 'M':
  146. fname = getfname();
  147. if (machbyname(fname) == 0)
  148. dprint("unknown name\n");;
  149. break;
  150. default:
  151. error("bad `$' command");
  152. }
  153. }
  154. char *
  155. getfname(void)
  156. {
  157. static char fname[ARB];
  158. char *p;
  159. if (rdc() == EOR) {
  160. reread();
  161. return (0);
  162. }
  163. p = fname;
  164. do {
  165. *p++ = lastc;
  166. if (p >= &fname[ARB-1])
  167. error("filename too long");
  168. } while (rdc() != EOR);
  169. *p = 0;
  170. reread();
  171. return (fname);
  172. }
  173. static void
  174. printfp(Map *map, int modif)
  175. {
  176. Reglist *rp;
  177. int i;
  178. int ret;
  179. char buf[512];
  180. for (i = 0, rp = mach->reglist; rp->rname; rp += ret) {
  181. ret = 1;
  182. if (!(rp->rflags&RFLT))
  183. continue;
  184. ret = fpformat(map, rp, buf, sizeof(buf), modif);
  185. if (ret < 0) {
  186. werrstr("Register %s: %r", rp->rname);
  187. error("%r");
  188. }
  189. /* double column print */
  190. if (i&0x01)
  191. dprint("%40t%-8s%-12s\n", rp->rname, buf);
  192. else
  193. dprint("\t%-8s%-12s", rp->rname, buf);
  194. i++;
  195. }
  196. }
  197. void
  198. redirin(int stack, char *file)
  199. {
  200. char pfile[ARB];
  201. if (file == 0) {
  202. iclose(-1, 0);
  203. return;
  204. }
  205. iclose(stack, 0);
  206. if ((infile = open(file, 0)) < 0) {
  207. strcpy(pfile, Ipath);
  208. strcat(pfile, "/");
  209. strcat(pfile, file);
  210. if ((infile = open(pfile, 0)) < 0) {
  211. infile = STDIN;
  212. error("cannot open");
  213. }
  214. }
  215. }
  216. void
  217. printmap(char *s, Map *map)
  218. {
  219. int i;
  220. if (!map)
  221. return;
  222. if (map == symmap)
  223. dprint("%s%12t`%s'\n", s, fsym < 0 ? "-" : symfil);
  224. else if (map == cormap)
  225. dprint("%s%12t`%s'\n", s, fcor < 0 ? "-" : corfil);
  226. else
  227. dprint("%s\n", s);
  228. for (i = 0; i < map->nsegs; i++) {
  229. if (map->seg[i].inuse)
  230. dprint("%s%8t%-16#lux %-16#lux %-16#lux\n", map->seg[i].name,
  231. map->seg[i].b, map->seg[i].e, map->seg[i].f);
  232. }
  233. }
  234. /*
  235. * dump the raw symbol table
  236. */
  237. void
  238. printsym(void)
  239. {
  240. int i;
  241. Sym *sp;
  242. for (i = 0; sp = getsym(i); i++) {
  243. switch(sp->type) {
  244. case 't':
  245. case 'l':
  246. dprint("%8#lux t %s\n", sp->value, sp->name);
  247. break;
  248. case 'T':
  249. case 'L':
  250. dprint("%8#lux T %s\n", sp->value, sp->name);
  251. break;
  252. case 'D':
  253. case 'd':
  254. case 'B':
  255. case 'b':
  256. case 'a':
  257. case 'p':
  258. case 'm':
  259. dprint("%8#lux %c %s\n", sp->value, sp->type, sp->name);
  260. break;
  261. default:
  262. break;
  263. }
  264. }
  265. }
  266. #define STRINGSZ 128
  267. /*
  268. * print the value of dot as file:line
  269. */
  270. void
  271. printsource(long dot)
  272. {
  273. char str[STRINGSZ];
  274. if (fileline(str, STRINGSZ, dot))
  275. dprint("%s", str);
  276. }
  277. void
  278. printpc(void)
  279. {
  280. char buf[512];
  281. dot = (ulong)rget(cormap, mach->pc);
  282. if(dot){
  283. printsource((long)dot);
  284. printc(' ');
  285. symoff(buf, sizeof(buf), (long)dot, CTEXT);
  286. dprint("%s/", buf);
  287. if (machdata->das(cormap, dot, 'i', buf, sizeof(buf)) < 0)
  288. error("%r");
  289. dprint("%16t%s\n", buf);
  290. }
  291. }
  292. void
  293. printlocals(Symbol *fn, ADDR fp)
  294. {
  295. int i;
  296. long val;
  297. Symbol s;
  298. s = *fn;
  299. for (i = 0; localsym(&s, i); i++) {
  300. if (s.class != CAUTO)
  301. continue;
  302. if (get4(cormap, fp-s.value, &val) > 0)
  303. dprint("%8t%s.%s/%10t%#lux\n", fn->name, s.name, val);
  304. else
  305. dprint("%8t%s.%s/%10t?\n", fn->name, s.name);
  306. }
  307. }
  308. void
  309. printparams(Symbol *fn, ADDR fp)
  310. {
  311. int i;
  312. Symbol s;
  313. long v;
  314. int first = 0;
  315. fp += mach->szaddr; /* skip saved pc */
  316. s = *fn;
  317. for (i = 0; localsym(&s, i); i++) {
  318. if (s.class != CPARAM)
  319. continue;
  320. if (first++)
  321. dprint(", ");
  322. if (get4(cormap, fp+s.value, &v) > 0)
  323. dprint("%s=%lux", s.name, v);
  324. }
  325. }