Trees | Indices | Help |
---|
|
1 ''' 2 QtGui objects which assist in GUIs which use vtrace parts. 3 ''' 4 from PyQt4 import QtCore, QtGui 5 6 import vtrace 7 8 import envi.qt as envi_qt 9 10 import vqt.tree as vq_tree 11 import vqt.colors as vq_colors 12 13 from envi.threads import firethread 14 from vqt.main import idlethread, idlethreadsync17 ''' 18 A bit of shared mixin code for the handling of vtrace 19 notifier callbacks in various VQTreeViews... 20 '''3722 self.trace = trace 23 vtrace.Notifier.__init__(self) 24 self.trace.registerNotifier(vtrace.NOTIFY_ALL, self)25 26 @idlethreadsync 27 # FIXME this should be part of a shared API!29 if event in [vtrace.NOTIFY_CONTINUE, vtrace.NOTIFY_DETACH, vtrace.NOTIFY_EXIT]: 30 self.setEnabled(False) 31 32 else: 33 # If the trace is just going to run again, skip the update. 34 if not trace.shouldRunAgain(): 35 self.setEnabled(True) 36 self.vqLoad()39 columns = ('Name', 'Hex', 'Dec')4042 43 ''' 44 A pure "list view" object for registers 45 ''' 4685 9948 VQTraceNotifier.__init__(self, trace) 49 vq_tree.VQTreeView.__init__(self, parent=parent) 50 self.setModel(VQRegisterListModel(parent=self)) 51 self.setAlternatingRowColors(True) 52 self.regnames = None 53 self.lastregs = {} 54 self.regvals = {} 55 56 self.vqLoad()5759 60 self.lastregs = self.regvals 61 62 if not self.trace.isAttached(): 63 self.setEnabled(False) 64 return 65 66 if self.trace.isRunning(): 67 self.setEnabled(False) 68 return 69 70 model = VQRegisterListModel(parent=self) 71 self.setModel(model) 72 73 regs = self.trace.getRegisters() 74 75 names = self.regnames 76 if names == None: 77 names = regs.keys() 78 names.sort() 79 80 for rname in names: 81 rval = regs.get(rname) 82 model.append( (rname, '0x%.8x' % rval, rval) ) 83 84 self.regvals = regs102 103 ''' 104 A register view which includes the idea of "sub views" for particular 105 sets of registers per-architecture. 106 ''' 107149109 QtGui.QWidget.__init__(self, parent=parent) 110 self.setWindowTitle('Registers') 111 112 vbox = QtGui.QVBoxLayout(self) 113 vbox.setMargin(2) 114 vbox.setSpacing(4) 115 116 self.viewnames = QtGui.QComboBox(self) 117 self.viewnames.addItem('all') 118 self.regviews = {} 119 120 arch = trace.getMeta('Architecture') 121 122 # FIXME make this in envi or something once and for all... 123 124 if arch == 'i386': 125 self.regviews['general'] = ['eax','ebx','ecx','edx','esi','edi','ebp','esp','eip'] 126 127 elif arch == 'amd64': 128 self.regviews['general'] = ['rax','rbx','rcx','rdx','rsi','rdi','rbp','rsp','rip', 129 'r8','r9','r10','r11','r12','r13','r14','r15'] 130 131 for name in self.regviews.keys(): 132 self.viewnames.addItem(name) 133 134 sig = QtCore.SIGNAL('currentIndexChanged(QString)') 135 self.viewnames.connect(self.viewnames, sig, self.regViewNameSelected) 136 137 self.reglist = VQRegistersListView(trace=trace, parent=self) 138 self.regdelegate = RegColorDelegate(self.reglist) 139 self.reglist.setItemDelegate(self.regdelegate) 140 141 vbox.addWidget(self.viewnames) 142 vbox.addWidget(self.reglist) 143 144 self.setLayout(vbox)145151 columns = ('Pid','Name')152166155 vq_tree.VQTreeView.__init__(self, parent=parent) 156 if trace == None: 157 trace = vtrace.getTrace() 158 self.trace = trace 159 160 model = VQProcessListModel(parent=self) 161 self.setModel(model) 162 self.setAlternatingRowColors(True) 163 164 for pid,name in self.trace.ps(): 165 model.append((pid,name))168218 224170 QtGui.QDialog.__init__(self, parent=parent) 171 172 self.pid = None 173 174 self.setWindowTitle('Select a process...') 175 176 vlyt = QtGui.QVBoxLayout() 177 hlyt = QtGui.QHBoxLayout() 178 179 self.plisttree = VQProcessListView(trace=trace, parent=self) 180 181 hbox = QtGui.QWidget(parent=self) 182 183 ok = QtGui.QPushButton("Ok", parent=hbox) 184 cancel = QtGui.QPushButton("Cancel", parent=hbox) 185 186 self.plisttree.doubleClicked.connect( self.dialog_activated ) 187 188 ok.clicked.connect(self.dialog_ok) 189 cancel.clicked.connect(self.dialog_cancel) 190 191 hlyt.addStretch(1) 192 hlyt.addWidget(cancel) 193 hlyt.addWidget(ok) 194 hbox.setLayout(hlyt) 195 196 vlyt.addWidget(self.plisttree) 197 vlyt.addWidget(hbox) 198 self.setLayout(vlyt) 199 200 self.resize(300, 500)201 207209 for idx in self.plisttree.selectedIndexes(): 210 node = idx.internalPointer() 211 if node: 212 self.pid = node.rowdata[0] 213 break 214 self.accept()215226 columns = ('Fd','Type','Name')227229251231 VQTraceNotifier.__init__(self, trace) 232 vq_tree.VQTreeView.__init__(self, parent=parent) 233 self.setWindowTitle('File Descriptors') 234 self.setModel(FileDescModel(parent=self)) 235 self.vqLoad()236238 239 if not self.trace.isAttached(): 240 self.setEnabled(False) 241 return 242 243 if self.trace.isRunning(): 244 self.setEnabled(False) 245 return 246 247 model = FileDescModel(parent=self) 248 for fd,fdtype,bestname in self.trace.getFds(): 249 model.append((fd, fdtype, bestname)) 250 self.setModel(model)253336255 QtGui.QToolBar.__init__(self, parent=parent) 256 vtrace.Notifier.__init__(self) 257 self.trace = trace 258 259 self.setObjectName('VtraceToolbar') 260 261 self.attach_action = self.addAction('Attach') 262 self.attach_action.setStatusTip('Attach to a process') 263 self.attach_action.triggered.connect(self.actAttach) 264 265 self.detach_action = self.addAction('Detach') 266 self.detach_action.setStatusTip('Detach from current process') 267 self.detach_action.triggered.connect(self.actDetach) 268 269 self.continue_action = self.addAction('Continue') 270 self.continue_action.setStatusTip('Continue current process') 271 self.continue_action.triggered.connect(self.actContinue) 272 273 self.break_action = self.addAction('Break') 274 self.break_action.setStatusTip('Break current process') 275 self.break_action.triggered.connect(self.actBreak) 276 277 self.stepi_action = self.addAction('Stepi') 278 self.stepi_action.setStatusTip('Single step the current process') 279 self.stepi_action.triggered.connect(self.actStepi) 280 281 trace.registerNotifier(vtrace.NOTIFY_ALL, self) 282 self._updateActions(trace.isAttached(), trace.isRunning())283285 pid = getProcessPid(trace=self.trace) 286 if pid != None: 287 firethread(self.trace.attach)(pid)288 292 295297 if self.trace.getMeta('PendingBreak'): 298 return 299 self.trace.setMeta('PendingBreak', True) 300 firethread(self.trace.sendBreak)()301 304 305 @idlethread307 if not attached: 308 self.attach_action.setEnabled(True) 309 self.detach_action.setEnabled(False) 310 self.continue_action.setEnabled(False) 311 self.break_action.setEnabled(False) 312 self.stepi_action.setEnabled(False) 313 else: 314 if running: 315 self.attach_action.setEnabled(False) 316 self.detach_action.setEnabled(False) 317 self.continue_action.setEnabled(False) 318 self.break_action.setEnabled(True) 319 self.stepi_action.setEnabled(False) 320 else: 321 self.attach_action.setEnabled(False) 322 self.detach_action.setEnabled(True) 323 self.continue_action.setEnabled(True) 324 self.break_action.setEnabled(True) 325 self.stepi_action.setEnabled(True)326328 if event == vtrace.NOTIFY_DETACH: 329 self._updateActions(False, False) 330 331 elif event == vtrace.NOTIFY_CONTINUE: 332 self._updateActions(True, True) 333 334 else: 335 self._updateActions(trace.isAttached(), trace.shouldRunAgain())338 ''' 339 A memory map view which is sensitive to the status of a 340 trace object. 341 '''357343 VQTraceNotifier.__init__(self, trace) 344 envi_qt.VQMemoryMapView.__init__(self, trace, parent=parent)345347 348 if not self.trace.isAttached(): 349 self.setEnabled(False) 350 return 351 352 if self.trace.isRunning(): 353 self.setEnabled(False) 354 return 355 356 envi_qt.VQMemoryMapView.vqLoad(self)359 columns = ('Thread Id','Thread Info', 'State')360362401364 # selectthread is an optional endpoint to connect to 365 VQTraceNotifier.__init__(self, trace) 366 vq_tree.VQTreeView.__init__(self, parent=parent) 367 self.setWindowTitle('Threads') 368 self.setModel(VQThreadListModel(parent=self)) 369 self.setAlternatingRowColors(True) 370 self.vqLoad() 371 self.selectthread = selectthread372374 idx = self.selectedIndexes()[0] 375 node = idx.internalPointer() 376 if node: 377 self.trace.selectThread(node.rowdata[0]) 378 379 return vq_tree.VQTreeView.selectionChanged(self, selected, deselected)380382 383 if not self.trace.isAttached(): 384 self.setEnabled(False) 385 return 386 387 if self.trace.isRunning(): 388 self.setEnabled(False) 389 return 390 391 model = VQThreadListModel(parent=self) 392 393 stid = self.trace.getMeta('ThreadId') 394 for i, (tid, tinfo) in enumerate(self.trace.getThreads().items()): 395 state = '' 396 if self.trace.isThreadSuspended(tid): 397 state = 'suspended' 398 model.append((tid, tinfo, state)) 399 400 self.setModel(model)
Trees | Indices | Help |
---|
Generated by Epydoc 3.0.1 on Fri Nov 16 18:22:26 2012 | http://epydoc.sourceforge.net |