当前位置: 首页 > news >正文

pdb调试器详解

文章目录

    • 1. 启动 pdb 调试器
      • 1.1 在代码中插入断点
      • 1.2 使用命令行直接调试脚本
    • 2. 常用调试命令
      • 2.1 基本命令
      • 2.2 高级命令
      • 2.3 断点操作
    • 3. 调试过程示例
    • 4. 调试技巧
      • 4.1 条件断点
      • 4.2 自动启用调试
        • 4.2.1 运行程序时指定 -m pdb
        • 4.2.2在代码中启用 pdb.post_mortem
        • 4.2.3 使用 sys.excepthook 全局捕获异常
      • 4.3 配合 ipdb 使用
    • 5. 高级用法 bt
      • 5.1. bt 命令作用
      • 5.2 示例代码
      • 5.3. 常见用法
      • 5.4 示例:结合 bt 和 up/down

pdb 是 Python 内置的交互式调试工具,可以帮助开发者逐步调试代码、查看变量、分析问题。以下是 pdb 调试器的详解,包括用法、常见命令及技巧

1. 启动 pdb 调试器

1.1 在代码中插入断点

通过 pdb.set_trace() 设置断点,程序运行到此处时会暂停并进入调试模式。

import pdbdef example_function():x = 10y = 20pdb.set_trace()  # 设置断点z = x + yprint(f"Result: {z}")example_function()

运行程序后,会暂停在set_trace()处,进入交互式调试模式。

1.2 使用命令行直接调试脚本

通过 -m pdb 启动脚本进入调试模式:

python -m pdb script.py

程序会在脚本的第一行暂停,可以逐步执行代码。

运行脚本时加上 -m pdb 参数,发生异常时会自动进入调试模式

python -m pdb script.py

或者在代码中引入

import pdb
pdb.pm()  # 在异常后调用,进入调试模式
  • 正常运行 script.py。
  • 如果程序中发生异常,pdb 会捕获它并进入调试模式。
  • 你可以直接使用调试命令,比如 bt 查看调用栈,或者 l 查看代码。

2. 常用调试命令

2.1 基本命令

在这里插入图片描述

2.2 高级命令

在这里插入图片描述

2.3 断点操作

(1) 设置断点

b 12  # 在第 12 行设置断点
b example_function  # 在函数 example_function 的入口处设置断点
b path/script.py:15  # 在 script.py 的第 15 行设置断点

(2)查看断点

b  # 列出所有断点及其状态

(3)清除断点

cl 1  # 清除断点编号 1
cl    # 清除所有断点

(4)启动、关闭断点

disable 7  # disable breakpoint 7
enable 7   # enable breakpoint 7

(5)条件断点

b path/script.py:20, x > 10  # 在第 script 脚本的第20 行设置断点,只有 x > 10 时断点才生效

3. 调试过程示例

假设以下代码存在问题:

def add_numbers(a, b):result = a + breturn resultdef main():x = 10y = "20"  # Bug: y 是字符串类型z = add_numbers(x, y)print(f"The result is {z}")main()

我们可以用 pdb 调试:

添加断点的方式
将 pdb.set_trace() 添加到代码中

def add_numbers(a, b):result = a + breturn resultdef main():x = 10y = "20"pdb.set_trace()  # 在此处调试z = add_numbers(x, y)print(f"The result is {z}")main()

运行程序并调试:

python script.py

调试流程:

  • 程序暂停在 set_trace(),输入 n 执行下一行代码。
  • 使用 p x p y 查看变量值。
  • 当执行到 add_numbers 时,输入 s 进入函数,逐步查看函数内部。
  • 如果确定错误原因,输入 q 退出调试。

通过命令行调试
直接运行调试命令

python -m pdb script.py

调试流程:

  • 程序在第一行暂停,输入 c 跳到程序出错处。
  • 出现异常时,自动进入调试模式,输入w查看调用栈。
  • 使用p查看变量值,定位问题。

4. 调试技巧

4.1 条件断点

在某些复杂情况下,只在特定条件下暂停:

b 10, x > 50

例如:当变量 x 大于 50 时,才会触发断点。

4.2 自动启用调试

4.2.1 运行程序时指定 -m pdb

运行 Python 脚本时,加上 -m pdb,会在发生异常时自动进入调试模式。

python -m pdb script.py
  • 正常运行 script.py。
  • 如果程序中发生异常,pdb 会捕获它并进入调试模式。
  • 你可以直接使用调试命令,比如 bt 查看调用栈,或者 l 查看代码。
4.2.2在代码中启用 pdb.post_mortem

在代码中,通过捕获异常并调用 pdb.post_mortem(),让程序在异常发生后自动进入调试模式
示例代码

