我正在使用python 2.7.2,sqlalchemy 0.7,unittest,eclipse 3.7.2和pydev 2.4进行项目。我在python文件(单元测试文件)中设置断点,但它们被完全忽略(之前,在某些时候,它们工作)。到目前为止,我已升级所有相关软件(见上文),开始新项目,玩设置,催眠我的屏幕,但没有任何作用。
我从一些帖子中得到的唯一想法就是将某些.py文件名更改为小写,这有点意义。
有没有人有任何想法?
添加:我甚至安装了eclipse的aptana版本并将.py
个文件复制到它=>同样的结果;断点仍然被忽略。
仍然没有进展:我已经更改了一些可能被视为异常的代码,并将其替换为更简单的解决方案。
更多信息:它可能与模块unittest有关:
我已经尝试过的是:
.pyc
个文件.py
个文件复制到其中我还能做的是:
我一直在使用pydev / eclipse很长一段时间,它对我很有用,但没有调试我就不得不切换IDE。
回答下面的Fabio问题:
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) ...
其余的是单元测试的输出。
我在程序开头添加了代码,调试器在sqlalchemy \ orm \ attributes.py中跟随方法的最后一行停止工作(它是一个描述符,但它是如何干扰调试的超出我目前的知识):
class InstrumentedAttribute(QueryableAttribute): msgstr“”“添加描述符方法的类绑定检测属性。”“”
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__
创建了类似于无限递归的东西,但是program / unittest / sqlalchemy在没有报告任何错误的情况下恢复了。我不太了解sqlalchemy代码,无法理解调用__getattr__
方法的原因
我更改了__getattr__
方法,为发生递归的属性名称调用super(很可能不是我的最终解决方案),并且断点问题似乎消失了。
如果我能以一种简明的方式表达问题,我可能会尝试在google sqlalchemy新闻组上获得更多信息,或至少检查我的解决方案的稳健性。
感谢Fabio的支持,trace_func()函数为我找到了问题。
答案 0 :(得分:13)
似乎很奇怪......我需要更多信息来更好地诊断问题:
打开\ 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()
(注意:在调试器中运行时,预计跟踪功能是:<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来模拟断点)
答案 1 :(得分:5)
迟到谈话,但万一它有所帮助。我遇到了类似的问题,我发现调试器非常特别w.r.t.它认为哪些行是“可执行的”并可以打破。
如果使用行连续符或多行表达式(例如在列表中),请将断点放在语句的最后一行。
我希望它有所帮助。
答案 2 :(得分:2)
尝试删除相应的.pyc文件(已编译)然后运行。 此外,我有时意识到我正在运行一个以上的程序实例..这使pydev感到困惑。 我以前也一定见过这个。好几次。
答案 3 :(得分:1)
在Eclipse / pydev中运行django应用程序的类似情况。发生的事情是运行的代码是我的virtualenv中安装的代码,而不是我的源代码。我从我的虚拟env站点包中删除了我的项目,在eclipse / pydev调试器中重新启动了django,一切都很好。
答案 4 :(得分:1)
我有类似的症状。原来我的模块导入序列是rexec我的入口点python模块,因为必须动态加载二进制(非Python)库,即LD_LIBRARY_PATH被动态重置。我不知道为什么这会导致调试器忽略后续断点。也许rexec调用没有指定debug = true;它应该根据调用上下文状态指定debug = true / false?
尝试在您的第一个导入语句中设置一个断点,以了解您是否在进口时进入或者进入(分机)。当我在需要动态lib加载的第三方导入上“下一步”时,调试解释器将继续经过所有断点。