Save command history in pdb

I don't believe there is a way with "stock" pdb. But I wrote a replacement debugger that does that.

just install Pycopia from source: http://code.google.com/p/pycopia/source/checkout and it's in pycopia.debugger.


An example for clearing / reading / printing the current pdb history:

(Pdb) readline.clear_history()
(Pdb) print('hello pdb')
hello pdb
(Pdb) from pprint import pprint; import readline
(Pdb) y = range(readline.get_current_history_length() + 2)
(Pdb) print([readline.get_history_item(x) for x in y])

output:

[None, 
"print('hello pdb')", 
'from pprint import pprint; import readline', 
'y = range(readline.get_current_history_length() + 2)',
'print([readline.get_history_item(x) for x in y])']

reference:

  • https://docs.python.org/2/library/readline.html

two liner without readline.clear_history for what has been input to pdb so far:

from pprint import pprint; import readline
pprint([readline.get_history_item(x) for x in range(readline.get_current_history_length() + 1)])

Credits: https://wiki.python.org/moin/PdbRcIdea

pdb uses readline so we can instruct readline to save history:

.pdbrc

# NB: `pdb` only accepts single-line statements
import os
with open(os.path.expanduser("~/.pdbrc.py")) as _f: _f = _f.read()
exec(_f)
del _f

.pdbrc.py

def _pdbrc_init():
    # Save history across sessions
    import readline
    histfile = ".pdb-pyhist"
    try:
        readline.read_history_file(histfile)
    except IOError:
        pass
    import atexit
    atexit.register(readline.write_history_file, histfile)
    readline.set_history_length(500)

_pdbrc_init()
del _pdbrc_init

For the drop-in replacement pdb++, copy the above function code into the setup() method:

from pdb import DefaultConfig, Pdb


class Config(DefaultConfig):
    def setup(self, pdb):
        ## Save history across sessions
        #
        import readline
        ...

See this post. It is possible to save history in pdb. By default, pdb does not read multiple lines. So all functions need to be on a single line.

In ~/.pdbrc:

import atexit
import os
import readline

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath): import readline; readline.write_history_file(historyPath)

if os.path.exists(historyPath): readline.read_history_file(historyPath)

atexit.register(save_history, historyPath=historyPath)