| Class | DEBUGGER__ |
| In: |
lib/debug.rb
|
| Parent: | Object |
| MUTEX | = | Mutex.new |
# File lib/debug.rb, line 838
838: def context(thread=Thread.current)
839: c = thread[:__debugger_data__]
840: unless c
841: thread[:__debugger_data__] = c = Context.new
842: end
843: c
844: end
# File lib/debug.rb, line 894
894: def debug_thread_info(input, binding)
895: case input
896: when /^l(?:ist)?/
897: make_thread_list
898: thread_list_all
899:
900: when /^c(?:ur(?:rent)?)?$/
901: make_thread_list
902: thread_list(@thread_list[Thread.current])
903:
904: when /^(?:sw(?:itch)?\s+)?(\d+)/
905: make_thread_list
906: th = get_thread($1.to_i)
907: if th == Thread.current
908: @stdout.print "It's the current thread.\n"
909: else
910: thread_list(@thread_list[th])
911: context(th).stop_next
912: th.run
913: return :cont
914: end
915:
916: when /^stop\s+(\d+)/
917: make_thread_list
918: th = get_thread($1.to_i)
919: if th == Thread.current
920: @stdout.print "It's the current thread.\n"
921: elsif th.stop?
922: @stdout.print "Already stopped.\n"
923: else
924: thread_list(@thread_list[th])
925: context(th).suspend
926: end
927:
928: when /^resume\s+(\d+)/
929: make_thread_list
930: th = get_thread($1.to_i)
931: if th == Thread.current
932: @stdout.print "It's the current thread.\n"
933: elsif !th.stop?
934: @stdout.print "Already running."
935: else
936: thread_list(@thread_list[th])
937: th.run
938: end
939: end
940: end
# File lib/debug.rb, line 850
850: def get_thread(num)
851: th = @thread_list.index(num)
852: unless th
853: @stdout.print "No thread ##{num}\n"
854: throw :debug_error
855: end
856: th
857: end
# File lib/debug.rb, line 881
881: def make_thread_list
882: hash = {}
883: for th in Thread::list
884: if @thread_list.key? th
885: hash[th] = @thread_list[th]
886: else
887: @max_thread += 1
888: hash[th] = @max_thread
889: end
890: end
891: @thread_list = hash
892: end
# File lib/debug.rb, line 821
821: def resume
822: saved_crit = Thread.critical
823: Thread.critical = true
824: make_thread_list
825: for th, in @thread_list
826: next if th == Thread.current
827: context(th).clear_suspend
828: end
829: waiting.each do |th|
830: th.run
831: end
832: waiting.clear
833: Thread.critical = saved_crit
834: # Schedule other threads to restart as soon as possible.
835: Thread.pass
836: end
# File lib/debug.rb, line 793
793: def set_trace( arg )
794: saved_crit = Thread.critical
795: Thread.critical = true
796: make_thread_list
797: for th, in @thread_list
798: context(th).set_trace arg
799: end
800: Thread.critical = saved_crit
801: arg
802: end
# File lib/debug.rb, line 808
808: def suspend
809: saved_crit = Thread.critical
810: Thread.critical = true
811: make_thread_list
812: for th, in @thread_list
813: next if th == Thread.current
814: context(th).set_suspend
815: end
816: Thread.critical = saved_crit
817: # Schedule other threads to suspend as soon as possible.
818: Thread.pass unless Thread.critical
819: end
# File lib/debug.rb, line 859
859: def thread_list(num)
860: th = get_thread(num)
861: if th == Thread.current
862: @stdout.print "+"
863: else
864: @stdout.print " "
865: end
866: @stdout.printf "%d ", num
867: @stdout.print th.inspect, "\t"
868: file = context(th).instance_eval{@file}
869: if file
870: @stdout.print file,":",context(th).instance_eval{@line}
871: end
872: @stdout.print "\n"
873: end