57 |
58 |
58 self.queue = [] |
59 self.queue = [] |
59 self.__master = None |
60 self.__master = None |
60 self.__connections = {} |
61 self.__connections = {} |
61 self.__pendingConnections = [] |
62 self.__pendingConnections = [] |
|
63 self.__inShutdown = False |
62 |
64 |
63 # set default values for capabilities of clients |
65 # set default values for capabilities of clients |
64 self.clientCapabilities = ClientDefaultCapabilities |
66 self.clientCapabilities = ClientDefaultCapabilities |
65 |
67 |
66 # set translation function |
68 # set translation function |
186 self.tr("Start Debugger"), |
188 self.tr("Start Debugger"), |
187 self.tr( |
189 self.tr( |
188 """<p>No suitable Python3 environment configured.</p>""") |
190 """<p>No suitable Python3 environment configured.</p>""") |
189 ) |
191 ) |
190 return None, False, "" |
192 return None, False, "" |
|
193 |
|
194 self.__inShutdown = False |
191 |
195 |
192 debugClientType = Preferences.getDebugger("DebugClientType3") |
196 debugClientType = Preferences.getDebugger("DebugClientType3") |
193 if debugClientType == "standard": |
197 if debugClientType == "standard": |
194 debugClient = os.path.join(getConfig('ericDir'), |
198 debugClient = os.path.join(getConfig('ericDir'), |
195 "DebugClients", "Python", |
199 "DebugClients", "Python", |
263 clientEnv = {} |
267 clientEnv = {} |
264 else: |
268 else: |
265 clientEnv = os.environ.copy() |
269 clientEnv = os.environ.copy() |
266 if originalPathString: |
270 if originalPathString: |
267 clientEnv["PATH"] = originalPathString |
271 clientEnv["PATH"] = originalPathString |
268 envlist = Utilities.parseEnvironmentString( |
272 envlist = shlex.split( |
269 Preferences.getDebugger("DebugEnvironment")) |
273 Preferences.getDebugger("DebugEnvironment")) |
270 for el in envlist: |
274 for el in envlist: |
271 try: |
275 try: |
272 key, value = el.split('=', 1) |
276 key, value = el.split('=', 1) |
273 if value.startswith('"') or value.startswith("'"): |
|
274 value = value[1:-1] |
|
275 clientEnv[str(key)] = str(value) |
277 clientEnv[str(key)] = str(value) |
276 except ValueError: |
278 except ValueError: |
277 pass |
279 pass |
278 if execPath: |
280 if execPath: |
279 if "PATH" in clientEnv: |
281 if "PATH" in clientEnv: |
382 self.tr("Start Debugger"), |
384 self.tr("Start Debugger"), |
383 self.tr( |
385 self.tr( |
384 """<p>No suitable Python3 environment configured.</p>""") |
386 """<p>No suitable Python3 environment configured.</p>""") |
385 ) |
387 ) |
386 return None, self.__isNetworked, "" |
388 return None, self.__isNetworked, "" |
|
389 |
|
390 self.__inShutdown = False |
387 |
391 |
388 if project.getDebugProperty("REMOTEDEBUGGER"): |
392 if project.getDebugProperty("REMOTEDEBUGGER"): |
389 ipaddr = self.debugServer.getHostAddress(False) |
393 ipaddr = self.debugServer.getHostAddress(False) |
390 rexec = project.getDebugProperty("REMOTECOMMAND") |
394 rexec = project.getDebugProperty("REMOTECOMMAND") |
391 rhost = project.getDebugProperty("REMOTEHOST") |
395 rhost = project.getDebugProperty("REMOTEHOST") |
440 clientEnv = {} |
444 clientEnv = {} |
441 else: |
445 else: |
442 clientEnv = os.environ.copy() |
446 clientEnv = os.environ.copy() |
443 if originalPathString: |
447 if originalPathString: |
444 clientEnv["PATH"] = originalPathString |
448 clientEnv["PATH"] = originalPathString |
445 envlist = Utilities.parseEnvironmentString( |
449 envlist = shlex.split( |
446 project.getDebugProperty("ENVIRONMENTSTRING")) |
450 project.getDebugProperty("ENVIRONMENTSTRING")) |
447 for el in envlist: |
451 for el in envlist: |
448 try: |
452 try: |
449 key, value = el.split('=', 1) |
453 key, value = el.split('=', 1) |
450 if value.startswith('"') or value.startswith("'"): |
|
451 value = value[1:-1] |
|
452 clientEnv[str(key)] = str(value) |
454 clientEnv[str(key)] = str(value) |
453 except ValueError: |
455 except ValueError: |
454 pass |
456 pass |
455 if execPath: |
457 if execPath: |
456 if "PATH" in clientEnv: |
458 if "PATH" in clientEnv: |
576 del self.__connections[debuggerId] |
578 del self.__connections[debuggerId] |
577 if debuggerId == self.__master: |
579 if debuggerId == self.__master: |
578 self.__master = None |
580 self.__master = None |
579 if debuggerId in self.__autoContinued: |
581 if debuggerId in self.__autoContinued: |
580 self.__autoContinued.remove(debuggerId) |
582 self.__autoContinued.remove(debuggerId) |
581 self.debugServer.signalClientDisconnected(debuggerId) |
583 if not self.__inShutdown: |
|
584 self.debugServer.signalClientDisconnected(debuggerId) |
582 break |
585 break |
583 else: |
586 else: |
584 if sock in self.__pendingConnections: |
587 if sock in self.__pendingConnections: |
585 self.__pendingConnections.remove(sock) |
588 self.__pendingConnections.remove(sock) |
586 |
589 |
624 (Needed on Win OS) |
627 (Needed on Win OS) |
625 """ |
628 """ |
626 if not self.__master: |
629 if not self.__master: |
627 return |
630 return |
628 |
631 |
|
632 self.__inShutdown = True |
|
633 |
629 while self.__connections: |
634 while self.__connections: |
630 debuggerId, sock = self.__connections.popitem() |
635 debuggerId, sock = self.__connections.popitem() |
631 self.__shutdownSocket(sock) |
636 self.__shutdownSocket(sock) |
632 |
637 |
633 while self.__pendingConnections: |
638 while self.__pendingConnections: |
673 Public method to set the environment for a program to debug, run, ... |
678 Public method to set the environment for a program to debug, run, ... |
674 |
679 |
675 @param env environment settings |
680 @param env environment settings |
676 @type dict |
681 @type dict |
677 """ |
682 """ |
678 if self.__master: |
683 self.__sendJsonCommand("RequestEnvironment", {"environment": env}, |
679 self.__sendJsonCommand("RequestEnvironment", {"environment": env}, |
684 self.__master) |
680 self.__master) |
|
681 |
685 |
682 def remoteLoad(self, fn, argv, wd, traceInterpreter=False, |
686 def remoteLoad(self, fn, argv, wd, traceInterpreter=False, |
683 autoContinue=True, enableMultiprocess=False): |
687 autoContinue=True, enableMultiprocess=False): |
684 """ |
688 """ |
685 Public method to load a new program to debug. |
689 Public method to load a new program to debug. |
1504 elif method == "ResponseExit": |
1508 elif method == "ResponseExit": |
1505 self.__scriptName = "" |
1509 self.__scriptName = "" |
1506 self.debugServer.signalClientExit( |
1510 self.debugServer.signalClientExit( |
1507 params["program"], params["status"], params["message"], |
1511 params["program"], params["status"], params["message"], |
1508 params["debuggerId"]) |
1512 params["debuggerId"]) |
|
1513 if params["debuggerId"] == self.__master: |
|
1514 self.debugServer.signalMainClientExit() |
1509 |
1515 |
1510 elif method == "PassiveStartup": |
1516 elif method == "PassiveStartup": |
1511 self.debugServer.passiveStartUp( |
1517 self.debugServer.passiveStartUp( |
1512 self.translate(params["filename"], True), params["exceptions"], |
1518 self.translate(params["filename"], True), params["exceptions"], |
1513 params["debuggerId"]) |
1519 params["debuggerId"]) |