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 ());
			}
		}