You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
While doing some debugging on bpo-44459 using Python 3.10b3, I was using Pdb and after troubleshooting an exception and hitting 'q' to quit, I saw the following:
(Pdb) q
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/pdb.py", line 1709, in main
pdb._runmodule(mainpyfile)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/pdb.py", line 1541, in _runmodule
mod_name, mod_spec, code = runpy._get_module_details(module_name)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py", line 146, in _get_module_details
return _get_module_details(pkg_main_name, error)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py", line 110, in _get_module_details
__import__(pkg_name)
File "/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pip-run-w0xovt3h/rinoh/__init__.py", line 41, in <module>
from . import resource
File "/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pip-run-w0xovt3h/rinoh/resource.py", line 205, in <module>
from .template import DocumentTemplate
File "/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pip-run-w0xovt3h/rinoh/template.py", line 42, in <module>
from .stylesheets import sphinx
File "/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pip-run-w0xovt3h/rinoh/stylesheets/__init__.py", line 42, in <module>
.format(stylesheet.description, stylesheet))
File "/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pip-run-w0xovt3h/rinoh/style.py", line 670, in __str__
for name, entry_point in self.installed_resources:
File "/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pip-run-w0xovt3h/rinoh/resource.py", line 54, in installed_resources
for entry_point in ilm.entry_points()[cls.entry_point_group]:
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/metadata/__init__.py", line 979, in entry_points
return SelectableGroups.load(eps).select(**params)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/metadata/__init__.py", line 437, in load
ordered = sorted(eps, key=by_group)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/metadata/__init__.py", line -1, in <genexpr>
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/metadata/_itertools.py", line 16, in unique_everseen
k = key(element)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/metadata/__init__.py", line 600, in _normalized_name
return Prepared.normalize(self.name)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/metadata/__init__.py", line 841, in normalize
return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_')
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/re.py", line 187, in sub
return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/pdb.py", line 1738, in <module>
pdb.main()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/pdb.py", line 1730, in main
pdb.interaction(None, t)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/pdb.py", line 357, in interaction
self._cmdloop()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/pdb.py", line 322, in _cmdloop
self.cmdloop()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/cmd.py", line 138, in cmdloop
stop = self.onecmd(line)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/pdb.py", line 422, in onecmd
return cmd.Cmd.onecmd(self, line)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/cmd.py", line 217, in onecmd
return func(arg)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/pdb.py", line 1118, in do_quit
self.set_quit()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/bdb.py", line 358, in set_quit
self.stopframe = self.botframe
AttributeError: 'Pdb' object has no attribute 'botframe'. Did you mean: 'curframe'?
I'd not seen this error before, so I suspect there may be a regression in 3.10. I haven't investigated further, but I wanted to register this possible issue.
The difference between Jason's two test cases is which stage of Pdb._runmodule() fails.
In the case of python -m pdb -m importlib runpy._get_module_details(module_name) raises an exception because importlib is a package and it looks for its main, so self.run(code) is never called.
In the case of python -m pdb -m foo with foo that raises an exception, foo is not a package so the main check doesn't happen. The exception comes from within the self.run(code) call (when the module is executed). self.run() calls self.reset() before executing the code, and reset() calls Bdb.reset() which initializes self.botframe (to None).
However, if we just try to initialize self.botframe to None in __init__, then 'quit' doesn't work anymore, so something else needs to be done about cleanup when import fails at that stage.
The cleanup issue was in the except: clause of the main loop: if the user does quit() during the pdb.interaction() call upon an unhandled exception ("the post mortem debugger"), then this quit request is ignored and the program just restarts.
The attached patch fixes this by checking for quit requests after the port-mortem debugger returns.
New changeset 684eb5c by Jason R. Coombs in branch '3.10':
[3.10] bpo-44461: Check early that a pdb target is valid for execution. (GH-27227) (GH-27399) 684eb5c
New changeset 49b5e20 by Jason R. Coombs in branch '3.9':
[3.9] bpo-44461: Check early that a pdb target is valid for execution. (GH-27227) (GH-27400) 49b5e20
Activity
jaraco commentedon Jun 19, 2021
While doing some debugging on bpo-44459 using Python 3.10b3, I was using Pdb and after troubleshooting an exception and hitting 'q' to quit, I saw the following:
I'd not seen this error before, so I suspect there may be a regression in 3.10. I haven't investigated further, but I wanted to register this possible issue.
jaraco commentedon Jun 19, 2021
I encountered the same error on Python 3.9.
jaraco commentedon Jun 19, 2021
I can replicate the issue with this command:
python -m pdb -m importlib(sinceimportlibisn't executable, it triggers an error in runpy).jaraco commentedon Jun 19, 2021
I was unable to replicate the issue with a foo.py containing only
raise ValueError, even withpython -m pdb -m foo.iritkatriel commentedon Jun 28, 2021
The difference between Jason's two test cases is which stage of Pdb._runmodule() fails.
In the case of
python -m pdb -m importlibrunpy._get_module_details(module_name) raises an exception because importlib is a package and it looks for its main, so self.run(code) is never called.In the case of
python -m pdb -m foowith foo that raises an exception, foo is not a package so the main check doesn't happen. The exception comes from within the self.run(code) call (when the module is executed). self.run() calls self.reset() before executing the code, and reset() calls Bdb.reset() which initializes self.botframe (to None).iritkatriel commentedon Jun 28, 2021
However, if we just try to initialize self.botframe to None in __init__, then 'quit' doesn't work anymore, so something else needs to be done about cleanup when import fails at that stage.
iritkatriel commentedon Jun 28, 2021
The cleanup issue was in the except: clause of the main loop: if the user does quit() during the pdb.interaction() call upon an unhandled exception ("the post mortem debugger"), then this quit request is ignored and the program just restarts.
The attached patch fixes this by checking for quit requests after the port-mortem debugger returns.
jaraco commentedon Jun 30, 2021
Thanks Irit. Reviewing now...
iritkatriel commentedon Jul 3, 2021
I've close PR26937 since we're not going for that. The test from it might still be useful, so I'm copying it here:
jaraco commentedon Jul 28, 2021
New changeset ee03bad by Jason R. Coombs in branch 'main':
bpo-44461: Check early that a pdb target is valid for execution. (bpo-27227)
ee03bad
miss-islington commentedon Jul 28, 2021
New changeset 684eb5c by Jason R. Coombs in branch '3.10':
[3.10] bpo-44461: Check early that a pdb target is valid for execution. (GH-27227) (GH-27399)
684eb5c
jaraco commentedon Jul 28, 2021
New changeset 49b5e20 by Jason R. Coombs in branch '3.9':
[3.9] bpo-44461: Check early that a pdb target is valid for execution. (GH-27227) (GH-27400)
49b5e20
jaraco commentedon Jul 28, 2021
This issue is solved. Thanks Irit for taking the time to investigate the issue and do the hard part of developing a test.