前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python DeBug的7个步骤【Programming】

Python DeBug的7个步骤【Programming】

作者头像
Potato
修改于 2019-12-02 03:19:00
修改于 2019-12-02 03:19:00
1.3K0
举报

学习一些技巧,以最大程度地减少跟踪代码失败原因所花费的时间。

图片来源: Internet Archive Book Images. Modified by Opensource.com. CC BY-SA 4.0
图片来源: Internet Archive Book Images. Modified by Opensource.com. CC BY-SA 4.0

现在是星期五下午三点。 为什么? 因为总是在星期五下午三点出事。 您会收到一个通知,说客户发现了您的软件中的一个 bug。 克服最初的疑虑后,您可以联系DevOps来了解应用日志的状况,因为您记得收到了有关它们已被移动的通知。

事实证明,它们是在你无法到达的地方,但它们正在被移动到 web 应用程序的过程中——所以你将拥有漂亮的应用程序来搜索和阅读它们,当然,它还没有完成。 可能过几天就好了。 我知道,这是完全不现实的情况,对吧? 不幸的是,日志或日志消息似乎经常在错误的时间出现。 在我们追踪这个 bug 之前,有一个公共服务公告:检查你的日志,确保它们在你认为它们在的地方,并定期记录你认为它们应该记录的内容。 当你不注意的时候,这些事情就会发生变化,真是令人惊讶。

好的,那么你找到了日志或者尝试响应,确实,客户发现了一个 bug。 也许你甚至认为你知道漏洞在哪里。

你立即打开你认为可能是问题的文件,并开始四处查看。

1. 先别动你的代码

继续研究它,甚至可能提出一个假设。 但是,在开始编写代码之前,请接受那个创建 bug 的调用,并将其转换为测试。 这将是一个集成测试,因为尽管您可能有怀疑,但是您还不知道问题的确切位置。

确保这个测试失败。 这一点很重要,因为有时候你所做的测试并没有模仿失败的调用; 如果你正在使用一个网络或其他框架来模糊测试,这一点尤其重要。 许多东西可能存储在变量中,但不幸的是,仅仅通过查看测试,就不能总是很明显地看到您在测试中所做的调用。 我不会说我创建了一个测试,当我试图模仿一个错误调用时,它通过了测试,但是,嗯,我做到了,我不认为这是特别不寻常的。 从我的错误中吸取教训。

2. 写一个失败的测试

现在已经有了一个失败测试,或者可能是一个带有错误的测试,是时候进行故障排除了。但是在这样做之前,让我们先回顾一下堆栈,因为这使故障排除更加容易。

堆栈由所有已经开始但尚未完成的任务组成。所以,如果你烤了一个蛋糕,然后把面粉加入面糊中,那么你的面糊堆是:

  • 做蛋糕
  • 做面糊
  • 加面粉

你已经开始做你的蛋糕,你已经开始做面糊,正在加入面粉。往锅里加油不在清单上,因为你已经完成了,制作糖霜也不在清单上,因为你还没开始做。

如果你在堆栈上是模糊的,我强烈建议使用 Python Tutor,在那里你可以观察堆栈当你执行代码行。

现在,如果您的Python程序出了问题,解释器会帮助您打印出堆栈。这意味着,不管这个程序当时在做什么,很明显,有些地方出了问题,这些问题都在底部。

3.总是先检查堆栈的底部

您不仅可以在堆栈的底部看到发生了哪个错误,而且通常堆栈的最后一行也是您可以找到问题的地方。如果底部没有帮助,并且你的代码已经有一段时间没有被连接了,那么运行它将是非常有帮助的。我推荐pylint或者flake8。通常情况下,它指向了我一直忽略的错误。

如果这个错误看起来晦涩难懂,你的下一步可能就是谷歌一下。如果不包含仅与代码相关的信息,比如变量名、文件名等,那么运气会更好。如果您使用的是python3(您应该使用python3),那么在搜索中包含3会很有帮助;否则,python2解决方案往往会占据搜索结果的顶部。

曾几何时,开发人员不得不在没有搜索引擎帮助的情况下进行故障排除。这是一个黑暗的时代。所以请充分利用所有可用的工具。

