diff options
author | Senthil Kumaran <orsenthil@gmail.com> | 2010-11-29 12:41:03 (GMT) |
---|---|---|
committer | Senthil Kumaran <orsenthil@gmail.com> | 2010-11-29 12:41:03 (GMT) |
commit | 9a5897bbf816404c081944187df6acc78811491a (patch) | |
tree | fb7f5a1e06d6341babb1259860152ae2a002238c /Lib | |
parent | 8244c575ed4b57fa9742dbd4a7efeb4cb7766c8d (diff) | |
download | cpython-9a5897bbf816404c081944187df6acc78811491a.zip cpython-9a5897bbf816404c081944187df6acc78811491a.tar.gz cpython-9a5897bbf816404c081944187df6acc78811491a.tar.bz2 |
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.
........
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/bdb.py | 14 | ||||
-rw-r--r-- | Lib/test/test_pdb.py | 110 |
2 files changed, 119 insertions, 5 deletions
@@ -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) diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 8aca812..f03c20b 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -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', |