public IAddressSpecifier ResolveSymbolToBreakpointAddress(ISymbolTableMethod symbol) { IAddressSpecifier address = null; ManualResetEvent evt = new ManualResetEvent(false); QueueCommand(new SetBreakpointNameCmd(symbol, delegate(int? breakpointNum, UInt64 breakpointAddress) { if(breakpointNum != null) { address = new StaticAddress(breakpointAddress); QueueCommand(new DeleteBreakpointCmd(breakpointNum.Value, this)); } evt.Set(); }, this)); evt.WaitOne(); return address; }
public IBreakpoint SetSoftwareBreakpoint(ISymbolTableMethod method, UInt64 size, string identifier) { if(method == null || method.AddressSpecifier == null) return null; UInt64? myAddress = method.BreakpointAddressSpecifier.ResolveAddress(); if(myAddress == null) return null; return SetSoftwareBreakpoint(myAddress.Value, size, identifier); }
public ISymbolTableVariable[] GetParametersForMethod(ISymbolTableMethod method) { List<ISymbolTableVariable> variables = new List<ISymbolTableVariable> (); string[] myParameterTypes = null; ManualResetEvent evt = new ManualResetEvent (false); QueueCommand ( new WhatIsCmd (this, method, delegate(ISymbol symbol, string returnType, string[] parameterTypes) { myParameterTypes = parameterTypes; evt.Set (); })); evt.WaitOne (); if (myParameterTypes != null) { ISymbol[] myDiscoveredSymbols = null; int[] myDiscoveredLengths = null; evt.Reset (); QueueCommand (new InfoScopeCmd (this, method.Name, delegate(ISymbol[] discoveredSymbols, int[] discoveredLengths) { myDiscoveredSymbols = discoveredSymbols; myDiscoveredLengths = discoveredLengths; evt.Set(); })); evt.WaitOne(); if(myDiscoveredSymbols.Length >= myParameterTypes.Length) { //Now we know the number of parameters and got all local variables valid in the //method-scope. GDB (hopefully) always outputs the parameters first, so we got //the parameter names.....is there a simpler method?? for(int i = 0; i<myParameterTypes.Length; i++) { //TODO: Maybe include the type and size in ISymbolTableVariable? variables.Add(new GDBSymbolTableVariable(this, myDiscoveredSymbols[i].Symbol, myDiscoveredLengths[i])); } } return variables.ToArray(); } else return null; }