import pdbdef faulty_function():x = 1 / 0  # 人为制造一个异常try:faulty_function()
except Exception:pdb.post_mortem()

工作原理

  • 当 faulty_function 发生异常时,程序会捕获 Exception。
  • 调用 pdb.post_mortem(),进入异常发生时的调试模式。
  • 在调试模式中,可以查看变量值、调用栈等。
4.2.3 使用 sys.excepthook 全局捕获异常

通过覆盖 Python 的全局异常处理机制,任何未捕获的异常都会触发 pdb 调试。

示例代码:

import pdb
import sysdef custom_excepthook(exc_type, exc_value, exc_traceback):print(f"Uncaught exception: {exc_type.__name__}: {exc_value}")pdb.post_mortem(exc_traceback)# 设置全局异常处理
sys.excepthook = custom_excepthook# 测试代码
def faulty_function():x = 1 / 0  # 人为制造一个异常faulty_function()

工作原理:

  • 覆盖sys.excepthook后,任何未捕获的异常都会调用 custom_excepthook
  • custom_excepthook 中,使用 pdb.post_mortem 进入调试模式。
  • 可以调试程序,查看异常发生的原因和调用栈。

在这里插入图片描述

  • 如果你想全局捕获异常并自动进入调试模式,sys.excepthook 是更灵活的解决方案。
  • 如果只需简单调试单个脚本,用 python -m pdb 即可。
  • 异常点进入调试,推荐用 pdb.post_mortem

4.3 配合 ipdb 使用

ipdb 是 pdb 的增强版本,提供更友好的界面和支持代码自动补全:

pip install ipdb

使用方法与 pdb 相同:

import ipdb
ipdb.set_trace()

pdb 是一个强大的调试工具,通过熟练使用断点、单步执行、调用栈分析等功能,可以帮助快速定位和解决问题。

5. 高级用法 bt

在 pdb 调试器中,btbacktrace(回溯调用栈) 的缩写,用来显示当前程序的 调用栈,包括函数的调用顺序、行号、文件等信息

5.1. bt 命令作用

  • 用途: 显示程序执行到当前断点或出错位置时的调用栈

  • 场景:

    • 调试程序时,查看函数调用路径。
    • 分析异常发生的上下文。
  • 调用栈显示的信息:

    • 从主函数(或脚本入口)到当前代码位置的调用路径。
    • 每一层的调用函数名、文件名和行号。

5.2 示例代码

以下是一个示例程序,含多个函数嵌套调用,模拟一个异常场景:

def level1():level2()def level2():level3()def level3():x = 10y = 0result = x / y  # 人为制造一个异常def main():level1()if __name__ == "__main__":main()

当运行程序时,会因 ZeroDivisionError 报错。

使用 bt 查看调用栈
(1) 启动程序并进入调试模式 启动程序,并在异常发生时自动进入调试模式:

python -m pdb script.py

(2) 异常发生后,自动进入调试器 输出类似以下信息:

Traceback (most recent call last):File "script.py", line 14, in <module>main()File "script.py", line 12, in mainlevel1()File "script.py", line 2, in level1level2()File "script.py", line 5, in level2level3()File "script.py", line 9, in level3result = x / y
ZeroDivisionError: division by zero
> File "script.py", line 9, in level3

(3) 输入 bt 查看调用栈 在调试器提示符下输入 bt

(Pdb) bt

输出如下:

Traceback (most recent call last):File "script.py", line 14, in <module>main()File "script.py", line 12, in mainlevel1()File "script.py", line 2, in level1level2()File "script.py", line 5, in level2level3()File "script.py", line 9, in level3result = x / y

bt 输出解析

  • 调用顺序: 从底部到顶部依次列出函数调用的路径。
  • 每一层信息:
    • File “script.py”, line 5, in level2:文件名、行号、函数名。
    • result = x / y:错误发生的代码上下文。

5.3. 常见用法

  • 在异常发生时分析调用路径 如果程序抛出了异常,可以用 bt 命令查看是在哪一层函数中出现了问题,从而快速定位问题。

  • 分析深层嵌套调用 如果程序包含多层函数调用,bt 可以帮助明确每一层函数调用的顺序,以及当前所处的位置。

  • 结合上下文调试

  • 使用 up/down 命令上下移动调用栈,查看不同层级的变量值。

  • 使用 l 查看特定调用层的代码。

相关命令
在这里插入图片描述

5.4 示例:结合 bt 和 up/down

继续调试前面例子的代码:

(Pdb) bt
Traceback (most recent call last):File "script.py", line 14, in <module>main()File "script.py", line 12, in mainlevel1()File "script.py", line 2, in level1level2()File "script.py", line 5, in level2level3()File "script.py", line 9, in level3result = x / y

