public void StepRange (bool into, COR_DEBUG_STEP_RANGE[] ranges) { m_ranges = ranges; for (int iRange = 0; iRange < m_ranges.Length; iRange++) { COR_DEBUG_STEP_RANGE range = m_ranges [iRange]; m_ranges [iRange].startOffset = this.m_frame.Function.GetILTinyCLRFromILCLR (range.startOffset); m_ranges [iRange].endOffset = this.m_frame.Function.GetILTinyCLRFromILCLR (range.endOffset); } InitializeBreakpointDef (); this.Kind = into ? BreakpointDef.c_STEP_IN : BreakpointDef.c_STEP_OVER; this.Active = true; }
void Step (bool into) { try { if (stepper != null) { //stepper.IsActive ();//no meaning? CorDebugFrame frame = activeThread.ActiveFrame; var reader = frame.Function.Assembly.DebugData; if (reader == null) { RawContinue (into); return; } var met = new MethodSymbols (new MetadataToken (frame.Function.Token)); //Ugliest hack ever if(reader is Mono.Cecil.Mdb.MdbReader) { for(int i = 0; i < 100; i++) met.Variables.Add(new VariableDefinition(null)); } reader.Read (met); if (met == null || met.Instructions.Count == 0) { RawContinue (into); return; } // Find the current line var range = new COR_DEBUG_STEP_RANGE (); int currentLine = -1; foreach (var sp in met.Instructions) { if (sp.Offset > frame.IP) { if (currentLine == -1) { currentLine = sp.SequencePoint.StartLine; range.startOffset = frame.IP; range.endOffset = (uint)sp.Offset; } else { if (sp.SequencePoint.StartLine == currentLine) { range.endOffset = (uint)sp.Offset; } else { break; } } } } if (currentLine == -1) { RawContinue (into); return; } stepper.StepRange (into, new[] { range }); ClearEvalStatus (); process.Continue (); } } catch (Exception e) { OnDebuggerOutput (true, e.ToString ()); } }