在开发系统时所经历的情绪的过山车是任何一个即使接触很少的人都可以强烈表达的。然而,对于那些在各种项目和应用程序方面拥有丰富经验的人来说,从头开始构建系统通常被认为是梦想的情况。
当您需要维护、支持或发展现有的正在运行的系统时(有时有数千或数百万用户),真正的噩梦就会出现。软件开发中《但丁地狱》的最深一层是当你必须调试代码来解决问题。
我知道有时,尤其是当你刚刚开始时,你依赖于最简单、最非正式的 print() 及其在其他语言中的等效项。 不用担心,我们的秘密在这里是安全的。然而,我们也知道,对于最痛苦、最棘手的 bug,我们需要使用高效、强大、全面的调试工具。
我被要求分析工作中的一些性能问题。使用 Grafana 对函数/类返回或时间跟踪进行浅层调查不足以找到所有混乱代码中的真正问题。那么...让我们调试吧!
在 Python 中,我们有 PDB,一个用于调试代码的简单库。要使用它,您只需使用 pip 安装它。例如:
pip install pdb
然后在要调试的代码中添加一行:
import pdb; pdb.set_trace()
这将是您的断点。现在,您可以再次运行您的应用程序,它将在您刚刚添加的行之后立即暂停执行。然后,您可以逐行、逐个函数地逐步执行代码,以找到您需要解决的问题。
上面的设置应该足以满足使用 Django、Flask 或 FastAPI 的简单 Python 项目。但是,如果您已经达到这一点并且正在运行您的应用程序在 Docker 容器内,遇到问题,我也遇到过同样的问题。保持冷静,只需按照以下几个步骤操作即可:
1 - 您应该安装远程调试器,而不是通常的PDB。在 Docker 容器内运行它(或将库包含在依赖项管理器中):
pip install remote-pdb
2 - 在 docker-compose.yml 文件中,添加新端口 以公开 PDB 入口点:
... services: your-app: ... ports: - 8000:8000 # already existing port of your application - 4444:4444 # NEW LINE TO EXPOSE PDB PORT ... ...
3 - 仍然在 docker-compose.yml 文件中,添加这两行,以允许从 Docker 外部向正在运行的容器发送命令:
... services: your-app: ... ports: - 8000:8000 - 4444:4444 stdin_open: true # THIS tty: true # AND THIS ... ...
4 - 最后,将代码中的断点行更改为以下行:
__import__("remote_pdb").set_trace(host='0.0.0.0', port=4444)
现在您也可以运行 Docker 映像,并从我们打开的 端口 4444 连接 PDB 调试器,在您最喜欢的终端中使用简单的 telnet 命令:
telnet 0.0.0.0 4444
要巧妙地在代码的海洋中航行,您需要使用 PDB 提供的有用的命令。让我们在这里看看其中的一些:
我通常只使用命令step (s)和next (n)。两者之间的区别在于步骤执行每一行,甚至是在当前行上调用的函数内的那些行。接下来只执行当前函数内的行,等待被调用函数的返回。
其他两个有用的命令是 return (r),执行所有函数直到返回,以及 continue (c),执行所有内容直到下一个断点。
希望本内容对您有所帮助。通过调查一个重大的性能问题并在撰写本文时加强我的学习,我可以保证
“使用正确的工具完成正确的工作”
作为软件开发人员,我们永远不应该忘记这一点。它可以将我们的事业提升到更有效的水平并为这趟过山车之旅带来更多快乐。
以上是如何在 Docker 容器内调试 Python 和 Django 应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!