Re: Save/restore breakpoints between pdb runs

2014-07-12 Thread dieter
Ed Blackman e...@edgewood.to writes:
 I've recently started using Python for my job (as opposed to writing
 smallish scripts for personal use), and so have needed to debug quite
 a bit more.

 I've been using pdb mainly via 'python -m pdb script args'.  Perhaps
 it's my Java background, but even when I have permissions to change
 the source, I find editing source to insert 'import pdb;
 pdb.set_trace()' unnatural.  The consequence is that I have to
 recreate my breakpoints when I have to exit pdb.

 I've written the following code, which I load from .pdbrc with
 'execfile(os.path.expanduser('~/.pydb.py'))'

This approach does not seem very robust to me:

  pdb resolves all breakpoints to lines (in source files) - and
  any modification to the source may change the lines.
  As a consequence, your breakpoints may no longer be at the
  places where you expect them.


A long time ago, I have developped dm.pdb - a slight
extension/improvement over pdb. One of the extensions
has been to make it possible to set breakpoints from outside
the debugger -- without too many surprises. It looks somehow like that:

  from dm.pdb import Pdb; D = Pdb()
  ...
  from ... import f
  from ... import g
  from ... import C
  ...
  D.do_break(f) # set breakpoint on f
  D.do_break(g) # set breakpoint on g
  D.do_breack(C.m) # set breakpoint on method m of class C
  ...
  D.run(...)

It is more robust than breakpoints on line numbers - but, of course,
it cannot be automated but must be targeted to individual programs.
In addition, the robustness is limited to breakpoints on
executable objects; setting breakpoints on line numbers is possible, too --
but has the same problem with moving lines.


In the meantime, pdb itself may support this form of external
control (maybe even better then dm.pdb).

-- 
https://mail.python.org/mailman/listinfo/python-list


Save/restore breakpoints between pdb runs

2014-07-11 Thread Ed Blackman
I've recently started using Python for my job (as opposed to writing 
smallish scripts for personal use), and so have needed to debug quite a 
bit more.


I've been using pdb mainly via 'python -m pdb script args'.  Perhaps 
it's my Java background, but even when I have permissions to change the 
source, I find editing source to insert 'import pdb; pdb.set_trace()' 
unnatural.  The consequence is that I have to recreate my breakpoints 
when I have to exit pdb.


I've written the following code, which I load from .pdbrc with 
'execfile(os.path.expanduser('~/.pydb.py'))'


Is there an alternate solution to keeping persistant breakpoints that 
works much better?  My python editing happens on a lot of different 
machines/VMs, so I prefer alternate solutions that allow me to sync over 
a couple of files, not install new binaries.


If not:
1) If is there a way in pdb to set a breakpoint on a function that isn't 
in the current file?  I can see the .funcname property of the 
breakpoint, and would prefer restoring breakpoints on functions so they 
don't break if I change line numbers.  b func_name works in the 
current file, but b file:func_name doesn't.
2) Is there a way to list the commands for each breakpoint, so that they 
can be restored as well?


Any other comments or suggestions for improvement would be welcome.

def savebps():
   import pdb

   bp_num = 0
   for bp in pdb.bdb.Breakpoint.bpbynumber:
   # pdb commands operate on breakpoint number, so keep track of
   # the number the recreated breakpoint would have
   if bp is None:
   continue
   else:
   bp_num += 1

   command = 'tbreak' if bp.temporary else 'b'
   cond = '' if bp.cond is None else ', ' + bp.cond

   print(%s %s:%d%s % (command, bp.file, bp.line, cond))

   if not bp.enabled:
   print(disable %d % (bp_num))

   if bp.ignore  0:
   print(ignore %d %d % (bp_num, bp.ignore))

   print('')

--
Ed Blackman
--
https://mail.python.org/mailman/listinfo/python-list