📄 mdb.c
字号:
#line 155 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx"#include "mal_config.h"#include "gdk.h"#include <stdarg.h>#include <time.h>#include "mal_resolve.h"#include "mal_client.h"#include "mal_exception.h"#include "mal_debugger.h"#include "mal_interpreter.h"#include "mal_namespace.h"#ifdef WIN32#ifndef LIBMDB#define mdb_export extern __declspec(dllimport)#else#define mdb_export extern __declspec(dllexport)#endif#else#define mdb_export extern#endifmdb_export str MDBstart(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBstop(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBinspect(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBsetTrace(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBgetDebug(int *ret);mdb_export str MDBsetDebug(int *ret, int *flg);mdb_export str MDBsetCatch(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBsetTimer(int *ret, bit *flag);mdb_export str MDBsetFlow(int *ret, bit *flag);mdb_export str MDBsetMemory(int *ret, bit *flag);mdb_export str MDBsetIO(int *ret, bit *flag);mdb_export str MDBgetExceptionVariable(str *ret, str *msg);mdb_export str MDBgetExceptionReason(str *ret, str *msg);mdb_export str MDBgetExceptionContext(str *ret, str *msg);mdb_export str MDBlist(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBshowFlowGraph(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBlist3(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBlistDetail(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBlist3Detail(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBvar(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBvar3(MalBlkPtr mb, MalStkPtr stk, InstrPtr p);mdb_export str MDBStkDepth(MalBlkPtr mb, MalStkPtr s, InstrPtr p);mdb_export str MDBgetStackFrameN(MalBlkPtr m, MalStkPtr s, InstrPtr p);mdb_export str MDBgetStackFrame(MalBlkPtr m, MalStkPtr s, InstrPtr p);mdb_export str MDBStkTrace(MalBlkPtr m, MalStkPtr s, InstrPtr p);mdb_export str MDBgetDefinition(MalBlkPtr m, MalStkPtr stk, InstrPtr p);#line 206 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx"#define MDBstatus(X) \ if( stk->cmd && X==0 ) \ stream_printf(cntxt->fdout,"#Monet Debugger off\n"); \ else if(stk->cmd==0 && X) \ stream_printf(cntxt->fdout,"#Monet Debugger on\n");strMDBtoggle(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ Client cntxt = MCgetClient(); int b = 0; (void) mb; /* still unused */ if (p->argc == 1) { /* Toggle */ stk->cmd = stk->cmd ? 0 : 's'; cntxt->itrace = cntxt->itrace ? 0 : 's'; if (stk->cmd) MDBdelay = 1; /* wait for real command */ if (stk->up) stk->up->cmd = 0; return MAL_SUCCEED; } if (p->argc > 1) { b = *(int *) getArgReference(stk, p, 1); } else b = stk->cmd; if (b) MDBdelay = 1; /* wait for real command */ MDBstatus(b); stk->cmd = b ? 'n' : 0; if (stk->up) stk->up->cmd = b ? 'n' : 0; cntxt->itrace = b ? 'n' : 0; return MAL_SUCCEED;}strMDBstart(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ Client cntxt = MCgetClient(); stk->cmd = 'n'; cntxt->itrace = 'n'; cntxt->debugOptimizer= TRUE; (void) mb; (void) p; return MAL_SUCCEED;}strMDBstop(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ Client cntxt = MCgetClient(); stk->cmd = 0; cntxt->itrace = 0; cntxt->debugOptimizer= FALSE; (void) mb; (void) p; return MAL_SUCCEED;}voidMDBtraceFlag(Client cntxt, MalStkPtr stk, int b){ if (b) { cntxt->timer = GDKusec(); stk->cmd = b; cntxt->itrace = b; } else { cntxt->timer = 0; stk->cmd = 0; cntxt->itrace = 0; }}strMDBsetTrace(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ int b; (void) mb; /* still unused */ b = *(chr *) getArgReference(stk, p, 1); MDBtraceFlag(MCgetClient(), stk, (b? (int) 't':0)); return MAL_SUCCEED;}strMDBgetDebug(int *ret){ *ret = GDKdebug; return MAL_SUCCEED;}strMDBsetDebug(int *ret, int *flg){ *ret = GDKdebug; GDKdebug = *flg; return MAL_SUCCEED;}strMDBsetCatch(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ int b; Client cntxt= MCgetClient(); (void) mb; /* still unused */ b = *(chr *) getArgReference(stk, p, 1); stk->cmd = cntxt->itrace = (b? (int) 'C':0); return MAL_SUCCEED;}strMDBsetTimer(int *ret, bit *flag){ Client cntxt = MCgetClient(); (void) ret; if( *flag) cntxt->flags |= timerFlag; else cntxt->flags &= ~timerFlag; cntxt->timer= GDKusec(); return MAL_SUCCEED;}strMDBsetFlow(int *ret, bit *flag){ Client cntxt = MCgetClient(); (void) ret; if( *flag) cntxt->flags |= flowFlag; else cntxt->flags &= ~flowFlag; return MAL_SUCCEED;}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);}#line 404 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx"static 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"); #line 152 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx" if (BBPindex("view_stk_frame") <= 0) BATname(b, "view_stk_frame"); BATroles(b,"view","stk"); BATmode(b,TRANSIENT); BATfakeCommit(b); *ret = b->batCacheid; BBPkeepref(*ret);#line 453 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx" 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."); #line 152 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx" if (BBPindex("view_stk_frame") <= 0) BATname(b, "view_stk_frame"); BATroles(b,"view","stk"); BATmode(b,TRANSIENT); BATfakeCommit(b); *ret = b->batCacheid; BBPkeepref(*ret);#line 466 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx" 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); #line 152 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx" if (BBPindex("view_stk_trace") <= 0) BATname(b, "view_stk_trace"); BATroles(b,"view","stk"); BATmode(b,TRANSIENT); BATfakeCommit(b); *ret = b->batCacheid; BBPkeepref(*ret);#line 495 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx" return MAL_SUCCEED;}#line 501 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx"strMDBlist(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;}#line 589 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx"strMDBgetDefinition(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); #line 152 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx" if (BBPindex("view_fcn_stmt") <= 0) BATname(b, "view_fcn_stmt"); BATroles(b,"view","fcn"); BATmode(b,TRANSIENT); BATfakeCommit(b); *ret = b->batCacheid; BBPkeepref(*ret);#line 605 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx" 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;}#line 694 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mdb.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -