[mono][debugger] Support step over and pause multiple times in same line but differen...
authorThays Grazia <thaystg@gmail.com>
Tue, 2 May 2023 12:51:17 +0000 (09:51 -0300)
committerGitHub <noreply@github.com>
Tue, 2 May 2023 12:51:17 +0000 (09:51 -0300)
* Support step over and pause multiple times in a like like this: for (int i = 0; i < 10; i++)

* Fix name on wasm code.

* Adding support to new message MDBGPROT_CMD_STACK_FRAME_GET_COUNT

* Changing position of create_file_to_check_memory_address function

* Adding another command   MDBGPROT_CMD_STACK_FRAME_GET_PARAMETERS_COUNT

* Fix arguments count

src/mono/mono/component/debugger-agent.c
src/mono/mono/component/debugger-engine.c
src/mono/mono/component/debugger-engine.h
src/mono/mono/component/debugger-protocol.h
src/mono/mono/component/debugger.h
src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs

index 3516941..fe0cd66 100644 (file)
@@ -4724,10 +4724,11 @@ mono_ss_create_init_args (SingleStepReq *ss_req, SingleStepArgs *args)
                                frame = tls->frames [0];
                }
 
-               if (ss_req->size == STEP_SIZE_LINE) {
+               if (ss_req->size == STEP_SIZE_LINE_COLUMN) {
                        if (frame) {
                                ss_req->last_method = frame->de.method;
                                ss_req->last_line = -1;
+                               ss_req->last_column = -1;
 
                                minfo = mono_debug_lookup_method (frame->de.method);
                                if (minfo && frame->il_offset != -1) {
@@ -4735,6 +4736,7 @@ mono_ss_create_init_args (SingleStepReq *ss_req, SingleStepArgs *args)
 
                                        if (loc) {
                                                ss_req->last_line = loc->row;
+                                               ss_req->last_column = loc->column;
                                                g_free (loc);
                                        }
                                }
@@ -6907,6 +6909,44 @@ static void add_error_string (Buffer *buf, const char *str)
                buffer_add_string (buf, str);
 }
 
+static void
+create_file_to_check_memory_address (void)
+{
+       if (file_check_valid_memory != -1)
+               return;
+       char *file_name = g_strdup_printf ("debugger_check_valid_memory.%d", mono_process_current_pid ());
+       filename_check_valid_memory = g_build_filename (g_get_tmp_dir (), file_name, (const char*)NULL);
+       file_check_valid_memory = open(filename_check_valid_memory, O_CREAT | O_WRONLY | O_APPEND, S_IWUSR);
+       g_free (file_name);
+}
+
+static gboolean
+valid_memory_address (gpointer addr, gint size)
+{
+#ifndef _MSC_VER
+       gboolean ret = TRUE;
+       create_file_to_check_memory_address ();
+       if(file_check_valid_memory < 0) {
+               return TRUE;
+       }
+       write (file_check_valid_memory,  (gpointer)addr, 1);
+       if (errno == EFAULT) {
+               ret = FALSE;
+       }
+#else
+       int i = 0;
+       gboolean ret = FALSE;
+       __try {
+               for (i = 0; i < size; i++)
+                       *((volatile char*)addr+i);
+               ret = TRUE;
+       } __except(1) {
+               return ret;
+       }
+#endif
+       return ret;
+}
+
 static ErrorCode
 vm_commands (int command, int id, guint8 *p, guint8 *end, Buffer *buf)
 {
@@ -7252,6 +7292,8 @@ vm_commands (int command, int id, guint8 *p, guint8 *end, Buffer *buf)
        case MDBGPROT_CMD_VM_READ_MEMORY: {
                guint8* memory = (guint8*)GINT_TO_POINTER (decode_long (p, &p, end));
                int size = decode_int (p, &p, end);
+               if (!valid_memory_address(memory, size))
+                       return ERR_INVALID_ARGUMENT;            
                PRINT_DEBUG_MSG (1, "MDBGPROT_CMD_VM_READ_MEMORY - [%p] - size - %d\n", memory, size);
                buffer_add_byte_array (buf, memory, size);
                break;
@@ -9840,6 +9882,7 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
                return cmd_stack_frame_get_this (frame, sig, buf, jit);
                break;
        }
+       case MDBGPROT_CMD_STACK_FRAME_SET_VALUES_2:
        case CMD_STACK_FRAME_SET_VALUES: {
                guint8 *val_buf;
                MonoType *t;
@@ -9852,8 +9895,9 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
 
                for (i = 0; i < len; ++i) {
                        pos = decode_int (p, &p, end);
-
                        if (pos < 0) {
+                               if (command == MDBGPROT_CMD_STACK_FRAME_SET_VALUES_2 && sig->hasthis) //0 == this
+                                       pos++;
                                pos = - pos - 1;
 
                                g_assert (pos >= 0 && GINT_TO_UINT32(pos) < jit->num_params);
@@ -9943,6 +9987,19 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
                buffer_add_long (buf, (gssize)frame->frame_addr);
                break;
        }
+       case MDBGPROT_CMD_STACK_FRAME_GET_COUNT: {
+               MonoDebugLocalsInfo *locals;
+               locals = mono_debug_lookup_locals (frame->de.method);
+               if (locals)
+                       buffer_add_int (buf, locals->num_locals);
+               else
+                       buffer_add_int (buf, 0);
+               break;
+       }
+       case MDBGPROT_CMD_STACK_FRAME_GET_PARAMETERS_COUNT: {
+               buffer_add_int (buf, jit->num_params + (sig->hasthis ? 1 : 0));
+               break;
+       }
        default:
                return ERR_NOT_IMPLEMENTED;
        }
@@ -10085,44 +10142,6 @@ string_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
        return ERR_NONE;
 }
 
-static void
-create_file_to_check_memory_address (void)
-{
-       if (file_check_valid_memory != -1)
-               return;
-       char *file_name = g_strdup_printf ("debugger_check_valid_memory.%d", mono_process_current_pid ());
-       filename_check_valid_memory = g_build_filename (g_get_tmp_dir (), file_name, (const char*)NULL);
-       file_check_valid_memory = open(filename_check_valid_memory, O_CREAT | O_WRONLY | O_APPEND, S_IWUSR);
-       g_free (file_name);
-}
-
-static gboolean
-valid_memory_address (gpointer addr, gint size)
-{
-#ifndef _MSC_VER
-       gboolean ret = TRUE;
-       create_file_to_check_memory_address ();
-       if(file_check_valid_memory < 0) {
-               return TRUE;
-       }
-       write (file_check_valid_memory,  (gpointer)addr, 1);
-       if (errno == EFAULT) {
-               ret = FALSE;
-       }
-#else
-       int i = 0;
-       gboolean ret = FALSE;
-       __try {
-               for (i = 0; i < size; i++)
-                       *((volatile char*)addr+i);
-               ret = TRUE;
-       } __except(1) {
-               return ret;
-       }
-#endif
-       return ret;
-}
-
 static ErrorCode
 pointer_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
 {
@@ -10273,11 +10292,12 @@ get_field_value:
                len = decode_int (p, &p, end);
                i = 0;
                int field_token =  decode_int (p, &p, end);
-               gpointer iter = NULL;
-
-               while ((f = mono_class_get_fields_internal (obj_type, &iter))) {
-                       if (mono_class_get_field_token (f) == field_token)
-                               goto set_field_value;
+               for (k = obj_type; k; k = m_class_get_parent (k)) {
+                       gpointer iter = NULL;
+                       while ((f = mono_class_get_fields_internal (k, &iter))) {
+                               if (mono_class_get_field_token (f) == field_token)
+                                       goto set_field_value;
+                       }
                }
                goto invalid_fieldid;
        case CMD_OBJECT_REF_SET_VALUES:
index a4d6f10..02f7eb0 100644 (file)
@@ -966,7 +966,7 @@ mono_de_ss_update (SingleStepReq *req, MonoJitInfo *ji, SeqPoint *sp, void *tls,
                mono_debug_free_method_async_debug_info (async_method);
        }
 
-       if (req->size != STEP_SIZE_LINE)
+       if (req->size != STEP_SIZE_LINE_COLUMN)
                return TRUE;
 
        /* Have to check whenever a different source line was reached */
@@ -979,8 +979,9 @@ mono_de_ss_update (SingleStepReq *req, MonoJitInfo *ji, SeqPoint *sp, void *tls,
                PRINT_DEBUG_MSG (1, "[%p] No line number info for il offset %x, don't know if it's in the same line single stepping.\n", (gpointer) (gsize) mono_native_thread_id_get (), sp->il_offset);
                req->last_method = method;
                req->last_line = -1;
+               req->last_column = -1;
                return hit;
-       } else if (loc && method == req->last_method && loc->row == req->last_line) {
+       } else if (loc && method == req->last_method && loc->row == req->last_line && loc->column == req->last_column) {
                int nframes;
                rt_callbacks.ss_calculate_framecount (tls, ctx, FALSE, NULL, &nframes);
                if (nframes == req->nframes) { // If the frame has changed we're clearly not on the same source line.
@@ -992,6 +993,7 @@ mono_de_ss_update (SingleStepReq *req, MonoJitInfo *ji, SeqPoint *sp, void *tls,
        if (loc) {
                req->last_method = method;
                req->last_line = loc->row;
+               req->last_column = loc->column;
                mono_debug_free_source_location (loc);
        }
 
index 0b7fa96..b0f6c5c 100644 (file)
 #define STEP_DEPTH_OUT MDBGPROT_STEP_DEPTH_OUT
 #define STEP_DEPTH_INTO MDBGPROT_STEP_DEPTH_INTO
 #define STEP_SIZE_MIN MDBGPROT_STEP_SIZE_MIN
-#define STEP_SIZE_LINE MDBGPROT_STEP_SIZE_LINE
+#define STEP_SIZE_LINE_COLUMN MDBGPROT_STEP_SIZE_LINE_COLUMN
 
 #define SUSPEND_POLICY_NONE MDBGPROT_SUSPEND_POLICY_NONE
 #define SUSPEND_POLICY_ALL MDBGPROT_SUSPEND_POLICY_ALL
index 0c58238..cbcecb4 100644 (file)
@@ -226,7 +226,10 @@ typedef enum {
        MDBGPROT_CMD_STACK_FRAME_SET_THIS = 5,
        MDBGPROT_CMD_STACK_FRAME_GET_ARGUMENT = 6,
        MDBGPROT_CMD_STACK_FRAME_GET_ARGUMENTS = 7,
-       MDBGPROT_CMD_STACK_FRAME_GET_ADDRESS = 8
+       MDBGPROT_CMD_STACK_FRAME_GET_ADDRESS = 8,
+       MDBGPROT_CMD_STACK_FRAME_SET_VALUES_2 = 9,
+       MDBGPROT_CMD_STACK_FRAME_GET_COUNT = 10,
+       MDBGPROT_CMD_STACK_FRAME_GET_PARAMETERS_COUNT = 11
 } MdbgProtCmdStackFrame;
 
 typedef enum {
@@ -335,7 +338,7 @@ typedef enum {
 
 typedef enum {
        MDBGPROT_STEP_SIZE_MIN = 0,
-       MDBGPROT_STEP_SIZE_LINE = 1
+       MDBGPROT_STEP_SIZE_LINE_COLUMN = 1
 } MdbgProtStepSize;
 
 typedef enum {
index fe14960..7dca4d2 100644 (file)
@@ -95,6 +95,7 @@ typedef struct {
        MonoMethod *start_method;
        MonoMethod *last_method;
        int last_line;
+       int last_column;
        /* Whenever single stepping is performed using start/stop_single_stepping () */
        gboolean global;
        /* The list of breakpoints used to implement step-over */
index f63ef19..9e4538f 100644 (file)
@@ -359,7 +359,7 @@ namespace Microsoft.WebAssembly.Diagnostics
     internal enum StepSize
     {
         Minimal,
-        Line
+        LineColumn
     }
 
     internal sealed record ArrayDimensions
@@ -1431,7 +1431,7 @@ namespace Microsoft.WebAssembly.Diagnostics
             commandParamsWriter.Write((byte)1);
             commandParamsWriter.Write((byte)ModifierKind.Step);
             commandParamsWriter.Write(thread_id);
-            commandParamsWriter.Write((int)StepSize.Line);
+            commandParamsWriter.Write((int)StepSize.LineColumn);
             commandParamsWriter.Write((int)kind);
             commandParamsWriter.Write((int)(StepFilter.StaticCtor)); //filter
             using var retDebuggerCmdReader = await SendDebuggerAgentCommand(CmdEventRequest.Set, commandParamsWriter, token, throwOnError: false);