还在用 print 调试?这 3 个 Debug 技巧让你效率翻倍

告别低效的 print 调试!通过 IDE 断点调试、日志系统配置与 PySnooper 自动化追踪,让程序问题无处遁形,**调试不是玄学,而是可复现的科学!

1. 断点调试:让代码进入子弹时间

断点调试是开发者最常用的调试工具,它让程序在指定位置暂停,逐行观察变量状态和执行路径,是定位问题的利器。

1.1 为何断点调试碾压 print

对比维度print 调试断点调试
代码侵入性需插入/删除大量打印语句零侵入,可视化观察变量
调试效率反复运行程序耗时实时暂停,逐行追踪执行
信息维度仅输出预设变量全量查看:调用栈、线程状态、内存对象

[!note] 使用断点调试时,请使用 IDE 工具,本文以 Pycharm 为例,其他 IDE 工具与此类似。

1.2 断点调试三步法

1. 设置断点:在代码行号左侧点击出现红点。

2. 启动调试:鼠标右击,调试或者点击右上角小昆虫的图标即可 DEBUG

3.逐行探查

调试时代码会在断点(红点)处暂停,并显示执行过程中变量具体的值;
点击下方控制栏中的小箭头可以逐行查看代码执行效果,或者撤销执行,也可以快速执行到下一个断点处;

控制栏处也会记录每次循环中的变量类型和变量值,方便查看!


2. 日志系统:程序运行的黑匣子

Logging 是 Python 标准库中的日志记录工具,用于替代 print 调试,提供更专业、灵活的日志管理功能。

2.1 日志 vs print

# print 调试(业余版)  
print(f"当前用户ID: {user_id},操作状态: {status}")  

# 日志系统(专业版)  
import logging  
logger.info("用户操作审计", extra={"user_id": 123, "status": "SUCCESS"})  

核心优势

  1. 分级管控:从 DEBUG 开发细节到 CRITICAL 系统崩溃,按需过滤信息
  2. 持久化存储:自动写入文件,避免终端输出被冲刷丢失
  3. 结构化输出:支持 JSON 格式,方便接入 ELK 等日志分析平台
  4. 线程/进程安全:多任务环境下精准记录操作时序

2.2 日志配置模板

import logging

logging.basicConfig(
    level=logging.DEBUG,  # 设置日志级别
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',  # 日志格式
    handlers=[
        logging.FileHandler("app.log"),  # 输出到文件
        logging.StreamHandler()          # 输出到终端
    ]
)

# 记录日志
logging.debug("这是一条调试信息")
logging.info("这是一条普通信息")
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
logging.critical("这是一条严重错误信息")

核心参数:

参数名类型默认值作用
levelint

str
logging.WARNING设置日志级别,低于该级别的日志将被忽略。
formatstr%(message)s定义日志输出格式
handlerslist[]日志处理器列表,常用处理器
datefmtstrNone定义时间格式,如 "%Y-%m-%d %H:%M:%S"
encodingstrNone日志文件编码,如 "utf-8"

日志级别:
日志级别从低到高分为以下 5 级,我们可以对错误进行分级调试,仅展示错误类型。

级别数值使用场景
DEBUG10调试信息,记录程序运行的详细细节
INFO20普通信息,记录程序关键操作(如用户登录、数据更新)
WARNING30警告信息,记录潜在问题(如参数缺失、配置异常)
ERROR40错误信息,记录功能异常(如数据库连接失败、文件读取错误)
CRITICAL50严重错误,记录系统崩溃或不可恢复的故障

我们用一个除 0 计算作为示例

import logging

#基础日志配置
logging.basicConfig(
    level=logging.DEBUG,
    format='%(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler("error.log"),
        logging.StreamHandler()
    ]
)

#关键函数,用日志记录错误
def divide(x, y):
    try:
        logging.debug(f"尝试计算 {x}/{y}")
        result = x / y
        logging.info(f"计算结果: {result}")
        return result
    except ZeroDivisionError as e:
        logging.error("除零错误!", exc_info=True)  # 记录完整异常堆栈
        raise

#触发错误
divide(10, 0)  # 此调用会抛出错误并被日志捕获

由于进行了除 0 计算,代码肯定会报错,日志系统能够完整的记录对应的错误类型、内容、时间,长期保存。

日志内容,保存了日志等级和错误信息


3. PySnooper:让代码自动调试

PySnooper 是一个通过装饰器自动记录代码执行过程的 Python 调试工具,让你不用写 print 也能看透代码的每一步操作。

特点:

  • 自动追踪变量变化
  • 可视化代码执行路径
  • 捕获异常堆栈信息

3.1 PySnooper vs print 调试对比

对比项PySnooperprint 调试
代码侵入性只需添加一个装饰器需插入/删除大量 print 语句
信息完整性自动记录变量、执行路径、错误堆栈仅输出手动指定的信息
维护成本调试完成后删除一行代码即可需逐个清理 print 语句

3.2 具体使用方法

安装

pip install pysnooper  

使用方法:

在代码前面加一段装饰器,然后将你需要关注的变量加入监控列表,就能自动记录。

import pysnooper

@pysnooper.snoop(
    output="debug.log",  # 输出到文件
    watch=("number", "sum")  # 监控关键变量

我们用一个经典的猜数字游戏来举例:

"""
@file: PySnooper测试.py.py
@author: lingxiaotian
@date: 2025/2/26 18:08
"""
# Copyright (c) 2025, 凌小添
# All rights reserved.

import pysnooper
import random

@pysnooper.snoop(
    color=False,
    output="game_debug.log",  # 输出到文件
    watch=("target_number", "guess_count")  # 监控关键变量
)
def guess_number_game():
    target_number = random.randint(1, 5)
    guess_count = 0

    print("欢迎来到猜数字游戏!数字在1~5之间")

    while True:
        user_input = input("请输入你的猜测:")
        guess_count += 1

        if not user_input.isdigit():
            raise ValueError("必须输入数字!")

        guess = int(user_input)

        if guess == target_number:
            print(f"恭喜!你用了 {guess_count} 次猜中答案 {target_number}")
            break
        elif guess < target_number:
            print("猜小了,再试试!")
        else:
            print("猜大了,再试试!")

# 启动游戏
guess_number_game()

代码运行后,pysnooper模块会自动记录时间点和监控变量值的变化情况。

代码自动记录的调试信息


4. 小结

本文三大调试方法对比

工具适用场景优势局限性
断点调试开发阶段逐行调试逻辑实时变量监控、调用栈分析仅适用于IDE环境,无法记录历史
日志系统生产环境错误追踪与审计持久化存储、多级告警配置稍复杂,需手动定义日志格式
PySnooper快速定位变量突变问题自动化记录、零配置接入仅适用于简单场景,性能开销较大

⚠️ 注意事项:

1. 断点调试

  • 避免设置过多断点,影响执行效率

2. 日志系统

  • 生产环境使用 WARNING 及以上级别,避免日志爆炸
  • 启用日志轮转(RotatingFileHandler)防止磁盘占满

3.PySnooper

  • 调试完成后及时移除装饰器,避免性能损耗
  • 复杂场景推荐结合日志系统使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌小添

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值