контрольные точки pydev не работают - PullRequest
22 голосов
/ 28 февраля 2012

Я работаю над проектом, использующим python 2.7.2, sqlalchemy 0.7, unittest, eclipse 3.7.2 и pydev 2.4. Я устанавливаю точки останова в файлах Python (файлы модульного тестирования), но они полностью игнорируются (раньше, в какой-то момент, они работали). К настоящему времени я обновил все связанное программное обеспечение (см. Выше), запустил новые проекты, поиграл с настройками, загипнотизировал мой экран, но ничего не работает.

Единственная идея, которую я получил из некоторого поста, заключается в том, что он имеет какое-то отношение к изменению некоторых имен файлов .py в нижний регистр.

У кого-нибудь есть идеи?

добавлено: Я даже установил версию eclipse для aptana и скопировал туда файлы .py => тот же результат; Точки останова по-прежнему игнорируются.

все еще нет прогресса: Я изменил код, который может показаться необычным, и заменил его более простым решением.

дополнительная информация: это, вероятно, связано с модулем unittest:

  • Точки останова в моих файлах, определяющие наборы тестов, работают,
  • Точки останова в стандартных файлах unittest сами работают
  • точки останова в моих методах тестирования в классах, полученных из unittest.TestCase не работают
  • контрольные точки в моем коде, тестируемые в тестовых примерах, не работают
  • в какой-то момент, прежде чем я смог определить рабочие точки останова в методах тестирования или тестируемом коде
  • некоторые вещи, которые я изменил после этого: начали использовать наборы тестов, изменили некоторые имена файлов на строчные, ...
  • эта проблема также возникает, если мой код работает без исключений или сбоев тестирования.

я уже пробовал:

  • удалить .pyc файлы
  • определить новый проект и скопировать в него только .py файлов
  • перезагружался несколько раз между
  • улучшено до затмения 3.7.2
  • установил последний pydev на затмение 3.7.2
  • переключиться на aptana (и обратно)
  • удален код, который «вручную» добавил классы в мой модуль
  • возился с некоторыми конфигурациями

что я еще могу сделать:

  • начать новый проект с моим кодом, начать удалять / изменять код до тех пор, пока не сработают точки останова, и выяснить, не относится ли это к какой-либо части моего кода

  • Кто-нибудь знает, что может вызвать эти проблемы или как их можно решить?
  • Есть ли другое место, где я мог бы найти решение?
  • Разработчики pydev изучают вопросы по stackoverflow?
  • Есть ли более старая версия pydev, которую я мог бы попробовать?

Я давно работаю с pydev / eclipse, и он хорошо работает для меня, но без отладки я вынужден был переключить IDE.

В ответ на вопросы Фабио ниже:

  • Версия Python: 2.7.2,
  • sys.gettrace не дает None (но я не знаю, что в моем коде может повлиять на это)
  • Это вывод отладчика после изменения предложенных параметров:

Отладчик pydev:

starting
('Executing file ', 'D:\\.eclipse\\org.eclipse.platform_3.7.0_248562372\\plugins\\org.python.pydev.debug_2.4.0.2012020116\\pysrc\\runfiles.py')
('arguments:', "['D:\\\\.eclipse\\\\org.eclipse.platform_3.7.0_248562372\\\\plugins\\\\org.python.pydev.debug_2.4.0.2012020116\\\\pysrc\\\\runfiles.py', 'D:\\\\Documents\\\\Code\\\\Eclipse\\\\workspace\\\\sqladata\\\\src\\\\unit_test.py', '--port', '49856', '--verbosity', '0']")
('Connecting to ', '127.0.0.1', ':', '49857')
('Connected.',)
('received command ', '501\t1\t1.1')
sending cmd: CMD_VERSION 501    1   1.1

sending cmd: CMD_THREAD_CREATE 103  2   <xml><thread name="pydevd.reader" id="-1"/></xml>

sending cmd: CMD_THREAD_CREATE 103  4   <xml><thread name="pydevd.writer" id="-1"/></xml>

('received command ', '111\t3\tD:\\Documents\\Code\\Eclipse\\workspace\\sqladata\\src\\testData.py\t85\t**FUNC**testAdjacency\tNone')
Added breakpoint:d:\documents\code\eclipse\workspace\sqladata\src\testdata.py - line:85 - func_name:testAdjacency
('received command ', '122\t5\t;;')
Exceptions to hook : []
('received command ', '124\t7\t')
('received command ', '101\t9\t')
Finding files... done.
Importing test modules ... testAtomic (testTypes.TypeTest) ... ok
testCyclic (testTypes.TypeTest) ... 

Остальное выводится из модульного теста.

Продолжая ответ Фабио, часть 2:

Я добавил код в начале программы, и отладчик перестает работать в последней строке следующего метода в sqlalchemy \ orm \ attribute.py (это дескриптор, но каким образом он мешает отладке) вне моего текущего знания):

Класс InstrumentedAttribute (QueryableAttribute): "" "Связанный с классом инструментальный атрибут, который добавляет методы дескриптора." ""

def __set__(self, instance, value):
    self.impl.set(instance_state(instance), 
                    instance_dict(instance), value, None)

def __delete__(self, instance):
    self.impl.delete(instance_state(instance), instance_dict(instance))

def __get__(self, instance, owner):
    if instance is None:
        return self

    dict_ = instance_dict(instance)
    if self._supports_population and self.key in dict_:
        return dict_[self.key]
    else:
        return self.impl.get(instance_state(instance),dict_) #<= last line of debugging

Оттуда отладчик входит в метод __getattr__ одного из моих собственных классов, производных от класса sqlalchemy Declarative_base ().

Вероятно, решено (хотя и не понято):

