【问题标题】:When to use the Python debugger何时使用 Python 调试器
【发布时间】:2008-10-08 07:49:01
【问题描述】:

由于 Python 是一种动态的解释型语言,因此您无需在运行代码之前对其进行编译。因此,很容易编写代码、运行它、查看发生了什么问题并修复它们。使用热键或宏可以使这非常快。

所以,因为很容易立即看到程序的输出以及可能发生的任何错误,所以我还没有使用调试器工具。与我目前使用的方法相比,哪些情况可能需要使用真正的调试器?

在我陷入困境并因为不知道如何解决问题而感到沮丧之前,我想知道。

【问题讨论】:

  • 我想你的意思是为什么调试器对专业人士有用,但调试器也可以用于解释语言结构的语义。 Thonny (thonny.cs.ut.ee) 在这里做得很好。

标签: python debugging


【解决方案1】:

在 30 年的编程生涯中,我使用调试器正好 4 次。所有四次都是读取由 C 程序崩溃产生的 core 文件,以定位隐藏在其中的回溯信息。

我不认为调试器有多大帮助,即使在编译语言中也是如此。很多人喜欢调试器,我敢肯定,使用它们是有原因的,否则人们不会对它们如此爱护。

重点是——软件就是知识获取

是的,它必须运行。然而,更重要的是,软件具有意义

这不是对使用调试器的控诉。但是,我发现依赖调试的人有时会生成看起来很奇怪的代码,并且没有很好的理由来说明它的含义。他们只能说“这可能是一个黑客,但它有效。”

我对调试器的建议是“不要打扰”。

“但是,如果我完全被难住了怎么办?”你问,“那我应该学习调试器吗?”完全被什么难住了?语言? Python 太简单了,不会让人一头雾水。某个图书馆?也许吧。

这就是你要做的——不管有没有调试器。

  1. 您有来源,请阅读。
  2. 您编写小测试来运行库。如果可能,使用交互式 shell。 [所有真正优秀的库似乎都使用交互式 Python 模式来展示它们的特性——我力求达到这种紧密、清晰的简单性。]
  3. 你有源,添加打印功能。

【讨论】:

  • 调试器不是大脑的替代品,我同意,但事实并非如此。当然,您必须首先考虑问题。但很多时候,一个好的调试器可以让你比任何其他方法更快地验证你的假设。
  • @Kena:我发现这在 Python 中是不正确的。交互式 Python 非常易于使用,以至于调试器似乎是多余的。
  • 好吧,我不确定在调试器和交互式控制台之间的确切位置。在我的书中,无论我是直接在控制台中调用 sn-p 还是使用 pdb 在关键点启动控制台,这都是“弄清楚为什么这段代码没有做它应该做的事情”的连续统一体。对于我遇到的那种错误,我只是碰巧更喜欢第二种选择,但不管对你有用......
  • I don't think debuggers help much, even in compiled languages. 试过 C++ 吗?
  • @S.Lott 我认为您回答的真正意义在于,设计为可测试的软件系统通常不需要使用调试器,因为当某些东西无法按规范工作时,单元测试应该失败。除此之外,您打开日志记录,弄清楚发生了什么,然后为您发现的错误编写测试,然后修复错误。事实上,我真正发现 interactive 调试器有用的唯一一次是在我尝试修复图形用户界面时,比如在 Firefox 中使用 firebug。
【解决方案2】:

我使用 pdb 进行基本的 python 调试。我使用它的一些情况是:

  • 当您有一个循环迭代超过 100,000 个条目并希望在特定点中断时,它会变得非常有用。(条件中断)
  • 跟踪别人代码的控制流。
  • 使用调试器总是比乱码打印更好。
  • 通常可能有多个故障点导致错误,乍一看并不明显。所以你寻找明显的地方,如果那里没有问题,你继续添加更多的打印。调试器可以节省你的时间,你不需要添加打印并再次运行。

【讨论】:

    【解决方案3】:

    通常当错误隐藏在某个函数中时,但我不知道具体是什么或在哪里。要么我插入几十个log.debug() 调用,然后必须将它们取出,或者直接放入:

    import pdb
    pdb.set_trace ()
    

    然后运行程序。调试器将在达到该点时启动,并为我提供完整的 REPL 以供查看。

    【讨论】:

      【解决方案4】:

      任何时候您想检查可能导致错误的变量的内容。您可以这样做的唯一方法是停止执行并查看堆栈。

      如果您正在寻找 Eclipse 中的 pydev,它是一个非常好的 IDE。

      【讨论】:

        【解决方案5】:

        我发现在失败的测试用例中放入调试器非常有用。

        我在测试失败点之前添加了import pdb; pdb.set_trace()。测试运行,建立一个可能相当大的上下文(例如,导入一个数据库夹具或构建一个 HTTP 请求)。当测试到达pdb.set_trace() 行时,它会进入交互式调试器,我可以使用通常的 pdb 命令检查失败发生的上下文,以寻找原因的线索。

        【讨论】:

          【解决方案6】:

          您可能想看看这个其他 SO 帖子:

          Why is debugging better in an IDE?

          这与您要询问的内容直接相关。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-12-16
            • 1970-01-01
            • 2015-12-29
            • 1970-01-01
            • 2020-02-24
            • 2021-02-09
            相关资源
            最近更新 更多