Debugger/DebugViewer.py

branch
Py2 comp.
changeset 3057
10516539f238
parent 2847
1843ef6e2656
parent 2988
f53c03574697
child 3058
0a02c433f52d
equal deleted inserted replaced
3056:9986ec0e559a 3057:10516539f238
23 from __future__ import unicode_literals # __IGNORE_WARNING__ 23 from __future__ import unicode_literals # __IGNORE_WARNING__
24 24
25 import os 25 import os
26 26
27 from PyQt4.QtCore import pyqtSignal 27 from PyQt4.QtCore import pyqtSignal
28 from PyQt4.QtGui import QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QSizePolicy, \ 28 from PyQt4.QtGui import QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, \
29 QPushButton, QComboBox, QLabel, QTreeWidget, QTreeWidgetItem, QHeaderView 29 QSizePolicy, QPushButton, QComboBox, QLabel, QTreeWidget, \
30 QTreeWidgetItem, QHeaderView
30 31
31 import UI.PixmapCache 32 import UI.PixmapCache
32 import Preferences 33 import Preferences
33 34
34 from E5Gui.E5TabWidget import E5TabWidget 35 from E5Gui.E5TabWidget import E5TabWidget
37 class DebugViewer(QWidget): 38 class DebugViewer(QWidget):
38 """ 39 """
39 Class implementing a widget conatining various debug related views. 40 Class implementing a widget conatining various debug related views.
40 41
41 The individual tabs contain the interpreter shell (optional), 42 The individual tabs contain the interpreter shell (optional),
42 the filesystem browser (optional), the two variables viewers (global and local), 43 the filesystem browser (optional), the two variables viewers
43 a breakpoint viewer, a watch expression viewer and the exception logger. Additionally 44 (global and local), a breakpoint viewer, a watch expression viewer and
44 a list of all threads is shown. 45 the exception logger. Additionally a list of all threads is shown.
45 46
46 @signal sourceFile(string, int) emitted to open a source file at a line 47 @signal sourceFile(string, int) emitted to open a source file at a line
47 """ 48 """
48 sourceFile = pyqtSignal(str, int) 49 sourceFile = pyqtSignal(str, int)
49 50
54 55
55 @param debugServer reference to the debug server object 56 @param debugServer reference to the debug server object
56 @param docked flag indicating a dock window 57 @param docked flag indicating a dock window
57 @param vm reference to the viewmanager object 58 @param vm reference to the viewmanager object
58 @param parent parent widget (QWidget) 59 @param parent parent widget (QWidget)
59 @param embeddedShell flag indicating whether the shell should be included. 60 @param embeddedShell flag indicating whether the shell should be
60 This flag is set to False by those layouts, that have the interpreter 61 included. This flag is set to False by those layouts, that have
61 shell in a separate window. 62 the interpreter shell in a separate window.
62 @param embeddedBrowser flag indicating whether the file browser should 63 @param embeddedBrowser flag indicating whether the file browser should
63 be included. This flag is set to False by those layouts, that 64 be included. This flag is set to False by those layouts, that
64 have the file browser in a separate window or embedded 65 have the file browser in a separate window or embedded
65 in the project browser instead. 66 in the project browser instead.
66 """ 67 """
67 super(DebugViewer, self).__init__(parent) 68 super(DebugViewer, self).__init__(parent)
68 69
69 self.debugServer = debugServer 70 self.debugServer = debugServer
70 self.debugUI = None 71 self.debugUI = None
110 111
111 self.glvWidgetHLayout = QHBoxLayout() 112 self.glvWidgetHLayout = QHBoxLayout()
112 self.glvWidgetHLayout.setContentsMargins(3, 3, 3, 3) 113 self.glvWidgetHLayout.setContentsMargins(3, 3, 3, 3)
113 114
114 self.globalsFilterEdit = QLineEdit(self.glvWidget) 115 self.globalsFilterEdit = QLineEdit(self.glvWidget)
115 self.globalsFilterEdit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) 116 self.globalsFilterEdit.setSizePolicy(
117 QSizePolicy.Expanding, QSizePolicy.Fixed)
116 self.glvWidgetHLayout.addWidget(self.globalsFilterEdit) 118 self.glvWidgetHLayout.addWidget(self.globalsFilterEdit)
117 self.globalsFilterEdit.setToolTip( 119 self.globalsFilterEdit.setToolTip(
118 self.trUtf8("Enter regular expression patterns separated by ';' to define " 120 self.trUtf8("Enter regular expression patterns separated by ';'"
119 "variable filters. ")) 121 " to define variable filters. "))
120 self.globalsFilterEdit.setWhatsThis( 122 self.globalsFilterEdit.setWhatsThis(
121 self.trUtf8("Enter regular expression patterns separated by ';' to define " 123 self.trUtf8("Enter regular expression patterns separated by ';'"
122 "variable filters. All variables and class attributes matched by one of " 124 " to define variable filters. All variables and"
123 "the expressions are not shown in the list above.")) 125 " class attributes matched by one of the expressions"
124 126 " are not shown in the list above."))
125 self.setGlobalsFilterButton = QPushButton(self.trUtf8('Set'), self.glvWidget) 127
128 self.setGlobalsFilterButton = QPushButton(
129 self.trUtf8('Set'), self.glvWidget)
126 self.glvWidgetHLayout.addWidget(self.setGlobalsFilterButton) 130 self.glvWidgetHLayout.addWidget(self.setGlobalsFilterButton)
127 self.glvWidgetVLayout.addLayout(self.glvWidgetHLayout) 131 self.glvWidgetVLayout.addLayout(self.glvWidgetHLayout)
128 132
129 index = self.__tabWidget.addTab(self.glvWidget, 133 index = self.__tabWidget.addTab(self.glvWidget,
130 UI.PixmapCache.getIcon("globalVariables.png"), '') 134 UI.PixmapCache.getIcon("globalVariables.png"), '')
131 self.__tabWidget.setTabToolTip(index, self.globalsViewer.windowTitle()) 135 self.__tabWidget.setTabToolTip(index, self.globalsViewer.windowTitle())
132 136
133 self.setGlobalsFilterButton.clicked[()].connect(self.__setGlobalsFilter) 137 self.setGlobalsFilterButton.clicked[()].connect(
138 self.__setGlobalsFilter)
134 self.globalsFilterEdit.returnPressed.connect(self.__setGlobalsFilter) 139 self.globalsFilterEdit.returnPressed.connect(self.__setGlobalsFilter)
135 140
136 # add the local variables viewer 141 # add the local variables viewer
137 self.lvWidget = QWidget() 142 self.lvWidget = QWidget()
138 self.lvWidgetVLayout = QVBoxLayout(self.lvWidget) 143 self.lvWidgetVLayout = QVBoxLayout(self.lvWidget)
142 147
143 self.lvWidgetHLayout1 = QHBoxLayout() 148 self.lvWidgetHLayout1 = QHBoxLayout()
144 self.lvWidgetHLayout1.setContentsMargins(3, 3, 3, 3) 149 self.lvWidgetHLayout1.setContentsMargins(3, 3, 3, 3)
145 150
146 self.stackComboBox = QComboBox(self.lvWidget) 151 self.stackComboBox = QComboBox(self.lvWidget)
147 self.stackComboBox.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) 152 self.stackComboBox.setSizePolicy(
153 QSizePolicy.Expanding, QSizePolicy.Fixed)
148 self.lvWidgetHLayout1.addWidget(self.stackComboBox) 154 self.lvWidgetHLayout1.addWidget(self.stackComboBox)
149 155
150 self.sourceButton = QPushButton(self.trUtf8('Source'), self.lvWidget) 156 self.sourceButton = QPushButton(self.trUtf8('Source'), self.lvWidget)
151 self.lvWidgetHLayout1.addWidget(self.sourceButton) 157 self.lvWidgetHLayout1.addWidget(self.sourceButton)
152 self.sourceButton.setEnabled(False) 158 self.sourceButton.setEnabled(False)
157 163
158 self.lvWidgetHLayout2 = QHBoxLayout() 164 self.lvWidgetHLayout2 = QHBoxLayout()
159 self.lvWidgetHLayout2.setContentsMargins(3, 3, 3, 3) 165 self.lvWidgetHLayout2.setContentsMargins(3, 3, 3, 3)
160 166
161 self.localsFilterEdit = QLineEdit(self.lvWidget) 167 self.localsFilterEdit = QLineEdit(self.lvWidget)
162 self.localsFilterEdit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) 168 self.localsFilterEdit.setSizePolicy(
169 QSizePolicy.Expanding, QSizePolicy.Fixed)
163 self.lvWidgetHLayout2.addWidget(self.localsFilterEdit) 170 self.lvWidgetHLayout2.addWidget(self.localsFilterEdit)
164 self.localsFilterEdit.setToolTip( 171 self.localsFilterEdit.setToolTip(
165 self.trUtf8("Enter regular expression patterns separated by ';' to define " 172 self.trUtf8(
173 "Enter regular expression patterns separated by ';' to define "
166 "variable filters. ")) 174 "variable filters. "))
167 self.localsFilterEdit.setWhatsThis( 175 self.localsFilterEdit.setWhatsThis(
168 self.trUtf8("Enter regular expression patterns separated by ';' to define " 176 self.trUtf8(
169 "variable filters. All variables and class attributes matched by one of " 177 "Enter regular expression patterns separated by ';' to define "
170 "the expressions are not shown in the list above.")) 178 "variable filters. All variables and class attributes matched"
171 179 " by one of the expressions are not shown in the list above."))
172 self.setLocalsFilterButton = QPushButton(self.trUtf8('Set'), self.lvWidget) 180
181 self.setLocalsFilterButton = QPushButton(
182 self.trUtf8('Set'), self.lvWidget)
173 self.lvWidgetHLayout2.addWidget(self.setLocalsFilterButton) 183 self.lvWidgetHLayout2.addWidget(self.setLocalsFilterButton)
174 self.lvWidgetVLayout.addLayout(self.lvWidgetHLayout2) 184 self.lvWidgetVLayout.addLayout(self.lvWidgetHLayout2)
175 185
176 index = self.__tabWidget.addTab(self.lvWidget, 186 index = self.__tabWidget.addTab(self.lvWidget,
177 UI.PixmapCache.getIcon("localVariables.png"), '') 187 UI.PixmapCache.getIcon("localVariables.png"), '')
178 self.__tabWidget.setTabToolTip(index, self.localsViewer.windowTitle()) 188 self.__tabWidget.setTabToolTip(index, self.localsViewer.windowTitle())
179 189
180 self.sourceButton.clicked[()].connect(self.__showSource) 190 self.sourceButton.clicked[()].connect(self.__showSource)
181 self.stackComboBox.currentIndexChanged[int].connect(self.__frameSelected) 191 self.stackComboBox.currentIndexChanged[int].connect(
192 self.__frameSelected)
182 self.setLocalsFilterButton.clicked[()].connect(self.__setLocalsFilter) 193 self.setLocalsFilterButton.clicked[()].connect(self.__setLocalsFilter)
183 self.localsFilterEdit.returnPressed.connect(self.__setLocalsFilter) 194 self.localsFilterEdit.returnPressed.connect(self.__setLocalsFilter)
184 195
185 from .CallStackViewer import CallStackViewer 196 from .CallStackViewer import CallStackViewer
186 # add the call stack viewer 197 # add the call stack viewer
187 self.callStackViewer = CallStackViewer(self.debugServer) 198 self.callStackViewer = CallStackViewer(self.debugServer)
188 index = self.__tabWidget.addTab(self.callStackViewer, 199 index = self.__tabWidget.addTab(self.callStackViewer,
189 UI.PixmapCache.getIcon("step.png"), "") 200 UI.PixmapCache.getIcon("step.png"), "")
190 self.__tabWidget.setTabToolTip(index, self.callStackViewer.windowTitle()) 201 self.__tabWidget.setTabToolTip(
202 index, self.callStackViewer.windowTitle())
191 self.callStackViewer.sourceFile.connect(self.sourceFile) 203 self.callStackViewer.sourceFile.connect(self.sourceFile)
192 self.callStackViewer.frameSelected.connect(self.__callStackFrameSelected) 204 self.callStackViewer.frameSelected.connect(
205 self.__callStackFrameSelected)
193 206
194 from .CallTraceViewer import CallTraceViewer 207 from .CallTraceViewer import CallTraceViewer
195 # add the call trace viewer 208 # add the call trace viewer
196 self.callTraceViewer = CallTraceViewer(self.debugServer) 209 self.callTraceViewer = CallTraceViewer(self.debugServer)
197 index = self.__tabWidget.addTab(self.callTraceViewer, 210 index = self.__tabWidget.addTab(self.callTraceViewer,
198 UI.PixmapCache.getIcon("callTrace.png"), "") 211 UI.PixmapCache.getIcon("callTrace.png"), "")
199 self.__tabWidget.setTabToolTip(index, self.callTraceViewer.windowTitle()) 212 self.__tabWidget.setTabToolTip(
213 index, self.callTraceViewer.windowTitle())
200 self.callTraceViewer.sourceFile.connect(self.sourceFile) 214 self.callTraceViewer.sourceFile.connect(self.sourceFile)
201 215
202 from .BreakPointViewer import BreakPointViewer 216 from .BreakPointViewer import BreakPointViewer
203 # add the breakpoint viewer 217 # add the breakpoint viewer
204 self.breakpointViewer = BreakPointViewer() 218 self.breakpointViewer = BreakPointViewer()
205 self.breakpointViewer.setModel(self.debugServer.getBreakPointModel()) 219 self.breakpointViewer.setModel(self.debugServer.getBreakPointModel())
206 index = self.__tabWidget.addTab(self.breakpointViewer, 220 index = self.__tabWidget.addTab(self.breakpointViewer,
207 UI.PixmapCache.getIcon("breakpoints.png"), '') 221 UI.PixmapCache.getIcon("breakpoints.png"), '')
208 self.__tabWidget.setTabToolTip(index, self.breakpointViewer.windowTitle()) 222 self.__tabWidget.setTabToolTip(
223 index, self.breakpointViewer.windowTitle())
209 self.breakpointViewer.sourceFile.connect(self.sourceFile) 224 self.breakpointViewer.sourceFile.connect(self.sourceFile)
210 225
211 from .WatchPointViewer import WatchPointViewer 226 from .WatchPointViewer import WatchPointViewer
212 # add the watch expression viewer 227 # add the watch expression viewer
213 self.watchpointViewer = WatchPointViewer() 228 self.watchpointViewer = WatchPointViewer()
214 self.watchpointViewer.setModel(self.debugServer.getWatchPointModel()) 229 self.watchpointViewer.setModel(self.debugServer.getWatchPointModel())
215 index = self.__tabWidget.addTab(self.watchpointViewer, 230 index = self.__tabWidget.addTab(self.watchpointViewer,
216 UI.PixmapCache.getIcon("watchpoints.png"), '') 231 UI.PixmapCache.getIcon("watchpoints.png"), '')
217 self.__tabWidget.setTabToolTip(index, self.watchpointViewer.windowTitle()) 232 self.__tabWidget.setTabToolTip(
233 index, self.watchpointViewer.windowTitle())
218 234
219 from .ExceptionLogger import ExceptionLogger 235 from .ExceptionLogger import ExceptionLogger
220 # add the exception logger 236 # add the exception logger
221 self.exceptionLogger = ExceptionLogger() 237 self.exceptionLogger = ExceptionLogger()
222 index = self.__tabWidget.addTab(self.exceptionLogger, 238 index = self.__tabWidget.addTab(self.exceptionLogger,
223 UI.PixmapCache.getIcon("exceptions.png"), '') 239 UI.PixmapCache.getIcon("exceptions.png"), '')
224 self.__tabWidget.setTabToolTip(index, self.exceptionLogger.windowTitle()) 240 self.__tabWidget.setTabToolTip(
241 index, self.exceptionLogger.windowTitle())
225 242
226 if self.embeddedShell: 243 if self.embeddedShell:
227 self.__tabWidget.setCurrentWidget(self.shellAssembly) 244 self.__tabWidget.setCurrentWidget(self.shellAssembly)
228 else: 245 else:
229 if self.embeddedBrowser: 246 if self.embeddedBrowser:
232 self.__tabWidget.setCurrentWidget(self.lvWidget) 249 self.__tabWidget.setCurrentWidget(self.lvWidget)
233 250
234 # add the threads viewer 251 # add the threads viewer
235 self.__mainLayout.addWidget(QLabel(self.trUtf8("Threads:"))) 252 self.__mainLayout.addWidget(QLabel(self.trUtf8("Threads:")))
236 self.__threadList = QTreeWidget() 253 self.__threadList = QTreeWidget()
237 self.__threadList.setHeaderLabels([self.trUtf8("ID"), self.trUtf8("Name"), 254 self.__threadList.setHeaderLabels(
238 self.trUtf8("State"), ""]) 255 [self.trUtf8("ID"), self.trUtf8("Name"),
256 self.trUtf8("State"), ""])
239 self.__threadList.setSortingEnabled(True) 257 self.__threadList.setSortingEnabled(True)
240 self.__mainLayout.addWidget(self.__threadList) 258 self.__mainLayout.addWidget(self.__threadList)
241 259
242 self.__doThreadListUpdate = True 260 self.__doThreadListUpdate = True
243 261
383 401
384 def handleClientStack(self, stack): 402 def handleClientStack(self, stack):
385 """ 403 """
386 Public slot to show the call stack of the program being debugged. 404 Public slot to show the call stack of the program being debugged.
387 405
388 @param stack list of tuples with call stack data (file name, line number, 406 @param stack list of tuples with call stack data (file name,
389 function name, formatted argument/values list) 407 line number, function name, formatted argument/values list)
390 """ 408 """
391 block = self.stackComboBox.blockSignals(True) 409 block = self.stackComboBox.blockSignals(True)
392 self.framenr = 0 410 self.framenr = 0
393 self.stackComboBox.clear() 411 self.stackComboBox.clear()
394 self.currentStack = stack 412 self.currentStack = stack
401 419
402 def setVariablesFilter(self, globalsFilter, localsFilter): 420 def setVariablesFilter(self, globalsFilter, localsFilter):
403 """ 421 """
404 Public slot to set the local variables filter. 422 Public slot to set the local variables filter.
405 423
406 @param globalsFilter filter list for global variable types (list of int) 424 @param globalsFilter filter list for global variable types
425 (list of int)
407 @param localsFilter filter list for local variable types (list of int) 426 @param localsFilter filter list for local variable types (list of int)
408 """ 427 """
409 self.globalsFilter = globalsFilter 428 self.globalsFilter = globalsFilter
410 self.localsFilter = localsFilter 429 self.localsFilter = localsFilter
411 430
412 def __showSource(self): 431 def __showSource(self):
413 """ 432 """
414 Private slot to handle the source button press to show the selected file. 433 Private slot to handle the source button press to show the selected
434 file.
415 """ 435 """
416 index = self.stackComboBox.currentIndex() 436 index = self.stackComboBox.currentIndex()
417 if index > -1 and self.currentStack: 437 if index > -1 and self.currentStack:
418 s = self.currentStack[index] 438 s = self.currentStack[index]
419 self.sourceFile.emit(s[0], int(s[1])) 439 self.sourceFile.emit(s[0], int(s[1]))
430 if self.__autoViewSource: 450 if self.__autoViewSource:
431 self.__showSource() 451 self.__showSource()
432 452
433 def __setGlobalsFilter(self): 453 def __setGlobalsFilter(self):
434 """ 454 """
435 Private slot to set the global variable filter 455 Private slot to set the global variable filter.
436 """ 456 """
437 filter = self.globalsFilterEdit.text() 457 filter = self.globalsFilterEdit.text()
438 self.debugServer.remoteClientSetFilter(1, filter) 458 self.debugServer.remoteClientSetFilter(1, filter)
439 if self.currentStack: 459 if self.currentStack:
440 self.debugServer.remoteClientVariables(2, self.globalsFilter) 460 self.debugServer.remoteClientVariables(2, self.globalsFilter)
441 461
442 def __setLocalsFilter(self): 462 def __setLocalsFilter(self):
443 """ 463 """
444 Private slot to set the local variable filter 464 Private slot to set the local variable filter.
445 """ 465 """
446 filter = self.localsFilterEdit.text() 466 filter = self.localsFilterEdit.text()
447 self.debugServer.remoteClientSetFilter(0, filter) 467 self.debugServer.remoteClientSetFilter(0, filter)
448 if self.currentStack: 468 if self.currentStack:
449 self.debugServer.remoteClientVariables(0, self.localsFilter, self.framenr) 469 self.debugServer.remoteClientVariables(
470 0, self.localsFilter, self.framenr)
450 471
451 def handleDebuggingStarted(self): 472 def handleDebuggingStarted(self):
452 """ 473 """
453 Public slot to handle the start of a debugging session. 474 Public slot to handle the start of a debugging session.
454 475
488 if thread['broken']: 509 if thread['broken']:
489 state = self.trUtf8("waiting at breakpoint") 510 state = self.trUtf8("waiting at breakpoint")
490 else: 511 else:
491 state = self.trUtf8("running") 512 state = self.trUtf8("running")
492 itm = QTreeWidgetItem(self.__threadList, 513 itm = QTreeWidgetItem(self.__threadList,
493 ["{0:d}".format(thread['id']), thread['name'], state]) 514 ["{0:d}".format(thread['id']),
515 thread['name'], state])
494 if thread['id'] == currentID: 516 if thread['id'] == currentID:
495 citm = itm 517 citm = itm
496 518
497 self.__threadList.header().resizeSections(QHeaderView.ResizeToContents) 519 self.__threadList.header().resizeSections(QHeaderView.ResizeToContents)
498 self.__threadList.header().setStretchLastSection(True) 520 self.__threadList.header().setStretchLastSection(True)
505 def __threadSelected(self, current, previous): 527 def __threadSelected(self, current, previous):
506 """ 528 """
507 Private slot to handle the selection of a thread in the thread list. 529 Private slot to handle the selection of a thread in the thread list.
508 530
509 @param current reference to the new current item (QTreeWidgetItem) 531 @param current reference to the new current item (QTreeWidgetItem)
510 @param previous reference to the previous current item (QTreeWidgetItem) 532 @param previous reference to the previous current item
533 (QTreeWidgetItem)
511 """ 534 """
512 if current is not None and self.__doThreadListUpdate: 535 if current is not None and self.__doThreadListUpdate:
513 tid = int(current.text(0)) 536 tid = int(current.text(0))
514 self.debugServer.remoteSetThread(tid) 537 self.debugServer.remoteSetThread(tid)
515 538

eric ide

mercurial