eric6/Debugger/DebugServer.py

changeset 7251
bc5b1b00560a
parent 7249
0bf517e60f54
child 7286
7eb04391adf7
child 7360
9190402e4505
equal deleted inserted replaced
7250:d8bdc55aee1a 7251:bc5b1b00560a
10 10
11 import os 11 import os
12 import sys 12 import sys
13 13
14 from PyQt5.QtCore import pyqtSignal, QModelIndex 14 from PyQt5.QtCore import pyqtSignal, QModelIndex
15 from PyQt5.QtNetwork import QTcpServer, QHostAddress, QHostInfo, \ 15 from PyQt5.QtNetwork import (
16 QNetworkInterface 16 QTcpServer, QHostAddress, QHostInfo, QNetworkInterface
17 )
17 18
18 from E5Gui.E5Application import e5App 19 from E5Gui.E5Application import e5App
19 from E5Gui import E5MessageBox 20 from E5Gui import E5MessageBox
20 21
21 from .BreakPointModel import BreakPointModel 22 from .BreakPointModel import BreakPointModel
178 # the value 179 # the value
179 180
180 # create our models 181 # create our models
181 self.breakpointModel = BreakPointModel(self) 182 self.breakpointModel = BreakPointModel(self)
182 self.watchpointModel = WatchPointModel(self) 183 self.watchpointModel = WatchPointModel(self)
183 self.watchSpecialCreated = \ 184 self.watchSpecialCreated = self.tr(
184 self.tr("created", "must be same as in EditWatchpointDialog") 185 "created", "must be same as in EditWatchpointDialog")
185 self.watchSpecialChanged = \ 186 self.watchSpecialChanged = self.tr(
186 self.tr("changed", "must be same as in EditWatchpointDialog") 187 "changed", "must be same as in EditWatchpointDialog")
187 188
188 self.networkInterface = Preferences.getDebugger("NetworkInterface") 189 self.networkInterface = Preferences.getDebugger("NetworkInterface")
189 if self.networkInterface == "all": 190 if self.networkInterface == "all":
190 hostAddress = QHostAddress("0.0.0.0") # QHostAddress.Any) 191 hostAddress = QHostAddress("0.0.0.0") # QHostAddress.Any)
191 elif self.networkInterface == "allv6": 192 elif self.networkInterface == "allv6":
192 hostAddress = QHostAddress("::") # QHostAddress.AnyIPv6) 193 hostAddress = QHostAddress("::") # QHostAddress.AnyIPv6)
193 else: 194 else:
194 hostAddress = QHostAddress(self.networkInterface) 195 hostAddress = QHostAddress(self.networkInterface)
195 self.networkInterfaceName, self.networkInterfaceIndex = \ 196 self.networkInterfaceName, self.networkInterfaceIndex = (
196 self.__getNetworkInterfaceAndIndex(self.networkInterface) 197 self.__getNetworkInterfaceAndIndex(self.networkInterface))
197 198
198 if not preventPassiveDebugging and \ 199 if (not preventPassiveDebugging and
199 Preferences.getDebugger("PassiveDbgEnabled"): 200 Preferences.getDebugger("PassiveDbgEnabled")):
200 sock = Preferences.getDebugger("PassiveDbgPort") # default: 42424 201 sock = Preferences.getDebugger("PassiveDbgPort") # default: 42424
201 self.listen(hostAddress, sock) 202 self.listen(hostAddress, sock)
202 self.passive = True 203 self.passive = True
203 self.passiveClientExited = False 204 self.passiveClientExited = False
204 else: 205 else:
210 self.debuggerInterface = None 211 self.debuggerInterface = None
211 self.debugging = False 212 self.debugging = False
212 self.running = False 213 self.running = False
213 self.clientProcess = None 214 self.clientProcess = None
214 self.clientInterpreter = "" 215 self.clientInterpreter = ""
215 self.clientType = \ 216 self.clientType = Preferences.Prefs.settings.value('DebugClient/Type')
216 Preferences.Prefs.settings.value('DebugClient/Type')
217 if self.clientType is None: 217 if self.clientType is None:
218 self.clientType = 'Python3' 218 self.clientType = 'Python3'
219 # Change clientType if dependent interpreter does not exist anymore 219 # Change clientType if dependent interpreter does not exist anymore
220 # (maybe deinstalled,...) 220 # (maybe deinstalled,...)
221 elif self.clientType == 'Python2' and Preferences.getDebugger( 221 elif self.clientType == 'Python2' and Preferences.getDebugger(
285 if address not in ["all", "allv6"]: 285 if address not in ["all", "allv6"]:
286 for networkInterface in QNetworkInterface.allInterfaces(): 286 for networkInterface in QNetworkInterface.allInterfaces():
287 addressEntries = networkInterface.addressEntries() 287 addressEntries = networkInterface.addressEntries()
288 if len(addressEntries) > 0: 288 if len(addressEntries) > 0:
289 for addressEntry in addressEntries: 289 for addressEntry in addressEntries:
290 if addressEntry.ip().toString().lower() == \ 290 if (addressEntry.ip().toString().lower() ==
291 address.lower(): 291 address.lower()):
292 return networkInterface.humanReadableName(), \ 292 return (networkInterface.humanReadableName(),
293 networkInterface.index() 293 networkInterface.index())
294 294
295 return "", 0 295 return "", 0
296 296
297 def preferencesChanged(self): 297 def preferencesChanged(self):
298 """ 298 """
299 Public slot to handle the preferencesChanged signal. 299 Public slot to handle the preferencesChanged signal.
300 """ 300 """
301 registeredInterfaces = {} 301 registeredInterfaces = {}
302 for interfaceName in self.__debuggerInterfaces: 302 for interfaceName in self.__debuggerInterfaces:
303 registeredInterfaces[interfaceName] = \ 303 registeredInterfaces[interfaceName] = (
304 self.__debuggerInterfaces[interfaceName] 304 self.__debuggerInterfaces[interfaceName])
305 305
306 self.__debuggerInterfaceRegistry = {} 306 self.__debuggerInterfaceRegistry = {}
307 for interfaceName, getRegistryData in registeredInterfaces.items(): 307 for interfaceName, getRegistryData in registeredInterfaces.items():
308 self.registerDebuggerInterface(interfaceName, getRegistryData, 308 self.registerDebuggerInterface(interfaceName, getRegistryData,
309 reregister=True) 309 reregister=True)
336 336
337 if not reregister: 337 if not reregister:
338 self.__debuggerInterfaces[interfaceName] = getRegistryData 338 self.__debuggerInterfaces[interfaceName] = getRegistryData
339 registryDataList = getRegistryData() 339 registryDataList = getRegistryData()
340 if registryDataList: 340 if registryDataList:
341 for clientLanguage, clientCapabilities, clientExtensions, \ 341 for (clientLanguage, clientCapabilities, clientExtensions,
342 interfaceCreator in registryDataList: 342 interfaceCreator) in registryDataList:
343 self.__debuggerInterfaceRegistry[clientLanguage] = [ 343 self.__debuggerInterfaceRegistry[clientLanguage] = [
344 clientCapabilities, clientExtensions, interfaceCreator, 344 clientCapabilities, clientExtensions, interfaceCreator,
345 interfaceName] 345 interfaceName]
346 346
347 def unregisterDebuggerInterface(self, interfaceName): 347 def unregisterDebuggerInterface(self, interfaceName):
351 @param interfaceName interfaceName of the debugger interface 351 @param interfaceName interfaceName of the debugger interface
352 @type str 352 @type str
353 """ 353 """
354 if interfaceName in self.__debuggerInterfaces: 354 if interfaceName in self.__debuggerInterfaces:
355 clientLanguages = [] 355 clientLanguages = []
356 for clientLanguage, registryData in \ 356 for clientLanguage, registryData in (
357 self.__debuggerInterfaceRegistry.items(): 357 self.__debuggerInterfaceRegistry.items()):
358 if interfaceName == registryData[-1]: 358 if interfaceName == registryData[-1]:
359 clientLanguages.append(clientLanguage) 359 clientLanguages.append(clientLanguage)
360 for clientLanguage in clientLanguages: 360 for clientLanguage in clientLanguages:
361 del self.__debuggerInterfaceRegistry[clientLanguage] 361 del self.__debuggerInterfaceRegistry[clientLanguage]
362 del self.__debuggerInterfaces[interfaceName] 362 del self.__debuggerInterfaces[interfaceName]
402 languages.remove("None") 402 languages.remove("None")
403 except ValueError: 403 except ValueError:
404 pass # it is not in the list 404 pass # it is not in the list
405 405
406 if shellOnly: 406 if shellOnly:
407 languages = \ 407 languages = [lang for lang in languages
408 [lang for lang in languages 408 if self.__debuggerInterfaceRegistry[lang][0] &
409 if self.__debuggerInterfaceRegistry[lang][0] & 409 DebugClientCapabilities.HasShell]
410 DebugClientCapabilities.HasShell]
411 410
412 return languages[:] 411 return languages[:]
413 412
414 def getExtensions(self, language): 413 def getExtensions(self, language):
415 """ 414 """
432 """ 431 """
433 if self.lastClientType != self.clientType or clientType is not None: 432 if self.lastClientType != self.clientType or clientType is not None:
434 if clientType is None: 433 if clientType is None:
435 clientType = self.clientType 434 clientType = self.clientType
436 if clientType in self.__debuggerInterfaceRegistry: 435 if clientType in self.__debuggerInterfaceRegistry:
437 self.debuggerInterface = \ 436 self.debuggerInterface = (
438 self.__debuggerInterfaceRegistry[clientType][2]( 437 self.__debuggerInterfaceRegistry[clientType][2](
439 self, self.passive) 438 self, self.passive))
440 else: 439 else:
441 self.debuggerInterface = \ 440 self.debuggerInterface = (
442 self.__debuggerInterfaceRegistry["None"][2]( 441 self.__debuggerInterfaceRegistry["None"][2](
443 self, self.passive) 442 self, self.passive))
444 self.clientType = "None" 443 self.clientType = "None"
445 444
446 def __setClientType(self, clType): 445 def __setClientType(self, clType):
447 """ 446 """
448 Private method to set the client type. 447 Private method to set the client type.
499 self.__forProject = forProject 498 self.__forProject = forProject
500 self.__createDebuggerInterface() 499 self.__createDebuggerInterface()
501 if forProject: 500 if forProject:
502 project = e5App().getObject("Project") 501 project = e5App().getObject("Project")
503 if not project.isDebugPropertiesLoaded(): 502 if not project.isDebugPropertiesLoaded():
504 self.clientProcess, isNetworked, clientInterpreter = \ 503 self.clientProcess, isNetworked, clientInterpreter = (
505 self.debuggerInterface.startRemote( 504 self.debuggerInterface.startRemote(
506 self.serverPort(), runInConsole, venvName, 505 self.serverPort(), runInConsole, venvName,
507 self.__originalPathString, workingDir=workingDir) 506 self.__originalPathString, workingDir=workingDir))
508 else: 507 else:
509 self.clientProcess, isNetworked, clientInterpreter = \ 508 self.clientProcess, isNetworked, clientInterpreter = (
510 self.debuggerInterface.startRemoteForProject( 509 self.debuggerInterface.startRemoteForProject(
511 self.serverPort(), runInConsole, venvName, 510 self.serverPort(), runInConsole, venvName,
512 self.__originalPathString, workingDir=workingDir) 511 self.__originalPathString, workingDir=workingDir))
513 else: 512 else:
514 self.clientProcess, isNetworked, clientInterpreter = \ 513 self.clientProcess, isNetworked, clientInterpreter = (
515 self.debuggerInterface.startRemote( 514 self.debuggerInterface.startRemote(
516 self.serverPort(), runInConsole, venvName, 515 self.serverPort(), runInConsole, venvName,
517 self.__originalPathString, workingDir=workingDir) 516 self.__originalPathString, workingDir=workingDir))
518 517
519 if self.clientProcess: 518 if self.clientProcess:
520 self.clientProcess.readyReadStandardError.connect( 519 self.clientProcess.readyReadStandardError.connect(
521 self.__clientProcessError) 520 self.__clientProcessError)
522 self.clientProcess.readyReadStandardOutput.connect( 521 self.clientProcess.readyReadStandardOutput.connect(
580 @param end end row (integer) 579 @param end end row (integer)
581 """ 580 """
582 if self.debugging: 581 if self.debugging:
583 for row in range(start, end + 1): 582 for row in range(start, end + 1):
584 index = self.breakpointModel.index(row, 0, parentIndex) 583 index = self.breakpointModel.index(row, 0, parentIndex)
585 fn, lineno = \ 584 fn, lineno = (
586 self.breakpointModel.getBreakPointByIndex(index)[0:2] 585 self.breakpointModel.getBreakPointByIndex(index)[0:2])
587 self.remoteBreakpoint(fn, lineno, False) 586 self.remoteBreakpoint(fn, lineno, False)
588 587
589 def __changeBreakPoints(self, startIndex, endIndex): 588 def __changeBreakPoints(self, startIndex, endIndex):
590 """ 589 """
591 Private slot to set changed breakpoints. 590 Private slot to set changed breakpoints.
618 @param end end row (integer) 617 @param end end row (integer)
619 """ 618 """
620 if self.debugging: 619 if self.debugging:
621 for row in range(start, end + 1): 620 for row in range(start, end + 1):
622 index = self.breakpointModel.index(row, 0, parentIndex) 621 index = self.breakpointModel.index(row, 0, parentIndex)
623 fn, line, cond, temp, enabled, ignorecount = \ 622 fn, line, cond, temp, enabled, ignorecount = (
624 self.breakpointModel.getBreakPointByIndex(index)[:6] 623 self.breakpointModel.getBreakPointByIndex(index)[:6])
625 self.remoteBreakpoint(fn, line, True, cond, temp) 624 self.remoteBreakpoint(fn, line, True, cond, temp)
626 if not enabled: 625 if not enabled:
627 self.__remoteBreakpointEnable(fn, line, False) 626 self.__remoteBreakpointEnable(fn, line, False)
628 if ignorecount: 627 if ignorecount:
629 self.__remoteBreakpointIgnore(fn, line, ignorecount) 628 self.__remoteBreakpointIgnore(fn, line, ignorecount)
685 @param end end row (integer) 684 @param end end row (integer)
686 """ 685 """
687 if self.debugging: 686 if self.debugging:
688 for row in range(start, end + 1): 687 for row in range(start, end + 1):
689 index = self.watchpointModel.index(row, 0, parentIndex) 688 index = self.watchpointModel.index(row, 0, parentIndex)
690 cond, special = \ 689 cond, special = (
691 self.watchpointModel.getWatchPointByIndex(index)[0:2] 690 self.watchpointModel.getWatchPointByIndex(index)[0:2])
692 cond = self.__makeWatchCondition(cond, special) 691 cond = self.__makeWatchCondition(cond, special)
693 self.__remoteWatchpoint(cond, False) 692 self.__remoteWatchpoint(cond, False)
694 693
695 def __watchPointDataAboutToBeChanged(self, startIndex, endIndex): 694 def __watchPointDataAboutToBeChanged(self, startIndex, endIndex):
696 """ 695 """
713 @param end end row (integer) 712 @param end end row (integer)
714 """ 713 """
715 if self.debugging: 714 if self.debugging:
716 for row in range(start, end + 1): 715 for row in range(start, end + 1):
717 index = self.watchpointModel.index(row, 0, parentIndex) 716 index = self.watchpointModel.index(row, 0, parentIndex)
718 cond, special, temp, enabled, ignorecount = \ 717 cond, special, temp, enabled, ignorecount = (
719 self.watchpointModel.getWatchPointByIndex(index)[:5] 718 self.watchpointModel.getWatchPointByIndex(index)[:5])
720 cond = self.__makeWatchCondition(cond, special) 719 cond = self.__makeWatchCondition(cond, special)
721 self.__remoteWatchpoint(cond, True, temp) 720 self.__remoteWatchpoint(cond, True, temp)
722 if not enabled: 721 if not enabled:
723 self.__remoteWatchpointEnable(cond, False) 722 self.__remoteWatchpointEnable(cond, False)
724 if ignorecount: 723 if ignorecount:

eric ide

mercurial