Exemplo n.º 1
0
 void RemoveBreakpoint(BoundBreakpointData bpData)
 {
     lock (lockObj) {
         pendingBreakpointsToRemove.Add(bpData.Breakpoint);
         if (pendingBreakpointsToRemove.Count == 1)
         {
             CorDebugThread(() => RemoveBreakpoints_CorDebug());
         }
     }
 }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
 void RemoveBreakpoint(BoundBreakpointData bpData)
 {
     if (bpData.Breakpoint == null)
     {
         return;
     }
     lock (lockObj) {
         pendingBreakpointsToRemove.Add(bpData.Breakpoint);
         if (pendingBreakpointsToRemove.Count == 1)
         {
             MonoDebugThread(() => RemoveBreakpoints_MonoDebug());
         }
     }
 }
Exemplo n.º 4
0
        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));
            }
        }