예제 #1
0
 public void e(DebuggerCore debugger, Expression expr)
 {
     try
     {
         debugger.WriteLine(debugger.ExpressionContext.EvalAndFormat(expr));
     }
     catch (Exception x)
     {
         debugger.WriteLine("Error: {0}", x.Message);
     }
 }
예제 #2
0
 public void bp_list(DebuggerCore debugger)
 {
     foreach (var bp in debugger.BreakPoints)
     {
         debugger.WriteLine(bp.ToString());
     }
 }
예제 #3
0
 public void close_log(DebuggerCore debugger)
 {
     if (_logger != null)
     {
         debugger.Redirect(null);
         _logger.Dispose();
     }
     debugger.WriteLine("Logger closed");
 }
예제 #4
0
 public void log(DebuggerCore debugger, string filename)
 {
     if (_logger != null)
     {
         _logger.Dispose();
         _logger = null;
     }
     _logger = new StreamWriter(filename, false, Encoding.UTF8);
     debugger.WriteLine("Logging to file {0}", filename);
     debugger.Redirect(_logger);
 }
예제 #5
0
        public void trace_set(DebuggerCore debugger, int size = -1)
        {
            if (size > 0)
            {
                debugger.TraceBufferSize = size;
            }


            debugger.WriteLine("Trace buffer size = {0}, tracing {1}", debugger.TraceBufferSize, debugger.EnableTrace ? "on" : "off");
            return;
        }
예제 #6
0
        public void disasm(DebuggerCore debugger, FarPointer addr, ushort length = 16)
        {
            var dis = new Disassembler(debugger.CPU);

            dis.cs = addr.Segment;
            dis.ip = addr.Offset;
            while (dis.ip < addr.Offset + length)
            {
                debugger.WriteLine("{0:X4}:{1:X4} {2}", dis.cs, dis.ip, dis.Read());
            }
        }
예제 #7
0
 public void r_time(DebuggerCore debugger, ulong counter)
 {
     if (counter > debugger.CPU.CpuTime)
     {
         debugger.BreakAtTemp(new CpuTimeBreakPoint(counter));
         debugger.Continue();
     }
     else
     {
         debugger.WriteLine("{0} is in the past!", counter);
     }
 }
예제 #8
0
        public void w_del(DebuggerCore debugger, int number)
        {
            var bp = debugger.WatchExpressions.FirstOrDefault(x => x.Number == number);

            if (bp != null)
            {
                debugger.RemoveWatchExpression(bp);
            }
            else
            {
                debugger.WriteLine("Watch expression #{0} doesn't exist", number);
            }
        }
예제 #9
0
        public void help(DebuggerCore debugger)
        {
            foreach (var mi in debugger.CommandDispatcher._commandHandlers
                     .SelectMany(x => x.GetType().GetMethods())
                     .OrderBy(x => x.Name))

            {
                var help = mi.GetCustomAttributes(true).OfType <DebuggerHelpAttribute>().FirstOrDefault();
                if (help == null)
                {
                    continue;
                }
                debugger.WriteLine("{0,20} - {1}", mi.Name.Replace("_", " "), help.Help);
            }
        }
예제 #10
0
 public void bp_reset(DebuggerCore debugger, BreakPoint bp = null)
 {
     if (bp != null)
     {
         bp.TripCount = 0;
         debugger.WriteLine(bp.ToString());
     }
     else
     {
         foreach (var x in debugger.BreakPoints)
         {
             x.TripCount = 0;
         }
         bp_list(debugger);
     }
 }
예제 #11
0
        public void w_edit(DebuggerCore debugger, int number, Expression expression = null)
        {
            var w = debugger.WatchExpressions.FirstOrDefault(x => x.Number == number);

            if (w == null)
            {
                debugger.WriteLine("Watch expression #{0} doesn't exist", number);
                return;
            }

            if (expression == null)
            {
                debugger.PromptConsole(string.Format("w edit {0} {1}", w.Number, w.ExpressionText));
            }
            else
            {
                debugger.EditWatchExpression(w, expression);
            }
        }
