private void CreateStepRequests() { IVirtualMachine virtualMachine = _thread.GetVirtualMachine(); IEventRequestManager manager = virtualMachine.GetEventRequestManager(); /* * THE ORDER OF THESE MUST MATCH THE LOOKUP IN GetStepRequest! */ // step into _stepRequests.Add(manager.CreateStepRequest(_thread, StepSize.Instruction, StepDepth.Into)); _stepRequests.Add(manager.CreateStepRequest(_thread, StepSize.Line, StepDepth.Into)); _stepRequests.Add(manager.CreateStepRequest(_thread, StepSize.Statement, StepDepth.Into)); // step out _stepRequests.Add(manager.CreateStepRequest(_thread, StepSize.Instruction, StepDepth.Out)); _stepRequests.Add(manager.CreateStepRequest(_thread, StepSize.Line, StepDepth.Out)); _stepRequests.Add(manager.CreateStepRequest(_thread, StepSize.Statement, StepDepth.Out)); // step over _stepRequests.Add(manager.CreateStepRequest(_thread, StepSize.Instruction, StepDepth.Over)); _stepRequests.Add(manager.CreateStepRequest(_thread, StepSize.Line, StepDepth.Over)); _stepRequests.Add(manager.CreateStepRequest(_thread, StepSize.Statement, StepDepth.Over)); foreach (var request in _stepRequests) { request.SuspendPolicy = SuspendPolicy.All; } }
public void Bind(JavaDebugProgram program, JavaDebugThread thread, IReferenceType type, IEnumerable <string> sourcePaths) { IVirtualMachine virtualMachine = program.VirtualMachine; IEnumerable <string> validPaths = sourcePaths.Where(i => string.Equals(Path.GetFileName(RequestLocation.DocumentPosition.GetFileName()), Path.GetFileName(i), StringComparison.OrdinalIgnoreCase)); List <JavaDebugBoundBreakpoint> boundBreakpoints = new List <JavaDebugBoundBreakpoint>(); List <IDebugErrorBreakpoint2> errorBreakpoints = new List <IDebugErrorBreakpoint2>(); foreach (var path in validPaths) { TextSpan range = RequestLocation.DocumentPosition.GetRange(); try { ReadOnlyCollection <ILocation> locations = type.GetLocationsOfLine(range.iStartLine + 1); ILocation bindLocation = locations.OrderBy(i => i.GetCodeIndex()).FirstOrDefault(); if (bindLocation != null && IsFirstOnLine()) { IEventRequestManager eventRequestManager = virtualMachine.GetEventRequestManager(); IBreakpointRequest eventRequest = eventRequestManager.CreateBreakpointRequest(bindLocation); eventRequest.SuspendPolicy = SuspendPolicy.All; JavaDebugCodeContext codeContext = new JavaDebugCodeContext(program, bindLocation); BreakpointResolutionLocationCode location = new BreakpointResolutionLocationCode(codeContext); DebugBreakpointResolution resolution = new DebugBreakpointResolution(program, thread, enum_BP_TYPE.BPT_CODE, location); JavaDebugBoundBreakpoint boundBreakpoint = new JavaDebugBoundBreakpoint(this, program, eventRequest, resolution); if (!_disabled) { boundBreakpoint.Enable(1); } boundBreakpoints.Add(boundBreakpoint); } } catch (MissingInformationException) { } } _boundBreakpoints.AddRange(boundBreakpoints); if (boundBreakpoints.Count > 0) { _errorBreakpoints.Clear(); } _errorBreakpoints.AddRange(errorBreakpoints); if (boundBreakpoints.Count > 0) { DebugEvent debugEvent = new DebugBreakpointBoundEvent(enum_EVENTATTRIBUTES.EVENT_SYNCHRONOUS, this, new EnumDebugBoundBreakpoints(boundBreakpoints)); program.Callback.Event(DebugEngine, program.Process, program, null, debugEvent); } foreach (var errorBreakpoint in errorBreakpoints) { DebugEvent debugEvent = new DebugBreakpointErrorEvent(enum_EVENTATTRIBUTES.EVENT_ASYNCHRONOUS, errorBreakpoint); program.Callback.Event(DebugEngine, program.Process, program, null, debugEvent); } }
private void AsyncBindImpl() { UnbindAllBreakpoints(enum_BP_UNBOUND_REASON.BPUR_BREAKPOINT_REBIND); string fileName = RequestLocation.DocumentPosition.GetFileName(); int lineNumber = RequestLocation.DocumentPosition.GetRange().iStartLine + 1; bool errorNotFirstOnLine = false; List <JavaDebugBoundBreakpoint> boundBreakpoints = new List <JavaDebugBoundBreakpoint>(); IEnumerable <JavaDebugProgram> programs = DebugEngine.Programs.ToArray(); foreach (var program in programs) { if (!program.IsLoaded) { continue; } IVirtualMachine virtualMachine = program.VirtualMachine; ReadOnlyCollection <IReferenceType> classes = virtualMachine.GetAllClasses(); foreach (var @class in classes) { if ([email protected]()) { continue; } ReadOnlyCollection <ILocation> locations = @class.GetLocationsOfLine(@class.GetDefaultStratum(), Path.GetFileName(fileName), lineNumber); ILocation bindLocation = locations.OrderBy(i => i.GetCodeIndex()).FirstOrDefault(); if (bindLocation != null) { if (!IsFirstOnLine()) { errorNotFirstOnLine = true; break; } IEventRequestManager eventRequestManager = virtualMachine.GetEventRequestManager(); IBreakpointRequest eventRequest = eventRequestManager.CreateBreakpointRequest(bindLocation); eventRequest.SuspendPolicy = SuspendPolicy.All; JavaDebugCodeContext codeContext = new JavaDebugCodeContext(program, bindLocation); BreakpointResolutionLocationCode location = new BreakpointResolutionLocationCode(codeContext); DebugBreakpointResolution resolution = new DebugBreakpointResolution(program, null, enum_BP_TYPE.BPT_CODE, location); JavaDebugBoundBreakpoint boundBreakpoint = new JavaDebugBoundBreakpoint(this, program, eventRequest, resolution); if (!_disabled) { boundBreakpoint.Enable(1); } boundBreakpoints.Add(boundBreakpoint); } } if (errorNotFirstOnLine) { break; } } _boundBreakpoints.AddRange(boundBreakpoints); if (_boundBreakpoints.Count == 0) { foreach (var program in programs) { JavaDebugThread thread = null; IDebugCodeContext2 codeContext = new DebugDocumentCodeContext(RequestLocation.DocumentPosition); BreakpointResolutionLocation location = new BreakpointResolutionLocationCode(codeContext); string message = "The class is not yet loaded, or the location is not present in the debug symbols for this document."; if (errorNotFirstOnLine) { message = "Only breakpoints on the first statement on a line can be bound at this time."; } DebugErrorBreakpointResolution resolution = new DebugErrorBreakpointResolution(program, thread, enum_BP_TYPE.BPT_CODE, location, enum_BP_ERROR_TYPE.BPET_GENERAL_WARNING, message); DebugErrorBreakpoint errorBreakpoint = new DebugErrorBreakpoint(this, resolution); _errorBreakpoints.Add(errorBreakpoint); DebugEvent debugEvent = new DebugBreakpointErrorEvent(enum_EVENTATTRIBUTES.EVENT_ASYNCHRONOUS, errorBreakpoint); program.Callback.Event(DebugEngine, program.Process, program, null, debugEvent); } } foreach (var group in boundBreakpoints.GroupBy(i => i.Program)) { DebugEvent debugEvent = new DebugBreakpointBoundEvent(enum_EVENTATTRIBUTES.EVENT_ASYNCHRONOUS, this, new EnumDebugBoundBreakpoints(group)); group.Key.Callback.Event(DebugEngine, group.Key.Process, group.Key, null, debugEvent); } }
private void HandleVirtualMachineStart(object sender, ThreadEventArgs e) { if (e.SuspendPolicy == SuspendPolicy.All) { Interlocked.Increment(ref _suspended); } var requestManager = _virtualMachine.GetEventRequestManager(); var threadStartRequest = requestManager.CreateThreadStartRequest(); threadStartRequest.SuspendPolicy = SuspendPolicy.EventThread; threadStartRequest.IsEnabled = true; var threadDeathRequest = requestManager.CreateThreadDeathRequest(); threadDeathRequest.SuspendPolicy = SuspendPolicy.EventThread; threadDeathRequest.IsEnabled = true; var classPrepareRequest = requestManager.CreateClassPrepareRequest(); classPrepareRequest.SuspendPolicy = SuspendPolicy.EventThread; classPrepareRequest.IsEnabled = true; var exceptionRequest = requestManager.CreateExceptionRequest(null, true, true); exceptionRequest.SuspendPolicy = SuspendPolicy.All; exceptionRequest.IsEnabled = true; var virtualMachineDeathRequest = requestManager.CreateVirtualMachineDeathRequest(); virtualMachineDeathRequest.SuspendPolicy = SuspendPolicy.All; virtualMachineDeathRequest.IsEnabled = true; DebugEvent debugEvent = new DebugLoadCompleteEvent(enum_EVENTATTRIBUTES.EVENT_ASYNC_STOP); SetEventProperties(debugEvent, e, false); Callback.Event(DebugEngine, Process, this, null, debugEvent); _isLoaded = true; JavaDebugThread mainThread = null; ReadOnlyCollection <IThreadReference> threads = VirtualMachine.GetAllThreads(); for (int i = 0; i < threads.Count; i++) { bool isMainThread = threads[i].Equals(e.Thread); JavaDebugThread thread = new JavaDebugThread(this, threads[i], isMainThread ? ThreadCategory.Main : ThreadCategory.Worker); if (isMainThread) { mainThread = thread; } lock (this._threads) { this._threads.Add(threads[i].GetUniqueId(), thread); } debugEvent = new DebugThreadCreateEvent(enum_EVENTATTRIBUTES.EVENT_ASYNCHRONOUS); Callback.Event(DebugEngine, Process, this, thread, debugEvent); } if (DebugEngine.VirtualizedBreakpoints.Count > 0) { ReadOnlyCollection <IReferenceType> classes = VirtualMachine.GetAllClasses(); foreach (var type in classes) { if (!type.GetIsPrepared()) { continue; } ReadOnlyCollection <string> sourceFiles = type.GetSourcePaths(type.GetDefaultStratum()); DebugEngine.BindVirtualizedBreakpoints(this, mainThread, type, sourceFiles); } } JavaDebugThread thread2; lock (_threads) { this._threads.TryGetValue(e.Thread.GetUniqueId(), out thread2); } debugEvent = new DebugEntryPointEvent(GetAttributesForEvent(e)); SetEventProperties(debugEvent, e, false); Callback.Event(DebugEngine, Process, this, thread2, debugEvent); }