diff --git a/src/MICore/CommandFactories/MICommandFactory.cs b/src/MICore/CommandFactories/MICommandFactory.cs
index 3529d37d3..eb2e22773 100644
--- a/src/MICore/CommandFactories/MICommandFactory.cs
+++ b/src/MICore/CommandFactories/MICommandFactory.cs
@@ -35,6 +35,17 @@ public enum ExceptionBreakpointStates
BreakThrown = 0x2
}
+ ///
+ /// The signals that are using for async-break.
+ /// None will be used for no signal or signals that are not listed in the enum
+ ///
+ public enum AsyncBreakSignal
+ {
+ None = 0,
+ SIGTRAP = 2,
+ SIGINT = 5
+ }
+
public abstract class MICommandFactory
{
protected Debugger _debugger;
@@ -652,19 +663,22 @@ public virtual bool SupportsFrameFormatting
get { return false; }
}
- public virtual bool IsAsyncBreakSignal(Results results)
+ public virtual AsyncBreakSignal GetAsyncBreakSignal(Results results)
{
- bool isAsyncBreak = false;
-
if (results.TryFindString("reason") == "signal-received")
{
- if (results.TryFindString("signal-name") == "SIGTRAP")
+ string signalName = results.TryFindString("signal-name");
+ if (signalName == "SIGTRAP")
+ {
+ return MICore.AsyncBreakSignal.SIGTRAP;
+ }
+ else if (signalName == "SIGINT")
{
- isAsyncBreak = true;
+ return MICore.AsyncBreakSignal.SIGINT;
}
}
- return isAsyncBreak;
+ return MICore.AsyncBreakSignal.None;
}
public Results IsModuleLoad(string cmd)
diff --git a/src/MICore/Debugger.cs b/src/MICore/Debugger.cs
index 295b919ca..00acc2d0d 100755
--- a/src/MICore/Debugger.cs
+++ b/src/MICore/Debugger.cs
@@ -283,8 +283,9 @@ private async void OnStopped(Results results)
results = results.Add("frame", frameResult.Find("frame"));
}
- bool fIsAsyncBreak = MICommandFactory.IsAsyncBreakSignal(results);
- if (await DoInternalBreakActions(fIsAsyncBreak))
+ AsyncBreakSignal signal = MICommandFactory.GetAsyncBreakSignal(results);
+ bool isAsyncBreak = signal == AsyncBreakSignal.SIGTRAP || (IsUsingExecInterrupt && signal == AsyncBreakSignal.SIGINT);
+ if (await DoInternalBreakActions(isAsyncBreak))
{
return;
}
@@ -409,6 +410,8 @@ private async Task DoInternalBreakActions(bool fIsAsyncBreak)
{
CmdContinueAsync();
processContinued = true;
+ // Reset since this -exec-interrupt was for an internal breakpoint.
+ IsUsingExecInterrupt = false;
}
if (firstException != null)
@@ -591,7 +594,7 @@ internal bool IsLocalGdbTarget()
_launchOptions is LocalLaunchOptions && !IsLocalLaunchUsingServer());
}
- private bool IsRemoteGdbTarget()
+ internal bool IsRemoteGdbTarget()
{
return MICommandFactory.Mode == MIMode.Gdb &&
(_launchOptions is PipeLaunchOptions || _launchOptions is UnixShellPortLaunchOptions ||
@@ -606,6 +609,11 @@ protected bool IsCoreDump
}
}
+ ///
+ /// Flag to indicate that '-exec-interrupt' was used for async-break scenarios.
+ ///
+ public bool IsUsingExecInterrupt { get; protected set; } = false;
+
public async Task CmdTerminate()
{
if (!_terminating)
@@ -749,6 +757,7 @@ public Task CmdBreakInternal()
}
}
+ IsUsingExecInterrupt = true;
var res = CmdAsync("-exec-interrupt", ResultClass.done);
return res.ContinueWith((t) =>
{
diff --git a/src/MIDebugEngine/Engine.Impl/DebuggedProcess.cs b/src/MIDebugEngine/Engine.Impl/DebuggedProcess.cs
index f7b68e0fd..538bef49a 100755
--- a/src/MIDebugEngine/Engine.Impl/DebuggedProcess.cs
+++ b/src/MIDebugEngine/Engine.Impl/DebuggedProcess.cs
@@ -1332,14 +1332,18 @@ private async Task HandleBreakModeEvent(ResultEventArgs results, BreakRequest br
else if (reason == "signal-received")
{
string name = results.Results.TryFindString("signal-name");
+ AsyncBreakSignal signal = MICommandFactory.GetAsyncBreakSignal(results.Results);
+ bool isAsyncBreak = signal == AsyncBreakSignal.SIGTRAP || (IsUsingExecInterrupt && signal == AsyncBreakSignal.SIGINT);
if ((name == "SIG32") || (name == "SIG33"))
{
// we are going to ignore these (Sigma) signals for now
CmdContinueAsyncConditional(breakRequest);
}
- else if (MICommandFactory.IsAsyncBreakSignal(results.Results))
+ else if (isAsyncBreak)
{
_callback.OnAsyncBreakComplete(thread);
+ // Reset flag for real async break
+ IsUsingExecInterrupt = false;
}
else
{