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);
 }
Exemple #3
0
        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);
        }
Exemple #4
0
 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;
         }
     }
 }
Exemple #5
0
        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);
        }
Exemple #6
0
 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");
     }
 }
Exemple #7
0
        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);
        }
Exemple #8
0
 public StepData(object tag, CorStepper corStepper)
 {
     Tag        = tag;
     CorStepper = corStepper;
 }
Exemple #9
0
 public StepCompleteStopReason(CorStepper stepper, CorDebugStepReason stepReason)
 {
     Debug.Assert(stepper != null);
     m_stepReason = stepReason;
     m_stepper    = stepper;
 }