Skip to content

Commit e446ca1

Browse files
authored
Merge pull request #1329 from Unity-Technologies/fix-debugger-hang-1254123
Fixing hang that would occur when a Debugger.Break would be triggered…
2 parents 250a939 + 146f734 commit e446ca1

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

mcs/class/Mono.Debugger.Soft/Test/dtest-app.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,14 @@ public class Tests : TestsBase, ITest2
268268

269269
#pragma warning restore 0414
270270

271+
public string BreakInField
272+
{
273+
get {
274+
Debugger.Break ();
275+
return "Foo";
276+
}
277+
}
278+
271279
public class NestedClass {
272280
}
273281

mcs/class/Mono.Debugger.Soft/Test/dtest.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1671,7 +1671,7 @@ public void TypeInfo () {
16711671
t = frame.Method.GetParameters ()[7].ParameterType;
16721672

16731673
var props = t.GetProperties ();
1674-
Assert.AreEqual (3, props.Length);
1674+
Assert.AreEqual (4, props.Length);
16751675
foreach (PropertyInfoMirror prop in props) {
16761676
ParameterInfoMirror[] indexes = prop.GetIndexParameters ();
16771677

@@ -4453,5 +4453,22 @@ public void TestAsyncDebugGenerics () {
44534453
e = step_in_await ("MoveNext", e);
44544454
e = step_in_await ("MoveNext", e);
44554455
}
4456+
4457+
[Test]
4458+
public void DebuggerBreakInFieldDoesNotHang () {
4459+
vm.EnableEvents (EventType.UserBreak);
4460+
Event e = run_until ("o1");
4461+
4462+
StackFrame frame = e.Thread.GetFrames () [0];
4463+
object val = frame.GetThis ();
4464+
Assert.IsTrue (val is ObjectMirror);
4465+
Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
4466+
ObjectMirror o = (val as ObjectMirror);
4467+
TypeMirror t = o.Type;
4468+
4469+
MethodMirror m = t.GetProperty ("BreakInField").GetGetMethod();
4470+
Value v = o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
4471+
AssertValue ("Foo", v);
4472+
}
44564473
} // class DebuggerTests
44574474
} // namespace

mono/mini/debugger-agent.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4162,8 +4162,15 @@ process_event (EventKind event, gpointer arg, gint32 il_offset, MonoContext *ctx
41624162
keepalive_obj = ei->exc;
41634163
break;
41644164
}
4165-
case EVENT_KIND_USER_BREAK:
4165+
case EVENT_KIND_USER_BREAK: {
4166+
DebuggerTlsData* tls;
4167+
tls = (DebuggerTlsData*)mono_native_tls_get_value(debugger_tls_id);
4168+
g_assert(tls);
4169+
// We are already processing a breakpoint event
4170+
if (tls->disable_breakpoints)
4171+
return;
41664172
break;
4173+
}
41674174
case EVENT_KIND_USER_LOG: {
41684175
DebuggerEventInfo *ei = (DebuggerEventInfo *)arg;
41694176
buffer_add_int (&buf, ei->level);

0 commit comments

Comments
 (0)