[release/6.0-rc1] [mono][debugger] Fix watch of local variable values (#57787)
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Fri, 20 Aug 2021 20:22:03 +0000 (13:22 -0700)
committerGitHub <noreply@github.com>
Fri, 20 Aug 2021 20:22:03 +0000 (13:22 -0700)
* Fix xamarin-android 6161

* Fixing leak.

* Adding wasm debugger test. Fixing using protocol version.

* only get locals in older protocol versions.

Co-authored-by: Thays <thaystg@gmail.com>
src/mono/mono/component/debugger-agent.c
src/mono/mono/metadata/mono-debug.c
src/mono/mono/metadata/mono-debug.h
src/mono/mono/mini/dwarfwriter.c
src/mono/wasm/debugger/DebuggerTestSuite/Tests.cs
src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs

index 2cff5c0..a266190 100644 (file)
@@ -8572,7 +8572,7 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g
                        return ERR_INVALID_ARGUMENT;
                }
 
-               locals = mono_debug_lookup_locals (method, FALSE);
+               locals = mono_debug_lookup_locals (method);
                if (!locals) {
                        if (CHECK_PROTOCOL_VERSION (2, 43)) {
                                /* Scopes */
@@ -9289,13 +9289,14 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
                                pos = - pos - 1;
                                cmd_stack_frame_get_parameter (frame, sig, pos, buf, jit);
                        } else {
-                               MonoDebugLocalsInfo *locals;
-
-                               locals = mono_debug_lookup_locals (frame->de.method, TRUE);
-                               if (locals) {
-                                       g_assert (pos < locals->num_locals);
-                                       pos = locals->locals [pos].index;
-                                       mono_debug_free_locals (locals);
+                               if (!CHECK_PROTOCOL_VERSION (2, 59)) { //from newer protocol versions it's sent the pdb index
+                                       MonoDebugLocalsInfo *locals;
+                                       locals = mono_debug_lookup_locals (frame->de.method);
+                                       if (locals) {
+                                               g_assert (pos < locals->num_locals);
+                                               pos = locals->locals [pos].index;
+                                               mono_debug_free_locals (locals);
+                                       }
                                }
 
                                PRINT_DEBUG_MSG (4, "[dbg]   send local %d.\n", pos);
@@ -9343,13 +9344,14 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
                                var = &jit->params [pos];
                                is_arg = TRUE;
                        } else {
-                               MonoDebugLocalsInfo *locals;
-
-                               locals = mono_debug_lookup_locals (frame->de.method, TRUE);
-                               if (locals) {
-                                       g_assert (pos < locals->num_locals);
-                                       pos = locals->locals [pos].index;
-                                       mono_debug_free_locals (locals);
+                               if (!CHECK_PROTOCOL_VERSION (2, 59)) { //from newer protocol versions it's sent the pdb index
+                                       MonoDebugLocalsInfo *locals;
+                                       locals = mono_debug_lookup_locals (frame->de.method);
+                                       if (locals) {
+                                               g_assert (pos < locals->num_locals);
+                                               pos = locals->locals [pos].index;
+                                               mono_debug_free_locals (locals);
+                                       }
                                }
                                g_assert (pos >= 0 && pos < jit->num_locals);
 
index b9bea0e..0362698 100644 (file)
@@ -867,7 +867,7 @@ mono_debug_method_lookup_location (MonoDebugMethodInfo *minfo, int il_offset)
  * The result should be freed using mono_debug_free_locals ().
  */
 MonoDebugLocalsInfo*
-mono_debug_lookup_locals (MonoMethod *method, mono_bool ignore_pdb)
+mono_debug_lookup_locals (MonoMethod *method)
 {
        MonoDebugMethodInfo *minfo;
        MonoDebugLocalsInfo *res;
@@ -893,18 +893,16 @@ mono_debug_lookup_locals (MonoMethod *method, mono_bool ignore_pdb)
                return NULL;
        }
 
-       if (ignore_pdb)
-               res = mono_debug_symfile_lookup_locals (minfo);
-       else {
-               if (minfo->handle->ppdb) {
-                       res = mono_ppdb_lookup_locals (minfo);
-               } else {
-                       if (!minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile))
-                               res = NULL;
-                       else
-                               res = mono_debug_symfile_lookup_locals (minfo);
-               }
+
+       if (minfo->handle->ppdb) {
+               res = mono_ppdb_lookup_locals (minfo);
+       } else {
+               if (!minfo->handle->symfile || !mono_debug_symfile_is_loaded (minfo->handle->symfile))
+                       res = NULL;
+               else
+                       res = mono_debug_symfile_lookup_locals (minfo);
        }
+
        mono_debugger_unlock ();
 
        return res;
index 2ddbce0..2fe6a33 100644 (file)
@@ -189,7 +189,7 @@ MONO_API void
 mono_debug_add_delegate_trampoline (void* code, int size);
 
 MONO_API MonoDebugLocalsInfo*
-mono_debug_lookup_locals (MonoMethod *method, mono_bool ignore_pdb);
+mono_debug_lookup_locals (MonoMethod *method);
 
 MONO_API MonoDebugMethodAsyncInfo*
 mono_debug_lookup_method_async_debug_info (MonoMethod *method);
index 1bac0d9..d230741 100644 (file)
@@ -1899,7 +1899,7 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod
        g_free (names);
 
        /* Locals */
-       locals_info = mono_debug_lookup_locals (method, FALSE);
+       locals_info = mono_debug_lookup_locals (method);
 
        for (i = 0; i < header->num_locals; ++i) {
                MonoInst *ins = locals [i];
index 548b012..9681a02 100644 (file)
@@ -845,6 +845,21 @@ namespace DebuggerTests
                     }, "t_props", num_fields: 53);
             });
 
+
+        [Fact]
+        public async Task InspectLocalsWithIndexAndPositionWithDifferentValues() //https://github.com/xamarin/xamarin-android/issues/6161
+        {
+            await EvaluateAndCheck(
+                "window.setTimeout(function() { invoke_static_method('[debugger-test] MainPage:CallSetValue'); }, 1);",
+                "dotnet://debugger-test.dll/debugger-test.cs", 758, 16,
+                "set_SomeValue",
+                locals_fn: (locals) =>
+                {
+                    CheckNumber(locals, "view", 150);
+                }
+            );
+        }
+
         //TODO add tests covering basic stepping behavior as step in/out/over
     }
 }
index 4a893f9..a826d97 100644 (file)
@@ -725,5 +725,48 @@ public class Foo
         Console.WriteLine($"time for await");
         return true;
     }
+
+}
+
+public class MainPage
+{
+    public MainPage()
+    {
+    }
+
+    int count = 0;
+    private int someValue;
+
+    public int SomeValue
+    {
+        get
+        {
+            return someValue;
+        }
+        set
+        {
+            someValue = value;
+            count++;
+
+            if (count == 10)
+            {
+                var view = 150;
+
+                if (view != 50)
+                {
+
+                }
+                System.Diagnostics.Debugger.Break();
+            }
+
+            SomeValue = count;
+        }
+    }
+
+    public static void CallSetValue()
+    {
+        var mainPage = new MainPage();
+        mainPage.SomeValue = 10;
+    }
 }