eric6/DebugClients/Python/DebugClientBase.py

changeset 7903
827d89937c30
parent 7901
6ff7ccf0cb50
child 7915
e68f5c568aee
equal deleted inserted replaced
7902:a5248d27c8a9 7903:827d89937c30
18 import re 18 import re
19 import atexit 19 import atexit
20 import signal 20 import signal
21 import time 21 import time
22 import types 22 import types
23 import importlib 23 import importlib.util
24 import fnmatch 24 import fnmatch
25 25
26 26
27 import DebugClientCapabilities 27 import DebugClientCapabilities
28 import DebugVariables 28 import DebugVariables
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.

eric ide

mercurial