我正在使用python 2.7.2,sqlalchemy 0.7,unittest,eclipse 3.7.2和pydev 2.4进行项目。我在python文件(单元测​​试文件)中设置了断点,但是它们被完全忽略了(在某些时候它们起作用了)。到现在为止,我已经升级了所有相关软件(参见上文),开始了新项目,使用设置进行播放,对屏幕进行了催眠,但是没有任何效果。

我从某篇文章中得到的唯一想法是,它需要将一些.py文件名更改为小写。

有人有什么想法吗?

添加了:我什至安装了aptana版本的eclipse并将.py文件复制到它=>相同的结果;断点仍然被忽略。

仍然没有进展:我更改了一些可能被视为不寻常的代码,并用更简单的解决方案代替了它。

更多信息:它可能与模块单元测试有关:

我定义测试套件的文件中的

  • 断点
  • 标准unittest文件中的
  • 断点本身可以​​工作
  • 我的测试方法中从unittest.TestCase派生的类中的
  • 断点不起作用
  • 在测试用例中测试我的代码中的
  • 断点不起作用
  • 在我可以在测试方法或要测试的代码中定义工作断点之前的某个时刻,
  • 之后我更改了一些内容:开始使用测试套件,将一些文件名更改为小写,...
  • 如果我的代码没有异常或测试失败,则也会发生此问题。

  • 我已经尝试过的是:
  • 删除.pyc文件
  • 定义新项目并仅将.py文件复制到该项目中
  • 之间重新启动了几次
  • 升级到eclipse 3.7.2
  • 在Eclipse 3.7.2上安装了最新的pydev
  • 切换到aptana(并返回)
  • 删除了“手动”将类添加到我的模块
  • 中的代码
  • 摆弄了一些配置

  • 我仍然可以做的是:
  • 用我的代码开始新项目,开始删除/更改代码,直到断点起作用,并找出黑匣子,弄清楚这是否与我的代码
  • 的某些部分有关


  • 是否有人知道什么可能导致这些问题或如何解决?
  • 还有其他地方我可以寻找解决方案吗?
  • pydev开发人员会研究关于stackoverflow的问题吗?
  • 我可以尝试使用较旧版本的pydev吗?

  • 我使用pydev/eclipse已有很长时间了,它对我来说效果很好,但是如果没有调试,我将不得不切换IDE。

    在回答Fabio的以下问题:
  • 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) ...
    

    其余的是单元测试的输出。

    继续Fabio的答案第2部分:

    我已经在程序的开始处添加了代码,调试器在sqlalchemy\orm\attributes.py中遵循该方法的最后一行停止工作(这是一个描述符,但是它如何或如何干扰调试已超出了我的范围)当前知识):

    类InstrumentedAttribute(QueryableAttribute):
    “”“添加了描述符方法的类绑定(bind)检测属性。”“”
    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()函数为我确定了问题所在。

    最佳答案

    似乎真的很奇怪...我需要更多信息以更好地诊断问题:

    打开\plugins\org.python.pydev.debug\pysrc\pydevd_constants.py并进行更改

    DEBUG_TRACE_LEVEL = 3
    DEBUG_TRACE_BREAKPOINTS = 3
    

    运行问题的用例并将输出添加到问题中...

    同样,由于某种原因,调试功能可能会在您使用的某些库或代码中重置,因此,请执行以下操作:在放置断点的位置执行以下操作:
    import sys
    print 'current trace function', sys.gettrace()
    

    (注意:在调试器中运行时,可以预期trace函数为:<bound method PyDB.trace_dispatch of <__main__.PyDB instance at 0x01D44878>>)

    另外,请发布您使用的Python版本。

    回答第二部分:

    sys.gettrace()返回None的事实可能是真正的问题...我知道一些与之混淆的外部库(例如:DecoratorTools-阅读:http://pydev.blogspot.com/2007/06/why-cant-pydev-debugger-work-with.html),甚至还看到Python错误和已编译的扩展程序将其破坏了。 。

    尽管如此,它中断的最常见原因可能是因为当递归引发堆栈溢出错误(即:RuntimeError:超出最大递归深度)时, Python 会默默地禁用跟踪(并因此禁用调试器)。

    您可能会在程序的开头放置一个断点,并进入调试器,直到它停止工作。

    或更简单的方法如下:将以下代码添加到程序的开头,然后查看打印过程的进展情况...最后打印的是代码破裂前的代码(因此,您可以在其中放置一个断点最后一行打印出来,知道它应该是工作的最后一行)-请注意,如果它是一个大型程序,则打印可能会花费很长时间-甚至可以更快地打印到文件而不是控制台(例如例如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来模拟断点)

    关于python - pydev断点不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9486871/

    10-15 20:54