public void close_log(DebuggerCore debugger) { if (_logger != null) { debugger.Redirect(null); _logger.Dispose(); } debugger.WriteLine("Logger closed"); }
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); }
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(); } } }