예제 #12
0
        public object TryExecuteCommand(object handler, System.Reflection.MethodInfo mi, string cmdline, string args)
        {
            var tokenizer = new Expression.Tokenizer(new StringReader(args));

            // Setup parameters
            var pis = mi.GetParameters();

            object[] paramValues = new object[pis.Length];
            for (int i = 0; i < pis.Length; i++)
            {
                // Get parameter info
                var pi = pis[i];

                // Debugger reference?
                if (pi.ParameterType.IsAssignableFrom(typeof(DebuggerCore)))
                {
                    paramValues[i] = _debugger;
                    continue;
                }

                // Redirect is essential eof

                // Check we have enough parameters
                if (tokenizer.CurrentToken == Expression.Token.EOF || IsRedirect(tokenizer.CurrentToken))
                {
                    if (pi.HasDefaultValue)
                    {
                        paramValues[i] = pi.DefaultValue;
                        continue;
                    }

                    throw new ArgumentException(string.Format("Missing parameter: {0}", pis[i].Name));
                }

                if (tokenizer.CurrentToken == Expression.Token.Comma)
                {
                    if (pi.HasDefaultValue)
                    {
                        paramValues[i] = pi.DefaultValue;
                        tokenizer.NextToken();
                        continue;
                    }

                    throw new ArgumentException(string.Format("Missing parameter: {0}", pis[i].Name));
                }

                if (pi.ParameterType == typeof(string))
                {
                    if (pi.GetCustomAttributes <ArgTailAttribute>().Any())
                    {
                        // Capture rest of the command string
                        paramValues[i] = args.Substring(tokenizer.CurrentTokenPosition);

                        // Skip everything
                        tokenizer.SkipToEnd();
                        continue;
                    }

                    if (tokenizer.CurrentToken == Expression.Token.Identifier)
                    {
                        paramValues[i] = tokenizer.String;
                        tokenizer.NextToken();
                        tokenizer.SkipIf(Expression.Token.Comma);
                        continue;
                    }
                }

                // Parse the expression
                var expr = new Expression(null);
                expr.Parse(tokenizer, args);

                // Does command want unevaluated expression?
                if (pi.ParameterType == typeof(Expression))
                {
                    expr.ResolveImmediateNodes(_debugger.ExpressionContext);

                    paramValues[i] = expr;
                    tokenizer.SkipIf(Expression.Token.Comma);
                    continue;
                }

                // Does it want far pointer?
                if (pi.ParameterType == typeof(FarPointer))
                {
                    var fp = _debugger.ExpressionContext.ResolveFarPointer(expr);
                    paramValues[i] = fp;
                    tokenizer.SkipIf(Expression.Token.Comma);
                    continue;
                }

                // Eval the expression
                var exprValue = expr.Eval(_debugger.ExpressionContext);

                if (pi.ParameterType == typeof(BreakPoint))
                {
                    var bpNumber = (int)Convert.ChangeType(exprValue, typeof(int));
                    var bp       = _debugger.BreakPoints.FirstOrDefault(x => x.Number == bpNumber);
                    if (bp == null)
                    {
                        throw new InvalidDataException(string.Format("Breakpoint #{0} doesn't exist", bpNumber));
                    }

                    paramValues[i] = bp;
                }
                else
                {
                    // Store it
                    paramValues[i] = Convert.ChangeType(exprValue, pi.ParameterType);
                }

                // Skip commas
                tokenizer.SkipIf(Expression.Token.Comma);
            }

            // All command line parameters used?
            if (tokenizer.CurrentToken != Expression.Token.EOF && !IsRedirect(tokenizer.CurrentToken))
            {
                throw new ArgumentException("Too many parameters on command line");
            }

            // Redirect?
            Action FinishRedirect = null;

            if (IsRedirect(tokenizer.CurrentToken))
            {
                bool append = tokenizer.CurrentToken == Expression.Token.RedirectAppend;
                tokenizer.NextToken();

                var target = args.Substring(tokenizer.CurrentTokenPosition).Trim();

                if (target == "clipboard")
                {
                    var tw = new StringWriter();
                    _debugger.Redirect(tw);
                    FinishRedirect = () =>
                    {
                        tw.WriteLine();
                        tw.Close();
                        Clipboard.SetText(tw.ToString());
                        _debugger.Redirect(null);
                    };
                }
                else if (target == "editor")
                {
                    var filename = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "debug.txt");
                    var tw       = new StreamWriter(filename, append, Encoding.UTF8);
                    _debugger.Redirect(tw);
                    FinishRedirect = () =>
                    {
                        tw.WriteLine();
                        tw.Close();
                        System.Diagnostics.Process.Start(filename);
                        _debugger.Redirect(null);
                    };
                }
                else
                {
                    var tw = new StreamWriter(target, append, Encoding.UTF8);
                    _debugger.Redirect(tw);
                    FinishRedirect = () =>
                    {
                        tw.WriteLine();
                        tw.Close();
                        _debugger.Redirect(null);
                    };
                }

                _debugger.WriteLine(">" + cmdline);
            }

            try
            {
                // Execute
                var retv = mi.Invoke(handler, paramValues);

                // Write return value
                if (retv is string)
                {
                    _debugger.WriteLine(retv.ToString());
                }

                return(retv);
            }
            finally
            {
                if (FinishRedirect != null)
                {
                    FinishRedirect();
                }
            }
        }
