11 |
11 |
12 import os |
12 import os |
13 |
13 |
14 from PyQt5.QtCore import pyqtSignal, QObject, Qt |
14 from PyQt5.QtCore import pyqtSignal, QObject, Qt |
15 from PyQt5.QtGui import QKeySequence |
15 from PyQt5.QtGui import QKeySequence |
16 from PyQt5.QtWidgets import QMenu, QToolBar, QApplication, QDialog, \ |
16 from PyQt5.QtWidgets import QMenu, QToolBar, QApplication, QDialog |
17 QInputDialog |
|
18 |
17 |
19 from UI.Info import Program |
18 from UI.Info import Program |
20 |
19 |
21 from .DebugClientCapabilities import HasDebugger, HasInterpreter, \ |
20 from .DebugClientCapabilities import HasDebugger, HasInterpreter, \ |
22 HasProfiler, HasCoverage |
21 HasProfiler, HasCoverage |
102 Preferences.Prefs.settings.value( |
101 Preferences.Prefs.settings.value( |
103 'DebugInfo/ForkAutomatically', False)) |
102 'DebugInfo/ForkAutomatically', False)) |
104 self.forkIntoChild = Preferences.toBool( |
103 self.forkIntoChild = Preferences.toBool( |
105 Preferences.Prefs.settings.value('DebugInfo/ForkIntoChild', False)) |
104 Preferences.Prefs.settings.value('DebugInfo/ForkIntoChild', False)) |
106 |
105 |
107 self.evalHistory = [] |
|
108 self.execHistory = [] |
|
109 self.lastDebuggedFile = None |
106 self.lastDebuggedFile = None |
110 self.lastStartAction = 0 # 0=None, 1=Script, 2=Project |
107 self.lastStartAction = 0 # 0=None, 1=Script, 2=Project |
111 self.clientType = "" |
108 self.clientType = "" |
112 self.lastAction = -1 |
109 self.lastAction = -1 |
113 self.debugActions = [ |
110 self.debugActions = [ |
426 """<p>Stop the running debugging session.</p>""" |
423 """<p>Stop the running debugging session.</p>""" |
427 )) |
424 )) |
428 act.triggered.connect(self.__stepQuit) |
425 act.triggered.connect(self.__stepQuit) |
429 self.actions.append(act) |
426 self.actions.append(act) |
430 |
427 |
431 self.debugActGrp2 = createActionGroup(self) |
|
432 |
|
433 act = E5Action( |
|
434 self.tr('Evaluate'), |
|
435 self.tr('E&valuate...'), |
|
436 0, 0, self.debugActGrp2, 'dbg_evaluate') |
|
437 act.setStatusTip(self.tr('Evaluate in current context')) |
|
438 act.setWhatsThis(self.tr( |
|
439 """<b>Evaluate</b>""" |
|
440 """<p>Evaluate an expression in the current context of the""" |
|
441 """ debugged program. The result is displayed in the""" |
|
442 """ shell window.</p>""" |
|
443 )) |
|
444 act.triggered.connect(self.__eval) |
|
445 self.actions.append(act) |
|
446 |
|
447 act = E5Action( |
|
448 self.tr('Execute'), |
|
449 self.tr('E&xecute...'), |
|
450 0, 0, self.debugActGrp2, 'dbg_execute') |
|
451 act.setStatusTip( |
|
452 self.tr('Execute a one line statement in the current context')) |
|
453 act.setWhatsThis(self.tr( |
|
454 """<b>Execute</b>""" |
|
455 """<p>Execute a one line statement in the current context""" |
|
456 """ of the debugged program.</p>""" |
|
457 )) |
|
458 act.triggered.connect(self.__exec) |
|
459 self.actions.append(act) |
|
460 |
|
461 self.dbgFilterAct = E5Action( |
428 self.dbgFilterAct = E5Action( |
462 self.tr('Variables Type Filter'), |
429 self.tr('Variables Type Filter'), |
463 self.tr('Varia&bles Type Filter...'), 0, 0, self, |
430 self.tr('Varia&bles Type Filter...'), 0, 0, self, |
464 'dbg_variables_filter') |
431 'dbg_variables_filter') |
465 self.dbgFilterAct.setStatusTip(self.tr( |
432 self.dbgFilterAct.setStatusTip(self.tr( |
583 )) |
550 )) |
584 act.triggered.connect(self.__clearBreakpoints) |
551 act.triggered.connect(self.__clearBreakpoints) |
585 self.actions.append(act) |
552 self.actions.append(act) |
586 |
553 |
587 self.debugActGrp.setEnabled(False) |
554 self.debugActGrp.setEnabled(False) |
588 self.debugActGrp2.setEnabled(False) |
|
589 self.dbgSetBpActGrp.setEnabled(False) |
555 self.dbgSetBpActGrp.setEnabled(False) |
590 self.runAct.setEnabled(False) |
556 self.runAct.setEnabled(False) |
591 self.runProjectAct.setEnabled(False) |
557 self.runProjectAct.setEnabled(False) |
592 self.profileAct.setEnabled(False) |
558 self.profileAct.setEnabled(False) |
593 self.profileProjectAct.setEnabled(False) |
559 self.profileProjectAct.setEnabled(False) |
625 smenu.addAction(self.coverageAct) |
591 smenu.addAction(self.coverageAct) |
626 smenu.addAction(self.coverageProjectAct) |
592 smenu.addAction(self.coverageProjectAct) |
627 |
593 |
628 dmenu.addActions(self.debugActGrp.actions()) |
594 dmenu.addActions(self.debugActGrp.actions()) |
629 dmenu.addSeparator() |
595 dmenu.addSeparator() |
630 dmenu.addActions(self.debugActGrp2.actions()) |
|
631 dmenu.addSeparator() |
|
632 dmenu.addActions(self.dbgSetBpActGrp.actions()) |
596 dmenu.addActions(self.dbgSetBpActGrp.actions()) |
633 self.menuBreakpointsAct = dmenu.addMenu(self.breakpointsMenu) |
597 self.menuBreakpointsAct = dmenu.addMenu(self.breakpointsMenu) |
634 dmenu.addSeparator() |
598 dmenu.addSeparator() |
635 dmenu.addAction(self.dbgFilterAct) |
599 dmenu.addAction(self.dbgFilterAct) |
636 dmenu.addAction(self.excFilterAct) |
600 dmenu.addAction(self.excFilterAct) |
804 self.debugAct.setEnabled(False) |
768 self.debugAct.setEnabled(False) |
805 self.runAct.setEnabled(False) |
769 self.runAct.setEnabled(False) |
806 self.profileAct.setEnabled(False) |
770 self.profileAct.setEnabled(False) |
807 self.coverageAct.setEnabled(False) |
771 self.coverageAct.setEnabled(False) |
808 self.debugActGrp.setEnabled(False) |
772 self.debugActGrp.setEnabled(False) |
809 self.debugActGrp2.setEnabled(False) |
|
810 self.dbgSetBpActGrp.setEnabled(False) |
773 self.dbgSetBpActGrp.setEnabled(False) |
811 self.lastAction = -1 |
774 self.lastAction = -1 |
812 if not self.projectOpen: |
775 if not self.projectOpen: |
813 self.restartAct.setEnabled(False) |
776 self.restartAct.setEnabled(False) |
814 self.lastDebuggedFile = None |
777 self.lastDebuggedFile = None |
1014 if not forStack: |
976 if not forStack: |
1015 self.__getThreadList() |
977 self.__getThreadList() |
1016 self.__getClientVariables() |
978 self.__getClientVariables() |
1017 |
979 |
1018 self.debugActGrp.setEnabled(True) |
980 self.debugActGrp.setEnabled(True) |
1019 self.debugActGrp2.setEnabled(True) |
|
1020 |
981 |
1021 def __clientExit(self, status): |
982 def __clientExit(self, status): |
1022 """ |
983 """ |
1023 Private method to handle the debugged program terminating. |
984 Private method to handle the debugged program terminating. |
1024 |
985 |
1190 stack.append((fn, ln, func, args)) |
1151 stack.append((fn, ln, func, args)) |
1191 self.clientStack.emit(stack) |
1152 self.clientStack.emit(stack) |
1192 self.__getClientVariables() |
1153 self.__getClientVariables() |
1193 self.ui.setDebugProfile() |
1154 self.ui.setDebugProfile() |
1194 self.debugActGrp.setEnabled(True) |
1155 self.debugActGrp.setEnabled(True) |
1195 self.debugActGrp2.setEnabled(True) |
|
1196 return |
1156 return |
1197 elif res == E5MessageBox.Ignore: |
1157 elif res == E5MessageBox.Ignore: |
1198 if exceptionType not in self.excIgnoreList: |
1158 if exceptionType not in self.excIgnoreList: |
1199 self.excIgnoreList.append(exceptionType) |
1159 self.excIgnoreList.append(exceptionType) |
1200 |
1160 |
2190 self.__enterRemote() |
2150 self.__enterRemote() |
2191 self.debugServer.remoteBreakpoint( |
2151 self.debugServer.remoteBreakpoint( |
2192 aw.getFileName(), line, 1, None, 1) |
2152 aw.getFileName(), line, 1, None, 1) |
2193 self.debugServer.remoteContinue() |
2153 self.debugServer.remoteContinue() |
2194 |
2154 |
2195 def __eval(self): |
|
2196 """ |
|
2197 Private method to handle the Eval action. |
|
2198 """ |
|
2199 # Get the command line arguments. |
|
2200 if len(self.evalHistory) > 0: |
|
2201 curr = 0 |
|
2202 else: |
|
2203 curr = -1 |
|
2204 |
|
2205 arg, ok = QInputDialog.getItem( |
|
2206 self.ui, |
|
2207 self.tr("Evaluate"), |
|
2208 self.tr("Enter the statement to evaluate"), |
|
2209 self.evalHistory, |
|
2210 curr, True) |
|
2211 |
|
2212 if ok: |
|
2213 if not arg: |
|
2214 return |
|
2215 |
|
2216 # This moves any previous occurrence of this expression to the head |
|
2217 # of the list. |
|
2218 if arg in self.evalHistory: |
|
2219 self.evalHistory.remove(arg) |
|
2220 self.evalHistory.insert(0, arg) |
|
2221 |
|
2222 self.debugServer.remoteEval(arg) |
|
2223 |
|
2224 def __exec(self): |
|
2225 """ |
|
2226 Private method to handle the Exec action. |
|
2227 """ |
|
2228 # Get the command line arguments. |
|
2229 if len(self.execHistory) > 0: |
|
2230 curr = 0 |
|
2231 else: |
|
2232 curr = -1 |
|
2233 |
|
2234 stmt, ok = QInputDialog.getItem( |
|
2235 self.ui, |
|
2236 self.tr("Execute"), |
|
2237 self.tr("Enter the statement to execute"), |
|
2238 self.execHistory, |
|
2239 curr, True) |
|
2240 |
|
2241 if ok: |
|
2242 if not stmt: |
|
2243 return |
|
2244 |
|
2245 # This moves any previous occurrence of this statement to the head |
|
2246 # of the list. |
|
2247 if stmt in self.execHistory: |
|
2248 self.execHistory.remove(stmt) |
|
2249 self.execHistory.insert(0, stmt) |
|
2250 |
|
2251 self.debugServer.remoteExec(stmt) |
|
2252 |
|
2253 def __enterRemote(self): |
2155 def __enterRemote(self): |
2254 """ |
2156 """ |
2255 Private method to update the user interface. |
2157 Private method to update the user interface. |
2256 |
2158 |
2257 This method is called just prior to executing some of |
2159 This method is called just prior to executing some of |
2258 the program being debugged. |
2160 the program being debugged. |
2259 """ |
2161 """ |
2260 # Disable further debug commands from the user. |
2162 # Disable further debug commands from the user. |
2261 self.debugActGrp.setEnabled(False) |
2163 self.debugActGrp.setEnabled(False) |
2262 self.debugActGrp2.setEnabled(False) |
|
2263 |
2164 |
2264 self.viewmanager.unhighlight(True) |
2165 self.viewmanager.unhighlight(True) |
2265 |
2166 |
2266 def getActions(self): |
2167 def getActions(self): |
2267 """ |
2168 """ |