/// <summary> /// Constructor. /// </summary> /// <param name="vi"> Contains all information about a variable / expression. </param> public AD7Property(AD7StackFrame vi) { _stackFrame = vi; }
/// <summary> /// Constructor. /// </summary> /// <param name="exp"> The expression to be evaluated. </param> /// <param name="frame"> Current stack frame. </param> /// <param name="dispatcher"> Represents the class that manages debug events for the debug engine. </param> public AD7Expression(string exp, AD7StackFrame frame, EventDispatcher dispatcher) { this.exp = exp; this.m_eventDispatcher = dispatcher; this.m_frame = frame; }
public static AD7StackFrame create(AD7Engine engine, AD7Thread thread, string[] frameInfo, ref bool created) { created = false; if (thread.__stackFrames != null) { foreach (AD7StackFrame frame in thread.__stackFrames) { if (frame.m_documentName != null && frame.m_functionName != null) { if (frame.m_documentName == frameInfo[3] && frame.m_functionName == frameInfo[2])// && frame.m_addressString == frameInfo[1]) // frameInfo[2] = func, frameInfo[3] = file return frame; } } } else thread.__stackFrames = new ArrayList(); AD7StackFrame newFrame = new AD7StackFrame(engine, thread, frameInfo); if (thread.__stackFrames == null) // that's weird, but sometimes VS is not initializing __stackFrames, so I added this loop to avoid other problems. thread.__stackFrames = new ArrayList() { newFrame }; else thread.__stackFrames.Add(newFrame); created = true; return newFrame; }
public static VariableInfo get(string name, EventDispatcher m_eventDispatcher, AD7StackFrame m_frame) { VariableInfo vi = null; string search = ""; string separator = ""; bool isArray = false; bool isRoot = true; do { int dot = name.IndexOf("."); int squareBracket = name.IndexOf("["); int pos = name.IndexOf("->"); if (dot == -1) dot = name.Length; if (squareBracket == -1) squareBracket = name.Length; if (pos == -1) pos = name.Length; int stop = dot < squareBracket ? dot : squareBracket; stop = stop < pos ? stop : pos; search = search + separator + name.Substring(0, stop); separator = ""; if (stop < name.Length) { separator = name.Substring(stop, 1); if (separator == "-") { separator = "->"; name = name.Substring(stop + 2, name.Length - (stop + 2)); } else if (separator == "[") { int aux = name.IndexOf("]"); isArray = true; separator = name.Substring(stop, (aux - stop) + 1); name = name.Substring(aux + 1, name.Length - (aux + 1)); } else name = name.Substring(stop + 1, name.Length - (stop + 1)); } else name = ""; if (vi == null) { if (m_frame._locals != null) { foreach (VariableInfo var in m_frame._locals) { if (var._name == search) { vi = var; break; } } } if (vi == null) { if (m_frame._arguments != null) { foreach (VariableInfo var in m_frame._arguments) { if (var._name == search) { vi = var; break; } } } } } else { isRoot = false; VariableInfo vi_child = null; if (vi._children != null) { foreach (VariableInfo var in vi._children) { if (var._name == search) { vi_child = var; break; } } } vi = vi_child; } } while ((vi != null) && ((isArray) || (name != ""))); if (name != "") // variable not found probably because it is in an expression, so return to the original name to evaluate it. search = search + separator + name; string result = ""; bool valid; if (vi == null) valid = evaluateExpression(search, ref result, null); else valid = evaluateExpression(search, ref result, vi._GDBName); if (vi != null) { if ((vi._value != result) || (!isRoot)) // if is not root means that it can be expanded... { vi._value = result; if (vi._value == null || (vi._type.Contains("*") && (vi._value != "0x0"))) { // This is an array, struct, union, or pointer. // Create a variable object so we can list this variable's children. ArrayList GDBNames = new ArrayList(); ArrayList VSNames = new ArrayList(); bool hasVsNdK_ = false; m_eventDispatcher.createVar(vi._name, ref hasVsNdK_); if (hasVsNdK_) { GDBNames.Add("VsNdK_" + vi._name); VSNames.Add(vi._name); } vi._children = new ArrayList(); if (vi._type.Contains("struct")) if (vi._type[vi._type.Length - 1] == '*') vi.listChildren(m_eventDispatcher, "*", GDBNames, VSNames, hasVsNdK_, null); else if (vi._type.Contains("[")) vi.listChildren(m_eventDispatcher, "struct[]", GDBNames, VSNames, hasVsNdK_, null); else vi.listChildren(m_eventDispatcher, "struct", GDBNames, VSNames, hasVsNdK_, null); else if (vi._type.Contains("[")) vi.listChildren(m_eventDispatcher, "[]", GDBNames, VSNames, hasVsNdK_, null); else if (vi._type.Contains("*")) vi.listChildren(m_eventDispatcher, "*", GDBNames, VSNames, hasVsNdK_, null); else vi.listChildren(m_eventDispatcher, "", GDBNames, VSNames, hasVsNdK_, null); m_eventDispatcher.deleteVar(vi._name, hasVsNdK_); } } } else { if (!valid) vi = new VariableInfo(search, "", result); else { string aux_exp = search.Replace(" ", ""); string datatype; string firstDatatype = GDBParser.parseCommand("whatis " + aux_exp, 3); string baseDatatype = GDBParser.parseCommand("ptype " + aux_exp, 4); if ((baseDatatype[baseDatatype.Length - 1] == '{') && (baseDatatype[baseDatatype.Length - 2] == ' ')) baseDatatype = baseDatatype.Remove(baseDatatype.Length - 2); if (baseDatatype.Length < firstDatatype.Length) { if (firstDatatype.Contains(baseDatatype)) { baseDatatype = firstDatatype; } } if ((baseDatatype == firstDatatype) || ((baseDatatype.Contains("::")) && (!baseDatatype.Contains("union")))) { baseDatatype = ""; datatype = firstDatatype; } else { datatype = baseDatatype; } if (datatype[datatype.Length - 1] == '*') if (result == "0x0") { vi = new VariableInfo(search, firstDatatype, result); } else { vi = new VariableInfo(search, firstDatatype, baseDatatype, result, m_eventDispatcher, null, null); } else if ((datatype.Contains("struct")) || (datatype.Contains("["))) { vi = new VariableInfo(search, firstDatatype, baseDatatype, null, m_eventDispatcher, null, null); } else { vi = new VariableInfo(search, firstDatatype, result); } } } return vi; }
/// <summary> /// Search the __stackframes cache for the internal representation of the stack frame associated to the GDB frameInfo /// information. If successful, returns the stack frame; otherwise, creates a new one and return it. /// </summary> /// <param name="engine"> The AD7Engine object that represents the DE. </param> /// <param name="thread"> Represents the thread for this stack frame. </param> /// <param name="frameInfo"> Array of strings with the information provided by GDB about this stack frame. </param> /// <param name="created"> Boolean value that indicates if a new object for this stack frame was created or not. </param> /// <returns> Returns the created/found stack frame. </returns> public static AD7StackFrame create(AD7Engine engine, AD7Thread thread, string[] frameInfo, ref bool created) { created = false; if (thread.__stackFrames != null) { foreach (AD7StackFrame frame in thread.__stackFrames) { if (frame.m_documentName != null && frame.m_functionName != null) { if (frame.m_documentName == frameInfo[3] && frame.m_functionName == frameInfo[2]) // frameInfo[2] = func, frameInfo[3] = file return frame; } } } else thread.__stackFrames = new ArrayList(); AD7StackFrame newFrame = new AD7StackFrame(engine, thread, frameInfo); thread.__stackFrames.Add(newFrame); created = true; return newFrame; }