Question

I am developing FUSE filesystem with python. The problem is that after mounting a filesystem I have no access to stdin/stdout/stderr from my fuse script. I don't see anything, even tracebacks. I am trying to launch pdb like this:


import pdb
pdb.Pdb(None, open('pdb.in', 'r'), open('pdb.out', 'w')).set_trace()

All works fine but very inconvenient. I want to make pdb.in and pdb.out as fifo files but don't know how to connect it correctly. Ideally I want to type commands and see output in one terminal, but will be happy even with two terminals (in one put commands and see output in another). Questions:

1) Is it better/other way to run pdb without stdin/stdout?

2) How can I redirect stdin to pdb.in fifo (All what I type must go to pdb.in)? How can I redirect pdb.out to stdout (I had strange errors with "cat pdb.out" but maybe I don't understand something)

Was it helpful?

Solution

Ok. Exactly what I want, has been done in http://pypi.python.org/pypi/rpdb/0.1.1 .

OTHER TIPS

Before starting the python app

mkfifo pdb.in
mkfifo pdb.out

Then when pdb is called you can interact with it using these two cat commands, one running in the background

cat pdb.out & cat > pdb.in

Note the readline support does not work (i.e. up arrow)

I just ran into a similar issue in a much simpler use-case:

  • debug a simple Python program running from the command line that had a file piped into sys.stdin, meaning, no way to use the console for pdb.

I ended up solving it by using wdb.

Quick rundown for my use-case. In the shell, install both the wdb server and the wdb client:

pip install wdb.server wdb

Now launch the wdb server with:

wdb.server.py

Now you can navigate to localhost:1984 with your browser and see an interface listing all Python programs running. The wdb project page above has instructions on what you can do if you want to debug any of these running programs.

As for a program under your control, you can you can debug it from the start with:

wdb myscript.py --script=args < and/stdin/redirection

Or, in your code, you can do:

import wdb; wdb.set_trace()

This will pop up an interface in your browser (if local) showing the traced program.

Or you can navigate to the wdb.server.py port to see all ongoing debugging sessions on top of the list of running Python programs, which you can then use to access the specific debugging session you want.

Notice that the commands for navigating the code during the trace are different from the standard pdb ones, for example, to step into a function you use .s instead of s and to step over use .n instead of n. See the wdb README in the link above for details.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top