📄 mal_debugger.c
字号:
memory.uordblks ); } if (strncmp("timer", b, 1) == 0) { cntxt->flags |= timerFlag; cntxt->timer = GDKusec(); stk->cmd = 0; } if (strncmp("io", b, 1) == 0) {#ifdef HAVE_SYS_RESOURCE_H struct rusage resource; #endif cntxt->flags |=ioFlag ;#ifdef HAVE_SYS_RESOURCE_H getrusage(RUSAGE_SELF, &resource); stream_printf(out, "#maxrss %d ixrss=%d idrss=%d isrss=%d" " minflt=%d majflt=%d nswap=%d inblock=%d oublock=%d\n", resource.ru_maxrss, resource.ru_ixrss, resource.ru_idrss, resource.ru_isrss, resource.ru_minflt, resource.ru_majflt, resource.ru_nswap, resource.ru_inblock, resource.ru_oublock);#endif } continue; } stk->cmd = *b; m = 0; break; case 'm': /* display a module */ { str modname, fcnname; Module fsym; Symbol fs; int i; skipWord(cntxt, b); skipBlanc(cntxt,b); if (*b) { modname = b; fcnname = strchr(b, '.'); if (fcnname) { *fcnname = 0; fcnname++; } fsym = findModule(cntxt->nspace, putName(modname, strlen(modname))); if (fsym == cntxt->nspace && strcmp(modname,"user") ) { stream_printf(out, "module '%s' not found\n", modname); continue; } for (i = 0; i < MAXSCOPE; i++) { fs = fsym->subscope[i]; while (fs != NULL) { if (fcnname == NULL) printSignature(out, fs, 0); else if (strcmp(fcnname, getFcnName(fs->def)) == 0) printSignature(out, fs, 0); fs = fs->peer; } } continue; } else showModules(out, cntxt->nspace); } break; case 'T': /* debug type resolver for a function call */ if (strncmp("Trace", b, 5) == 0) { char *w; skipWord(cntxt, b); skipBlanc(cntxt, b); if ( (w =strchr(b, '\n')) ) *w = 0; traceFcnName = GDKstrdup(b); } break; case 't': /* trace a variable toggle */ if (strncmp("trace", b, 5) == 0) { char *w; skipWord(cntxt, b); skipBlanc(cntxt, b); if ( (w= strchr(b, '\n')) ) *w = 0; mdbSetBreakRequest(cntxt, mb, b, 't'); } break; case 'v': /* show the symbol table and bindings */ case 'V':{ str modname, fcnname; Module fsym; Symbol fs; int i, lifespan = *b== 'V'; skipWord(cntxt, b); if (*b != 0) { modname = b; fcnname = strchr(b, '.'); if (fcnname == NULL) { fsym = findModule(cntxt->nspace, putName(modname, strlen(modname))); if (fsym == 0) { stream_printf(out, "%s module not found\n", modname); continue; } for (i = 0; i < MAXSCOPE; i++) { fs = fsym->subscope[i]; while (fs != NULL) { printStack(out, fs->def, 0, lifespan); fs = fs->peer; } } continue; } *fcnname = 0; fcnname++; fsym = findModule(cntxt->nspace, putName(modname, strlen(modname))); if (fsym == 0) { stream_printf(out, "%s module not found\n", modname); continue; } /* display the overloaded symbol definition */ for (i = 0; i < MAXSCOPE; i++) { fs = fsym->subscope[i]; while (fs != NULL) { if (strcmp(fs->name, fcnname) == 0) printStack(out, fs->def, 0,lifespan); fs = fs->peer; } } } else printStack(out, mb, stk,lifespan); break; } case 'b': if (strncmp(b, "bbp",3) == 0) { int i,limit; skipWord(cntxt, b); i = BBPindex(b); if( i) limit=i+1; else { limit= BBPsize; i=1; } /* the 'dense' qualification only shows entries with a hard ref */ for (; i < limit; i++) if (BBP_logical(i) && BBP_cache(i) ) { if( *b=='d' && BBP_refs(i)==0) continue; stream_printf(out, "[%d] %s lref = %d ref= %d ", i, BBP_logical(i), BBP_lrefs(i), BBP_refs(i)); stream_printf(out, " dirty=%d", BATdirty(BBP_cache(i))); if( *BBP_logical(i) =='.') stream_printf(out, " zombie "); if( BBPstatus(i) & BBPLOADED) stream_printf(out, " loaded "); if( BBPstatus(i) & BBPSWAPPED) stream_printf(out, " swapped "); if( BBPstatus(i) & BBPTMP) stream_printf(out, " tmp "); if( BBPstatus(i) & BBPDELETED) stream_printf(out, " deleted "); if( BBPstatus(i) & BBPEXISTING) stream_printf(out, " existing "); if( BBPstatus(i) & BBPNEW) stream_printf(out, " new "); if( BBPstatus(i) & BBPPERSISTENT) stream_printf(out, " persistent "); stream_printf(out, "\n"); } continue; } if (strncmp(b, "breakpoints",11) == 0) { mdbShowBreakpoints(cntxt); continue; } if (strncmp(b, "break", 5) == 0) b += 4; if (isspace((int) b[1])) { skipWord(cntxt, b); if (*b && !isspace((int) *b)) /* set breakpoints by name */ mdbSetBreakRequest(cntxt, mb, b, 's'); else /* set breakpoint at current instruction */ mdbSetBreakpoint(cntxt, mb, pc, 's'); continue; } continue; case 'd': if( strncmp(b, "debug", 5) == 0){ skipWord(cntxt, b); GDKdebug = atol(b); stream_printf(out,"Set debug mask to %d\n",GDKdebug); break; } if (strncmp(b, "down", 2) == 0 && stk->down != NULL) { stream_printf(out, "%sgo down the stack\n", "#mdb "); stk = stk->down; mb = stk->blk; break; } if( strncmp(b, "dot", 3) == 0){ /* produce the dot file for graphical display */ /* its argument is the optimizer level followed by filename*/ MalBlkPtr mdot; char fname[2*PATHLENGTH]=""; char name[PATHLENGTH]; skipWord(cntxt, b); skipBlanc(cntxt, b); mdot= mdbLocateMalBlk(mb,b,out); if( mdot == NULL) mdot= mb; /* optional file */ snprintf(name,PATHLENGTH,"/%s-%s.dot", getModuleId(getInstrPtr(mdot,0)), getFunctionId(getInstrPtr(mdot,0))); if( *b == 0){ strcat(fname,name+1); } else if( cntxt->cwd && *b !='/'){ strcpy(fname,cntxt->cwd); strcat(fname,name); } else strcat(fname,name+1); stream_printf(out,"#dot to %s\n",fname); showFlowGraph(mdot,0,fname); break; } skipWord(cntxt, b); /* get rid of break point */ if (*b && !isspace((int) *b)) { mdbClrBreakRequest(cntxt, b); } else { mdbClrBreakpoint(cntxt, pc); } continue; case 'I': case 'i': { int i; char *t; /* the user wants information about variables */ if( *b == 'I'){ skipWord(cntxt, b); for(i=0; i< mb->vtop; i++) printBatProperties(out, getVar(mb, i), stk->stk + i, b); continue; } skipWord(cntxt, b); t = b; skipNonBlanc(cntxt, t); *t = 0; /* search the symbol */ i = findVariable(mb, b); if (i < 0) { stream_printf(out, "%s Symbol not found\n", "#mdb "); } else { printBatInfo(out, getVar(mb, i), stk->stk + i); } continue; } case 'P': case 'p': { size_t size = 0, first = 0; int i; char *t; char upper= *b; skipWord(cntxt, b); t = b; skipNonBlanc(cntxt, t); *t = 0; /* you can identify a start and length */ t++; skipBlanc(cntxt, t); if (isdigit((int) *t)) { size = atol(t); skipWord(cntxt, t); if (isdigit((int) *t)) first = atol(t); } if( upper == 'P'){ for( i= 0; i<mb->vtop; i++) if (isaBatType(getVarType(mb,i)) ) printBATelm(out, i, size, first); continue; } /* search the symbol */ i = findVariable(mb, b); if (i < 0) { i = BBPindex(b); if (i != 0) printBATelm(out, i, size, first); else stream_printf(out, "%s Symbol not found\n", "#mdb "); continue; } printStackElm(out, mb, getVar(mb, i), stk->stk + i, i, size, first,0); continue; } case 'S': dumpNamespaceStatistics(out, 1); break; case 'u': if( strncmp("unset",b,5)){ skipWord(cntxt, b); skipBlanc(cntxt, b); if( strncmp("flow",b,1) == 0) cntxt->flags &= ~flowFlag; if( strncmp("memory",b,1) == 0) cntxt->flags &= ~memoryFlag; if (strncmp("timer", b, 1) == 0) cntxt->flags &= ~timerFlag; if (strncmp("io", b, 1) == 0) cntxt->flags &= ~ioFlag; continue; } if (stk->up == NULL) break; stream_printf(out, "%s go up the stack\n", "#mdb "); stk = stk->up; mb = stk->blk; printCall(cntxt, mb, stk, pc); continue; case 'w': { MalStkPtr w; MalBlkPtr mw = mb; int pci = pc; /* how to find enclosing pc */ for (w = stk; w != NULL; w = w->up) { mw = w->blk; printCall(cntxt, mw, w, pci); if (w->up) pci = w->up->pcup; } continue; }#line 1258 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_debugger.mx" case 'L': case 'l': /* list the current MAL block or module */ { Module fsym; Symbol fs; int i, lstng; lstng= (*b == 'L' ? LIST_MAL_ALL : LIST_MAL_INSTR | LIST_MAL_PROPS); skipWord(cntxt, b); if (*b != 0) { MalBlkPtr m= mdbLocateMalBlk(mb,b,out); if( m == NULL && !strchr(b,'.') && !strchr(b,'[') && !isdigit((int)*b)){ /* optionally dump the complete module */ fsym = findModule(cntxt->nspace, putName(b, strlen(b))); if (fsym == 0) { stream_printf(out, "'%s' not found\n", b); continue; } for (i = 0; i < MAXSCOPE; i++) { fs = fsym->subscope[i]; while (fs != NULL) { printFunction(out, fs->def, lstng); fs = fs->peer; } } continue; } printFunction(out, m, lstng); } else printFunction(out, mb, lstng); continue; } case 'o': case 'O': /* optimizer steps */ { MalBlkPtr mdot=mb; skipWord(cntxt, b); skipBlanc(cntxt, b); if (*b) { mdot=mdbLocateMalBlk(mb,b,out); if(mdot != NULL) showMalBlkHistory(mdot); } else showMalBlkHistory(mb); break; } case 'r': /* reset program counter */ stream_printf(out, "%s restart with current stack\n", "#mdb "); stk->cmd = 'r'; break; default: stream_printf(out, "%s debugger command expected\n", "#mdb "); mdbHelp(out); } } while (m); cntxt->prompt = oldprompt; cntxt->promptlength = oldpromptlength;}static int mdbSessionActive;int mdbSession(){ return mdbSessionActive;}#line 1328 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_debugger.mx"voidmdbSanityCheck(Client cntxt, MalBlkPtr mb, MalStkPtr stk, int pc){ int i; VarPtr n; ValPtr v; str nme,nmeOnStk; (void) stk; (void) pc; (void) mb; for (i=1; i < mb->vtop; i++){ n= getVar(mb,i); v= stk->stk+i; if (isaBatType(n->type) && v->val.ival) { BAT *b; b = BATdescriptor(v->val.ival); if (b) { nme = getTypeName(n->type); nmeOnStk = getTypeName(newBatType(b->htype, b->ttype)); if (strcmp(nme, nmeOnStk)) { printTraceCall(cntxt,mb,stk,pc); stream_printf(cntxt->fdout, "!ERROR: %s != :%s\n", nme, nmeOnStk); stk->cmd='n'; } BBPunfix(b->batCacheid); GDKfree(nme); } } }}voidmdbStep(Client cntxt, MalBlkPtr mb, MalStkPtr stk, int pc)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -