diff --git a/src/mono/mono/component/debugger-agent.c b/src/mono/mono/component/debugger-agent.c index 45404d5967b3f5..c6688845b1a2f5 100644 --- a/src/mono/mono/component/debugger-agent.c +++ b/src/mono/mono/component/debugger-agent.c @@ -5078,6 +5078,8 @@ buffer_add_value_full (Buffer *buf, MonoType *t, void *addr, MonoDomain *domain, /* This can happen with compiler generated locals */ //PRINT_MSG ("%s\n", mono_type_full_name (t)); buffer_add_byte (buf, VALUE_TYPE_ID_NULL); + if (CHECK_PROTOCOL_VERSION (2, 59)) + buffer_add_info_for_null_value (buf, t, domain); return; } g_assert (*(void**)addr); @@ -5231,6 +5233,8 @@ buffer_add_value_full (Buffer *buf, MonoType *t, void *addr, MonoDomain *domain, } else { /* The client can't handle PARENT_VTYPE */ buffer_add_byte (buf, VALUE_TYPE_ID_NULL); + if (CHECK_PROTOCOL_VERSION (2, 59)) + buffer_add_info_for_null_value (buf, t, domain); } break; } else { @@ -5613,6 +5617,11 @@ decode_value (MonoType *t, MonoDomain *domain, gpointer void_addr, gpointer void ErrorCode err; int type = decode_byte (buf, &buf, limit); + if (m_type_is_byref (t)) { + *(guint8**)addr = (guint8 *)g_malloc (sizeof (void*)); //when the object will be deleted it will delete this memory allocated here together? + addr = *(guint8**)addr; + } + if (t->type == MONO_TYPE_GENERICINST && mono_class_is_nullable (mono_class_from_mono_type_internal (t))) { MonoType *targ = t->data.generic_class->context.class_inst->type_argv [0]; guint8 *nullable_buf; @@ -6082,7 +6091,7 @@ mono_do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, gu } } else { if (!(m->flags & METHOD_ATTRIBUTE_STATIC) || (m->flags & METHOD_ATTRIBUTE_STATIC && !CHECK_PROTOCOL_VERSION (2, 59))) { //on icordbg I couldn't find an object when invoking a static method maybe I can change this later - err = decode_value(m_class_get_byval_arg(m->klass), domain, this_buf, p, &p, end, FALSE); + err = decode_value (m_class_get_byval_arg (m->klass), domain, this_buf, p, &p, end, FALSE); if (err != ERR_NONE) return err; } diff --git a/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs b/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs index fb17d2e72453b3..0806ebab967fda 100644 --- a/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs +++ b/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs @@ -1615,6 +1615,14 @@ public async Task GetValueFromDebuggerDisplayAttribute(DotnetObjectId do { dispAttrStr = dispAttrStr.Replace(",nq", ""); } + if (dispAttrStr.Contains(", raw")) + { + dispAttrStr = dispAttrStr.Replace(", raw", ""); + } + if (dispAttrStr.Contains(",raw")) + { + dispAttrStr = dispAttrStr.Replace(",raw", ""); + } expr = "$\"" + dispAttrStr + "\""; JObject retValue = await resolver.Resolve(expr, token); if (retValue == null) diff --git a/src/mono/wasm/debugger/DebuggerTestSuite/MiscTests.cs b/src/mono/wasm/debugger/DebuggerTestSuite/MiscTests.cs index e05f4d682db641..137932efa99acb 100644 --- a/src/mono/wasm/debugger/DebuggerTestSuite/MiscTests.cs +++ b/src/mono/wasm/debugger/DebuggerTestSuite/MiscTests.cs @@ -1104,5 +1104,30 @@ await EvaluateAndCheck( bp.Value["locations"][0]["columnNumber"].Value(), $"DebuggerTests.CheckChineseCharacterInPath.Evaluate"); } + + [Fact] + public async Task InspectReadOnlySpan() + { + var expression = $"{{ invoke_static_method('[debugger-test] ReadOnlySpanTest:Run'); }}"; + + await EvaluateAndCheck( + "window.setTimeout(function() {" + expression + "; }, 1);", + "dotnet://debugger-test.dll/debugger-test.cs", 1371, 8, + "ReadOnlySpanTest.CheckArguments", + wait_for_event_fn: async (pause_location) => + { + var id = pause_location["callFrames"][0]["callFrameId"].Value(); + await EvaluateOnCallFrameAndCheck(id, + ("parameters.ToString()", TString("System.ReadOnlySpan[1]")) + ); + } + ); + await StepAndCheck(StepKind.Resume, "dotnet://debugger-test.dll/debugger-test.cs", 1363, 8, "ReadOnlySpanTest.Run", + locals_fn: async (locals) => + { + await CheckValueType(locals, "var1", "System.ReadOnlySpan", description: "System.ReadOnlySpan[0]"); + } + ); + } } } diff --git a/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs b/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs index 73a225cf5e16c4..5e30c999b3304d 100644 --- a/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs +++ b/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs @@ -1354,4 +1354,21 @@ public void CallMethod() } public int myField; +} +public class ReadOnlySpanTest +{ + public static void Run() + { + Invoke(new string[] {"TEST"}); + ReadOnlySpan var1 = new ReadOnlySpan(); + System.Diagnostics.Debugger.Break(); + } + public static void Invoke(object[] parameters) + { + CheckArguments(parameters); + } + public static void CheckArguments(ReadOnlySpan parameters) + { + System.Diagnostics.Debugger.Break(); + } } \ No newline at end of file