pdb
, как gdb
или trepan3k имеет команду разрыва:
(Pdb) help break
b(reak) ([file:]lineno | function) [, condition]
With a line number argument, set a break there in the current
file. With a function name, set a break at first executable line
of that function. Without argument, list all breaks. If a second
argument is present, it is a string specifying an expression
which must evaluate to true before the breakpoint is honored.
The line number may be prefixed with a filename and a colon,
to specify a breakpoint in another file (probably one that
hasn't been loaded yet). The file is searched for on sys.path;
the .py suffix may be omitted.
Но когда вы делаете это, есть некоторые вещи, о которых вы должны знать.
Если указать точки останова по имени файла и номеру строки, можно получить сообщение об ошибке. Например:
(Pdb) break foo.py
*** The specified object 'foo.py' is not a function
or was not found along sys.path.
Давайте попробуем понять, что говорится в сообщении. foo.py
явно не является функцией. Это файл. Это в sys.path
?
(Pdb) import sys
(Pdb) sys.path
['', '/usr/lib/python3.6', ...]
Нет. Хорошо. ну как насчет того, чтобы я дал имя файла как абсолютный путь?
(Pdb) break /tmp/bug.py:2
Breakpoint 1 at /tmp/bug.py:2
Хорошо. Это работает. Но опять же есть предостережение: можно ли остановиться на этой строке в этом файле? Посмотрите это:
(Pdb) break /etc/hosts:1
Breakpoint 2 at /etc/hosts:1
/etc/hosts
- это файл, но это не программа Python. И хотя, как мы видели ранее, pdb
предупреждает, что файл отсутствует, он не проверяет, является ли файл Python.
Если вместо этого вы запускаете это с trepan3k
, то он выводит неприятный след (который я исправлю в какой-то момент), но, по крайней мере, он дает некоторое представление о том, что что-то не так.
Кроме того, pdb
не слишком умен, чтобы знать, есть ли в строке 2 код, на котором можно остановиться; pdb
будет предупреждать о пустых или пустых строках или строках комментариев, но что-нибудь более сложное, например, произвольный текст и отсутствие кубиков.
Опять же, trepan3k немного лучше:
(trepan3k) break /tmp/bug.py:2
** File /tmp/bug.py is not stoppable at line 2.
Последнее предостережение при работе с точками останова состоит в том, что точка останова не может быть достигнута, потому что код никогда не попадет туда. Но у вас это тоже есть с sys.set_trace()
, так что я думаю, что такое поведение не удивительно.