lib/tracing.rb in tracing-2.0.7 vs lib/tracing.rb in tracing-2.0.8

- old
+ new

@@ -54,28 +54,28 @@ def initialize reinitialize end def reinitialize - @indent = 0 # Current nesting level of enabled trace blocks + @indent = 0 # Current nesting level of enabled trace blocks @nested = false # Set when a block enables all enclosed tracing - @available = {} # Hash of available trace keys, accumulated during the run - @delayed = nil # A delayed message, emitted only if the enclosed block emits tracing + @available = {} # Hash of available trace keys, accumulated during the run + @delayed = nil # A delayed message, emitted only if the enclosed block emits tracing @keys = {} if (e = ENV["TRACE"]) - e.split(/[^_a-zA-Z0-9]/).each{|k| enable(k) } + e.split(/[^_a-zA-Z0-9]/).each{|k| enable(k) } end end def trace(*args, &block) begin - old_indent, old_nested, old_delayed, enabled = @indent, @nested, @delayed, show(*args) - # This monstrosity reduces the steps when single-stepping: - block ? yield : (args.size == 0 ? self : enabled) + old_indent, old_nested, old_delayed, enabled = @indent, @nested, @delayed, show(*args) + # This monstrosity reduces the steps when single-stepping: + block ? yield : (args.size == 0 ? self : enabled) ensure - @indent, @nested, @delayed = old_indent, old_nested, old_delayed + @indent, @nested, @delayed = old_indent, old_nested, old_delayed end end def available_keys @available.keys @@ -89,125 +89,125 @@ @keys.keys end def enable key if !key.empty? && !@keys[s = key.to_sym] - @keys[s] = true - setup_help if s == :help - setup_flame if s == :flame + @keys[s] = true + setup_help if s == :help + setup_flame if s == :flame else - true + true end end def disable key !key.empty? and @keys.delete(key.to_sym) end def toggle key if !key.empty? - if enabled?(key) - disable(key) - false - else - enable(key) - true - end + if enabled?(key) + disable(key) + false + else + enable(key) + true + end end end def setup_help at_exit { - $stderr.puts "---\nTracing keys available: #{@available.keys.map{|s| s.to_s}.sort*", "}" + $stderr.puts "---\nTracing keys available: #{@available.keys.map{|s| s.to_s}.sort*", "}" } end def setup_flame require 'ruby-prof' require 'ruby-prof-flamegraph' profile_result = RubyProf.start at_exit { - profile_result2 = RubyProf.stop - printer = RubyProf::FlameGraphPrinter.new(profile_result2) - data_file = "/tmp/flamedata_#{Process.pid}.txt" - svg_file = "/tmp/flamedata_#{Process.pid}.svg" - flamegraph = File.dirname(__FILE__)+"/flamegraph.pl" - File.popen("tee #{data_file} | perl #{flamegraph} --countname=ms --width=4800 > #{svg_file}", "w") { |f| - printer.print(f, {}) - } - STDERR.puts("Flame graph dumped to file:///#{svg_file}") + profile_result2 = RubyProf.stop + printer = RubyProf::FlameGraphPrinter.new(profile_result2) + data_file = "/tmp/flamedata_#{Process.pid}.txt" + svg_file = "/tmp/flamedata_#{Process.pid}.svg" + flamegraph = File.dirname(__FILE__)+"/flamegraph.pl" + File.popen("tee #{data_file} | perl #{flamegraph} --countname=ms --width=4800 > #{svg_file}", "w") { |f| + printer.print(f, {}) + } + STDERR.puts("Flame graph dumped to file:///#{svg_file}") } end def setup_debugger begin - require 'ruby-trace ' - Debugger.start # (:post_mortem => true) # Some Ruby versions crash on post-mortem debugging + require 'ruby-trace ' + Debugger.start # (:post_mortem => true) # Some Ruby versions crash on post-mortem debugging rescue LoadError - # Ok, no debugger, tough luck. + # Ok, no debugger, tough luck. end if trace :trap - trap('SIGINT') do - puts "Stopped at:\n\t"+caller*"\n\t" - debugger - true # Stopped on SIGINT - end + trap('SIGINT') do + puts "Stopped at:\n\t"+caller*"\n\t" + debugger + true # Stopped on SIGINT + end end errors = [] ( - [ENV["DEBUG_PREFERENCE"]].compact + - [ - 'byebug', - 'pry', - 'debugger', - 'ruby-trace ' - ] + [ENV["DEBUG_PREFERENCE"]].compact + + [ + 'byebug', + 'pry', + 'debugger', + 'ruby-trace ' + ] ).each do |debugger| - begin - require debugger - if debugger == 'byebug' - Kernel.class_eval do - alias_method :debugger, :byebug - end - end - ::Debugger.start if (const_get(::Debugger) rescue nil) - return - rescue LoadError => e - errors << e - end + begin + require debugger + if debugger == 'byebug' + Kernel.class_eval do + alias_method :debugger, :byebug + end + end + ::Debugger.start if (const_get(::Debugger) rescue nil) + return + rescue LoadError => e + errors << e + end end # Report when we couldn't load any debugger - $stderr.p errors + $stderr.puts(errors.inspect) end def setup_firstaid if trace :firstaid - puts "Preparing first aid kit" - ::Exception.class_eval do - alias_method :firstaid_initialize, :initialize + puts "Preparing first aid kit" + ::Exception.class_eval do + alias_method :firstaid_initialize, :initialize - def initialize *args, &b - send(:firstaid_initialize, *args, &b) - # Array#flatten calls to_ary, ignore it when it comes from Gem Specifications: - return if NoMethodError === self && message =~ /^undefined method `to_ary' for \#<Gem::Specification/ + def initialize *args, &b + send(:firstaid_initialize, *args, &b) + # Array#flatten calls to_ary, ignore it when it comes from Gem Specifications: + return if NoMethodError === self && message =~ /^undefined method `to_ary' for \#<Gem::Specification/ - # LoadErrors are not hard to diagnose, and polyglot uses them - return if LoadError === self - return if self.message =~ /uninitialized constant Mini[Tt]est/ # From RSpec usually + # LoadErrors are not hard to diagnose, and polyglot uses them + return if LoadError === self + return if self.message =~ /uninitialized constant Mini[Tt]est/ # From RSpec usually - # The Array() method calls to_ary and/or to_a before making a new array, ignore that: - clr = caller - return if NoMethodError === self && clr.detect{|frame| frame =~ /in `Array'/} + # The Array() method calls to_ary and/or to_a before making a new array, ignore that: + clr = caller + return if NoMethodError === self && clr.detect{|frame| frame =~ /in `Array'/} - puts "Stopped due to #{self.class}: #{message} at "+clr*"\n\t" - debugger - true # Stopped in Exception constructor - end - end + puts "Stopped due to #{self.class}: #{message} at "+clr*"\n\t" + debugger + true # Stopped in Exception constructor + end + end end end def display key, msg puts msg @@ -216,65 +216,65 @@ def show(*args) key, enabled_prefix = *selected?(args) # Emit the message if enabled or a parent is: if enabled_prefix && args.size > 0 - message = - "\##{enabled_prefix} " + - ' '*@indent + - args. - map{|a| a.respond_to?(:call) ? a.call : a}. - join(' ') + message = + "\##{enabled_prefix} " + + ' '*@indent + + args. + map{|a| a.respond_to?(:call) ? a.call : a}. + join(' ') - if @delay - @delayed = [@delayed, message].compact*"\n" # Arrange to display this message later, if necessary - @delay = false - else - if @delayed - display key, @delayed # Display a delayed message, then the current one - @delayed = nil - @delay = false - end - display key, message - end + if @delay + @delayed = [@delayed, message].compact*"\n" # Arrange to display this message later, if necessary + @delay = false + else + if @delayed + display key, @delayed # Display a delayed message, then the current one + @delayed = nil + @delay = false + end + display key, message + end end @indent += (enabled_prefix ? 1 : 0) !!enabled_prefix end private def selected?(args) # Figure out whether this trace is enabled (itself or by :all), if it nests, and if we should print the key: @delay = false key = - if Symbol === args[0] - control = args.shift - case s = control.to_s - when /!\Z/ # Enable all nested trace calls - nested = true - s.sub(/!\Z/, '').to_sym - when /\?\Z/ # Delay this message until a nested active trace - @delay = true - s.sub(/\?\Z/, '').to_sym - else - control - end - else - :all - end + if Symbol === args[0] + control = args.shift + case s = control.to_s + when /!\Z/ # Enable all nested trace calls + nested = true + s.sub(/!\Z/, '').to_sym + when /\?\Z/ # Delay this message until a nested active trace + @delay = true + s.sub(/\?\Z/, '').to_sym + else + control + end + else + :all + end - @available[key] ||= key # Remember that this trace was requested, for help - if @nested || # This trace is enabled because it's in a nested block - @keys[key] || # This trace is enabled in its own right - @keys[:all] # This trace is enabled because all are - if @keys[:keys] || @keys[:all] # Use a formatting prefix? - enabled_prefix = " %-15s"%key - @keys[key] = enabled_prefix if @keys[key] == true # Save the formatting prefix - else - enabled_prefix = '' - end - @nested ||= nested # Activate nesting, if requested + @available[key] ||= key # Remember that this trace was requested, for help + if @nested || # This trace is enabled because it's in a nested block + @keys[key] || # This trace is enabled in its own right + @keys[:all] # This trace is enabled because all are + if @keys[:keys] || @keys[:all] # Use a formatting prefix? + enabled_prefix = " %-15s"%key + @keys[key] = enabled_prefix if @keys[key] == true # Save the formatting prefix + else + enabled_prefix = '' + end + @nested ||= nested # Activate nesting, if requested end [key, enabled_prefix] end @@ -285,10 +285,10 @@ class Object def trace *args, &block begin # This monstrosity reduces the steps when single-stepping: tracer = (Tracing.tracer ||= Tracing::Tracer.new) and - (old_indent, old_nested, old_delayed, enabled = tracer.indent, tracer.nested, tracer.delayed, tracer.show(*args)) + (old_indent, old_nested, old_delayed, enabled = tracer.indent, tracer.nested, tracer.delayed, tracer.show(*args)) block ? yield : (args.size == 0 ? tracer : enabled) ensure tracer.indent, tracer.nested, tracer.delayed = old_indent, old_nested, old_delayed end