lib/byebug/commands/trace.rb



module Byebug
  class TraceCommand < Command # :nodoc:
    def regexp
      /^\s* tr(?:ace)? (?: \s+ (\S+))      # on | off | var(iable)
                       (?: \s+ (\S+))?     # (all | variable-name)?
                       (?: \s+ (\S+))? \s* # (stop | nostop)?
       $/ix
    end

    def execute
      if @match[1] =~ /on|off/
        onoff = 'on' == @match[1]
        #if @match[2]
          Byebug.tracing = onoff
          print "Tracing is #{onoff ? 'on' : 'off'}\n"
        #else
        #  Byebug.current_context.tracing = onoff
        #  print "Tracing #{onoff ? 'on' : 'off'} on current thread.\n"
        #end
      elsif @match[1] =~ /var(?:iable)?/
        varname=@match[2]
        if debug_eval("defined?(#{varname})")
          if @match[3] && @match[3] !~ /(:?no)?stop/
            errmsg "expecting \"stop\" or \"nostop\"; got \"#{@match[3]}\"\n"
          else
            dbg_cmd = (@match[3] && (@match[3] !~ /nostop/)) ? 'byebug' : ''
          end
          eval("trace_var(:#{varname}) do |val|
                  print \"traced variable \#{varname} has value \#{val}\n\"
                  #{dbg_cmd}
                end")
        else
          errmsg "#{varname} is not a global variable.\n"
        end
      else
        errmsg "expecting \"on\", \"off\", \"var\" or \"variable\"; got: " \
               "\"#{@match[1]}\"\n"
      end
    end

    class << self
      def help_command
        'trace'
      end

      def help(cmd)
        %{
          tr[ace] (on|off)\tset trace mode of current thread
          tr[ace] (on|off) all\tset trace mode of all threads
          tr[ace] var(iable) VARNAME [stop|nostop]\tset trace variable on VARNAME
        }
      end
    end
  end
end