public XamarinDocumentContext(string fileName, TEXT_POSITION begPos, TEXT_POSITION endPos, XamarinMemoryAddress codeContext) { _fileName = fileName; _begPos = begPos; _endPos = endPos; _codeContext = codeContext; }
// 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); } }
// 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); } }
// 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); }
// 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); }