Я могу поместить точки останова на фоновые потоки в Python?

Я использую 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?

Обновление

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

7
задан Don Kirkby 14 July 2010 в 21:05
поделиться

3 ответа

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

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

def go (count):

  import pydevd
pydevd.connected = Верно
pydevd.settrace (приостановить = Ложь)
print 'количество% d.'% count # установить точку останова здесь

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

6
ответ дан 6 December 2019 в 19:32
поделиться

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

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

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

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

4
ответ дан 6 December 2019 в 19:32
поделиться

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

import pdb; pdb.set_trace()

Он не так прост в использовании, как отладчик Eclipse, но это лучше, чем ничего.

2
ответ дан 6 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: