void RemoveBreakpoint(BoundBreakpointData bpData) { lock (lockObj) { pendingBreakpointsToRemove.Add(bpData.Breakpoint); if (pendingBreakpointsToRemove.Count == 1) { CorDebugThread(() => RemoveBreakpoints_CorDebug()); } } }
void AddBreakpointsCore(DbgModule[] modules, DbgCodeLocation[] locations, bool includeNonModuleBreakpoints) { debuggerThread.VerifyAccess(); var dict = CreateDotNetCodeLocationDictionary(locations); var nativeDict = CreateDotNetNativeCodeLocationDictionary(locations); var createdBreakpoints = new List <DbgBoundCodeBreakpointInfo <BoundBreakpointData> >(); foreach (var module in modules) { if (!TryGetModuleData(module, out var data)) { continue; } if (dict.TryGetValue(data.ModuleId, out var moduleLocations)) { foreach (var location in moduleLocations) { var ilbp = dnDebugger.CreateBreakpoint(location.Module.ToDnModuleId(), location.Token, location.Offset, null); const ulong address = DbgObjectFactory.BoundBreakpointNoAddress; var msg = GetBoundBreakpointMessage(ilbp); var bpData = new BoundBreakpointData(this, location.Module, ilbp); createdBreakpoints.Add(new DbgBoundCodeBreakpointInfo <BoundBreakpointData>(location, module, address, msg, bpData)); } } if (nativeDict.TryGetValue(data.ModuleId, out var nativeModuleLocations)) { foreach (var location in nativeModuleLocations) { if (!(location.CorCode.Object is CorCode code)) { continue; } var nbp = dnDebugger.CreateNativeBreakpoint(code, (uint)location.NativeAddress.Offset, null); var address = location.NativeAddress.IP; var msg = GetBoundBreakpointMessage(nbp); var bpData = new BoundBreakpointData(this, location.Module, nbp); createdBreakpoints.Add(new DbgBoundCodeBreakpointInfo <BoundBreakpointData>(location, module, address, msg, bpData)); } } } var boundBreakpoints = objectFactory.Create(createdBreakpoints.ToArray()); foreach (var ebp in boundBreakpoints) { if (!ebp.BoundCodeBreakpoint.TryGetData(out BoundBreakpointData? bpData)) { Debug.Assert(ebp.BoundCodeBreakpoint.IsClosed); continue; } bpData.EngineBoundCodeBreakpoint = ebp; bpData.Breakpoint.Tag = bpData; } }
void RemoveBreakpoint(BoundBreakpointData bpData) { if (bpData.Breakpoint == null) { return; } lock (lockObj) { pendingBreakpointsToRemove.Add(bpData.Breakpoint); if (pendingBreakpointsToRemove.Count == 1) { MonoDebugThread(() => RemoveBreakpoints_MonoDebug()); } } }
void EnableBreakpoints(ModuleMirror monoModule, DbgModule module, List <DbgDotNetCodeLocation> moduleLocations) { debuggerThread.VerifyAccess(); if (moduleLocations.Count == 0) { return; } var createdBreakpoints = new DbgBoundCodeBreakpointInfo <BoundBreakpointData> [moduleLocations.Count]; var reflectionModule = module.GetReflectionModule(); var state = module.GetOrCreateData <TypeLoadBreakpointState>(); for (int i = 0; i < createdBreakpoints.Length; i++) { var location = moduleLocations[i]; const ulong address = DbgObjectFactory.BoundBreakpointNoAddress; DbgEngineBoundCodeBreakpointMessage msg; var method = reflectionModule.ResolveMethod((int)location.Token, DmdResolveOptions.None); if ((object)method == null) { msg = DbgEngineBoundCodeBreakpointMessage.CreateFunctionNotFound(GetFunctionName(location.Module, location.Token)); } else { msg = state.IsTypeLoaded(method.DeclaringType.MetadataToken) ? DbgEngineBoundCodeBreakpointMessage.CreateCustomWarning(dnSpy_Debugger_DotNet_Mono_Resources.CanNotSetABreakpointWhenProcessIsPaused) : DbgEngineBoundCodeBreakpointMessage.CreateNoError(); } var bpData = new BoundBreakpointData(this, location.Module); createdBreakpoints[i] = new DbgBoundCodeBreakpointInfo <BoundBreakpointData>(location, module, address, msg, bpData); } var boundBreakpoints = objectFactory.Create(createdBreakpoints.ToArray()); foreach (var ebp in boundBreakpoints) { if (!ebp.BoundCodeBreakpoint.TryGetData(out BoundBreakpointData bpData)) { Debug.Assert(ebp.BoundCodeBreakpoint.IsClosed); continue; } bpData.EngineBoundCodeBreakpoint = ebp; if (bpData.Breakpoint != null) { bpData.Breakpoint.Tag = bpData; } } for (int i = 0; i < boundBreakpoints.Length; i++) { var boundBp = boundBreakpoints[i]; var location = (DbgDotNetCodeLocation)boundBp.BoundCodeBreakpoint.Breakpoint.Location; var method = reflectionModule.ResolveMethod((int)location.Token, DmdResolveOptions.None); if ((object)method == null) { continue; } state.AddBreakpoint(method.DeclaringType.MetadataToken, boundBp, () => EnableBreakpointCore(module, method, boundBp, location)); } }