Giter Site home page Giter Site logo

Comments (12)

ionelmc avatar ionelmc commented on August 26, 2024

I cannot produce the problem on Ubuntu but I suspect it's a lingering socket issue - this happens only after a restart right?

from python-remote-pdb.

ionelmc avatar ionelmc commented on August 26, 2024

I do set SO_REUSEADDR in https://github.com/ionelmc/python-remote-pdb/blob/master/src/remote_pdb.py#L69 - perhaps you could patch it up locally to additionally set SO_REUSEPORT and report results? I don't have an OSX system to play with.

from python-remote-pdb.

Michael-F-Ellis avatar Michael-F-Ellis commented on August 26, 2024

Thanks for the quick responses. The only pure Linux system I've got handy is a Raspberry Pi running Raspbian Jessie. I'll try it out on that to see if the problem occurs there and let you know the result. Then I'll try patching in SO_REUSEPORT and running it on OS X. More later ...

from python-remote-pdb.

Michael-F-Ellis avatar Michael-F-Ellis commented on August 26, 2024

I've confirmed the problem is not occurring in Linux.

from python-remote-pdb.

Michael-F-Ellis avatar Michael-F-Ellis commented on August 26, 2024

I added

        listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, True)

at line 70.

No effect on the problem (on OS X). Just to clarify, the connection has always succeeded. I see

CRITICAL:root:RemotePdb accepted connection from ('127.0.0.1', 60462).
RemotePdb accepted connection from ('127.0.0.1', 60462).

with or without SO_REUSEPORT. The problem is that I don't get a Pdb prompt and nothing I type produces a response.

from python-remote-pdb.

Michael-F-Ellis avatar Michael-F-Ellis commented on August 26, 2024

I've been able to confirm the following on OS X

  1. When the problem occurs, the code never makes it past the the call to Pdb__iniit__ .
  2. When I run my test file bare at the command line (python mp.py) the problem doesn't occur and the code makes it past Pdb.init and all the way to the end of RemotePdb.init

from python-remote-pdb.

ionelmc avatar ionelmc commented on August 26, 2024

One way to figure this one out: install hunter and just add import hunter; hunter.trace() somewhere convenient - perhaps in the child function?

from python-remote-pdb.

Michael-F-Ellis avatar Michael-F-Ellis commented on August 26, 2024

I'll definitely give that a try! I was looking earlier today for a tracing program to help a fellow engineer explore some unfamiliar Python code. This looks perfect. I think I'll need to trace into Pdb itself since that's where things seem to be going wrong.

from python-remote-pdb.

Michael-F-Ellis avatar Michael-F-Ellis commented on August 26, 2024

Pdb seems to be going down the rabbit hole trying to import readline.

[...]llis/anaconda3/lib/python3.5/pdb.py:139   call          def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
[...]llis/anaconda3/lib/python3.5/pdb.py:141   line              bdb.Bdb.__init__(self, skip=skip)
[...]llis/anaconda3/lib/python3.5/pdb.py:142   line              cmd.Cmd.__init__(self, completekey, stdin, stdout)
[...]llis/anaconda3/lib/python3.5/pdb.py:143   line              if stdout:
[...]llis/anaconda3/lib/python3.5/pdb.py:144   line                  self.use_rawinput = 0
[...]llis/anaconda3/lib/python3.5/pdb.py:145   line              self.prompt = '(Pdb) '
[...]llis/anaconda3/lib/python3.5/pdb.py:146   line              self.aliases = {}
[...]llis/anaconda3/lib/python3.5/pdb.py:147   line              self.displaying = {}
[...]llis/anaconda3/lib/python3.5/pdb.py:148   line              self.mainpyfile = ''
[...]llis/anaconda3/lib/python3.5/pdb.py:149   line              self._wait_for_mainpyfile = False
[...]llis/anaconda3/lib/python3.5/pdb.py:150   line              self.tb_lineno = {}
[...]llis/anaconda3/lib/python3.5/pdb.py:152   line              try:
[...]llis/anaconda3/lib/python3.5/pdb.py:153   line                  import readline

More later. Have to eat dinner now. Hunter seems downright awesome!

from python-remote-pdb.

Michael-F-Ellis avatar Michael-F-Ellis commented on August 26, 2024

It's hanging during the import readline. I tried setting hunter to trace readline but that's a .so, so of course no luck ...

from python-remote-pdb.

Michael-F-Ellis avatar Michael-F-Ellis commented on August 26, 2024

Solved! It's an old OS X python issue that has either crept back in or was never fixed in Pdb. The fix is to set up to ignore SIGTTOU before importing readline. See http://bugs.python.org/issue14892 for details.

I cured the problem by patching my local copy of pdb.Pdb as shown below.

class Pdb(bdb.Bdb, cmd.Cmd):

    _previous_sigint_handler = None

    def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
                 nosigint=False):
        bdb.Bdb.__init__(self, skip=skip)
        cmd.Cmd.__init__(self, completekey, stdin, stdout)
        if stdout:
            self.use_rawinput = 0
        self.prompt = '(Pdb) '
        self.aliases = {}
        self.displaying = {}
        self.mainpyfile = ''
        self._wait_for_mainpyfile = False
        self.tb_lineno = {}
        # Try to load readline if it exists
        try:
############ FIX OSX BUG ######################################
            import sys
            if sys.platform == 'darwin':
                import signal
                signal.signal(signal.SIGTTOU, signal.SIG_IGN)
############ END FIX ##########################################
            import readline
            # remove some common file name delimiters
            readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?')
        except ImportError:
            pass               

Thanks much for your generous help and for hunter.

Cheers,
Mike

from python-remote-pdb.

ionelmc avatar ionelmc commented on August 26, 2024

Nice find! I'll add this to the readme at the very least.

from python-remote-pdb.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.