gh-126944: Show explicit errors when required arguments of pdb commands are missing (#130240)

This commit is contained in:
Tian Gao 2025-02-18 10:58:15 -05:00 committed by GitHub
parent 427dd10250
commit 076300d795
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 2 deletions

View File

@ -1286,6 +1286,9 @@ def do_enable(self, arg):
Enables the breakpoints given as a space separated list of
breakpoint numbers.
"""
if not arg:
self._print_invalid_arg(arg)
return
args = arg.split()
for i in args:
try:
@ -1307,6 +1310,9 @@ def do_disable(self, arg):
breakpoint, it remains in the list of breakpoints and can be
(re-)enabled.
"""
if not arg:
self._print_invalid_arg(arg)
return
args = arg.split()
for i in args:
try:
@ -1327,6 +1333,9 @@ def do_condition(self, arg):
condition is absent, any existing condition is removed; i.e.,
the breakpoint is made unconditional.
"""
if not arg:
self._print_invalid_arg(arg)
return
args = arg.split(' ', 1)
try:
cond = args[1]
@ -1360,6 +1369,9 @@ def do_ignore(self, arg):
and the breakpoint is not disabled and any associated
condition evaluates to true.
"""
if not arg:
self._print_invalid_arg(arg)
return
args = arg.split()
if not args:
self.error('Breakpoint number expected')
@ -1690,6 +1702,9 @@ def do_jump(self, arg):
instance it is not possible to jump into the middle of a
for loop or out of a finally clause.
"""
if not arg:
self._print_invalid_arg(arg)
return
if self.curindex + 1 != len(self.stack):
self.error('You can only jump within the bottom frame')
return
@ -1715,6 +1730,9 @@ def do_debug(self, arg):
argument (which is an arbitrary expression or statement to be
executed in the current environment).
"""
if not arg:
self._print_invalid_arg(arg)
return
sys.settrace(None)
globals = self.curframe.f_globals
locals = self.curframe.f_locals
@ -1840,6 +1858,9 @@ def do_p(self, arg):
Print the value of the expression.
"""
if not arg:
self._print_invalid_arg(arg)
return
self._msg_val_func(arg, repr)
def do_pp(self, arg):
@ -1847,6 +1868,9 @@ def do_pp(self, arg):
Pretty-print the value of the expression.
"""
if not arg:
self._print_invalid_arg(arg)
return
self._msg_val_func(arg, pprint.pformat)
complete_print = _complete_expression
@ -1935,6 +1959,9 @@ def do_source(self, arg):
Try to get source code for the given object and display it.
"""
if not arg:
self._print_invalid_arg(arg)
return
try:
obj = self._getval(arg)
except:
@ -1974,6 +2001,9 @@ def do_whatis(self, arg):
Print the type of the argument.
"""
if not arg:
self._print_invalid_arg(arg)
return
try:
value = self._getval(arg)
except:
@ -2318,7 +2348,10 @@ def _help_message_from_doc(self, doc, usage_only=False):
def _print_invalid_arg(self, arg):
"""Return the usage string for a function."""
self.error(f"Invalid argument: {arg}")
if not arg:
self.error("Argument is required for this command")
else:
self.error(f"Invalid argument: {arg}")
# Yes it's a bit hacky. Get the caller name, get the method based on
# that name, and get the docstring from that method.

View File

@ -1758,10 +1758,12 @@ def test_pdb_invalid_arg():
>>> def test_function():
... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
>>> with PdbTestInput([
>>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE
... 'a = 3',
... 'll 4',
... 'step 1',
... 'p',
... 'enable ',
... 'continue'
... ]):
... test_function()
@ -1776,6 +1778,12 @@ def test_pdb_invalid_arg():
(Pdb) step 1
*** Invalid argument: 1
Usage: s(tep)
(Pdb) p
*** Argument is required for this command
Usage: p expression
(Pdb) enable
*** Argument is required for this command
Usage: enable bpnumber [bpnumber ...]
(Pdb) continue
"""

View File

@ -0,0 +1 @@
Show explicit errors when required arguments of :mod:`pdb` commands are missing