(1) 使用 up 进入上一层函数 level3:

(Pdb) up
> File "script.py", line 5, in level2
level3()

(2) 查看 level3 的上下文代码:

(Pdb) l
4     def level2():
5 ->     level3()

(3) 使用 down 返回当前函数栈:

(Pdb) down
> File "script.py", line 9, in level3
result = x / y
  • bt 是调试调用栈的核心命令,可以快速分析程序运行路径,尤其适用于深层嵌套和异常场景。
  • 结合 up/down 和 l 可以更深入了解上下文和变量状态。
  • 使用这些工具,可以高效地调试 Python 程序,快速定位和修复问题!
   -   在指定的文件设置断点: b /dataset/private_data/dataset.py:509      #(在dataset.py 的第509行设置断点)-   b  # 显示所有断点-   n  # next-   c  # 跳到下一个断点-   s  # 进入函数-   r  # 执行代码直到从当前函数返回-   cl # 删除所有断点-   p  # 查看变量值-   q  # quit-   disable 7  # disable breakpoint 7-   enable 7   # enable breakpoint 7

相关文章:

pdb调试器详解

文章目录 1. 启动 pdb 调试器1.1 在代码中插入断点1.2 使用命令行直接调试脚本 2. 常用调试命令2.1 基本命令2.2 高级命令2.3 断点操作 3. 调试过程示例4. 调试技巧4.1 条件断点4.2 自动启用调试4.2.1 运行程序时指定 -m pdb4.2.2在代码中启用 pdb.post_mortem4.2.3 使用 sys.e…...

项目15:简易扫雷--- 《跟着小王学Python·新手》

项目15&#xff1a;简易扫雷 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握Python的…...

Flink CDC实时同步mysql数据

官方参考资料&#xff1a; https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/mysql-cdc/ Apache Flink 的 Change Data Capture (CDC) 是一种用于捕获数据库变化&#xff08;如插入、更新和删除操作&#xff09;的技术。Flink CDC…...

题解 - 自然数无序拆分

题目描述 美羊羊给喜羊羊和沸羊羊出了一道难题&#xff0c;说谁能先做出来&#xff0c;我就奖励给他我自己做的一样礼物。沸羊羊这下可乐了&#xff0c;于是马上答应立刻做出来&#xff0c;喜羊羊见状&#xff0c;当然也不甘示弱&#xff0c;向沸羊羊发起了挑战。 可是这道题目…...

dfs_bool_void 两种写法感悟

dfs 的两种写法 在看之前实现图的遍历 dfs 和拓扑排序 dfs 实现的代码的时候的感悟 图的遍历 dfs 和拓扑排序 dfs 的区别 0 → 1 ↓ ↓ 2 → 3图的邻接表表示&#xff1a; adjList[0] {1, 2}; adjList[1] {3}; adjList[2] {3}; adjList[3] {};正常的 DFS 遍历&#x…...

MySQL 主从复制与 Binlog 深度解析

目录 1. Binlog的工作原理与配置2. 主从复制的设置与故障排除3. 数据一致性与同步延迟的处理 小结 MySQL的binlog&#xff08;二进制日志&#xff09;和主从复制是实现数据备份、容灾、负载均衡以及数据同步的重要机制。在高可用性架构和分布式数据库设计中&#xff0c;binlog同…...

大连理工大学《2024年845自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《大连理工大学845自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题...

Java性能调优 - 多线程性能调优

锁优化 Synchronized 在JDK1.6中引入了分级锁机制来优化Synchronized。当一个线程获取锁时 首先对象锁将成为一个偏向锁&#xff0c;这样做是为了优化同一线程重复获取锁&#xff0c;导致的用户态与内核态的切换问题&#xff1b;其次如果有多个线程竞争锁资源&#xff0c;锁…...

行为树详解(4)——节点参数配置化

【分析】 行为树是否足够灵活强大依赖于足够丰富的各类条件节点和动作节点&#xff0c;在实现这些节点时&#xff0c;不可避免的&#xff0c;节点本身需要有一些参数供配置。 这些参数可以分为静态的固定值的参数以及动态读取设置的参数。 静态参数直接设置为Public即可&…...

计算机网络中的三大交换技术详解与实现

目录 计算机网络中的三大交换技术详解与实现1. 计算机网络中的交换技术概述1.1 交换技术的意义1.2 三大交换技术简介 2. 电路交换技术2.1 理论介绍2.2 Python实现及代码详解2.3 案例分析 3. 分组交换技术3.1 理论介绍3.2 Python实现及代码详解3.3 案例分析 4. 报文交换技术4.1 …...

《杨辉三角》

