--- freem/src/mdebug.c 2025/04/30 20:03:09 1.8 +++ freem/src/mdebug.c 2025/05/01 04:45:15 1.10 @@ -1,5 +1,5 @@ /* - * $Id: mdebug.c,v 1.8 2025/04/30 20:03:09 snw Exp $ + * $Id: mdebug.c,v 1.10 2025/05/01 04:45:15 snw Exp $ * debugger enhancements * * @@ -24,6 +24,12 @@ * along with FreeM. If not, see . * * $Log: mdebug.c,v $ + * Revision 1.10 2025/05/01 04:45:15 snw + * Improve backtraces + * + * Revision 1.9 2025/05/01 03:56:29 snw + * -m + * * Revision 1.8 2025/04/30 20:03:09 snw * Work on entryref parser * @@ -124,6 +130,7 @@ int debugger (int entry_mode, char *curc char *dbg_cmd; int do_prompt = FALSE; register int i; + register int j; set_io (UNIX); @@ -219,13 +226,14 @@ int debugger (int entry_mode, char *curc return TRUE; } else if ((strcmp (dbg_cmd, "backtrace") == 0) || (strcmp (dbg_cmd, "bt") == 0)) { - char tmpbuf[256]; + char tmpbuf[1024]; char ecbuf[256]; - char lref[256]; - char bt_mcode[256]; + char m_cmd[10]; + char lref[1024]; + char bt_mcode[1024]; - printf ("%-10s%s\n", "$STACK", "ENTRY"); - printf ("%-10s%s\n", "======", "====="); + printf ("%-10s%-10s%s\n", "$STACK", "COMMAND", "PLACE"); + printf ("%-10s%-10s%s\n", "======", "=======", "====="); for (i = 1; i <= nstx; i++) getraddress (callerr[i], i); @@ -233,15 +241,40 @@ int debugger (int entry_mode, char *curc stcpy (tmpbuf, callerr[i]); stcnv_m2c (tmpbuf); + strcpy (ecbuf, &(tmpbuf[1])); + + for (j = 0; j < strlen (ecbuf); j++) { + if (ecbuf[j] == ')') { + ecbuf[j] = '\0'; + break; + } + } + + switch (ecbuf[0]) { + case 'F': + sprintf (m_cmd, "FOR"); + break; + case 'D': + sprintf (m_cmd, "DO"); + break; + } + - printf ("%-10d%s\n", i, &(tmpbuf[3])); + printf ("%-10d%-10s%s\n", i, m_cmd, &(tmpbuf[3])); stcpy (lref, &(tmpbuf[3])); stcnv_m2c (lref); if (routine_get_line (lref, bt_mcode) != NULL) { stcnv_m2c (bt_mcode); - printf ("\t%s\n", bt_mcode); + printf ("%-20s%s\n", " ", bt_mcode); } } + stcpy (ecbuf, etrap); + stcnv_m2c (ecbuf); + printf ("ETRAP:\t%s\n", ecbuf); + stcpy (ecbuf, ztrap[nstx]); + stcnv_m2c (ecbuf); + printf ("ZTRAP:\t%s\n", ecbuf); + } else { printf ("DEBUG: invalid command\r\n");