void GotStepRanges(CorFrame frame, uint offset, object tag, bool isStepInto, GetCodeRangeResult result, uint continueCounter) { engine.VerifyCorDebugThread(); if (IsClosed) { return; } if (stepData != null) { return; } if (continueCounter != dnThread.Debugger.ContinueCounter || frame.IsNeutered) { RaiseStepComplete(thread, tag, "Internal error"); return; } // If we failed to find the statement ranges (result.Success == false), step anyway. // We'll just step until the next sequence point instead of not doing anything. var ranges = result.Success ? ToStepRanges(result.StatementRanges) : new StepRange[] { new StepRange(offset, offset + 1) }; CorStepper newCorStepper = null; var dbg = dnThread.Debugger; if (isStepInto) { newCorStepper = dbg.StepInto(frame, ranges, (_, e) => StepCompleted(e, newCorStepper, tag)); } else { newCorStepper = dbg.StepOver(frame, ranges, (_, e) => StepCompleted(e, newCorStepper, tag)); } SaveStepper(newCorStepper, tag); }
void SetActiveThread(CorThread t) { activeThread = t; stepper = activeThread.CreateStepper(); stepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE); stepper.SetJMC(true); }
void Step_CorDebug(object tag, DbgEngineStepKind step) { engine.VerifyCorDebugThread(); if (stepData != null) { Debug.Fail("The previous step hasn't been canceled"); // No need to localize it, if we're here it's a bug RaiseStepComplete(thread, tag, "The previous step hasn't been canceled"); return; } var dbg = dnThread.Debugger; if (dbg.ProcessState != DebuggerProcessState.Paused) { Debug.Fail("Process is not paused"); // No need to localize it, if we're here it's a bug RaiseStepComplete(thread, tag, "Process is not paused"); return; } var frame = GetILFrame(); if (frame == null) { // No frame? Just let the process run. engine.Continue_CorDebug(); return; } CorStepper newCorStepper = null; switch (step) { case DbgEngineStepKind.StepInto: GetStepRanges(frame, tag, isStepInto: true); return; case DbgEngineStepKind.StepOver: GetStepRanges(frame, tag, isStepInto: false); return; case DbgEngineStepKind.StepOut: newCorStepper = dbg.StepOut(frame, (_, e) => StepCompleted(e, newCorStepper, tag, null)); break; default: RaiseStepComplete(thread, tag, $"Unsupported step kind: {step}"); return; } SaveStepper(newCorStepper, tag); }
protected override void OnSetActiveThread(long processId, long threadId) { activeThread = null; stepper = null; foreach (CorThread t in process.Threads) { if (t.Id == threadId) { SetActiveThread(t); break; } } }
void StepCompleted(StepCompleteDebugCallbackEventArgs e, CorStepper corStepper, object tag, object p) { engine.VerifyCorDebugThread(); if (stepData == null || stepData.CorStepper != corStepper || stepData.Tag != tag) { return; } stepData = null; e.AddPauseReason(DebuggerPauseReason.Other); var pausedThread = e.CorThread == dnThread.CorThread ? thread : engine.TryGetThread(e.CorThread); Debug.Assert(engine.TryGetThread(e.CorThread) == pausedThread); RaiseStepComplete(pausedThread, tag, null); }
void SaveStepper(CorStepper newCorStepper, object tag) { engine.VerifyCorDebugThread(); if (newCorStepper != null) { stepData = new StepData(tag, newCorStepper); engine.Continue_CorDebug(); } else { // This should rarely if ever happen so the string doesn't need to be localized RaiseStepComplete(thread, tag, "Could not step"); } }
void GotStepRanges(CorFrame frame, object tag, bool isStepInto, GetCodeRangeResult result, uint continueCounter) { engine.VerifyCorDebugThread(); if (IsClosed) { return; } if (stepData != null) { return; } if (continueCounter != dnThread.Debugger.ContinueCounter || frame.IsNeutered) { RaiseStepComplete(thread, tag, "Internal error"); return; } if (!result.Success) { RaiseStepComplete(thread, tag, "Couldn't find statement code range"); return; } var ranges = ToStepRanges(result.StatementRanges); CorStepper newCorStepper = null; var dbg = dnThread.Debugger; if (isStepInto) { newCorStepper = dbg.StepInto(frame, ranges, (_, e) => StepCompleted(e, newCorStepper, tag, null)); } else { newCorStepper = dbg.StepOver(frame, ranges, (_, e) => StepCompleted(e, newCorStepper, tag, null)); } SaveStepper(newCorStepper, tag); }
public StepData(object tag, CorStepper corStepper) { Tag = tag; CorStepper = corStepper; }
public StepCompleteStopReason(CorStepper stepper, CorDebugStepReason stepReason) { Debug.Assert(stepper != null); m_stepReason = stepReason; m_stepper = stepper; }