eric6/Debugger/DebugServer.py

branch
maintenance
changeset 8176
31965986ecd1
parent 8142
43248bafe9b2
parent 8163
29fb6d420a25
child 8273
698ae46f40a4
equal deleted inserted replaced
8153:e01ae92db699 8176:31965986ecd1
170 passiveDebugStarted = pyqtSignal(str, bool) 170 passiveDebugStarted = pyqtSignal(str, bool)
171 callTraceInfo = pyqtSignal(bool, str, str, str, str, str, str, str) 171 callTraceInfo = pyqtSignal(bool, str, str, str, str, str, str, str)
172 appendStdout = pyqtSignal(str) 172 appendStdout = pyqtSignal(str)
173 173
174 def __init__(self, originalPathString, preventPassiveDebugging=False, 174 def __init__(self, originalPathString, preventPassiveDebugging=False,
175 project=None): 175 project=None, parent=None):
176 """ 176 """
177 Constructor 177 Constructor
178 178
179 @param originalPathString original PATH environment variable 179 @param originalPathString original PATH environment variable
180 @type str 180 @type str
181 @param preventPassiveDebugging flag overriding the PassiveDbgEnabled 181 @param preventPassiveDebugging flag overriding the PassiveDbgEnabled
182 setting (defaults to False) 182 setting (defaults to False)
183 @type bool (optional) 183 @type bool (optional)
184 @param project reference to the project object (defaults to None) 184 @param project reference to the project object (defaults to None)
185 @type Project (optional) 185 @type Project (optional)
186 """ 186 @param parent reference to the parent object
187 super(DebugServer, self).__init__() 187 @type QObject
188 """
189 super(DebugServer, self).__init__(parent)
188 190
189 self.__originalPathString = originalPathString 191 self.__originalPathString = originalPathString
190 192
191 self.__debuggerInterfaces = {} 193 self.__debuggerInterfaces = {}
192 # the interface name is the key, a function to get the 194 # the interface name is the key, a function to get the
210 self.__reportedBreakpointIssues = [] 212 self.__reportedBreakpointIssues = []
211 self.__reportedWatchpointIssues = [] 213 self.__reportedWatchpointIssues = []
212 214
213 self.networkInterface = Preferences.getDebugger("NetworkInterface") 215 self.networkInterface = Preferences.getDebugger("NetworkInterface")
214 if self.networkInterface == "all": 216 if self.networkInterface == "all":
215 hostAddress = QHostAddress("0.0.0.0") # QHostAddress.Any) # secok 217 hostAddress = QHostAddress("0.0.0.0")
218 # QHostAddress.SpecialAddress.Any) # secok
216 elif self.networkInterface == "allv6": 219 elif self.networkInterface == "allv6":
217 hostAddress = QHostAddress("::") # QHostAddress.AnyIPv6) 220 hostAddress = QHostAddress("::")
221 # QHostAddress.SpecialAddress.AnyIPv6)
218 else: 222 else:
219 hostAddress = QHostAddress(self.networkInterface) 223 hostAddress = QHostAddress(self.networkInterface)
220 self.networkInterfaceName, self.networkInterfaceIndex = ( 224 self.networkInterfaceName, self.networkInterfaceIndex = (
221 self.__getNetworkInterfaceAndIndex(self.networkInterface)) 225 self.__getNetworkInterfaceAndIndex(self.networkInterface))
222 226
478 self.clientType = clType 482 self.clientType = clType
479 Preferences.Prefs.settings.setValue( 483 Preferences.Prefs.settings.setValue(
480 'DebugClient/Type', self.clientType) 484 'DebugClient/Type', self.clientType)
481 485
482 def startClient(self, unplanned=True, clType=None, forProject=False, 486 def startClient(self, unplanned=True, clType=None, forProject=False,
483 runInConsole=False, venvName="", workingDir=None): 487 runInConsole=False, venvName="", workingDir=None,
488 configOverride=None):
484 """ 489 """
485 Public method to start a debug client. 490 Public method to start a debug client.
486 491
487 @param unplanned flag indicating that the client has died 492 @param unplanned flag indicating that the client has died
488 @type bool 493 @type bool
495 @type bool 500 @type bool
496 @param venvName name of the virtual environment to be used 501 @param venvName name of the virtual environment to be used
497 @type str 502 @type str
498 @param workingDir directory to start the debugger client in 503 @param workingDir directory to start the debugger client in
499 @type str 504 @type str
505 @param configOverride dictionary containing the global config override
506 data
507 @type dict
500 """ 508 """
501 self.running = False 509 self.running = False
502 510
503 if not self.passive or not self.passiveClientExited: 511 if not self.passive or not self.passiveClientExited:
504 if self.debuggerInterface and self.debuggerInterface.isConnected(): 512 if self.debuggerInterface and self.debuggerInterface.isConnected():
527 project = e5App().getObject("Project") 535 project = e5App().getObject("Project")
528 if not project.isDebugPropertiesLoaded(): 536 if not project.isDebugPropertiesLoaded():
529 self.clientProcess, isNetworked, clientInterpreter = ( 537 self.clientProcess, isNetworked, clientInterpreter = (
530 self.debuggerInterface.startRemote( 538 self.debuggerInterface.startRemote(
531 self.serverPort(), runInConsole, venvName, 539 self.serverPort(), runInConsole, venvName,
532 self.__originalPathString, workingDir=workingDir)) 540 self.__originalPathString, workingDir=workingDir,
541 configOverride=configOverride))
533 else: 542 else:
534 self.clientProcess, isNetworked, clientInterpreter = ( 543 self.clientProcess, isNetworked, clientInterpreter = (
535 self.debuggerInterface.startRemoteForProject( 544 self.debuggerInterface.startRemoteForProject(
536 self.serverPort(), runInConsole, venvName, 545 self.serverPort(), runInConsole, venvName,
537 self.__originalPathString, workingDir=workingDir)) 546 self.__originalPathString, workingDir=workingDir,
547 configOverride=configOverride))
538 else: 548 else:
539 self.clientProcess, isNetworked, clientInterpreter = ( 549 self.clientProcess, isNetworked, clientInterpreter = (
540 self.debuggerInterface.startRemote( 550 self.debuggerInterface.startRemote(
541 self.serverPort(), runInConsole, venvName, 551 self.serverPort(), runInConsole, venvName,
542 self.__originalPathString, workingDir=workingDir)) 552 self.__originalPathString, workingDir=workingDir,
553 configOverride=configOverride))
543 554
544 if self.clientProcess: 555 if self.clientProcess:
545 self.clientProcess.readyReadStandardError.connect( 556 self.clientProcess.readyReadStandardError.connect(
546 self.__clientProcessError) 557 self.__clientProcessError)
547 self.clientProcess.readyReadStandardOutput.connect( 558 self.clientProcess.readyReadStandardOutput.connect(
927 self.debuggerInterface.remoteEnvironment(envdict) 938 self.debuggerInterface.remoteEnvironment(envdict)
928 939
929 def remoteLoad(self, venvName, fn, argv, wd, env, autoClearShell=True, 940 def remoteLoad(self, venvName, fn, argv, wd, env, autoClearShell=True,
930 tracePython=False, autoContinue=True, forProject=False, 941 tracePython=False, autoContinue=True, forProject=False,
931 runInConsole=False, clientType="", enableCallTrace=False, 942 runInConsole=False, clientType="", enableCallTrace=False,
932 enableMultiprocess=False, multiprocessNoDebug=""): 943 enableMultiprocess=False, multiprocessNoDebug="",
944 configOverride=None):
933 """ 945 """
934 Public method to load a new program to debug. 946 Public method to load a new program to debug.
935 947
936 @param venvName name of the virtual environment to be used 948 @param venvName name of the virtual environment to be used
937 @type str 949 @type str
966 debugging 978 debugging
967 @type bool 979 @type bool
968 @param multiprocessNoDebug space separated list of programs not to be 980 @param multiprocessNoDebug space separated list of programs not to be
969 debugged 981 debugged
970 @type str 982 @type str
983 @param configOverride dictionary containing the global config override
984 data
985 @type dict
971 """ 986 """
972 self.__autoClearShell = autoClearShell 987 self.__autoClearShell = autoClearShell
973 self.__multiprocessNoDebugList = [ 988 self.__multiprocessNoDebugList = [
974 s.strip() for s in multiprocessNoDebug.split(os.pathsep) 989 s.strip() for s in multiprocessNoDebug.split(os.pathsep)
975 ] 990 ]
993 self.__setClientType( 1008 self.__setClientType(
994 self.__findLanguageForExtension(os.path.splitext(fn)[1])) 1009 self.__findLanguageForExtension(os.path.splitext(fn)[1]))
995 except KeyError: 1010 except KeyError:
996 self.__setClientType('Python3') # assume it is a Python3 file 1011 self.__setClientType('Python3') # assume it is a Python3 file
997 self.startClient(False, forProject=forProject, 1012 self.startClient(False, forProject=forProject,
998 runInConsole=runInConsole, venvName=venvName) 1013 runInConsole=runInConsole, venvName=venvName,
1014 configOverride=configOverride)
999 1015
1000 self.setCallTraceEnabled("", enableCallTrace) 1016 self.setCallTraceEnabled("", enableCallTrace)
1001 self.remoteEnvironment(env) 1017 self.remoteEnvironment(env)
1002 1018
1003 self.debuggerInterface.remoteLoad( 1019 self.debuggerInterface.remoteLoad(
1009 self.__restoreBreakpoints() 1025 self.__restoreBreakpoints()
1010 self.__restoreWatchpoints() 1026 self.__restoreWatchpoints()
1011 self.__restoreNoDebugList() 1027 self.__restoreNoDebugList()
1012 1028
1013 def remoteRun(self, venvName, fn, argv, wd, env, autoClearShell=True, 1029 def remoteRun(self, venvName, fn, argv, wd, env, autoClearShell=True,
1014 forProject=False, runInConsole=False, clientType=""): 1030 forProject=False, runInConsole=False, clientType="",
1031 configOverride=None):
1015 """ 1032 """
1016 Public method to load a new program to run. 1033 Public method to load a new program to run.
1017 1034
1018 @param venvName name of the virtual environment to be used 1035 @param venvName name of the virtual environment to be used
1019 @type str 1036 @type str
1033 @param runInConsole flag indicating to start the debugger in a 1050 @param runInConsole flag indicating to start the debugger in a
1034 console window 1051 console window
1035 @type bool 1052 @type bool
1036 @param clientType client type to be used 1053 @param clientType client type to be used
1037 @type str 1054 @type str
1055 @param configOverride dictionary containing the global config override
1056 data
1057 @type dict
1038 """ 1058 """
1039 self.__autoClearShell = autoClearShell 1059 self.__autoClearShell = autoClearShell
1040 1060
1041 if clientType not in self.getSupportedLanguages(): 1061 if clientType not in self.getSupportedLanguages():
1042 E5MessageBox.critical( 1062 E5MessageBox.critical(
1057 self.__setClientType( 1077 self.__setClientType(
1058 self.__findLanguageForExtension(os.path.splitext(fn)[1])) 1078 self.__findLanguageForExtension(os.path.splitext(fn)[1]))
1059 except KeyError: 1079 except KeyError:
1060 self.__setClientType('Python3') # assume it is a Python3 file 1080 self.__setClientType('Python3') # assume it is a Python3 file
1061 self.startClient(False, forProject=forProject, 1081 self.startClient(False, forProject=forProject,
1062 runInConsole=runInConsole, venvName=venvName) 1082 runInConsole=runInConsole, venvName=venvName,
1083 configOverride=configOverride)
1063 1084
1064 self.remoteEnvironment(env) 1085 self.remoteEnvironment(env)
1065 1086
1066 self.debuggerInterface.remoteRun(fn, argv, wd) 1087 self.debuggerInterface.remoteRun(fn, argv, wd)
1067 self.debugging = False 1088 self.debugging = False
1068 self.running = True 1089 self.running = True
1069 1090
1070 def remoteCoverage(self, venvName, fn, argv, wd, env, 1091 def remoteCoverage(self, venvName, fn, argv, wd, env,
1071 autoClearShell=True, erase=False, forProject=False, 1092 autoClearShell=True, erase=False, forProject=False,
1072 runInConsole=False, clientType=""): 1093 runInConsole=False, clientType="", configOverride=None):
1073 """ 1094 """
1074 Public method to load a new program to collect coverage data. 1095 Public method to load a new program to collect coverage data.
1075 1096
1076 @param venvName name of the virtual environment to be used 1097 @param venvName name of the virtual environment to be used
1077 @type str 1098 @type str
1094 @param runInConsole flag indicating to start the debugger in a 1115 @param runInConsole flag indicating to start the debugger in a
1095 console window 1116 console window
1096 @type bool 1117 @type bool
1097 @param clientType client type to be used 1118 @param clientType client type to be used
1098 @type str 1119 @type str
1120 @param configOverride dictionary containing the global config override
1121 data
1122 @type dict
1099 """ 1123 """
1100 self.__autoClearShell = autoClearShell 1124 self.__autoClearShell = autoClearShell
1101 1125
1102 if clientType not in self.getSupportedLanguages(): 1126 if clientType not in self.getSupportedLanguages():
1103 # a not supported client language was requested 1127 # a not supported client language was requested
1118 self.__setClientType( 1142 self.__setClientType(
1119 self.__findLanguageForExtension(os.path.splitext(fn)[1])) 1143 self.__findLanguageForExtension(os.path.splitext(fn)[1]))
1120 except KeyError: 1144 except KeyError:
1121 self.__setClientType('Python3') # assume it is a Python3 file 1145 self.__setClientType('Python3') # assume it is a Python3 file
1122 self.startClient(False, forProject=forProject, 1146 self.startClient(False, forProject=forProject,
1123 runInConsole=runInConsole, venvName=venvName) 1147 runInConsole=runInConsole, venvName=venvName,
1148 configOverride=configOverride)
1124 1149
1125 self.remoteEnvironment(env) 1150 self.remoteEnvironment(env)
1126 1151
1127 self.debuggerInterface.remoteCoverage(fn, argv, wd, erase) 1152 self.debuggerInterface.remoteCoverage(fn, argv, wd, erase)
1128 self.debugging = False 1153 self.debugging = False
1129 self.running = True 1154 self.running = True
1130 1155
1131 def remoteProfile(self, venvName, fn, argv, wd, env, 1156 def remoteProfile(self, venvName, fn, argv, wd, env,
1132 autoClearShell=True, erase=False, forProject=False, 1157 autoClearShell=True, erase=False, forProject=False,
1133 runInConsole=False, clientType=""): 1158 runInConsole=False, clientType="", configOverride=None):
1134 """ 1159 """
1135 Public method to load a new program to collect profiling data. 1160 Public method to load a new program to collect profiling data.
1136 1161
1137 @param venvName name of the virtual environment to be used 1162 @param venvName name of the virtual environment to be used
1138 @type str 1163 @type str
1155 @param runInConsole flag indicating to start the debugger in a 1180 @param runInConsole flag indicating to start the debugger in a
1156 console window 1181 console window
1157 @type bool 1182 @type bool
1158 @param clientType client type to be used 1183 @param clientType client type to be used
1159 @type str 1184 @type str
1185 @param configOverride dictionary containing the global config override
1186 data
1187 @type dict
1160 """ 1188 """
1161 self.__autoClearShell = autoClearShell 1189 self.__autoClearShell = autoClearShell
1162 1190
1163 if clientType not in self.getSupportedLanguages(): 1191 if clientType not in self.getSupportedLanguages():
1164 # a not supported client language was requested 1192 # a not supported client language was requested
1179 self.__setClientType( 1207 self.__setClientType(
1180 self.__findLanguageForExtension(os.path.splitext(fn)[1])) 1208 self.__findLanguageForExtension(os.path.splitext(fn)[1]))
1181 except KeyError: 1209 except KeyError:
1182 self.__setClientType('Python3') # assume it is a Python3 file 1210 self.__setClientType('Python3') # assume it is a Python3 file
1183 self.startClient(False, forProject=forProject, 1211 self.startClient(False, forProject=forProject,
1184 runInConsole=runInConsole, venvName=venvName) 1212 runInConsole=runInConsole, venvName=venvName,
1213 configOverride=configOverride)
1185 1214
1186 self.remoteEnvironment(env) 1215 self.remoteEnvironment(env)
1187 1216
1188 self.debuggerInterface.remoteProfile(fn, argv, wd, erase) 1217 self.debuggerInterface.remoteProfile(fn, argv, wd, erase)
1189 self.debugging = False 1218 self.debugging = False

eric ide

mercurial