Подтвердить что ты не робот

Bdbquit поднял при отладке python

Недавно при добавлении отладчика к моему коду python 2.7.10 я получаю это сообщение:

Traceback (most recent call last):
  File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/connectors/amqplib_connector.py", line 191, in acking_callback
    callback(message.body)
  File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/consumable_message_queue.py", line 32, in deserialized_callback
    self._callback_method(msg)
  File "/Users/isaachess/Programming/vivint/Platform/BusinessLogic/businesslogic/util/statsd_util.py", line 95, in _time_func
    retVal = f(*args, **kwargs)
  File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle
    try:
  File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle
    try:
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 49, in trace_dispatch
    return self.dispatch_line(frame)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 68, in dispatch_line
    if self.quitting: raise BdbQuit
BdbQuit

Это после вставки строк:

import pdb; pdb.set_trace()

в коде.

Я не могу понять, почему это происходит. Я читал Bdb и Bdbquit, но не могу понять, почему это происходит в моем коде. Может ли кто-нибудь дать мне некоторые намеки на то, почему это происходит в целом? Я действительно хочу, чтобы отладчик снова работал.

4b9b3361

Ответ 1

Если вы продолжите из приглашения (pdb) и позвольте вашему коду закончить нормально, я бы не ожидал вывода, как указано в трассировке, но если вы выйдете из pdb с помощью команды quit или ^ D ( EOF), такая трассировка возникает, потому что нечего улавливать исключение BdbQuit, возникающее при выходе из отладчика. В bdb.py self.quitting устанавливается значение True с помощью метода set_quit (и в выражениях finally в различных методах запуска). Методы отправки, вызываемые trace_dispatch raise BdbQuit, когда self.quitting равно True, а типичное предложение except: для BdbQuit - это простой оператор pass; pdb наследует все это от gdb.

Короче говоря, обработка исключений используется для отключения функции трассировки системы, используемой отладчиком, когда взаимодействие отладчика заканчивается раньше.

Один из способов избежать этой трассировки - использовать pdb по-другому. Вместо того, чтобы вызывать pdb.set_trace() из вашего кода (и вообще не обрабатывать BdbQuit), вы можете вызывать код внутри pdb (а не наоборот), после чего исключение BdbQuit будет обрабатываться, как предполагалось PDB. Это также позволит вам выбирать места останова без изменения кода (используя команду pdb break). Или вы можете смешивать два подхода; запустите свой код под pdb, pdb.set_trace() вызовами и всеми, и эти вызовы будут точками останова, которые можно удалить только путем изменения вашего кода.

Вы можете вызвать код pdb с помощью команды pdb с вызовом script в качестве аргументов командной строки или с помощью python -m pdb.

Ответ 2

Я столкнулся с этим, когда оставил import pdb и pdb.set_trace() в моем производственном коде. Когда pdb.set_trace() линия была выполнена, питона ждет моего входа, чтобы сказать ему c оказанию в или шаг в, и т.д... Поскольку код питон был называться веб - сервером, я не был там нажать c продолжать. После столь долгого (не уверен, как долго) он наконец поднял исключение BdbQuit.

У меня не было ничего, чтобы поймать это исключение, поэтому он поднял 500 на моем веб-сервере.

Мне потребовалось некоторое время, чтобы понять, что мой код отладки, запущенный в daemon/background, вызывает проблему. Я чувствовал себя глупо.

Ответ 3

Помимо ответа Эйрика Фуллера, я хотел бы добавить, что вы не можете использовать pdb в том, что работает в другом процессе. Для отладки вы можете проверить этот ответ: fooobar.com/questions/256164/... но он кажется очень хакерским, или вы можете запустить свою программу в одном потоке. Обратитесь к документации: https://docs.python.org/3/library/concurrent.futures.html. Для многопроцессорных проблем вы даже можете пройти через https://www.reddit.com/r/learnpython/comments/46x9sm/why_is_pdbset_trace_crashing_whenever_it_is_in_an/

В любом случае у вашего вопроса не хватает столь необходимого контекста. Пожалуйста, добавьте свой вопрос.

Ответ 4

Одной из возможных причин является то, что вы запускаете Python script in the background. Когда процесс выполняется в фоновом режиме, вы не можете отправлять входные данные процессу через терминал, и, следовательно, консоль pdb не может работать. В конце концов, это поднимает bdbquit.