Проблема, похоже, заключалась в том, что упомянутый выше __getattr__ создал нечто, похожее на бесконечную рекурсию, однако программа / unittest / sqlalchemy восстановилась без сообщения об ошибке.Я недостаточно разбираюсь в коде sqlalchemy, чтобы понять, почему был вызван метод __getattr__.
Я изменил метод __getattr__ для вызова super для имени атрибута, для которого произошла рекурсия (скорее всего, не мое окончательное решение), ипроблема точки останова, кажется, ушла.Если я смогу сформулировать проблему в краткой форме, я, возможно, постараюсь получить больше информации о новостной группе Google sqlalchemy или, по крайней мере, проверить мое решение на надежность.

Спасибо, Фабио, за поддержку, trace_funcФункция () выявила проблему для меня.

Ответы [ 5 ]

13 голосов
/ 29 февраля 2012

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

Откройте \ plugins \ org.python.pydev.debug \ pysrc \ pydevd_constants.py и измените

DEBUG_TRACE_LEVEL = 3 
DEBUG_TRACE_BREAKPOINTS = 3

запустите ваш вариант использования с проблемой и добавьте вывод к вашему вопросу ...

Кроме того, возможно, по какой-то причине средство отладки сбрасывается в какой-то библиотеке, которую вы используете или в вашейкод, поэтому сделайте следующее: в том же месте, что и точку останова do:

import sys
print 'current trace function', sys.gettrace()

(примечание: при запуске в отладчике можно ожидать, что функция трассировки - это нечтоas: <bound method PyDB.trace_dispatch of <__main__.PyDB instance at 0x01D44878>>)

Также, пожалуйста, опубликуйте, какую версию Python вы используете.


Ответ на часть 2:

Тот факт, что sys.gettrace () возвращает None, вероятно, является настоящей проблемой ... Я знаю некоторые внешние библиотеки, которые связываются с ним (например: DecoratorTools - прочитайте: http://pydev.blogspot.com/2007/06/why-cant-pydev-debugger-work-with.html) и даже видели, как ошибки Python и скомпилированные расширения ломали его ...

Тем не менее, самая распространенная причина, по которой он ломается, вероятно, потому что Python автоматически отключит трассировку (и, следовательно, отладчик), когда рекурсия выдает ошибку переполнения стека (т.е.: RuntimeError: превышена максимальная глубина рекурсии).

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

Или, возможно, проще следующее: Добавьте приведенный ниже код в самое начало вашей программы и посмотрите, как далекоидет с печатью ... Последнее, что было напечатано, это код перед тем, как он сломался (так что вы можете поставить точку останова на последней напечатанной строке, зная, что это должна быть последняя строка, где она будет работать) - обратите внимание, что если этобольшая программа, печать может занять много времени - это может быть даже более быстрая печать в файл вместо консоли (например, cmd, bash или eclipse) и позднее открытие этого файла (просто перенаправьте печать из примера в файл).

import sys

def trace_func(frame, event, arg):
    print 'Context: ', frame.f_code.co_name, '\tFile:', frame.f_code.co_filename, '\tLine:', frame.f_lineno, '\tEvent:', event
    return trace_func

sys.settrace(trace_func)

Если вы все еще не можете понять это, пожалуйста, опубликуйте больше информации о полученных результатах ...

Примечание: обходной путь до тех пор, пока вы не обнаружите, что фактическое место использует:

import pydevd;pydevd.settrace()

в месте, где вы поставили точку останова - таким образом, у вас будет точка останова в коде, которыйдолжно определенно работать, так как это заставит установить средство трассировки в этой точке (это очень похоже на удаленную отладку: http://pydev.org/manual_adv_remote_debugger.html за исключением того, что, поскольку отладчик уже был ранее подключен, вам не нужно запускатьудаленный отладчик, просто сделайте settrace для эмуляции точки останова)

5 голосов
/ 06 декабря 2012

Поздно в разговоре, но на всякий случай это помогает.Я просто столкнулся с подобной проблемой и обнаружил, что отладчик очень специфичен в отношении того, какие строки он считает «исполняемыми» и доступен для разрыва.

Если вы используете продолжения строк или многострочные выражения (например,внутри списка), поставьте точку останова в последней строке оператора.

Надеюсь, это поможет.

2 голосов
/ 29 февраля 2012

Попробуйте удалить соответствующий файл .pyc (скомпилированный) и затем запустить. Также я иногда осознавал, что запускаю более одного экземпляра программы, что сбивает с толку pydev. Я определенно видел это и раньше. Довольно много раз.

1 голос
/ 02 декабря 2013

У меня были похожие симптомы. Оказалось, что моя последовательность импорта модуля повторно выполняла мой модуль Python точки входа, потому что двоичная (не Python) библиотека должна была быть загружена динамически, то есть LD_LIBRARY_PATH был динамически сброшен. Я не знаю, почему это заставляет отладчик игнорировать последующие точки останова. Возможно, вызов rexec не определяет debug = true; он должен указывать debug = true / false в зависимости от состояния вызывающего контекста?

Попробуйте установить точку останова в вашем первом операторе импорта, чтобы знать, будете ли вы затем (зацикливаться) на или импортировать. Когда я «следующий» после импорта 3-го участника, который требовал динамической загрузки lib, интерпретатор отладки просто продолжал бы преодолевать все точки останова.

1 голос
/ 19 июня 2013

Столкнулся с подобной ситуацией, запустив приложение django в Eclipse / pydev. то, что происходило, было то, что код, который работал, был установлен в моем virtualenv, а не в моем исходном коде. Я удалил свой проект из своих виртуальных пакетов сайта env, перезапустил django в отладчике eclipse / pydev, и все было хорошо.

...