-
-
Notifications
You must be signed in to change notification settings - Fork 30.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Pdb sometimes raises exception when trying to remove a breakpoint defined in a different debugger session #68348
Comments
>>> import pdb, test3
>>> pdb.run("reload(test3)")
> <string>(1)<module>()
(Pdb) s
--Call--
> c:\documents and settings\perry\desktop\coding_projects\python\test3.py(1)<module>()
-> foo = 7789
(Pdb) b 2
Breakpoint 1 at c:\documents and settings\perry\desktop\coding_projects\python\test3.py:2
(Pdb) c
> c:\documents and settings\perry\desktop\coding_projects\python\test3.py(2)<module>()
-> bar = 7788
(Pdb) c
>>> pdb.run("reload(test3)")
> <string>(1)<module>()
(Pdb) s
--Call--
> c:\documents and settings\perry\desktop\coding_projects\python\test3.py(1)<module>()
-> foo = 7789
(Pdb) b 1
Breakpoint 2 at c:\documents and settings\perry\desktop\coding_projects\python\test3.py:1
(Pdb) cl 1
Traceback (most recent call last):
File "<pyshell#592>", line 1, in <module>
pdb.run("reload(test3)")
File "C:\Python27\lib\pdb.py", line 1238, in run
Pdb().run(statement, globals, locals)
File "C:\Python27\lib\bdb.py", line 400, in run
exec cmd in globals, locals
File "<string>", line 1, in <module>
File "test3.py", line 1, in <module>
foo = 7789
File "C:\Python27\lib\bdb.py", line 51, in trace_dispatch
return self.dispatch_call(frame, arg)
File "C:\Python27\lib\bdb.py", line 80, in dispatch_call
self.user_call(frame, arg)
File "C:\Python27\lib\pdb.py", line 148, in user_call
self.interaction(frame, None)
File "C:\Python27\lib\pdb.py", line 210, in interaction
self.cmdloop()
File "C:\Python27\lib\cmd.py", line 142, in cmdloop
stop = self.onecmd(line)
File "C:\Python27\lib\pdb.py", line 279, in onecmd
return cmd.Cmd.onecmd(self, line)
File "C:\Python27\lib\cmd.py", line 221, in onecmd
return func(arg)
File "C:\Python27\lib\pdb.py", line 622, in do_clear
err = self.clear_bpbynumber(i)
File "C:\Python27\lib\bdb.py", line 297, in clear_bpbynumber
self._prune_breaks(bp.file, bp.line)
File "C:\Python27\lib\bdb.py", line 268, in _prune_breaks
self.breaks[filename].remove(lineno)
ValueError: list.remove(x): x not in list
Running the same code without first defining a breakpoint (in the second debugger instance) raises KeyError: [path to test3.py] on the same lien
The contents of test3.py are irrelevant, as long as it is at least two lines long and syntactically correct. |
I can reproduce the problem on python 3.5 with test3.py as: $ python
Python 3.5.0a4+ (default:8bac00eadfda, May 6 2015, 17:40:12)
[GCC 4.9.2 20150304 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb, test3
>>> pdb.run('test3.foo()')
> <string>(1)<module>()
(Pdb) step
--Call--
> /home/xavier/tmp/test3.py(1)foo()
-> def foo():
(Pdb) break 3
Breakpoint 1 at /home/xavier/tmp/test3.py:3
(Pdb) continue
> /home/xavier/tmp/test3.py(3)foo()
-> bar = 7788
(Pdb) continue
>>> pdb.run('test3.foo()')
> <string>(1)<module>()
(Pdb) step
--Call--
> /home/xavier/tmp/test3.py(1)foo()
-> def foo():
(Pdb) break # 'break' lists no breakpoints.
(Pdb) break 2
Breakpoint 2 at /home/xavier/tmp/test3.py:2
(Pdb) break # 'break' lists two breakpoints.
Num Type Disp Enb Where
1 breakpoint keep yes at /home/xavier/tmp/test3.py:3
breakpoint already hit 1 time
2 breakpoint keep yes at /home/xavier/tmp/test3.py:2
(Pdb) On the second debugging session, the first 'break' command lists no The problem is that the 'breaks' attribute of the Pdb instance is inconsistent |
I've submitted a patch that I believe fixes this problem. It adds in Bdb's __init__ a call to a function that reads the Breakpoint's 'bplist' and 'bpbynumber' class attributes and populates the new instances' 'breaks' dict. |
Irit, I like the approach of your PR for an immediate fix, that we could consider backporting. In the long term, ISTM that we should refactor to store the breakpoints with only a single source of truth, and avoid the duplication between Breakpoint.bplist, Breakpoint.bpbynumber and Bdb.breaks. |
Thanks! |
Unfortunately PR21989 has breaking the refleaks buildbots. Example: https://buildbot.python.org/all/#/builders/320/builds/226/steps/5/logs/stdio To reproduce: ❯ ./python -m test test_pdb -R 3:3
0:00:00 load avg: 1.40 Run tests sequentially
0:00:00 load avg: 1.40 [1/1] test_pdb
beginning 6 repetitions
123456
.test test_pdb failed -- Traceback (most recent call last):
File "/home/pablogsal/github/cpython/Lib/doctest.py", line 2205, in runTest
raise self.failureException(self.format_failure(new.getvalue()))
AssertionError: Failed doctest test for test.test_pdb.test_pdb_breakpoints_preserved_across_interactive_sessions
File "/home/pablogsal/github/cpython/Lib/test/test_pdb.py", line 326, in test_pdb_breakpoints_preserved_across_interactive_sessions File "/home/pablogsal/github/cpython/Lib/test/test_pdb.py", line 330, in test.test_pdb.test_pdb_breakpoints_preserved_across_interactive_sessions test_pdb failed == Tests result: FAILURE == 1 test failed: Total duration: 2.8 sec |
Per our buildbot policy (https://discuss.python.org/t/policy-to-revert-commits-on-buildbot-failure/404) we will need to revert this in 24 hours if is not fixed to avoid masking future errors. |
Thanks, I'm looking. |
With the patch: PS C:\Users\User\src\cpython-dev> ./python -m test test_pdb -R 3:3 == Tests result: SUCCESS == 1 test OK. Total duration: 34.2 sec |
PR 25182 fixes the issue, so I am closing this again. Thanks for the quick fix, Irit! |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: