📄 mal_debugger.c
字号:
#line 456 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_debugger.mx"#include "mal_config.h"#include "mal_readline.h"#include "mal_debugger.h"#include "mal_atom.h" /* for showAtoms() */#include "mal_interpreter.h" /* for getArgReference() */#include "mal_linker.h" /* for getAddress() */#include "mal_module.h" /* for showModuleStatistics() */#include "mal_parser.h"#include "mal_namespace.h"int MDBdelay; /* do not immediately react */#define skipBlanc(c,X) while(*(X) && isspace((int)*X)){ X++; }#define skipNonBlanc(c,X) while(*(X) && !isspace((int) *X)){ X++; }#define skipWord(c,X) skipNonBlanc(c,X); skipBlanc(c,X);#line 477 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_debugger.mx"mdbStateRecord mdbTable[MAL_MAXCLIENTS];charisBreakpoint(Client cntxt, MalBlkPtr mb, InstrPtr p, int pc){ int i, j; for (i = 0; i < mdbTable[cntxt->idx].brkTop; i++) { if( mdbTable[cntxt->idx].brkBlock[i] != mb) continue; if( mdbTable[cntxt->idx].brkPc[i] == pc ) return mdbTable[cntxt->idx].brkCmd[i]; if( mdbTable[cntxt->idx].brkMod[i] && getModuleId(p) && mdbTable[cntxt->idx].brkFcn[i] && getFunctionId(p) && strcmp(mdbTable[cntxt->idx].brkMod[i], getModuleId(p))==0 && strcmp(mdbTable[cntxt->idx].brkFcn[i], getFunctionId(p))==0) return mdbTable[cntxt->idx].brkCmd[i]; if( mdbTable[cntxt->idx].brkVar[i] >= 0 ) for (j = 0; j < p->retc; j++) if (mdbTable[cntxt->idx].brkVar[i] == getArg(p,j)) return mdbTable[cntxt->idx].brkCmd[i]; } return 0;}#line 508 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_debugger.mx"voidmdbSetBreakRequest(Client cntxt, MalBlkPtr mb, str request, char cmd){ int i; str modnme, fcnnme; mdbState mdb = mdbTable + cntxt->idx; Symbol sym; /* set breakpoint on specific line */ if( *request == '#' ){ i= atoi(request+1); if( i<0 || i>= mb->stop) stream_printf(cntxt->fdout, "breakpoint on #%d (<%d) not set\n", i, mb->stop); else { mdb->brkBlock[mdb->brkTop] = mb; mdb->brkPc[mdb->brkTop] = i; mdb->brkVar[mdb->brkTop] = -1; mdb->brkMod[mdb->brkTop] = 0; mdb->brkFcn[mdb->brkTop] = 0; mdb->brkRequest[mdb->brkTop] = GDKstrdup(request); mdb->brkCmd[mdb->brkTop] = cmd; if (mdb->brkTop + 1 < MAXBREAKS) mdb->brkTop++; } return; } /* check for a [module.]function request */ fcnnme= strchr(request,'.'); if( fcnnme){ modnme= request; *fcnnme= 0; fcnnme++; sym= findMALSymbol(modnme,fcnnme); mdb->brkBlock[mdb->brkTop] = sym? sym->def: mb; mdb->brkPc[mdb->brkTop] = -1; mdb->brkVar[mdb->brkTop] = -1; mdb->brkMod[mdb->brkTop] = putName(modnme,strlen(modnme)); mdb->brkFcn[mdb->brkTop] = putName(fcnnme,strlen(fcnnme)); fcnnme--; *fcnnme= '.'; mdb->brkRequest[mdb->brkTop] = GDKstrdup(request); mdb->brkCmd[mdb->brkTop] = cmd; if (mdb->brkTop + 1 < MAXBREAKS) mdb->brkTop++; return; } /* the final step is to break on a variable */ i= findVariable(mb,request); if( i< 0) stream_printf(cntxt->fdout, "breakpoint on %s not set\n", request); else { mdb->brkBlock[mdb->brkTop] = mb; mdb->brkPc[mdb->brkTop] = -1; mdb->brkVar[mdb->brkTop] = i; mdb->brkMod[mdb->brkTop] = 0; mdb->brkFcn[mdb->brkTop] = 0; mdb->brkRequest[mdb->brkTop] = GDKstrdup(request); mdb->brkCmd[mdb->brkTop] = cmd; if (mdb->brkTop + 1 < MAXBREAKS) mdb->brkTop++; }}#line 575 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_debugger.mx"voidmdbSetBreakpoint(Client cntxt, MalBlkPtr mb, int pc, char cmd){ mdbState mdb = mdbTable + cntxt->idx; char buf[20]; snprintf(buf,20,"#%d",pc); mdb->brkBlock[mdb->brkTop] = mb; mdb->brkPc[mdb->brkTop] = pc; mdb->brkVar[mdb->brkTop] = -1; mdb->brkMod[mdb->brkTop] = 0; mdb->brkFcn[mdb->brkTop] = 0; mdb->brkRequest[mdb->brkTop] = GDKstrdup(buf); mdb->brkCmd[mdb->brkTop] = cmd; if (mdb->brkTop + 1 < MAXBREAKS) mdb->brkTop++;}voidmdbShowBreakpoints(Client cntxt){ int i; mdbState mdb = mdbTable + cntxt->idx; for (i = 0; i < mdb->brkTop; i++) stream_printf(cntxt->fdout, "breakpoint on '%s'\n", mdb->brkRequest[i]);}voidmdbClrBreakpoint(Client cntxt, int pc){ int i, j = 0; mdbState mdb = mdbTable + cntxt->idx; for (i = 0; i < mdb->brkTop; i++) { mdb->brkBlock[j] = mdb->brkBlock[i]; mdb->brkPc[j] = mdb->brkPc[i]; mdb->brkVar[j] = mdb->brkVar[i]; mdb->brkMod[j] = mdb->brkMod[i]; mdb->brkFcn[j] = mdb->brkFcn[i]; mdb->brkRequest[j] = mdb->brkRequest[i]; mdb->brkCmd[j] = mdb->brkCmd[i]; if (mdb->brkPc[i] != pc) j++; else { GDKfree(mdb->brkRequest[i]); mdb->brkRequest[i] = 0; } } mdb->brkTop = j;}voidmdbClrBreakRequest(Client cntxt, str request){ int i, j = 0; mdbState mdb = mdbTable + cntxt->idx; for (i=0; i < mdb->brkTop; i++) { mdb->brkBlock[j] = mdb->brkBlock[i]; mdb->brkPc[j] = mdb->brkPc[i]; mdb->brkVar[j] = mdb->brkVar[i]; mdb->brkMod[j] = mdb->brkMod[i]; mdb->brkFcn[j] = mdb->brkFcn[i]; mdb->brkRequest[j] = mdb->brkRequest[i]; mdb->brkCmd[j] = mdb->brkCmd[i]; if (strcmp(mdb->brkRequest[i], request)) j++; else { GDKfree(mdb->brkRequest[i]); mdb->brkRequest[i] = 0; } } mdb->brkTop = j;}#line 657 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_debugger.mx"strcall2str(Client cntxt, MalBlkPtr mb, MalStkPtr stk, int pc){ int k,len; str msg,w; str s; InstrPtr p; p= getInstrPtr(mb,pc); msg = instruction2str(mb, p, FALSE); s = strchr(msg, '('); if (p->retc > 1 && s) { s = strchr(s + 1, '('); } if (s) { s++; *s = 0; len = strlen(msg); for (k = p->retc; k < p->argc; k++) { VarPtr v = getVar(mb, getArg(p, k)); ValPtr val = &stk->stk[getArg(p, k)]; if (v->tmpindex == 0) sprintf(msg+len, "%s=", v->name); else sprintf(msg+len, "%c%d=", TMPMARKER, v->tmpindex); w = 0; ATOMformat(val->vtype, VALptr(val), &w); strcat(msg,w); if( ATOMcmp(val->vtype, ATOMnilptr(val->vtype), VALptr(val))==0){ str tpe= getTypeName(v->type); strcat(msg,":"); strcat(msg,tpe); GDKfree(tpe); } /* in performance monitoring mode we show more details */ if( cntxt->flags && isaBatType(v->type)){ str tpe= getTypeName(v->type); BAT *b; strcat(msg,tpe); b= BATdescriptor(val->val.ival); if( b){ len= strlen(msg); sprintf(msg+len,"{%d}",(int)BATcount(b)); BBPunfix(b->batCacheid); } GDKfree(tpe); } GDKfree(w); if (k < p->argc - 1) strcat(msg,", "); len= strlen(msg); } strcat(msg,")"); } return msg;}voidprintCall(Client cntxt, MalBlkPtr mb, MalStkPtr stk, int pc){ str msg; msg = call2str(cntxt,mb, stk, pc); stream_printf(cntxt->fdout, "%s at %s.%s[%d]\n", msg, getModuleId(getInstrPtr(mb,0)), getFunctionId(getInstrPtr(mb,0)),pc); GDKfree(msg);}#line 730 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_debugger.mx"voidprintTraceCall(Client cntxt, MalBlkPtr mb, MalStkPtr stk, int pc){ str msg; msg= call2str(cntxt,mb,stk,pc); stream_printf(cntxt->fdout, "%s\n", msg); GDKfree(msg);}#line 747 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/mal/mal_debugger.mx"#define MDBstatus(X) if(cntxt->fdout) \ stream_printf(cntxt->fdout,"#MonetDB Debugger %s\n", (X?"on":"off"));static MalBlkPtrmdbLocateMalBlk(MalBlkPtr mb, str b, stream *out){ MalBlkPtr m=mb; char *h=0; int idx=0; if( *b == '['){ idx= atoi(b+1); return getMalBlkHistory(mb,idx); } else if( isdigit((int) *b)){ return getMalBlkHistory(mb,atoi(b)); } else if (*b != 0) { char *fcnname = strchr(b, '.'); Symbol fsym; if (fcnname == NULL ) { stream_printf(out, "<mod>.<fcn>[<nr>] expected\n", b); return NULL; } *fcnname = 0; fcnname++; if( (h= strchr(fcnname,'[')) ){ *h=0; idx= atoi(h+1); } fsym= findMALSymbol(b,fcnname); if (fsym == 0) { stream_printf(out, "'%s.%s' not found\n", b,fcnname); return NULL; } m= fsym->def; } if( m->history== NULL){ stream_printf(out,"No history available\n"); return NULL; } return m;}voidmdbCommand(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p, int pc){ int m = 1; char *b, *c; stream *out = cntxt->fdout; /* int listing = cntxt->listing;*/ char *oldprompt = cntxt->prompt; int oldpromptlength = cntxt->promptlength; if (p != NULL) { if (cntxt != mal_clients) /* help MapiClients with fake prompt */ stream_printf(out,"mdb>"); printTraceCall(cntxt,mb,stk,pc); } if (cntxt == mal_clients) { cntxt->prompt = "mdb>"; cntxt->promptlength = 4; } do { if (cntxt->phase[READER]) { if ((*cntxt->phase[READER]) (cntxt)) { break; } } else if (readConsole(cntxt) <= 0) { break; } b = CURRENT(cntxt); /* terminate the line with zero */ c = strchr(b, '\n'); if (c) { *c = 0; cntxt->fdin->pos += (c - b) + 1; } else { cntxt->fdin->pos = cntxt->fdin->len; } skipBlanc(cntxt, b); switch (*b) { case 0: m = 0; break; case 'a': if (strncmp("atom", b, 1) == 0) showAtoms(out); break; case 'c': if (strncmp("catch", b, 3) == 0) { /* catch the next exception */ stk->cmd = 'C'; break; } if (strncmp("call", b, 3) == 0) { showException(MAL,"mdb.command", "call instruction not yet implemented"); break; } stk->cmd = 'c'; skipWord(cntxt, b); m = 0; break; case 'h': if (strncmp("help", b, 2) == 0) mdbHelp(out); break; case 'e': { /* terminate the execution for ordinary functions only */ if (strncmp("exit", b, 4) == 0) { case 'x': if (!(getInstrPtr(mb, 0)->token == FACcall)) { stk->cmd = 'x'; cntxt->prompt = oldprompt; cntxt->promptlength = oldpromptlength; } } return; } case 'q': { MalStkPtr su; /* return from this debugger */ for (su = stk; su; su = su->up) su->cmd = 0; cntxt->itrace = 0; cntxt->flags = 0; /* MDBstatus(0); */ cntxt->prompt = oldprompt; cntxt->promptlength = oldpromptlength; return; } case 'f': /* finish */ case 'n': /* next */ case 's': /* step */ if (strncmp("scenarios", b, 9) == 0) { showAllScenarios(out); continue; } else if (strncmp("scenario", b, 3) == 0) { showScenarioByName(out, cntxt->scenario); continue; } else if (strncmp("scope", b, 3) == 0) { /* used to inspect the identifier distribution */ showModuleStatistics(out, cntxt->nspace); continue; } else if (strncmp("set", b, 3) == 0) { skipWord(cntxt, b); skipBlanc(cntxt, b); if( strncmp("flow",b,1) == 0) cntxt->flags |= flowFlag; if( strncmp("memory",b,1) == 0){ struct mallinfo memory; cntxt->flags |= memoryFlag; memory = MT_mallinfo(); stream_printf(out,"arena %d ordblks %d smblks %d " " hblkhd %d hblks %d fsmblks %d uordblks %d\n", memory.arena, memory.ordblks, memory.smblks, memory.hblkhd, memory.hblks, memory.fsmblks,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -