Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion Lib/pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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:
Expand All @@ -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]
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -1840,13 +1858,19 @@ 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):
"""pp expression

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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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.
Expand Down
10 changes: 9 additions & 1 deletion Lib/test/test_pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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
"""

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Show explicit errors when required arguments of :mod:`pdb` commands are missing
Loading