题目描述 给出 n(1≤n≤20)n(1≤n≤20)&#xff0c;输出杨辉三角的前 nn 行。 如果你不知道什么是杨辉三角&#xff0c;可以观察样例找找规律。 输入格式 无 输出格式 无 输入输出样例 输入 #1复制 6 输出 #1复制 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 C语言…...

ARM学习(35)单元测试框架以及MinGW GCC覆盖率报告

单元测试框架以及MinGW GCC覆盖率报告 1、单元测试与覆盖率简介 随着代码越写越多,越来越需要注意自测的重要性,基本可以提前解决90%的问题,所以就来介绍一下单元测试,单元测试是否测试充分,需要进行评价,覆盖率就是单元测试是否充分的评估工具。 例如跑过单元测试后,…...

边缘计算+人工智能:让设备更聪明的秘密

引言&#xff1a;日常生活中的“智能”设备 你是否发现&#xff0c;身边的设备正变得越来越“聪明”&#xff1f; 早上醒来时&#xff0c;智能音箱已经根据你的日程播放舒缓音乐&#xff1b;走进厨房&#xff0c;智能冰箱提醒你今天的食材库存&#xff1b;而在城市道路上&…...

neo4j知识图谱AOPC的安装方法

AOPC下载链接&#xff1a;aopc全版本github下载 APOC&#xff0c;全称为Awesome Procedures On Cypher&#xff0c;是Neo4j图数据库的一个非常强大和流行的扩展库。它极大地丰富了Cypher查询语言的功能&#xff0c;提供了超过450个过程&#xff08;procedures&#xff09;和函数…...

图像分割数据集植物图像叶片健康状态分割数据集labelme格式180张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;180 标注数量(json文件个数)&#xff1a;180 标注类别数&#xff1a;3 标注类别名称:["Healthy","nitrogen deficiency"…...

Python学习(二)—— 基础语法(上)

目录 一&#xff0c;表达式和常量和变量 1.1 表达式 1.2 变量 1.3 动态类型特性 1.4 输入 二&#xff0c;运算符 2.1 算术运算符 2.2 关系运算符 2.3 逻辑运算符 2.4 赋值运算符 2.5 练习 三&#xff0c;语句 3.1 条件语句 3.2 while循环 3.3 for循环 四&#…...

Cesium-(Primitive)-(CircleOutlineGeometry)

CircleOutlineGeometry 效果: CircleOutlineGeometry 是 CesiumJS 中的一个类,它用来描述在椭球体上圆的轮廓。以下是 CircleOutlineGeometry 的构造函数属性,以表格形式展示: 属性名类型默认值描述centerCartesian3圆心点在固定坐标系中的坐标。radiusnumber圆的半径,…...

计算机网络技术基础:2.计算机网络的组成

计算机网络从逻辑上可以分为两个子网&#xff1a;资源子网和通信子网。 一、资源子网 资源子网主要负责全网的数据处理业务&#xff0c;为全网用户提供各种网络资源与网络服务。资源子网由主机、终端、各种软件资源与信息资源等组成。 1&#xff09;主机 主机是资源子网的主要…...

EasyExcel使用管道流连接InputStream和OutputStream

前言 Java中的InputSteam 是程序从其中读取数据&#xff0c; OutputSteam是程序可以往里面写入数据。 如果我们有在项目中读取数据库的记录&#xff0c; 在转存成Excel文件, 再把文件转存到OSS中。 生成Excel使用的是阿里的EasyExcel 。 他支持Output的方式写出文件内容。 而…...

OpenWebUI连接不上Ollama模型,Ubuntu24.04

这里写自定义目录标题 问题介绍解决方法 问题介绍 操作系统 Ubuntu24.04Ollama 使用默认安装方法&#xff08;官网https://github.com/ollama/ollama&#xff09; curl -fsSL https://ollama.com/install.sh | sh 安装在本机OpenWebUI 使用默认docker安装方法&#xff08;官网…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

安全领域新突破:可视化让隐患无处遁形

在安全领域&#xff0c;隐患就像暗处的 “幽灵”&#xff0c;随时可能引发严重事故。传统安全排查手段&#xff0c;常常难以将它们一网打尽。你是否好奇&#xff0c;究竟是什么神奇力量&#xff0c;能让这些潜藏的隐患无所遁形&#xff1f;没错&#xff0c;就是可视化技术。它如…...

JS面试常见问题——数据类型篇

这几周在进行系统的复习&#xff0c;这一篇来说一下自己复习的JS数据结构的常见面试题中比较重要的一部分 文章目录 一、JavaScript有哪些数据类型二、数据类型检测的方法1. typeof2. instanceof3. constructor4. Object.prototype.toString.call()5. type null会被判断为Obje…...