# # # from PySide.QtCore import * from PySide.QtGui import * import pykd import widgets class UpdateEvent( QEvent ): def __init__(self): QEvent.__init__(self, QEvent.Type(QEvent.User + 1)) class GoThread( QThread ): def __init__(self, func): QThread.__init__(self) self.start() self.func = func def run(self): self.func() app.postEvent( mainForm, UpdateEvent() ) self.exit() class MainForm( QMainWindow ): updated = Signal() def __init__( self ): QMainWindow.__init__( self, None ) self.setWindowTitle("Pykd Debugger Sample") self.setDockNestingEnabled( True ) self.goThread = None self.fileMenu = QMenu( "&File" ) self.fileMenu.addAction( "Open process...", self.onOpenProcess ) self.fileMenu.addAction( "Exit", self.onExit ) self.menuBar().addMenu( self.fileMenu ) self.debugMenu = QMenu( "Debug" ) self.debugMenu.addAction( "Break", self.onBreak ) self.debugMenu.addAction( "Go", self.onGo ) self.debugMenu.addAction( "Step", self.onStep ) self.menuBar().addMenu( self.debugMenu ) self.viewMenu = QMenu( "View" ) self.menuBar().addMenu( self.viewMenu ) self.resize( 800, 600 ) widgets.register( self ) def stopGoThread( self ): if self.goThread != None and self.goThread.isRunning(): self.goThread.quit() self.goThread.wait(10000) def event( self, ev ): if ev.type() == QEvent.User + 1: self.onUpdate() return True else: return QMainWindow.event( self, ev ) def onOpenProcess( self ): fileDlg = QFileDialog( self ) fileDlg.setNameFilter( self.tr("Executable (*.exe)" ) ) pykd.startProcess( fileDlg.getOpenFileName()[0] ) self.goThread = GoThread( pykd.go ) def onBreak( self ): pykd.breakin() def onGo( self ): self.stopGoThread() self.goThread = GoThread( pykd.go ) def onStep( self ): self.stopGoThread() self.goThread = GoThread( pykd.step ) def onExit( self ): self.close() def onUpdate( self ): self.updated.emit() def main(): global app global mainForm app = QApplication( [] ) mainForm = MainForm() mainForm.show() exitres = app.exec_() if __name__ == "__main__": main()