调试

Python 调试技术完全指南

调试的重要性

程序能一次写完并正常运行的概率极低,通常不超过1%。在开发过程中,我们总会遇到各种bug需要修正。有些bug简单明了,通过错误信息就能定位;而复杂的bug则需要深入了解程序运行时的变量状态。因此,掌握系统的调试方法对开发者至关重要。

调试方法概览

1. print() 打印调试法

基本用法

def foo(s):
    n = int(s)
    print('>>> n = %d' % n)  # 打印变量值
    return 10 / n

def main():
    foo('0')

main()

执行结果

>>> n = 0
Traceback (most recent call last):
  ...
ZeroDivisionError: integer division or modulo by zero

优缺点

  • 优点:简单直接,快速验证
  • 缺点:污染代码,产生大量输出,需要手动删除

2. 断言调试法 (assert)

改进版

def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'  # 断言n不为0
    return 10 / n

def main():
    foo('0')

执行结果

Traceback (most recent call last):
  ...
AssertionError: n is zero!

高级用法

  • 使用-O参数关闭断言(生产环境):
    python -O script.py
  • 注意:-O是英文大写字母O,不是数字0

优缺点

  • 优点:比print()更规范,可选择性关闭
  • 缺点:大量使用仍会污染代码

3. logging 日志调试法

基础配置

import logging
logging.basicConfig(level=logging.INFO)  # 设置日志级别

s = '0'
n = int(s)
logging.info('n = %d' % n)  # 记录信息
print(10 / n)

执行结果

INFO:root:n = 0
Traceback (most recent call last):
  File "err.py", line 8, in <module>
    print(10 / n)
ZeroDivisionError: division by zero

日志级别

  • DEBUG:详细信息,诊断问题
  • INFO:确认程序按预期运行
  • WARNING:意外情况(默认级别)
  • ERROR:严重问题
  • CRITICAL:致命错误

高级配置(输出到文件):

import logging
logging.basicConfig(
    level=logging.INFO,
    filename='app.log',
    filemode='w',
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

优缺点

  • 优点:灵活控制输出,可持久化,不影响生产环境
  • 缺点:配置稍复杂

4. pdb 命令行调试器

基本用法

python -m pdb script.py

常用命令

  • l(list):查看当前代码
  • n(next):执行下一行
  • p(print):打印变量值
  • c(continue):继续执行
  • q(quit):退出调试

执行示例

> /path/to/script.py(2)<module>()
-> s = '0'
(Pdb) l
1   # script.py
2 -> s = '0'
3   n = int(s)
4   print(10 / n)
(Pdb) n
> /path/to/script.py(3)<module>()
-> n = int(s)
(Pdb) p s
'0'

5. pdb.set_trace() 断点调试

代码示例

import pdb

s = '0'
n = int(s)
pdb.set_trace()  # 设置断点
print(10 / n)

调试过程

> /path/to/script.py(7)<module>()
-> print(10 / n)
(Pdb) p n
0
(Pdb) c
Traceback (most recent call last):
  File "script.py", line 7, in <module>
    print(10 / n)
ZeroDivisionError: division by zero

6. IDE 集成调试

推荐工具

  1. Visual Studio Code

  2. PyCharm

  3. Eclipse + PyDev

    • 适合Java/Python混合开发
    • 需要安装PyDev插件

IDE调试优势

  • 图形化界面
  • 断点管理
  • 变量监视
  • 调用栈查看
  • 条件断点

调试策略建议

  1. 开发阶段:使用IDE调试快速定位问题
  2. 测试环境:结合logging记录详细日志
  3. 生产环境:配置适当的日志级别(WARNING或ERROR)
  4. 复杂问题:结合pdb进行深入分析

终极建议

虽然各种调试工具都很强大,但logging因其灵活性和对生产环境的友好性,成为大多数场景下的最佳选择。建议在项目中:

  • 合理规划日志级别
  • 统一日志格式
  • 建立日志分析机制

掌握这些调试技术,你将能够高效地诊断和解决Python程序中的各种问题。