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 {