当前位置: 首页 > 面试题库 >

pydev断点不起作用

彭弘方
2023-03-14
问题内容

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

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

有人有什么想法吗?

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

仍然没有进展: 我已经更改了一些可能被视为异常的代码,并用更直接的解决方案代替了它。

更多信息: 它可能与unittest模块有关:

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

我已经尝试过的是:

  • 删除.pyc文件
  • 定义新项目并仅将.py文件复制到其中
  • 两次之间重新启动了几次
  • 升级到Eclipse 3.7.2
  • 在Eclipse 3.7.2上安装了最新的pydev
  • 切换到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) ...

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

继续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

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

可能已解决(尽管无法理解):

问题似乎是__getattr__上面提到的创建了类似于无限递归的东西,但是程序/ unittest /
sqlalchemy恢复了而没有报告任何错误。我不太了解sqlalchemy代码,无法理解为什么__getattr__调用该方法。
我将__getattr__方法更改为对发生递归的属性名称调用super(很可能不是我的最终解决方案),并且断点问题似乎消失了。如果我可以简明扼要地解决问题,则可能会尝试获取有关google
sqlalchemy新闻组的更多信息,或者至少检查我的解决方案的稳健性。

感谢Fabio的支持,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()

(注:在调试器中运行时,它会被预期的跟踪功能,有几分像:<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来模拟断点)



 类似资料:
  • 问题内容: 我已经在exit和_exit和我的程序(多线程应用程序,在linux 2.6.16.46-0.12 sles10上运行)上设置了断点,但仍以某种我无法找到的方式退出 退出函数驻留在libc中,因此没有延迟的负载共享库问题。有人知道其他无法捕获的神秘触发吗? 编辑:问题现在仅是学术性的。我尝试了二进制搜索调试,撤消了部分更改(问题消失了)。再次按顺序应用它们之后,即使恢复到原始状态,我也

  • 问题内容: 我正在尝试编写一个断言,以检查用户提供的大小是否为正值,如果不是,则使其为正,此语句位于类构造函数内部,该类构造函数采用大小值,然后生成array [size]。我写了下面的代码,我认为是正确的。 尽管我似乎从未评估过我的断言并继续执行程序,但会导致NegativeArraySize错误(我正在尝试避免) 我也尝试过 并且程序无法停止为负值。 我最近在Mac上运行Java时遇到了一些问

  • 我已经尝试创建新的空项目(Gradle)。它也不起作用。你知道吗?

  • 问题内容: 我正在使用Java 8(内部版本1.8.0_25),Netbeans 8.0.2,并将Java 8的某些功能合并到现有应用程序中。排序和.forEach无法正常工作,因此我创建了一些测试代码以确保我了解lambda等,并诊断出问题。以下是新代码以及与我的系统中的数据进行交互的代码的组合: 注册是一个POJO,反映事件的数据,其中包括一个RegistrationItem(s)列表,这是另

  • 我还是Selenium测试世界的新手,目前正在使用SeleniumChromeWebDriver进行测试。 我想做的是在下面的弹出对话框中: < li >在文本输入框中输入一个数字 < li >单击应用按钮 < li >然后将触发web应用程序向服务器端发布信息。 这是我到目前为止发现的,如果我取消对<code>线程的注释。睡眠(500),一切都将完美工作。但是没有<code>线程。sleep(5

  • 问题内容: 我有以下功能 但是 在ie7中不起作用,那我该怎么办!我想将光标放在输入中! 谢谢 更新 很好的解决方案,谢谢,但是现在在opera中不起作用:( 问题答案: 对于IE,您需要使用settimeout函数,因为它很懒,例如: 对于opera,这可能会有所帮助:如何在opera文本框上的所需索引中设置焦点