Merged revisions 86861 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r86861 | senthil.kumaran | 2010-11-29 19:54:17 +0800 (Mon, 29 Nov 2010) | 5 lines Fix #10561 - Fix pdb behavior. Delete the breakpoints by breakpoint number. Handle multiple breakpoints at same line. Update docs/test. Patch by Xavier de Gaye. ........
This commit is contained in:
parent
8244c575ed
commit
9a5897bbf8
|
@ -239,7 +239,8 @@ tbreak [[*filename*:]\ *lineno* | *function*\ [, *condition*]]
|
|||
Temporary breakpoint, which is removed automatically when it is first hit. The
|
||||
arguments are the same as break.
|
||||
|
||||
cl(ear) [*bpnumber* [*bpnumber ...*]]
|
||||
cl(ear) [*filename:lineno* | *bpnumber* [*bpnumber ...*]]
|
||||
With a *filename:lineno* argument, clear all the breakpoints at this line.
|
||||
With a space separated list of breakpoint numbers, clear those breakpoints.
|
||||
Without argument, clear all breaks (but first ask confirmation).
|
||||
|
||||
|
|
14
Lib/bdb.py
14
Lib/bdb.py
|
@ -250,6 +250,12 @@ class Bdb:
|
|||
list.append(lineno)
|
||||
bp = Breakpoint(filename, lineno, temporary, cond, funcname)
|
||||
|
||||
def _prune_breaks(self, filename, lineno):
|
||||
if (filename, lineno) not in Breakpoint.bplist:
|
||||
self.breaks[filename].remove(lineno)
|
||||
if not self.breaks[filename]:
|
||||
del self.breaks[filename]
|
||||
|
||||
def clear_break(self, filename, lineno):
|
||||
filename = self.canonic(filename)
|
||||
if not filename in self.breaks:
|
||||
|
@ -261,10 +267,7 @@ class Bdb:
|
|||
# pair, then remove the breaks entry
|
||||
for bp in Breakpoint.bplist[filename, lineno][:]:
|
||||
bp.deleteMe()
|
||||
if (filename, lineno) not in Breakpoint.bplist:
|
||||
self.breaks[filename].remove(lineno)
|
||||
if not self.breaks[filename]:
|
||||
del self.breaks[filename]
|
||||
self._prune_breaks(filename, lineno)
|
||||
|
||||
def clear_bpbynumber(self, arg):
|
||||
try:
|
||||
|
@ -277,7 +280,8 @@ class Bdb:
|
|||
return 'Breakpoint number (%d) out of range' % number
|
||||
if not bp:
|
||||
return 'Breakpoint (%d) already deleted' % number
|
||||
self.clear_break(bp.file, bp.line)
|
||||
bp.deleteMe()
|
||||
self._prune_breaks(bp.file, bp.line)
|
||||
|
||||
def clear_all_file_breaks(self, filename):
|
||||
filename = self.canonic(filename)
|
||||
|
|
|
@ -54,6 +54,108 @@ def test_pdb_displayhook():
|
|||
(Pdb) continue
|
||||
"""
|
||||
|
||||
def test_pdb_breakpoint_commands():
|
||||
"""Test basic commands related to breakpoints.
|
||||
|
||||
>>> def test_function():
|
||||
... import pdb; pdb.Pdb().set_trace()
|
||||
... print(1)
|
||||
... print(2)
|
||||
... print(3)
|
||||
... print(4)
|
||||
|
||||
First, need to clear bdb state that might be left over from previous tests.
|
||||
Otherwise, the new breakpoints might get assigned different numbers.
|
||||
|
||||
>>> from bdb import Breakpoint
|
||||
>>> Breakpoint.next = 1
|
||||
>>> Breakpoint.bplist = {}
|
||||
>>> Breakpoint.bpbynumber = [None]
|
||||
|
||||
Now test the breakpoint commands. NORMALIZE_WHITESPACE is needed because
|
||||
the breakpoint list outputs a tab for the "stop only" and "ignore next"
|
||||
lines, which we don't want to put in here.
|
||||
|
||||
>>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE
|
||||
... 'break 3',
|
||||
... 'disable 1',
|
||||
... 'ignore 1 10',
|
||||
... 'condition 1 1 < 2',
|
||||
... 'break 4',
|
||||
... 'break 4',
|
||||
... 'break',
|
||||
... 'clear 3',
|
||||
... 'break',
|
||||
... 'condition 1',
|
||||
... 'enable 1',
|
||||
... 'clear 1',
|
||||
... 'commands 2',
|
||||
... 'print 42',
|
||||
... 'end',
|
||||
... 'continue', # will stop at breakpoint 2 (line 4)
|
||||
... 'clear', # clear all!
|
||||
... 'y',
|
||||
... 'tbreak 5',
|
||||
... 'continue', # will stop at temporary breakpoint
|
||||
... 'break', # make sure breakpoint is gone
|
||||
... 'continue',
|
||||
... ]):
|
||||
... test_function()
|
||||
> <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(3)test_function()
|
||||
-> print(1)
|
||||
(Pdb) break 3
|
||||
Breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
|
||||
(Pdb) disable 1
|
||||
(Pdb) ignore 1 10
|
||||
Will ignore next 10 crossings of breakpoint 1.
|
||||
(Pdb) condition 1 1 < 2
|
||||
(Pdb) break 4
|
||||
Breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
|
||||
(Pdb) break 4
|
||||
Breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
|
||||
(Pdb) break
|
||||
Num Type Disp Enb Where
|
||||
1 breakpoint keep no at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
|
||||
stop only if 1 < 2
|
||||
ignore next 10 hits
|
||||
2 breakpoint keep yes at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
|
||||
3 breakpoint keep yes at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
|
||||
(Pdb) clear 3
|
||||
Deleted breakpoint 3
|
||||
(Pdb) break
|
||||
Num Type Disp Enb Where
|
||||
1 breakpoint keep no at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
|
||||
stop only if 1 < 2
|
||||
ignore next 10 hits
|
||||
2 breakpoint keep yes at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
|
||||
(Pdb) condition 1
|
||||
Breakpoint 1 is now unconditional.
|
||||
(Pdb) enable 1
|
||||
(Pdb) clear 1
|
||||
Deleted breakpoint 1
|
||||
(Pdb) commands 2
|
||||
(com) print 42
|
||||
(com) end
|
||||
(Pdb) continue
|
||||
1
|
||||
42
|
||||
> <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(4)test_function()
|
||||
-> print(2)
|
||||
(Pdb) clear
|
||||
Clear all breaks? y
|
||||
(Pdb) tbreak 5
|
||||
Breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
|
||||
(Pdb) continue
|
||||
2
|
||||
Deleted breakpoint 4
|
||||
> <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(5)test_function()
|
||||
-> print(3)
|
||||
(Pdb) break
|
||||
(Pdb) continue
|
||||
3
|
||||
4
|
||||
"""
|
||||
|
||||
|
||||
def test_pdb_skip_modules():
|
||||
"""This illustrates the simple case of module skipping.
|
||||
|
@ -138,6 +240,14 @@ def test_pdb_continue_in_bottomframe():
|
|||
... print(3)
|
||||
... print(4)
|
||||
|
||||
First, need to clear bdb state that might be left over from previous tests.
|
||||
Otherwise, the new breakpoints might get assigned different numbers.
|
||||
|
||||
>>> from bdb import Breakpoint
|
||||
>>> Breakpoint.next = 1
|
||||
>>> Breakpoint.bplist = {}
|
||||
>>> Breakpoint.bpbynumber = [None]
|
||||
|
||||
>>> with PdbTestInput([
|
||||
... 'next',
|
||||
... 'break 7',
|
||||
|
|
Loading…
Reference in New Issue