private void WriteToTraceListener()
 {
     while (true)
     {
         var messages = GetAllMessagesFromQueue();
         foreach (var message in messages)
         {
             foreach (var traceListener in traceListeners)
             {
                 var messageAsXml = ComposeXmlMessage(message, traceListener.GetTraceOptions());
                 lock (traceListener)
                 {
                     try
                     {
                         traceListener.WriteAsync(messageAsXml);
                     }
                     catch (Exception ex)
                     {
                         StatusReporter.Report(string.Format(Resources.ErrTraceListenerThrowsExceptionOnWrite, ex.ToString()), Status.ERROR);
                     }
                 }
             }
         }
     }
 }
        /// <summary>
        /// Enables the Trace manager to register for Debugger break events;
        /// </summary>
        /// <param name="unsubscribeOnDebugSessionEnd"></param>
        void SubscribeForDebuggerEvents()
        {
            if (subscribedForDebuggerBreak)
            {
                StatusReporter.Report(Resources.MsgAlreadySubscribedForDbgBreak, Status.INFO);
                return;
            }

            if (!dteInitialized)
            {
                InitializeDTE();
            }

            //Cache the debuggerEvents object so that it is not disposed by the shell.
            debuggerEvents = dte.Events.DebuggerEvents;
            if (debuggerEvents == null)
            {
                throw new NullReferenceException(Resources.MsgDebuggerEventsObjNull);
            }

            debuggerEvents.OnEnterBreakMode  += new EnvDTE._dispDebuggerEvents_OnEnterBreakModeEventHandler(DebuggerEvents_OnEnterBreakMode);
            debuggerEvents.OnEnterDesignMode += new _dispDebuggerEvents_OnEnterDesignModeEventHandler(debuggerEvents_OnEnterDesignMode);
            StatusReporter.Report(Resources.MsgDbgBreakEventSubscribeSuccess, Status.INFO);
            subscribedForDebuggerBreak = true;
        }
        /// <summary>
        /// Initializes a new instance of Trace Manager
        /// </summary>
        private TraceManager()
        {
            symbols             = new List <string>();
            this.traceListeners = new List <ITraceMessageListener>();
            InitializeDTE();

            StatusReporter.Report(Resources.MsgTraceInitialized, Status.INFO);
        }
Exemple #4
0
 internal IEnumerable <string> GetSymbols()
 {
     if (symbols != null && symbols.Any())
     {
         StatusReporter.Report(Resources.MsgSymbolsReturnedSuccesfully, Status.INFO);
         return(symbols);
     }
     else
     {
         throw new InvalidOperationException(Resources.ErrorSymbolSourceIsNullOrEmpty);
     }
 }
Exemple #5
0
 public void AddSymbol(string symbolName)
 {
     if (!canUpdateSymbolList)
     {
         StatusReporter.Report(Resources.ErrCannotUpdateSymbolList, Status.ERROR);
         throw new InvalidOperationException(Resources.ErrCannotUpdateSymbolList);
     }
     lock (symbols)
     {
         this.symbols.Add(symbolName);
     }
 }
        private void InitializeTraceMessagePump()
        {
            if (traceMessagePumpInitialized)
            {
                StatusReporter.Report(Resources.MsgMessagePumpAlreadyInitialized, Status.INFO);
                return;
            }

            messages = new Queue <TraceMessageSourceEntry>();
            traceMessgePumpThread      = new System.Threading.Thread(new ThreadStart(WriteToTraceListener));
            traceMessgePumpThread.Name = "Ichnos Trace Listener";
            traceMessgePumpThread.Start();
        }
 public void Disable()
 {
     debuggerEvents.OnEnterBreakMode -= new _dispDebuggerEvents_OnEnterBreakModeEventHandler(DebuggerEvents_OnEnterBreakMode);
     StatusReporter.Report(Resources.MsgBreakEventHandlerUnsubscribed, Status.INFO);
 }
        void DebuggerEvents_OnEnterBreakMode(EnvDTE.dbgEventReason Reason, ref EnvDTE.dbgExecutionAction ExecutionAction)
        {
            try
            {
                traceSessionInProgress = true;
                Debugger debugger;
                lock (dte)
                {
                    //Don't lock too much, just what is required.
                    debugger = dte.Debugger;
                }

                if (Reason == dbgEventReason.dbgEventReasonBreakpoint)
                {
                    string[] symbols;
                    lock (this.symbols)
                    {
                        //Clone the list to be used locally.
                        symbols = new string[this.symbols.Count];
                        this.symbols.CopyTo(symbols);
                    }
                    foreach (var symbol in symbols)
                    {
                        if (!string.IsNullOrEmpty(symbol))
                        {
                            try
                            {
                                var expression = debugger.GetExpression(symbol);
                                if (expression.IsValidValue)
                                {
                                    var breakpoint         = debugger.BreakpointLastHit;
                                    var stackFrame         = debugger.CurrentStackFrame;
                                    var traceMessageSource = new TraceMessageSourceEntry()
                                    {
                                        Expression = expression, Breakpoint = breakpoint, StackFrame = stackFrame
                                    };
                                    lock (messages)
                                    {
                                        messages.Enqueue(traceMessageSource);
                                    }
                                }
                                else
                                {
                                    string breakpointContext;
                                    var    bp = dte.Debugger.BreakpointLastHit;
                                    breakpointContext = string.Format(Resources.MsgBreakpointContextFormat, expression.Name, bp.FunctionName, bp.FileLine);
                                    StatusReporter.Report(string.Format(Resources.ErrTraceSymbolInvalid, breakpointContext), Status.WARNING);
                                }
                            }
                            catch (Exception ex)
                            {
                                StatusReporter.Report(string.Format(Resources.ErrorEvaulatingSymbol, symbol + ex.ToString()), Status.WARNING);
                            }
                        }
                    }
                }
            }
            finally
            {
                //This step makes sure that the execution continues after tracing this value;
                ExecutionAction = dbgExecutionAction.dbgExecutionActionGo;
            }
        }