--- freem/src/mdebug.c 2025/05/01 04:45:15 1.10 +++ freem/src/mdebug.c 2025/05/01 17:02:30 1.11 @@ -1,5 +1,5 @@ /* - * $Id: mdebug.c,v 1.10 2025/05/01 04:45:15 snw Exp $ + * $Id: mdebug.c,v 1.11 2025/05/01 17:02:30 snw Exp $ * debugger enhancements * * @@ -24,6 +24,9 @@ * along with FreeM. If not, see . * * $Log: mdebug.c,v $ + * Revision 1.11 2025/05/01 17:02:30 snw + * Further debugging improvements + * * Revision 1.10 2025/05/01 04:45:15 snw * Improve backtraces * @@ -113,7 +116,7 @@ void dbg_init (void) } -int debugger (int entry_mode, char *curcode) +int debugger (int entry_mode, char *entryref) { #if defined(HAVE_LIBREADLINE) @@ -122,13 +125,18 @@ int debugger (int entry_mode, char *curc char *dbg_buf; char dbg_prompt[256]; + int dbg_argc; HIST_ENTRY **dbg_hist; int dbg_hist_idx; HIST_ENTRY *dbg_hist_ent; char rouname_buf[256]; char *savptr; char *dbg_cmd; + char *dbarg; int do_prompt = FALSE; + char cur_code[512]; + char tbuf[512]; + char tbuf2[512]; register int i; register int j; @@ -183,29 +191,37 @@ int debugger (int entry_mode, char *curc stcpy (rouname_buf, rou_name); } else { - char tbuf[256]; - getraddress (tbuf, nstx); stcpy (rouname_buf, &(tbuf[3])); } stcnv_m2c (rouname_buf); - snprintf (dbg_prompt, sizeof (dbg_prompt) - 1, "%s $STACK=%d [DEBUG]> ", rouname_buf, nstx); + if (stepmode != STEPMODE_NONE) { + getraddress (tbuf, nstx); + stcnv_m2c (tbuf); + strcpy (tbuf2, &(tbuf[3])); + routine_get_line (tbuf2, cur_code); - if ((stepmode == STEPMODE_LINE) || (stepmode == STEPMODE_CMD)) { - char codbuf[512]; - stcpy (codbuf, curcode); - stcnv_m2c (codbuf); - - printf ("%s\n", codbuf); + printf ("%s\n", cur_code); } - dbg_buf = readline (dbg_prompt); + + snprintf (dbg_prompt, sizeof (dbg_prompt) - 1, "%s $STACK=%d [DEBUG]> ", rouname_buf, nstx); + dbg_buf = readline (dbg_prompt); + if (!dbg_buf) continue; + if (strlen (dbg_buf) < 1) continue; + dbg_argc = 1; + for (i = 0; i < strlen (dbg_buf); i++) { + if (dbg_buf[i] == ' ') dbg_argc++; + } + dbarg = dbg_buf; savptr = dbg_buf; dbg_cmd = strtok_r (dbg_buf, " ", &savptr); - + + dbarg += strlen (dbg_cmd) + 1; + if ((strcmp (dbg_cmd, "exit") == 0) || (strcmp (dbg_cmd, "quit") == 0)) { first_entry = TRUE; stepmode = STEPMODE_NONE; @@ -213,6 +229,61 @@ int debugger (int entry_mode, char *curc set_io (MUMPS); return FALSE; } + else if ((strcmp (dbg_cmd, "examine") == 0) || (strcmp (dbg_cmd, "e") == 0)) { + char *glvn; + char key[STRLEN]; + char res[STRLEN]; + + if (dbg_argc < 2) { + printf ("debug: syntax error\n"); + } + else { + glvn = dbarg; + name_to_key (key, glvn, STRLEN - 1); + if (key[0] != '^') { + symtab (get_sym, key, res); + } + else { + if (key[1] != '$') { + global (get_sym, key, res); + } + else { + ssvn (get_sym, key, res); + } + } + + if (merr () != OK) { + if (merr () == M6) { + printf ("examine: local variable %s is not defined\n", glvn); + merr_clear (); + } + else if (merr () == M7) { + printf ("examine: global variable %s is not defined\n", glvn); + merr_clear (); + } + else { + printf ("examine: error retrieving %s\n", glvn); + merr_clear (); + } + } + else { + stcnv_m2c (res); + printf ("%s=\"%s\"\n", glvn, res); + } + + } + } + else if ((strcmp (dbg_cmd, "trace") == 0) || (strcmp (dbg_cmd, "t") == 0)) { + if (trace_mode == 0) { + trace_mode = 1; + printf ("debug: trace on\n"); + } + else { + trace_mode = 0; + printf ("debug: trace off\n"); + } + ssvn_job_update (); + } else if ((strcmp (dbg_cmd, "step") == 0) || (strcmp (dbg_cmd, "s") == 0)) { stepmode = STEPMODE_CMD; return TRUE; @@ -343,9 +414,9 @@ void dbg_dump_watchlist (void) register int i; for (i = 0; i < MAXWATCH; i++) { - if (dbg_watchlist[i].firect) { - dbg_dump_watch (dbg_watchlist[i].varnam); - } + if (dbg_watchlist[i].firect) { + dbg_dump_watch (dbg_watchlist[i].varnam); + } } dbg_pending_watches = 0; @@ -456,14 +527,14 @@ char *dbg_get_watch_name (char *varnam) void dbg_fire_watch (char *varnam) { - dbg_watch *w; - - if ((w = dbg_find_watch (varnam)) == NULL) { - return; - } - - w->chgct++; - w->firect++; - dbg_pending_watches++; - + dbg_watch *w; + + if ((w = dbg_find_watch (varnam)) == NULL) { + return; + } + + w->chgct++; + w->firect++; + dbg_pending_watches++; + }