Я использую 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!
Проблема в том, что в модуле потока нет 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, он должен работать без каких-либо особых действий).
Основная проблема связана с sys.settrace, низкоуровневой функцией Python, используемой для выполнения всей трассировки и отладки - как говорится в документации,
Функция специфична для потоков; для отладчик поддерживает несколько потоков, он должен быть зарегистрирован с помощью settrace() для каждого отлаживаемого потока.
Я полагаю, что когда вы устанавливаете точку останова в PyDev, результирующий вызов settrace
всегда происходит в главном потоке (я не смотрел PyDev в последнее время, поэтому они могли добавить какой-нибудь способ обойти это, но я не помню ничего из того времени, когда я смотрел).
Обходной путь, который вы можете реализовать самостоятельно, заключается в том, чтобы в главном потоке после установки точки останова использовать sys.gettrace для получения функции трассировки PyDev, сохранить ее в глобальной переменной и во всех интересующих вас потоках обязательно вызвать sys. settrace
с этой глобальной переменной в качестве аргумента - немного громоздко (особенно для потоков, которые уже существуют на момент установки точки останова!), но я не могу придумать более простой альтернативы.
По этому вопросу я нашел способ запуска отладчика командной строки:
import pdb; pdb.set_trace()
Он не так прост в использовании, как отладчик Eclipse, но это лучше, чем ничего.