def do_validate(self):
        if rpdb2.is_valid_pwd(self.get_password()):
            return True

        baddpwd = _("The password should begin with a letter and continue "
                    "with any combination of digits, letters or underscores "
                    "(\'_\'). Only English characters are accepted for letters.")
        PyStudioUtils.error_dialog(self, baddpwd)
        return False
    def do_validate(self):
        if rpdb2.is_valid_pwd(self.get_password()):
            return True

        baddpwd = _(
            "The password should begin with a letter and continue "
            "with any combination of digits, letters or underscores "
            "(\'_\'). Only English characters are accepted for letters.")
        PyStudioUtils.error_dialog(self, baddpwd)
        return False
Beispiel #3
0
    def _oncodeexecuted(self, res):
        """Expression execution callback"""
        if not res:
            return
        if len(res) == 2:
            warning, error = res
        else:
            error = res
            warning = None

        PyStudioUtils.error_dialog(self, error)
        if warning and not warning in self.ignoredwarnings:
            dlg = wx.MessageDialog(self,
                                   _("Would you like to ignore this warning for the rest of this session?\n\n%s") % warning,\
                                   _("Ignore Warning"),
                                   wx.YES_NO|wx.YES_DEFAULT|wx.ICON_WARNING)
            if dlg.ShowModal() == wx.ID_YES:
                self.ignoredwarnings[warning] = True
            dlg.Destroy()
    def _oncodeexecuted(self, res):
        """Expression execution callback"""
        if not res:
            return
        if len(res) == 2:
            warning, error = res
        else:
            error = res
            warning = None

        PyStudioUtils.error_dialog(self, error)
        if warning and not warning in self.ignoredwarnings:
            dlg = wx.MessageDialog(self,
                                   _("Would you like to ignore this warning for the rest of this session?\n\n%s") % warning,\
                                   _("Ignore Warning"),
                                   wx.YES_NO|wx.YES_DEFAULT|wx.ICON_WARNING)
            if dlg.ShowModal() == wx.ID_YES:
                self.ignoredwarnings[warning] = True
            dlg.Destroy()
    def _onitemactivatedcallback(self, res):
        if not res:
            return

        if len(res) == 2:
            warning, error = res
        else:
            error = res

        PyStudioUtils.error_dialog(self, error)

        if not warning in self.ignoredwarnings:
            dlg = wx.MessageDialog(self,
                                   _("%s\n\nClick 'Cancel' to ignore this warning in this session.") % warning,\
                                   _("Warning"),
                                   wx.OK|wx.CANCEL|wx.YES_DEFAULT|wx.ICON_WARNING)
            res = dlg.ShowModal()
            dlg.Destroy()

            if res == wx.ID_CANCEL:
                self.ignoredwarnings[warning] = True
    def _onitemactivatedcallback(self, res):
        if not res:
            return

        if len(res) == 2:
            warning, error = res
        else:
            error = res

        PyStudioUtils.error_dialog(self, error)

        if not warning in self.ignoredwarnings:
            dlg = wx.MessageDialog(self,
                                   _("%s\n\nClick 'Cancel' to ignore this warning in this session.") % warning,\
                                   _("Warning"),
                                   wx.OK|wx.CANCEL|wx.YES_DEFAULT|wx.ICON_WARNING)
            res = dlg.ShowModal()
            dlg.Destroy()

            if res == wx.ID_CANCEL:
                self.ignoredwarnings[warning] = True
