在 Python 中,最值得深入掌握的两个调试工具是:

  • pdb:交互式断点调试器
  • logging:可控、分级、可落盘的运行日志体系

这篇文章我们就系统聊一聊它们的核心使用方式。


一、为什么你必须学会调试?

初学者常见的开发方式是“打印调试”——哪错了就 print 一行,然后不停改代码反复跑。

这种方式有两个明显问题:

  1. 效率低:每改一次就得重新运行。
  2. 信息不全:看不到变量的真实状态、看不到调用栈。

pdb 和 logging 正是为了解决这些痛点,让你在开发和线上运维阶段都更得心应手。


二、pdb:像打游戏一样单步查看你的代码

pdb 是 Python 内置的命令行调试器,它允许你:

  • 在代码任意位置设置断点
  • 暂停执行
  • 查看变量
  • 单步运行
  • 跳过函数
  • 回溯错误上下文

简直是排查 bug 的神器。


1. 最简单的用法:pdb.set_trace()

在你怀疑有问题的地方插入:

import pdb
pdb.set_trace()

执行时程序会在这一行停下来,并进入调试界面。


2. 调试常用命令(非常实用)

命令作用
nnext,执行下一行,不进入函数内部
sstep,进入函数内部执行
ccontinue,继续执行到下一个断点
llist,查看当前执行区域的代码
p 变量名查看变量的值
qquit,退出调试

举个简单例子:

def calc(a, b):
    import pdb; pdb.set_trace()
    return a + b

print(calc(10, 20))

调试时你可以:

  • p a 查看参数
  • n 逐步往下跑
  • q 退出

调试体验类似 VSCode,但直接在终端即可完成。


3. 遇到异常自动进入 pdb

这个技巧非常实用:

python -m pdb your_script.py

当程序报错时会自动暂停在异常处,让你现场查看变量并回溯堆栈。

非常适合排查隐藏的边界问题、线上问题复现等场景。


三、logging:程序“自己写日记”,方便你随时回溯

如果说 pdb 更适合开发阶段,那 logging 就是线上阶段的“黑盒记录器”。

print 只是把内容输出到控制台,但 logging 能做到:

  • 按严重级别打印日志
  • 输出到文件
  • 输出时间、行号、文件名、函数名
  • 灵活配置
  • 线上问题快速定位

真正的项目一定要用 logging,而不是满屏的 print。


1. logging 的基本用法

import logging

logging.basicConfig(level=logging.INFO)

logging.info("任务开始")
logging.warning("数据格式异常,已跳过一条记录")
logging.error("数据库连接失败")

输出:

INFO:root:任务开始
WARNING:root:数据格式异常,已跳过一条记录
ERROR:root:数据库连接失败

2. 日志级别说明(非常关键)

级别适用场景
DEBUG详细的调试信息,开发阶段最常用
INFO程序正常运行的关键事件
WARNING可疑,但程序还能继续
ERROR错误,需要处理
CRITICAL致命错误,程序即将终止

生产环境一般用 INFOWARNING


3. logging 输出到文件

logging.basicConfig(
    level=logging.INFO,
    filename="run.log",
    format="%(asctime)s - %(levelname)s - %(message)s"
)

关键参数解释:

  • filename:指定日志文件
  • format:控制输出格式
  • asctime:打印时间
  • levelname:日志级别
  • message:日志内容

示例输出:

2025-03-05 10:33:21,932 - INFO - 爬虫启动
2025-03-05 10:33:22,124 - WARNING - 请求延迟过高

这个格式在定位问题时非常有用。


4. 同时输出到文件和控制台

稍进阶一点:

logger = logging.getLogger()

logger.setLevel(logging.DEBUG)

# 控制台输出
console = logging.StreamHandler()
console.setLevel(logging.INFO)

# 文件输出
file = logging.FileHandler("run.log")
file.setLevel(logging.DEBUG)

# 设置格式
formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
console.setFormatter(formatter)
file.setFormatter(formatter)

logger.addHandler(console)
logger.addHandler(file)

这是实际项目非常常见的日志配置方式。


四、pdb 与 logging 的结合:最佳实践

开发阶段: 用 pdb 精准定位问题。

上线阶段: 用 logging 持续记录程序运行行为。

现实开发中,常见调试流程就是:

  1. 通过 logging 定位哪块逻辑可能有问题
  2. 在对应代码加 pdb.set_trace()
  3. 单步查看变量是否异常
  4. 修复
  5. 清理断点,保留日志

水平提升非常明显。


五、总结

学会调试是一名 Python 工程师必须跨过的一道坎。 会用 pdb,你就不再盲看代码。 会用 logging,你的程序就不再黑箱运行。

两者结合,你在查问题、排障、优化性能、处理线上日志时都会变得轻松很多。 也正是这类能力,让一个开发者真正具备生产力和工程视角。

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]