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;
        }