mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
gh-65052: Prevent pdb from crashing when trying to display objects (#110578)
This commit is contained in:
parent
de956b263b
commit
c523ce0f43
3 changed files with 62 additions and 7 deletions
21
Lib/pdb.py
21
Lib/pdb.py
|
@ -431,8 +431,9 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
# fields are changed to be displayed
|
||||
if newvalue is not oldvalue and newvalue != oldvalue:
|
||||
displaying[expr] = newvalue
|
||||
self.message('display %s: %r [old: %r]' %
|
||||
(expr, newvalue, oldvalue))
|
||||
self.message('display %s: %s [old: %s]' %
|
||||
(expr, self._safe_repr(newvalue, expr),
|
||||
self._safe_repr(oldvalue, expr)))
|
||||
|
||||
def _get_tb_and_exceptions(self, tb_or_exc):
|
||||
"""
|
||||
|
@ -1460,7 +1461,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
for i in range(n):
|
||||
name = co.co_varnames[i]
|
||||
if name in dict:
|
||||
self.message('%s = %r' % (name, dict[name]))
|
||||
self.message('%s = %s' % (name, self._safe_repr(dict[name], name)))
|
||||
else:
|
||||
self.message('%s = *** undefined ***' % (name,))
|
||||
do_a = do_args
|
||||
|
@ -1474,7 +1475,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
self._print_invalid_arg(arg)
|
||||
return
|
||||
if '__return__' in self.curframe_locals:
|
||||
self.message(repr(self.curframe_locals['__return__']))
|
||||
self.message(self._safe_repr(self.curframe_locals['__return__'], "retval"))
|
||||
else:
|
||||
self.error('Not yet returned!')
|
||||
do_rv = do_retval
|
||||
|
@ -1509,6 +1510,12 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
except:
|
||||
self._error_exc()
|
||||
|
||||
def _safe_repr(self, obj, expr):
|
||||
try:
|
||||
return repr(obj)
|
||||
except Exception as e:
|
||||
return _rstr(f"*** repr({expr}) failed: {self._format_exc(e)} ***")
|
||||
|
||||
def do_p(self, arg):
|
||||
"""p expression
|
||||
|
||||
|
@ -1688,8 +1695,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
if not arg:
|
||||
if self.displaying:
|
||||
self.message('Currently displaying:')
|
||||
for item in self.displaying.get(self.curframe, {}).items():
|
||||
self.message('%s: %r' % item)
|
||||
for key, val in self.displaying.get(self.curframe, {}).items():
|
||||
self.message('%s: %s' % (key, self._safe_repr(val, key)))
|
||||
else:
|
||||
self.message('No expression is being displayed')
|
||||
else:
|
||||
|
@ -1698,7 +1705,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
|||
else:
|
||||
val = self._getval_except(arg)
|
||||
self.displaying.setdefault(self.curframe, {})[arg] = val
|
||||
self.message('display %s: %r' % (arg, val))
|
||||
self.message('display %s: %s' % (arg, self._safe_repr(val, arg)))
|
||||
|
||||
complete_display = _complete_expression
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue