public XamarinDocumentContext(string fileName, TEXT_POSITION begPos, TEXT_POSITION endPos, XamarinMemoryAddress codeContext)
 {
     _fileName    = fileName;
     _begPos      = begPos;
     _endPos      = endPos;
     _codeContext = codeContext;
 }
Exemplo n.º 2
0
        // Gets the code context for this stack frame. The code context represents the current instruction pointer in this stack frame.
        int IDebugStackFrame2.GetCodeContext(out IDebugCodeContext2 memoryAddress)
        {
            memoryAddress = null;

            try
            {
                memoryAddress = new XamarinMemoryAddress(_engine, 0);
                return(VisualStudioExtensionConstants.S_OK);
            }
            catch (ComponentException e)
            {
                return(e.HResult);
            }
            catch (Exception e)
            {
                NLogService.Logger.Error(e);
                return(VisualStudioExtensionConstants.S_FALSE);
            }
        }
 // Retrieves a list of all code contexts associated with this document context.
 int IDebugDocumentContext2.EnumCodeContexts(out IEnumDebugCodeContexts2 ppEnumCodeCxts)
 {
     ppEnumCodeCxts = null;
     try
     {
         XamarinMemoryAddress[] codeContexts = new XamarinMemoryAddress[1];
         codeContexts[0] = _codeContext;
         ppEnumCodeCxts  = new XamarinCodeContextEnum(codeContexts);
         return(VisualStudioExtensionConstants.S_OK);
     }
     catch (ComponentException e)
     {
         return(e.HResult);
     }
     catch (Exception e)
     {
         NLogService.Logger.Error(e);
         return(VisualStudioExtensionConstants.S_FALSE);
     }
 }
Exemplo n.º 4
0
        // Compares the memory context to each context in the given array in the manner indicated by compare flags,
        // returning an index of the first context that matches.
        public int Compare(enum_CONTEXT_COMPARE uContextCompare, IDebugMemoryContext2[] compareToItems, uint compareToLength, out uint foundIndex)
        {
            foundIndex = uint.MaxValue;

            try
            {
                enum_CONTEXT_COMPARE contextCompare = (enum_CONTEXT_COMPARE)uContextCompare;

                for (uint c = 0; c < compareToLength; c++)
                {
                    XamarinMemoryAddress compareTo = compareToItems[c] as XamarinMemoryAddress;
                    if (compareTo == null)
                    {
                        continue;
                    }

                    if (!XamarinEngine.ReferenceEquals(this._engine, compareTo._engine))
                    {
                        continue;
                    }

                    bool result;

                    switch (contextCompare)
                    {
                    case enum_CONTEXT_COMPARE.CONTEXT_EQUAL:
                        result = (this._address == compareTo._address);
                        break;

                    case enum_CONTEXT_COMPARE.CONTEXT_LESS_THAN:
                        result = (this._address < compareTo._address);
                        break;

                    case enum_CONTEXT_COMPARE.CONTEXT_GREATER_THAN:
                        result = (this._address > compareTo._address);
                        break;

                    case enum_CONTEXT_COMPARE.CONTEXT_LESS_THAN_OR_EQUAL:
                        result = (this._address <= compareTo._address);
                        break;

                    case enum_CONTEXT_COMPARE.CONTEXT_GREATER_THAN_OR_EQUAL:
                        result = (this._address >= compareTo._address);
                        break;

                    // The sample debug engine doesn't understand scopes or functions
                    case enum_CONTEXT_COMPARE.CONTEXT_SAME_SCOPE:
                    case enum_CONTEXT_COMPARE.CONTEXT_SAME_FUNCTION:
                        result = (this._address == compareTo._address);
                        break;

                    case enum_CONTEXT_COMPARE.CONTEXT_SAME_MODULE:
                        result = (this._address == compareTo._address);

                        /*if (result == false)
                         * {
                         *  DebuggedModule module = m_engine.DebuggedProcess.ResolveAddress(m_address);
                         *
                         *  if (module != null)
                         *  {
                         *      result = (compareTo.m_address >= module.BaseAddress) &&
                         *          (compareTo.m_address < module.BaseAddress + module.Size);
                         *  }
                         * }*/
                        break;

                    case enum_CONTEXT_COMPARE.CONTEXT_SAME_PROCESS:
                        result = true;
                        break;

                    default:
                        // A new comparison was invented that we don't support
                        return(VisualStudioExtensionConstants.E_NOTIMPL);
                    }

                    if (result)
                    {
                        foundIndex = c;
                        return(VisualStudioExtensionConstants.S_OK);
                    }
                }

                return(VisualStudioExtensionConstants.S_FALSE);
            }
            catch (ComponentException e)
            {
                return(e.HResult);
            }
            catch (Exception e)
            {
                NLogService.Logger.Error(e);
                return(VisualStudioExtensionConstants.S_FALSE);
            }
        }
Exemplo n.º 5
0
 // Adds a specified value to the current context's address to create a new context.
 public int Add(ulong dwCount, out IDebugMemoryContext2 newAddress)
 {
     newAddress = new XamarinMemoryAddress(_engine, (uint)dwCount + _address);
     return(VisualStudioExtensionConstants.S_OK);
 }
Exemplo n.º 6
0
 // Subtracts a specified value from the current context's address to create a new context.
 public int Subtract(ulong dwCount, out IDebugMemoryContext2 ppMemCxt)
 {
     ppMemCxt = new XamarinMemoryAddress(_engine, (uint)dwCount - _address);
     return(VisualStudioExtensionConstants.S_OK);
 }