예제 #13
0
        public void dump_mem(DebuggerCore debugger, FarPointer addr, ushort length = 16, string format = "b")
        {
            try
            {
                ushort seg = addr.Segment;
                ushort ofs = addr.Offset;
                switch (format)
                {
                case "b":
                {
                    char[] chBuf = new char[16];
                    for (int i = 0; i < length; i++)
                    {
                        if ((i % 16 == 0))
                        {
                            if (i > 0)
                            {
                                debugger.Write("|");
                                debugger.Write(new string(chBuf));
                                debugger.WriteLine("|");
                            }
                            debugger.Write(string.Format("{0:X4}:{1:X4} ", seg, ofs + i));
                        }

                        byte b = debugger.CPU.MemoryBus.ReadByte(seg, (ushort)(ofs + i));
                        chBuf[i % 16] = (b >= 32 && b < 128) ? (char)b : ' ';
                        debugger.Write(string.Format("{0:X2} ", b));
                    }

                    if ((length % 16) != 0)
                    {
                        debugger.Write(new string(' ', (16 - length % 16) * 3));
                    }
                    debugger.Write("|");
                    debugger.Write(new string(chBuf, 0, (length % 16) == 0 ? 16 : length % 16));
                    debugger.WriteLine("|");
                    break;
                }

                case "w":
                    for (int i = 0; i < length; i++)
                    {
                        if ((i % 8 == 0))
                        {
                            if (i > 0)
                            {
                                debugger.WriteLine();
                            }
                            debugger.Write(string.Format("{0:X4}:{1:X4} ", seg, ofs + i * 2));
                        }

                        var val = debugger.CPU.MemoryBus.ReadWord(seg, (ushort)(ofs + i * 2));
                        debugger.Write(string.Format("{0:X4} ", val));
                    }

                    debugger.WriteLine();
                    break;

                case "dw":
                    for (int i = 0; i < length; i++)
                    {
                        if ((i % 4 == 0))
                        {
                            if (i > 0)
                            {
                                debugger.WriteLine();
                            }
                            debugger.Write(string.Format("{0:X4}:{1:X4} ", seg, ofs + i * 4));
                        }

                        var val = debugger.CPU.MemoryBus.ReadDWord(seg, (ushort)(ofs + i * 4));
                        debugger.Write(string.Format("{0:X8} ", val));
                    }

                    debugger.WriteLine();
                    break;

                case "i":
                    for (int i = 0; i < length; i++)
                    {
                        if ((i % 8 == 0))
                        {
                            if (i > 0)
                            {
                                debugger.WriteLine();
                            }
                            debugger.Write(string.Format("{0:X4}:{1:X4} ", seg, ofs + i * 2));
                        }

                        var val = debugger.CPU.MemoryBus.ReadWord(seg, (ushort)(ofs + i * 2));
                        debugger.Write(string.Format("{0,6} ", unchecked ((short)val)));
                    }

                    debugger.WriteLine();
                    break;

                case "l":
                    for (int i = 0; i < length; i++)
                    {
                        if ((i % 4 == 0))
                        {
                            if (i > 0)
                            {
                                debugger.WriteLine();
                            }
                            debugger.Write(string.Format("{0:X4}:{1:X4} ", seg, ofs + i * 4));
                        }

                        var val = debugger.CPU.MemoryBus.ReadDWord(seg, (ushort)(ofs + i * 4));
                        debugger.Write(string.Format("{0,11} ", unchecked ((int)val)));
                    }

                    debugger.WriteLine();
                    break;
                }
            }
            catch (CPUException)
            {
                debugger.WriteLine("#err");
            }
        }