• 周三. 2月 8th, 2023

Python 调试器用法详解

城主

12月 28, 2022 ,

在 Python 中,可以使用内置的 pdb 调试器来调试代码。 使用 pdb 调试器的一种常见方法是在代码中插入 import pdb; pdb.set_trace() 语句,这会在执行到该语句时自动触发调试器。

例如,假设你有如下的代码:





def divide(a, b):
    return a / b

print(divide(4, 2))
print(divide(4, 0))

如果你想在执行 divide(4, 0) 时触发调试器,你可以在 divide 函数的第一行插入 import pdb; pdb.set_trace() 语句,代码将会变为:





def divide(a, b):
    import pdb; pdb.set_trace()
    return a / b

print(divide(4, 2))
print(divide(4, 0))

运行上面的代码后,你会看到一个 (Pdb) 提示符,表示你可以输入调试命令。 你可以使用 n 命令单步执行代码,使用 s 命令进入函数调用,使用 c 命令继续执行代码直到下一个断点或程序结束。 使用 q 命令退出调试器。

此外,还有许多其他的调试工具可供使用,例如 PyCharm 的调试器、ipdb 等。 这些工具通常提供了更为丰富的调试功能,例如断点、变量查看、单步执行等。

你也可以使用 Python 的内置日志功能来调试代码。 使用日志功能,你可以在代码中插入日志语句,用于记录程序的执行过程,从而帮助你了解程序的执行情况。

要使用日志功能,你需要先导入 Python 标准库中的 logging 模块,然后调用 logging.debuglogging.infologging.warninglogging.errorlogging.critical 等函数来记录日志。 例如:





import logging

def divide(a, b):
    logging.debug('divide function called with a=%s, b=%s', a, b)
    try:
        result = a / b
    except ZeroDivisionError:
        logging.exception('division by zero')
        result = None
    return result

print(divide(4, 2))
print(divide(4, 0))

运行上面的代码,你会看到在控制台中输出了两条日志信息:一条是 divide function called with a=4, b=2,另一条是 division by zero

阅读  Python 发布流程

默认情况下,logging 模块只会记录级别高于等于 warning 的日志信息,但你可以使用 logging.basicConfig 函数来配置日志的输出格式和级别,从而使日志更加有用。 例如,你可以使用如下代码将日志输出到文件中:





import logging

logging.basicConfig(filename='myapp.log', level=logging.DEBUG)

def divide(a, b):
    logging.debug('divide function called with a=%s, b=%s', a, b)
    try:
        result = a / b
    except ZeroDivisionError:
        logging.exception('division by zero')
        result = None
    return result

print(divide(4, 2))
print(divide(4, 0))

日志功能是一种很好的调试工具,但有时候还是不够灵活。 例如,你可能希望在程序中设置断点,然后在运行到断点时暂停执行,从而查看变量的值或执行其他调试操作。

这时候,你可以使用 Python 内置的 breakpoint 函数来设置断点。 例如,你可以在代码中插入 breakpoint() 语句来设置断点,然后运行代码,当执行到断点时,程序会暂停执行,并进入调试器。





def divide(a, b):
    breakpoint()  # 设置断点
    return a / b

print(divide(4, 2))
print(divide(4, 0))

运行上面的代码后,你会看到一个 (Pdb) 提示符,表示你可以输入调试命令。 你可以使用 n 命令单步执行代码,使用 s 命令进入函数调用,使用 c 命令继续执行代码直到下一个断点或程序结束。 使用 q 命令退出调试器。

此外,你还可以使用 breakpoint 函数的参数来指定调试器的行为。 例如,你可以使用 breakpoint(module='foo') 语句来设置断点,只有当执行到来自模块 foo 的代码时才会触发断点。

使用 breakpoint 函数设置断点的一个缺点是,它只能在运行时触发断点,而不能在编译时触发断点。 因此,如果你希望在编译时就能够触发断点,你可以使用 Python 解释器的 -m pdb 选项。

例如,假设你有如下的代码:





def divide(a, b):
    return a / b

print(divide(4, 2))
print(divide(4, 0))

你可以使用如下命令来运行该代码:





python -m pdb my_script.py

运行上面的命令后,你会看到一个 (Pdb) 提示符,表示你可以输入调试命令。 你可以使用 n 命令单步执行代码,使用 s 命令进入函数调用,使用 c 命令继续执行代码直到下一个断点或程序结束。 使用 q 命令退出调试器。

阅读  Python 并发编程技术详解

总之,Python 提供了许多不同的调试工具,例如 pdb 调试器、日志功能和 breakpoint 函数等,你可以根据自己的需要选择适合自己的调试工具进行调试。