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;
            }
        }
 public void OnEnterBreakMode(EnvDTE.dbgEventReason reason, ref EnvDTE.dbgExecutionAction executionAction)
 {
     executionAction = EnvDTE.dbgExecutionAction.dbgExecutionActionDefault;
     _outputWindowPane.OutputString("DebuggerEvents, OnEnterBreakMode\n");
 }