不幸的是,有时问题发生得更早,只有在堆栈底部执行的行中才会显现出来。想想看,当蛋糕没有起酥的时候,忘记加发酵粉是多么的明显。

是时候查看一下堆了。很有可能问题出在代码中,而不是Python核心,甚至不是第三方软件包,所以先扫描堆栈,在代码中寻找代码行。另外,在自己的代码中设置断点通常要容易得多。将断点粘贴在代码堆栈的上面一点,然后环顾四周,看看事情是否看起来像它们应该的那样。

“但是Maria,”我听到你说,“如果我有一个堆栈跟踪,这些都是有帮助的,但是我只有一个失败的测试。我该从哪里开始呢?”

Pdb,Python调试器

在您的代码中找到一个您知道此调用应该命中的位置。你至少应该能找到一个地方。在这里插入一个pdb断点。

题外话

为什么不是一个打印声明?我过去常常依赖于打印语句。它们有时仍然派得上用场。但是一旦我开始处理复杂的代码库,尤其是那些打网络电话的代码库,打印就变得太慢了。最后我发现到处都是印刷的声明,我不知道它们在哪里,为什么,事情变得复杂起来。但主要使用pdb还有一个更重要的原因。比方说,你放入一个print语句,然后发现有些地方出错了——而且一定是早些时候出错了。但是看看你把print语句放在哪里的函数,你不知道你是怎么到那里的。查看代码是一个很好的方式来了解你将要去的地方,但是对于了解你去过的地方来说是很糟糕的。是的,我已经在我的代码库中查找了一个函数调用的位置,但是这可能会变得很乏味,并且对于一个流行的函数来说并不能缩小范围。Pdb非常有用。

您按照我的建议,插入pdb断点并运行测试。然后它嗖的一声就过去了,又失败了,没有休息。保留断点,然后在测试套件中运行一个测试,该测试执行与故障测试非常相似的操作。如果您有一个不错的测试套件,那么您应该能够找到一个测试,它所碰到的代码与您认为失败的测试所碰到的代码相同。运行该测试,当它到达断点时,按下w并查看堆栈。如果通过查看堆栈,您不知道另一个调用是如何或者在哪里出错的,那么在堆栈中找到属于您的一些代码,并在该文件中放置一个断点,在堆栈跟踪中的断点之上放置一行。再试一次新的测试。继续前后移动,顺着堆栈向上移动,找出您的调用偏离轨道的地方。如果您一直到达跟踪的顶部而没有遇到断点,那么恭喜您,您已经发现了问题:您的应用程序拼写错误。这里没有经验,没有,一点也没有。

4. 改变事物

如果你仍然感到迷茫,试着做一个新的测试,稍微改变一下。 你能让新的测试起作用吗? 有什么不同? 什么是一样的? 试着改变一些其他的东西。 一旦您完成了测试,也许还有其他测试,就可以开始修改代码中的内容,看看是否可以缩小问题的范围。 记住,以全新的提交来开始故障排除,这样您就可以轻松地退出不起作用的更改。 (这是对版本控制的引用,如果您不使用版本控制,它将改变您的生活。嗯,也许它会使编码变得更容易。有关详细介绍,请参考“ 版本控制的可视指南 ”)

5. 休息一下

严肃地说,当它不再像一个有趣的挑战或游戏,开始变得真正令人沮丧时,你最好的行动就是离开问题。休息一下。我强烈建议去散散步,试着想想别的事情。

6.把所有事情都写下来

当你回来的时候,如果你没有突然受到启发去尝试一些事情,写下你所知道的关于这个问题的任何信息。这应包括:

  • 是什么引起了问题
  • 到底发生了什么,包括任何错误消息或相关的日志消息
  • 您所期望的结果
  • 到目前为止,您已经完成了哪些工作来查找问题和在故障排除过程中发现的任何线索

有时候这些信息太多了,但是相信我,试图从一个人那里获取零碎的信息真的很烦人。尽量简洁,但要完整。

7.寻求帮助

