📄 mdb.mx
字号:
strMDBsetMemory(int *ret, bit *flag){ Client cntxt = MCgetClient(); (void) ret; if( *flag) cntxt->flags |= memoryFlag; else cntxt->flags &= ~memoryFlag; return MAL_SUCCEED;}strMDBsetIO(int *ret, bit *flag){ Client cntxt = MCgetClient(); (void) ret; if( *flag) cntxt->flags |= ioFlag; else cntxt->flags &= ~ioFlag; return MAL_SUCCEED;}strMDBinspect(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ str modnme; str fcnnme; Module scope = NULL; Symbol s = NULL; Client c = MCgetClient(); if (stk != 0) { modnme = (str) getArgValue(stk, p, 1); fcnnme = (str) getArgValue(stk, p, 2); } else { modnme = getArgDefault(mb, p, 1); fcnnme = getArgDefault(mb, p, 2); } scope = findModule(c->nspace, putName(modnme, strlen(modnme))); if (scope) s = findSymbolInModule(scope, putName(fcnnme, strlen(fcnnme))); if (s == NULL) throw(MAL, "mdb.inspect", "Could not find function"); return runMALDebugger(s);}@+ Variables and stack informationThe variable information can be turned into a BAT for inspection as well.@cstatic intgetStkDepth(MalStkPtr s){ int i = 0; while (s != 0) { i++; s = s->up; } return i;}strMDBStkDepth(MalBlkPtr mb, MalStkPtr s, InstrPtr p){ int *ret = (int *) getArgReference(s, p, 0); (void) mb; /* fool compiler */ *ret = getStkDepth(s); return MAL_SUCCEED;}strMDBgetFrame(BAT *b, MalBlkPtr mb, MalStkPtr s, int depth){ ValPtr v; int i; char *buf = 0; if (depth > 0) return MDBgetFrame(b, mb, s->up, depth - 1); if (s != 0) for (i = 0; i < s->stktop; i++, v++) { v = &s->stk[i]; ATOMformat(v->vtype, VALget(v), &buf); BUNins(b, getVarName(mb, i), buf, FALSE); } return MAL_SUCCEED;}strMDBgetStackFrame(MalBlkPtr m, MalStkPtr s, InstrPtr p){ int *ret = (int *) getArgReference(s, p, 0); BAT *b = BATnew(TYPE_str, TYPE_str, 256); if (b == 0) throw(MAL, "mdb.getStackFrame", "Failed to create BAT"); @:Pseudo(view,stk,frame)@ return MDBgetFrame(b, m, s, 0);}strMDBgetStackFrameN(MalBlkPtr m, MalStkPtr s, InstrPtr p){ int n, *ret = (int *) getArgReference(s, p, 0); BAT *b = BATnew(TYPE_str, TYPE_str, 256); n = *(int *) getArgReference(s, p, 1); if (n < 0 || n >= getStkDepth(s)) throw(MAL, "mdb.getStackFrame", "Illegal depth."); @:Pseudo(view,stk,frame)@ return MDBgetFrame(b, m, s, n);}strMDBStkTrace(MalBlkPtr m, MalStkPtr s, InstrPtr p){ BAT *b = BATnew(TYPE_int, TYPE_str, 256); str msg; char buf[8192]; int *ret = (int *) getArgReference(s, p, 0); int k = 0,pc; msg = call2str(MCgetClient(),s->blk, s, pc=getPC(m, p)); snprintf(buf,8192,"%s at %s.%s[%d]", msg+5, getModuleId(getInstrPtr(m,0)), getFunctionId(getInstrPtr(m,0)), pc); BUNins(b, &k, buf, FALSE); GDKfree(msg); for (s = s->up, k++; s != NULL; s = s->up, k++) { msg = call2str(MCgetClient(),s->blk, s, s->pcup); snprintf(buf,8192,"%s at %s.%s[%d]", msg+5, getModuleId(getInstrPtr(s->blk,0)), getFunctionId(getInstrPtr(s->blk,0)), s->pcup); BUNins(b, &k, buf, FALSE); GDKfree(msg); } if (!(b->batDirty&2)) b = BATsetaccess(b, BAT_READ); @:Pseudo(view,stk,trace)@ return MAL_SUCCEED;}@+ Display routines@cstrMDBlist(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ Client c = MCgetClient(); (void) p; (void) stk; printFunction(c->fdout, mb, LIST_MAL_INSTR | LIST_MAL_PROPS); return MAL_SUCCEED;}strMDBlist3(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ str modnme = (str) getArgValue(stk, p, 1); str fcnnme = (str) getArgValue(stk, p, 2); Symbol s = NULL; Client c = MCgetClient(); s = findMALSymbol(putName(modnme, strlen(modnme)), putName(fcnnme, strlen(fcnnme))); if (s == NULL) showException(MAL,"mdb.list","Could not find %s.%s", modnme, fcnnme); else printFunction(c->fdout, s->def, LIST_MAL_INSTR | LIST_MAL_PROPS); (void) mb; /* fool compiler */ return NULL;}strMDBlistDetail(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ Client c = MCgetClient(); (void) p; (void) stk; printFunction(c->fdout, mb, LIST_MAL_ALL); return MAL_SUCCEED;}strMDBlist3Detail(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ str modnme = (str) getArgValue(stk, p, 1); str fcnnme = (str) getArgValue(stk, p, 2); Symbol s = NULL; Client c = MCgetClient(); s = findMALSymbol(putName(modnme, strlen(modnme)), putName(fcnnme, strlen(fcnnme))); if (s == NULL) showException(MAL,"mdb.list","Could not find %s.%s", modnme, fcnnme); else printFunction(c->fdout, s->def, LIST_MAL_ALL); (void) mb; /* fool compiler */ return NULL;}strMDBvar(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ Client c = MCgetClient(); (void) p; (void) stk; printStack(c->fdout, mb, stk,0); return MAL_SUCCEED;}strMDBvar3(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ str modnme = (str) getArgValue(stk, p, 1); str fcnnme = (str) getArgValue(stk, p, 2); Symbol s = NULL; Client c = MCgetClient(); s = findMALSymbol(putName(modnme, strlen(modnme)), putName(fcnnme, strlen(fcnnme))); if (s == NULL) showException(MAL,"mdb.var","Could not find %s.%s", modnme, fcnnme); else printStack(c->fdout, s->def, (s->def == mb ? stk : 0),0); (void) mb; return NULL;}@-It is illustrative to dump the code when youhave encountered an error.@cstrMDBgetDefinition(MalBlkPtr m, MalStkPtr stk, InstrPtr p){ int i, *ret = (int *) getArgReference(stk, p, 0); str ps; BAT *b = BATnew(TYPE_int, TYPE_str, 256); if (b == 0) throw(MAL, "mdb.getDefinition", "Failed to create BAT"); for (i = 0; i < m->stop; i++) { ps = instruction2str(m, getInstrPtr(m, i), 1); BUNins(b, &i, ps, FALSE); GDKfree(ps); } if (!(b->batDirty&2)) b = BATsetaccess(b, BAT_READ); @:Pseudo(view,fcn,stmt)@ return MAL_SUCCEED;}strMDBgetExceptionVariable(str *ret, str *msg){ str tail; tail = strchr(*msg, ':'); if (tail == 0) throw(MAL, "mdb.getExceptionVariable", "Could not find it"); *tail = 0; *ret = GDKstrdup(*msg); *tail = ':'; return MAL_SUCCEED;}strMDBgetExceptionContext(str *ret, str *msg){ str tail, tail2; tail = strchr(*msg, ':'); if (tail == 0) throw(MAL, "mdb.getExceptionContext", "Could not find it"); tail2 = strchr(tail + 1, ':'); if (tail2 == 0) throw(MAL, "mdb.getExceptionContext", "Could not find it"); *tail2 = 0; *ret = GDKstrdup(tail + 1); *tail2 = ':'; return MAL_SUCCEED;}strMDBgetExceptionReason(str *ret, str *msg){ str tail; tail = strchr(*msg, ':'); if (tail == 0) throw(MAL, "mdb.getExceptionReason", "Could not find it"); tail = strchr(tail + 1, ':'); if (tail == 0) throw(MAL, "mdb.getExceptionReason", "Could not find it"); *ret = GDKstrdup(tail + 1); return MAL_SUCCEED;}strMDBshowFlowGraph(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ str fname; str modnme; str fcnnme; Module scope = NULL; Symbol s = NULL; Client c = MCgetClient(); if (stk != 0) { modnme = (str) getArgValue(stk, p, 1); fcnnme = (str) getArgValue(stk, p, 2); fname = (str) getArgValue(stk, p, 3); } else { modnme = getArgDefault(mb, p, 1); fcnnme = getArgDefault(mb, p, 2); fname = getArgDefault(mb, p, 3); } scope = findModule(c->nspace, putName(modnme, strlen(modnme))); if (scope) s = findSymbolInModule(scope, putName(fcnnme, strlen(fcnnme))); if (s == NULL) { char buf[1024]; snprintf(buf,1024, "Could not find %s.%s\n", modnme, fcnnme); throw(MAL, "mdb.dot", buf); } showFlowGraph(s->def, stk, fname); return MAL_SUCCEED;}@}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -