private void HandleAttachComplete(object virtualMachine, EventArgs e) { _causeBreakRequest = VirtualMachine.GetEventRequestManager().CreateStepRequest(null, StepSize.Instruction, StepDepth.Into); _causeBreakRequest.SuspendPolicy = SuspendPolicy.All; DebugEvent @event = new DebugProgramCreateEvent(enum_EVENTATTRIBUTES.EVENT_ASYNCHRONOUS); Callback.Event(DebugEngine, Process, this, null, @event); }
public IStepRequest GetStepRequest(StepSize size, StepDepth depth) { int kindIndex; switch (depth) { case StepDepth.Into: kindIndex = 0; break; case StepDepth.Out: kindIndex = 1; break; case StepDepth.Over: kindIndex = 2; break; default: throw new NotSupportedException(); } int unitIndex; switch (size) { case StepSize.Instruction: unitIndex = 0; break; case StepSize.Line: unitIndex = 1; break; case StepSize.Statement: unitIndex = 2; break; default: throw new NotSupportedException(); } IStepRequest request = _stepRequests[kindIndex * 3 + unitIndex]; Contract.Assert(request.Size == size); Contract.Assert(request.Depth == depth); return(request); }
private void HandleSingleStep(object sender, ThreadLocationEventArgs e) { if (e.SuspendPolicy == SuspendPolicy.All) { Interlocked.Increment(ref _suspended); } IStepRequest request = e.Request as IStepRequest; if (request == null) { throw new ArgumentException(); } JavaDebugThread thread; lock (_threads) { this._threads.TryGetValue(e.Thread.GetUniqueId(), out thread); } if (e.Request == _causeBreakRequest) { _causeBreakRequest.IsEnabled = false; DebugEvent debugEvent = new DebugBreakEvent(GetAttributesForEvent(e)); SetEventProperties(debugEvent, e, false); Callback.Event(DebugEngine, Process, this, thread, debugEvent); return; } else if (thread != null) { bool wasThreadStepRequest = thread.StepRequests.Contains(request); if (wasThreadStepRequest) { e.Request.IsEnabled = false; DebugEvent debugEvent = new DebugStepCompleteEvent(GetAttributesForEvent(e)); SetEventProperties(debugEvent, e, false); Callback.Event(DebugEngine, Process, this, thread, debugEvent); return; } } }
public int Step(IDebugThread2 pThread, enum_STEPKIND sk, enum_STEPUNIT Step) { JavaDebugThread thread = pThread as JavaDebugThread; if (thread == null) { return(VSConstants.E_INVALIDARG); } StepSize size; StepDepth depth; switch (Step) { case enum_STEPUNIT.STEP_INSTRUCTION: size = StepSize.Instruction; break; case enum_STEPUNIT.STEP_LINE: size = StepSize.Line; break; case enum_STEPUNIT.STEP_STATEMENT: size = VirtualMachine.GetCanStepByStatement() ? StepSize.Statement : StepSize.Line; break; default: throw new NotSupportedException(); } switch (sk) { case enum_STEPKIND.STEP_INTO: depth = StepDepth.Into; break; case enum_STEPKIND.STEP_OUT: depth = StepDepth.Out; break; case enum_STEPKIND.STEP_OVER: depth = StepDepth.Over; break; case enum_STEPKIND.STEP_BACKWARDS: default: throw new NotSupportedException(); } IStepRequest stepRequest = thread.GetStepRequest(size, depth); if (stepRequest == null) { throw new InvalidOperationException(); } Task.Factory.StartNew(() => { // make sure the global "Break All" step request is disabled this._causeBreakRequest.IsEnabled = false; stepRequest.IsEnabled = true; VirtualMachine.Resume(); Interlocked.Decrement(ref _suspended); }).HandleNonCriticalExceptions(); return(VSConstants.S_OK); }