我经常发现,仅仅写下所有的信息就会触发我对一些我还没有尝试过的事情的想法。当然,有时候在点击提交按钮后,我会立即意识到问题所在。无论如何,如果你在把所有事情都写下来之后仍然没有想到任何事情,试着给某人发一封邮件。首先,尝试与你的项目有关的同事或其他人,然后再进行项目电子邮件列表。不要害怕寻求帮助。大多数人都很友好,乐于助人,我发现在Python社区中这一点尤其明显。

玛丽亚·麦金莱(Maria McKinley)将于2月23日至24日在西雅图举行的PyCascades 2019上展示《Hunting the Bugs》 。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python Debug(调试)的终极指南
即使您编写了清晰可读的代码,即使您是非常有经验的开发人员,奇怪的bug也不可避免地会出现,您将需要以某种方式调试它们。很多人使用一堆print语句来查看代码中发生了什么。这种方法远不是理想的,有更好的方法可以找出代码的错误所在,本文将探讨其中一些问题和应对方法。
HuangWeiAI
2020/07/27
1.3K0
Python Debug(调试)的终极指南
Bug与Debug的随笔
bug的本意是指昆虫、小虫、损坏、缺陷等意思,在互联网时代还有一种引申意义,用来形容某人/物超乎想象的厉害,那简直就是开挂的人生,系统的bug!
半吊子全栈工匠
2019/10/22
9970
Bug与Debug的随笔
Strace——隐藏的超能力
与任何操作系统一样,在运行 Linux 和相关应用程序时遇到问题并不罕见。在使用闭源程序时尤其如此,因为无法进行精细的代码检查。因此,排除故障和解决问题并不是一个简单的过程。Linux 管理员和工程师很快发现需要补充实用程序。值得庆幸的是,他们并没有等太久。
用户5166556
2023/12/18
5400
Strace——隐藏的超能力
需要尽早知道的Kubernetes最佳实践
我希望能早点知道的Kubernetes最佳实践。从我在生产环境中使用Kubernetes的经验中学习,并避免常见的陷阱。
云云众生s
2025/01/23
1910
需要尽早知道的Kubernetes最佳实践
如何用7个简单的步骤,在Firefox开发工具中调试JavaScript
本文将着重于在Firefox的开发工具中调试JavaScript代码。Firefox中的开发工具是一个非常强大的工具,可以加速您的bug查找和修复过程!
程序你好
2018/07/23
4.5K0
总结了 9 个绝佳的 Python Debug 工具
调试(Debug)阶段有时是相当具有挑战性及耗时的,Python的一些基本功能可以帮助我们快速调试。除了我们常用的Pycharm,还有哪些不错的工具呢?
数据STUDIO
2023/09/04
2.6K0
总结了 9 个绝佳的 Python Debug 工具
Python 自动化指南(繁琐工作自动化)第二版:十一、调试
你的电脑只会做你让它做的事情;它不会读取你的想法,做你想让它做的事情。即使是专业的程序员也会一直制造 bug,所以如果你的程序有问题也不要气馁。
ApacheCN_飞龙
2023/04/04
1.6K0
Python 自动化指南(繁琐工作自动化)第二版:十一、调试
最佳PHP代码审查关键原则与实践技巧
代码审查有时会让人觉得有点乏味。但是它们对于创建工作良好、易于使用并且不会引起安全问题的PHP应用程序来说是绝对必要的。好消息呢?有一种方法可以使代码审查有效。让我们分解一下在审查PHP代码时要寻找的关键内容。
Tinywan
2024/05/11
2060
最佳PHP代码审查关键原则与实践技巧
进大厂必须掌握的50个微服务面试问题
根据Gartner的说法,微服务是云开发的新应用平台。微服务是独立部署和管理的,一旦在容器内实现,它们与底层操作系统的交互很少。 因此,如果您计划在微服务中开始您的职业生涯,那么现在正是潜入技术处于新生状态的时候。因此,为了帮助您准备面试,我提出了微服务面试问题和答案博客。
Java架构师历程
2018/09/26
24.2K0
进大厂必须掌握的50个微服务面试问题
OpenTelemetry属性命名的五个最佳实践
在故障排除和事后分析中,为了使数据具有价值,属性名称需要在每种遥测类型、工具和服务中保持一致。
云云众生s
2024/03/28
1620
2019-05-15 7个对初学者非常有用调试和故障排除技巧
原文地址: https://www.javacodegeeks.com/2019/05/useful-debugging-troubleshooting-tips.html?utm_source=se
Albert陈凯
2019/05/17
5050
使用OpenTelemetry监控你的CI/CD流水线
今天的软件比 20 多年前的软件复杂了数个数量级,这给我们调试代码带来了新的挑战。幸运的是,通过在系统中实现可观测性,我们已经相当远程地理解了我们的应用程序正在执行什么以及问题正在发生在哪里。
云云众生s
2024/03/28
2050
使用OpenTelemetry监控你的CI/CD流水线
[译] 容器和 Kubernetes 中的退出码完整指南
当容器终止时,容器引擎使用退出码来报告容器终止的原因。如果您是 Kubernetes 用户,容器故障是 pod 异常最常见的原因之一,了解容器退出码可以帮助您在排查时找到 pod 故障的根本原因。
CS实验室
2022/08/01
6.1K0
[译] 容器和 Kubernetes 中的退出码完整指南
如何在Windows上安装Python【Programming(Python)】
所以你想学习编程吗?Python是最常见的语言之一,它以面向对象的结构和简单的语法的独特结合而流行。Python还是一种解释型语言,这意味着您无需学习如何将代码编译为机器语言:Python可以帮您实现这一点,从而使您有时可以在编写代码的同时立即进行测试。
Potato
2019/12/01
2K0
如何在Windows上安装Python【Programming(Python)】
Kubernetes 中容器的退出状态码参考指南
当容器终止时,容器引擎使用退出码来报告容器终止的原因。如果您是 Kubernetes 用户,容器故障是 pod 异常最常见的原因之一,了解容器退出码可以帮助您在排查时找到 pod 故障的根本原因。
公众号: 云原生生态圈
2024/01/23
5820
Kubernetes 中容器的退出状态码参考指南
Pinterest使用DrSquirrel自动诊断工具快速解决Flink问题
在 Pinterest,流数据处理支持广泛的实时用例。 近年来,由 Flink 提供支持的平台通过提供近乎实时的内容激活和指标报告,已被证明对业务具有巨大价值,并有可能在未来解锁更多用例。 然而,为了利用这种潜力,我们需要解决开发者速度的问题。
从大数据到人工智能
2022/01/19
1.2K0
Pinterest使用DrSquirrel自动诊断工具快速解决Flink问题
[译] SIGSEGV:Linux 容器中的分段错误(退出代码 139)
SIGSEGV,也称为分段违规或分段错误,是基于 Unix 的操作系统(如 Linux)使用的信号。它表示程序尝试在其分配的内存之外进行写入或读取,由于编程错误、软件或硬件兼容性问题或恶意攻击(例如缓冲区溢出)。
CS实验室
2022/08/01
8.8K0
[译] SIGSEGV:Linux 容器中的分段错误(退出代码 139)
Sentry 开发者贡献指南 - 配置 PyCharm
Python 解释器:(确保它是 venv 解释器)例如 ~/venv/sentry/bin/python
为少
2022/01/25
1K0
Sentry 开发者贡献指南 - 配置 PyCharm
聊聊微服务环境中的可观察性和弹性
作者 | Itiel Shwartz 译者 | 王强 策划 | 万佳 Kubernetes 简化了微服务的管理和扩展工作。但对于开发人员和运维团队而言,跟踪如此多的活动部件往往是一大挑战。弄清楚对系统进行了哪些变更,以及变更由谁所做这样的简单过程逐渐成了不可能完成的任务。获得清晰的可观察性以实现更好的监视和故障排除,是改进开发流程的关键所在。 1聊聊分布式系统中的变更跟踪和挑战 我是 Itiel,Komodor 的首席技术官。今天,我将和你们讨论分布式系统中的变更跟踪,以及变更的阴暗面。Komodor 是一
深度学习与Python
2023/04/01
4370
聊聊微服务环境中的可观察性和弹性
Python终极调试指南
本文介绍了一些 Python 调试的高级技巧。如果你还在像新手一样无脑 print 调试,那么赶紧向大牛学习一下如何优雅地调试 Python 代码吧。
深度学习与Python
2020/07/27
7550
推荐阅读
相关推荐
Python Debug(调试)的终极指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档