478 self.debugMod.__dict__['__file__'] = sys.argv[0] |
478 self.debugMod.__dict__['__file__'] = sys.argv[0] |
479 sys.modules['__main__'] = self.debugMod |
479 sys.modules['__main__'] = self.debugMod |
480 res = 0 |
480 res = 0 |
481 code = self.__compileFileSource(self.running) |
481 code = self.__compileFileSource(self.running) |
482 if code: |
482 if code: |
483 self.mainThread.run(code, self.debugMod.__dict__, debug=False) |
483 self.mainThread.run(code, self.debugMod.__dict__, debug=False, |
|
484 closeSession=False) |
484 |
485 |
485 elif method == "RequestCoverage": |
486 elif method == "RequestCoverage": |
486 from coverage import Coverage |
487 from coverage import Coverage |
487 self.disassembly = None |
488 self.disassembly = None |
488 sys.argv = [] |
489 sys.argv = [] |
512 self.debugMod.__dict__['__file__'] = sys.argv[0] |
513 self.debugMod.__dict__['__file__'] = sys.argv[0] |
513 code = self.__compileFileSource(sys.argv[0]) |
514 code = self.__compileFileSource(sys.argv[0]) |
514 if code: |
515 if code: |
515 self.running = sys.argv[0] |
516 self.running = sys.argv[0] |
516 self.cover.start() |
517 self.cover.start() |
517 self.mainThread.run(code, self.debugMod.__dict__, debug=False) |
518 self.mainThread.run(code, self.debugMod.__dict__, debug=False, |
|
519 closeSession=False) |
518 self.cover.stop() |
520 self.cover.stop() |
519 self.cover.save() |
521 self.cover.save() |
520 |
522 |
521 elif method == "RequestProfile": |
523 elif method == "RequestProfile": |
522 sys.setprofile(None) |
524 sys.setprofile(None) |
562 except Exception: |
564 except Exception: |
563 excinfo = sys.exc_info() |
565 excinfo = sys.exc_info() |
564 self.__unhandled_exception(*excinfo) |
566 self.__unhandled_exception(*excinfo) |
565 |
567 |
566 self.prof.save() |
568 self.prof.save() |
567 self.progTerminated(res) |
569 self.progTerminated(res, closeSession=False) |
568 |
570 |
569 elif method == "ExecuteStatement": |
571 elif method == "ExecuteStatement": |
570 if self.buffer: |
572 if self.buffer: |
571 self.buffer = self.buffer + '\n' + params["statement"] |
573 self.buffer = self.buffer + '\n' + params["statement"] |
572 else: |
574 else: |
821 }) |
823 }) |
822 |
824 |
823 elif method == "RequestUTPrepare": |
825 elif method == "RequestUTPrepare": |
824 if params["syspath"]: |
826 if params["syspath"]: |
825 sys.path = params["syspath"] + sys.path |
827 sys.path = params["syspath"] + sys.path |
826 sys.path.insert( |
|
827 0, os.path.dirname(os.path.abspath(params["filename"]))) |
|
828 top_level_dir = None |
828 top_level_dir = None |
829 if params["workdir"]: |
829 if params["workdir"]: |
830 os.chdir(params["workdir"]) |
830 os.chdir(params["workdir"]) |
831 top_level_dir = params["workdir"] |
831 top_level_dir = params["workdir"] |
832 else: |
|
833 os.chdir(sys.path[0]) |
|
834 |
832 |
835 # set the system exception handling function to ensure, that |
833 # set the system exception handling function to ensure, that |
836 # we report on all unhandled exceptions |
834 # we report on all unhandled exceptions |
837 sys.excepthook = self.__unhandled_exception |
835 sys.excepthook = self.__unhandled_exception |
838 self.__interceptSignals() |
836 self.__interceptSignals() |
842 testLoader = unittest.TestLoader() |
840 testLoader = unittest.TestLoader() |
843 if params["discover"]: |
841 if params["discover"]: |
844 discoveryStart = params["discoverystart"] |
842 discoveryStart = params["discoverystart"] |
845 if not discoveryStart: |
843 if not discoveryStart: |
846 discoveryStart = params["workdir"] |
844 discoveryStart = params["workdir"] |
|
845 sys.path.insert( |
|
846 0, os.path.abspath(discoveryStart)) |
847 if params["testcases"]: |
847 if params["testcases"]: |
848 self.test = testLoader.loadTestsFromNames( |
848 self.test = testLoader.loadTestsFromNames( |
849 params["testcases"]) |
849 params["testcases"]) |
850 else: |
850 else: |
851 self.test = testLoader.discover( |
851 self.test = testLoader.discover( |
852 discoveryStart, top_level_dir=top_level_dir) |
852 discoveryStart, top_level_dir=top_level_dir) |
853 else: |
853 else: |
|
854 sys.path.insert( |
|
855 0, |
|
856 os.path.dirname(os.path.abspath(params["filename"])) |
|
857 ) |
854 if params["filename"]: |
858 if params["filename"]: |
855 spec = importlib.util.spec_from_file_location( |
859 spec = importlib.util.spec_from_file_location( |
856 params["testname"], params["filename"]) |
860 params["testname"], params["filename"]) |
857 utModule = importlib.util.module_from_spec(spec) |
861 utModule = importlib.util.module_from_spec(spec) |
858 else: |
862 else: |
911 self.threads.clear() |
915 self.threads.clear() |
912 self.attachThread(mainThread=True) |
916 self.attachThread(mainThread=True) |
913 sys.setprofile(None) |
917 sys.setprofile(None) |
914 self.mainThread.run( |
918 self.mainThread.run( |
915 "result = self.test.run(self.testResult)\n", |
919 "result = self.test.run(self.testResult)\n", |
916 localsDict=locals_) |
920 localsDict=locals_, closeSession=False) |
917 result = locals_["result"] |
921 result = locals_["result"] |
918 else: |
922 else: |
919 result = self.test.run(self.testResult) |
923 result = self.test.run(self.testResult) |
920 if self.cover: |
924 if self.cover: |
921 self.cover.stop() |
925 self.cover.stop() |
1418 |
1422 |
1419 @return flag indicating a running debug session (boolean) |
1423 @return flag indicating a running debug session (boolean) |
1420 """ |
1424 """ |
1421 return self.running |
1425 return self.running |
1422 |
1426 |
1423 def progTerminated(self, status, message=""): |
1427 def progTerminated(self, status, message="", closeSession=True): |
1424 """ |
1428 """ |
1425 Public method to tell the debugger that the program has terminated. |
1429 Public method to tell the debugger that the program has terminated. |
1426 |
1430 |
1427 @param status return status |
1431 @param status return status |
1428 @type int |
1432 @type int |
1429 @param message status message |
1433 @param message status message |
1430 @type str |
1434 @type str |
|
1435 @param closeSession flag indicating to close the debugger session |
|
1436 @type bool |
1431 """ |
1437 """ |
1432 if status is None: |
1438 if status is None: |
1433 status = 0 |
1439 status = 0 |
1434 elif not isinstance(status, int): |
1440 elif not isinstance(status, int): |
1435 message = str(status) |
1441 message = str(status) |
1448 }) |
1454 }) |
1449 |
1455 |
1450 # reset coding |
1456 # reset coding |
1451 self.__coding = self.defaultCoding |
1457 self.__coding = self.defaultCoding |
1452 |
1458 |
1453 self.sessionClose(False) |
1459 if closeSession: |
|
1460 self.sessionClose(False) |
1454 |
1461 |
1455 def __dumpVariables(self, frmnr, scope, filterList): |
1462 def __dumpVariables(self, frmnr, scope, filterList): |
1456 """ |
1463 """ |
1457 Private method to return the variables of a frame to the debug server. |
1464 Private method to return the variables of a frame to the debug server. |
1458 |
1465 |
2103 self.multiprocessSupport = multiprocessSupport |
2110 self.multiprocessSupport = multiprocessSupport |
2104 |
2111 |
2105 self.passive = passive |
2112 self.passive = passive |
2106 if passive: |
2113 if passive: |
2107 self.sendPassiveStartup(self.running, exceptions) |
2114 self.sendPassiveStartup(self.running, exceptions) |
2108 self.__interact() |
|
2109 |
2115 |
2110 self.attachThread(mainThread=True) |
2116 self.attachThread(mainThread=True) |
2111 self.mainThread.tracePythonLibs(tracePython) |
2117 self.mainThread.tracePythonLibs(tracePython) |
2112 |
2118 |
2113 # set the system exception handling function to ensure, that |
2119 # set the system exception handling function to ensure, that |
2150 @param *args arguments being passed to func |
2156 @param *args arguments being passed to func |
2151 @return result of the function call |
2157 @return result of the function call |
2152 """ |
2158 """ |
2153 self.startDebugger(scriptname, enableTrace=False) |
2159 self.startDebugger(scriptname, enableTrace=False) |
2154 res = self.mainThread.runcall(func, *args) |
2160 res = self.mainThread.runcall(func, *args) |
2155 self.progTerminated(res) |
2161 self.progTerminated(res, closeSession=False) |
2156 return res |
2162 return res |
2157 |
2163 |
2158 def __resolveHost(self, host): |
2164 def __resolveHost(self, host): |
2159 """ |
2165 """ |
2160 Private method to resolve a hostname to an IP address. |
2166 Private method to resolve a hostname to an IP address. |