In Files

  • debug.rb

Class/Module Index [+]

Quicksearch

DEBUGGER__

Constants

MUTEX

Public Class Methods

break_points() click to toggle source
 
               # File debug.rb, line 744
def break_points
  @break_points
end
            
context(thread=Thread.current) click to toggle source
 
               # File debug.rb, line 794
def context(thread=Thread.current)
  c = thread[:__debugger_data__]
  unless c
    thread[:__debugger_data__] = c = Context.new
  end
  c
end
            
debug_thread_info(input, binding) click to toggle source
 
               # File debug.rb, line 850
def debug_thread_info(input, binding)
  case input
  when /^l(?:ist)?/
    make_thread_list
    thread_list_all

  when /^c(?:ur(?:rent)?)?$/
    make_thread_list
    thread_list(@thread_list[Thread.current])

  when /^(?:sw(?:itch)?\s+)?(\d+)/
    make_thread_list
    th = get_thread($1.to_i)
    if th == Thread.current
      @stdout.print "It's the current thread.\n"
    else
      thread_list(@thread_list[th])
      context(th).stop_next
      th.run
      return :cont
    end

  when /^stop\s+(\d+)/
    make_thread_list
    th = get_thread($1.to_i)
    if th == Thread.current
      @stdout.print "It's the current thread.\n"
    elsif th.stop?
      @stdout.print "Already stopped.\n"
    else
      thread_list(@thread_list[th])
      context(th).suspend
    end

  when /^resume\s+(\d+)/
    make_thread_list
    th = get_thread($1.to_i)
    if th == Thread.current
      @stdout.print "It's the current thread.\n"
    elsif !th.stop?
      @stdout.print "Already running."
    else
      thread_list(@thread_list[th])
      th.run
    end
  end
end
            
display() click to toggle source
 
               # File debug.rb, line 740
def display
  @display
end
            
get_thread(num) click to toggle source
 
               # File debug.rb, line 806
def get_thread(num)
  th = @thread_list.key(num)
  unless th
    @stdout.print "No thread ##{num}\n"
    throw :debug_error
  end
  th
end
            
interrupt() click to toggle source
 
               # File debug.rb, line 802
def interrupt
  context(@last_thread).stop_next
end
            
make_thread_list() click to toggle source
 
               # File debug.rb, line 837
def make_thread_list
  hash = {}
  for th in Thread::list
    if @thread_list.key? th
      hash[th] = @thread_list[th]
    else
      @max_thread += 1
      hash[th] = @max_thread
    end
  end
  @thread_list = hash
end
            
resume() click to toggle source
 
               # File debug.rb, line 778
def resume
  MUTEX.synchronize do
    make_thread_list
    @thread_list.each do |th,|
      next if th == Thread.current
      context(th).clear_suspend
    end
    waiting.each do |th|
      th.run
    end
    waiting.clear
  end
  # Schedule other threads to restart as soon as possible.
  Thread.pass
end
            
set_last_thread(th) click to toggle source
 
               # File debug.rb, line 762
def set_last_thread(th)
  @last_thread = th
end
            
set_trace( arg ) click to toggle source
 
               # File debug.rb, line 752
def set_trace( arg )
  MUTEX.synchronize do
    make_thread_list
    for th, in @thread_list
      context(th).set_trace arg
    end
  end
  arg
end
            
stdout() click to toggle source
 
               # File debug.rb, line 732
def stdout
  @stdout
end
            
stdout=(s) click to toggle source
 
               # File debug.rb, line 736
def stdout=(s)
  @stdout = s
end
            
suspend() click to toggle source
 
               # File debug.rb, line 766
def suspend
  MUTEX.synchronize do
    make_thread_list
    for th, in @thread_list
      next if th == Thread.current
      context(th).set_suspend
    end
  end
  # Schedule other threads to suspend as soon as possible.
  Thread.pass
end
            
thread_list(num) click to toggle source
 
               # File debug.rb, line 815
def thread_list(num)
  th = get_thread(num)
  if th == Thread.current
    @stdout.print "+"
  else
    @stdout.print " "
  end
  @stdout.printf "%d ", num
  @stdout.print th.inspect, "\t"
  file = context(th).instance_eval{@file}
  if file
    @stdout.print file,":",context(th).instance_eval{@line}
  end
  @stdout.print "\n"
end
            
thread_list_all() click to toggle source
 
               # File debug.rb, line 831
def thread_list_all
  for th in @thread_list.values.sort
    thread_list(th)
  end
end
            
waiting() click to toggle source
 
               # File debug.rb, line 748
def waiting
  @waiting
end