class RpdbDebugger(object):
    __metaclass__ = ebmlib.Singleton

    fAllowUnencrypted = True
    fRemote = False
    host = "localhost"
    fAttach = True
    fchdir = False
    password = "******"

    def __init__(self):
        super(RpdbDebugger, self).__init__()

        # Setup
        self.sessionmanager = rpdb2.CSessionManager(RpdbDebugger.password, \
            RpdbDebugger.fAllowUnencrypted, RpdbDebugger.fRemote, RpdbDebugger.host)
        self.breakpointmanager = RpdbBreakpointsManager(self)
        self.statemanager = RpdbStateManager(self)
        self.stackframemanager = RpdbStackFrameManager(self)
        self.threadmanager = RpdbThreadsManager(self)
        self.variablesmanager = RpdbVariablesManager(self)

        # attributes that will be set later
        self.attached = False
        self.analyzing = False
        self.broken = False
        self.mainwindow = None
        self.processcreator = None
        self.breakpoints = {}
        self.breakpoints_installed = False
        self.curstack = {}
        self.unhandledexception = False
        self.debuggerattachedtext = None
        self.debuggerdetachedtext = None
        self.remoteprocess = False
        self.abortattach = False

        # functions that will be set later

        # message handler
        self.conflictingmodules = lambda x: None
        self.setstepmarker = lambda x, y: None
        self.clearstepmarker = lambda: None
        self.setstepmarker = lambda x, y: None
        self.restorestepmarker = lambda x: None
        # debuggee shelf
        self.debugbuttonsupdate = lambda: None
        self.disabledebugbuttons = lambda: None
        # breakpoints shelf
        self.saveandrestorebreakpoints = lambda: None
        # stackframe shelf
        self.clearframe = lambda: None
        self.selectframe = lambda x: None
        self.updatestacklist = lambda x: None
        # thread shelf
        self.clearthread = lambda: None
        self.updatethread = lambda x, y, z: None
        self.updatethreadlist = lambda x, y: None
        # variables shelf
        self.clearlocalvariables = lambda: None
        self.clearglobalvariables = lambda: None
        self.clearexceptions = lambda: None
        self.updatelocalvariables = lambda x, y: (None, None)
        self.updateglobalvariables = lambda x, y: (None, None)
        self.updateexceptions = lambda x, y: (None, None)
        self.catchunhandledexception = lambda: None
        self.updateanalyze = lambda: None
        # expressions shelf
        self.setexpression = lambda x, y: None
        self.restoreexpressions = lambda: None
        self.saveandrestoreexpressions = lambda: None
        self.clearexpressionvalues = lambda: None

    def clear_all(self):
        self.breakpoints_installed = False
        self.curstack = {}
        self.unhandledexception = False
        self.abortattach = False
        self.attached = False
        self.analyzing = False
        self.broken = False
        self.processcreator = None
        self.debuggerattachedtext = None
        self.debuggerdetachedtext = None
        self.clearstepmarker()
        self.clearframe()
        self.clearthread()
        self.clearlocalvariables()
        self.clearglobalvariables()
        self.clearexceptions()
        self.clearexpressionvalues()
        self.saveandrestoreexpressions()
        self.saveandrestorebreakpoints()
        self.updateanalyze()

    def isrpdbbreakpoint(self, filepath, lineno):
        if filepath.find("rpdb2.py") == -1:
            return False
        bpinfile = self.breakpoints.get(filepath)
        if not bpinfile:
            return True
        if not bpinfile.get(lineno):
            return True
        return False

    def attach(self, processcreator):
        if not processcreator:
            return
        self.processcreator = processcreator
        pid = str(processcreator.GetPID())
        tries = 0
        ex = None

        while tries != 5:
            sleep(1)
            util.Log("[PyDbg][info] Trying to Attach")
            ex = None
            try:
                if self.abortattach:
                    self.do_abort()
                    break
                self.sessionmanager.attach(pid, encoding=rpdb2.detect_locale())
                self.attached = True
                break
            except Exception, ex:
                tries = tries + 1
        ed_msg.PostMessage(ed_msg.EDMSG_PROGRESS_SHOW,
                           (self.mainwindow.GetId(), False))
        if ex:
            self.do_abort()
            err = rpdb2.g_error_mapping.get(type(ex), repr(ex))
            err = "Failed to attach. Error: %s" % err
            util.Log("[PyDbg][err] %s" % err)
            wx.CallAfter(self.printerror, processcreator, err)
            PyStudioUtils.error_dialog(self.mainwindow, err)
            return
        util.Log("[PyDbg][info] Running")
        processcreator.AddText(self.debuggerattachedtext)
    def printerror(self, processcreator, err):
        processcreator.AddText(_("\n%s\n" % err))

    def attached_callsessionmanagerfn(self, fn, *args, **kwargs):
        if not self.attached:
            return None
        ex = None
        try:
            return fn(*args, **kwargs)
        except rpdb2.NotAttached, ex:
            self.attached = False
        except Exception, ex:
            util.Log("[PyDbg][err] %s" % traceback.format_exc())
        if self.mainwindow:
            err = rpdb2.g_error_mapping.get(type(ex), repr(ex))
            PyStudioUtils.error_dialog(self.mainwindow, err)
        return None

    def callsessionmanagerfn(self, fn, *args, **kwargs):
        ex = None
        try:
            return fn(*args, **kwargs)
        except Exception, ex:
            util.Log("[PyDbg][err] %s" % traceback.format_exc())
        if self.mainwindow:
            err = rpdb2.g_error_mapping.get(type(ex), repr(ex))
            PyStudioUtils.error_dialog(self.mainwindow, err)
        return None

    def do_abort(self):
        self.do_detach()
    def printerror(self, processcreator, err):
        processcreator.AddText(_("\n%s\n" % err))
    
    def attached_callsessionmanagerfn(self, fn, *args, **kwargs):
        if not self.attached:
            return None
        ex = None
        try:
            return fn(*args, **kwargs)
        except rpdb2.NotAttached, ex:
            self.attached = False
        except Exception, ex:
            util.Log("[PyDbg][err] %s" % traceback.format_exc())
        if self.mainwindow:
            err = rpdb2.g_error_mapping.get(type(ex), repr(ex))
            PyStudioUtils.error_dialog(self.mainwindow, err)
        return None
    
    def callsessionmanagerfn(self, fn, *args, **kwargs):
        ex = None
        try:
            return fn(*args, **kwargs)
        except Exception, ex:
            util.Log("[PyDbg][err] %s" % traceback.format_exc())
        if self.mainwindow:
            err = rpdb2.g_error_mapping.get(type(ex), repr(ex))
            PyStudioUtils.error_dialog(self.mainwindow, err)
        return None

    def do_abort(self):
        self.do_detach()