void Step_DbgThread(DbgStepperImpl stepper, object stepperTag, DbgEngineStepKind step, bool singleProcess) { Dispatcher.VerifyAccess(); var infos = new List <EngineInfo>(); EngineInfo stepperEngineInfo = null; lock (lockObj) { var process = stepper.Process; var runtime = stepper.Runtime; foreach (var info in engines) { if (info.Runtime == runtime) { stepperEngineInfo = info; } if (info.Process == process || !singleProcess) { infos.Add(info); } } } if (stepperEngineInfo?.Process?.State != DbgProcessState.Paused) { RaiseStepperError_DbgThread(stepper, dnSpy_Debugger_Resources.ProcessIsNotPaused); return; } Debug.Assert(infos.Contains(stepperEngineInfo)); RunEngines_DbgThread(infos.ToArray(), info => { if (info == stepperEngineInfo) { stepper.EngineStepper.Step(stepperTag, step); } else { info.Engine.Run(); } }); }
void RaiseStepperError_DbgThread(DbgStepperImpl stepper, string error) { Dispatcher.VerifyAccess(); stepper.RaiseError_DbgThread(string.Format(dnSpy_Debugger_Resources.DebugStepProcessError, error)); }
internal void Step(DbgStepperImpl stepper, object stepperTag, DbgEngineStepKind step, bool singleProcess) => DbgThread(() => Step_DbgThread(stepper, stepperTag, step, singleProcess));