pydev断点不起作用

Lar*_*ars 22 python debugging unit-testing pydev python-2.7

我正在使用python 2.7.2,sqlalchemy 0.7,unittest,eclipse 3.7.2和pydev 2.4进行项目.我在python文件(单元测​​试文件)中设置断点,但它们被完全忽略(之前,在某些时候,它们工作).到目前为止,我已升级所有相关软件(见上文),启动新项目,玩设置,催眠我的屏幕,但没有任何作用.

我从一些帖子得到的唯一想法是,它有一些东西可以将一些.py文件名改为小写.

有没有人有任何想法?

补充:我甚至安装了eclipse的aptana版本并将.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) ... 
Run Code Online (Sandbox Code Playgroud)

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

继Fabio的回答第2部分:

我在程序开始时添加了代码,调试器在sqlalchemy\orm\attributes.py中跟随方法的最后一行停止工作(它是一个描述符,但它如何或者干扰调试是否超出我的范围目前的知识):

class 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
Run Code Online (Sandbox Code Playgroud)

从那里调试器进入__getattr__我自己的一个类的方法,从sqlalchemy的declarative_base()类派生.

可能解决了(尽管不了解):

问题似乎是__getattr__上面提到的,创建了类似于无限递归的东西,但是program/unittest/sqlalchemy在没有报告任何错误的情况下恢复了.我不太了解sqlalchemy代码,无法理解__getattr__调用该方法的原因.
我更改了__getattr__方法,为发生递归的属性名称调用super(很可能不是我的最终解决方案),并且断点问题似乎消失了.如果我能以一种简明的方式表达问题,我可能会尝试在google sqlalchemy新闻组上获得更多信息,或至少检查我的解决方案的稳健性.

谢谢Fabio的支持,trace_func()函数为我找到了问题所在.

Fab*_*zny 13

看起来很奇怪...我需要更多信息来更好地诊断问题:

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

DEBUG_TRACE_LEVEL = 3 
DEBUG_TRACE_BREAKPOINTS = 3
Run Code Online (Sandbox Code Playgroud)

运行您的用例与问题,并将输出添加到您的问题...

此外,可能由于某种原因,调试工具在您使用的某个库或代码中被重置,因此,请执行以下操作:在您放置断点的同一位置执行:

import sys
print 'current trace function', sys.gettrace()
Run Code Online (Sandbox Code Playgroud)

(注:在调试器中运行时,它会被预期的跟踪功能,有几分像:<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错误和编译后的扩展打破了它...

尽管如此,它最常见的原因可能是因为当递归引发堆栈溢出错误(即: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)
Run Code Online (Sandbox Code Playgroud)

如果您仍然无法弄清楚,请在获得的结果上发布更多信息......

注意:在您找不到实际位置之前的解决方法是使用:

import pydevd;pydevd.settrace()
Run Code Online (Sandbox Code Playgroud)

在你放置断点的地方 - 这样你就会在代码中有一个断点,这肯定会起作用,因为它会强制在那时设置跟踪工具(它与远程调试非常相似:http:http: //pydev.org/manual_adv_remote_debugger.html除了因为调试器之前已经连接过,你不必真正启动远程调试器,只需执行settrace来模拟断点)

  • `import pydevd;pydevd.settrace()` 是一个很好的解决方法,谢谢 (2认同)

小智 5

迟到的谈话,但以防万一它有所帮助.我遇到了类似的问题,我发现调试器非常特别,它认为是"可执行"的行,并且可用于中断.

如果使用行连续符或多行表达式(例如,在列表中),请将断点放在语句的最后一行.

我希望它有所帮助.