Могу ли я поставить точки останова на фоновые потоки в Python? - PullRequest
7 голосов
/ 25 июня 2010

Я использую плагин PyDev для Eclipse и пытаюсь установить точку останова в некотором коде, который запускается в фоновом потоке. Точка останова никогда не будет достигнута, даже если код выполняется. Вот небольшой пример:

import thread

def go(count):
    print 'count is %d.' % count # set break point here

print 'calling from main thread:'
go(13)
print 'calling from bg thread:'
thread.start_new_thread(go, (23,))

raw_input('press enter to quit.')

Точка останова в этом примере получает удар, когда он вызывается в основном потоке, но не когда он вызывается из фонового потока. Что я могу сделать, или это ограничение отладчика PyDev?

Обновление

Спасибо за обходные пути. Я отправил запрос PyDev , и он был выполнен. Должен быть выпущен с версией 1.6.0. Спасибо, команда PyDev!

Ответы [ 4 ]

6 голосов
/ 14 июля 2010

Проблема в том, что в модуле потока нет API, который бы знал, когда запускается поток.

Что вы можете сделать в своем примере - это установить функцию трассировки отладчика самостоятельно (как указал Алекс), как показано в коде ниже (если вы не находитесь в удаленном отладчике, в настоящее время требуется pydevd.connected = True - I поменяю pydev так, чтобы это больше не понадобилось). Возможно, вы захотите добавить try..except ImportError для импорта pydevd (который не будет работать, если вы не работаете в отладчике)

def go (количество):

   import pydevd
   pydevd.connected = True
   pydevd.settrace(suspend=False)
   print 'count is %d.' % count # set break point here

Теперь, подумав еще раз, я думаю, что pydev может заменить метод start_new_thread в модуле потока, предоставив свою собственную функцию, которая настроит отладчик, а затем вызовет исходную функцию (просто сделал это, и, похоже, работает , если вы используете ночной доступ, который будет доступен через несколько часов, который станет будущим 1.6.0, он должен работать, не делая ничего особенного).

4 голосов
/ 25 июня 2010

Основная проблема связана с sys.settrace , низкоуровневой функцией Python, используемой для выполнения всей трассировки и отладки - как говорят документы,

Функциянить конкретная;чтобы отладчик поддерживал несколько потоков, он должен быть зарегистрирован с помощью settrace () для каждого отлаживаемого потока.

Я считаю, что когда вы устанавливаете точку останова в PyDev, результирующий вызов settrace всегдапроисходит в главном потоке (я недавно не смотрел на PyDev, поэтому они, возможно, добавили какой-то способ обойти это, но я не помню ни одного со времени, когда я смотрел).

Временное решениеВы можете реализовать себя в вашем основном потоке после того, как точка останова была установлена, чтобы использовать sys.gettrace , чтобы получить функцию трассировки PyDev, сохранить ее в глобальной переменной и убедиться, что во всех интересующих вас потоках вызыватьsys.settrace с этой глобальной переменной в качестве аргумента - немного громоздко (особенно для потоков, которые уже существуют на момент установки точки останова!), Но я не могу придумать ни одной более простой альтернативы.

2 голосов
/ 25 июня 2010

На этот вопрос , я нашел способ запустить отладчик командной строки:

import pdb; pdb.set_trace()

Это не так просто, как отладчик Eclipse, но лучше, чем ничего.

1 голос
/ 13 ноября 2013

Для меня это сработало согласно одному из постов Фабио, после установки трассировки с помощью setTrace ("000.000.000.000") #, где 0 - это IP-адрес вашего компьютера с Eclipse / PyDev

threading.settrace(pydevd.GetGlobalDebugger().trace_dispatch)
...