| require 'common/Logger' | |
| require 'common/Params' | |
| require 'common/NullLogManager' | |
| require 'common/FileLogManager' | |
| require 'common/StdoutLogManager' | |
| require 'dbgp/Utils' | |
| require 'dbgp/ThreadManager' | |
| module XoredDebugger | |
| class AbstractRunner | |
| include Logger | |
| def run | |
| debugger = nil | |
| begin | |
| # setting up logger | |
| setupLogger() | |
| # printing params to log | |
| log("Debugger params:\n" + Params.instance.to_s) | |
| unless Params.instance.valid? | |
| log('Invalid debugger params. Exitting...') | |
| return | |
| end | |
| #loading required libraries | |
| begin | |
| load_libraries | |
| rescue LoadError | |
| log('Error: ' + $!.message + '. Terminating...') | |
| begin | |
| require 'dbgp/Utils' | |
| # 998 - An internal exception in the debugger occurred | |
| InitError.new(998) | |
| rescue Exception | |
| logException($!, 'while terminating') | |
| ensure | |
| Kernel.exit | |
| end | |
| end | |
| log('Creating debugger...') | |
| @debugger = create_debugger | |
| log('Setting exit handler...') | |
| at_exit { handle_termination($!) } | |
| log('Starting debugger...') | |
| @debugger.start | |
| log('Creating thread manager') | |
| @thread_manager = ThreadManager.new(@debugger) | |
| rescue SystemExit | |
| Kernel.exit | |
| rescue Exception | |
| logException($!, ' during startup') | |
| end | |
| end | |
| def handle_termination(excpt) | |
| log('Debugger termination started:') | |
| # redirect exception to stderr if available | |
| unless excpt.nil? | |
| logException(excpt, ' was uncaught') | |
| end | |
| begin | |
| @thread_manager.terminate(excpt) unless @thread_manager.nil? | |
| rescue Exception | |
| logException($!, ' in at_exit') | |
| end | |
| begin | |
| @debugger.terminate unless @debugger.nil? | |
| rescue Exception | |
| logException($!, ' in at_exit') | |
| end | |
| log('Debugger terminated') | |
| Logger.shutdownLogger() | |
| end | |
| def create_debugger | |
| raise NotImplementedError, 'This method MUST be implemented in ancessors' | |
| end | |
| def setupLogger | |
| log = Params.instance.log | |
| new_logger = case (log) | |
| when nil | |
| NullLogManager.new | |
| when 'stdout' | |
| StdoutLogManager.new | |
| else | |
| FileLogManager.new(log) | |
| end | |
| Logger.setup(new_logger) | |
| end | |
| def load_libraries() | |
| #nothing to load by default | |
| end | |
| end | |
| end |