Changeset: 956d0549eafc for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=956d0549eafc Modified Files: clients/Tests/exports.stable.out gdk/gdk_tracer.h monetdb5/mal/Tests/All monetdb5/mal/mal.h monetdb5/mal/mal_client.c monetdb5/mal/mal_dataflow.c monetdb5/mal/mal_debugger.c monetdb5/mal/mal_function.c monetdb5/mal/mal_function.h monetdb5/mal/mal_instruction.c monetdb5/mal/mal_interpreter.c monetdb5/mal/mal_listing.c monetdb5/mal/mal_listing.h monetdb5/mal/mal_namespace.c monetdb5/mal/mal_profiler.c monetdb5/mal/mal_resolve.c monetdb5/modules/atoms/inet.c monetdb5/modules/mal/groupby.c monetdb5/modules/mal/inspect.c monetdb5/modules/mal/manifold.c monetdb5/modules/mal/mdb.c monetdb5/modules/mal/oltp.c monetdb5/modules/mal/orderidx.c monetdb5/modules/mal/tablet.c monetdb5/modules/mal/wlc.c monetdb5/optimizer/Tests/ARexample.malC monetdb5/optimizer/Tests/CRexample.malC monetdb5/optimizer/Tests/CXerror1.malC monetdb5/optimizer/Tests/CXexample.stable.out monetdb5/optimizer/Tests/FTexample.malC monetdb5/optimizer/Tests/cst01.stable.out monetdb5/optimizer/Tests/dataflow4.malC monetdb5/optimizer/Tests/dataflow4.stable.out monetdb5/optimizer/Tests/dataflow5.malC monetdb5/optimizer/Tests/ifthencst.malC monetdb5/optimizer/Tests/inline02.stable.out monetdb5/optimizer/Tests/inline03.stable.out monetdb5/optimizer/Tests/inline04.stable.out monetdb5/optimizer/Tests/inline07.stable.out monetdb5/optimizer/Tests/inline09.stable.out monetdb5/optimizer/Tests/inline10.stable.out monetdb5/optimizer/Tests/inline11.malC monetdb5/optimizer/Tests/inline12.stable.out monetdb5/optimizer/Tests/inlineCst.stable.out monetdb5/optimizer/Tests/inlineFunction.malC monetdb5/optimizer/Tests/inlineFunction.stable.out monetdb5/optimizer/Tests/inlineFunction1.malC monetdb5/optimizer/Tests/inlineFunction2.malC monetdb5/optimizer/Tests/inlineFunction2.stable.out monetdb5/optimizer/Tests/inlineFunction3.malC monetdb5/optimizer/Tests/inlineFunction4.malC monetdb5/optimizer/Tests/inlineFunction4.stable.out monetdb5/optimizer/Tests/joinpath.malC monetdb5/optimizer/Tests/leftjoinpath.malC monetdb5/optimizer/Tests/mat00.malC monetdb5/optimizer/Tests/mat01.malC monetdb5/optimizer/Tests/projectionchain.malC monetdb5/optimizer/Tests/qep02.malC monetdb5/optimizer/Tests/reorder00.malC monetdb5/optimizer/Tests/replicator00.malC monetdb5/optimizer/Tests/tst4000.stable.out monetdb5/optimizer/Tests/tst4002.malC monetdb5/optimizer/Tests/tst4003.stable.out monetdb5/optimizer/Tests/tst4004.malC monetdb5/optimizer/Tests/tst4005.stable.out monetdb5/optimizer/Tests/tst4030.malC monetdb5/optimizer/opt_aliases.c monetdb5/optimizer/opt_candidates.c monetdb5/optimizer/opt_coercion.c monetdb5/optimizer/opt_commonTerms.c monetdb5/optimizer/opt_constants.c monetdb5/optimizer/opt_costModel.c monetdb5/optimizer/opt_dataflow.c monetdb5/optimizer/opt_deadcode.c monetdb5/optimizer/opt_emptybind.c monetdb5/optimizer/opt_evaluate.c monetdb5/optimizer/opt_garbageCollector.c monetdb5/optimizer/opt_generator.c monetdb5/optimizer/opt_inline.c monetdb5/optimizer/opt_json.c monetdb5/optimizer/opt_macro.c monetdb5/optimizer/opt_matpack.c monetdb5/optimizer/opt_mergetable.c monetdb5/optimizer/opt_multiplex.c monetdb5/optimizer/opt_oltp.c monetdb5/optimizer/opt_pipes.c monetdb5/optimizer/opt_profiler.c monetdb5/optimizer/opt_projectionpath.c monetdb5/optimizer/opt_pushselect.c monetdb5/optimizer/opt_querylog.c monetdb5/optimizer/opt_reduce.c monetdb5/optimizer/opt_remap.c monetdb5/optimizer/opt_remoteQueries.c monetdb5/optimizer/opt_reorder.c monetdb5/scheduler/Tests/sched00.stable.out monetdb5/scheduler/run_memo.c sql/backends/monet5/sql.c sql/backends/monet5/sql_execute.c sql/backends/monet5/sql_optimizer.c sql/backends/monet5/sql_orderidx.c sql/backends/monet5/sql_scenario.c sql/backends/monet5/wlr.c sql/test/BugTracker-2014/Tests/querylog.Bug-3607.stable.out Branch: gdk_tracer Log Message:
A major cleanup of (very) old debugging code. Testing optimizers can use the SQL DEBUG method to access the results. Tracing instructions is better supported by the profiler, including properties. Optimizer tests has been extended to include the variable reducer and garbagecollector. diffs (truncated from 2716 to 300 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -2145,8 +2145,7 @@ ssize_t daytime_tz_fromstr(const char *b int daytime_usec(daytime tm); str dblRef; str deblockdataflow(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); -void debugFunction(COMPONENT comp, MalBlkPtr mb, MalStkPtr stk, int flg); -void debugInstruction(COMPONENT comp, MalBlkPtr mb, MalStkPtr stk, InstrPtr p, int p_idx, int flg); +void debugFunction(stream *fd, MalBlkPtr mb, MalStkPtr stk, int flg, int first, int size); int defConstant(MalBlkPtr mb, int type, ValPtr cst); str defineRef; void delArgument(InstrPtr p, int varid); @@ -2289,7 +2288,7 @@ str initQlog(void); int inlineMALblock(MalBlkPtr mb, int pc, MalBlkPtr mc); str inplaceRef; void insertSymbol(Module scope, Symbol prg); -str instruction2str(MalBlkPtr mb, MalStkPtr stl, InstrPtr p, int p_idx, int hidden); +str instruction2str(MalBlkPtr mb, MalStkPtr stl, InstrPtr p, int hidden); str intRef; str intersectRef; str intersectcandRef; @@ -2496,7 +2495,7 @@ str preludeRef; MalStkPtr prepareMALstack(MalBlkPtr mb, int size); int prepareMalBlk(MalBlkPtr mb, str s); void printFunction(stream *fd, MalBlkPtr mb, MalStkPtr stk, int flg); -void printInstruction(stream *fd, MalBlkPtr mb, MalStkPtr stk, InstrPtr p, int p_idx, int flg); +void printInstruction(stream *fd, MalBlkPtr mb, MalStkPtr stk, InstrPtr p, int flg); str printRef; void printSignature(stream *fd, Symbol s, int flg); void printStack(stream *f, MalBlkPtr mb, MalStkPtr s); @@ -2618,7 +2617,6 @@ str singleRef; str sinkRef; void slash_2_dir_sep(str fname); str sliceRef; -void snprintFunction(stream *fd, MalBlkPtr mb, MalStkPtr stk, int flg, int first, int size); str sortRef; str sortReverseRef; str soundex_impl(str *res, str *Name); @@ -2675,6 +2673,8 @@ timestamp timestamp_fromusec(lng usec); ssize_t timestamp_precision_tostr(str *buf, size_t *len, timestamp val, int precision, bool external); ssize_t timestamp_tostr(str *buf, size_t *len, const timestamp *val, bool external); ssize_t timestamp_tz_fromstr(const char *buf, size_t *len, timestamp **ret, bool external); +void traceFunction(COMPONENT comp, MalBlkPtr mb, MalStkPtr stk, int flg); +void traceInstruction(COMPONENT comp, MalBlkPtr mb, MalStkPtr stk, InstrPtr p, int flg); str transactionRef; str transaction_abortRef; str transaction_beginRef; diff --git a/gdk/gdk_tracer.h b/gdk/gdk_tracer.h --- a/gdk/gdk_tracer.h +++ b/gdk/gdk_tracer.h @@ -148,57 +148,20 @@ typedef enum { COMP( SQL_STATEMENT ) \ COMP( SQL_BAT ) \ \ - COMP( MAL_MEMO ) \ COMP( MAL_INTERPRETER ) \ - COMP( MAL_SCHEDULER ) \ COMP( MAL_WLC ) \ - COMP( MAL_CLIENT ) \ - COMP( MAL_OIDX ) \ COMP( MAL_REMOTE ) \ - COMP( MAL_INET ) \ - COMP( MAL_GROUPBY ) \ + COMP( MAL_ATOMS ) \ COMP( MAL_TABLET ) \ COMP( MAL_OLTP ) \ - COMP( MAL_MANIFOLD ) \ - COMP( MAL_RESOLVE ) \ - COMP( MAL_FCN ) \ + COMP( MAL_MAPI ) \ + COMP( MAL_SERVER ) \ COMP( MAL_DATAFLOW ) \ - COMP( MAL_SERVER ) \ + COMP( MAL_MANIFOLD ) \ COMP( MAL_EXCEPTION ) \ - COMP( MAL_NAMESPACE ) \ - COMP( MAL_PROFILER ) \ COMP( MAL_MAL ) \ \ - COMP( MAL_OPT_ALIASES ) \ - COMP( MAL_OPT_CANDIDATES ) \ - COMP( MAL_OPT_COERCION ) \ - COMP( MAL_OPT_COMMONTERMS ) \ - COMP( MAL_OPT_PIPES ) \ - COMP( MAL_OPT_REMAP ) \ - COMP( MAL_OPT_DATAFLOW ) \ - COMP( MAL_OPT_EVALUATE ) \ - COMP( MAL_OPT_INLINE ) \ - COMP( MAL_OPT_MULTIPLEX ) \ - COMP( MAL_OPT_REORDER ) \ - COMP( MAL_OPT_PROJECTIONPATH )\ - COMP( MAL_OPT_WLC ) \ - COMP( MAL_OPT_CONSTANTS ) \ - COMP( MAL_OPT_COSTMODEL ) \ - COMP( MAL_OPT_DEADCODE ) \ - COMP( MAL_OPT_EMPTYBIND ) \ - COMP( MAL_OPT_GENERATOR ) \ - COMP( MAL_OPT_JSON ) \ - COMP( MAL_OPT_MATPACK ) \ - COMP( MAL_OPT_GC ) \ - COMP( MAL_OPT_MERGETABLE ) \ - COMP( MAL_OPT_PUSHSELECT ) \ - COMP( MAL_OPT_QUERYLOG ) \ - COMP( MAL_OPT_OLTP ) \ - COMP( MAL_OPT_PROFILER ) \ - COMP( MAL_OPT_REDUCE ) \ - COMP( MAL_OPT_REMOTE ) \ - COMP( MAL_OPT_VOLCANO ) \ - COMP( MAL_OPT_MACRO ) \ + COMP( MAL_OPTIMIZER ) \ \ COMP( GDK_TM ) \ COMP( GDK_UTILS ) \ diff --git a/monetdb5/mal/Tests/All b/monetdb5/mal/Tests/All --- a/monetdb5/mal/Tests/All +++ b/monetdb5/mal/Tests/All @@ -196,4 +196,4 @@ pithole malids # Tracer -tracer00 +# tracer00 Output is call dependent diff --git a/monetdb5/mal/mal.h b/monetdb5/mal/mal.h --- a/monetdb5/mal/mal.h +++ b/monetdb5/mal/mal.h @@ -95,8 +95,9 @@ mal_export void mserver_reset(void); #define LIST_MAL_PROPS 16 /* show variable properties */ #define LIST_MAL_MAPI 32 /* output Mapi compatible output */ #define LIST_MAL_REMOTE 64 /* output MAL for remote execution */ +#define LIST_MAL_FLOW 128 /* output MAL dataflow dependencies */ #define LIST_MAL_CALL (LIST_MAL_NAME | LIST_MAL_VALUE ) -#define LIST_MAL_DEBUG (LIST_MAL_NAME | LIST_MAL_VALUE | LIST_MAL_TYPE | LIST_MAL_PROPS) +#define LIST_MAL_DEBUG (LIST_MAL_NAME | LIST_MAL_VALUE | LIST_MAL_TYPE | LIST_MAL_PROPS | LIST_MAL_FLOW) #define LIST_MAL_ALL (LIST_MAL_NAME | LIST_MAL_VALUE | LIST_MAL_TYPE | LIST_MAL_PROPS | LIST_MAL_MAPI) /* type check status is kept around to improve type checking efficiency */ diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c --- a/monetdb5/mal/mal_client.c +++ b/monetdb5/mal/mal_client.c @@ -74,7 +74,7 @@ MCinit(void) MAL_MAXCLIENTS = /* client connections */ maxclients; mal_clients = GDKzalloc(sizeof(ClientRec) * MAL_MAXCLIENTS); if( mal_clients == NULL){ - TRC_CRITICAL(MAL_CLIENT, "Initialization failed: " MAL_MALLOC_FAIL "\n"); + TRC_CRITICAL(MAL_MAL, "Initialization failed: " MAL_MALLOC_FAIL "\n"); return false; } for (int i = 0; i < MAL_MAXCLIENTS; i++){ @@ -142,7 +142,6 @@ MCnewClient(void) if (c == mal_clients + MAL_MAXCLIENTS) return NULL; c->idx = (int) (c - mal_clients); - TRC_DEBUG(MAL_CLIENT, "New client created: %d\n", (int) (c - mal_clients)); return c; } @@ -183,7 +182,6 @@ MCresetProfiler(stream *fdout) void MCexitClient(Client c) { - TRC_DEBUG(MAL_CLIENT, "Exit client: %d\n", c->idx); finishSessionProfiler(c); MCresetProfiler(c->fdout); if (c->father == NULL) { /* normal client */ @@ -217,7 +215,7 @@ MCinitClientRecord(Client c, oid user, b c->fdin = fin ? fin : bstream_create(GDKstdin, 0); if ( c->fdin == NULL){ c->mode = FREECLIENT; - TRC_ERROR(MAL_CLIENT, "No stdin channel available\n"); + TRC_ERROR(MAL_MAL, "No stdin channel available\n"); return NULL; } c->yycur = 0; @@ -252,7 +250,6 @@ MCinitClientRecord(Client c, oid user, b bstream_destroy(c->fdin); c->mode = FREECLIENT; } - TRC_ERROR(MAL_CLIENT, "Client prompt undefined\n"); return NULL; } c->promptlength = strlen(prompt); @@ -513,7 +510,6 @@ MCactiveClients(void) void MCcloseClient(Client c) { - TRC_DEBUG(MAL_CLIENT, "Close client: %d " OIDFMT "\n", (int) (c - mal_clients), c->user); /* free resources of a single thread */ MCfreeClient(c); } @@ -563,7 +559,6 @@ MCreadClient(Client c) { bstream *in = c->fdin; - TRC_DEBUG(MAL_CLIENT, "Stream client: %d %d\n", c->idx, isa_block_stream(in->s)); while (in->pos < in->len && (isspace((unsigned char) (in->buf[in->pos])) || in->buf[in->pos] == ';' || !in->buf[in->pos])) @@ -595,11 +590,9 @@ MCreadClient(Client c) if (p != in->buf + in->len - 1) in->len++; } - TRC_DEBUG(MAL_CLIENT, "Received simple stream: %d - sum %zu\n", c->idx, sum); } if (in->pos >= in->len) { /* end of stream reached */ - TRC_DEBUG(MAL_CLIENT, "End of received stream: %d %d\n", c->idx, c->bak == 0); if (c->bak) { MCpopClientInput(c); if (c->fdin == NULL) @@ -608,8 +601,6 @@ MCreadClient(Client c) } return 0; } - TRC_DEBUG(MAL_CLIENT, "Finished reading stream: %d %d\n", (int) in->pos, (int) in->len); - TRC_DEBUG(MAL_CLIENT, "%s\n", in->buf); return 1; } diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c --- a/monetdb5/mal/mal_dataflow.c +++ b/monetdb5/mal/mal_dataflow.c @@ -547,7 +547,6 @@ DFLOWinitBlk(DataFlow flow, MalBlkPtr mb throw(MAL, "dataflow", "DFLOWinitBlk(): Called with flow == NULL"); if (mb == NULL) throw(MAL, "dataflow", "DFLOWinitBlk(): Called with mb == NULL"); - TRC_DEBUG(MAL_DATAFLOW, "Initialize dflow block\n"); assign = (int *) GDKzalloc(mb->vtop * sizeof(int)); if (assign == NULL) throw(MAL, "dataflow", SQLSTATE(HY013) MAL_MALLOC_FAIL); @@ -615,7 +614,6 @@ DFLOWinitBlk(DataFlow flow, MalBlkPtr mb l = getEndScope(mb, getArg(p, j)); if (l != pc && l < flow->stop && l > flow->start) { /* add edge to the target instruction for wakeup call */ - TRC_DEBUG(MAL_DATAFLOW, "Endoflife for %s is %d -> %d\n", getVarName(mb, getArg(p, j)), n + flow->start, l); assert(pc < l); /* only dependencies on earlier instructions */ l -= flow->start; if (flow->nodes[n]) { @@ -658,22 +656,6 @@ DFLOWinitBlk(DataFlow flow, MalBlkPtr mb } GDKfree(assign); - /* CHECK - { char buf[8192]; - int len = 8192; - - // only use in debugging mode compilations - for (n = 0; n < flow->stop - flow->start; n++) { - for (j = n; flow->edges[j]; j = flow->edges[j]) { - len -= snprintf(buf + strlen(buf), len, "%d\n", flow->start + flow->nodes[j]); - if (flow->edges[j] == -1) - break; - } - TRC_DEBUG(MAL_DATAFLOW, "[%d] %d dependents block count %d wakeup, %s\n", flow->start + n, n, flow->status[n].blocks, buf); - } - } -*/ - return MAL_SUCCEED; } @@ -695,10 +677,9 @@ static void showFlowEvent(DataFlow flow, TRC_DEBUG(MAL_DATAFLOW, "End of data flow '%d' done '%d'\n", pc, flow->stop - flow->start); for (i = 0; i < flow->stop - flow->start; i++) if (fe[i].state != DFLOWwrapup && fe[i].pc >= 0) { - TRC_DEBUG_IF(MAL_DATAFLOW) { - TRC_DEBUG_ENDIF(MAL_DATAFLOW, "Missed pc %d status %d %d blocks %d\n", fe[i].state, i, fe[i].pc, fe[i].blocks); - debugInstruction(MAL_DATAFLOW, fe[i].flow->mb, 0, getInstrPtr(fe[i].flow->mb, fe[i].pc), fe[i].pc, LIST_MAL_MAPI); + TRC_DEBUG(MAL_DATAFLOW, "Missed pc %d status %d %d blocks %d\n", fe[i].state, i, fe[i].pc, fe[i].blocks); + traceInstruction(MAL_DATAFLOW, fe[i].flow->mb, 0, getInstrPtr(fe[i].flow->mb, fe[i].pc), LIST_MAL_MAPI); } } } diff --git a/monetdb5/mal/mal_debugger.c b/monetdb5/mal/mal_debugger.c --- a/monetdb5/mal/mal_debugger.c +++ b/monetdb5/mal/mal_debugger.c @@ -180,7 +180,7 @@ static void printCall(Client cntxt, MalBlkPtr mb, MalStkPtr stk, int pc) { str msg; - msg = instruction2str(mb, stk, getInstrPtr(mb, pc), pc, LIST_MAL_CALL); + msg = instruction2str(mb, stk, getInstrPtr(mb, pc), LIST_MAL_CALL); mnstr_printf(cntxt->fdout, "#%s at %s.%s[%d]\n", (msg?msg:"failed instruction2str()") , getModuleId(getInstrPtr(mb, 0)), getFunctionId(getInstrPtr(mb, 0)), pc); @@ -486,7 +486,7 @@ printTraceCall(stream *out, MalBlkPtr mb InstrPtr p; p = getInstrPtr(mb, pc); - msg = instruction2str(mb, stk, p, pc, flags); + msg = instruction2str(mb, stk, p, flags); mnstr_printf(out, "#%s%s\n", (mb->errors != MAL_SUCCEED ? "!" : ""), msg?msg:"failed instruction2str()"); GDKfree(msg); } @@ -1101,7 +1101,7 @@ retryRead: if( lstng == LIST_MAL_NAME) printFunction(out, fs->def, 0, lstng); else - snprintFunction(out, fs->def, 0, lstng, 0,mb->stop); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list